{"version":3,"sources":["modules/common/hooks/useQueryParams.tsx","modules/smartContent/models.ts","modules/events/actionCreator.ts","modules/support/actions.ts","modules/common/components/toggleSwitch.tsx","modules/users/reducer.ts","modules/users/index.ts","utils/idpMapper.ts","authentication/msalAuthModule.ts","modules/categorytags/actionCreator.ts","modules/portalPages/index.ts","modules/profile/reducer.ts","modules/resources/index.ts","modules/resources/reducer.ts","modules/surveys/index.ts","modules/surveys/reducer.ts","modules/tenant/reducer.ts","modules/adminLayout/index.ts","modules/adminLayout/reducer.ts","modules/userPortalLayout/index.ts","modules/insights/models.ts","modules/userPortalLayout/reducer.ts","modules/common/icons/userAttributesSvgString.ts","modules/common/icons/magicIconWhiteSvgString.ts","modules/audiences/actionCreator.ts","modules/settings/models.ts","modules/insights/reducer.ts","modules/insights/index.ts","modules/contentBands/reducer.ts","modules/gallery/models.ts","modules/gallery/actions.ts","network/requestBuilder.ts","authentication/auth-request-middleware.ts","modules/head/models.ts","modules/head/reducer.ts","modules/head/actions.ts","modules/head/index.ts","modules/activity/reducer.ts","modules/activity/index.ts","modules/config/models.ts","modules/config/actions.ts","modules/config/reducer.ts","modules/localization/reducer.ts","modules/posts/reducer.documentDirectory.ts","modules/posts/reducer.editor.ts","modules/posts/reducer.postList.ts","modules/posts/reducer.postFeed.ts","modules/posts/reducer.imageLibrary.ts","modules/posts/reducer.postView.ts","modules/posts/reducer.tips.ts","modules/posts/index.ts","rootReducer.ts","configureStore.ts","api/links.ts","api/network/interceptors/AuthInterceptor.ts","api/network/interceptors/GraphAuthInterceptor.ts","api/network/interceptors/RequestFormatInterceptor.ts","api/network/interceptors/RequestPlatformInterceptor.ts","api/network/interceptors/TenantAutoFillInterceptor.ts","api/network/adapters/SparrowApi.ts","api/network/adapters/SyncFunctionsGraphApi.ts","authentication/oktaAuthModule.ts","api/network/interceptors/OktaAuthInterceptor.ts","api/network/adapters/SyncFunctionsOktaApi.ts","api/resources.ts","api/cognitiveServices.ts","api/contentBands.ts","api/dynamicLinks.ts","api/homeScreens.ts","api/emails.ts","api/instances.ts","api/media.ts","api/draftEvents.ts","api/syncFunctions.ts","api/messaging.ts","api/loggedEvents.ts","utils/ids.ts","api/tenantManagement.ts","api/adminTinyTemplates.ts","api/osprey.ts","api/files.ts","api/adminFiles.ts","api/shortcuts.ts","modules/adminLayout/actionCreator.ts","modules/users/models.ts","modules/surveys/actions.ts","modules/homeScreens/models.ts","modules/emails/reducer.ts","api/network/ApiRequest.ts","modules/common/icons/src/add-image.jsx","modules/common/icons/src/check.jsx","modules/common/icons/src/close.jsx","modules/common/icons/src/crop.jsx","modules/common/icons/src/drag-handle.jsx","modules/common/icons/src/edit.jsx","modules/common/icons/src/vertical-overflow.jsx","modules/common/icons/src/user.jsx","modules/common/icons/src/show-chart.jsx","modules/common/icons/src/insert-chart.jsx","modules/common/icons/src/cloud.jsx","modules/common/icons/src/check-box-empty.jsx","modules/common/icons/src/check-box-checked.jsx","modules/common/icons/src/devices.jsx","modules/common/icons/src/comment.jsx","modules/common/icons/src/pageview.jsx","modules/common/icons/src/info.jsx","modules/common/icons/src/rss-feed.jsx","modules/gallery/actionCreator.ts","modules/common/icons/src/sort.jsx","modules/common/icons/src/access-time.jsx","modules/common/icons/src/deleteIcon.jsx","modules/common/icons/src/lock.jsx","utils/xhrUpload.ts","modules/profile/actionCreator.ts","modules/common/components/loadingCircle.tsx","modules/gallery/chonkyFileAdapter.ts","modules/shortcuts/reducer.ts","modules/audiences/models.ts","modules/insights/actionCreator.ts","registerServiceWorker.ts","i18n.tsx","theme.tsx","appInsights.ts","modules/authorization/models.ts","modules/common/components/splash-screens/adminPortalSplashScreen.tsx","modules/common/hooks/useSignOut.tsx","modules/common/components/header/SignOutListItem.tsx","modules/common/components/avatar.tsx","modules/common/components/tenantLink.tsx","utils/colorGenerator.ts","utils/getRole.ts","modules/common/components/conditionalWrapper.tsx","modules/common/components/header/Account.tsx","modules/common/hooks/useIsMounted.tsx","routes/_layout/common/components/MenuItem.tsx","modules/common/components/banners/openInMobileAppBanner.tsx","utils/stringFormatting.ts","modules/common/components/header/Header.tsx","utils/tenantManagementUtils.ts","routes/_layout/common/components/CookieBanner.tsx","modules/common/components/loadingSpinner.tsx","modules/common/components/buttons/muiDownloadButton.tsx","modules/updateOptions/updateOptionsDialog.tsx","utils/userRoleUtils.ts","routes/_layout/common/menuUtils.ts","modules/common/components/requireRole.tsx","routes/_layout/common/components/wrappers/UserRoleWrapper.tsx","routes/_layout/common/styles/menuItemStyles.ts","routes/_layout/common/components/wrappers/AccordionWrapper.tsx","utils/dateFormatting.ts","routes/_layout/adminApp/components/Menu.tsx","modules/common/hooks/useDrawerExpanded.tsx","routes/_layout/adminApp/adminAppLayout.tsx","modules/common/components/splash-screens/userPortalSplashScreen.tsx","routes/_layout/userApp/components/Menu.tsx","modules/shortcuts/components/feedList/shortcutsFeedList.tsx","routes/_layout/userApp/userAppLayout.tsx","modules/common/components/insufficientPermissions.tsx","modules/tenant/components/clientRouteWrapper.tsx","modules/tenant/components/tenantRouteWrapper.tsx","modules/dashboard/components/dashboardTile.tsx","modules/common/components/analyticsErrorBanner.tsx","modules/dashboard/components/dashboard.tsx","pages/common/basePage.tsx","pages/common/header.tsx","pages/common/mainContent.tsx","pages/common/tabs.tsx","pages/common/tabContent.tsx","pages/common/tabContentToolbar.tsx","modules/common/components/snackbars/errorSnackbar.tsx","modules/common/components/hovers/infoHover.tsx","modules/common/components/loadingOverlay.tsx","modules/common/components/buttons/moreOptionsIconButton.tsx","modules/common/components/moreOptionsItem.tsx","modules/users/components/action-buttons/moreUserOptions.tsx","modules/common/components/paging.tsx","modules/common/components/filters/authoringSearch.tsx","modules/common/components/filters/filterContainer.tsx","modules/common/components/callout.tsx","modules/common/components/filters/filterDropdown.tsx","modules/common/components/topicDropdown.tsx","modules/users/components/userFilters.tsx","modules/users/components/usersView.tsx","modules/users/components/user-insights-components/userPlatformStats.tsx","modules/users/components/user-insights-components/userLanguageStats.tsx","modules/users/components/user-insights-components/userPlatformChart.tsx","modules/users/components/user-insights-components/activityTimeOfDayStats.tsx","modules/users/components/userInsightsBlock.tsx","modules/users/components/userOverviewInsights.tsx","modules/users/components/userInsightsView.tsx","modules/common/components/snackbars/snackbarWrapper.tsx","modules/users/components/invitedUsersDrawer.tsx","modules/users/components/addUserButtonDropdown.tsx","modules/users/components/additionalUserOptionsDropdown.tsx","modules/users/components/userCSVUploader.tsx","modules/users/components/userInsightsBlockTiny.tsx","utils/regexUserValidation.ts","modules/users/components/bulkSocialDialog.tsx","modules/common/components/disclaimer.tsx","modules/documents/components/action-buttons/hoverText.tsx","modules/common/components/forms/messages/extraChipsMessage.tsx","modules/common/components/chipList.tsx","modules/common/components/calloutWithSearch.tsx","modules/common/components/forms/inputs/multiSelectContent.tsx","modules/common/components/forms/inputs/multiSelectCalloutWithSearch.tsx","modules/common/components/forms/inputs/multiSelectAndChipsWithSearch.tsx","modules/users/components/dialogs/topicPermissionSection.tsx","modules/common/components/forms/inputs/roleSelector.tsx","modules/users/components/localUserDialog.tsx","modules/users/components/bulkLocalDialog.tsx","modules/common/components/pickerLocalization.tsx","modules/users/components/userActivitiesFilters.tsx","modules/users/components/userActivities.tsx","modules/common/components/tutorial.tsx","modules/users/components/dialogs/usersTutorial.tsx","modules/users/components/userManagementPage.tsx","modules/common/components/table-view/components/column-width-calculator.ts","utils/shallowEquals.ts","modules/common/icons/index.tsx","modules/common/components/table-view/components/table-view.tsx","modules/common/components/pageToolBar.tsx","modules/surveys/components/surveyListing.tsx","modules/surveys/components/surveyManagementPage.tsx","modules/common/remoteFocusRequest.tsx","modules/common/components/forms/messages/InlineError.tsx","modules/common/components/forms/inputs/textInput.tsx","modules/common/components/DateTimePicker.tsx","pages/common/breadcrumb.tsx","modules/surveys/components/surveyEdit.tsx","modules/surveys/components/surveyDetails.tsx","modules/settings/components/generalSettingsForm.tsx","modules/common/components/specialtyBanner.tsx","utils/hexFunctions.ts","modules/settings/components/themeSettingsForm.tsx","modules/settings/components/translateDialog.tsx","modules/settings/components/translateErrorMaxLengthDialog.tsx","modules/settings/components/languageSettingsForm.tsx","modules/settings/components/featureControlsSettingsForm.tsx","modules/common/components/forms/inputs/multiselect.tsx","modules/common/components/forms/messages/InlineWarning.tsx","modules/common/commonSelectors.ts","modules/settings/components/topicsSelect.tsx","modules/common/components/modal.tsx","utils/getTranslatedContent.ts","modules/posts/actionCreator.ts","modules/common/components/table-view/components/infinite-scroll-view.tsx","modules/gallery/components/imageSelector.tsx","modules/settings/components/externalPostSourceEditForm.tsx","modules/settings/components/messaging/messagingCenterForm.tsx","modules/settings/components/externalSourcesSettingsForm.tsx","modules/users/components/user-field-components/inputField.tsx","modules/settings/components/toggles/settingsToggleOnly.tsx","modules/settings/components/toggles/blackoutToggleEvent.tsx","modules/users/components/user-field-components/inputFieldDouble.tsx","modules/users/components/user-field-components/textInputField.tsx","modules/settings/components/toggles/shareUrlsToggleOnly.tsx","modules/common/components/hovers/calloutHover.tsx","modules/settings/components/messaging/messagingMainControls.tsx","modules/settings/components/toggles/settingsToggleWithBlackout.tsx","modules/settings/components/toggles/settingsToggleOnlyDouble.tsx","modules/settings/components/toggles/settingsToggleOrAnd.tsx","modules/settings/components/authoringSettings.tsx","modules/settings/components/singleTextAreaInput.tsx","modules/settings/components/mobileTextAreaInput.tsx","modules/common/components/textBubble.tsx","modules/settings/components/warningLabel.tsx","modules/settings/components/tripleNotificationOverride.tsx","modules/settings/components/regularNotificationPopout.tsx","modules/settings/components/mobileNotificationPopout.tsx","modules/settings/components/reminderNotificationPopout.tsx","modules/settings/components/emailNotificationPopout.tsx","modules/settings/components/settingsToggleWithBlackoutNoSms.tsx","modules/settings/components/mobileAndEmailNotificationPopout.tsx","modules/settings/components/messaging/messagingPostControls.tsx","modules/settings/components/messaging/messagingEventControls.tsx","modules/settings/components/messaging/messagingGeneralControls.tsx","modules/common/hooks/usePrevious.tsx","modules/common/components/forms/inputs/inputCounter.tsx","modules/smartContent/common/magicIcon.tsx","modules/smartContent/buttons/smartContentDropDown.tsx","modules/common/components/forms/inputs/filledInput.tsx","modules/common/hooks/useUndoableState.tsx","modules/gallery/customChonkyFileActions.tsx","modules/common/components/authoring/uploader/uploadIconSvg.tsx","modules/support/actionCreator.ts","modules/common/components/authoring/uploader/uploader.tsx","modules/support/index.ts","utils/assertHelpers.ts","utils/debounceHook.ts","modules/gallery/galleryVfsHooks.ts","modules/common/components/authoring/dialogs/guidelineHint.tsx","modules/gallery/components/moveFilesAppBar.tsx","modules/common/components/dialogs/confirmDialog.tsx","modules/gallery/components/invalidFilesDialog.tsx","modules/gallery/components/duplicateFilesDialog.tsx","modules/common/components/snackbars/successSnackbar.tsx","modules/gallery/components/baseComponentOverlay.tsx","modules/gallery/components/dragDropOverlay.tsx","modules/gallery/components/uploadingOverlay.tsx","modules/gallery/components/galleryVFSOverlays.tsx","modules/gallery/components/createNewFolderDialog.tsx","modules/gallery/components/renameMediaDialog.tsx","modules/gallery/components/deleteMediaDialog.tsx","modules/gallery/components/galleryVFSFileActionDialogs.tsx","utils/onNextFrame.ts","modules/gallery/components/listHeaderDiv.tsx","modules/gallery/components/customStylingFunctions.ts","modules/gallery/components/galleryVFSPaging.tsx","modules/gallery/components/searchTextField.tsx","modules/gallery/components/galleryVFS.tsx","modules/gallery/components/galleryVFSBrowser.tsx","utils/chonkyCustomDataToAttachedFile.ts","modules/gallery/components/uploadMediaButton.tsx","modules/common/components/authoring/dialogs/imageGalleryDialog.tsx","modules/common/components/authoring/dialogs/intenseEmphasis.tsx","modules/common/hooks/useTinyMceAuthoringLogic.tsx","modules/common/components/authoring/bodyv2.tsx","modules/common/components/authoring/dialogs/documentGallerySearch.tsx","modules/common/components/pagingEmpty.tsx","modules/common/components/managementEmptyResults.tsx","modules/common/components/authoring/dialogs/documentGallery.tsx","modules/common/components/authoring/fileAttachments.tsx","modules/settings/components/content/fileAttachmentDisplay.tsx","utils/htmlUtils.ts","modules/settings/components/content/guidelines/contentGuidelinePreviewBody.tsx","modules/settings/components/content/contentSettingsForm.tsx","modules/settings/components/content/guidelines/contentGuidelinePreview.tsx","modules/settings/components/content/guidelines/contentGuidelines.tsx","modules/common/hooks/useIsFirstRender.tsx","modules/common/hooks/data/useReadabilitySettings.tsx","modules/common/hooks/data/useContentGuidelines.tsx","modules/settings/components/content/readability/readabilitySettings.tsx","modules/settings/components/content/readability/readabilitySettingsForm.tsx","modules/common/hooks/data/useTenantPostAverageScores.tsx","modules/newsletters/edit/components/contentTypeAndTopicSettings.tsx","modules/settings/components/settingsPage.tsx","modules/audiences/components/audience-creation/components/description.tsx","modules/common/components/buttons/moreOptionsButton.tsx","modules/audiences/components/audience-creation/components/editOptions.tsx","modules/audiences/components/audience-creation/components/enabled.tsx","modules/audiences/components/audience-creation/components/smartRules.tsx","modules/audiences/components/csvUploader.tsx","modules/common/components/numberStat.tsx","modules/audiences/components/audience-creation/components/csvValidation.tsx","modules/audiences/components/audience-creation/components/groupList.tsx","modules/audiences/components/audience-creation/components/searchUserGroups.tsx","modules/audiences/components/audience-creation/components/searchUsers.tsx","modules/audiences/components/audience-creation/components/userList.tsx","modules/audiences/components/audience-creation/components/searchInvites.tsx","modules/audiences/components/audience-creation/components/inviteList.tsx","modules/audiences/components/audience-creation/components/standardRules.tsx","modules/audiences/components/audience-creation/components/title.tsx","modules/audiences/components/audience-creation/components/totalUsers.tsx","modules/audiences/components/audience-creation/components/type.tsx","modules/audiences/components/audience-creation/audienceCreation.tsx","modules/audiences/components/action-buttons/moreAudienceOptions.tsx","modules/audiences/components/audience-filters/audienceFilters.tsx","modules/audiences/components/audience-listing/audienceList.tsx","modules/audiences/components/action-buttons/newAudience.tsx","modules/audiences/components/audience-listing/audienceListing.tsx","modules/audiences/components/userGroupPreviewModal.tsx","modules/audiences/components/everyoneSuggestionsManager.tsx","modules/audiences/components/deleteReplaceModal.tsx","modules/common/components/buttons/downloadButton.tsx","modules/audiences/components/everyoneAudienceManager.tsx","modules/newsletters/actions.ts","modules/newsletters/actionCreator.ts","modules/newsletters/models.ts","modules/newsletters/common/dialogs/emailActivityLogFilters.tsx","modules/newsletters/common/dialogs/emailActivityLog.tsx","modules/newsletters/management/components/newsletterSender.tsx","modules/newsletters/index.tsx","modules/newsletters/management/components/editEmailSender.tsx","modules/newsletters/management/components/globalSettings.tsx","modules/newsletters/management/components/moreOptions.tsx","modules/newsletters/dashboard/components/moreNewsletterOptions.tsx","modules/newsletters/management/components/newsletterFilters.tsx","modules/common/components/chips/chipLabels.tsx","modules/newsletters/management/components/newsletterList.tsx","modules/newsletters/management/components/newsletterListing.tsx","modules/newsletters/common/dialogs/copyNewsletterDialog.tsx","modules/newsletters/edit/components/themeDisplayWithDropdown.tsx","modules/newsletters/management/components/themeModal.tsx","modules/newsletters/management/components/associatedNewslettersDialog.tsx","modules/newsletters/management/newsletterManagementPage.tsx","pages/common/columns.tsx","pages/common/mainContentWithFooter.tsx","modules/newsletters/edit/components/title.tsx","modules/newsletters/edit/components/progress.tsx","modules/newsletters/edit/components/colorOption.tsx","modules/newsletters/edit/components/oneColumnNewsletterPreview.tsx","modules/newsletters/edit/components/twoColumnNewsletterPreview.tsx","modules/newsletters/edit/components/themeDisplay.tsx","modules/newsletters/edit/components/templateThemeSearchAndSelect.tsx","utils/newsletterUtils.ts","modules/newsletters/edit/components/templateWithPopup.tsx","modules/newsletters/edit/components/templateSection.tsx","modules/common/components/chips/chips.tsx","modules/newsletters/common/editAudiences.tsx","modules/newsletters/edit/components/audienceAndFrequencySettings.tsx","modules/newsletters/common/editTags.tsx","modules/newsletters/edit/components/settingsSection.tsx","modules/newsletters/edit/components/newsletterPreview.tsx","modules/newsletters/common/dialogs/sendTestEmailDialog.tsx","modules/newsletters/edit/components/subjectAndPreHeader.tsx","modules/newsletters/common/uploader/uploadIconSvg.tsx","modules/newsletters/common/uploader/uploaderWithLoad.tsx","modules/newsletters/edit/components/headerAndFooter.tsx","modules/common/components/authoring/dialogs/translateContentConfirmation.tsx","modules/common/hooks/useTranslatedContent.tsx","modules/common/components/forms/inputs/calloutMultiselect.tsx","modules/localization/components/languageBar.tsx","modules/newsletters/edit/components/newsletterLanguageBar.tsx","modules/common/hooks/data/useLanguages.tsx","utils/deepCopy.ts","modules/common/hooks/useDefaultLocale.tsx","modules/common/components/authoring/dialogs/preview.tsx","modules/newsletters/edit/editNewsletterPage.tsx","modules/newsletters/edit/editThemePage.tsx","modules/newsletters/dashboard/components/dashboardActions.tsx","modules/common/components/showMoreSection.tsx","modules/newsletters/dashboard/components/details.tsx","modules/newsletters/common/uploader/uploader.tsx","modules/newsletters/dashboard/components/headerFooter.tsx","modules/newsletters/dashboard/components/issueDetails.tsx","modules/newsletters/dashboard/components/searchEvents.tsx","modules/newsletters/dashboard/components/searchPosts.tsx","modules/newsletters/dashboard/components/pinnedContent.tsx","modules/newsletters/dashboard/components/editQueuedIssueDialog.tsx","modules/newsletters/dashboard/components/futureIssues.tsx","modules/common/components/three-dots/index.tsx","modules/common/components/window-resize-listener/index.tsx","modules/insights/components/charts/groupedBarChart.ts","modules/insights/components/placeholderWidget.tsx","modules/insights/components/charts/chartSwatchComponent.tsx","modules/newsletters/dashboard/components/insights/dailyEmailEventsWidget.tsx","modules/newsletters/dashboard/components/insights/weeklyEmailEventsWidget.tsx","modules/newsletters/dashboard/components/insights/insightsInfoHover.tsx","modules/newsletters/dashboard/components/insights/newsletterInsightsTab.tsx","modules/insights/components/charts/pieChart.ts","modules/common/components/hovers/textHover.tsx","modules/newsletters/dashboard/components/insights/issuePublishingStatsWidget.tsx","modules/insights/components/charts/horizontalBarChart.ts","modules/newsletters/dashboard/components/insights/issueEmailEventsWidget.tsx","modules/newsletters/dashboard/components/insights/issueInsightsTab.tsx","modules/newsletters/dashboard/components/pastIssues.tsx","modules/newsletters/dashboard/newsletterDashboardPage.tsx","modules/posts/components/action-buttons/downloadReports.tsx","modules/posts/components/action-buttons/newPost.tsx","modules/common/components/filters/authoringFilter.tsx","modules/posts/components/post-filters/postFilters.tsx","modules/posts/components/post-listing/moreOptions.tsx","modules/common/components/authoring/desktopPreview.tsx","modules/common/icons/fluentPostUpdateIcon.tsx","modules/common/icons/fluentCalendarIcon.tsx","modules/common/components/authoring/teamsPreview.tsx","modules/common/components/authoring/mobilePreview.tsx","modules/common/components/authoring/dialogs/plainPreview.tsx","modules/common/components/authoring/createdByFilter.tsx","modules/posts/components/post-view/video.tsx","modules/common/components/canvasPreviewImage.tsx","modules/common/components/carousel/carousel.tsx","modules/common/components/heroBanner.tsx","modules/common/components/banners/postTypeBanner.tsx","modules/posts/components/banners/breakingFeaturedBanner.tsx","modules/posts/components/post-view/compliance/compliance.tsx","modules/posts/components/post-view/reactions/reaction.tsx","modules/posts/components/post-view/reactions/reactions.tsx","modules/common/components/basicTinyMce.tsx","utils/textEditorUtils.ts","modules/posts/components/post-view/comments/textboxButtons.tsx","modules/posts/components/post-view/comments/mentionTextbox.tsx","modules/posts/components/post-view/comments/deleteComment.tsx","modules/posts/components/post-view/comments/editComment.tsx","modules/posts/components/post-view/comments/flagComment.tsx","modules/posts/components/post-view/comments/commentFooter.tsx","modules/posts/components/post-view/comments/comment.tsx","modules/posts/components/post-view/comments/replyTextbox.tsx","modules/posts/components/post-view/comments/replySection.tsx","modules/posts/components/post-view/comments/comments.tsx","modules/common/hooks/data/useCustomTinyMceCssContent.tsx","utils/urlUtils.ts","modules/common/components/customCss.tsx","modules/posts/components/post-view/postContentView.tsx","utils/redirectUtils.ts","modules/common/components/dialogs/confirmRepublishCompliancePostDialog.tsx","modules/common/hooks/data/useContentBands.tsx","modules/common/components/authoring/dialogs/editPublishedContentDialog.tsx","modules/posts/components/post-listing/postList.tsx","modules/common/hooks/useRetryableRequest.tsx","modules/insights/components/contentAnalyses.tsx","modules/common/components/successfulActionDialog.tsx","modules/common/components/authoring/constants.ts","modules/common/components/authoring/dialogs/publishedContentDialog.tsx","modules/posts/components/post-creation/dialogs/publishedPostDialog.tsx","modules/posts/components/post-listing/postListing.tsx","modules/posts/components/postsManagementPage.tsx","modules/common/components/authoring/draftLog/draftActivityLog.tsx","modules/common/components/authoring/draftLog/draftHistory.tsx","modules/common/components/authoring/draftLog/draftHistoryButton.tsx","modules/common/components/authoring/authoringAppBar.tsx","modules/common/components/authoring/editorLayouts/editorWrapperLayout.tsx","modules/common/components/authoring/editorLayouts/mainEditorLayout.tsx","modules/common/components/authoring/validator.tsx","modules/common/components/drawers/authoringDrawer.tsx","modules/common/components/forms/inputs/datePicker.tsx","modules/common/components/forms/inputs/dateAndTime.tsx","modules/posts/components/post-creation/components/breakingTime.tsx","modules/posts/components/post-creation/components/featuredTime.tsx","modules/common/components/authoring/reminders.tsx","modules/common/components/authoring/notifications.tsx","modules/common/components/authoring/publishTime.tsx","modules/common/components/authoring/expiryTime.tsx","modules/posts/components/post-creation/components/reactingEnabled.tsx","modules/posts/components/post-creation/components/commentingEnabled.tsx","modules/posts/components/post-creation/components/publicShareLinkEdit.tsx","modules/common/components/authoring/optionsEditor.tsx","modules/insights/components/emptyDataMessage.tsx","modules/insights/components/indicator.tsx","modules/insights/components/indicatorWrapper.tsx","modules/insights/components/readabilityAndReachIndicators.tsx","modules/insights/components/textAndWords.tsx","modules/insights/components/contentIssues.tsx","modules/common/hooks/useAccordion.tsx","modules/posts/components/post-creation/smartContent/postSmartContentHome.tsx","modules/common/components/pagination/pagination.tsx","modules/common/components/authoring/cropper/animatedDragPrompt.tsx","modules/common/components/authoring/cropper/cropper.tsx","modules/common/components/paddedImage.tsx","modules/common/components/authoring/dialogs/imageCropper.tsx","modules/common/components/authoring/heroBanner/heroBannerEditor.tsx","modules/posts/components/post-creation/components/postType.tsx","modules/common/components/forms/inputs/iconTextInput.tsx","modules/common/components/authoring/detailsEditor.tsx","utils/notificationsHelper.ts","modules/posts/components/post-creation/components/postSettingsPanel.tsx","modules/common/components/authoring/translatableContentEditor.tsx","modules/posts/components/post-creation/components/postMainPanel.tsx","modules/smartContent/buttons/smartContentPaperFab.tsx","modules/smartContent/smartContentPaper.tsx","modules/common/buttons/tileButton.tsx","modules/smartContent/smartContentFooter.tsx","modules/smartContent/smartContentHome.tsx","modules/posts/components/post-creation/smartContent/postSmartContentPanel.tsx","modules/smartContent/smartContentSuggestedHeader.tsx","modules/smartContent/smartContentSuggestion.tsx","modules/posts/components/post-creation/smartContent/postSmartContentKeywords.tsx","modules/smartContent/smartContentListPage.tsx","modules/smartContent/smartContentTitles.tsx","modules/posts/components/post-creation/smartContent/postSmartContentIdeas.tsx","modules/smartContent/smartContentSummaries.tsx","modules/smartContent/smartContentDraftPage.tsx","modules/settings/components/content/readability/readabilitySettingsDialog.tsx","modules/smartContent/smartContentGeneric.tsx","modules/common/components/authoring/dialogs/oneLastCheck.tsx","modules/posts/components/post-creation/postEditor.tsx","modules/common/components/authoring/dialogs/oneLastCheckMoreDetails.tsx","modules/common/components/authoring/dialogs/submissionDisclaimer.tsx","modules/common/components/authoring/authoringAppBarActions.tsx","modules/common/icons/dockToLeftIcon.tsx","modules/posts/components/post-creation/postCreation.tsx","modules/common/components/authoring/utils.ts","modules/posts/components/post-creation/components/postAuthoringActionsAppBar.tsx","modules/common/components/authoring/dialogs/rejectSubmissionDialog.tsx","modules/common/hooks/useOpenContentGuidelines.tsx","modules/events/components/event-listing/eventListing.tsx","modules/events/components/action-buttons/newEvent.tsx","modules/events/components/confirmations/deleteEvent.tsx","modules/events/components/event-filters/eventFilters.tsx","modules/events/components/event-feed/components/dates/FullStartDate.tsx","modules/common/components/banners/eventTypeBanner.tsx","modules/events/components/date-block/dateBlock.tsx","modules/events/components/event-views/components/author.tsx","modules/events/components/event-views/components/body.tsx","modules/events/components/event-views/components/cutoffTime.tsx","modules/events/components/event-views/components/addToCalendar.tsx","modules/events/components/event-views/components/eventTimes.tsx","modules/events/components/event-views/components/fileAttachments.tsx","modules/events/components/event-views/components/location.tsx","modules/events/components/event-views/components/tags.tsx","modules/events/components/event-views/components/title.tsx","modules/events/components/event-views/eventPreview.tsx","modules/events/components/event-listing/moreOptions.tsx","modules/events/components/event-listing/eventActionToolbar.tsx","modules/events/components/event-listing/eventList.tsx","modules/events/components/event-listing/publishedEventDialog.tsx","modules/events/components/event-creation/components/eventCommandBar.tsx","modules/events/components/eventManagementPage.tsx","modules/common/components/authoring/author.tsx","modules/common/components/authoring/video/video.tsx","modules/common/components/authoring/heroBanner/heroBanner.tsx","utils/generalConstants.ts","modules/common/components/authoring/authoringWarnings.tsx","modules/common/components/authoring/dialogs/contentAnalysis.tsx","modules/common/components/authoring/body.tsx","modules/common/components/authoring/summary.tsx","modules/common/components/authoring/title.tsx","modules/common/components/authoring/translatedContent.tsx","modules/events/components/confirmations/updateInPersonCapacity.tsx","modules/events/components/confirmations/updateOnlineCapacity.tsx","modules/events/components/event-creation/components/capacity.tsx","modules/events/components/event-creation/components/cutoffTime.tsx","modules/events/components/event-creation/components/eventTimes.tsx","modules/events/components/event-creation/components/eventType.tsx","modules/events/components/event-creation/components/location.tsx","modules/events/components/event-creation/components/questions.tsx","modules/insights/components/insightFilters.tsx","modules/events/components/event-creation/eventEditor.tsx","modules/events/components/event-creation/validation.ts","modules/events/components/event-creation/components/eventAuthoringActionsAppBar.tsx","modules/events/components/event-creation/eventCreation.tsx","modules/events/components/dialogs/changeRSVPStatus.tsx","modules/events/components/dialogs/editResponse.tsx","modules/events/components/event-filters/attendanceFilters.tsx","modules/events/components/attendance-listing/attendanceList.tsx","modules/events/components/attendance-listing/attendanceListing.tsx","modules/documents/components/action-buttons/newDocument.tsx","modules/common/components/chips/audienceChipLabels.tsx","modules/common/components/chips/categoryTagChipLabels.tsx","modules/documents/components/action-buttons/moreDocumentOptions.tsx","modules/documents/utilities/getMimeType.ts","modules/documents/components/document-creation/components/supportedFileTypes.tsx","modules/documents/components/document-creation/components/documentUploader.tsx","modules/common/components/chips/audienceChips.tsx","modules/documents/components/document-creation/components/accessibleAudiences.tsx","modules/documents/components/document-creation/components/availability.tsx","modules/common/components/chips/categoryTagChips.tsx","modules/documents/components/document-creation/components/categoryTags.tsx","modules/documents/components/document-creation/components/fileName.tsx","modules/documents/components/document-creation/components/language.tsx","modules/documents/components/document-creation/components/description.tsx","modules/documents/components/document-creation/components/revision.tsx","modules/documents/components/document-creation/components/state.tsx","modules/documents/components/document-creation/components/title.tsx","modules/documents/components/document-creation/documentProperties.tsx","modules/documents/components/document-creation/documentEditor.tsx","modules/documents/components/document-filters/documentFilters.tsx","modules/documents/components/document-views/components/documentPreviewInfo.tsx","modules/documents/components/document-views/components/documentPreviewMoreInfo.tsx","modules/documents/components/action-buttons/previewOptions.tsx","modules/documents/components/document-views/documentPreview.tsx","modules/documents/components/document-listing/documentList.tsx","modules/documents/components/document-listing/documentListing.tsx","modules/documents/containers/documentManagementPage.tsx","modules/documents/components/document-creation/components/documentSummary.tsx","modules/documents/components/document-creation/documentCreation.tsx","modules/insights/components/downloadIconSvg.tsx","modules/common/components/contentDeletedDialog.tsx","modules/insights/components/top-posts/components/topPosts.tsx","modules/insights/components/top-posts/index.tsx","modules/insights/components/charts/verticalBarChart.ts","modules/insights/components/usersByMonth.tsx","modules/insights/components/charts/verticalDoubleBarChart.ts","modules/insights/components/commentsByMonth.tsx","modules/insights/components/userTrend.tsx","modules/insights/components/clientBreakdown.tsx","modules/insights/components/readsViewsByHour.tsx","modules/insights/components/topSurveys.tsx","modules/insights/components/dialogs/insightsTutorial.tsx","modules/common/components/buttons/filterMoreOptionsButton.tsx","modules/insights/components/dashboard.tsx","modules/insights/components/topEvents.tsx","modules/insights/components/downloadReportsDropdown.tsx","modules/insights/components/tagListItem.tsx","modules/insights/components/tagCreationModal.tsx","modules/insights/components/tagList.tsx","modules/insights/components/tagAwarenessCalculator.ts","modules/insights/components/charts/lineChart.ts","modules/insights/components/contentAnalysesSimple.tsx","modules/insights/components/awarenessVisualization.tsx","modules/common/dateFormatter.ts","modules/insights/components/highlightedNumber.tsx","modules/audiences/components/suggestionsManager.tsx","modules/insights/components/tagSubscriptionManagerModal.tsx","modules/insights/components/tagDetail.tsx","modules/categorytags/components/action-buttons/moreCategoryTagOptions.tsx","modules/categorytags/components/category-tags-filters/categoryTagsFilters.tsx","modules/categorytags/components/category-tags-listing/categoryTagsList.tsx","modules/categorytags/components/category-tags-listing/categoryTagsListing.tsx","modules/categorytags/components/action-buttons/downloadReports.tsx","modules/categorytags/components/action-buttons/newCategoryTag.tsx","modules/categorytags/components/dialogs/audiencesDrawer.tsx","modules/categorytags/components/dialogs/newCategoryTagDialog.tsx","modules/categorytags/components/dialogs/editCategoryTagDialog.tsx","modules/common/components/toggleFilter.tsx","modules/categorytags/components/dialogs/moreOptions.tsx","modules/categorytags/components/dialogs/viewCategoryTagDialog.tsx","modules/categorytags/containers/categoryTagsManagementPage.tsx","modules/common/components/buttons/backToButton.tsx","modules/common/components/progressiveImage.tsx","modules/posts/components/post-insights/components/contentOverviewSideBar.tsx","modules/common/components/buttons/downloadButtonv2.tsx","utils/readableLabelMapper.ts","modules/posts/components/post-insights/components/readingComprehensionAnalysis.tsx","modules/posts/components/post-insights/components/breakdownChart.tsx","modules/posts/components/post-insights/components/postInsightsCharts.tsx","modules/posts/components/post-insights/components/contentOverviewCard.tsx","modules/posts/components/post-insights/components/activityInsights.tsx","modules/posts/components/post-insights/components/analyticsDrawer.tsx","modules/posts/components/post-insights/postInsightsv2.tsx","modules/common/components/chipListInput.tsx","modules/gallery/components/mediaPreviewer.tsx","modules/gallery/components/imageGallery.tsx","routes/_layout/externalLayout.tsx","routes/_layout/common/components/Logout.tsx","routes/RedirectToDashboard.tsx","routes/RedirectToHome.tsx","routes/RedirectToWelcome.tsx","routes/_layout/login/loginLayout.tsx","modules/tenant/components/tenantSelection.tsx","authentication/RequireLogin.tsx","authentication/IFrameDetector.tsx","modules/activity/components/flaggedListItem.tsx","modules/activity/components/flaggedItemsManagement.tsx","modules/activity/components/activityManagementPage.tsx","modules/common/components/hovers/warningHover.tsx","modules/users/components/user-profile/account.tsx","modules/users/components/common/inputField.tsx","modules/users/components/common/inputPrefixField.tsx","utils/phoneInputFunctions.ts","modules/users/components/common/phoneInputField.tsx","modules/users/components/common/passwordInputField.tsx","modules/users/components/common/pronounsInputField.tsx","modules/users/components/common/editAudiences.tsx","modules/users/components/user-profile/profileDetails.tsx","modules/users/components/user-profile/unableToEditMessage.tsx","modules/users/components/user-profile/moreUserProfileOptions.tsx","modules/users/components/dialogs/permissionsDrawer.tsx","modules/users/components/user-profile/userProfilePage.tsx","modules/users/components/toolboxButton.tsx","modules/messaging/components/messagingCenterSMSTab.tsx","modules/common/components/textAreaLanguageSelector.tsx","modules/audiences/components/audienceCalloutSelector.tsx","modules/messaging/components/smsBlastModal.tsx","modules/messaging/components/messagingCenterTeamsTab.tsx","modules/messaging/components/messagingCenterMobileTab.tsx","modules/messaging/components/messagingCenterScreen.tsx","modules/users/components/externalUsersLobbyView.tsx","modules/portalPages/global-components/navigation-items/action-buttons/newNavigationItem.tsx","modules/portalPages/global-components/navigation-items/action-buttons/newChildNavigationItem.tsx","modules/portalPages/global-components/navigation-items/navigation-items-listing/navigationItemsList.tsx","modules/portalPages/global-components/navigation-items/navigation-items-listing/navigationItemsListing.tsx","modules/portalPages/containers/navigationItemsManagementPage.tsx","modules/portalPages/components/dialogs/globalComponentsDrawer.tsx","modules/portalPages/components/action-buttons/moreOptions.tsx","modules/portalPages/components/action-buttons/newPortalPage.tsx","modules/portalPages/components/dialogs/audiencesList.tsx","modules/portalPages/components/dialogs/newPortalPageDialog.tsx","modules/portalPages/components/action-buttons/morePortalPageOptions.tsx","modules/portalPages/components/dialogs/modifyPortalPageDetailsDialog.tsx","modules/portalPages/components/dialogs/modifyPortalPageTitleDialog.tsx","modules/portalPages/components/portal-pages-filters/portalPagesFilters.tsx","modules/portalPages/tinacms/components/banner.tsx","modules/portalPages/global-components/navigation-items/navigationItems.tsx","modules/portalPages/tinacms/components/navigation.tsx","modules/portalPages/tinacms/plugins/common/pluginWrapper.tsx","modules/sharing/models.ts","modules/posts/components/banners/quickPostBanner.tsx","modules/posts/components/post-feed/components/dates/PublishTime.tsx","modules/posts/components/post-feed/components/dates/ReadDate.tsx","modules/posts/components/post-feed/components/dates/ReadingTime.tsx","modules/posts/components/post-feed/components/stats/Stats.tsx","modules/posts/components/post-feed/components/topics/Topics.tsx","modules/posts/components/post-feed/components/layouts/card/Tile.tsx","modules/common/components/feed/loadMoreButton.tsx","modules/common/components/feed/feedButtons.tsx","modules/posts/components/post-feed/components/layouts/card/Card.tsx","modules/posts/components/post-feed/components/layouts/column/Tile.tsx","modules/posts/components/post-feed/components/layouts/column/Column.tsx","modules/posts/components/post-feed/components/layouts/window/Tile.tsx","modules/posts/components/post-feed/components/layouts/window/Window.tsx","modules/common/hooks/useTranslatableContent.tsx","modules/common/components/banners/contentTypeIcons.tsx","modules/posts/components/post-feed/components/layouts/list/PostTypeIcons.tsx","modules/posts/components/post-feed/components/layouts/list/Tile.tsx","modules/posts/components/post-feed/components/layouts/list/List.tsx","modules/common/components/buttons/labelledIconButton.tsx","utils/shareHelpers.ts","modules/sharing/internalShareScreen.tsx","modules/sharing/publicShareScreen.tsx","modules/portalPages/tinacms/models/common.ts","modules/common/components/buttons/shareButtonv2.tsx","modules/posts/components/post-view/postView.tsx","modules/common/components/dialogs/dialogContentView.tsx","modules/posts/components/post-view/dialogPostView.tsx","modules/events/components/event-feed/models.ts","modules/common/components/feed/emptyFeed.tsx","modules/posts/components/post-feed/postFeed.tsx","modules/portalPages/tinacms/components/feed/templates.tsx","modules/portalPages/tinacms/components/feed/newsFeed.tsx","modules/portalPages/tinacms/components/text.tsx","modules/portalPages/tinacms/components/customWidget.tsx","modules/events/components/attendance/attendance.tsx","modules/events/components/event-feed/components/layouts/eventInfo.tsx","modules/events/components/event-feed/components/layouts/visualCard/Event.tsx","modules/events/components/event-feed/components/layouts/visualCard/VisualCard.tsx","modules/events/components/event-feed/consts/viewOptions.tsx","modules/events/components/event-views/components/signUp.tsx","modules/events/components/event-views/components/signUpForm.tsx","modules/events/components/event-views/eventView.tsx","modules/events/components/event-feed/components/layouts/list/Tile.tsx","modules/events/components/event-feed/components/layouts/list/List.tsx","modules/events/components/event-feed/components/layouts/window/Tile.tsx","modules/events/components/event-feed/components/layouts/window/Window.tsx","modules/events/components/event-feed/eventFeedSection.tsx","modules/portalPages/tinacms/models/section.ts","modules/portalPages/tinacms/components/feed/eventsFeed.tsx","modules/common/components/utils/shareUtils.ts","modules/documents/components/document-feed/components/documentShareButton.tsx","modules/documents/components/document-feed/components/documentActionButtons.tsx","modules/documents/components/document-feed/components/layouts/feed/document.tsx","modules/documents/constants.ts","modules/documents/components/document-feed/documentActions.ts","modules/documents/components/document-views/components/documentViewMoreInfo.tsx","modules/documents/components/document-views/documentView.tsx","modules/documents/components/document-feed/components/layouts/feed/documentFeedSection.tsx","modules/portalPages/tinacms/components/feed/docsFeed.tsx","modules/portalPages/tinacms/components/section.tsx","modules/portalPages/tinacms/page.tsx","modules/portalPages/components/action-buttons/previewOptions.tsx","modules/portalPages/components/portal-pages-views/portalPagePreview.tsx","modules/portalPages/components/portal-pages-listing/portalPagesList.tsx","modules/portalPages/components/portal-pages-listing/portalPagesListing.tsx","modules/portalPages/components/dialogs/portalPagesTutorial.tsx","modules/portalPages/containers/portalPagesManagementPage.tsx","modules/portalPages/tinacms/dialogs/backToManagePortalPagesDialog.tsx","modules/portalPages/tinacms/dialogs/goToNavigationItemsDialog.tsx","modules/portalPages/tinacms/dialogs/publishChangesDialog.tsx","modules/portalPages/tinacms/dialogs/publishDialog.tsx","modules/portalPages/tinacms/editor.tsx","modules/portalPages/tinacms/plugins/checkbox.tsx","modules/portalPages/tinacms/plugins/commandBar.tsx","modules/portalPages/tinacms/plugins/editNavigationItems.tsx","modules/portalPages/tinacms/plugins/common/description.tsx","modules/portalPages/tinacms/plugins/common/label.tsx","modules/portalPages/tinacms/plugins/image.tsx","modules/portalPages/tinacms/plugins/label.tsx","modules/portalPages/tinacms/plugins/muiToggle.tsx","modules/portalPages/tinacms/plugins/pageDetails.tsx","modules/portalPages/tinacms/plugins/percentageSlider.tsx","modules/portalPages/tinacms/plugins/sectionLabel.tsx","modules/portalPages/tinacms/plugins/selectItems.tsx","modules/portalPages/tinacms/plugins/selectTopics.tsx","modules/portalPages/tinacms/plugins/selectCategoryTags.tsx","modules/portalPages/tinacms/plugins/tinyMCE.tsx","modules/portalPages/tinacms/setup.tsx","modules/common/hooks/data/useCustomPortalPagesCssContent.tsx","modules/common/hooks/data/useLoadCustomCssStyles.tsx","modules/portalPages/components/portal-pages-creation/portalPagesEditor.tsx","modules/portalPages/components/portal-pages-creation/portalPagesCreation.tsx","modules/documents/components/document-feed/components/layouts/card/document.tsx","modules/documents/components/document-feed/components/layouts/card/index.tsx","modules/documents/components/document-feed/components/layouts/list/document.tsx","modules/documents/components/document-feed/components/layouts/list/index.tsx","modules/documents/components/document-feed/components/requestAccess.tsx","modules/documents/components/document-filters/documentFeedFilters.tsx","modules/documents/components/document-feed/components/layoutSelection.tsx","modules/documents/components/document-feed/components/sortSelection.tsx","modules/common/components/roundedTabs.tsx","modules/documents/components/document-feed/components/views.tsx","modules/documents/components/document-feed/documentFeed.tsx","pages/documents/documentsPage.tsx","utils/filterTagsUtils.ts","modules/events/components/event-feed/components/filters/Filters.tsx","modules/events/components/event-feed/components/views/Views.tsx","modules/events/components/event-feed/eventFeed.tsx","modules/common/hooks/useOpenMobileAppBanner.tsx","modules/common/hooks/useIsMobileDevice.tsx","pages/events/eventsPage.tsx","pages/pageNotFound/pageNotFound.tsx","modules/portalPages/components/portal-pages-views/portalPageView.tsx","modules/posts/components/post-feed/components/filters/Filters.tsx","modules/posts/components/post-feed/myFeed.tsx","pages/posts/postsPage.tsx","pages/home/homePage.tsx","pages/portalPages/portalPagesPage.tsx","modules/posts/components/post-feed/publicFeed.tsx","pages/posts/publicPostsPage.tsx","pages/newsletters/publicNewsletterUnsubscribedPage.tsx","modules/profile/components/common/selectField.tsx","modules/profile/components/common/dialogSelectField.tsx","modules/profile/components/common/dialogSwitchField.tsx","modules/profile/components/common/phoneField.tsx","modules/profile/components/dialogs/preferredSMSPhoneDialog.tsx","modules/profile/components/notifications.tsx","modules/profile/components/tagSubscriptions.tsx","modules/profile/components/preferences.tsx","modules/profile/components/common/inputField.tsx","modules/profile/components/common/inputSwitchField.tsx","modules/profile/components/profileDetails.tsx","modules/profile/containers/details.tsx","modules/profile/components/unableToEditMessage.tsx","modules/profile/components/account.tsx","modules/profile/components/profileBanner.tsx","modules/profile/containers/user.tsx","pages/user/userPage.tsx","pages/welcome/welcomePage.tsx","authentication/Invitation.tsx","authentication/AuthRedirectHandler.tsx","pages/pageForbidden/pageForbidden.tsx","pages/pageForbidden/adminPageForbidden.tsx","modules/common/noticeWebpage.tsx","modules/reports/accessRestricted.tsx","modules/reports/reportExpired.tsx","modules/reports/downloadReportPage.tsx","pages/pageNotFound/adminPageNotFound.tsx","modules/tenantManagement/components/dialogs/newTenantCreationDialog.tsx","modules/tenantManagement/components/action-buttons/newTenant.tsx","modules/tenantManagement/components/filters/tenantFilterButtons.tsx","modules/tenantManagement/components/filters/tenantSearch.tsx","modules/tenantManagement/components/filters/tenantFilter.tsx","modules/tenantManagement/components/tenant-listing/tenantListing.tsx","modules/tenantManagement/components/tenantManagementPage.tsx","routes/authRoute.tsx","modules/common/hooks/data/useMobileConfig.tsx","modules/settings/components/homeScreenSelect.tsx","modules/settings/components/homeScreenSettingsForm.tsx","modules/settings/components/homeScreenSettings.tsx","utils/equalityUtils.ts","modules/contentBands/components/inputs/contentBandsButtons.tsx","modules/common/hooks/data/useHomeScreenConfigs.tsx","modules/contentBands/components/layouts/contentBandCard.tsx","modules/contentBands/components/layouts/contentBandWindow.tsx","modules/contentBands/components/layouts/contentBandCarousel.tsx","modules/contentBands/components/layouts/contentBandSeeMore.tsx","modules/contentBands/components/layouts/contentBandLayoutPreview.tsx","modules/contentBands/components/layouts/contentBandsMobilePreview.tsx","modules/contentBands/components/layouts/contentBandsTeamsPreview.tsx","modules/contentBands/components/dialogs/contentBandsPreview.tsx","modules/settings/components/manageHomeScreenSettingsPage.tsx","modules/contentBands/components/editor/contentBandsEditorActions.tsx","modules/common/components/drawers/drawerWithBookmarkButton.tsx","modules/contentBands/components/editor/contentBandsSettingsPanel.tsx","modules/contentBands/components/inputs/autoPlay.tsx","modules/contentBands/components/inputs/contentCount.tsx","modules/contentBands/components/inputs/contentType.tsx","modules/contentBands/components/inputs/displayFullTitles.tsx","modules/contentBands/components/inputs/enableSeeMore.tsx","modules/contentBands/components/inputs/ignoreSubscriptions.tsx","modules/contentBands/components/inputs/layoutInput.tsx","modules/common/hooks/useAnchorEl.tsx","modules/common/hooks/useDragReorder.tsx","modules/common/components/contentView/contentSearchResultItem.tsx","modules/common/components/contentView/contentSearchResultList.tsx","modules/common/components/contentView/contentSearch.tsx","modules/contentBands/components/inputs/pinned.tsx","modules/contentBands/components/inputs/readStatus.tsx","modules/contentBands/components/inputs/sortBy.tsx","modules/common/components/forms/inputs/multiselectMui.tsx","modules/contentBands/components/inputs/types.tsx","modules/contentBands/components/inputs/topics.tsx","modules/contentBands/components/editor/contentBandSettingsForm.tsx","modules/contentBands/components/editor/contentBandEditor.tsx","modules/common/components/buttons/hoverAddButton.tsx","modules/contentBands/components/editor/contentBandsMainEditor.tsx","modules/contentBands/components/dialogs/contentBandsPublishSettings.tsx","modules/contentBands/components/dialogs/contentBandsOneLastCheck.tsx","modules/common/components/overlays/mobileWarningOverlay.tsx","modules/contentBands/components/editor/contentBandsEditorPage.tsx","modules/common/hooks/data/useAuthoringTags.tsx","modules/settings/components/content/guidelines/contentGuidelinesPage.tsx","modules/emails/components/moreOptionsEmail.tsx","modules/emails/components/emailFilters.tsx","modules/emails/components/emailOptions.tsx","modules/emails/components/emailsTable.tsx","modules/common/hooks/useSetSnackbarMessages.tsx","utils/replaceTextPersonalizationTokens.ts","modules/emails/components/emailContentView.tsx","modules/emails/components/emailPreview.tsx","modules/emails/components/emailsList.tsx","modules/emails/components/emailsListing.tsx","modules/emails/components/senderEmailsDialog.tsx","modules/emails/components/sentEmailDialog.tsx","modules/emails/components/emailsManagementPage.tsx","modules/emails/components/editor/personalizationTokenButton.tsx","modules/emails/components/editor/emailEditor.tsx","modules/emails/components/editor/downloadRecipientsButton.tsx","modules/common/hooks/useDownloadRecipients.tsx","modules/common/hooks/useAudienceCount.tsx","modules/emails/components/editor/recipientCountDownload.tsx","modules/emails/components/editor/sendTestEmailInput.tsx","modules/common/components/emailValidationTextField.tsx","modules/common/components/addressSelect.tsx","modules/emails/components/editor/emailSettingsPanel.tsx","modules/emails/components/editor/emailAuthoringEditorActions.tsx","modules/emails/components/emailOneLastCheck.tsx","utils/htmlIsEqual.ts","modules/emails/components/editor/emailEditorPage.tsx","modules/shortcuts/components/shortcutsHeaderButtons.tsx","modules/shortcuts/components/shortcutsToolbar.tsx","modules/common/components/checkboxDropdown.tsx","modules/common/components/audienceSearchCallout.tsx","modules/shortcuts/components/shortcutsFilter.tsx","modules/shortcuts/components/shortcutsList/shortcutsTableListHeader.tsx","modules/shortcuts/components/shortcutsList/moreShortcutGroupOptions.tsx","modules/common/availability/availability.tsx","modules/shortcuts/components/shortcutsList/shortcutLeadingCell.tsx","modules/shortcuts/components/shortcutsList/moreShortcutOptions.tsx","modules/common/components/collapsibleTableRow/collapsibleTableCell.tsx","modules/common/components/collapsibleTableRow/collapsibleEmptyCheckBoxCell.tsx","modules/common/components/collapsibleTableRow/collapsibleTableRow.tsx","modules/shortcuts/components/shortcutsList/shortcutRow.tsx","modules/shortcuts/styles/constants.ts","modules/shortcuts/components/shortcutsList/shortcutsGroupRow.tsx","modules/shortcuts/components/shortcutsList/shortcutsList.tsx","modules/common/components/dialogField.tsx","modules/common/components/autocompleteSearch.tsx","modules/shortcuts/components/dialogs/shortcutGroupSearch.tsx","utils/isUrlValid.ts","modules/common/components/forms/inputs/textFieldWithInputCounter.tsx","modules/shortcuts/components/dialogs/shortcutDialogBody.tsx","modules/shortcuts/components/dialogs/dialogSkeleton.tsx","modules/shortcuts/components/dialogs/shortcutDialogSkeleton.tsx","modules/shortcuts/components/dialogs/editShorcutDialog.tsx","modules/shortcuts/components/dialogs/shortcutGroupDialogSkeleton.tsx","modules/shortcuts/components/dialogs/editShortcutGroupDialog.tsx","modules/shortcuts/components/dialogs/moveShortcutsDialog.tsx","modules/shortcuts/components/dialogs/deleteShortcutsDialog.tsx","modules/shortcuts/components/shortcutsListing.tsx","modules/shortcuts/components/dialogs/createShortcutGroupDialog.tsx","modules/shortcuts/components/dialogs/createShortcutDialog.tsx","modules/shortcuts/components/editor/dropZone.tsx","modules/shortcuts/components/editor/draggableNameContainer.tsx","modules/shortcuts/components/editor/draggableFlatShortcutsFormat.tsx","modules/shortcuts/components/editor/draggableShortcutGroupsFormat.tsx","modules/shortcuts/components/editor/shortcutsFormatEditor.tsx","modules/shortcuts/components/editor/shortcutsOrganizeListHeaderButtons.tsx","modules/shortcuts/shortcutsManagementPage.tsx","routes/routes.tsx","modules/common/components/snackbars/snackbars.tsx","authentication/navigation/customNavigationClient.ts","index.tsx","modules/profile/actions.ts","modules/common/components/authoring/models.ts","api/network/index.ts","modules/messaging/models.ts","modules/common/components/authoring/authoringTinyMce.tsx","modules/common/components/loading.tsx","api/authoring.ts","api/clientPosts.ts","api/compliance.ts","api/mediaLibrary.ts","api/portalPages.ts","api/newsletters.ts","api/profile.ts","api/reactions.ts","api/surveys.ts","api/categorytags.ts","api/index.ts","modules/portalPages/reducer.ts","modules/posts/actions.ts","modules/homeScreens/reducer.ts","modules/surveys/actionCreator.ts","modules/settings/actions.ts","modules/documents/reducer.ts","modules/resources/actions.ts","modules/posts/components/post-creation/validation.ts","modules/settings/components/reminderPopout.tsx","network/actions.ts","modules/common/services/tinyMceTemplateService.ts","modules/adminLayout/actions.ts","utils/isValidEmail.ts","modules/resources/actionCreator.ts","utils/spellcheckLanguages.ts","modules/support/models.ts","modules/activity/models.ts","modules/portalPages/actions.ts","modules/reports/models.ts","modules/events/actions.ts","modules/audiences/index.ts","modules/events/index.ts","modules/users/actionCreator.ts","modules/userPortalLayout/actionCreator.ts","modules/localization/translations/en-us.json.ts","modules/localization/models.ts","modules/localization/actions.ts","modules/gallery/reducer.ts","modules/gallery/index.ts","utils/managementUtils.ts","utils/notyPopups.tsx","modules/activity/actions.ts","modules/tenant/actions.ts","modules/userPortalLayout/actions.ts","modules/audiences/reducer.ts","modules/categorytags/reducer.ts","modules/settings/components/content/guidelines/reducer.ts","modules/common/components/snackbars/reducer.ts","modules/posts/models.ts","modules/messaging/actions.ts","modules/messaging/actionCreator.ts","modules/messaging/reducer.ts","modules/messaging/index.tsx","utils/getCurrentTimeInUserTimezone.ts","modules/documents/index.ts","utils/bannerText.ts","modules/globalLayout/reducer.ts","modules/documents/actions.ts","utils/cookie.ts","modules/users/actions.ts","api/network/utils.ts","modules/settings/actionCreator.ts","modules/common/components/DevTools.tsx","modules/activity/actionCreator.ts","api/activity.ts","api/audiences.ts","api/comments.ts","api/documents.ts","api/draftPosts.ts","api/events.ts","api/insights.ts","api/posts.ts","api/settings.ts","modules/portalPages/actionCreator.ts","api/users.ts","api/multitenancy.ts","api/tags.ts","api/support.ts","api/reports.ts","api/sharing.ts","api/submissions.ts","modules/events/reducer.ts","modules/support/reducer.supportEditor.ts","modules/profile/index.ts","modules/tenant/index.ts","modules/categorytags/index.tsx","utils/isDevEnvironment.ts","modules/settings/reducer.ts","modules/settings/index.ts","typedActions.ts","utils/network.ts","modules/contentBands/models.ts","modules/categorytags/actions.ts","modules/emails/models.ts","modules/insights/actions.ts","modules/audiences/actions.ts","modules/common/models.ts","utils/fileDownloader.tsx","modules/documents/actionCreator.ts","modules/shortcuts/models.ts"],"names":["QUERY_PARAM_KEYS","SIGNED_OUT_SUCCESS","INVITE_TOKEN","TENANT_ID","TENANT_NAME","OPEN_UPDATE_OPTIONS","IS_RESET_PASSWORD_LINK","LOAD_PREVIEW_OPEN","ALL_PAGE_NUMBER","PUBLISHED_PAGE_NUMBER","SCHEDULED_PAGE_NUMBER","DRAFT_PAGE_NUMBER","SUBMISSION_PAGE_NUMBER","TAB_NUMBER","PAGE_CONTEXT","IS_CONTENT_BAND_PUBLISH","useQueryParams","search","useLocation","React","useMemo","URLSearchParams","PromptTypeEnum","changeRSVPStatus","id","attendeeIds","attendanceType","dispatch","getState","Actions","API","events","ChangeRSVPStatus","then","response","succeeded","status","catch","err","cloneEvent","CloneEvent","json","deleteEvents","Promise","all","map","e","DeleteEventDraft","draftId","DeleteEvent","results","deletedEvents","unpublishEvent","UnpublishEvent","editResponse","attendeeId","answers","EditResponse","getAttendance","attendanceTypes","pageNumber","filters","GetAttendance","getAttendanceCSV","GetAttendanceCSV","getContentAnalysis","text","GetContentAnalysis","getDocument","mediaLibrary","FetchDocumentForId","file","blobId","fileExtension","fileName","name","fileType","fileUrl","url","ospreyId","getDocumentGallery","FetchDocuments","documentGalleryPage","currentPage","documents","totalDocuments","totalPages","getDraft","imageScale","ImageScale","Unprocessed","GetDraft","getSubmissions","pageAmount","_","getEventDrafts","eventStates","ContentState","Submission","eventPage","totalEvents","getDrafts","Draft","getAllEvents","GetAllEvents","getDraftTranslation","content","outputLCID","GetDraftTranslation","getEvent","GetEvent","getEventFeed","filtersApplied","sortAscending","GetEventFeed","eventsFeed","error","fetchEventFeedLocal","res","getFirstGifFrame","gif","resolve","reject","canvas","document","createElement","img","Image","onload","width","height","getContext","drawImage","toBlob","newBlob","lastModifiedDate","Date","src","URL","createObjectURL","getImage","FetchImageForId","videoId","getImageGallery","includeVideos","GetImageGallery","imageGalleryPage","images","totalImages","getPublished","GetPublished","getScheduled","GetScheduled","getVideo","FetchVideoForId","getVideosComplete","publishEvent","eventId","sendNotification","PublishEvent","publishedEvents","rsvp","rsvpType","RSVP","submitEvent","saveEvent","event","SaveEvent","setEventFeedFilters","setEventFeedView","selectedView","updateEventFeed","updateUrl","updateUrlComplete","uploadDocument","onProgress","onLoad","onError","onAbort","a","async","MsalAuthModule","getInstance","getAccessToken","accessToken","requestDetails","UploadDocument","config","SparrowClientApiUrl","replace","tenant","handlers","XhrUpload","authenticateWith","upload","JSON","parse","docId","uploadImage","image","test","type","fileToUpload","UploadImage","imageId","uploadThumbImage","blob","VideoUploads","UploadImageThumbnail","hasChangedSinceSaved","clearChangedSinceSaved","clearErrorMessage","clearEventFeed","clearEventFeedFilters","clearEventList","clearShouldFetch","clearShowPublishSuccess","clearSuccessMessage","setEventsFeedToDefault","CREATE_NEW_SUPPORT_ITEM","CreateNewSupportItem","ActionCreator","CREATE_NEW_ITEM_COMPLETE","CreateNewItemComplete","FETCH_SUPPORT_ITEM","FetchSupportItem","FETCH_SUPPORT_ITEM_COMPLETE","FetchSupportItemComplete","SAVE_SUPPORT_ITEM","SaveSupportItem","SAVE_SUPPORT_ITEM_COMPLETE","SaveSupportItemComplete","DELETE_SUPPORT_ITEM","DeleteSupportItem","DELETE_SUPPORT_ITEM_COMPLETE","DeleteSupportItemComplete","SUPPORT_EDIT_FIELD_UPDATE","FieldUpdate","PUBLISH_SUPPORT_ITEM","PublishSupportItem","PUBLISH_SUPPORT_ITEM_COMPLETE","PublishSupportItemComplete","PUBLISH_SUCCESS","PublishSucess","UPLOAD_DOCUMENT","SET_UPLOADING_DOC","SetUploadingDoc","UPLOAD_DOCUMENT_COMPLETE","UploadDocumentComplete","UPLOAD_FILES","UploadFiles","UPLOAD_FILES_COMPLETE","UploadFilesComplete","SUPPORT_ASSOCIATED_LINKS_UPDATE","SupportAssociatedLinksUpdate","REMOVE_ASSOCIATED_LINK","RemoveAssociatedLink","SET_ACTIVE_SUPPORT_TAB","SetActiveSupportTab","CLEAR_VALIDATION_ERRORS","ClearValidationErrors","ToggleSwitch","_onChangeHandler","props","disabled","onClick","stopPropagation","_onMouseOverHandler","onMouseOverHandler","className","onMouseOver","checked","this","value","readOnly","defaultState","fetching","saving","activeTab","UsersTab","Users","users","userList","totalUsers","Array","editingUser","creatingUser","firstName","lastName","userName","preferredName","initialPassword","email","audiences","employeeId","title","department","reportsTo","region","country","preferredSMSPhone","roles","canManageSubmissions","subscribedToFlaggingNotifications","fetchedUser","azureB2CObjectId","providerId","providerName","firstLogin","tagIds","avatarColor","enabled","legacyDisabled","totalComments","totalReactions","preferredEmail","preferredSMSConsent","preferredLCID","invitingUser","invitedTime","deletingUser","externalUserList","invitingUserEmail","invitingUserValidation","invitedUsers","processingToggleEnableEmail","processingReinviteEmail","uploadingBatchInvite","batchUploadValidation","reinvitingPendingUsers","deletingPendingUsers","legacyFixComplete","editingLocalAccountPassword","actionHandler","state","action","user","trim","validateInvitingUserEmail","validationResponse","result","filter","pendingUserEmails","indexOf","newUserState","userId","password","newRoles","includes","roleName","role","push","consent","Message","ModelState","Email","actions","actionCreator","reducers","actionHandlerMethod","mapSocialProviderNameToDomainHint","toLowerCase","startsWith","msalInstance","store","_scopes","process","split","scope","_graphScopes","_knownSubDomains","_store","_msalInstance","notyOpen","login","requestConfig","baseRequest","_getBaseRedirectRequest","loginRedirect","extraQueryParameters","logout","signOutSuccess","currAccount","getCurrentAccount","endSessionRequest","account","postLogoutRedirectUri","getLogoutRedirectUri","logoutRedirect","invite","inviteToken","tenantName","authority","request","scopes","encodeURIComponent","resetSparrowPassword","token","resetPasswordToken","sid","idTokenClaims","tokenRequest","tokenQueryParameters","accountSelectPrompt","sub","username","_getBaseSilentRequest","acquireTokenSilent","accessTokenResponse","showRelogPopup","acquireTokenPopup","tokenResponse","redirectRequest","_getBaseAcquireTokenRedirectRequest","acquireTokenRedirect","getGraphAccessToken","currentAcc","getActiveAccount","userEmail","settings","currentUser","userIdp","silentTokenRequest","errorCode","errorAlert","onErrorTokenRequest","ssoRequest","loginHint","ssoSilent","accounts","getAllAccounts","length","setActiveAccount","initRedirectHandler","handler","handleRedirectPromise","redirectResponse","base","subdomain","window","location","host","_subdomainIsKnown","domain_hint","domainHint","stringify","originatedFrom","href","adpOrigin","origin","confirm","show","yesText","yesColor","yesIcon","noText","instance","msalConfig","auth","clientId","redirectUri","knownAuthorities","navigateToLoginRequestUrl","cache","cacheLocation","storeAuthStateInCookie","showNewCategoryTag","hideNewCategoryTag","showViewCategoryTag","hideViewCategoryTag","showEditCategoryTag","hideEditCategoryTag","addNewTagAction","toUpload","categoryTags","CreateCategoryTag","editTagAction","EditCategoryTag","getCategoryTags","GetCategoryTags","page","defaultCategoryTagPage","getDisabledCategoryTags","GetDisabledCategoryTags","getEnabledCategoryTags","GetEnabledCategoryTags","getUserCategoryTags","GetUserCategoryTags","tag","Id","Title","deleteCategoryTag","DeleteCategoryTag","deleteCategoryTags","categoryTag","disableCategoryTag","ChangeCategoryTagState","enableCategoryTag","getCategoryTagDownload","GetCategoryTagDownload","getCategoryTagDownloadFromAnalytics","toDownload","GetCategoryTagDownloadFromAnalytics","setTagToEdit","toEdit","setTagToView","loadCategoryTagAnalytics","GetCategoryTagAnalytics","downloadAllCategoryTags","DownloadAllCategoryTags","downloadCategoryTags","ids","DownloadCategoryTags","portalPages","reducer","userSettings","errorMessage","isFetching","isInitialLoad","isSaving","isUploading","shouldFetch","resources","lcidMappings","language","emailSubjectsResource","subjects","smsBodiesResource","bodies","pushContentsResource","contents","mappings","resource","surveys","surveyList","isDeleting","deletedSurveys","s","tenantId","adminLayoutReducer","DEFAULT_STATE","mainStyle","undefined","shouldDisplayNav","newStyle","headerStyle","shouldDisplay","userPortalLayoutReducer","defaultTagStats","groupName","isMandatory","subscriberCount","postCount","viewCount","PlatformAnalyticsReport","channelUsage","engagedUsers","mostViewedPost","mostViewedEvent","commentsAndReactions","postViewsByHour","surveyWithMostResponse","LAST_30_DAYS","THIS_MONTH","LAST_WEEK","LAST_MONTH","LAST_3_MONTHS","LAST_6_MONTHS","ALL_TIME","CUSTOM_RANGE","mobileAppBannerOpen","open","userAttributesSvg","magicIconWhiteSVG","getAudiences","audiencesApi","getAllAudiences","getAudienceDetails","GetAudienceDetails","GetAllAudiences","defaultPage","getDisabledAudiences","GetDisabledAudiences","getEnabledAudiences","GetEnabledAudiences","createAudience","audience","CreateAudience","deleteAudience","DeleteAudience","deleteAudiences","downloadUserData","getAudienceUsersCsv","disableAudience","DisableAudience","disableAudiences","enableAudience","EnableAudience","enableAudiences","saveAudience","SaveAudience","fetchUniqueUserCount","grabAll","GetUniqueUsers","ShareUrlEvents","TeamsEvents","SettingsTab","ReactionTab","IntranetLicenseTypes","MobileLicenseTypes","CollaborationLicenseTypes","CrisisLicenseTypes","ExternalPostSourceTypes","EMPTY_READABILITY_SETTINGS","tone","readability","personalism","sentiment","gender","DEFAULT_CONTENT_GUIDELINES","header","description","attachments","postStats","posts","userCounts","userCount","rangeStart","dateRounded","commentCounts","commentAndReactionCounts","commentAndReactionCount","platformStats","post","readStats","postReads","readViewStats","tagStats","topChannels","tags","topEvents","userTrends","toFetch","toSet","insights","DEFAULT_COLOR_OPTION","hexCode","rgb","r","g","b","DEFAULT_CONFIG","parentId","contentBandsGradientColor","contentBandsHeaderTextColor","ContentBandStatus","DEFAULT_CONTENT_BAND","contentType","ContentBandContentType","Post","layoutType","ContentBandLayoutType","Card","seeMoreEnabled","displayFullTitles","sortBy","SortStyle","publishDesc","contentCount","pinnedIds","lockToReadStatus","ReadStatus","Both","lockToTopicIds","lockToTypes","ignoreSubscriptions","autoPlayCarousel","publishedDateTimeUtc","createdById","createdDateTimeUtc","order","getDefaultContentBand","defaultLcid","headers","fetchContentBandsAsync","createAsyncThunk","includeContent","thunkApi","contentBandApi","getContentBands","Mobile","statuses","data","contentBandsSlice","SET_PRISTINE_BANDS","payload","contentBands","fetchPublishedBandsAsync","Published","SET_PUBLISHED_BANDS","saveContentBandsAsync","saveContentBands","SET_SUCCESS_MESSAGE","successMessage","fetchContentForBandAsync","SET_FETCH_IDX","getContentBandContent","band","newBand","EDIT_CONTENT_BAND","idx","values","publishContentBandsAsync","publishContentBands","fetchContentBandConfigAsync","getContentBandConfig","SET_CONFIG","SET_PRISTINE_CONFIG","saveContentBandConfigAsync","saveContentBandConfig","publishContentBandConfigAsync","publishContentBandConfig","reorderMap","cb","sortBands","createSlice","initialState","publishedContentBands","fetched","pristineContentBands","publishCount","fetchIdx","addFinished","reordered","isLoadingContentBandConfig","isLoadingContentBands","isLoadingContent","isLoadingPublishedContentBands","isPublishingContentBandConfig","isPublishingContentBands","isSavingContentBands","isSavingContentBandConfig","SET_CONTENT_BANDS","APPEND_DEFUALT_CONTENT_BAND","INSERT_DEFAULT_CONTENT_BAND","newBands","splice","sort","addIdx","INSERT_CONTENT_BAND","contentBand","index","DELETE_CONTENT_BAND","ADD_LANGUAGE","lang","key","REMOVE_LANGUAGE","lcid","withOutLang","EDIT_LANGUAGE","Object","keys","SET_HEADER_TEXT_COLOR","SET_GRADIENT_COLOR","SET_ADD_FINISHED","SET_REORDERED","pristineConfig","CLEAR_BANDS","extraReducers","builder","addCase","pending","fulfilled","rejected","ImageType","MediaType","FileUploadAction","SortGroupName","FilterGroupName","GetDocument","GetDocumentComplete","GET_DOCUMENT_GALLERY","GetDocumentGallery","GET_DOCUMENT_GALLERY_COMPLETE","GetDocumentGalleryComplete","GET_IMAGE","GetImage","GET_IMAGE_COMPLETE","GetImageComplete","GET_IMAGE_GALLERY","GET_IMAGE_GALLERY_COMPLETE","GetImageGalleryComplete","GET_VIDEO","GetVideo","GetVideoComplete","GET_VIDEOS_COMPLETE","GetVideosComplete","UPLOAD_IMAGE","UPLOAD_IMAGE_COMPLETE","UploadImageComplete","RequestBuilder","init","baseUrl","params","queryParams","body","baseURL","authToken","Authorization","urlBuilder","UrlBuilder","addPath","mapParams","addQueryParams","reqHeaders","Headers","method","mode","signal","abortSignal","hasOwnProperty","forEach","set","internal","credentials","getUrl","baseUri","path","Error","i","queryString","reduce","encodeURI","middleware","next","utils","getWebAppUrl","req","setBaseUrl","addParam","addAuthToken","build","fetch","handleNetworkRequest","DefaultHeadValues","openGraphTitle","openGraphDescription","openGraphUrl","openGraphImageUrl","openGraphVideo","head","ActivityTab","FlaggedItems","activity","DefaultConfigState","SyncFunctionsApiUrl","AnalyticsErrorMessage","FetchPostList","FetchSinglePost","FetchTagList","TagUpdated","LogEvents","FetchTenantConfig","SelectReaction","Search","FetchTagSettings","FetchUserTagSettings","FetchUserSettings","smsVerify","GetComments","CreateComment","UpdateComment","DeleteComment","UserCounts","CommentAndReactionCounts","PlatformStats","PostStats","ReadViewStats","TagStats","TopSurveys","TopEvents","UserTrends","totalUsersInAudiences","totalUsersSubscribedInTopics","downloadAllAnalyticsReportAsImage","FetchNotificationSettings","ExternalUsers","ClientSettings","TenantSettings","LocalUsers","InviteSparrowUsers","FetchDraftPosts","FetchDraftPost","SaveDraftPost","CreateNewDraftPost","DeleteDraftPost","LCIDMappings","FetchEmailResource","FetchSMSResource","FetchMobileResource","ConfigStoreUpdate","createAction","createReducer","locale","messages","langPref","documentDirectory","files","previousDocuments","nextDocuments","continuationToken","lastFetched","getTime","docIndex","findIndex","existsInLibrary","unshift","creatingNewPost","validationChecks","Validation","editor","isValid","editorState","postDefaults","EmptyDefaultPost","stringProperties","k","translatedContent","tc","field","changedSinceSaved","imageUrl","transforms","points","video","currentPostImage","postType","compliance","mandatory","public","changed","notificationsEnabled","commentingEnabled","reactingEnabled","mobileNotificationsEnabled","chatbotNotificationsEnabled","publishedPostList","draftPostList","expiredPostList","scheduledPostList","submissionPostList","allPostList","deleting","publishing","publishValidationErrors","errors","validationResult","postId","postTitle","newDraftPostList","p","publishConfirmation","shouldShowDialog","containsVideoContent","expectedPublishTime","publishedDraftId","submitting","unpublishing","postsFeed","concat","canLoadMore","postTypes","postStates","textToSearch","imageLibrary","chonkyFileData","imagesGalleryMap","asChonkyFileMap","fileData","filesToMoveIds","moveFilesForAppBar","filesToMove","x","isDir","selectable","openable","currDir","totalCount","folderChain","imageIndex","uploading","postView","savingReaction","savingComment","tips","loading","dismissed","idealWordCount","prevState","DefaultPostsState","documentReducer","editorReducer","postListReducer","postsFeedReducer","imageLibraryReducer","postViewReducer","tipsReducer","supportEditorReducer","adminLayout","snackbars","snackbarsSlice","emails","emailsSlice","homeScreenConfigs","homeScreensSlice","gallery","guidelines","guidelinesSlice","localization","messaging","profile","shortcuts","shortcutsSlice","globalLayout","globalLayoutSlice","userPortalLayout","getElementsByTagName","getAttribute","browserHistory","createBrowserHistory","basename","windowIfDefined","devToolsExtension","__REDUX_DEVTOOLS_EXTENSION__","history","middlewares","thunk","routerMiddleware","authenticatedRequestMiddleware","allReducers","combineReducers","router","connectRouter","buildRootReducer","createStore","compose","applyMiddleware","isDevEnvironment","DevTools","instrument","configureStore","LinkApi","_sparrowApi","isResetPasswordLink","ApiRequest","CreateAnonymousRequest","AuthInterceptor","handle","networkLayer","interceptors","use","GraphAuthInterceptor","RequestFormatInterceptor","regex","RegExp","match","RequestPlatformInterceptor","TenantAutoFillInterceptor","tenantRegex","SparrowApi","_authInterceptor","_formatInterceptor","_platformInterceptor","_tenantAutoFillInterceptor","axios","create","defaults","bind","CreateRequest","SyncFunctionsGraphApi","OktaAuthModule","oktaOrganizationName","_oktaScopes","_portalClientId","_oktaInstance","OktaAuth","GetOktaAuthOptions","tokenParams","responseType","getWithoutPrompt","tokens","getWithRedirect","issuer","OktaAuthInterceptor","tenantSettings","syncConfig","syncDetails","organizationId","portalClientId","SyncFunctionsOktaApi","ResourcesApi","TenantRequest","get","CognitiveServicesApi","generateContent","getSuggestions","translateReq","ContentBandsApi","bands","DynamicLinkApi","link","shortLink","HomeScreenConfigApi","platform","configs","EmailsApi","emailId","delete","sentTime","put","authInterceptor","graphAuthInterceptor","oktaAuthInterceptor","requestFormatInterceptor","requestPlatformInterceptor","tenantAutoFillInterceptor","sparrowApi","syncFunctionsGraphApi","syncFunctionsOktaApi","activityApi","ActivityApi","commentApi","CommentApi","insightsApi","InsightsApi","mediaApi","GetVideoUrl","GetImageUrl","postsApi","PostsApi","linkApi","eventsApi","EventsApi","draftEventsApi","getPublishedFromDraftId","settingsApi","SettingsApi","usersApi","UsersApi","AudiencesApi","syncFunctionsApi","_syncFunctionsGraphApi","_syncFunctionsOktaApi","searchForGroupByName","getUserGroupSuggestions","searchText","amount","skipToken","getOktaUserGroupSuggestions","startGroupSync","syncAction","syncType","SyncType","MicrosoftAD","groupIds","Okta","getUsersInGroup","manageAdUserSync","multitenancyApi","MultitenancyApi","tagsApi","TagsApi","supportApi","SupportApi","documentsApi","DocumentsApi","messagingApi","SendSMSBlast","smsBlast","MassSendConsent","UpdateNotificationSettings","newSettings","ApplyBlackoutPeriods","GetSMSStats","GetTeamsStats","GetMobileStats","GetEmailUserCsv","GetSMSUserCsv","GetTeamsUserCsv","GetMobileUserCsv","GetOutbox","outboxType","resourcesApi","draftPostsApi","DraftPostsApi","submissionsApi","SubmissionsApi","loggedEventsApi","sendFeatureUsageEvent","featureActionCode","Events","UserId","TenantId","Name","Platform","DEVICE_PLATFORM","WEB","Body","FeatureActionCode","toISOString","Time","toUTCString","sendPostAuthoringOpenedEvent","time","PostId","AuthoringUIVersion","sendPostAuthoringClosedEvent","append","keepalive","sendPostAuthoringClosedEventBeacon","navigator","sendBeacon","sendShortcutOpenedEvent","shortcutId","ShortcutId","reportsApi","ReportsApi","tenantManagementApi","CreateNewTenant","tenantCreationValues","cognitiveServicesApi","adminTinyTemplatesApi","getAllTinyTemplates","upsertTinyCategory","category","upsertTinyTemplate","template","deleteTinyTemplate","deleteTinyCategory","getTinyTemplate","ospreyApi","blobInfo","formData","FormData","filename","getFilesWithUrls","dynamicLinksApi","filesApi","getCustomTinyMceCss","getCustomPortalPagesCss","pageId","adminFilesApi","sharingApi","SharingApi","homeScreenConfigApi","emailsApi","shortcutsApi","getShortcutsFormat","ShortcutState","ENABLED","updateShortcutsFormat","newFormat","getShortcut","updateShortcut","shortcutUpdateModel","openInNewWindow","isEnabled","groupId","createNewShortcut","bulkUpdateShortcuts","shortcutIds","setIsEnabled","groupIdToMoveTo","bulkDeleteShortcuts","getShortcutGroups","bulkDeleteShortcutGroups","shortcutGroupids","updateShortcutGroupName","shortcutGroupId","newName","createNewShortcutGroup","getClientShortcutsList","setMainStyle","setHeaderStyle","setShouldDisplayNav","InvitePlatform","UserRole","AccountCreationTypes","defaultFilters","numOf","selectVals","userState","lastLogin","dateRange","equality","userActivity","GET_SURVEYS","GetSurveys","GET_SURVEYS_COMPLETE","GetSurveysComplete","GET_SURVEY","GetSurvey","GET_SURVEY_COMPLETE","GetSurveyComplete","DELETE_SURVEYS","DeleteSurveys","DELETE_SURVEYS_COMPLETE","DeleteSurveysComplete","SAVE_SURVEY","SaveSurvey","SAVE_SURVEY_COMPLETE","SaveSurveyComplete","CLEAR_SURVEY_LIST","ClearSurveyList","HomeScreensStateStatus","HomeScreenPlatform","HomeScreenType","HOME_SCREEN_TYPE_MAP","ContentBands","MyFeed","HOME_SCREEN_PLATFORM_MAP","Teams","DEFAULT_EMAILS_LIST_STATE","totalEmails","DEFAULT_EMAIL","sentBy","subject","EmailStatus","sendToAllUsers","fromSender","replyAddress","DEFAULT_EMAILS_STATE","draftEmailsList","scheduledEmailsList","Scheduled","sentEmailsList","Sent","originalEmail","changedSinceLastSaved","shouldDownloadRecipientsList","shouldSendTestEmails","testEmails","shouldOpenOneLastCheck","sentConfirmation","expectedSentTime","getDraftEmailList","getEmailList","SET_DRAFT_EMAIL_LIST","getScheduledEmailList","SET_SCHEDULED_EMAIL_LIST","getSentEmailList","SET_SENT_EMAIL_LIST","getEmailToEdit","getEmail","SET_EMAIL_EDITOR","createNewEmail","SET_REDIRECT_URL","redirectUrl","saveExistingEmail","SET_CHANGED_SINCE_LAST_SAVED","UPDATE_EMAIL_EDITOR","UPDATE_ORIGINAL_EMAIL_EDITOR","SET_SHOULD_DOWNLOAD_RECIPIENTS_LIST","shouldDownload","SET_SHOULD_SEND_TEST_EMAILS","shouldSend","SET_TEST_EMAILS","SET_SHOULD_OPEN_ONE_LAST_CHECK","shouldOpen","SET_SHOW_SENT_CONFIRMATION","addMatcher","isAnyOf","promise","resolved","isLoading","require","module","exports","xmlns","d","clipPath","fill","cx","cy","UploadAttachedFile","xhr","calculatePercentage","rej","setRequestHeader","responseText","onerror","onabort","addEventListener","loaded","total","send","XMLHttpRequest","initializeUserSettings","saveUserSettings","shouldDispatchUpdates","updatedUserSettings","SaveUserSettings","SettingsActions","EventsActions","PostsActions","sendSMSVerifyRequest","SendSMSVerify","LoadingCircle","size","style","ROOT_FOLDER_ID","mediaFiles","fileMap","fromEntries","currDirChildIds","Set","childrenIds","has","imageExtFromMimeType","mimeType","imageExt","filteredShortcutFormat","originalShortcutFormat","shortcutFeed","isLoadingOriginalShortcutFormat","isUpdating","scrollToRowId","handleError","isAxiosError","SET_ERR_MSG","handleSuccess","successMsg","SET_SUCCESS_MSG","getShortcutFormat","defaultShortcutsFilter","getOriginalShortcutFormat","createShortcut","SET_SCROLL_TO_ROW_ID","scrollToId","createShortcutGroup","shortcutGroupName","updateShortcutGroup","bulkDeleteShortcutsAndGroups","shortcutGroupIds","getShortcutsFeed","pendingUpdateMatcher","isPending","fulfilledUpdateMatcher","isFulfilled","rejectedUpdateMatcher","isRejected","pendingFetchMatcher","rejectedFetchMatcher","SyncLevel","RuleComparatorOptions","contains","equals","notContains","notEquals","equalToAny","fetchPostStats","reportFilter","uri","network","POST","fetchUserCountsByMonth","fetchCommentAndReactionCountsByMonth","fetchPlatformStats","fetchSurveyStats","fetchTopEvents","fetchUserTrends","uniqueUserReactionCommentOnPost","uniqueUserViewPostEvent","setToFetch","fetchDetailedPostStats","postStatsBaseUri","GET","readsRequest","fetchReadViewStats","fetchTopChannels","fetchTagStats","tagStatsBaseUri","detailsPromise","detailsRequest","fetchTagReadsAndPostReads","readsPromise","postsPromise","postsRequest","isLocalhost","Boolean","hostname","registerValidSW","swUrl","refreshing","serviceWorker","register","oncontrollerchange","setTimeout","reload","console","connect","IntlProvider","AdminPalette","PublicPalette","TinaTheme","createGlobalStyle","connector","ownProps","brand","clientSettings","theme","color","themeEnabled","withRouter","isAdminTheme","pathname","isPublicTheme","primary","createTheme","palette","background","default","main","secondary","info","breakpoints","xs","sm","md","lg","xl","typography","h1","fontSize","fontWeight","h2","h3","h4","h5","h6","caption","button","components","MuiLink","styleOverrides","root","MuiInputBase","backgroundColor","MuiSnackbar","position","MuiTableCell","borderBottom","MuiTableHead","MuiTableRow","ThemeProvider","children","appInsightsReactPlugin","ReactPlugin","ApplicationInsights","instrumentationKey","extensions","extensionConfig","identifier","loadAppInsights","UserRoleStrings","useStyles","makeStyles","createStyles","boxSizing","maxHeight","maxWidth","objectFit","padding","message","bottom","left","right","screenBase","backgroundImage","backgroundPosition","backgroundRepeat","backgroundSize","fontFamily","textAlign","AdminPortalSplashScreen","useState","display","setDisplay","timestamp","classes","useEffect","timer","clearTimeout","displaySplashScreen","alt","Fragment","useSignOut","isAuthenticated","useIsAuthenticated","inProgress","useMsal","isSigningOut","setIsSigningOut","signOut","InteractionStatus","None","Cookies","remove","SignOutListItem","signOutData","optionsMenuItemClassName","ListItemText","optionsMenuItemTextClassName","Avatar","nextProps","nextState","firstname","firstLetter","substr","lastletter","lastname","TenantLink","to","addTenantToLink","toString","pushToBrowserHistory","prevPath","target","inNewTab","rel","colors","generateColor","str","num","each","uuid","charCodeAt","USER_ROLE_DESCRIPTIONS","DEFAULT","AUTHOR","OWNER","USER","CONTRIBUTOR","getRole","getHierarchyRoles","hierarchyRoles","INTERNAL","ConditionalWrapper","condition","wrapper","alignItems","marginRight","textDecoration","avatar","justifyContent","lineHeight","marginTop","avatarName","accountConnector","linkToProfile","showRole","useIsMounted","MenuItemType","MenuItemLabel","isMounted","useRef","current","useCallback","MobileAppBanner","setMobileAppBannerOpen","userLayoutActions","dynamicLink","setDynamicLink","setFetching","useHistory","documentElement","scrollTop","getDynamicLink","AppBar","Toolbar","IconButton","sx","cookies","setWithOpts","getPrefixedKey","COMMON_COOKIE_KEYS","MOBILE_APP_BANNER_CLOSED","expires","Link","variant","TIME_UNITS","requiredLength","getPercentString","Math","round","truncateStringWithElipsis","source","slice","headerBackgroundColor","useElevatedHeader","marginLeft","zIndex","drawer","infoDivider","marginBottom","menuIcon","options","optionsMenu","optionsMenuItem","cursor","optionsMenuItemIcon","minWidth","optionsMenuItemText","toolbar","wordmark","updateHeader","updateToolbar","updateToolbarBtn","textTransform","backdrop","publicAccess","onClickMenu","displayName","wordMark","light","anchorEl","setAnchorEl","showUpdateAppBar","setShowUpdateAppBar","waitingForUpdate","setWaitingForUpdate","useTheme","isSmallAndSmaller","useMediaQuery","down","noSsr","getRegistration","registration","active","waiting","onupdatefound","installingWorker","installing","onstatechange","controller","checkForUpdate","Button","postMessage","endIcon","KeyboardArrowRight","Backdrop","containerStyle","elevation","disableGutters","Divider","flexItem","orientation","currentTarget","Popover","onClose","anchorOrigin","vertical","horizontal","transformOrigin","disablePadding","ListItemIcon","setTenantUserDataAndNav","multitenancy","SetTenantIdAction","getTenantData","getTenants","label","setupTenantUserData","defaultTenantId","tenantData","some","ele","cookieBanner","disclaimer","margin","showBanner","setShowBanner","OPT_IN","Drawer","anchor","paper","COOKIE_OPT_IN_EXPIRY_DAYS","tenantManagementUtils","LoadingSpinner","version","y","viewBox","Component","DownloadButton","setState","downloadName","FileDownloader","downloadBlob","startIcon","titleContainer","updateTitle","lastUpdated","footer","closeIconButton","instructions","downloadContainer","UpdateOptionsDialog","setLoading","updateOption","setUpdateOption","getSharePointPackage","spUpdateOption","getUpdates","date","Dialog","fullWidth","DialogTitle","DialogContent","lastModifiedUTC","moment","format","blobName","downloadLink","Axios","DialogActions","getHighestRole","MenuUtils","locationPathName","matchesCurrentUrl","myUrl","urlWithTenant","isChildSelected","childrenItems","childItem","subMenuMatchesCurrentUrl","subMenuItems","subItem","isLinkItemSelected","menuItem","menuItemUrl","RequireRole","userHighestRole","userHasRole","strictRole","renderEle","unauthorizedElement","UserRoleWrapper","userRole","useMenuStyles","expandableText","opacity","overflow","transition","listItem","borderLeftColor","borderLeftStyle","borderLeftWidth","listItemIcon","listItemText","whiteSpace","useAccordionStyles","accordion","borderTop","accordionDetails","accordionExpanded","minHeight","transform","accordionExpandIcon","accordionSummary","accordionSummaryContent","subList","AccordionWrapper","expandedMenuItem","setExpandedMenuItem","accordionClasses","menuClasses","subMenuItem","hide","setExpandedParentMenuItem","ListItemButton","disableRipple","expand","Accordion","square","expanded","onChange","SHORTCUTS","toggleExpand","AccordionSummary","expandIcon","expandIconWrapper","selected","AccordionDetails","dateOptions","MenuItem","onMenuItemClicked","hideIcons","icon","list","poweredBy","updateOptions","versionContainer","flexDirection","pipe","menuItems","portalPagesEnabled","eventsEnabled","documentsEnabled","audiencesEnabled","categoryTagsEnabled","homeScreenConfigEnabled","emailsManagementEnabled","shortcutsEnabled","items","DASHBOARD","DashboardOutlined","EMPTY","CONTENT_MANAGEMENT","PostAddOutlined","POSTS","EVENTS","SURVEYS","DOCUMENTS","TARGETTING_TOOLS","LocalOfferOutlined","AUDIENCES","TOPICS","CATEGORY_TAGS","MESSAGING_CENTER","SendOutlined","DIRECT_MESSAGING","EMAILS","NEWSLETTERS","PORTAL_PAGES","MenuBookOutlined","homeScreens","HOME_SCREENS","MenuBook","CHANNEL_LAYOUTS","processPortalPagesAndHomeScreens","MEDIA_GALLERY","PhotoLibraryOutlined","ACTIVITY_TOOLS","HistoryOutlined","PLATFORM_ANALYTICS","AssessmentOutlined","USER_PERMISSIONS","AccountCircleOutlined","TENANT_CONFIGURATIONS","SettingsOutlined","TENANT_MANAGEMENT","AdminPanelSettingsOutlined","SPARROW_SUPER_ADMIN","MANAGE_MY_CONTENT","Header","CalendarTodayOutlined","contributorOnlyMenu","COMAPANY_PORTAL","OpenInNewOutlined","showFeatures","mobileEventsEnabled","emailManagementEnabled","updateDialogOpen","setUpdateDialogOpen","query","isContributor","toggleUpdateDialogOpen","prev","showUpdateOptions","PaperProps","drawerPaperClassName","getDivider","Typography","useDrawerExpanded","cookieKey","useSmallScreenLogic","getDefaultExpandedState","savedExpandedSetting","drawerExpanded","setDrawerExpanded","toggleDrawerExpanded","newValue","flexShrink","drawerPaper","flexGrow","Layout","isFullEditScreen","ADMIN_DRAWER_EXPANDED","showBarAndMenu","AdminAppLayout","favicon","querySelector","withAITracking","RedirectingToUserPortal","navigation","drawerWidth","expandedDrawerWidth","SIGN_IN","navigationItems","HOME","navigationItem","childNavigationItem","FEED","shortcutsList","flatMap","sgts","buttonItemSelected","expandShortcutsList","PROFILE","ADMIN_PORTAL","MANAGE_MY_POSTS","MenuItems","isLinkSelected","isButtonSelected","ShortcutsFeedList","delayShowListItemsInMs","isListShowing","contentVisible","setContentVisible","dense","shortcutGroup","primaryTypographyProps","MAX_URL_DISPLAY_LENGTH","DEFAULT_DRAWER_BOX_SHADOW","boxShadow","borderRight","shortcutsDrawerPaper","currentDrawerWidth","overflowX","top","shortcutsDrawerBackdropRoot","clientName","USER_DRAWER_EXPANDED","setExpandShortcutsList","lastExpandedState","setLastExpandedState","useSelector","useDispatch","toggleShortcuts","ModalProps","BackdropProps","UserAppLayout","prevProps","InsufficientPermissions","defaultMessage","ClientRouteWrapper","getLCIDMappings","getClientSettings","getCurrentUser","getNavigation","getNotificationSettings","getUserTagSettings","settingsActions","resourceActions","portalPagesActions","TenantRouteWrapper","pathArr","getEmailResource","getSMSResource","getMobileResource","getTenantConfig","DashboardTile","linkTo","materialIconColor","materialIconName","actionText","AnalyticsErrorBanner","borderRadius","paddingTop","paddingLeft","verticalAlign","mssg","Dashboard","formatMessage","intl","bannerMessage","ViewCarouselOutlined","htmlColor","androidAppUrl","iosAppUrl","injectIntl","basePage","container","BasePage","Container","headerOptions","rightComponent","overflowY","MainContent","Paper","addPadding","addPadding10","addMarginTop","fullHeight","tabNavigation","tabItem","tabDottedItem","tabDottedLabel","tabOptions","Tabs","selectedTab","indicatorColor","textColor","ev","tabIndex","onSelectTab","tabs","tab","dotColor","TabContent","toolbarStyles","TabContentToolbar","toolBarStyles","snackbar","alert","ErrorSnackbar","Snackbar","autoHideDuration","Alert","severity","InfoHover","showPopover","setShowPopover","popoverRef","ref","onMouseEnter","onMouseLeave","pointerEvents","LoadingOverlay","styles","absolute","optionsWrapper","visibility","iconButton","MoreOptionsIconButton","buttonDivClassName","MoreOptionsItem","buttonStyle","hoverStyle","buttonId","disableTypography","textStyle","redirectTo","onDisableUser","onSelection","onEnableUser","accountCategory","onDeleteUser","onDownloadUserData","paging","paginationActions","spacing","callout","calloutArrow","Paging","rowsCookieName","ROWS_PER_PAGE_COOKIE_NAMES","defaultRowsPerPage","MIN_ROWS_PER_PAGE","rowsPerPage","getRowsPerPage","setRowsPerPage","rowName","alwaysShow","totalItems","onChangeRowsPerPage","rows","selectRowsPerPage","onChangePage","resetSelection","TablePagination","rowsPerPageOptions","component","ActionsComponent","count","onPageChange","aria-label","direction","ceil","max","TablePaginationActions","backIconButtonProps","nextIconButtonProps","labelDisplayedRows","from","numeral","selectLabel","displayedRows","AuthoringSearch","onClearFilters","canSearch","disableElevation","onApplyFilters","FilterContainer","filterCommands","filterSelection","Callout","arrowPosition","fullSize","mouseOver","setMouseOver","timerDone","popoverProps","anchorPosition","setOpen","setOpenProp","autoClose","autoCloseDuration","slotProps","onMouseOut","arrowStyle","contentClassName","calloutOpen","setCalloutOpen","TopicDropdown","tagSelected","availableTopics","currentTags","handleTagGroupClick","checkGroupSelected","onChangeTags","onHandleAllTags","tagGroup","Checkbox","edge","find","selectedTag","float","AccountTypes","ProfileFields","Roles","States","UserFilters","getFilterSelection","accountTypes","hasCustomDetails","authorTopics","availableTags","getAvailableTags","Chip","onDelete","onClearTextToSearch","deleteIcon","selectedState","onClearState","selectedRole","onClearRole","selectedAccountType","matchedAccountType","accountType","onClearAccountType","onClearProfileField","onClearTag","onChangeAccountType","onChangeFilters","setCanSearch","onChangeProfileField","hasCustom","onChangeRoles","onChangeState","onChangeTextToSearch","clearCanSearch","onKeyUp","keyCode","onUpdateTextToSearch","hasNoCurrentFilters","every","deselectTagGroup","selectTagGroup","newFilters","tagsToRemove","t","currentTag","tagGroups","deleted","loggedInAfter","TextField","placeholder","InputProps","startAdornment","showProfileFields","profileField","UsersView","_isMounted","defaultSortState","formatAccountType","formatActivity","formatActivityNumber","totalViews","totalReads","comments","reactions","activityNumber","formatDate","formatNameAndEmail","initials","formatRole","charAt","toUpperCase","formatStatus","getDefaultFilterValues","getFilter","tenantAttributes","getHeader","createSortableHeader","createHeader","getList","selectedUsers","rowCount","hasFiltersApplied","TableContainer","Table","TableHead","TableRow","TableCell","indeterminate","onSelectAllUsers","inputProps","hc","cell","align","generateSortableHeaderCell","TableBody","isUserSelected","labelId","hover","onViewProfile","aria-checked","onSelectUser","onClearAllUsers","lastLoginDate","getToolbar","getToolbarIcon","onDownloadUsersData","selectedUser","onEnableUsers","onDisableUsers","onDeleteUsers","fetchFilteredUsers","getUsers","updateGlobalUsers","setSort","updatedFilters","isPagedLoad","DeleteUser","hideNo","UpdateUser","userListItem","getTenantAttributes","headerCell","TableSortLabel","saveUser","UserPlatformStats","setPlatformStats","groupSimilarResponses","stats","legacyAndroidCount","platformName","readCount","legacyAppleCount","addOrUpdatePlatform","GetAppUsageStats","remap","reverse","bar","layout","axisBottom","axisLeft","tickSize","tickPadding","tickRotation","enableGridX","enableGridY","enableLabel","isInteractive","axis","domain","line","stroke","strokeWidth","UserLanguageStats","setData","GetPlatformPreferredLanguageStats","preferredLCIDNameEnglish","totalUsersWithPreferredLCID","enableArcLabels","enableArcLinkLabels","padAngle","activeOuterRadiusOffset","legends","justify","translateX","translateY","itemWidth","itemHeight","itemsSpacing","symbolSize","itemDirection","innerRadius","GetLabel","UserPlatformChart","accountProviders","setAccountProviders","GetUserProviderBreakdown","entries","entry","getProviderBreakdown","arcLinkLabelsColor","ActivityTimeOfDayStats","GetReadViewsByTimeOfDay","temp","convertedHour","timeZone","tick","hour","UserInsightsBlock","UserOverviewInsights","userStats","setUserStats","pendingInvites","setPendingInvites","GetUserOverviewStats","getStats","GetPendingInviteCount","numInvites","getPendingInvites","disabledUsers","engagedUsersLast30Days","externalAccounts","useUtcTimeZone","includeWeekDay","weekday","day","month","year","Intl","DateTimeFormat","isAllDayEvent","eventTimes","eventStartTime","SnackbarWrapper","restProps","styleProps","timeout","onCloseDrawer","defaultPagedFilter","invitedEmail","setInvitedUsers","setFilter","allFilters","setAllFilters","totalInvites","pageDetails","setPageDetails","setTotalUsers","autoCompleteLoading","setAutoCompleteLoading","autoCompleteOptions","setAutoCompleteOptions","alertMessage","setAlertMessage","alertOpen","setAlertOpen","alertSeverity","setAlertSeverity","loadDefaultUsers","GetPagedInvitedUsers","inviteTokenUsed","cleanupAndCloseDrawer","refreshInvited","applyFilter","newFilter","loadUsers","updateSearchText","newText","skipApi","newSuggestions","o","fetchSuggestions","toSearch","updateFilters","FetchEmailSuggestions","setNewAlert","paddingBottom","confirmationMessage","DeleteAllPendingUserInvite","exception","ResendAllInvites","clear","Autocomplete","noOptionsText","clearOnBlur","popupIcon","renderInput","clearInterval","handleTextChange","invitedAt","basicWithHours","ResendInvitedUser","handleInvite","DeletePendingUserInvite","handleDeleteInvite","localAccountsEnabled","aria-controls","aria-haspopup","aria-expanded","MenuListProps","redirectToUserCreation","openAddModal","handleClose","openInvitesDrawer","openUserActivities","lobbyEnabled","navigateToLobby","downloadAllUserData","UserCSVUploader","onFileInputChanged","dragging","parseCSV","acceptedFiles","onFileDropped","dataTransfer","isDragging","callback","preventDefault","renderUploadForm","draggingProps","onDrag","onDragStart","onDragEnd","onDragOver","onDragEnter","onDragLeave","onDrop","multiple","accept","htmlFor","UserInsightsBlockTiny","passwordRegex","emailRegex","removeNonDigits","validGuidRegex","checkValidTenantName","mentionCheck","invitedUserCount","sendBulkInvite","inviteBatchUsers","downloadSocialBulkCSV","getBulkInviteReportCSV","valid","setValid","invalidEmails","setInvalidEmails","duplicateEmails","setDuplicateEmails","verifyOpen","setVerifyOpen","sentOpen","setSentOpen","validNumber","setValidNumber","invalidNumber","setInvalidNumber","dupeNumber","setDupeNumber","validateEmail","String","exitDialog","hideCSVInvite","closeVerifyInvite","isOpen","reader","FileReader","rowOne","readAsText","downloadSampleCSV","showCSVInvite","showDrawer","Disclaimer","closable","HoverText","labelContainerClassName","labelClassName","inline","underline","popoverStaysOpenOnMouseover","paperStyle","isVisible","setIsVisible","ExtraChipsMessage","chipText","hoverText","defaultChipStyle","defaultEmptyChipStyle","fontStyle","ChipList","chipStyle","truncateAtIndex","showEmptyChip","emptyStyle","emptyLabel","setupClose","item","labelStyle","getDefaultChip","join","getExtraNames","CalloutWithSearch","setSearchText","calloutContainerStyle","autoFocus","highlight","endAdornment","performSearch","searchOnType","calloutFooterStyle","MultiSelectContent","selectedOptions","isParentSelected","parent","selectedIds","handleParentClick","itemsToRemove","newItems","deselectParent","itemsToAdd","selectParent","getChildItem","disableOptions","clickedItem","updatedItemList","opt","onClickItem","nestingAllowed","selectedItem","restricted","availableOptions","child","getParentItem","defaultButtonStyle","buttonClassName","buttonText","buttonVariant","MultiSelectCalloutWithSearch","defaultOptions","containerClassName","searchBarText","footerComponent","filteredOptions","setFilteredOptions","buttonCssStyle","resetItems","onToggleAll","itemsSelected","newSelection","getAllItems","matchesText","myText","textToCompare","newOptions","childMatchesText","anySelections","getCalloutFooter","MultiselectAndChipsWithSearch","searchPlaceholder","emptyChipText","SECTION_HEADER","SECTION_DESCRIPTION","SECTION_CLAUSE","TopicPermissionSection","topics","selectedTopics","setSelectedTopics","RoleSelector","formControlStyle","selectStyle","onSelectRole","FormControl","Select","MenuProps","specialCharacterRegex","inviteSparrowUser","inviteSparrowUsers","optionalFieldsOpen","setOptionalFieldsOpen","permissionsOpen","setPermissionsOpen","setFirstName","setLastName","setEmail","errorFirstName","setErrorFirstName","errorLastName","setErrorLastName","errorEmail","setErrorEmail","errorEmailMessage","setErrorEmailMessage","phoneNumber","setPhoneNumber","setTitle","setDepartment","setReportsTo","setCountry","setRegion","nickname","setNickname","errorPhoneNumber","setErrorPhoneNumber","roleSelected","setRoleSelected","isSubManager","setIsSubManager","errorPermissions","isUserValid","interval","CheckIfEmailAvailable","verifyAndSubmitUser","validToUpload","submissionManager","userRoles","number","countryCode","formattedNumber","toSend","inviteType","Sparrow","smsPhone","userDetails","permissionSetTopics","swapDialogs","setUploadFailed","updateSparrowUser","clearUserData","finishButton","closeDialog","paddingRight","helperText","newRole","Switch","toLocaleLowerCase","bulkClicked","showDialog","invalid","setInvalid","duplicate","setDuplicate","setFile","sending","setSending","reportLoading","setReportLoading","displayWarning","setDisplayWarning","confirmationOpen","setConfirmationOpen","resultsOpen","setResultsOpen","uploadedUsers","setUploadedUsers","expectedHeaders","hideSnackbar","GetIntermediateResultsBulk","GetIntermediateResultsCSV","setAttribute","click","BatchInviteSparrowLocalAccounts","newUsers","PickerLocalization","LocalizationProvider","dateAdapter","AdapterDateFns","UserActivitiesFilters","activityTypes","selectedEventName","getActivityDescription","onClearActivityType","onClearFromDate","onClearToDate","selectedActivityType","userActivityLogType","c","activityType","activityDescription","onToggleUserActivityType","onChangeFromDate","onChangeToDate","activityEvent","Grid","textField","openPickerIcon","UserActivityLogs","downloadActivityLog","isDownloading","downloadUserActivity","downloadProvided","downloadBulkSocialUserReport","downloadSocialUserReport","downloadBulkSparrowUserReport","GetBatchCSVForBatchId","getUserActivityLog","getuserActivity","activityLog","isInitialized","getActivityTypes","getuserActivityTypes","getAction","reference","getDefaultFilters","userIds","defaultUserId","displayContext","openOnLoad","showTutorial","setShowTutorial","currentSlide","setCurrentSlide","slides","slide","imageSrc","TUTORIAL_SLIDES","isFirstSet","USER_TUTORIAL_VISITED","UsersManagementPage","uploadFailed","sparrowFailed","showInvitedUsersDrawer","showInvitedUsers","closeInvitedUsersDrawer","showUserActivities","closeUserActivities","swapToCSVInvite","showInviteSocial","emailString","emailValid","hideInvitedUsersSent","showInvitedUsersSent","navigateToUserCreation","invitedUserName","invitedUserEmail","hideInviteSocial","swapToInviteConfirm","swapToUserInvites","showInviteLocalResult","processEmails","rawEmails","showInviteLocal","hideInviteLocal","hideLocalInviteResult","hideBulkInviteLocal","showLocalBulk","showBulkInviteLocal","localSwapToBulk","localCreating","swapAfterSingleCreation","validateAndSendEmails","emailsToCheck","flaggedEmails","badEmails","getUsersV1","closeAddModal","Insights","setActiveTab","closeReport","defaultSettings","maxColumns","ColumnWidthCalculator","columnWidthSettings","CalculateWidth","columns","guardAgainstBadWidths","modifier","undefineds","constant","col","smallestWidth","min","expectedColumnCount","colMap","ShallowEquals","objA","objB","Icon","defaultColor","defaultWidth","defaultHeight","defaultViewBox","shallowEquals","iconify","Icons","AddImage","Check","Close","Crop","DragHandle","Edit","VerticalOverflow","User","LineGraph","Graph","Cloud","CheckBox","CheckBoxChecked","Devices","Comment","Pageview","Info","RssFeed","Sort","AccessTime","Delete","Lock","TableView","columnWidthCalc","onRowClicked","makeRowClickSelect","onRowSelected","onRowClick","selectedRowKeys","onSelectionChange","multiselect","getSelectedRows","deselectAll","isRowSelected","renderRowHeadings","data-style","noCheckbox","renderCheckboxSpaceForHeader","renderHeader","renderRows","renderRow","column","headerRenderer","forPosts","sortable","sortByCol","dataKey","getColumnWidth","currentSort","dataRow","renderSelectableCheckbox","renderColumn","flexBasis","truncate","renderer","colKey","fixedWidth","cols","colName","ascending","lastSort","calcSettings","columnGridMax","forceUpdate","collapsed","PageToolBar","windowScrolledHandler","fixedHeight","fixedOptions","fixedAtHeight","toolBarFixed","pageYOffset","overflowButtonClicked","overflowMenuOpened","clickedAnywhereOutsideContextMenu","overflowMenuClicked","removeEventListener","callToAction","callToActionButton","rightSideButtons","labelCheck","defaultButtons","overflowButtons","refreshButton","SurveyListing","_tableView","tableData","survey","rowData","formatPublishTime","publishTime","formatExpiryTime","expiryTime","aggregatedResults","acc","onTableSelectionChanged","selectedItems","isPublished","now","getActionButtons","buttons","getDeleteButton","numSelected","deleteSurveys","getCallToActionButton","deselectAllSurveys","fromNow","getSurveys","SurveyManagementPage","registeredListeners","callbackListener","listeners","detail","l","InlineError","TextInput","textInput","multiLineTextInput","checkTextMaxLength","maxLength","isLanguageField","styleModifier","isFocused","onKeyDown","onBlur","onFocus","showRequiredErrorMessage","textValue","multiline","checkError","hasError","resizeMultiLineTextAreaToFitContent","touched","input","scrollHeight","isTitle","paddingTotal","parseInt","borderTotal","borderTopWidth","borderBottomWidth","totalHeight","Number","showError","isRequired","tooltip","autoComplete","textOverflow","isRequiredErrorMessage","registerFocus","DateTimePicker","forFiltering","timeFormat","inputError","isValidDate","breadcrumb","crumbs","separator","titleLink","backItem","breadcrumbOptions","BackItem","getButton","Breadcrumb","Box","handleLinkByParent","middleComponent","isFlex","SurveyEdit","onPublishTimeChanged","toDate","fieldChanged","onExpiryTimeChanged","removeAnswer","questionIndex","questions","pop","answerChanged","answerIndex","answerBody","questionBodyChanged","questionBody","titleChanged","authorChanged","author","fieldName","cancelEditing","save","surveyErrors","isBusy","updateMethod","published","updateExpiryTime","saveSurvey","publishDate","expiryDate","question","currentUserFullName","add","contentLoaded","surveyId","getSurvey","clearSurveyList","np","yesterday","subtract","isAfter","when","changedVal","answer","SurveyDetails","formattedDate","dateString","toLocaleString","getQuestionData","getLabels","makeMultiline","isYourAnswer","words","newLabel","selectedWords","totalCharactersInWords","word","userResponse","answerId","labels","datasets","borderWidth","stepSize","scales","xAxes","ticks","SystemMaxCommentLength","GeneralSettingsForm","maxReactionCount","NotificationWait","ts","propExists","flaggingSettings","isNaN","minimumNotificationWait","NaN","externalPostPurgeInDaysWait","externalPostPurgeInDays","flaggingNotificationWaitChanged","setFlaggingNotificationWait","hasMandatoryExpiryTime","mandatoryExpiryTime","handleExternalPostPurgeInDaysChange","setExternalPostPurgeInDays","handleMandatoryExpiryTimeChange","setMandatoryExpiryTime","handleCommentMaxLengthChange","setCommentMaxLength","handleReactionNameChange","setReactionName","handleSupportEmailChange","setSupportEmail","enableReaction","reactionId","reaction","setReactionEnabled","working","enabledReactions","disabledReactions","showingEnabledReactions","activeReactionTab","Enabled","reactionsEnabledClass","reactionsEnabled","commentsEnabledClass","commentsEnabled","setActiveReactionTab","Disabled","moveReaction","setReactionsEnabled","isReactingEnabledForNewPostsByDefault","setIsReactingEnabledForNewPostsByDefault","canContributorsToggleReactions","setCanContributorsToggleReactions","setCommentsEnabled","isCommentingEnabledForNewPostsByDefault","setIsCommentingEnabledForNewPostsByDefault","gifSelectionEnabledForComments","setGifSelectionEnabledForComments","commentModerationEnabled","setIsCommentModerationEnabled","canContributorsToggleComments","setCanContributorsToggleComments","commentMaxLength","totalUserCountForReporting","localAccountPrefix","externalPostPurgeEnabled","setExternalPostPurgeEnabled","manageTopicsAudiencesInAdmin","setManageTopicsAudiencesInAdmin","toggleMandatoryExpiryTime","supportEmail","bannerVisibility","showRestrictedBanner","setRestrictedBannerEnabled","lcids","setShowInvitedExternalUsers","setPostNotificationsEnabled","setSmsNotificationsEnabled","setEmailNotificationsEnabled","setEveryoneAudienceEnforcementEnabled","setResetLocalUserPassword","SpecialtyBanner","getIcon","data-name","rx","strokeMiterlimit","bannerType","hexCodeFromText","DEFAULT_THEME_COLOR","DEFAULT_BRAND_LIGHT_COLOR","DEFAULT_ACCENT_COLOR","DEFAULT_SPECIALTY_BANNER_COLORS","complianceChecked","breaking","featured","ThemeSettingsForm","handleNameChange","setTenantDisplayName","validatePrimaryColor","option","hexcode","isHexCodeValid","themeSettings","settingTheme","isPendingBrandColorValid","pendingBrandColor","accent","isPendingAccentColorValid","pendingAccentColor","brandLight","isPendingBrandLightColorValid","pendingBrandLightColor","setSpecialtyColorOption","newIsPendingColorOptionValid","isPendingSpecialtyOptionsValid","newPendingOptionColors","pendingSpecialtyOptionColors","handlePrimaryColorChanged","handleBrandColorChangedFromPicker","hex","handleAccentColorChangedFromPicker","handleBrandLightColorChangedFromPicker","handleSpecialtyColorChangedFromPicker","newIsPendingOptionsValid","handleRestricted","handlePublic","handleMandatory","handleCompliance","handleComplianceChecked","handleBreaking","handleFeatured","colorBlockClicked","newShowingSpecialtyColorPicker","showingSpecialtyOptionColorPicker","showingBrandColorPicker","showingAccentColorPicker","showingBrandLightColorPicker","resetColor","renderSpecialtyColorPicker","handleColorChange","disableAlpha","onChangeComplete","getMobileTitles","getSpecialtyTitles","defaultLCID","skinningEnabled","setThemeSettings","brandColor","accentColor","brandLightColor","specialtyColors","pendingMobileOptionColors","mobileThemeColors","tenantDisplayName","brandColorPicker","borderRightWidth","borderRightColor","hidden","specialtyPostColors","setDisplayName","setBannerColorOption","TranslateDialog","DialogContentText","onSendTranslateRequest","TranslateErrorMaxLengthDialog","LanguageSettingsForm","maxLangCount","maxAllowedLanguages","addLanguage","code","offeredLocales","cl","setLanguageSettings","removeLanguage","defaultIndicator","handleTranslatedTextChange","setTranslatedText","validateTextLength","languageFrom","handleTimeZoneChangeDropDown","setTimeZone","isFetchingTranslation","activeLanguage","getTranslatedLanguage","translatedResponse","checkTranslatedResponseKeys","showTranslateDialog","onHideTranslateDialog","onShowTranslateDialog","onHideTranslateMaxLengthErrorDialog","showTranslationMaxLengthErrorDialog","availableTimeZones","GetAvailableTimeZones","resp","selectedTimeZone","defaultValue","menuPlacement","menuPortalTarget","menuPortal","unselectable","setActiveLanguage","breakingPost","breakingBannerDescription","compliancePost","complianceBannerDescription","complianceText","compliedPost","compliedBannerDescription","featuredPost","featuredBannerDescription","mandatoryPost","mandatoryBannerDescription","publicPost","publicBannerDescription","publicBannerDescriptionShareTitle","restrictedContent","restrictedBannerDescription","getTextPlaceholder","isBannerText","getBannerTextDescription","currentMaxtextLength","checkForTextLengthError","activeLanguageLCID","FeatureControlsSettingsForm","setMobileEventsEnabled","setDocumentsEnabled","setShortcutsEnabled","setPortalPagesEnabled","postSmartContentEnabledForTenant","postSmartContentEnabledByTenant","setPostSmartContentEnabled","surveysEnabled","setSurveysEnabled","chatEnabled","setChatEnabled","mobilePublishingEnabled","setMobilePublishingEnabled","MultiSelect","isMulti","menuPosition","InlineWarning","TenantTagGroupsSelector","TopicsSelect","setTagStats","fetchingTagStats","setFetchingTagStats","isPublicPrivateTagMixed","setIsPublicPrivateTagMixed","setSelectedOptions","setOptions","setTags","groupOptions","setGroupOptions","tenantTagGroups","setValue","opts","v","hasPublicAndPrivateOptions","GetTagStats","isArray","flat","updateTagsInGroup","selectStyles","multiValue","border","multiValueLabel","TagsWarning","newValues","convertValuesToTags","formatOptionLabel","getSubscriberCountForOption","Modal","hideForNoty","titleLogo","isWorking","onCloseClick","showControls","isPrimary","workingTitle","getTranslatedContentField","langs","getTranslatedBody","getTranslatedTitle","getTranslatedDescription","getMentionsUsers","FetchMentionsUsers","updatePostsFeed","fetchDraftPost","draftPost","submitPost","SubmitPost","updateField","deleteDraftPosts","postList","DeleteDraftOnlyPost","fetchImages","forGallery","mediaFilter","cookiePageAmount","cookie","GALLERY","FetchImages","fetchImageByName","FetchImageByName","fetchFolderByName","FetchFolderByName","renameImage","newFileName","RenameImage","renameFolder","newFolderName","RenameFolder","fetchImage","deleteImagesFromLibrary","imageIds","DeleteBulkImages","deletedImageIds","publishPost","defaultLang","attemptedPost","PublishPost","publishSuccess","returnUrl","postInList","postInEditor","videoExists","videoInAttachments","attachedContent","f","hidePublishSuccessfulDialog","setPostFeedFilters","destarComment","commentId","DestarComment","starComment","StarComment","clearFetchPost","InfiniteScrollView","_container","_childrenContainer","handleScrollEvent","hasNext","getDistance","distanceThreshold","onThresholdCrossed","onContainerScroll","usesWindowScroll","renderLoadingBlock","loadingBlockRenderer","loadingBlockFallbackRenderer","bottomOfWindow","innerHeight","clientHeight","bottomOfPane","offsetHeight","onScroll","ImageSelector","videoRef","showVideo","previewImage","videoPreviewUrl","initVideoPlayer","crossOrigin","controls","preload","poster","secondsSinceLastFetch","imageList","selectedImageIds","imageSelected","imageDeselected","showPreviews","onPreview","showVideoIcons","loadMoreFallback","hasMoreImagesToFetch","videojs","self","player","ready","on","pause","currentTime","trigger","bigPlayButton","el_","sourceTypeOptions","ExternalPostSourceEditForm","setSource","attemptedToSave","setAttemptedToSave","selectedImage","setSelectedImage","showingImageSelector","setShowingImageSelector","editingExternalPostSource","defaultDraftImage","updatedSource","isSourceValid","sourceToValidate","defaultAuthorName","sourceType","isValidUrl","defaultAuthorEmail","isValidEmail","isValidTopics","checkUrl","RSS","defaultImageChanged","defaultImageId","getExternalResourceType","isUpdate","modalButtons","isDisabled","isClearable","MessagingCenterTabs","ExternalSourcesSettingsForm","getTagName","tagId","addNewSource","onCloseDialog","selectedKey","selectedSource","externalPostSources","addOrUpdateExternalPostSource","updatedExternalPostSource","call","updateExternalPostSource","addExternalPostSource","success","deleteExternalPostSource","deletedExternalPostSource","setExternalSourceEnabled","sourceId","setExternalPostSourceEnabled","getExternalResourceTypeName","currTag","lastChecked","InputField","inputType","setTimer","pristineText","term","setTerm","debouncedTerm","setDebouncedTerm","onChangeTerm","timerId","notificationSettings","toggleEmailChannel","EnableSelectedChannel","emailEvent","smsEvent","textVisible","smaller","toggle","eventsWithBlackout","applyBlackoutPeriodsTo","toggleBlackoutPeriod","ApplyBlackoutPeriod","descriptor","secondEvent","activated","InputFieldDouble","disabledText","doubleCheck","SettingsTextField","styled","borderColor","TextInputField","shareEvent","currValue","shareUrlSettings","shareUrlsConfig","updateShareToggle","SetToggleShareUrl","shareToggleEvent","postsShareUrlEvent","eventsShareUrlEvent","handleClick","CalloutHover","contentStyle","arrow","MessagingMainControls","startingNumPost","startingNumEvent","postsDaysSelected","eventsDaysSelected","handleSwitchUpdates","toggleEvent","urlShareEvent1","urlShareEvent2","teams","companyPortalUrl","companyPortalEventsUrl","showPopoverSP","showPopoverTeams","calloutMessage","checkTeamsOnMouseOver","checkSharePointOnMouseOver","handleShareNameTextFields","updateShareName","handleShareUrlTextFields","updateShareUrl","checkShareTeamsUrlTextFieldsNotEmpty","checkShareSPUrlTextFieldsNotEmpty","teamsEventsUrl","teamsUrl","toggleTeamsUrl","spEventsUrl","spUrl","toggleSpUrl","handleChangePostReminder","reminderPostsDaysSelected","updatePostsReminders","postReminderNum","handleChangeEventReminder","reminderEventsDaysSelected","updateEventsReminders","eventReminderNum","handleLinkPreferenceDropdown","linkPreference","updateLinkPreference","sanitizeInput","numberSavedPost","defaultPostReminder","numberSavedEvent","defaultEventReminder","blackoutEmailDaysSelected","blackoutSMSDaysSelected","blackoutTeamsDaysSelected","blackoutMobileDaysSelected","nameFromUrl","fromEmailAddress","substring","sender","fromEmailName","eventNum","postNum","propEvent","propPost","urlName","segments","fullEmailAddress","linkPreferenceCurrent","addressFromUrl","companyPortalPostsDefaultUrl","companyPortalEventsDefaultUrl","blackoutTimeframeOptions","linkPreferenceOptions","LightTooltip","withStyles","shadows","Tooltip","updateEmailName","pristine","updateEmailSender","defaultEmailBlackoutPeriod","updateEmailBlackout","valueAsNumber","defaultSMSBlackoutPeriod","updateSMSBlackout","defaultTeamsBlackoutPeriod","updateTeamsBlackout","defaultMobileBlackoutPeriod","updateMobileBlackout","NotificationEvents","MassSMS","massSMSAttempt","ConsentInviteSms","consentInviteSMSAttempt","dropdownIndicator","toggleCompanyPortalUrl","companyPortalUrlShareLinkName","spUrlShareLinkName","teamsUrlShareLinkName","pristineNotificationSettingsCopy","SetDefaultBlackoutForEmail","SetDefaultBlackoutForSMS","SetDefaultBlackoutForTeams","SetDefaultBlackoutForMobile","SetDefaultReminderForPosts","SetDefaultReminderForEvents","SetLinkPreference","SetEmailName","SetEmailSender","SetShareName","SetShareUrl","enableAllChannels","EnableAllChannels","setSelectedChannel","toggleNotificationEvent","teamsEvent","mobileEvent","handleOnClick","anyChannelChecked","blackoutApplied","allChannelsChecked","allSelected","setSelectedChannelsChecked","updateCheckboxes","smsStatus","emailStatus","teamsStatus","mobileStatus","toggleChannel","withHyperLink","eventOne","eventTwo","updateBothValues","andPrompt","eventOnePrompt","eventTwoPrompt","bothChecked","topChecked","botChecked","AuthoringSettings","toggleAuthoring","valueToChange","setOnPublish","onPublishName","toggleAll","emailOff","smsOff","teamsOff","mobileOff","setAllOnPublish","emailDisabled","emailOnPublish","smsDisabled","smsOnPublish","teamsDisabled","teamsOnPublish","mobileDisabled","mobileOnPublish","SetOnPublish","SetAllOnPublish","SingleTextAreaInput","removeLcid","newState","translatedBody","translatedSubject","selectedLCID","returnTranslatedContent","selectLanguageTab","selectLanguage","handleTextArea","toReturn","toMap","lcidToLanguage","lcidButtons","prompt","maxTextLength","MobileTextAreaInput","m_Item1","m_Item2","otherItem","log","clone","placeholderTop","placeholderBot","TextBubble","removable","removeFrom","displayList","TripleNotificationOverride","eventUppercase","eventToFix","subjectToEdit","bodyToEdit","contentToEdit","emailEventName","smsEventName","mobileEventName","emailSubjectUpdate","emailSubjects","toLoad","emailBubbles","pushContents","pushContentUpdate","mobileBubbles","smsBodyUpdate","smsBodies","smsBubbles","RegularNotificationPopout","itemDisplay","publishName","updateEmailSubject","updateSmsBody","updatePushContent","toggleDrawer","eventPrompt","activeSettingsTab","tabClicked","updateToggle","toChange","setEmailSubject","setSmsBody","setPushContent","SetEmailSubject","SetSMSBody","SetMobileContent","MobileNotificationPopout","eventToCheck","bubbles","ReminderNotificationPopout","defaultName","reminderName","notificationName","setIsOpen","updateSubject","CommentFlaggedEmail","MessagingPostControls","toggleWindow","windowName","flippedVal","postNotificationsEditingVisible","postCommentEditingVisible","postReminderEditingVisible","postMentionsEditingVisible","postCommentMentionsEditingVisible","commentFlaggedEditingVisible","postPublishedEmailBubbles","postPublishedMobileBubbles","commentCreatedMobileBubbles","PostPublishedEmail","PostPublishedSMS","PostPublishedTeams","PostPublishedMobile","PostReminderEmail","PostReminderSMS","PostReminderTeams","PostReminderMobile","PostSubmittedTeams","PostSubmittedEmail","PostMentionedTeams","PostMentionedMobile","PostCommentCreatedTeams","PostCommentCreatedMobile","UserMentionedEmail","UserMentionedTeams","UserMentionedMobile","CommentFlaggedTeams","MessagingEventControls","getTranslatedContent","eventNotificationsEditingVisible","eventRemindersEditingVisible","eventMentionEditingVisible","textSuggestions","eventPublishedSMSBubbles","EventPublishedEmail","EventPublishedSMS","EventPublishedTeams","EventPublishedMobile","EventReminderEmail","EventReminderSMS","EventReminderTeams","EventReminderMobile","EventSubmittedTeams","EventSubmittedEmail","EventMentionedTeams","EventMentionedMobile","EventRespondedEmail","EventUpdatedEmail","EventCancelledEmail","MessagingGeneralControls","setSMSBody","confirmationActive","profileActive","verifySMSActive","confirmationContent","profileContent","verifySMSContent","AccessGrantedEmail","UserProfileUpdatedEmail","verifyActive","VerifySMSPhone","suggestionsForNonSMS","MessagingCenterForm","Main","tabMapping","General","Event","usePrevious","InputCounter","maxCount","errorHelpText","errorClass","MagicIcon","SvgIcon","fillRule","SmartContentDropDown","smartContentButtonDisabled","promptType","onSmartContentGenerate","anchorRef","prevOpen","handleListKeyDown","focus","sortedMenuItems","Summarize","isAlternate","Popper","placement","disablePortal","TransitionProps","Grow","ClickAwayListener","onClickAway","MenuList","autoFocusItem","aria-labelledby","selectedPromptType","FilledInput","required","characterCount","showInputErrorOnMaxCount","labelOnly","controlled","refreshable","onUndo","setMagicButtonDisabled","inputContainerStyle","inputDivStyle","inputLabelStyle","errorHelperText","inputEndAdornmentText","inputDivContainerStyle","showIcons","extraIconButton","inputLabelIconContainerStyle","inputRef","iconsDivRef","keepFocusAfterUndo","inputLabelContainerStyle","setIsFocused","historyIdx","curr","newHistory","undoValue","newIndex","undoable","useUndoableState","internalValue","setInternalValue","prevValue","disableOrEnableMagicButton","effectiveNewValue","disableUnderline","ascSortAction","defineFileAction","group","customVisibility","Az","CustomVisibilityState","Active","Default","descSortAction","Za","newestSortAction","Newest","oldestSortAction","Oldest","toggleShowFoldersFirst","OptionIds","ShowFoldersFirst","cmp","viewAllImagesAction","AllImages","viewMyImagesAction","currentUserId","MyImages","openFileAction","hotkeys","requiresSelection","fileFilter","FileHelper","isOpenable","contextMenu","reduxDispatch","thunkRequestFileAction","ChonkyActions","OpenFiles","selectedFilesForAction","disabledOpenFileAction","renameFileAction","disabledRenameFileAction","moveFileAction","getReduxState","rawFileArray","selectRawFiles","selectionMap","selectSelectedFileIds","newRawFileArray","reduxActions","setRawFiles","selectAllFileAction","selectionTransform","fileIds","hiddenFileIds","fileId","clearSelectionFileAction","prevSelection","deleteSelectionAction","resetMoveFileStateAction","selctable","disabledCreateFolder","ChonkyIconName","folderCreate","defaultFileActions","EnableGridView","EnableListView","customFileActions","UploadIcon","createSupportItem","itemType","CreateNewItem","itemId","fetchSupportItem","saveSupportItem","deleteSupportItems","publishSupportItem","SupportItemTypes","training","itemTitle","uploadSupportingDocuments","UploadSupportingDocument","uploadDocuments","setUploadingDoc","updateAssociatedLinks","associatedLink","removeAssociatedLink","clearValidationErrors","Uploader","maxUploads","errorDisplayTimeout","uploadFiles","SetError","maxUploadable","setUploading","totalToUpload","totalUploaded","uploadStatus","fileProgress","val","promises","resetUploadStatus","ext","lastIndexOf","filenameContainsInvalidCharacters","documentType","faq","knownIssue","releaseNote","releasePackage","fileUnderAllowedFileSize","isDocumentFileType","uploadDocumentViaSupport","attachmentType","isImageType","uploadImageViaPost","uploadDocumentViaPost","completedAll","onAllComplete","aborted","onUploadProgress","percentCompleted","onUploadComplete","onUploadError","onUploadAborted","renderUploadingAborted","renderUploadingError","renderUploadingProgress","Infinity","uploaderMessage","onDocumentComplete","onSupportDocumentComplete","completed","invalidCharactersArray","invalidCharactersRegex","mbSize","assertFullfilled","assertObjectNotNullOrVoid","useDebounceValue","debounceValue","callbackFn","runFnFirst","timeoutInMs","runCallbackOnEmptyString","debVal","setDebVal","isFirstRun","setIsFirstRun","callbackIsRun","setCallbackIsRun","timeoutId","HintType","useFileActions","selectedFiles","currSortGroupName","currFilterGroupName","searchValue","disableActions","CreateFolder","defaultShowFoldersFirst","getSortFileActions","moveFiles","mr","moveDest","moveSrc","onMove","ConfirmDialog","confirmLabel","denyLabel","optionLabel","checkboxLabel","confirmButtonProps","optionButtonProps","denyButtonProps","dialogMaxWidth","onConfirm","onDeny","onOption","onCheckboxChange","Stack","gap","alignSelf","FormControlLabel","control","InvalidFilesDialog","invalidFiles","maxUploadMbSize","maxUploadNumber","hasValidFilesToUpload","formatFileWithFileSize","units","fileSize","unitIndex","toFixed","invalidFile","DuplicateFilesDialog","duplicateFiles","dirName","getImageDuplicateDiv","imageTitle","dialogTitle","newFile","duplicateFile","successAlert","SuccessSnackbar","closeOnClickAway","ClickAwayListenerProps","BaseComponentOverlay","fullScreen","DragDropOverlay","maxNumUploads","UploadingOverlay","aborting","setAborting","numCurrentlyUploaded","totalNumToUpload","allowCancel","onUploadCancel","disableFocusRipple","autoCapitalize","showLoadingOverlay","showDragDropOverlay","fullScreenDragNDrop","allowUploadCancel","CreateNewFolderDialog","disableFolderCreation","onFolderNameChange","errorMsg","maxInputCount","RenameMediaDialog","disableRename","openRenameDialog","fileToRename","renameValue","onRenameChange","showRenameError","DeleteMediaDialog","showDeleteFilesDialog","filesToDelete","numImagesToDelete","numFoldersToDelete","getDeleteDialogText","PostActions","uploadFolder","UploadFolder","deleteImages","deleteBulkFolders","folderIds","DeleteBulkFolders","getBulkFolderAndImageCount","GetBulkFolderAndImageCount","showFolderError","setFolderError","folderNameChecked","setFolderNameChecked","newFolderValueDebounce","currDirId","existingFolder","useNewFolderDebounceValue","setRenameError","renameChecked","setRenameChecked","renameValueDebounce","existingFile","useRenameDebounceValue","setShowDeleteFilesDialog","setNumImagesToDelete","setNumFoldersToDelete","resetFolderCreationStates","onCreateFolderDialogClose","limitFileNameLen","originalFileName","resetRenameStates","clearExternalFileToRename","onRenameDialogClose","resetDeleteFilesStates","onDeleteFinished","onDeleteDialogClose","onDeleteStarted","folders","folderAndImageCounts","imageCount","getAndSetFolderAndImageCount","createFolder","openCreateFolderDialog","renameFile","deleteFolders","allSettled","setSuccessMessage","onCurrentFolderChange","deleteSelection","onNextFrame","requestAnimationFrame","ListHeaderDiv","showKeywordsHeader","runFn","attachSearchMatchClassNames","searchTerm","isGridView","insertHighlightClassToMatchingNodeText","node","nodeType","Node","TEXT_NODE","textContent","before","createTextNode","after","span","classList","parentNode","insertBefore","removeChild","ELEMENT_NODE","childNodes","buildSearchTagDiv","matchingWords","searchTagDivCustomClassName","newDivElement","imgIconElement","appendChild","tagsSpanElement","innerText","querySelectorAll","innerHTML","imageElementWithTitle","matchingKeywordItem","keywords","keyword","matchingKeywords","getElementsByClassName","anyKeywordMatches","imageElementListTitleDiv","imageElementListTagDiv","newDiv","addCustomSelectedFilesStylingDivs","div","parentElement","ind","gridImageDiv","listImageDiv","fileSelectedDiv","maxNumItemsPerPage","boundaryCount","showFirstButton","showLastButton","onPaginationPageChange","newPageNumber","DEFAULT_MEDIA_GALLERY_ROWS_PER_PAGE","SearchTextField","onTextValueChange","onClearSearchText","InputAdornment","hiddenLabel","ProfileActions","currentFolderId","setSelectedFiles","isGridViewValueDebounce","showMediaGalleryGridView","isGridViewDebounce","useGridViewDebounce","searchResultsFetched","searchValueDebounce","fileMapKeys","currentFolder","thumbnailUrl","customFolderChain","useFolderChain","attachDeleteClassNamesOnNextFrame","grandParentElement","attachDeleteClassNames","handleFileAction","onSingleSelect","onMultiSelect","setIsGridView","onFilterChange","setOpenCreateFolderDialog","showFoldersFirstToggle","setOpenRenameDialog","setFileToRename","setFilesToDelete","verifyMediaForMove","setIsInnerDragNDrop","setShowMoveFilesAppBar","singleClickFileSelect","onSingleClickSelect","targetFile","fileToOpen","existingFiles","MoveFiles","destination","ChangeSelection","selection","StartDragNDrop","EndDragNDrop","MouseClickFile","clickType","OpenFileContextMenu","useFileActionHandler","setMoveFilesForAppBar","fileActions","toggleOn","toggleOnElement","toggleOffElement","toggleParentDiv","toggleGrandParentDiv","imgDivElement","changeChonkyCheckboxIcon","onFileAction","clearSelectionOnOutsideClick","disableDefaultFileActions","doubleClickDelay","fileBrowserRef","defaultFileViewActionId","iconComponent","ChonkyIconFA","showSearchTextField","showLoading","setPageNumber","muiJSSClassNameGenerator","createGenerateClassName","seed","GalleryVFSBrowser","memo","setErrorMessage","setPageAmount","runFetchOnEmptySearch","setRunFetchOnEmptySearch","uploadedImageIds","setShowDragDropOverlay","setDeleting","isInnerDragNDrop","dragEventValueDebounce","dragEventDebounce","useDragEventDebounce","setCurrentFolderId","setCurrSortGroupName","setCurrFilterGroupName","setToggleShowFoldersFirst","newPageAmount","sortType","filterType","showFoldersFirst","onErrorMessage","onSuccessMessage","fetchImageByNameAsFileData","fetchFolderByNameAsFileData","deleteFolderByName","getUniqueFolderName","getUniqueFileName","moveMedia","deleteImageByName","onUploadedImages","clearExternalFilesToUpload","setInvalidFiles","showInvalidFilesConfirmDialog","setShowInvalidFilesConfirmDialog","verifiedFileData","setVerifiedFileData","duplicateFileData","setDuplicateFileData","setTotalToUpload","setTotalUploaded","abortController","AbortController","setUploadStatus","duplicateFilesDirName","setDuplicateFilesDirName","verifiedFiles","setVerifiedFiles","setDuplicateFiles","consolidatedDuplicateFiles","setConsolidatedDuplicateFiles","shouldUploadFiles","setShouldUploadFiles","onInvalidFilesDialogConfirm","setOnInvalidFilesDialogConfirm","showDuplicateFilesConfirmDialog","setShowDuplicateFilesConfirmDialog","applyActionToAllDuplicates","setApplyActionToAllDuplicates","allVerifiedFileData","Replace","Rename","resetAllFilesUploadState","uploadFile","onXhrUploadProgress","onXhrUploadComplete","onXhrUploadError","onXhrUploadAborted","uploadVerifiedFile","verifiedFile","renamedFile","File","verifiedFilesList","completedUpload","successful","uploadedImages","popLastDuplicateFile","remainingDupFiles","remainingDupFileData","hideDuplicateDialogAndUploadFiles","verifyUploadFiles","fileList","invalidFilesList","duplicateFilesList","afile","existingImage","duplicateImage","New","consolidatedDuplicateFilesList","verifiedFileDataObj","duplicateFileDataList","media","existingFileData","fileDataToMove","Move","onDuplicateDialogAction","newVerifiedFiles","dupFile","allVerifiedFiles","newVerifiedFileData","dupFileData","fileToReplace","fileDataToReplace","useFileUploadFunctions","useSearchValueDebounce","skipFetchOnRender","onDragStartDelay","persist","externalFilesToUpload","externalFileToRename","StylesProvider","generateClassName","injectFirst","abort","requestFileAction","deleteFolder","folderId","DeleteFolder","DeleteImageByName","GetUniqueFileName","folderName","DeleteFolderByName","GetUniqueFolderName","movePayload","MoveMedia","chonkyCustomDataToAttachedFile","UploadMediaButton","onFileUpload","ImageGalleryDialog","MAX_SELECTABLE_IMAGES","onChonkySelectedImages","runApplyAfter","multiSelect","existingImageIds","selectedImages","matchingIds","imagesWithoutAnyMatchingIds","onApply","renderSelectedFilesStyles","imageToSelect","onUseImageLink","isLink","isLinkDialog","getSelectableImages","getSelectedImages","imageLink","onChangeImageLink","selectableImages","filesToUpload","allowLink","IntenseEmphasis","onChangeColor","onSelectColor","dividers","useTinyMceAuthoringLogic","inlineImageDialogOpen","setInlineImageDialogOpen","intenseEmphasisDialogOpen","setIntenseEmphasisDialogOpen","editorRef","onHideInlineImageDialog","onHideIntenseEmphasisDialog","onChangeInlineImage","insertContent","onApplyInlineImage","onShowInlineImageDialog","onShowIntenseEmphasisDialog","onApplyIntenseEmphasis","formatter","apply","onChangeIntenseEmphasis","grabMentionUsers","galleryActions","editorOptions","activeLcid","fetchingAnalyses","customCss","smartContentSuggestion","showSCDropdownButton","onFullscreen","onShowSmartContentInsert","clearSmartContentSuggestion","generateAndOpenSmartContent","personalizationTokens","livePreview","enableEmbeddedMedia","enablePageEmbed","initOptions","editorMaxWidth","DocumentGallerySearch","setText","SortOptions","modifiedDesc","publishAsc","titleAsc","titleDesc","onUpdateText","aria-disabled","sortStyle","onChangeSort","ManagementEmptyResults","heightToUse","hasFilters","searchType","hidePaging","DocumentGallery","MAX_SELECTABLE_FILES","getSelectableFiles","fileAttachments","onGetDocumentGalleryPage","onChangeText","inputText","getSelectedFiles","textToUse","sortToUse","onSelectDocument","select","selectedFile","selectableFiles","onSetUploading","onUpload","documentGallery","Tab","isSelectedIndex","isSelected","DEFAULT_NO_ATTACHMENTS_MSG","FileAttachments","getEmptyAttachmentText","_getTitle","_getItem","fileAttachment","itemCloseIcon","wordBreak","onRemoveFileAttachment","onApplyFileAttachmentChanges","onHideDocumentGallery","showDocumentGallery","onShowDocumentGallery","footNoteStyle","buttonLabel","v2","Collapse","in","isGreyPaper","onRemove","removeLabel","FileAttachmentDisplay","getItem","DownloadFile","getFittingName","parseAnchors","updatedHTML","html","anchors","hash","anchorIndex","locationHref","ContentGuidelinePreviewBody","guidelineAttachments","attachedFiles","setAttachedFiles","filesMissingUrl","filesWithoutUrls","updatedFiles","filesWithUrls","fetchNewUrls","validFiles","isAuthoring","dangerouslySetInnerHTML","__html","ContentSettingsTabs","Transition","Slide","GuidelineHint","TransitionComponent","hintType","autoHideContentGuidelines","hideContentGuidelines","autoHide","setAutoHide","openGuidelineHint","setOpenGuidelineHint","handleDialogClose","GUIDELINE_PREVIEWED","contentGuidelineHint","autoHideOption","showPreview","ContentGuidelines","setShowPreview","onChangeAttachments","alignContent","isGuidelineEmpty","newHeader","useIsFirstRender","isFirst","useReadabilitySettings","isFirstRender","selections","setSelections","isPristine","setIsPristine","OPTS_IDX","SETTINGS_IDX","getReadabilityOptions","getReadabilitySettings","newOpts","newSelections","resetToDefault","useContentGuidelines","isEmpty","original","fetchContentGuidelines","unwrap","fetchGuidelines","newGuidelines","guidelineState","SET_GUIDELINES","ReadabilitySettings","internalAverages","enableDefaults","enableInternalAverages","onChangeLocal","settingKey","renderSetting","isDefault","isInternalAverage","ReadabilitySettingsForm","readabilityOptions","readabilitySettings","defaultReadabilitySettings","onChangeReadabilitySettings","postAverages","setPostAverages","GetTenantPostAverages","useTenantPostAverages","averageToneLabel","averageSentimentLabel","averagePersonalismLabel","averageReadabilityLabel","getPostAveragesProps","PostSorting","resetting","isSmartContentEnabled","changePristine","changePristineState","completeSaveSettings","completeResetSettings","Guidelines","resetReadabilitySettings","isReadabilityPristine","contentGuidelines","onChangeContentGuidelines","resetContentGuidelines","isGuidelinePristine","saveReadabilitySettings","SaveContentSettings","getContentGuidelinesTab","Readability","getTabContent","getTenantSettings","saveTenantSettings","resetTenantSettingsToPristine","modifyURL","SettingsPage","propsSaving","HASH_TAB_MAPPING","general","Theme","Language","featureControls","Features","externalSources","External","newsletter","Newsletter","Messaging","contentSettings","ContentSettings","setActiveSettingsTab","setStartingTab","scrollTo","onSave","tabId","tabIdAsString","Description","MoreOptionsButton","divStyle","EditOptions","SmartRules","defaultRule","comparator","getRuleSelection","rule","appear","rules","onRemoveRule","displayEmpty","onChangeRuleKey","tenantAttribute","onChangeRuleComparator","equalToAnyRuleEnabled","onChangeRuleValue","onAddRule","onChangeRules","onChangeRule","currentRule","ruleApplicability","onChangeRuleApplicability","CSVUploader","downloadSample","NumberStat","CSVValidation","downloadBulkReport","validationResults","validEmailCount","invalidEmailCount","onReplaceCSVFile","GroupList","includedGroups","onRemoveGroup","SearchUserGroups","isSearching","setIsSearching","setResults","showCallout","setShowCallout","onSearch","userSuggestions","isIncluded","onAddGroup","SearchUsers","includedUsers","onRemoveUser","onAddUser","UserList","SearchInvites","includedInvites","inviteId","loadOptions","InviteList","FETCH_AMOUNT","StandardRules","goToSyncedGroups","goToUsersAndPreferences","onChangeTab","audienceId","addGroupToAudience","onChangeGroups","addUserToAudience","onChangeUsers","totalIndividualUsers","onAddInvite","addInviteToAudience","onChangeInvites","totalIndividualInvites","onDownloadSample","onParseCSV","isValidatingEmails","validateRow","onChangeEmails","onValidateEmails","removeGroupToAudience","removeUserToAudience","onRemoveInvite","removeInviteFromAudience","onSearchGroups","cleanedInput","getAudienceUserGroupSuggestion","maxResults","onSearchUsers","getAudienceUserSuggestion","onSearchInvites","getAudienceInviteSuggestion","validateEmails","downloadResults","userAmountFetched","userGroupsEnabled","amountFetched","ADGroupSyncEnabled","everyoneAudienceEnabled","getBulkImportResults","TotalUsers","Type","audienceType","AudienceCreation","getDefaultAudience","groups","invites","setAudience","audienceDetails","onChangeDescription","draftAudience","onChangeEnabled","onChangeTitle","onChangeType","onDeleteAudience","checkAndUpdateRules","onSaveAudience","onCreateAudience","audienceCopy","splitValues","valueCollection","scroll","MoreAudienceOptions","onEditAudience","onDisableAudience","onEnableAudience","AudienceTypes","AudienceFilters","audienceTypes","selectedType","onClearAudienceType","onChangeAudienceType","AudienceList","formatAudienceType","formatUserCount","formatState","getAudienceWarning","maxAudiences","setWarningClosed","onSelectAllAudiences","getListItem","totalAudiences","isAudienceSelected","onSelectAudience","onClearAllAudiences","internalUsers","socialUsers","sparrowUsers","onEnableAudiences","onDisableAudiences","onDeleteAudiences","fetchPage","showEditor","hasRefreshed","warningOpen","NewAudience","loadingChecks","allTab","AudienceListing","associatedCategoryTags","associatedDocuments","associatedNewsletters","associatedTopics","topic","associatedInvites","createNewAudience","selectedAudience","showAudienceCreation","getAssociatedCategoryTags","getAssociatedDocuments","getAssociatedNewsletters","getAssociatedTopics","getAssociatedInvites","associations","totalAssociations","noColor","hasDeleted","blockingAudiences","blockingAudienceDetails","blockingAudienceNames","blockingNamesDisclaimer","getAudienceNameString","searchCategoryTag","searchDocument","searchNewsletter","searchTopic","names","userData","editAudience","isLoadingAudience","fetchLists","fetchAll","fetchDisabled","fetchEnabled","fetchTenantAttributes","getTabLabel","onCloseAudienceCreation","newAudienceDisabled","maxAllowedAudiences","canEdit","equalToAnySmartAudienceRuleEnabled","UserGroupPreivewModal","handleModalCloseClick","closeModal","EveryoneSuggestionsManager","fetchGroupSuggestions","groupSearchText","lastPage","cachedGroupSuggestions","groupSuggestions","prevGroupSearchText","groupAmountFetched","clearDictionary","showGroupPreview","audienceSuggestions","userSearchText","prevUserSearchText","currentGroup","currentAudience","referenceId","syncStatus","showBackButton","showNextButton","handleSearchAction","canManageEveryoneAudience","suggestions","memberCount","addToupdatedAudience","currentList","ul","addToCurrentGroup","handleNextPage","groupType","groupToUpdate","updateAudience","DeleteReplaceModal","handleInputChange","replaceSelection","audienceList","deletingAudience","deleteAndReplace","defaultStyles","outline","element","usingNewReports","waitingOnRequest","offsetWidth","EveryoneAudienceManager","_waitingForAdSyncCompletion","_allAzureADGroupName","closeSyncUserModal","setSyncAllAdUsers","syncAllAdUsers","showUserSyncModal","mobileSyncChanged","openSyncUserModal","handleSyncUsers","handleEnforcementChange","enforcementChanged","edited","everyoneAudienceEnforcementEnabled","handleSelectMobileSyncType","setMobileSyncNumberSelected","handleSelectSyncLevel","setSyncLevel","handleMobileSyncChange","setMobileSyncEnabled","mobileSyncConfig","mobileSyncEnabled","updateAudienceName","updateAudienceDescription","groupToAdd","syncStatusPerGroup","lastSyncCompletedTime","syncStatusesToBeUpdated","addToAudience","indexToRemove","modifiedSyncStatusesToBeUpdated","newSyncStatusPerGroup","previousSyncStatus","pristineSync","sync","isUserGroupsEdited","isEdited","removeFromAudience","groupToRemove","everyoneEnforcementWarningMsg","updatedSyncStatus","updatedArray","groupIndex","pristineAudience","warning","updatedAudienceList","isNameEmpty","fetchUsersInGroups","usersPerGroup","fetchSyncedUserGroups","getEveryoneAudience","getIncludedEveryoneGroups","groupList","ReferenceId","allAdGroupId","fetchSyncStatusForGroups","fetchEveryoneAudienceGroups","getEveryoneAudienceGroups","onFirstMount","getGroupSyncStatus","syncStatuses","statusesToUpdate","UpdateTenantSettings","syncGroups","saveGroupAndTenantSettings","deleteId","replaceId","deleteAndReplaceAudience","showReplaceDeleteModal","downloadEveryoneUserList","getEveryoneGroupUsersCsv","resync","confirmResyncDialogOpen","waitingForResyncCompletion","startAllResync","resyncSnackbarMsg","resyncErrorSnackbarMsg","getResyncConfirm","defaultEnforcementState","defaultSyncOptions","waitingForAdSyncCompletion","syncLevel","provided","menu","GetMobileFieldOptions","preferredMobileField","GetPreferredMobileField","essentialsSyncFields","GetEssentialsSyncFields","basicsSyncFields","GetBasicsSyncFields","syncOptions","hoverDescription","resyncBtnDisabled","saveBtnDisabled","userGroupEdited","syncOptionsIndex","userAdSyncEnabled","allAdSyncStatus","checkIfGroupToBeRemoved","getSyncStatus","graphMobileFieldSource","oktaMobileFieldSource","groupToBeRemoved","getClientConfig","GetActivityLog","GetActivityLogComplete","GetActivityLogCSV","GetActivityLogCSVComplete","GetRecipientsCSV","GetRecipientsCSVComplete","GetConfig","GetConfigComplete","GetEventComplete","GetDailyNewsletterInsights","GetDailyNewsletterInsightsComplete","GetTotalNewsletterInsights","GetTotalNewsletterInsightsComplete","GetWeeklyNewsletterInsights","GetWeeklyNewsletterInsightsComplete","GetNewsletterDetails","GetNewsletterDetailsComplete","GetNewsletterTags","GetNewsletterTagsComplete","GetNewsletters","GetNewslettersComplete","GetDisabledNewsletters","GetDisabledNewslettersComplete","GetDraftNewsletters","GetDraftNewslettersComplete","GetTemplates","GetTemplatesComplete","GetThemes","GetThemesComplete","SetThemeDefault","SetThemeDefaultComplete","DeleteTheme","DeleteThemeComplete","SaveTheme","SaveThemeComplete","SaveThemeImages","SaveThemeImagesComplete","GetThemeImage","GetThemeImageComplete","DeleteThemeImage","DeleteThemeImageComplete","GetNewsletterPreview","GetNewsletterPreviewComplete","GetTemplateHtml","GetTemplateHtmlComplete","GetTemplateImage","GetTemplateImageComplete","GetEnabledNewsletters","GetEnabledNewslettersComplete","GetPastIssues","GetPastIssuesComplete","GetPastIssue","GetPastIssueComplete","GetFutureIssueDetails","GetFutureIssueDetailsComplete","GetPost","GetPostComplete","GetIssueImage","GetIssueImageComplete","UploadIssueImage","UploadIssueImageComplete","UploadHeaderFooterIssueImage","UploadHeaderFooterIssueImageComplete","DeleteIssueImage","DeleteIssueImageComplete","SaveNewsletter","SaveNewsletterComplete","GetNewsletterImage","GetNewsletterImageComplete","UploadNewsletterImage","UploadNewsletterImageComplete","UploadNewsletterHeaderFooterImage","UploadNewsletterHeaderFooterImageComplete","DeleteNewsletterImage","DeleteNewsletterImageComplete","ResetIssue","ResetIssueComplete","ResetIssues","ResetIssuesComplete","SaveConfig","SaveConfigComplete","SaveIssue","SaveIssueComplete","SearchEvents","SearchEventsComplete","SearchPosts","SearchPostsComplete","SendTestEmail","SendTestEmailComplete","SkipIssue","SkipIssueComplete","UnskipIssue","UnskipIssueComplete","CloneNewsletter","CloneNewsletterComplete","DeleteNewsletter","DeleteNewsletterComplete","DisableNewsletter","DisableNewsletterComplete","EnableNewsletter","EnableNewsletterComplete","getActivityLog","newsletters","getActivityLogCSV","getRecipientsCSV","newsletterId","getConfig","getTotalNewsletterInsights","getNewsletterDetails","getNewsletterTags","getAllNewsletters","GetNewslettersPaged","getDisabledNewsletters","getDraftNewsletters","getEnabledNewsletters","getTemplates","templates","getThemes","themes","saveTheme","themeToSave","saveThemeImages","themeId","headerImage","footerImage","getThemeImage","imageType","getNewsletterPreview","templateId","deleteThemeImage","setThemeDefault","isCustom","deleteTheme","getTemplateHtml","getTemplateImage","getPastIssues","getPastIssue","issueDate","getPost","clientPosts","deleteNewsletter","UpdateNewsletterStatus","deleteNewsletters","disableNewsletter","disableNewsletters","enableNewsletter","enableNewsletters","saveNewsletter","cloneNewsletter","getNewsletterImage","uploadNewsletterImage","responseString","errResponse","uploadNewsletterHeaderFooterImage","deleteNewsletterImage","resetIssue","localDateAsString","ResetFutureIssue","resetIssues","localDateAsStrings","saveConfig","saveIssue","issue","SaveFutureIssue","searchEvents","feed","searchPosts","FetchPostsFeed","sendTestEmail","additionalAddresses","getFutureIssueDetails","issueDateLocal","details","getIssueImage","uploadIssueImage","uploadIssueHeaderFooterImage","UploadIssueHeaderFooterImage","deleteIssueImage","skipIssue","UpdateFutureIssueStatus","unskipIssue","senderName","senderEmail","GetNewslettersUsingAlias","n","translateNewsletter","toTranslate","targetLcid","inputLcid","GetNewsletterTranslation","emailActivityEvents","toEmailActivityEventName","daysOfWeek","recurrenceWeeks","EmailActivityLogFilters","newsletterTags","issueTags","eventNames","onClearEventName","newsletterIds","first","onClearNewsletter","issueIds","issueId","onClearIssue","eventDateFrom","onClearEventDateFrom","eventDateTo","onClearEventDateTo","onToggleEventName","onToggleNewsletter","selectedNewsletterId","onToggleIssue","selectedIssueId","onChangeEventDateFrom","onChangeEventDateTo","emailActivityEvent","EmailActivityLog","eventTime","userFullName","newsletterTitle","defaultIssueId","NewsletterSender","addressToDelete","onlyItem","onLocked","buttonRef","currentlyInUse","modelErrors","onSaveAddresses","onCheckAssociatedNewsletters","listSectionStyles","emailSearchStyles","setTextToSearch","addresses","localeCompare","setAddresses","filteredAddresses","setFilteredAddresses","newSenderName","setNewSenderName","newSenderEmailPrefix","setNewSenderEmailPrefix","showDeleteDialog","setShowDeleteDialog","setAddressToDelete","addressFilterFunc","validateSenderDetails","newSender","last","endCharacter","updateAddressesWithNewAddress","newAddresses","onCloseDeleteDialog","FromEmailName","FromEmailAddress","filteredAddrs","address","setAndPrepareForDelete","addressesWithoutDeleted","LinkPreferences","AdminPortal","SharePoint","GlobalSettings","getContent","availableLinkPreferences","LinkPreference","RadioGroup","onChangePreferredChannel","Radio","FormHelperText","flex","isEqual","currentConfig","newConfig","originalName","copy","dialogOpen","MoreOptions","onShowActivityLog","onShowGlobalSettings","onShowTemplateThemes","onCreateCopy","onNewsletterChanged","NewsletterFilters","lastSentFrom","lastSentTo","onClearSentTime","nextQueuedFrom","nextQueuedTo","onClearQueuedTime","modifiedFrom","modifiedTo","onClearModifiedTime","onChangeSentFrom","onChangeSentTo","onChangeQueuedFrom","onChangeQueuedTo","onChangeModifiedFrom","onChangeModifiedTo","currentTab","ChipLabels","chips","chip","emptyText","NewsletterList","formatPublishedTime","formatTitle","descValue","ascValue","clickable","stateDesc","stateAsc","startDesc","startAsc","modifiedAsc","viewsDesc","viewsAsc","onSelectAllNewsletters","onClickHeader","sortMethod","ArrowUpward","ArrowDownward","isNewsletterSelected","onSelectNewsletter","onCheckNewsletter","lastIssueSentOn","nextIssueSendOn","editedTime","numberSubscribed","numberUnsubscribed","allEnabled","allDisabled","onClearAllNewsletters","deleteSelectedNewsletters","idsToDelete","componentTabs","NewsletterListing","fetches","fetchDrafts","firstFetchIndex","firstFetch","allIsFetching","enabledIsFetching","draftIsFetching","draft","disabledIsFetching","changeCount","audiencesActions","CopyNewsletterDialog","onCopyNewsletter","copyingNewsletter","newTitle","defaultTheme","canSeeKebab","setCanSeeKebab","dateToDisplay","lastModifiedOnUTC","nameToDisplay","lastModifiedByDisplayName","emailBackground","secondaryBackground","primaryBackground","secondaryText","primaryText","linkText","ThemeModal","loadThemes","sortedThemes","mappedThemes","filteredThemes","componentDidMount","updateThemes","updateNonFiltered","themeToRemove","newThemes","setDefaultTheme","setDefault","setIndexOpen","setFlip","newFiltered","onKeyPress","resetSearch","totalOpen","themeData","senderAddressCheck","backButtonLabel","backButtonProps","setChangeCount","showActivityLog","setShowActivityLog","showGlobalSettings","setShowGlobalSettings","showThemeModal","setShowThemeModal","setNewsletters","copyNewsletter","setCopyNewsletter","setIsLoading","showAssociatedNewslettersDialog","setShowAssociateNewslettersDialog","setAssociatedNewsletters","associatedSender","setAssociatedSender","setDialogOpen","confirmOpen","setConfirmOpen","orderBy","newsletterDigest","senderDetails","openConfirm","closeConfirm","handleCloseThemeModal","newNewsletterId","grid","up","gridItem","Columns","heading","slim","leftComponent","MainContentWithFooter","footerHeight","mainContent","headerContent","footerContent","TitleSection","onChangeNewsletter","onNewsletterChange","highlightFields","ProgressBar","audienceFrequencySectionIsComplete","templateSectionIsComplete","titleSectionIsComplete","composeSectionIsComplete","percentComplete","progressBarText","ProgressList","onTemplateSectionClicked","onTitleSectionClicked","onComposeClicked","onAudienceFrequencySectionClicked","ProgressSection","ColorOption","colorSelected","colorText","setColorText","previousColor","setPreviousColor","handleClickOutside","setVisible","useOutsideAlerter","currentColor","isColorPickerVisible","changeText","borderTopColor","borderBottomColor","borderStyle","outlineColor","pickerContainerStyle","setColor","OneColumnNewsletterPreview","linkTexts","TwoColumnNewsletterPreview","ThemeDisplay","selectedTheme","toSave","newsletterTheme","updateNewsletterWithTheme","TemplateThemeSearchAndSelect","setFilteredThemes","standardTemplateNames","getBase64","readAsDataURL","colorLocations","headerType","footerType","TemplateWithPopup","setFirstTime","selectedTemplate","loadThemePreview","swapTab","toSelect","onSelectTemplate","setTemplateDialogOpen","templateSelectionDialogOpen","setTemplateDialogClosed","themeHeaderImageIsCustomized","setLoadImage","themeFooterImageIsCustomized","updateSavedTheme","customImageLoading","getCustomPreview","renderStandardTemplatesAndThemes","oneColumnThemeable","twoColumnThemeable","loadingPreviewTemplateId","openInNewTab","loadingPreviewLink","onDownloadTemplateHtml","onDownloadTemplateImage","w","write","outerHTML","renderCustomTemplateList","customTemplates","emailTemplateId","onShowPreviewImage","templateAsUri","onClosePreviewImage","showPreviewImageName","toggleEmailBackgroundVisible","emailBackgroundVisible","togglePrimaryBackgroundVisible","primaryBackgroundVisible","togglePrimaryTextVisible","primaryTextVisible","toggleSecondaryBackgroundVisible","secondaryBackgroundVisible","toggleSecondaryTextVisible","secondaryTextVisible","toggleLinkTextVisible","linkTextVisible","changeNewsletterColor","firstTime","imageHoverClass","selectedTemplateIsCustom","hasCustomTemplates","oneColumnSelected","twoColumnSelected","currentTheme","themeToBeEdited","TemplateSection","Chips","chipClassName","hideAll","EditAudiences","setAudiences","buttonProps","availableAudiences","hasSelectedAudience","selectMenuProps","AudienceAndFrequencySettings","_today","shouldDisableDate","serverNewsletter","firstIssueDateTime","recurrenceType","dailyRecurrenceOn","getDay","monthlyRecurrenceDay","getDate","monthlyRecurrenceWeek","getFullYear","getMonth","onChangeAllowUnsubscribe","allowUnsubscribe","onChangeAudiences","onChangeMonthlyRecurrenceDay","onChangeDailyRecurrenceDay","onChangeMonthlyRecurrenceWeek","OnFrequencyChange","frequency","onChangeIssueDate","updatedDate","onChangeIssueTime","times","onSelectSender","singleOption","senders","showFirstIssueDateTime","onSearchSenders","flexWrap","FormGroup","FirstIssueDateTime","step","DailyRecurrenceOn","renderValue","dayOfWeek","CheckBoxOutlineBlank","MonthlyRecurrenceWeek","weekOption","MonthlyRecurrenceDay","tagList","EditTags","customTopics","setCustomTopics","setTagList","tagsList","tagSettings","tagGroupChecked","tagToFilter","tagToFind","ContentTypeAndTopicsSettings","onChangeCustomTopics","onChangeEventsToIncludeDays","eventsToIncludeDaysWindow","maxEventsToInclude","onChangeMaxEventsToInclude","onChangePostsToIncludeDays","postsToIncludeDaysWindow","onChangeMaxPostsToInclude","maxPostsToInclude","OnTopicsChange","topicOption","OnEventsToInclude","eventsToInclude","OnPostsToInclude","postsToInclude","onDeleteCustomTopic","topicId","onIncludePostsChange","includeUnreadPosts","onIncludeEventsChange","includeUpcomingEvents","isNewsletterAdhoc","postSortingOptions","postSortingCurrentValue","sortPostsAscending","OldestFirst","NewestFirst","CustomTopics","MaxPostsToInclude","PostsToIncludeDaysWindow","sortingValueToSet","MaxEventsToInclude","EventsToIncludeDaysWindow","SettingsSection","NewsletterPreview","uniqueUsers","updateUniqueRecipients","getUniqueUsers","topicsUsed","publishNewsletter","preheader","SendTestEmailDialog","onSend","selectedIssueDate","onSuccess","isSending","SubjectAndPreHeader","OnPreheaderChange","currentContent","currentLcid","onSubjectChange","EmailSubject","EmailPreheader","UploaderWithLoad","setImage","setError","onImageLoad","naturalHeight","imageHeight","naturalWidth","imageWidth","clearImage","onClearImage","HeaderAndFooter","adminLayoutActions","emailTemplate","isLoadingFooterImage","isLoadingHeaderImage","headerRef","bodyRef","footerRef","onBodyChange","bodyText","onFooterChange","emailTemplateFooterText","headerImageHeight","headerImageWidth","max_height","min_height","menubar","enableInlineImages","emailTemplateHeaderText","isFullscreen","footerImageHeight","footerImageWidth","TranslateContentConfirmation","setSelectedValue","currentSelectLanguage","onCancel","currentLanguagesWithText","useTranslatedContent","showTranslationDialog","setShowTranslationDialog","setRemoveLanguage","onConfirmRemoveLanguage","lcidToRemove","onRemoveLanguage","newTranslations","translations","onChangeTranslatedContent","removeTranslation","onRemoveTranslation","translationHasContent","onSelectTranslation","onSelectLanguage","DEFAULT_TRANSLATABLE_CONTENT","onShowTranslationDialog","onCloseTranslationDialog","onConfirmDialog","inputLanguage","onTranslate","CalloutMultiselect","selectedValues","activeValue","onAddItem","onRemoveItem","onSelectItem","isActive","getActions","LanguageBar","languages","selectedLanguages","anyAvailableTranslationsCheck","onAddLanguage","onOpen","isSmallScreen","toLocaleUpperCase","CONFIRM_REPLACE_TRANSLATION","NewsletterLanguageBar","checkIfAnyTranslatableContent","setCheckIfAnyTranslatableContent","translatableLanguagesWithText","setTranslatableLanguagesWithText","newsletterContent","defaultContent","DEFAULT_TRANSLATABLE_NEWSLETTER_CONTENT","translate","outputLanguage","availableLanguages","getNewsletterTranslation","translation","autoTranslateText","currentAvailableTranslations","languagesWithText","allAddedLanguages","nextLanguage","matchingLang","setLanguageTranslationAvailability","useLanguages","setAvailableLanguages","setSelectedLanguages","setActiveLcid","loadAvailableLanguages","availableForTranslation","translateAs","visible","currentMapping","newSelected","available","deepCopy","stringified","PreviewType","useDefaultLocale","getTagSettings","getNewNewsletter","emailPreheader","emailSubject","setHighlightTitleFields","setIsSaving","saveHeaderFooterImage","setChangedSinceSaved","setServerNewsletter","futureIssues","sentIssueTags","setModelErrors","newNewsletter","setNewsletter","firstError","isTemplateSectionInError","setTemplateSection","setAudienceFrequencySection","setNewsletterToState","isChanged","isTitleSectionComplete","isTemplateSectionComplete","isFrequencySectionComplete","isComposeSectionComplete","setSelectedTemplate","setSelectedTheme","setProgressCheck","isComplete","newsletterToSet","setFooterImage","setHasFooterImageChanged","setFooterImageBase64","setHeaderImage","setHasHeaderImageChanged","setHeaderImageBase64","handleThemeDialogClose","setSaveTemplateOpen","setThemeName","handleUpdateOrSaveClose","postWarningRedirect","setPreSaveWarningOpen","setAlreadySeenWarning","showUnsavedChangesDialogPriorTo","setShowUnsavedChangesDialogPriorTo","highlightTitleFields","highlightSubjectAndHeader","setHighlightSubjectAndHeader","highlightSenderDetails","setHighlightSenderDetails","showNewsletterPreview","setShowNewsletterPreview","showSendTestEmailDialog","setShowSendTestEmailDialog","setIsDownloading","setIsLoadingHeaderImage","setIsLoadingFooterImage","themeHadHeaderOnLoad","setThemeHadHeaderOnLoad","themeHadFooterOnLoad","setThemeHadFooterOnLoad","headerImageBase64","footerImageBase64","saveTemplateOpen","templateXClicked","setTemplateXClicked","preSaveWarningOpen","alreadySeenWarning","hasHeaderImageChanged","hasFooterImageChanged","setSelectedTab","themeName","themeError","setThemeError","originalAddresses","setOriginalAddresses","savedTheme","setSavedTheme","setTemplates","setThemes","setPostWarningRedirect","progressCheck","fetchAndSetTemplate","templateToSet","fetchAndSetNewsletter","fetchAndSetTheme","themeToSet","themeToApply","fetchNewsletterDetails","fetchedNewsletter","idToCheck","emailTemplateHeaderImageIsCustomized","emailTemplateFooterImageIsCustomized","templateResult","firstTemplate","selectedTemplateToSet","validDefaultState","newsletterToUpdate","colorsToSet","selectedThemeToSet","returnTemplateOptions","returnContentOptions","returnSettingsOptions","publishClicked","colorsToCheck","backupTheme","saveAsDraftClicked","EmailTemplateHeaderText","EmailTemplateId","allSubjectsValid","validateThemeName","checkValidThemeDetails","checkColorsValid","saveNewTheme","currentState","createdBy","createdByDisplayName","createdOnUTC","lastModifiedBy","updatedTheme","headerImageEncoded","footerImageEncoded","updateTheme","themeToUpdate","toReplaceIndex","themeCopy","toCheck","hexEmailBackground","hexPrimaryBackground","hexPrimaryText","hexSecondaryBackground","hexSecondaryText","hexLinkText","uploadImageModel","defaultText","newsletterCopy","filledOutImages","defaultThemeSelected","currentStatus","currentlyCustomTemplate","Hidden","mdDown","getCommands","newsletterToPublish","isSuccess","aria-describedby","nextAction","EditThemePage","loadImages","imagesLoading","onChangeImage","hasBeenChanged","hasBeenEdited","invalidState","saveThemeAndUpdate","deleteHeader","deleteFooter","currentTitle","themeClone","getNewTheme","newTheme","toggleColorVisible","backToManageNewsletters","showTemplateSection","showAudienceFrequencySection","showContentSection","themeFromUrl","clonedTheme","formattedSavedOn","formattedModifiedOn","wordWrap","getTemmplateHtml","DashboardActions","actionsAnchorEl","setActionsAnchorEl","reportsAnchorEl","setReportsAnchorEl","onCloseActions","onCloseReports","onViewEmailActivity","onDownloadRecipientReport","onEdit","onDisable","onEnable","onSendTestEmail","ShowMoreSection","showMore","setShowMore","wrapperRef","Details","defaultSenderName","setDefaultSenderName","defaultSenderEmail","setDefaultSenderEmail","HeaderFooter","onSetImage","onChangeFooterText","newFooter","newContent","onChangeBodyText","newBody","emailTemplateIsCustom","IssueDetails","earliestOverrideDateTime","latestOverrideDateTime","onChangeEmailPreheader","onChangeEmailSubject","overriddenIssueDateTime","sendDateTime","issueFromServer","issueModelErrors","OverriddenIssueDateTime","languageBar","onPin","bannerColor","PinnedContent","getContentSelection","pin","onRemovePin","onChangeContentType","onPinPost","usersRoles","onPinEvent","onRemoveCurrentSelection","getPins","featuredContent","feature","convertToPin","pins","onAddContent","isAdding","currentSelection","currentFeature","currentPin","onChangeIssue","newIssue","setIssue","setIssueFromServer","isLoadingIssue","setIsLoadingIssue","setIssueModelErrors","loadHeaderAndFooterImage","issueDetails","isAddingNewIssue","futureDate","isMissingTranslatedContent","makeupTranslatedContent","newFutureIssue","issueType","isCustomized","onAddFutureIssue","editingIssueDateLocal","disableEnforceFocus","onCloseIssue","updatedIssue","onResetIssue","validContent","allLanguagesHaveRequiredContent","onSaveHeaderFooterImage","onIssueChanged","FutureIssues","onNewsletterUpdated","onSkipIssue","onSaving","onUnskipIssue","onResetIssues","issueDatesLocal","futureIssue","ThreeDots","WindowResizeListener","_resizeDebounceToken","_resizeDebounceTimeout","handleTransitionEnd","handleWindowResize","d3","scaleBand","selectAll","scaleLinear","scaleOrdinal","range","schemeCategory10","GroupedBarChart","update","el","X","Y","Z","xDomain","uniq","maxY","yDomain","zDomain","boundingRect","getBoundingClientRect","xScale","xzScale","bandwidth","yScale","zScale","xAxis","tickSizeOuter","yAxis","tickFormat","svg","attr","enter","showOnHover","assign","PlaceholderWidget","ChartSwatchComponent","swatches","sentSwatch","deliveredSwatch","uniqueOpensSwatch","clicksSwatch","DailyEmailEventsWidget","_chart","_chartElement","getChartState","sent","Day","Processed","Dropped","delivered","Delivered","opened","UniqueOpened","clicked","UniqueClicked","labelBars","destroy","WeeklyEmailEventsWidget","WeekStarting","InsightsInfoHover","NewsletterInsightsTab","isLoadingDailyStats","totalStatsTimeFrame","graphMode","totalStatsAllTime","weeklyStats","totalStatsEightWeeks","Bounced","Clicked","Deferred","Opened","Unsubscribed","SpamReported","UniqueBounced","UniqueDeferred","UniqueDelivered","UniqueDropped","UniqueProcessed","UniqueSpamReported","UniqueUnsubscribed","eightWeeksAgo","stat","currentWeek","finalWeek","isBefore","isSame","dailyStats","currentDay","finalDay","totalStats","totalCopiesSent","ButtonGroup","viewDailyStats","pie","arc","PieChart","diameter","h","outerRadius","innerDiameter","TextHover","IssuePublishingStatsWidget","_colors","receipt","sentReceipt","countOfSkippedWithNoContent","countOfUnsubscribers","countOfInvalidEmailAddresses","chartState","sum","maximumSignificantDigits","HorizontalBarChart","labelWidth","containerHeight","barHeight","containerWidth","classNames","textLength","getComputedTextLength","rect","valueLabel","IssueEmailEventsWidget","AnalyticsNumber","subtitle","hoverLabel","analytic","onIssueLoaded","goBackToDashboard","getPastIssueAsync","formatNumeralLabel","getAnalyticNumberProps","unsubscribes","dropped","bounced","spamReported","invalidAddresses","copiesSent","copiesPublished","copiesSentLabel","displayStats","countOfCopiesSent","issueProcessedOnDateTime","PastIssues","pastIssues","onGetPastIssues","pastIssue","colSpan","onViewInsightsClicked","NewsletterDashboardPage","_componentUnmounted","getDashboardMenu","showIssuesTab","showOverallInsightsTab","lastSentIssueDateLocal","showIssueInsightsTab","getDetails","onGetNewsletterDetails","isLoadingPastIssues","viewInsightsClicked","getOverallInsights","getIssueInsights","currentIssueId","onDeleteNewsletter","redirectBackToNewsletters","onDisableNewsletter","onEnableNewsletter","getRecipientsCsv","onEditNewsletter","isLoadingNewsletter","sendTestEmailForIssue","backToNewsletterDashboard","breadcrumbItems","showEmailActivityLog","availableIssues","DownloadReports","DEFAULT_FILE_TYPE","GetPostsCSV","replaceAll","AuthoringFilter","searchTextPlaceholder","additionalFilters","availablePostTypes","PostFilters","getFilterByState","availableContentStates","availablePostState","onChangePostStates","selectedPostState","contentStateLabels","newerThan","olderThan","selectedPostType","onClearPostType","PostListingPageId","ALL","onClearPostState","SUBMISSIONS","onClearPublishedTime","currentPostState","lcidToSearch","olderThanDateTimeValue","onChangeLcidToSearch","onChangePostTypes","currentPostType","postState","onUpdateLcidToSearch","dateToUse","timeNow","onlyNewer","dayOfYear","setHours","getHours","getMinutes","getSeconds","nextDay","nextDayDateToUse","onlyOlder","maxDate","minDate","availablePostType","onEditPost","onInsight","onClone","POST_TYPES","COMPLIANCE","onBoost","onUnpublish","DesktopPreview","FluentPostUpdateIcon","focusable","FluentCalendarIcon","TeamsPreview","Home","MobilePreview","appName","activePage","MobileAppPages","MessageOutlined","Chat","AccountCircle","Account","PlainPreview","CreatedBySelectValues","forwardRef","Preview","previews","previewsToUse","preview","activePreview","setActivePreview","disableEscapeKeyDown","prvw","openAction","openLabel","editAction","editLabel","publishAction","publishLabel","disablePublish","extraAction","extraLabel","extraLabelStartIcon","Desktop","Plain","getActivePreview","previewHelpText","Video","setIsPlaying","isPlaying","pauseVideo","standardizedText","getSourceType","html5","nativeVideoTracks","nativeAudioTracks","sources","paused","initialize","dispose","data-vjs-player","data-setup","onPlay","onPause","CanvasPreviewImage","canvasElement","drawImageOnCanvas","cropPoints","dom","clientWidth","drawTextInCenterOfCanvas","ctx","clearRect","srcHeight","srcWidth","croppedX","croppedY","croppedWidth","croppedHeight","drawImageInMultipleParts","font","fillStyle","fillText","context","srcOffsetX","srcOffsetY","targetOffsetX","targetOffsetY","targetWidth","targetHeight","xParts","yParts","partWidth","partHeight","j","Carousel","carouselIdx","setCarouselIdx","setItems","videoPaused","setVideoPaused","shiftLeft","newIdx","shiftRight","hasFeature","useCanvas","zoom","onClickBubble","HeroBanner","selectedCarouselIndex","heroImage","hasHeroImage","hasAttachedContent","getFiles","attachedFile","BannerText","full","ExpandIcon","iconOnly","TypeBanner","Banner","banner","PostTypeBanner","_publicBanner","expandPublic","onToggleExpandPublic","_restrictedBanner","isRestricted","expandRestricted","onToggleExpandRestricted","_typeBanner","banners","currentUserHasComplied","hideCompliance","complianceTime","complied","notComplied","expandType","onToggleExpandType","onGetTranslatedText","onSetBannerExpansions","urlDescription","detailed","BreakingFeaturedBanner","_breakingBanner","isBreaking","_featuredBanner","isFeatured","configTranslations","specialtyPostColorAdmin","colorsToUse","Compliance","onSendAcknowledgement","sendAcknowledgement","acknowledgedCompliance","unacknowledgedCompliance","hasComplied","SendAcknowledgement","Reaction","onSetReaction","puffOut","setReaction","onSetReactionEnd","onAnimationEnd","SetReaction","Reactions","getReactions","postReactions","matchFound","postReaction","reactionsEnabledOnTenant","reactingEnabledOnPost","BasicTinyMce","commentSystem","tenantGifsEnabled","gifRef","isGifsVisible","onChangeIsGifsVisible","initializeCallback","spellcheckEnabled","spellcheckLanguage","acceptableLanguages","object_resizing","image_title","branding","statusbar","paste_block_drop","powerpaste_block_drop","force_br_newlines","paste_as_text","tenorvisible","plugins","noneditable_noneditable_class","spellchecker_rpc_url","spellcheckerRpcUrl","spellchecker_language","spellchecker_active","paddingtop","content_style","setup","processor","ui","registry","addToggleButton","onAction","api","setActive","addAutocompleter","ch","minChars","highlightOn","autocompleteApi","rng","setRng","pattern","u","fullName","char","colorForAvatar","onEditorChange","handleTinyText","setPlaintext","setCount","addGif","setGifsVisible","tinygif","TextboxButtons","onAdd","onAddDisabled","letterCount","isReply","addComment","bodyHtml","bodySimple","AddComment","bodyPlaintext","setBodyPlaintext","gifsVisible","textRef","isOnlyWhitespace","commentCooldown","onSelect","defaultResults","plain","hasGif","hasReplies","EditComment","bodyFormatted","bodyPlain","charsCount","snapshot","confirmCallback","editedState","toggledOffGif","imageVisible","onlyWhitespace","limit","contentFilter","FlagComment","CommentFooter","comment","pendingStar","isAuthor","onReply","replyCount","starCount","formattedLikes","formattedReplies","commentLiked","starredByCurrentUser","onDestar","onStar","Star","StarBorder","repliesPreview","KeyboardReturn","Commands","commandMenu","commandsToUse","flaggedByCurrentUser","deletionEnabled","flaggedIcon","command","onDeleteClick","showDeleteConfirmation","onDeleteConfirm","pendingDeletion","onEditCancel","handleDelete","onDeleteDismiss","onEditClick","editingComment","isEditing","toggleEdit","onEditConfirm","htmlBody","plainBody","editComment","onFlagClick","showFlagConfirmation","onFlagConfirm","handleFlag","onFlagDismiss","onStarClick","onDestarClick","deleteComment","flagComment","pendingFlag","createdTime","isEditable","wasEdited","updatedTime","formattedBody","addCommentReply","AddCommentReply","replyDetails","parentCommentId","repliesExpanded","loadReplies","onCancelReply","startBookmark","setStartBookmark","oldMention","nodeValue","moveToBookmark","getBookmark","ReplySection","parentComment","fetchAllReplies","setReplyDetails","replyTextboxVisible","setReplyTextboxVisible","loadingReplies","setLoadingReplies","allRepliesVisible","setAllRepliesVisible","allReplies","setAllReplies","repliesLoadable","onReplyToChild","newReply","toggleAllRepliesForParent","parentReplies","reply","SortSelector","sortByOldestFirst","onSortByOldestFirst","Comments","toStarId","onUpdateComments","toDestarId","onSubscribeToComments","pendingSubscribe","subscribeToComments","onUpdateCommentSubscriptions","onUnsubscribeFromComments","unsubscribeFromComments","updateCommentList","commentsEnabledOnPost","commentsEnabledOnTenant","hasComments","commentTotal","currentTotal","numberOfComments","parentComments","sortedComments","sortByNewestFirst","showSubscription","isSubscribed","dateA","dateB","SubscribeToPostComments","FetchAllReplies","useCustomTinyMceCssContent","GLOBAL_LAYOUT_STATUS","FETCHING","sasUrl","utcExpiry","expiry","searchParams","getExpiryFromSasUrl","isExpired","fetchCustomCssFileAsync","admin","CustomCss","requestTenantId","useParams","tenantIdToUse","PostContentView","showComments","showReactions","tinyMceCustomCssEnabled","languageShort","datePublished","commentCount","lastOpenTime","lastReadTime","openPostInPortal","hrefToOpen","newWindow","ConfirmRepublishCompliancePostDialog","isPinnedDeleted","publishedBands","someHandler","castBandToComparableSettings","useContentBands","isContentBandsDirty","isConfigDirty","fetchContentForBand","haveContentAlready","editContentBandDraftField","originalBand","onChangeLayout","onChangeDisplayFullTitles","onChangeEnableSeeMoreLink","onChangeContentCount","onChangeSortBy","onChangePinnedIds","onChangeLockToReadStatus","onChangeLockToTypes","onChangeLockToTopics","onChangeIgnoreSubscriptions","onChangeAutoPlayCarousel","onChangeHeaderText","latestSavedContentBands","EditPublishedContentDialog","ContentType","popper","tooltipClasses","PostList","getDesktopPreview","postToPreview","sortIndex","formatEpochTime","formatEpochTimeFromNow","SCHEDULED","PUBLISHED","onUpdateFilters","DRAFTS","getPublishedTimeTabLabel","submittedAsc","submittedDesc","expiryAsc","expiryDesc","typeAsc","typeDesc","authorAsc","authorDesc","onSelectAllPosts","isPostSelected","colorToUse","isSubmission","getStatusColorToUse","handlePostClick","onSelectPost","alertUnopened","onPreviewPost","onClonePost","onBoostPost","onUnpublishPost","onDeletePosts","onPublish","onPublishPost","onViewInsights","publishedTime","lastSubmittedTime","authorFullName","totalPosts","isDeleteBtnDisabled","onClearAllPosts","getToolbarIconWithAsyncOnClick","toolTipText","filtersToSet","defaultPostFilterValues","postToBoost","toBoost","postToClone","toClone","clonePost","getIsPinnedDeleted","postToDelete","contentBandsState","idsToCheck","singularPost","clearContentBands","deletePosts","postToEdit","GetPostUsersComplianceStatus","usersHaveComplied","showConfirmComplianceEditPost","currDraftId","showPostPreview","showEditPublishedPostDialog","onEditPostConfirm","onHidePostPreview","defaultPostOverview","postToDisplay","task","isDraft","GetPostOverview","isLoadingPreview","authorEmail","allPageNum","pubPageNum","schPageNum","dftPageNum","pageContext","toUnpublish","toRemove","showConfirmUnpublishCompliancePost","unPublishPost","onUnpublishCompliancePostConfirm","toPublish","showConfirmPublishEditedCompliancePost","onPublishPostConfirm","toPublishDraftId","isPostPublishDateValid","showOpenInPortalPreviewAction","showOpenPublishedVersion","previouslyPublishedPostId","getPreviewOpenAction","getPreviewOpenLabel","getPreviewPublishLabel","unpublishPost","CreateClonedPost","UnpublishPost","isDropDownOpen","borderLeft","selectedFilter","VIEW_MY","VIEW_ALL","createdByOptions","FETCH_REQUEST_WAIT_MS","useRetryableRequest","retryCount","setRetryCount","setRes","requesting","makeRequest","debounce","retry","asyncRequest","handleFetchPublishedError","maxRetry","isFailed","ACCORDIONS","SuccessfulActionDialog","defaultImage","onClickCheckmark","_e","onClickOK","afterPublishSuccess","hideSuccessfulActionDialog","customImage","displayMessage","SUBMISSION_PUBLISH_TEXT","hideSuccessfulPostPublish","hideSuccessfulEventPublish","eventActions","userActions","hidePublishDialog","isTimedOut","setIsTimedOut","isScheduled","setIsScheduled","autoHideTimeout","isScheduledPost","updateUserSettings","getRedirectLink","contentUrl","contentId","getDialogImg","getVideoContentWarning","getImmediateContent","hideFeedRedirect","getOkButtonText","getScheduledContentDialog","getSuccessImageAltText","getPublishedTitle","getReturnButtonText","labelPlacement","publishedPostContainsVideoContent","PostListing","shouldShowLoadingOverlay","shouldShowPublishedDialog","showingPublishErrorsDialog","onSelectPostCreatedBy","createdByMeOnly","onReplaceFilters","allPageNumber","publishedPageNumber","draftsPageNumber","scheduledPageNumber","submissionPageNumber","fetchAllPostList","TAB_IDS","fetchPublished","fetchScheduled","fetchSubmissions","skipUrlUpdate","newUrl","generateUrl","replaceState","fetchSubmissionPosts","tabNumber","draftPageNumber","urlAllPageNumber","urlPublishedPageNumber","urlScheduledPageNumber","urlDraftPageNumber","urlDraftSubmissionNumber","fetchDraftPosts","fetchExpired","fetchExpiredPosts","fetchPublishedPosts","fetchScheduledPosts","fetchAllPosts","getTags","tagsToSet","getUserTags","finally","__LENGTH","defaultPublishedPostFilterValues","defaultDraftPostFilterValues","defaultSubmissionPostFilterValues","FetchAllPost","FetchPublishedPosts","FetchScheduledPosts","submissionPosts","FetchSubmissionPosts","PostManagementPage","DraftActivityLog","activityToString","lowerCaseLetters","DraftAction","Reject","DraftHistory","activities","DraftHistoryButton","setActivities","initialOpen","setInitialOpen","iconButtonRef","createRef","inToolbar","otherPopoutsClosed","getDraftId","authoringApi","getDraftActivity","act","fetchActivities","useStylesAppBar","wordMarkContainer","toolbarActionsContainer","authorActionsContainer","restoreIcon","AuthoringAppBar","backAction","contentGuidelinesOpen","isPostEditor","EditorWrapperLayout","MainEditorLayout","paperProps","check","skip","Validator","onCollapseProgressList","expandProgressList","onExpandProgressList","checks","AuthoringDrawer","onBookmarkClick","drawerProps","DatePicker","clearable","views","avoidPickerViewLayoutShift","onChangeDate","inputEndAdornment","modifiers","phase","fn","actionBar","newDate","startOf","DateAndTime","datePlaceholder","dateStyle","timeStyle","timePlaceholder","initializeDateWithCurrentTime","timeDisabled","onChangeTime","hours","minutes","dateValue","onInnerChangeDate","BreakingTime","onToggleBreakingTime","showBreakingTime","breakingTime","minBreakingTime","maxBreakingTime","FeaturedTime","onToggleFeaturedTime","showFeaturedTime","featuredTime","isBackdated","nonBackdatedLimit","minFeaturedTime","maxFeaturedTime","Reminders","getDefaultReminder","reminder","reminderOption","customChannels","delay","delayType","emailRange","mobileRange","sendEmail","sendSMS","smsRange","teamsRange","getDefaultCustomerChannels","notifications","getReminders","reminders","channel","onAddReminder","onApplyReminderSettings","onChangeNotifications","onChangeReminderChannel","reminderIndex","onChangeReminderDelay","onChangeReminderDelayType","onChangeReminderRange","onDeleteReminder","onSetCustomReminderChannels","onSetNotificationReminderChannels","onToggleRemindersEnabled","isPreviouslyPublished","wrapperInner","Notifications","getNotifications","isOldPublishedPost","postPublished","notificationsToggle","previousNotifications","emailEnabled","emailNotificationRange","mobileNotificationRange","smsEnabled","smsNotificationRange","teamsNotificationRange","defaultNotificationsState","onApplyNotificationSettings","checkPostNotificationsAreOff","onToggleNotifications","onEmailFallback","onEmailSubscribers","onSMSFallback","onSMSSubscribers","onToggleEmailEnabled","checkWhichEmailRangeToUse","onToggleMobileEnabled","onToggleTeamsEnabled","onToggleSMSEnabled","checkWhichSMSRangeToUse","onTogglePostNotifications","onSetPostNotificationsToPost","setPostNotificationsToNone","setPreviousPostNotifications","setDefaultPostNotifications","areAnyPlatformsEnabled","evt","PublishTimev2","PublishTime","onChangePublishTime","ExpiryTimev2","ExpiryTime","onChangeExpiryTime","ReactingEnabled","onToggleReactingEnabled","CommentingEnabled","onChangeCommentingType","onChangeCommentingEnabled","commentingType","PublicShareLinkEdit","setIsValidUrl","customPublicUrl","urlText","setUrlText","onTextUpdate","containsSpaces","checkValidUrl","onChangePublicLink","OptionsEditor","reminderNotificationsEnabled","onChangeBreakingTime","onChangeFeaturedTime","onChangeReactionsEnabled","onToggleReminderSettings","notificationsPanelOpen","setNotificationsPanelOpen","reminderNotificationsPanelOpen","setReminderNotificationsPanelOpen","toggleNotifications","setToggleNotifications","checkPreviousNotifications","onToggleNotificationSettings","getDateString","hasReminders","remindersToggled","EmptyDataMessage","Indicator","scoreLabel","startLabel","endLabel","score","recommendedScore","useGlobalIcon","rtlRange","setRtlRange","ltrRange","setLtrRange","half","getLeftToRightValue","scoreToUse","normalise","getRightToLeftValue","linearProgress","ltrValue","rtlValue","LinearProgress","colorPrimary","barColorPrimary","valueToUse","translateBy","recommendedScoreLabelComponent","scoreLabelComponent","IndicatorWrapper","indicator","minScore","maxScore","minLabel","maxLabel","ReadabilityAndReachIndicators","readabilityIndicator","toneIndicator","sentimentIndicator","personalismIndicator","isUsingTenantAverages","TextAndWords","estimatedReadingTime","wordCount","usingGlobalStats","averageWordCount","bottomRange","topRange","textIndicator","timerValue","separated","seconds","hourNum","minutesNum","secondsNum","getNiceTimerString","PASSIVE_REGEX","CLICHE_REGEX","ContentIssues","issues","totalSentenceCount","totalWordCount","lettersPerWord","syllablesPerWord","wordsPerParagraph","wordsPerSentence","sentencesPerParagraph","hideHighlights","spellingErrorCount","grammarErrorCount","veryLongSentenceCount","longSentenceCount","longWordCount","highSyllableWordCount","passiveVoiceCount","adverbCount","clicheCount","highlightedText","percent","getSpecialCount","m","passiveCount","exec","lastIndex","cliche","passive","useAccordion","accordionCount","accordionOpenStates","setAccordionOpenStates","expandAllLabel","setExpandAllLabel","onChangeAccordionOpen","newOpenStates","onExpandAll","onCollapseAll","onExpandOrCollapseAll","POST_SMART_CONTENT_TILE_BUTTON_IDX","ContentAnalyses","contentAnalyses","tenantAverages","globalAverages","highlightsOn","toggleHighlights","analyze","setIsUsingTenantAverages","accordionHook","sentenceCount","readingTime","highlightAnalysis","getAccordion","highlightsDisabled","disable","processedHighlightText","disableHighlightsButton","REACH_AND_READABILITY","TEXT_AND_WORDS","ISSUES","PageCounter","getDropDown","currIndex","pageToVisit","onSelectChange","getNonDropDownLabel","dropDown","renderCounter","Pagination","PaginationItem","AnimatedDragPrompt","prompts","Cropper","cropperContainer","croppie","getData","initializeCroppie","checkExists","setInterval","getElementById","Croppie","boundary","viewport","showZoomer","enableOrientation","paddedImage","ImageCropper","setCurrentPage","isCropping","setIsCropping","cropper","imageToCrop","getCurrentImage","cropBoundary","newPage","imageToSet","cropperData","UnfoldMore","getButtonLabel","onEditAttachedContent","onEditHeroImage","pageIndex","setPageIndex","imageGalleryOpen","setImageGalleryOpen","imageCropperOpen","setImageCropperOpen","imagesToCrop","setImagesToCrop","imagesToCropAttachedFile","setImagesToCropAttachedFile","isCropSkippable","setIsCropSkippable","previewedImage","setPreviewedImage","newImage","onCloseImageCropper","onCloseImageGallery","getImageActions","Fab","onRemoveImage","onCropImage","getAttachedContents","containsVideo","tasks","taskToAdd","currHeroImage","newAttachedContent","newHeroImage","getImagePreview","finished","imageToUpdateIndex","valueToReplace","skippable","newImagesAttachedFileToCrop","newImagesToCrop","newHero","rest","INLINE_STYLES","PostType","onChangePostType","IconTextField","iconStart","iconEnd","characterCountThreshold","errorStyles","getErrorStyles","defaultAuthorContact","topicGroups","hasPublished","onChangeTopics","onChangeAttachedContent","onChangeAuthor","onChangeAuthorEmail","onChangeFileAttachements","hasMention","setHasMention","topicAudiences","setTopicAudiences","authorContact","setAuthorContact","canEditAuthorName","canEditAuthorEmail","toTest","newAudiences","getAssociatedAudiences","getSelectedTopics","postTag","consolidatedImages","getImages","attached","postTopics","hasRestricted","hasNonRestricted","showMentionsAndRestrictedDisclaimer","showAccessibleToAllUsersDisclaimer","showPrivateToAudiencesDisclaimer","getAudienceList","newAuthorName","newEmail","isPostEmailValid","isAnyTenantPostNotificationsEnabled","getDefaultNotificationSetting","defaultPostSettings","defaultEventSettings","isAnyTenantRemindersEnabled","ContentAnalysesCallout","TABS","PostSettingsPanel","onChangePost","analysisIndicator","tenantNotificationSettings","analysesTab","setAnalysesTab","showContentAnalysesCallout","showContentAnalysesCalloutChecked","setShowContentAnalysesCalloutChecked","originalPostNotifications","currToggleVal","currNotifications","isAnalysis","scrollButtons","iconWrapper","labelIcon","wrapped","getTab","newDateTime","newExpiryTime","setDate","remindersDefined","linkToSet","LANGUAGE_CODES","en","getAnalysisContent","defaultContentText","oldTitle","oldSummary","TranslatableContentEditor","onBodyFocus","onChangeBody","onChangeSummary","contentText","setContentText","titleHasAnyValue","setTitleHasAnyValue","summaryHasAnyValue","setSummaryHasAnyValue","onKeyPressCheck","currentValue","newSummary","enableSmartContentSummarizeButton","enableSmartContentTitleButton","PostMainPanel","smartContentEnabledForTenant","turnHighlightsOff","emptyTranslatedContent","ouputLanguage","SmartContentPaperFab","fabStyle","fabClassName","skipCallouts","setSkipCallouts","SmartContentPaper","getContainerStyle","unmountOnExit","TileButton","transitionDelay","Fade","Zoom","getTransition","TileButtonFlexContainer","SmartContentFooter","SmartContentHome","onOpenReadabilitySettings","gradientUnits","x1","y1","x2","y2","stopColor","offset","POST_SMART_CONTENT_PAGES","PostSmartContentHome","highlights","BASE_BUTTON","tileButtons","nextPage","IDEAS_LIST","KEYWORDS","GENERATE_IDEAS","TITLES_LIST","GENERATE_TITLES","SUMMARIES_LIST","GENERATE_SUMMARIES","BODY_LIST","GENERATE_BODY_TEXT","SmartContentSuggestedHeader","usedTinymceDropDown","onTrash","onGenerateMore","onBack","SmartContentSuggestion","suggestion","copyToClipboard","confirmPosition","isInline","suggestionId","PostSmartContentKeywords","generateLabel","headerTitle","previousPage","onChangeKeywords","onGenerate","cancelable","newKeywordSuggestion","SmartContentListPage","enableGenerateMoreListButton","usedTinyMceDropDown","disclaimerText","fetchType","SmartContentTitles","titles","onApplyTitle","behavior","PostSmartContentIdeas","ideas","onApplyIdea","Idea","choice","SmartContentSummaries","summaries","SmartContentDraftPage","drafts","draftIdx","currentDraft","onChangeDraftIdx","onChangeDraft","onApplyDraft","ReadabilitySettingsDialog","suggestedTextExists","onClearAllSuggestedText","confirmClearSuggestions","setConfirmClearSuggestions","getRandomSelection","floor","random","currentSetting","randomSelection","SmartContentGeneric","choices","onApplyText","ONE_LAST_CHECK_TAB_VALUES","PostSmartContentPanel","activeTranslation","indicatorOn","typeOfPrompt","setKeywords","applySmartContentSuggestion","hasBeenOpen","setFetchType","setHighlights","confirmApplyBodyDraft","setConfirmApplyBodyDraft","confirmClearBodySuggestions","setConfirmClearBodySuggestions","readabilitySettingsOpen","setReadabilitySettingsOpen","buttonUsedToEnterFlow","setSuggestions","setIdeas","setTitles","bodyDrafts","setBodyDrafts","setSummaries","setDraftIdx","changeToneContent","setChangeToneContent","sessionId","transitionButtonsRef","transitionTimeout","fetchContent","onGenerateBodyText","onGenerateTitles","onGenerateSummaries","onGenerateContent","generationFunctions","generate","pageKey","newHighlights","shouldFetchContent","pageLengthMapping","REWRITE_LIST","EDUCATIONAL_LIST","EXPAND_LIST","FRIENDLY_LIST","HEARTFELT_LIST","PROFESSIONAL_LIST","GENDERNEUTRAL_LIST","SHORTEN_LIST","WITTY_LIST","onClickTileButton","buttonClicked","getBaseGenerateContentRequest","numberOfContentToGenerate","onGenerateIdeas","concatenate","newIdeas","newBodies","newSummaries","newTitles","newContentChoices","nextIndex","directMappings","onClearIdeaSuggestions","onClearSummarySuggestions","onClearTitleSuggestions","getBasePageProps","backTo","onClearContentSuggestions","onClearBodySuggestions","onChangeBodyDraft","onGeneratePost","idea","onApplyBodyDraft","needToConfirm","onApplyBodyDraftConfirmed","createGenericSmartContentComponent","pageTitle","promptTypeForPage","baseProps","pageComponents","getKeywordsPageLabels","newKeywords","Rewrite","Friendly","Shorten","Expand","Educational","GenderNeutral","Witty","Professional","Heartfelt","getPage","revisions","includeHighlightResults","updatePost","settingsDrawerOpen","fullscreenEditor","onChangeAnalysisIndicator","onChangeFullscreen","onToggleSettingsDrawer","contentAnalysesTabVisited","bodyChangedSinceLastAnalyze","previousTranslatedContent","prevLcid","notificationSettingsEnabled","isTenantNotifsEnabled","reminderSettingsEnabled","currentAnalyses","setCurrentAnalyses","setFetchingAnlyses","initAnalyze","setInitAnalyze","setHighlightsOn","smartContentOpen","setSmartContentOpen","smartContentCalloutOpen","setSmartContentCalloutOpen","smartContentIndicator","setSmartContentIndicator","tenantPostAverages","setTenantPostAverages","globalPostAverages","setGlobalPostAverages","getTenantAveragesSetting","isUsingTenant","setIsUsingTenant","smartContentHasBeenOpenOnce","settingsOpenBeforeSmartContent","contentChangesMade","highlightedTextInTinyEditor","setHighlightedTextInTinyEditor","setPromptType","setUsedTinyMceDropDown","smartContentKeywords","setsmartContentKeywords","setSmartContentSuggestion","summary","fetchTenantPostAverages","getTranslation","fetchGlobalPostAverages","GetGlobalPostAverages","smartContentCalloutTimeout","defaultTranslation","updateAnalysisAverageScores","analysisToModify","averagePersonalism","averageTone","averageReadabilityScore","averageSentiment","analyses","POST_SETTINGS_TAB_VALUES","CONTENT_ANALYSES","prevBody","bodyChanged","FEATURE_ACTION_CODES","ANALYZE_AGAIN","onChangeTranslation","promptTypeForGeneration","promptTypeForInsert","tinyBody","POST_SETTINGS_EDITOR_DRAWER_WIDTH","showSmartContentHelpCallouts","setTenantAveragesSetting","SELECT_CONTENT_ANLYSIS_TAB","OneLastCheckMoreDetails","reactionsEnabledOnContent","commentsEnabledOnContent","commentType","setReminders","setReminderIndex","reminderInfos","newReminderInfo","previousReminder","dateAndTime","areNotificationsEnabledOnTenant","areRemindersEnabledOnTenant","getNotificationStatus","divider","getRow","SubmissionDisclaimer","AuthoringAppBarAction","ONE_LAST_CHECK_TABS","DETAILS","PREVIEW","OneLastCheck","disableKeepEditing","publishBtnName","setPublishing","totalReach","setTotalReach","tagNamesMap","setTagNamesMap","tagSubscriberCountsMap","setTagSubscriberCountsMap","TAG_STATS_IDX","TOTAL_REACH_IDX","GetUniqueSubscribersForTopics","tagStatsResult","totalReachResult","tagStatsHashMap","tagNamesHashMap","newTab","DockToLeftIcon","AuthoringAppBarActions","Publish","saveAction","Save","rejectAction","previewAction","Back","toggleSettingsAction","ToggleSettingsPanel","discardAction","Discard","openGuidelinesAction","OpenGuidelines","groupAnchorRef","showMoreActionsOpen","reviewActions","smallScreenActions","getMoreOptionsMenu","getMenuOptions","getPublishButton","paddingX","getIconButtons","getPublishBtnName","isDraftIdPresent","appBarState","draftState","isSubmissionMode","isReviewMode","allActions","discardPost","previewPost","backToManagePosts","toggleSettingsDrawer","isSettingsDrawerOpen","isValidDraft","savePost","rejectSubmission","openGuidelines","saveChangesOptions","RejectSubmissionDialog","saveOption","setSaveOption","setComments","unsavedChanges","selectOption","saveProgress","useOpenContentGuidelines","openContentGuidelines","setOpenContentGuidelines","isFirstOpenGuidelines","setIsFirstOpenGuidelines","POST_DETAILS","POST_OPTIONS","isCompliance","createNew","CreateNewPost","postActions","setSaving","setNewPost","updateId","updatePostContent","openedTimeStamp","fetchingCustomCss","oneLastCheckOpen","setOneLastCheckOpen","setSettingsDrawerOpen","previewOpen","setPreviewOpen","setPreviewPost","confirmAnalyticsDialogOpen","setConfirmAnalyticsDialogOpen","unsavedChangesWarning","setUnsavedChangesWarning","confirmDiscardPost","setConfirmDiscardPost","confirmRejectSubmission","setConfirmRejectSubmission","selectedSettingsTab","setSelectedSettingTab","showContentAnalysesDialog","dontShowConfirmDialogAgainChecked","setDontShowConfirmDialogAgainChecked","setFullscreenEditor","setAnalysisIndicator","confirmRepublishComplianceOpen","setConfirmRepublishComplianceOpen","getNewPost","setupPreviewPost","idToUse","getDraftPost","postOverview","sendPostAuthoringClosedSparrow","onVisbilityChange","visibilityState","urlParams","redirectToManagePosts","onSaveDraftSuccess","savedItem","draftSaveOnly","redirectToUrl","publishPostConfirm","getPreviewablePost","unsubmitPost","unsubmitSubmissionPost","publishConfirmed","redirecting","onDenyAnalyticsDialog","onConfirmAnalyticsDialog","contentGuidelinePreview","availableEventTypes","EventFilters","availableEventState","onChangeEventStates","getFilterByDateTime","getFilterByType","availableEventType","onChangeEventTypes","eventTypes","selectedEventType","selectedEventState","onClearEventState","eventType","onClearEventType","currentEventType","currentEventState","eventState","FullStartDate","startDate","eventEndTime","EventTypeBanner","getStartDate","startTime","endTime","getRestrictedBanner","dateBlock","DateBlock","monthFormat","showMultiBlocks","eventStartTimes","localDate","utc","renderDateBlock","getNextEventStartTime","Author","CutoffTime","cutoffTime","AddToCalendar","download","onAddToCalendar","locationLink","locationLinkLabel","physicalLocation","digitalLocation","fetchDigitalLocation","locationLabel","bodyAddition","startTimes","calendarEventTimes","isAllDay","calendar","hasStartTime","EventTimes","showAddToCalendar","isMultiDay","hasSpecificTimes","openFile","Location","Tags","EventPreview","fetchRedirectToPublished","isPublishedEvent","publishId","getPrimaryAction","inEditor","getAvailableLanguages","getNotificationDetails","allNotificationsDisabled","notificationToggle","getReminderDetails","allRemindersDisabled","getTagDetails","tagStatIndex","tagStat","getTimeDetails","getTypeBanner","tagIndex","onSetReminderInfo","onEditDetails","availableLcids","onHandleEdit","onClearAll","anyPublishedOrScheduled","si","getDeleteIcon","EventList","onPublishEvent","onHideEventPreview","eventPreview","formatTime","openEditPublishedEvent","onEditEvent","onSelectAllEvents","isEventSelected","handleEventClick","onSelectEvent","onPreviewEvent","onCloneEvent","onDeleteEvent","onUnpublishEvent","rsvpCount","eventToDelete","onClearAllEvents","eventToUnpublish","eventToClone","toPreview","onDeleteEvents","onHideDeleteEventConfirmation","eventSelected","showEventPreview","toViewId","showDeleteEventConfirmation","eventToDisplay","initialFilters","initialSort","myEventsOnly","showMyEventsOnly","pendingPublishing","EventCommandBarAction","EventListing","onSelectCreatedBy","fetchAllEventList","submissions","scheduled","allEventsList","showFilters","Submit","setToDefaultState","showPublishDialog","EventManagementPage","InputLabelProps","shrink","onApplyImageChanges","onApplyImageTransforms","onHideImageCropper","showImageCropper","onGoToNextImage","onGoToPreviousImage","onHideImageGallery","showImageGallery","onRemoveAttachedContent","attachedContentToRemove","attachedImage","onSelectAnImage","onSelectStep","onShowImageCropper","onShowImageGallery","hasCarousel","carouselLength","optional","AuthoringWarnings","getTagsList","hasMixedRestrictions","selectedTopicIds","topicGroup","needsMentionWarning","showTagsList","onlyRestricted","hasMentionWarning","ContentAnalysis","contentAnalysis","getProficiencyBar","scoreText","getProficiencyColor","getScoreLocation","parseFloat","getSentimentBar","getSentimentColor","getSentimentNumber","uiSentimentScore","getSentimentVerb","isIdealScore","fogScoreText","formatReadTime","sentimentColor","ieltsScoreText","ieltsScore","floatingToolbar","Summary","onFocusSummary","onBlurSummary","onFocusTitle","onBlurTitle","TranslatedContent","displayedLanguages","availableLanguage","showAddLanguagesList","onHideAddLanguagesList","onHideContentAnalysis","showContentAnalysis","languageToRemove","displayedLanguage","onRemoveSummary","onShowContentAnalysis","onShowRemoveContentConfirmation","onShowReplaceContentConfirmation","onToggleAddLanguagesList","setLanguageAvailability","checkIfAnyTranslabableContent","addLanguagesAvailable","isActiveTab","data-text","showSummary","UpdateInPersonCapacity","UpdateOnlineCapacity","Capacity","onChangeInPerson","capacity","InPerson","onChangeOnline","Online","onChangeWaitlist","Waitlist","onToggleInPerson","onToggleOnline","onToggleWaitlist","OutlinedInput","onChangeCutoffDay","onChangeCutoffTime","addEventDay","recentStartTime","recentEndTime","newStartTime","newEndTime","deleteEventDay","getEventDayLabel","dayNumber","getEventStartTimeInEpoch","getEventTime","onChangeEventTime","TimePicker","onChangeEventStartTime","onChangeEventEndTime","minTime","skipDisabled","onToggleAllDay","setNewEventStartTime","onHideNewEventTime","showNewEventTime","prevStartTime","nextStartTime","EventType","onChangeEventType","onChangeLocation","onChangeLocationLink","onChangeLocationLinkLabel","onToggleLocation","showLocation","onToggleLocationLink","showLocationLink","clearLocationLink","Questions","onAddNewQuestion","newQuestion","newQuestionKey","requireNewQuestion","onHideNewQuestion","onChangeNewQuestion","onChangeRequireNewQuestion","showNewQuestion","onRemoveQuestion","questionNumber","remainingQuestions","remainingQuestion","onShowNewQuestion","questionNumbers","filterOptions","EventCommandBar","actionItems","ShowBanner","ShowSummary","hiddenInBar","AddOrganizer","lgDown","AttachFiles","xlDown","AddQuestion","xlUp","EventEditor","getSelectedTopicDetails","filterTopicGroups","getEventCommandBarActions","onShowAuthor","showAuthor","onShowQuestions","showQuestions","onShowAttachedFiles","showAttachedFiles","onShowHeroBanner","showHeroBanner","onShowSummary","onChangeEvent","onChangeCapacity","onChangeEventTimes","NotAttending","respondingEnabled","onChangeFileAttachments","showConfirmation","showUpdateInPersonCapacityConfirmation","showUpdateOnlineCapacityConfirmation","hasNotifications","onChangeQuestion","newTopics","onHideUpdateInPersonCapacityConfirmation","onHideUpdateOnlineCapacityConfirmation","onRemoveAttachedFiles","onRemoveAuthor","onRemoveHeroBanner","onRemoveInPersonCapacity","onRemoveOnlineCapacity","onRemoveQuestions","onSetNotifications","onShowNotificationSettings","onShowLessOptions","showMoreOptions","onShowMoreOptions","onShowReminderSettings","isAnyTenantEventNotificationsEnabled","showNotificationSettings","showReminderSettings","imageGallery","getValidationChecks","isTitleValid","isBodyValid","isAuthorValid","isCutoffTimeValid","isTagsValid","isExpiryTimeValid","isDateTimeValid","isStartAfterEnd","endDate","isReview","discardEvent","hasDraft","isUpdatingUrl","getNewEvent","validation","setEvent","setHasError","setIsFetching","setValidationChecks","setIsValid","setShowNotificationSettings","setShowReminderSettings","showRejectSubmissionDialog","setShowRejectSubmissionDialog","setCustomCss","currValidation","draftEvent","onGetDraft","fetchAndSetCustomCss","onHidePreview","redirectToManageEvents","backToManageEvents","redirect","previewEvent","commands","onRejectSubmission","unsubmitEvent","changedEvent","onChangeAttendanceType","attendees","onChangeAnswers","attendee","AttendanceFilters","onChangeEmail","onChangeName","AttendanceList","formatAttendanceType","onSelectAllAttendees","isAttendeeSelected","onSelectAttendee","rsvpTime","totalAttendees","onClearAllAttendees","onShowEditResponse","onShowChangeRSVPStatusDialog","onChangeRSVPStatus","onHideChangeRSVPDialog","onEditResponse","onHideEditResponseDialog","showChangeRSVPStatusDialog","showEditResponseDialog","AttendanceListing","downloadAttendanceListing","fetchAttending","fetchNotAttending","fetchUndecided","fetchWaitlist","getDefaultPageValues","attending","notAttending","undecided","waitlist","getEventTitle","AudienceChipLabels","audienceIds","matchedAudiences","matchedAudience","CategoryTagChipLabels","deleteDocument","disableDocument","enableDocument","onDownloadDocument","onPreviewDocument","functionalTitle","getMimeType","getStringFromMimeType","SupportedFileTypes","DocumentUploader","showSupportedFileTypes","AudienceChips","accessibleAudiences","setAccessibleAudiences","Availability","availability","CategoryTagChips","matchedTags","matchedTag","userCategoryTags","effectiveCategoryTags","hasSelectedTag","FileName","Revision","State","onChangePublishingTime","publishingTime","showScheduledOption","isUnpublished","disablePast","DocumentProperties","documentProperties","onChangeAccessibleAudiences","notifiedAudiences","notifiedAudience","onChangeAvailability","onChangeCategoryTags","categoryTagsTotal","onChangeTagsHaveAudience","tagsCategory","audienceTags","removeDuplicates","getCategoryTagsById","defaultAudienceAccess","elem","pos","onChangeLanguage","onChangeNotifiedAudiences","categoryTagsActions","documentAction","DocumentEditor","onChangeDocumentProperties","hideEditor","onCloseUploadFail","uploadFail","onGetDocumentProperties","newFileType","editableDocument","replaceFile","publishDocument","uncategorizedTag","newProperties","updateDocumentProperties","Availabilities","DocumentFilters","states","availabilities","selectedLcid","onClearLcid","onClearCategoryTag","onClearAudience","selectedAvailability","onClearAvailability","onChangeLcids","onChangePublishedFromDate","onChangePublishedToDate","onClearAudiences","onClearCategoryTags","DocumentPreviewInfo","totalDownloads","uniqueDownloads","getAttachedArticles","attachedPosts","setAttachedPosts","attachedEvents","setAttachedEvents","attachedArticles","totalArticles","articles","article","articleType","attachedPost","attachedEvent","moreOptions","hidePreview","DocumentPreview","onDownload","onHideMoreInfo","showMoreInfo","onShowMoreInfo","DocumentList","formatLanguage","formatViews","disableDesc","disableAsc","languageDesc","languageAsc","onSelectAllDocuments","isDocumentSelected","onEditDocument","onClearAllDocuments","updated","onEnableDocument","onDisableDocument","onDeleteDocument","affectedDocuments","searchArticle","deleteDocuments","selectedDocument","GetFile","downloadDoc","Blob","fileURL","documentFile","previewUrl","DocumentListing","getAll","getEnabled","getDisabled","DocumentManagementPage","DocumentSummary","formatAudiences","accessibleAudience","DocumentCreation","mdUp","onShowTabCommandList","showTabCommandList","onHideTabCommandList","cancelDocument","getNewDocument","onBackToManageDocuments","onHideNotificationSettings","onHideSummary","DownloadIcon","showLoadingSpinner","downloadImage","downloadExcel","ContentDeletedDialog","returnButtonText","TopPosts","callbackRef","getBarChartState","getTopNPosts","postOpenCount","postToCheck","isDeleted","loadData","TopPostsContainer","fetchDataForMyComponent","isLoadingTopPostsAnalyticsOverview","GetTopPostsFromInsights","VerticalBarChart","svgTranslate","getBBox","UsersByMonth","useShortLabels","getRelevantMonth","widthToUse","itemsToDisplay","longLabelToUse","countOfUsers","oldestValidData","x0","valueSecond","shiftViewsBar","shiftReadsBar","shiftViewsTopLabel","shiftReadsTopLabel","CommentsByMonth","reactionCount","UserTrend","useThe","ClientBreakdown","groupFlutterWithNative","legacyWebCount","point","platformDescription","ReadsViewsByHour","utcHour","setUTCHours","rangeEnd","refs","chart","onWindowResize","tz","momentTimezone","guess","noDataAvailable","FilterMoreOptionsButton","loadTypes","FILTER_BY_AUDIENCES","FILTER_BY_TOPICS","InsightFilters","setAudienceFilterText","setTopicsFilterText","fetchLoadingIcon","startDateToSet","endDatetoSet","endOf","filterBy","onFromDateChange","basicFormatting","onToDateChange","selectedValue","rangeString","onAudienceTopicFilterChange","audienceSearchText","topicSearchText","setFilterToCustom","setToCustom","fromText","customStart","customEnd","toText","selectValue","valueToSet","getLoader","getAudienceSearchBox","onUpdateAudienceTextToSearch","getAudienceFilterFooter","audienceSelected","onHandleAllAudience","cleanupDate","toConvert","isMoment","getDatePickerFilter","sanitizedStartDate","sanitizedEndDate","datePickerFormatting","disableFuture","slots","EventIcon","getDateRangeSelectFilter","GetFilterBySelectOption","getTopicsFilter","onChangeSelectedTopics","topicsDropdownText","topicIds","getAudienceFilter","audienceDropdownText","onChangeAudience","currentAudiences","selecteAudience","selectedTopic","onClearTopic","selectedTopicsToSet","getFilters","totalSubscribers","chartElement","selectedEvent","setSelectedEvent","getEventDraft","eventName","downloadAllImage","loadingImage","downloadAllExcel","loadingExcel","onDownloadImg","reportType","isLoadingImage","payloadToDownload","reportName","GetReportFileName","reportPayload","getAllAnalytics","isLoadingReadsByTimeOfDayAnalyticsOverview","isLoadingUsersByMonthAnalyticsOverview","isLoadingCommentsByMonthAnalyticsOverview","fetchCommentAndReactionCounts","isLoadingAppUsageAnalyticsOverview","isLoadingTopSurveyResponseAnalyticsOverview","fetchSurveys","isLoadingTopEventsAnalyticsOverview","isLoadingUserTrendsAnalyticsOverview","setReportPayload","fetchChannelsImage","channelUsageNode","htmlToImage","skipFonts","dataUrl","fetchMostViewedPostImage","mostViewedPostNode","setElementDisplay","mostViewedPosts","fetchMostViewedEventImage","mostViewedEventNode","mostViewedEvents","fetchCommentsAndReactionsImage","commentsAndReactionsNode","fetchEngagedUsersImage","engagedUsersNode","fetchpostViewsByHourImage","postViewsByHourNode","fetchSurveyWithMostResponseImage","surveyWithMostResponseImageNode","surveysWithMostResponse","sendAllExcelReportRequest","handleReportRequest","SendAllAnalyticsReportRequest","resultMessage","updateClientTime","sendExcelReportRequest","SendAnalyticsReportRequest","getCurrentTimeInUserTimezone","clientTimeZone","clientTimeOffset","downloadAllReportAsImage","downloadReport","toReset","fetchReport","setTotalSubscribers","GetTotalSubscribers","audiencesOrTopics","shallowEqual","assembleReportFileName","DownloadInsightReport","resetLoading","isLoadingAll","isLoadingExcel","getAllAudiencesForAuthors","analyticsErrorMessage","tenantState","excel","topTags","commentEnabled","asyncReportsEnabled","asyncReportProcessingEnabled","fetchTopTags","TagListItem","handleTagGroupNameChange","updateTagGroup","toggleDisableTagGroup","toggleGroup","toggleDeletedTagGroup","handleSave","editingGroupId","onDropOnGroup","isNew","createNewTag","currentTagStats","draggable","onDragTagStart","onDragTagEnd","TagCreationModal","handleTagNameChange","newTag","updateTag","restrictedTo","mandatoryFor","defaultFor","toggleTagMandatory","newMandatoryFor","toggleTagDefault","newDefaultFor","toggleTagRestricted","confirmShowing","newRestrictedTo","renderSelection","audienceValues","isTypeOn","initialValues","al","showAudiences","onAudiencesChange","DropdownIndicator","IndicatorSeparator","updateTagGroups","saveNewTag","errorMssg","TagList","_draggingTagId","addTagGroup","showTagCreationModal","groupIdForNewTag","addTag","removeNewTag","onDropGroup","tagGroupID","moveTag","tg","TagAwarenessCalculator","calculate","readData","firstDate","today","numDaysInSet","daysBetween","pointDate","valueOf","setUTCDate","getUTCDate","monthIndex","getUTCMonth","getUTCFullYear","userScoreDict","alreadyReadThatDayDict","readStat","readStatDate","readStatIndex","alreadyReadThatDayDictKey","existingScoreKey","existingUserScore","usersScore","depth","previousStep","decayedPreviousStepAwareness","currentStep","numberOfUsers","currentStepAwareness","date1","date2","date1_ms","difference_ms","timeParse","extent","area","curveBasis","LineChart","curve","y0","valueline","numXTicks","xLabelGenerator","AwarenessVisualization","_barChart","_dataPoints","BLUR_FACTOR","blurDataPoints","level","processReadStatsToBuildAwarenessDataPoints","awarenessPoints","graphPoints","awarenessScore","xLabel","HighlightedNumber","marker","badIfBelow","goodIfAbove","decimalFormat","SuggestionsManager","fetchUserOrAudienceSuggestions","back","newAmountFetched","getUserSuggestions","getAudienceSuggestions","newGroupAmountFetched","previewUsersInGroup","ADGroupSyncOrEveryoneAudienceEnabled","iu","DisplayName","updateList","ig","TagSubscriptionManagerModal","toggleOptIn","optIn","updateUserList","newUserList","saveSubscriptions","BulkSubscription","tagIsRestricted","canEditTag","TagDetail","_awarenessPoints","toggleTagDisabled","currentAction","toggleTagDeleted","GetTagUsageStatus","tagUsed","handleTagDeletion","goBack","getTopAuthors","topAuthors","authorName","topAuthorsArr","toggleSubscriptionModal","showSubscriptionManagementModal","editting","downloadTopicUserList","GetTopicUserCsv","isTagReadsAndPostsFetched","fetchedTagStats","GetSpecificTagStats","fetchUsers","tagGroupId","tagName","DateFormatter","userGroups","securityGroups","fetchCategoryTagDetails","editCategoryTag","onDeleteCategoryTags","getTagForDownload","CategoryTagsFilters","enabledChecked","disabledChecked","audienceVisibleTo","onChangeEnabledFilter","onChangeCurrentLanguages","onChangeSearchText","updateAndReloadFilters","toUpdate","enabledFilter","updateStateFilter","chipDeleted","languagesListToEdit","audiencesToEdit","onUpdateSearchText","validLanguages","Languages","toAdd","CategoryTagsList","onSelectAllCategoryTags","totalCategoryTags","isCategoryTagSelected","prepareAndView","onSelectCategoryTag","createdDate","defaultAudienceNotified","onClearAllCategoryTags","getTagsForDownload","deselectCategoryTag","showCategoryTagDetails","categoryTagDetails","CategoryTagsListing","downloadAllReports","downloading","AudiencesDrawer","audiencesForList","audiencesToCheck","selectedAudiences","NewCategoryTagDialog","onCreate","visibleAudienceIds","notifyAudienceIds","visibleAudiences","categoryTagTitle","categoryTagDescription","categoryTagLanguage","categoryTagEnabled","readonly","createCategoryTag","onChangeAudiencesAccess","showVisibleAudiencesList","onChangeAudiencesNotify","showNotifyAudiencesList","onCopyAudiences","isInvalid","categoryTagTitleIsValid","categoryTagDescriptionIsValid","onRemoveAudienceAccess","onRemoveAudienceNotify","onShowVisibleAudiencesList","onShowNotifyAudiencesList","showAudiencesList","languageOptions","EditCategoryTagDialog","tagToEdit","saveCategoryTagEdit","accessAudiences","notifyAudiences","accessToSet","notifyToSet","editingTag","ToggleFilter","selectedIndex","setSelectedIndex","deleteTag","enableTag","disableTag","onDeleteCategoryTag","categoryTagAnalytics","defaultTag","accessAudience","accessCount","notifyCount","totalUsage","usageRanking","awareness","analyticsAllTime","surveyUsage","documentUsage","quickLinkUsage","mediaFileUsage","analyticsLast30","defaultViewtag","viewCategoryTag","tagToView","isLoadingDetails","setSelectedfilter","ordinals","loadTagDetails","tagToLoadId","newCategoryTag","tagToViewId","CategoryTagsManagementPage","locationTitle","ProgressiveImage","_imageReady","_mounted","imageReady","notifyImageLoaded","onImageLoaded","previewStyles","previewSrc","imageProps","imgSrc","that","postDetails","infoHeadings","authorHeadings","postInfo","basicWithHoursWithSpacing","authorInfo","lastPublishedByName","bannersSet","removeIndex","notificationsReturn","DownloadButtonv2","fallbackSentimentLabel","minVal","maxVal","normalizedScore","leftLabel","rightLabel","renderTimeString","timeSpentReading","postAnalysis","readabilityScore","readabilityText","toneNumber","personal","sentimentScore","BreakdownChart","getLeftMargin","legend","totalUniqueViews","chartData","scheme","itemTextColor","PostInsightsCharts","selectedFilterIndex","setSelectedFilterIndex","readTypeChartData","readTypeData","engagementChartData","engagementData","firstPublished","firstPublishDate","toLocaleDateString","matchesMed","matchesSmall","matchesXSmall","renderPie","switchToColumn","totalEngagement","setExpanded","CardContent","CardActions","renderCommentContent","commentAuthor","upvoteCount","totalFlagActions","commentBody","calculatePercent","firstVal","secondVal","availableReactions","activityInsights","reactionCounts","uniqueViewersWhoReacted","totalUniqueReactors","totalUniqueOpens","uniqueViewersWhoCommented","totalUniqueCommentors","rc","topComments","totalFlaggedItems","flaggedItems","ContentAnalysesSimple","accordionStates","onChangeAccordion","missingContentIssues","AnalyticsDrawer","closeDrawer","matchesXLarge","matchesLarge","keyInsightsRef","postInsightsRef","channelBreakdownRef","languageBreakdownRef","readingCompRef","complianceBreakdownRef","activityRef","isLoadingPost","setIsLoadingPost","setPostDetails","isLoadingAnalysis","setIsLoadingAnalysis","defaultPostAnalysisScores","setPostAnalysis","postAnalysisReportReady","setPostAnalysisReportReady","isLoadingDetailedInsights","setIsLoadingDetailedInsights","detailedInsights","setDetailedInsights","isLoadingInsightBreakdowns","setIsLoadingInsightBreakdowns","channelBreakdown","languageBreakdown","reportIsReady","insightBreakdowns","setInsightBreakdowns","isLoadingActivityInsights","setIsLoadingActivityInsights","setActivityInsights","isLoadingTenantAverages","setIsLoadingTenantAverages","isLoadingGlobalAverages","setIsLoadingGlobalAverages","innerWidth","windowWidth","setWindowWidth","navWidth","setNavWidth","navPage","setNavPage","showActionCommandList","setShowActionCommandList","setShowDrawer","setAllPageNum","setPubPageNum","setSchPageNum","setDftPageNum","tabNum","setTabNum","hideOpenInPortalPreviewAction","navButtons","setNavButtons","showPostEditedWarning","setShowPostEditedWaring","determinePostState","expired","determineScrollWidths","totalWidth","fetchDetailedPostInsights","fetchCompliance","GetDetailedPostInsights","firstPublishedDate","fetchPostActivityInsights","fetchComments","fetchReactions","GetPostActivityInsights","fetchPostDetails","updatedNavButtons","fetchPostAnalysis","GetFirstPublishedPostAnalysisScores","postAnalysisScores","fetchInsightBreakdowns","GetPosttInsightBreakdowns","contextNums","changedSinceFirstPublish","deletePost","usersComplied","loadingComplete","allReportsNotReady","detailedInsightsReady","breakdownsReady","renderPostInsights","allTimeSkims","allTimeReads","allTimeCompleteReads","allTimeOutlierReads","first7DaysSkims","first7DaysReads","first7DaysCompleteReads","first7DaysOutlierReads","first30DaysSkims","first30DaysReads","first30DaysCompleteReads","first30DaysOutlierReads","allTimeUpvotes","allTimeComments","allTimeReactions","first7DaysUpvotes","first7DaysComments","first7DaysReactions","first30DaysUpvotes","first30DaysComments","first30DaysReactions","allTimeTotalViews","renderChannelBreakdown","viewsOnPlatform","renderLanguageBreakdown","viewsOnLCID","renderComplianceBreakdown","usersNotViewedNotComplied","usersViewedNotComplied","totalCompliedUsers","GetComplianceReportCSV","totalSubscriberCountAtPublishTime","keyInsights","allTimeUniqueOpens","reachableUsersAtPublishTime","totalUniqueInteractions","navButtonsToScroll","backToTarget","editable","SendUserReadReportRequest","ReportTypes","UserReadReport","scrollIntoView","block","scrollToView","averageTimeSpentReadingUI","ChipListInput","textFieldProps","onRemoveChip","onAddValidatedChips","errorProps","containerSx","innerInputValue","setInnerInputValue","setShowError","handleAndValidateInputValue","inputValue","allValues","valuesToAdd","valuesLeft","newInnerInputValue","isValueValid","uniqueValidValues","cleanedInputValue","MediaPreviewer","setVideoId","setVideoPreviewUrl","setVideoRef","keywordsChipListValue","setKeywordsChipListValue","removeKeywordFromList","keywordNameToRemove","setAndSortChipListValue","newKeywordsList","onPreviewClose","onNameEdit","mt","onKeywordsChange","ImageGallery","chonkyImageData","mediaFile","fetchSingleImage","setImageKeywords","SetImageKeywords","ExternalLayout","RedirectToDashboard","tenant_id","RedirectToHome","RedirectToWelcome","leftCol","rightCol","form","formContainer","engageText","whatsNew","poweredByContainer","monomark","monomarkWhite","monomarkRed","engageContainer","needHelp","linksContainer","font10","helpLinks","isBootstrapSmallAndAbove","isBootstrapExtraSmall","stopFont10","useFont10Small","useFont10Large","useFont10","poweredByText","iconClass","primaryButton","picker","buttonLink","tenantOpts","setTenantOpts","selectedTenantId","setSelectedTenantId","loadTenants","backspaceRemovesValue","checkTenantId","SetTenantId","getMSALRedirectConfig","signedOutSuccess","redirectConfig","tryLoginAsync","isInIFrame","opener","renderWhen","FlaggedListItem","openPost","commentItem","flaggingLastIgnoredAt","parentText","parentAuthor","flagActionsSinceLastIgnored","ignoreClick","processingIgnore","processingDelete","moderationEnabled","deleteClick","FlaggedItemsManagement","fetchingItems","fetchingSettings","threshHoldCrossed","fetchFlaggedItems","GetFlaggedItems","IgnoreFlaggedItem","processingIgnoreAction","updatedFlaggedList","IgnoreFlag","processingDeleteAction","itemData","ActivityManagementPage","WarningHover","labelText","getRoleName","permissionDetails","onOpenDrawer","created","getAccountType","dataDetails","postViews","eventViews","eventReads","InputPrefixField","prefix","setVerify","removeLeftoverCountryCode","PhoneInputField","isVerifyDisabled","setVerifyDisabled","inputClass","inputStyle","searchStyle","dropdownStyle","autoFormat","enableSearch","specialLabel","changedDescription","onVerifySms","PasswordInputField","showPassword","setShowPassword","onMouseDown","PronounsInputField","pronouns","CustomPronouns","selectedPronouns","setSelectedPronouns","firstPronoun","setFirstPronoun","secondPronoun","setSecondPronoun","thirdPronoun","setThirdPronoun","onChangeValue","updatedPronouns","pronoun","ProfileDetails","checkShouldShowTopicsOption","checkShouldShowAudiencesOption","removeAudience","audienceToRemove","onChangeBio","onChangeUser","bio","onChangeCountry","onChangeFirstName","onChangeLastName","onChangePassword","onChangeEmployeeId","onChangePreferredSMSPhone","onChangePronouns","onChangeRegion","onChangeReportsTo","officeLocation","sendSMSVerifyMessage","onSMSVerifyMessage","showMoreTopics","showMoreAudiences","standardDetails","localId","showTopicsOption","subscribedTags","showAudiencesOption","customDetails","errorFirstname","errorLastname","isWorkAccount","isLocalIdValidEmail","errorPassword","includableAudiences","customDetail","UnableToEditMessage","MoreUserProfileOptions","deleteUser","enabledStatus","enableUser","disableUser","updatePermissions","resolveCurrentUserTags","allTags","freshClone","setSelectedRole","selectedTags","setSelectedTags","userClone","setUserClone","securityDetails","isSubmissionManager","setIsSubmissionManager","changesMade","currentUserTopics","selectedTagIds","closeDrawerAndDisableUser","savePermissions","userToSave","isMissingInput","saveButton","defaultChipLabel","getSubmissionManagerSection","UserProfilePage","onBackToManageUsers","onClearMessage","saveChanges","updateAudiencesForUser","ResetLocalUserPassword","applyAudienceChanges","openDrawer","sendSMSVerify","GetUserById","GetIncludableAudiences","updateUser","ToolboxButton","downloadCsv","MessagingCenterSMSTab","navigateToSettings","userSMSStats","reportRequestState","setReportRequestState","totalMobileNumbers","optedIn","pendingOptIns","optedOut","invalidNumbers","SendSMSReportRequest","SMSNotificationReport","TextAreaLanguageSelector","AudienceCalloutSelector","userAudiences","previousAudiences","handlePopupClick","onSelectAudienceClick","textBubbles","setSelectedAudiences","setAudienceSearchText","allAudiences","audienceSelector","filteredAudience","modifySelectedAudiences","SmsBlastModal","SendBlast","blast","textBlastSelected","onBlastSuccess","handleSMSType","massConsentSelected","reinviteSelected","showAudiencePicker","disabledButton","MessagingCenterTeamsTab","userTeamsStats","registeredUsers","MessagingCenterMobileTab","userMobileStats","activeDevices","usersWithApp","usersWithNoDevice","MessagingCenterScreen","handleTabChange","showSmsModal","onBlastClose","shouldShowSuccessfulBlastDialog","closeSMSBlast","smsTabActive","MessagingTabs","SMS","teamsTabActive","mobileTabActive","audienceBubbles","ExternalUsersLobbyView","trimIssuerName","fetchLobby","GetExternalUsersLobby","lobbyUsers","deleteRequest","objectId","DeleteExternalUserRequest","infoAlert","processingGrant","grantAccess","GrantExternalUserAccess","mapExternalAuthToIcon","issuerName","createdDateTime","NewNavigationItem","fetchNavigationPortalPages","getNavigationPortalPages","pagesList","onSelectPortalPage","portalPage","sequence","createNewNavigationItem","onHidePagesList","onShowPagesList","defaultListingPage","selectedPortalPage","NewChildNavigationItem","parentNavigationItem","createNewChildNavigationItem","ListItem","showChildItems","setShowChildItems","isHome","onUpdateSequence","parentSequence","onSetAsParent","NavigationItemsList","onDeleteNavigationItem","onSetNavigationItemAsParent","onUpdateNavigationItemSequence","deleteNavigationItem","setNavigationItemAsParent","updateNavigationItemSequence","NavigationItemsListing","fetchItems","getNavigationItems","NavigationItemsManagementPage","globalComponent","GlobalComponent","GlobalComponentsDrawer","onSelectNavigationItems","hideGlobalComponents","showGlobalComponents","showNewPortalPage","AudiencesList","NewPortalPageDialog","onNext","isChecking","checkIfUrlExists","pageUrl","exists","pageUrlIsValid","urlErrorMessage","createNewDraft","onChangePageTitle","pageTitleIsValid","onChangePageUrl","hideNewPortalPage","onRemoveAudience","onShowAudiencesList","deleteDraft","deletePortalPage","disablePortalPage","enablePortalPage","publishDraft","setPortalPageAsHome","onPreviewPortalPage","hasPendingDraft","ModifyPortalPageSettingsDialog","convertAudienceIdToAudience","savePageDetails","modifyDraftDetails","updateDraft","modifyPortalPageDetails","ModifyPortalPageTitleDialog","modifyDraftTitle","modifyPortalPageTitle","PortalPagesFilters","currentFilter","publishedFromDate","publishedToDate","onClearCurrentFilter","onChangeCurrentFilter","background_image","image_alignment","background_color","overlay_color","overlay_opacity","banner_text","banner_fields","BannerBlock","BANNER_TEMPLATE","defaultItem","fields","popover","popoverPaper","popoverSubPaper","expandNavigation","SubItemListItem","showClickablePopover","setShowClickablePopover","closePopover","openPopover","isInEditMode","Item","popoverAnchor","togglePopover","Items","NavigationItems","MORE","portalPageId","portalPageJson","sourceDraftId","Navigation","NavigationBlock","ShareContentMapType","PluginSpacing","QuickPostBanner","isQuickPost","ReadDate","hideWhenRead","unread","ReadingTime","hideReadTime","simple","minuteLabel","secondLabel","formatReadingTime","reactionSystem","Topics","Tile","cardCount","onPostSelected","backgroundImageUrl","excerptToDisplay","excerpt","hideStats","hidePublishTime","hideReadDate","hideSummary","hideTopics","LoadMoreButton","onFetchMore","FeedButtons","inCard","viewAll","loadMore","Column","Window","useTranslatableContent","DEFAULT_RESTRICTED_BANNER","restrictedBannerColor","restrictedBannerEnabled","restrictedBanner","bannerColors","hasBanner","hasTwoIcons","isComplied","List","LabelledIconButton","ChannelSelection","generateMailTo","encodedSubject","encodedBody","mailToUrl","getDefaultEmailSubject","contentTitle","getDefaultEmailBody","createBodyAndEncode","shareUrl","PublicShareScreen","snackbarOpen","setSnackbarOpen","snackbarText","setSnackbarText","validShareUrl","customShareUrl","headerLabel","linkDetails","CustomShareLink","PortalPostPublic","setSnackbarAndText","onLinkRequested","getShareLinkAnonymous","encodedPostBody","encodedTweetBody","EmailOutlined","clipboard","writeText","ContentProps","FeedLayout","sharePointShareLabel","portalShareLabel","teamsShareLabel","portalShareEnabled","teamsShareEnabled","sharepointShareEnabled","portalUrl","getInitialChannelPreference","Portal","getShareLinkAndUpdateSnackbar","copyFinishedText","getShareLink","copyLinkRef","selectedPlatform","setSelectedPlatform","portalLabel","sharePointLabel","teamsLabel","allChannelsDisabled","onChannelSelected","fetchShareTypeEnum","targetPlatform","TeamsPost","SharePointPost","PortalPost","TeamsEvent","SharePointEvent","PortalEvent","contentStyling","linkToOpen","rotate","shareOptionsOpen","setShareOptionsOpen","shareRef","onShow","isPublic","togglePublicShare","toggleInternalShare","currentUserPreferredLCID","shareUrlsEnabled","configTenantId","setPost","internalShareOpen","setInternalShareOpen","publicShareOpen","setPublicShareOpen","postRef","getPublicPost","GetPublicPost","SendPublicPostOpenedEvent","getPrivatePost","SendPostOpenedEvent","initialLoad","newPost","SendPublicPostClosedEvent","SendPostClosedEvent","getTranslatedField","isPostNotificationsActive","userCommentNotificationSettings","dialog","DialogContentView","close","DialogPostView","CardType","EmptyFeed","PostFeed","onViewAll","lockedToTopics","defaultPostFeedFilter","fetchFeed","lockSubscriptions","lockedTags","postsToFetch","fetchPostsFeed","selectPost","selectedPostId","unselectPost","hideLoadMore","HorizontalBand","getLayout","hideViewAll","StackedCard","FetchPostsFeedLocal","contentHeaderTemplate","ignoreSubscriptionsTemplate","lockedToTopicsTemplate","numberOptions","tileNumberTemplate","layoutTemplate","layoutOptions","stylingTemplate","tiles","contentOptionalData","optionalDataTemplate","postData","docsData","eventsData","NewsFeed","columnCount","hide_publish_time","hide_stats","hide_summary","hide_topics","hide_load_more","hide_view_all","ignore_subscriptions","locked_to_topics","max_results","post_types","NewsFeedBlock","NEWS_FEED_TEMPLATE","Text","TextBlock","FETCH_HEIGHT_FTN","CustomWidget","setHeight","iframeRef","htmlInput","fetchHeight","iframe","iFrameContent","contentWindow","requestHeightMeasurement","sandbox","srcDoc","Attendance","isCurrentUserAttendingInPerson","isCurrentUserAttendingOnline","isCurrentUserNotAttending","isCurrentUserOnWaitlist","EventInfo","hideRestrictedIcon","hideStartDate","hideUnreadStatus","excerptLength","getTitle","lastViewTime","onEventSelected","showReadingStatus","cardType","ViewOptions","my","myEventResponses","past","upcoming","SignUp","currentSignUpText","isResponseEditable","SignUpForm","onSignUp","isCurrentUserAttending","currentUserResponse","isInPersonAvailable","isOnlineAvailable","isWaitlistAvailable","infoMessage","proppedGetEvent","showSignUpOptions","setShowSignUpOptions","newLcid","sendEventOpenedEvent","sendEventClosedEvent","newEvent","optionalEventContent","eventFeed","onClickEvent","optionalContent","SectionType","fetchEventFeed","setEvents","setCanLoadMore","selectedEventId","setSelectedEventId","currentFilters","defaultEventsFeedFilter","resetRefresh","refresh","newEvents","selectEvent","unselectEvent","horizontalBandLayout","Horizontal","Stacked","getEventSection","EventsFeedBlock","setRefresh","event_types","EVENT_FEED_TEMPLATE","ShareUtil","getPortalUrl","articleId","isCopying","setIsCopying","handleShare","documentId","onCloseSnackbar","AlertTitle","DocumentActionButtons","onInspectDocument","Document","onDocumentSelected","optionalSettings","hideFileIcon","processedTitle","MAX_DOC_TITLE_LENGTH","isUpdated","getDocumentTitle","hideCategoryTags","isUnread","hideActionIcons","VIEWABLE_FILE_TYPES","DocumentActions","updateAction","GetDocumentFile","openInNew","view","lastUpdatedDate","handlePreview","onViewDocument","handleDownload","getPreviewButton","canPreview","marginY","getDialogFooter","setDocumentFeedFilters","fetchDocumentFeed","getDocumentFeedLocal","setDocuments","isLoadingMore","setIsLoadingMore","isLoadingFile","setIsLoadingFile","setSelectedDocument","defaultDocumentFeedFilters","lockedToCategoryTags","ct","newDocs","DocumentsFeedBlock","locked_to_category_tags","hide_action_icons","hide_category_tags","hide_file_icon","styling","DOCUMENT_FEED_TEMPLATE","COMPONENT_TEMPLATES","EventsFeed","DocumentFeed","Section","_template","OneColumnBlock","column_1_data","TwoColumnsBlock","leftColumnClassName","rightColumnClassName","ratio","column_2_data","ThreeColumnsBlock","column_3_data","hr","column_styling_label","column_1_components_and_styling","column_2_components_and_styling","one_column_template","itemProps","two_columns_template","three_columns_template","setSelectedPostId","page_sections","page_section","portalPagesListItem","PortalPagePreview","onShowPortalPageDetails","onShowPortalPageTitle","PortalPagesList","formatModifiedTime","hasBeenPreviouslyPublished","onSelectAllPortalPages","totalPortalPages","isPortalPageSelected","onPreviewClickedPortalPage","onClearAllPortalPages","lastModifiedTime","isOnlyHomeSelected","onEditPortalPage","onEnablePortalPage","onDisablePortalPage","onDeletePortalPages","onClonePortalPage","validDeletionItems","deletePortalPages","portalPageDetails","onHidePortalPageDetails","showPortalPageDetails","onHidePortalPageTitle","showPortalPageTitle","PortalPagesListing","PORTAL_PAGES_VISITED","PortalPagesManagementPage","BackToManagePortalPagesDialog","hideBackToPortalPages","saveDraft","showBackToPortalPages","GoToNavigationItemsDialog","hideGoToNavigationItems","showGoToNavigationItems","PublishChangesDialog","hidePublishChanges","showPublishChanges","PublishDialog","isFetchingImage","showModifyPortalPageDetails","showModifyPortalPageTitle","setShowPublishDialog","useCMS","pageConfig","reset","onSubmit","useForm","usePlugin","MuiCheckbox","Label","setShowImageGallery","fullsizeImage","meta","MuiToggle","setShowModifyPortalPageDetails","setShowModifyPortalPageTitle","PercentageSlider","Slider","marks","valueLabelDisplay","SectionLabel","SelectItems","setSelectedItems","TinyMCE","Setup","cms","TinaCMS","sidebar","__type","CommandBar","EditNavigationItems","PageDetails","SelectTopics","SelectCategoryTags","useCustomPortalPageCssContent","isLoadingCss","setIsLoadingCss","customCssState","fetchingCss","fetchCustomCss","useLoadCustomCssStyles","isLoadingStyles","setIsLoadingStyles","linkEl","PortalPagesEditor","PortalPagesCreation","onChangePortalPage","shouldUpdateDraft","lastReadDate","documentFeed","alignment","DocumentFeedFilters","hasNoFilters","setDocumentFeedLayout","hideAnchorEl","customTab","flexContainer","RoundedTab","RoundedTabs","TabIndicatorProps","allowScrollButtonsMobile","Views","onChangeView","changeSort","clearDocumentFeed","changeView","continueFetching","selectedDocumentId","updateDocumentFeed","downloadDocument","getDocumentFeed","selectDocument","inspectDocument","unselectDocument","viewDocument","onCloseRequestAccess","showRequestAccess","onShowRequestAccess","getDocumentDetails","hideDocumentFeedFilters","tagCounts","Filters","tagEventCounts","getTagEventCounts","availableTag","ListSubheader","disableSticky","EventFeed","useOpenMobileAppBanner","isMobile","shouldShow","getMobileAppBannerClosed","PageNotFound","getNavigationItemByURL","portalPageUrl","setNavigationItem","getNavigationItemByPortalPageURL","tagPostCounts","getTagPostCounts","clearPostFeed","clearPostFeedFilters","HomePage","PublicFeed","GetPublicFeed","PublicNewsletterUnsubscribedPage","SelectField","DialogSelectField","DialogSwitchField","PhoneField","currSecondStyles","disableDropdown","disabledDropDown","PreferredSMSPhoneDialog","setPreferredSMSPhone","hasChanges","commentNotificationSettings","sendNotificationsWhenAuthor","onChangeChatEnabled","onChangeCommentNotificationSettings","onChangePreferredSMSConsent","onShowPreferredSMSPhoneDialog","showPreferredSMSPhoneDialog","onChangeSendNotificationsWhenAuthor","onReset","onHidePreferredSMSPhoneDialog","commentNotificationsEnabled","postCommentCreatedTeamsAttempt","postCommentCreatedMobileAttempt","showCommentOptions","TagSubscriptions","onChangeSubscribedTags","onSelectTag","subscribedTag","onSelectTagGroup","tagGroupDisabled","Preferences","getNotificationsDescription","onChangePreferredLCID","onCloseEditNotifications","showEditNotifications","onCloseEditTopicSubscriptions","showEditTopicSubscriptions","onShowEditNotifications","onShowEditTopicSubscriptions","onShowLessTopics","onShowMoreTopics","onCheckEmptyField","InputSwitchField","setDisabled","onClear","onCheckEmptyFirstName","onCheckEmptyLastName","onChangeNickname","onClearNickname","showVerifySuccessMessage","showVerifyErrorMessage","showPreferredSMSPhoneMessage","localIdToDisplay","isSocialUser","isSparrowLocalUser","UserPage","client","checkIcon","Invitation","tenantIdQueryParam","isResetPasswordQueryParam","expiryLink","setExpiryLink","isResending","setIsResending","resentSuccess","setResentSuccess","resentError","setResentError","loadingComponent","GENERIC_ERROR_MESSAGE","INVITE_USED_ERROR_MESSAGE","isPasswordResetLink","INVITE_DOESNT_EXIST_ERROR_MESSAGE","INVITE_EXPIRED_ERROR_MESSAGE","onRequestNew","resendSparrowAccountPasswordResetLink","resendSocialInvite","getExpiryLink","isExists","validateToken","isUsed","localStorage","getErrorMessage","maskedEmail","AuthRedirectHandler","handlingRedirectResponse","setHandlingRedirectResponse","setRedirectTo","jsonStr","PageForbidden","AdminPageForbidden","NoticeWebpage","imageComponent","titleComponent","bodyComponent","buttonComponent","AccessRestricted","ReportExpired","expiryDays","reportExpiryDays","reportId","reportInfo","setReportInfo","reportString","setReportString","setIsRestricted","setIsExpired","firstLoad","setFirstLoad","processDownload","reportData","isBinaryFile","SetReportDownloaded","GetReportInfo","GetReportForDownload","resultData","TextDecoder","decode","AdminPageNotFound","NewTenantCreationDialog","firstNameValid","setFirstNameValid","lastNameValid","setLastNameValid","setEmailValid","tenantNameValid","setTenantNameValid","azureTenantIdValid","setAzureTenantIdValid","onUpdateTenantName","onUpdateFirstName","onUpdateLastName","onUpdateEmail","onUpdateAzureADTenantId","disabledCreate","NewTenant","setShowDialog","disableCreate","setDisableCreate","setTenantName","azureTenantId","setAzureTenantId","emailNotValid","setEmailNotValid","tenantNameNotValid","setTenantNameNotValid","azureTenantIdNotValid","setAzureTenantIdNotValid","tenantDetails","TenantFilterButtons","onCloseFilters","onChangeSearch","TenantManagementPage","exact","useMobileConfig","mobileConfig","setMobileConfig","isError","setIsError","getMobileConfig","fetchMobileConfig","HomeScreenTypeSelect","showFeed","feedHeader","publishedBandsCount","onChangeShowFeed","onChangeScreenType","onChangeFeedHeader","isHeaderFocused","setIsHeaderFocused","HomeScreenSettingsForm","SET_HEADER_TEXT","showMyFeedBelowContentBands","SET_SHOW_FEED_BELOW","homeScreenType","newType","SET_HOME_SCREEN_TYPE","HomeScreenSettings","pristineConfigs","currConfig","RESET_CONFIGS","deepStrictEqualWrapper","actual","expected","deepStrictEqual","AssertionError","arraysEqual","array1","array2","ContentBandsButtons","isUnpublishedChanges","comparableContentBands","comparablePublishedBands","EditOutlined","useHomeScreenConfigs","fetchHomeScreenConfigs","Loading","ContentBandCard","heroUrl","leftInfo","rightInfo","rightHeroBadge","leftHeroBadge","fullTitle","usableTitle","ContentBandWindow","usableConfig","linearGradient","getBackgroundStylesForSize","ContentBandCarousel","autoPlay","getPostTypeBanner","getLeftInfo","itemCount","activeIdx","setActiveIdx","isPosts","timeoutHandler","prevIndex","onPrev","numDots","onClickDot","ContentBandCarouselItem","isItemHovered","setIsItemHovered","containerRef","itemHorizontalMargin","isSm","getOverlayInfo","truncateTitle","getHoverArrowButtonsProps","bgcolor","newWidth","getTransformBy","Dots","ContentBandCardSeeMore","Skeleton","ContentBandWindowSeeMore","SeeMoreButton","ContentBandLayoutPreview","scrollId","isTitleGreaterThanTwoLinesOnCard","numberOfLines","getComputedStyle","calculateNumberOfLines","shouldStretch","seeMoreOffOnce","scrollLeft","getWindow","getCard","getBaseProps","ContentBandsMobilePreview","ContentBandsTeamsPreview","ContentBandsPreview","getPreviews","ConnectedManageHomeScreenSettings","isAfterPublish","fetchContentBandsContent","setFetchContentBandsContent","isPreviewOpen","setIsPreviewOpen","isLoadingMobileConfig","isLoadingHomeScreenConfigs","isLoadingBands","contentBandsSuccess","confirmHomeScreenTypes","setConfirmHomeScreenTypes","isLoadingState","notContentBandsTypes","useLayoutEffect","saveHomeScreenConfigs","getConfirmHomeScreensTitle","getConfirmHomeScreenTypeContent","ContentBandsEditorActions","isDirty","onToggleSettingsPanel","onDiscard","isPreviewDisabled","isPublishedDisabled","isSaveDisabled","isDiscardDisabled","DrawerWithBookmarkButton","showBookmark","SlideProps","ContentBandsSettingsPanel","gradientColor","headerTextColor","pristineGradientColor","pristineHeaderTextColor","onSetGradientColor","onSetHeaderTextColor","toggleOpen","isHeaderColorPickerVisible","setIsHeaderColorPickerVisible","isGradientColorPickerVisible","setIsGradientColorPickerVisible","getResetButton","newHex","AutoPlayCarouselInput","ContentCountInput","isCarousel","MozAppearance","ContentTypeInput","DisplayFullTitlesInput","EnableSeeMoreInput","IgnoreSubscriptionsInput","LayoutInput","useAnchorEl","useDragReorder","draggedIdx","dropZoneClassName","mouseHandlerComponentClassName","mousePos","setMousePos","dropIdx","setDropIdx","mouseHandlerComponent","mouseMoveHandler","mouseUpHandler","idxToUse","absDifferences","abs","dropItemForward","startPosition","endPosition","dropItemBackward","ContentSearchResultItem","itemIsButton","isFloating","DragIndicator","ContentSearchResultList","pageCount","emptyMessage","onPage","handleIntersect","observer","intersectionRatio","disconnect","getItemId","IntersectionObserver","rootMargin","threshold","secondLastIdx","secondLastItem","domEl","observe","floatingResult","floatingId","ContentSearch","autoSearch","autoSearchWaitSeconds","searchPerformedByEnter","onHandleSearch","newResults","getTextFieldComponent","disableAutoFocus","PinInput","hasFetched","isDrawerOpen","setIsDrawerOpen","isPost","itemIds","dragId","setDragId","maxPinnedReach","fetchPinned","getEventOverview","pageToUse","includeImageUrl","getPagedPosts","includeExpired","pageItem","getPagedEvents","onCalloutClose","onDrawerClose","internalIds","plural","getCountLabel","newPinned","onUnpin","dragIdCopy","currDraggedIdx","droppedIdx","dragged","ReadStatusInput","Read","Unread","SortByInput","MultiselectMui","TypesInput","types","isEvent","TopicInput","filtered","tagToRemove","EVENT_TYPES","ContentBandSettingsForm","userTagGroups","ContentBandEditor","onCopy","setActiveBand","previousBand","isRefreshable","setIsRefreshable","isAnyActionButtonClicked","nodeName","ContentCopy","HoverAddButton","ContentBandsMainEditor","languageInfo","setDraggedIdx","confirmClearTranslate","setConfirmClearTranslate","confirmMultipleLanguagesTranslate","setConfirmMultipleLanguagesTranslate","confirmRemoveLanguage","setConfirmRemoveLanguage","isTranslateEnabled","contentBandHasFilledHeader","contentBandOffset","scrollToContentBand","draggedIdxCopy","onAddContentBandClick","getAddContentBandButton","needToAdd","onConfirmClearTranslate","onConfirmTranslateFrom","fromLcid","toLcid","translateText","Translations","onClickBandArea","onInsertContentBandClick","keep","ContentBandPublishSettings","getSetting","isOn","bandTypes","isCards","isWindow","CONTENT_BAND_LAYOUT_TYPE_MAP","card","READ_STATUS_MAP","SORT_STYLE_MAP","getContentBlurb","userTag","getTopicChips","ContentBandsOneLastCheck","MobileWarningOverlay","backMessage","actionMessage","onActionClick","EditNote","ConnectedContentBandsEditorPage","confirmUnsavedChangesOpen","setConfirmUnsavedChangesOpen","confirmDiscardChanges","setConfirmDiscardChanges","isOneLastCheckOpen","setIsOneLastCheckOpen","useAuthoringTags","mobileOverlayOpen","setMobileOverlayOpen","mobileWarningClosedOnce","isContentBandsLoading","usablePristineConfig","onBackToMobileAppSettings","goBackToMobileAppSettings","postPublish","onToggleDrawer","onCloseConfirmUnsavedChanges","closeMobileOverlay","newColor","MoreOptionsEmail","onDownloadEmailActivityLog","onDownloadEmailOutbox","onClickManageSenderEmails","EmailFilters","onInnerClearFilters","EmailOptions","onDownloadEmailActivity","onEditEmail","onPreviewEmail","onDuplicateEmail","onDeleteEmail","onUnsendEmail","EmailsTable","showIsLoading","handleDraftEmailClick","EmailSortStyle","SubjectAsc","SubjectDesc","LastModifiedTimeAsc","SentTimeAsc","LastModifiedTimeDesc","SentTimeDesc","LastModifiedByAsc","SentByAsc","LastModifiedByDesc","SentByDesc","FromSenderAsc","FromSenderDesc","subjectVal","formatSubject","lastModification","modifiedTime","modifiedBy","UseSetSnackbarMessages","SET_ERROR_MESSAGE","setInfoMessage","SET_INFO_MESSAGE","personalizationTokenMapper","tokenValue","replaceText","PersonalizationTokenValue","UserFirstName","UserLastName","replaceTextPersonalizationTokens","subjectText","EMAIL_PERSONALIZATION_TOKENS","personalizationTokenText","MERGE_TAG_PREFIX","MERGE_TAG_SUFFIX","replaceValue","EmailContentView","getFormattedSentTime","EmailPreview","fetchAllPages","defaultEmailFilterValues","setIsLoadingPreview","emailToPreview","setEmailToPreview","showDeleteEmailDialog","setShowDeleteEmailDialog","showUnsendEmailDialog","setShowUnsendEmailDialog","emailIdToDelete","setEmailIdToDelete","emailIdToUnsend","setEmailIdToUnsend","setIsDeleting","isUnsending","setIsUnsending","resetDeleteEmailStates","resetUnsendEmailStates","emailToDisplay","cloneEmail","deleteEmail","cancelSend","EmailsListing","DEFAULT_DRAFT_EMAIL_FILTERS","draftEmailListFilters","setDraftEmailListFilters","DEFAULT_SCHEDULED_EMAIL_FILTERS","scheduledEmailListFilters","setScheduledEmailListFilters","DEFAULT_SENT_EMAIL_FILTERS","sentEmailListFilters","setSentEmailListFilters","fetchDraftEmailList","fetchScheduledEmailList","fetchSentEmailList","setConfig","modelStateSaveErrors","setModelStateSaveErrors","savingConfig","setSavingConfig","configDigest","getAsyncConfig","SentEmailDialog","showSenderEmailDialog","setShowSenderEmailDialog","isLoadingAssocNewsletters","setIsLoadingAssocNewsletters","setShowAssociatedNewslettersDialog","SendEmailActivityReportRequest","onDownloadReport","PersonalizationTokenButton","menuPaperRef","EmailEditor","updateEmail","bodyValue","innerSubjectValue","setInnerSubjectValue","oldSubjectText","setOldSubjectText","setShowIcons","textFieldRef","tokenMenuPaperRef","subjectIsBlurred","focussedElement","activeElement","updateTranslatedTextField","translatedText","getMergeTagStartAndEndDelimiter","cursorStartPos","selectionStart","cursorEndPos","selectionEnd","startDelimiter","endDelimiter","onChangeSubjectText","newSubjectText","newTranslatedText","onChangeSubject","setInnerSubjectValueText","newSubject","startEndDelimiters","currentInnerSubjectValue","setSelectionRange","textToInsert","start","end","setRangeText","dispatchEvent","verify_html","newBodyText","DownloadRecipientsButton","audienceCount","isDownloadingRecipients","loadingCirleOnRight","useDownloadRecipients","setIsDownloadingRecipients","downloadRecipients","getRecipientsReport","useAudienceCount","constantAudienceCount","setAudienceCount","isFetchingAudienceCount","setIsFetchingAudienceCount","getAndSetAudienceCount","RecipientCountDownload","onSaveEmail","defaultAudienceCount","isFetchingDefaultAudienceCount","innerAudienceCount","innerIsFetching","SendTestEmailInput","isSendingTestEmail","onClickSendTestEmails","setEmailAddressesForTest","addr","validEmails","FormHelperTextProps","EmailValidationTextField","replyEmailInnerValue","setReplyEmailInnerValue","isReplyEmailFieldFocussed","setIsReplyEmailFieldFocussed","isReplyEmailFieldInvalid","AddressSelect","formControlClassName","selectedFromSender","onChangeAddress","selectedEmailIdx","truncateText","newAddrIdx","newSelectedAddress","EmailSettingsPanel","fromEmailAddresses","setIsSendingTestEmail","setShouldSendTestEmails","testEmail","isClear","audienceFooter","EmailAuthoringEditorActions","isSendDisabled","isToggleSettingsPanelDisabled","EmailOneLastCheck","normalizeHtml","htmlText","normalizedHTML","DOMParser","parseFromString","getEmailSenderConfig","NewsletterActions","AudienceActions","showUnsavedWarning","setShowUnsavedWarning","setFromEmailAddresses","configFetched","setConfigFetched","showDiscardDialog","setShowDiscardDialog","showOneLastCheck","setShowOneLastCheck","isSendingEmail","setIsSendingEmail","setShouldOpenOneLastCheck","showEmailSentConfirmation","isEmailIdPresent","isEmailValid","emailRequiresValidFromAddress","getAndSetInitialConfig","hasEmailUpdated","updatedEmailFields","newSentTimeString","newHtmlText","originalHtmlText","updatedEmail","newAudience","newAudienceIds","originalAudienceIds","originalAudIdSet","audienceIsEqual","checkIfChanged","manageEmailsUrl","redirectToManageEmails","onClickSend","saveEmail","ShortcutsHeaderButtons","onCreateShortcutGroupClick","onCreateShortcutClick","onOrganizeListClick","ShortcutsToolbar","selectedShortcuts","selectedShortcutGroups","onClearSelectedShortcuts","onMoveSelectedShortcuts","onSelectedShortcutsStateChange","onDeleteSelectedShortcuts","onEditSelectedShortcut","totalSelected","CheckboxDropdown","updatedValues","getUpdatedValues","onClickOption","AudienceSearchCallout","availableAudienceIdNames","onAudienceFilterChange","ShortcutsFilter","shortcutsFilter","textSearchValue","setTextSearchValue","onApplyInternalFilters","onTextFilterChange","onDeleteSearchText","stateToRemove","onRemoveStateFromFilter","onRemoveAudienceFromFilter","allShortcutStates","aId","ShortcutsTableListHeader","isFirstColumn","SHORTCUTS_HEADER_CELLS","createColumnHeader","MoreShortcutGroupOptions","shortcutGroupToShortcuts","onShortcutGroupAction","atLeastOneEnabled","ShortcutGroupAction","ADD_SHORTCUT","EDIT","DISABLE_ALL","ENABLE_ALL","DELETE","ShortcutLeadingCell","shortcut","onEditShortcut","onSelectShortcut","wrap","MoreShortcutOptions","onShortcutAction","ShortcutAction","MOVE","DISABLE","ENABLE","CollapsibleTableCell","tableCellClassName","tableCellProps","CollapsibleEmptyCheckBoxCell","CollapsibleTableRow","tableCellElements","rowKey","rowRefs","ShortcutRow","shortcutRowContent","aud","MAX_URL_LENGTH","ShortcutsGroupRow","onSelectGroup","onToggleExpand","shortcutsInGroup","isShortcutGroupSelected","sg","rowRef","WebkitLineClamp","TOTAL_NUM_OF_COLUMNS_SHORTCUTS","ShortcutsList","onChangeSelectedShortcuts","onChangeSelectedShortcutGroups","expandedShortcutGroups","setExpandedShortcutGroups","esgId","onSelectShortcutGroup","shortcutsFromShortcutGroup","sfsg","stickyHeader","gId","DialogField","fieldWidth","GRID_ROW_WIDTH","fieldLabelGridClassName","fieldInputGridClassName","fieldInput","AutocompleteSearch","searchableItems","currentItem","itemListHeight","maxItemsVisible","placeholderText","isLoadingText","LIST_ITEM_HEIGHT","ITEMS_VISIBLE","selectOnFocus","forcePopupIcon","ListboxProps","isOptionEqualToValue","renderTextInput","getOptionLabel","renderOption","loadingText","ShortcutGroupSearch","shortcutGroupValue","onChangeShortcutGroupValue","allShortcutGroups","isUrlValid","TextFieldWithInputCounter","ShortcutDialogBody","setInput","innerUrlVal","setInnerUrlVal","selectedShortcutGroup","inputAudienceSimpleTags","onBlurUrl","urlVal","MAX_SHORTCUT_NAME_LENGTH","newGroup","defaultChecked","DialogSkeleton","onDialogActionButtonClick","dialogActionButtonLabel","disableActionButton","dialogActionButtonClassName","dialogPaperClassName","dialogContentClassName","ShortcutDialogSkeleton","defaultShortcut","disableActionButtonIfInputNotChanged","previousShortcutInput","shortcutInput","setShortcutInput","hasShortcutInputChanged","isNotFilled","EditShortcutDialog","onUpdateShortcutFromInput","ShortcutGroupDialogSkeleton","extraDialogField","dialogFieldLabel","previousInternalShortcutGroupName","internalShortcutGroupName","setInternalShortcutGroupName","MAX_SHORTCUT_GROUP_NAME_LENGTH","EditShortcutGroupDialog","onEditShortcutGroupFromInput","MoveShortcutsDialog","selectedGroup","setSelectedGroup","DeleteShortcutsDialog","shortcutsToDelete","shortcutGroupsToDelete","setDialogTitle","shortcutGroupBodyText","setShortcutGroupBodyText","shortcutBodyText","setShortcutBodyText","dialogBodyShortcutGroup","dialogBodyShortcut","shortcutGroupPlural","shortcutPlural","setDialogTitleAndBody","ShortcutsListing","onCreateShortcut","setSelectedShortcuts","setSelectedShortcutGroup","selectedSingleShortcut","setSelectedSingleShortcut","setSelectedShortcutGroups","selectedShortcutsToDelete","setSelectedShortcutsToDelete","hiddenSelectedShortcuts","setHiddenSelectedShortcuts","showEditShortcutDialog","setShowEditShortcutDialog","showEditShortcutGroupDialog","setShowEditShortcutGroupDialog","showMoveShortcutsDialog","setShowMoveShortcutsDialog","showDeleteShortcutsDialog","setShowDeleteShorcutsDialog","onDeleteSelectedItems","deleteShortcutsAndShortcutGroups","resetSelectionState","onToolbarEditSelectedShortcut","onToolbarDeleteSelectedShortcuts","selectedShortcutGroupIds","allSelectedShortcutsFromSelectedGroups","allSelectedShortcuts","ss","filteredSelectedShortcutsFromSelectedGroups","onEditSelectedShortcutGroup","newShortcutGroupName","updateSelectShortcutGroupName","updateSelectedShortcut","onMoveSelectedItems","selectedGroupId","selectedShortcutsToMove","moveShortcutsToNewGroup","shortcutsToMove","shortcutToMoveIds","onChangeStateOfSelectedShortcuts","changeStateOfShortcuts","shortcutsToChange","shortcutAction","shortcutGroupAction","shortcutsOfShortcutGroup","selectedShortcutsInFilteredFormat","CreateShortcutGroupDialog","onCreateShortcutGroupFromInput","CreateShortcutDialog","onCreateShortcutFromInput","DropZone","isHidden","DraggableNameContainer","divClassName","floatingClassName","nameClassName","iconClassName","onMouseMove","DraggableFlatShortcutsFormat","flattenedFormat","onGroupMouseDown","flattenedShortcutDragged","setFlattenedShortcutDragged","itemIdx","fs","isGroup","flattenedShortcut","DraggableShortcutGroupsFormat","shortcutGroups","shortcutGroupDragged","ShortcutsFormatEditor","newShortcutFormat","setNewShortcutFormat","draggedGroupIdx","setDraggedGroupIdx","scrollingContainerRef","isScrolling","starScrolling","flattenedShortcutFormat","bottomThreshold","topThreshold","mouseY","clientY","itemToMoveIdx","moveToItemId","moveToItemIdx","flattenedShortcutToMoveCopy","flattenedFormatCopy","moveToIdx","shortcutGroupToMoveCopy","shortcutFormatCopy","ShortcutsOrganizeListHeaderButtons","onSaveFormat","ShortcutsManagementPage","isReorganizeListMode","setIsReorganizeListMode","showCreateShortcutDialog","setShowCreateShortcutDialog","setShortcutsFilter","showCreateShortcutGroupDialog","setShowCreateShortcutGroupDialog","isAllExpanded","fetchShortcutFormat","userIsOwner","intersection","userIsAuthor","userIsInternalOnly","Logout","PublicPostsPage","UserManagementPage","render","PostCreation","PostInsights","EventAttendance","EventCreation","InsightsDashboard","InsightsTagList","InsightsTagDetail","ContentGuidelinesPage","NewsletterManagementPage","EditNewsletterPage","NewsletterDashboard","EmailsManagementPage","EmailEditorPage","DownloadReportPage","PortalPagesPage","PostsPage","EventsPage","DocumentsPage","WelcomePage","Snackbars","CustomNavigationClient","_history","navigateInternal","relativePath","noHistory","NavigationClient","PublicClientApplication","navigationClient","setNavigationClient","b2cAcct","environment","currB2CAcct","setInstance","ReactDOM","unregister","checkValidServiceWorker","registerServiceWorker","INITIALIZE_USER_SETTINGS","InitializeUserSettings","UPDATE_USER_SETTINGS","UpdateUserSettings","SAVE_USER_SETTINGS","SAVE_USER_SETTINGS_COMPLETE","SaveUserSettingsComplete","SendSMSVerifyComplete","CLEAR_ERROR_MESSAGE","ClearErrorMessage","INTENSE_EMPHASIS_STYLE","EDIT_IMAGE_CORS_HOSTS","ALLOWED_BLOB_TYPES","AuthoringTinyEditor","setSpellcheckEnabled","setSpellcheckLanguage","setupMaxImageWidth","getBody","currentWidth","originalWidth","originalHeight","newHeight","fire","restrictImageToWidth","onSetup","changeLanguage","setupEditorOnInit","addMenuItem","addButton","setupInlineImages","execCommand","fullscreen","setupFullScreenButton","addIcon","addMenuButton","createSmartContentHighlightedMenuButtons","createSmartContentMenuButtons","setupSmartContentMenuButton","buttonApi","handleIntenseEmphasis","eventApi","setEnabled","off","setupIntenseEmphasisButton","getMentionedUsers","setupMentionUsers","createPersonalizationTokensMenuButtons","addNestedMenuItem","getSubmenuItems","setupPersonalizationMenuItems","isEnabledNow","findRuleToRemove","sheet","ruleToRemove","cssRules","cssText","styleSheets","getContentCssUrl","ruleToAdd","deleteRule","insertRule","mappedResults","tinymcespellchecker","getLanguage","languageToSet","setLanguage","lcidToHunspellLcid","buttonsEnabled","menuActions","subMenu","createMenuItems","actionType","getSelectedText","fetchBlobDataSynchronously","blobUrl","base64toBlob","getResponseHeader","base64String","byteCharacters","Buffer","buffer","processIframes","iframes","styleWidth","styleHeight","onBodyLiveChange","menuItemDiv","customDescriptionDiv","addCustomDescriptionsToPersonalizationTokens","content_css","getContentCss","entity_encoding","body_class","max_width","formats","pre","convert_urls","spellchecker_languages","selector","edit","insert","tools","table","link_default_target","link_target_list","default_link_target","editimage_cors_hosts","editimage_toolbar","image_advtab","quickbars_insert_toolbar","quickbars_selection_toolbar","powerpaste_word_import","powerpaste_html_import","paste_preprocess","args","imgs","showErrorMessage","showWrongFileTypeMessage","allowedUrlRegex","notificationManager","closeButton","images_upload_handler","progress","images_reuse_filename","toolbar_mode","font_family_formats","advtemplate_list","TinyMceTemplatesService","getCategories","excludeInlineImages","excludeEmbeddedMedia","advtemplate_get_template","getTemplate","advtemplate_create_category","createCategory","advtemplate_create_template","createTemplate","advtemplate_rename_category","renameCategory","advtemplate_rename_template","renameTemplate","advtemplate_delete_category","deleteCategory","advtemplate_delete_template","deleteTemplate","advtemplate_move_template","moveTemplate","advtemplate_move_category_items","moveCategoryItems","media_url_resolver","sanitizedUrlParams","sanitizedUrl","protocol","video_template_callback","sourcemime","altsource","altsourcemime","mergetags_prefix","mergetags_suffix","mergetags_list","FetchIdealWordCountLimit","FetchCurrentPostSentiment","strippedContent","complianceSource","Accept","asChonkyFileData","forDirectory","DeleteImage","PrepareUpload","UploadChunk","chunkNumber","uploadId","CommitUpload","AbortUpload","newImageName","GetFolderAndImageCount","mediaToMove","CreateNewDraft","defaultJSON","DeleteDraft","ModifyDraftDetails","ModifyDraftTitle","PublishDraft","SaveDraft","GetPage","GetPages","GetDisabledPages","GetDraftPages","GetEnabledPages","CheckIfUrlExists","DeletePage","DisablePage","EnablePage","ModifyPageDetails","ModifyPageTitle","SetPageAsHome","CreateNewChildNavigationItem","CreateNewNavigationItem","DeleteNavigationItem","GetNavigation","GetNavigationItemByURL","GetNavigationItems","GetNavigationItem","SetNavigationItemAsParent","SaveNavigationItem","UpdateNavigationItemSequence","issueDateAsString","fromName","fromAddress","UpdateSurveyExpiryTime","DeleteSurvey","GetCategoryTagsById","authoring","reports","support","sharing","defaultNavigationPage","defaultPortalPage","showNewNavigationItem","showPublishSuccess","DELETE_IMAGES_FROM_LIBRARY_INIT","DeleteImagesFromLibraryInit","DELETE_IMAGES_FROM_LIBRARY_COMPLETE","DeleteImagesFromLibraryComplete","CreateSetEmailNotificationFrequency","CreateSetEmailNotificationHours","CreateSetSMSNotificationFrequency","CreateSetSMSNotificationHours","SET_COMMENTING_ENABLED","CreateSetCommentingEnabledAction","SET_REACTING_ENABLED","CreateSetReactingEnabledAction","SET_NOTIFICATIONS_ENABLED","CreateSetNotificationsEnabledAction","CreateSetEmailChannelEnabled","CreateSetSMSChannelEnabled","SET_CHATBOT_NOTIFICATIONS_ENABLED","CreateSetChatbotNotificationsEnabled","SET_MOBILE_NOTIFICATIONS_ENABLED","CreateSetMobileNotificationsEnabled","CREATE_NEW_DRAFT","CREATE_NEW_DRAFT_COMPLETE","CreateNewDraftComplete","SET_NEW_DRAFT","SetNewDraft","SUBMIT_POST","SUBMIT_POST_COMPLETE","SubmitPostComplete","CLEAR_POST_FEED","ClearPostFeed","CLEAR_POST_FEED_FILTERS","ClearPostFeedFilters","CLEAR_EDITOR","FETCH_DRAFT_POST_LIST","FetchDraftPostList","FETCH_DRAFT_POST_LIST_COMPLETE","FetchDraftPostListComplete","FETCH_EXPIRED_POST_LIST","FetchExpiredPostList","FETCH_EXPIRED_POST_LIST_COMPLETE","FETCH_PUBLISHED_POST_LIST","FetchPublishedPostList","FETCH_PUBLISHED_POST_LIST_COMPLETE","FetchPublishedPostListComplete","FETCH_SCHEDULED_POST_LIST","FetchScheduledPostList","FETCH_SCHEDULED_POST_LIST_COMPLETE","FetchScheduledPostListComplete","FETCH_SUBMISSION_POST_LIST","FetchSubmissionPostList","FETCH_SUBMISSION_POST_LIST_COMPLETE","FetchSubmissionPostListComplete","FETCH_DRAFT_POST","FETCH_DRAFT_POST_COMPLETE","FetchDraftPostComplete","FETCH_ALL_POST_LIST","FetchAllPostList","FETCH_ALL_POST_LIST_COMPLETE","FetchAllPostListComplete","FETCH_POSTS_FEED","FETCH_POSTS_FEED_COMPLETE","FetchPostsFeedComplete","FetchPostsFeedLocalComplete","UPDATE_POST","UpdatePost","UPDATE_POSTS_FEED","UpdatePostsFeed","POST_EDIT_FIELD_UPDATE","DRAFT_POST_SAVE","DraftPostSave","DRAFT_POST_SAVE_COMPLETE","DraftPostSaveComplete","DRAFT_POST_DELETE","DraftPostDelete","DRAFT_POST_DELETE_COMPLETE","DRAFT_POST_DELETE_COMPLETE_BATCH","DraftPostDeleteCompleteBatch","FETCH_IMAGES_FROM_LIBRARY","FetchImagesFromLibrary","FETCH_IMAGES_FROM_LIBRARY_COMPLETE","FetchImagesFromLibraryComplete","FETCH_DOCUMENTS_FROM_DIRECTORY","FetchDocumentsFromDirectory","FETCH_DOCUMENTS_FROM_DIRECTORY_COMPLETE","FetchDocumentsFromDirectoryComplete","IMAGE_SELECTED","ImageSelected","DocumentSelected","IMAGE_TRANSFORMED","ImageTransformed","IMAGE_TWEAK_CONFIRMED","ImageTweaksConfirmed","CANCEL_IMAGE_CHANGES","CancelImageChanges","DELETE_EDITOR_POST_IMAGE","DeleteEditorPostImage","FETCH_IMAGE_FROM_LIBRARY_COMPLETE","FetchImageFromLibraryComplete","FETCH_DOCUMENT_FROM_DIRECTORY_COMPLETE","FetchDocumentFromDirectoryComplete","EDIT_PLACED_IMAGE","EditPlacedImage","GetContentAnalysisComplete","GET_DRAFT_TRANSLATION","GET_DRAFT_TRANSLATION_COMPLETE","GetDraftTranslationComplete","UNPUBLISH_POST","UNPUBLISH_POST_COMPLETE","UnpublishPostComplete","PUBLISH_POST","PUBLISH_POST_COMPLETE","PublishPostComplete","PUBLISH_SUCCESSFUL","PublishSuccessful","HIDE_PUBLISH_SUCCESSFUL_DIALOG","HidePublishSuccessfulDialog","FETCH_IDEAL_WORD_COUNT","FetchIdealWordCount","FETCH_IDEAL_WORD_COUNT_COMPLETE","FetchIdealWordCountComplete","DISMISS_IDEAL_WORD_COUNT_TIP","DismissIdealWordCountTip","SET_POST_TYPE","SetPostType","SET_CHANGED_SINCE_SAVE","SetChangedSinceSave","SET_SAVING","SetSaving","SET_NEW_POST_LIST","setNewPostList","SET_UPLOADING","SetUploading","SET_POST_FEED_FILTERS","SetPostFeedFilters","SEND_ACKNOWLEDGEMENT_COMPLETE","SendAcknowledgementComplete","SET_REACTION","SET_REACTION_COMPLETE","SetReactionComplete","ADD_COMMENT","ADD_COMMENT_COMPLETE","AddCommentComplete","ADD_COMMENT_REPLY","ADD_COMMENT_REPLY_COMPLETE","AddCommentReplyComplete","DELETE_COMMENT","DELETE_COMMENT_COMPLETE","DeleteCommentComplete","DESTAR_COMMENT_COMPLETE","DestarCommentComplete","EDIT_COMMENT","EDIT_COMMENT_COMPLETE","EditCommentComplete","FLAG_COMMENT","FLAG_COMMENT_COMPLETE","FlagCommentComplete","STAR_COMMENT_COMPLETE","StarCommentComplete","SubscribeToComments","SUBSCRIBE_TO_COMMENTS_COMPLETE","SubscribeToCommentsComplete","UnsubscribeFromComments","UNSUBSCRIBE_FROM_COMMENTS_COMPLETE","UnsubscribeFromCommentsComplete","CLEAR_FETCH_POST","ClearFetchPost","CLEAR_POST_AUTHORING_ERROR_MESSAGE","ClearPostAuthoringErrorMessage","CLEAR_POST_AUTHORING_SUCCESS_MESSAGE","ClearPostAuthoringSuccessMessage","CLEAR_POST_FEED_ERROR_MESSAGE","ClearPostFeedErrorMessage","CLEAR_POST_VIEW_ERROR_MESSAGE","ClearPostViewErrorMessage","CLEAR_SHOULD_FETCH","ClearShouldFetch","HOME_SCREENS_DEFAULT_STATE","Idle","getHomeScreenConfigs","SET_HOME_SCREEN_CONFIGS","SET_PRISTINE_CONFIGS","getHomeScreenConfigsList","Succeeded","Failed","updateSurveyExpiry","FETCH_SETTINGS_CLIENT_CONFIG_INIT","CreateFetchClientConfigInitAction","FETCH_SETTINGS_CLIENT_CONFIG_COMPLETE","CreateFetchClientConfigCompleteAction","FETCH_SETTINGS_TENANT_CONFIG_INIT","CreateFetchTenantConfigInitAction","FETCH_SETTINGS_TENANT_CONFIG_COMPLETE","CreateFetchTenantConfigCompleteAction","FetchTagSettingsInitAction","FETCH_TAG_SETTINGS_COMPLETE","FetchTagSettingsCompleteAction","FETCH_TENANT_ATTRIBUTES_COMPLETE","FetchTenantAttributesComplete","FetchUserTagSettingsInitAction","FETCH_USER_TAG_SETTINGS_COMPLETE","FetchUserTagSettingsCompleteAction","FETCH_USER_SETTINGS_INIT","CreateFetchUserSettingsInitAction","FETCH_USER_SETTINGS_COMPLETE","CreateFetchUserSettingsCompleteAction","FETCH_NOTIFICATION_SETTINGS_INIT","CreateFetchNotificationSettingsInitAction","FETCH_NOTIFICATION_SETTINGS_COMPLETE","CreateFetchNotificationSettingsCompleteAction","CHANGE_PRISTINE_STATE","CreateChangePristineStateAction","TENANT_DISPLAY_NAME_CHANGED","CreateTenantDisplayNameChangedAction","SET_SHOW_INVITED_EXTERNAL_USERS_ENABLED","CreateSetShowInvitedExternalUsersEnabled","CreateSetPostNotificationsEnabled","SET_SMS_NOTIFICATIONS_ENABLED","CreateSetSmsNotificationsEnabled","SET_EMAIL_NOTIFICATIONS_ENABLED","CreateSetEmailNotificationsEnabled","COMMENTS_ENABLED_CHANGED","CreateCommentsEnabledChangedAction","EXTERNAL_POST_PURGE_CHANGED","CreateExternalPostPurgeChangedAction","SET_MOBILE_SYNC_ENABLED","CreateSetMobileSyncEnabledAction","SET_MOBILE_SYNC_NUMBER_SELECTED","SYNC_ALL_AD_USERS_ENABLED","CreateSetSyncAllAdUsersEnabledAction","SET_SYNC_LEVEL","CreateSetSyncLevelAction","CreateSetMobileSyncNumberSelectedAction","EVERYONE_AUDIENCE_ENFORCEMENT_CHANGED","CreateEveryoneAudienceEnforcementChangedAction","MANAGE_TOPICS_AUDIENCES_ADMIN_CHANGED","CreateManageTopicsAudiencesInAdminChangedAction","IS_COMMENTING_ENABLED_FOR_NEW_POSTS_BY_DEFAULT","CreateIsCommentingEnabledForNewPostsByDefaultChangedAction","COMMENT_MODERATION_ENABLED","CreateCommentModerationEnabledChangedAction","GIF_SELECTION_ENABLED","CreateGifSelectionEnabledForCommentsAction","COMMENTS_MAXLENGTH_CHANGED","CreateCommentsMaxLengthChangedAction","SET_EXTERNAL_AUTH_ENABLED","CreateSetExternalAuthEnabledAction","REACTIONS_ENABLED","CreateToggleReactionsAction","IS_REACTING_ENABLED_FOR_NEW_POSTS_BY_DEFAULT","CreateIsReactingEnabledForNewPostsByDefaultChangedAction","REACTION_ENABLED_CHANGED","CreateReactionEnabledChangedAction","REACTION_NAME_CHANGED","CreateReactionNameChangedAction","REACTION_REORDER","CreateReactionReorderAction","SET_ACTIVE_REACTION_TAB","CreateSetActiveReactionTabAction","RESET_SETTINGS_COMPLETE","CreateResetSettingsCompleteAction","SAVE_TENANT_SETTINGS_INIT","CreateSaveTenantSettingsInitAction","SAVE_SETTINGS_COMPLETE","CreateSaveSettingsCompleteAction","SAVE_TENANT_SETTINGS_COMPLETE","CreateSaveTenantSettingsCompleteAction","CreateGetLanguageTranslationCompleteAction","CreateSetActiveTagGroupAction","ADD_TAG_GROUP","CreateAddTagGroupAction","UPDATE_TAG_GROUP","CreateUpdateTagGroupAction","ADD_TAG","CreateAddTagAction","UPDATE_TAG","CreateUpdateTagAction","MOVE_TAG","CreateMoveTagAction","RESET_TENANT_SETTINGS_TO_PRISTINE","CreateResetTenantSettingsToPristineAction","THEME_SETTINGS_CHANGED","CreateThemeSettingsChangedAction","POST_BANNER_COLORS_CHANGED","CreateBannerColorOptionsChangedAction","SPECIALTY_COLORS_CHANGED","CreateSpecialtyColorOptionsChangedAction","MOBILE_COLORS_CHANGED","CreateMobileColorOptionsChangedAction","SetErrorMessage","SET_LANGUAGE_SETTINGS","SetLanguageSettings","SET_ACTIVE_LANGUAGE","CreateSetActiveLanguageAction","SET_TIME_ZONE","CreateSetTimeZoneAction","SET_TRANSLATED_TEXT","SetTranslatedText","SET_SMS_BODY","SET_EMAIL_NAME","TOGGLE_SHARE_URL","CreateToggleShareUrlAction","SET_SHARE_URL","SetShareUrlAction","SET_SHARE_NAME","SetShareNameAction","SET_EMAIL_SENDER","SET_EMAIL_SUBJECT","SET_MOBILE_CONTENT","SET_FLAGGING_NOTIFICATION_WAIT","SetFlaggingNotificationWait","SET_MANDATORY_EXPIRY_TIME","SetMandatoryExpiryTime","SET_EXTERNAL_POST_PURGE_IN_DAYS","SetExternalPostPurgeInDays","TOGGLE_MANDATORY_EXPIRY_TIME","ToggleMandatoryExpiryTime","SET_SUPPORT_EMAIL","SetSupportEmail","SET_SURVEYS_ENABLED","SetSurveysEnabled","SET_CHAT_ENABLED","SetChatEnabled","SET_DOCUMENTS_ENABLED","SetDocumentsEnabled","SET_MOBILE_EVENTS_ENABLED","SetMobileEventsEnabled","SET_RESTRICTED_BANNER_ENABLED","SetRestrictedBannerEnabled","SET_MOBILE_PUBLISHING_ENABLED","SetMobilePublishingEnabled","SET_PORTAL_PAGES_ENABLED","SetPortalPagesEnabled","SET_LOCAL_PASSWORD_RESET_ENABLED","CreateSetResetLocalUserPasswordAction","REMOVE_NEW_TAG","RemoveNewTagAction","AddExternalPostSourceInitAction","ADD_EXTERNAL_POST_SOURCE_COMPLETE","AddExternalPostSourceCompleteAction","UpdateExternalPostSourceInitAction","UPDATE_EXTERNAL_POST_SOURCE_COMPLETE","UpdateExternalPostSourceCompleteAction","DeleteExternalPostSourceInitAction","DELETE_EXTERNAL_POST_SOURCE_COMPLETE","DeleteExternalPostSourceCompleteAction","SET_EXTERNAL_POST_SOURCE_ENABLED","SetExternalPostSourceEnabledAction","TOGGLE_NOTIFICATION_EVENT_ACTION","CreateToggleNotificationEventAction","SET_APPLY_BLACKOUT_PERIOD","CreateApplyBlackoutPeriodAction","SET_ON_PUBLISH","CreateSetOnPublishAction","SET_ALL_ON_PUBLISH","CreateSetAllOnPublishAction","SET_REMINDERS","CreateSetRemindersAction","SET_ENABLE_ALL_CHANNELS","CreateEnableAllChannelsAction","SET_ENABLE_SELECTED_CHANNELS","CreateEnableSelectedChannelsAction","CreateApplyBlackoutPeriodForSMSAction","CreateSendEmailNotificationAction","CreateSendSMSNotificationAction","SET_DEFAULT_BLACKOUT_FOR_EMAIL","CreateSetDefaultBlackoutForEmailAction","SET_DEFAULT_BLACKOUT_FOR_SMS","CreateSetDefaultBlackoutForSMSAction","SET_DEFAULT_BLACKOUT_FOR_TEAMS","CreateSetDefaultBlackoutForTeamsAction","SET_DEFAULT_BLACKOUT_FOR_MOBILE","CreateSetDefaultBlackoutForMobileAction","SET_LINK_PREFERENCE","CreateSetLinkPreference","SET_DEFAULT_REMINDER_FOR_POSTS","CreateSetDefaultReminderForPostsAction","SET_DEFAULT_REMINDERS_FOR_EVENTS","CreateSetDefaultReminderForEventsAction","SET_CONTRIBUTORS_CAN_TOGGLE_COMMENTS_CHANGED","SET_CONTRIBUTORS_CAN_TOGGLE_REACTIONS_CHANGED","CreateCanContributorsToggleCommentsAction","CreateCanContributorsToggleReactionsAction","SET_POST_SMART_CONTENT_ENABLED_BY_TENANT","SetPostSmartContentEnabledByTenant","SET_SHORTCUTS_ENABLED_BY_TENANT","SetShortcutsEnabledByTenant","defaultDocumentFeed","SET_LCID_MAPPINGS","SetLcidMappings","SET_EMAIL_RESOURCE","SetEmailResource","SET_SMS_RESOURCE","SetSmsResource","SET_MOBILE_RESOURCE","SetMobileResource","isImageValid","isBreakingTimeValid","isFeaturedTimeValid","RangeType","Channel","ReminderPopout","togglePostUnread","remindersEnabled","reminderBackup","defaultTimeLocation","displayDelay","daysSelected","inherit","sms","mobile","Subscribers","updateDelay","newArray","toggleRadio","toggleCheck","toggleDropdown","toggleTime","arrayLocation","toEditIndex","uniqueDelays","daySelected","currentReminderToEdit","Inherit","timeOptions","rangeOptionsEmail","Fallback","rangeOptionsSMS","NetworkRequest","cat","newCategory","categoryId","newTemplate","addTemplateToCategory","found","updatedTemplate","getCategory","updatedCategory","categories","oldCategory","oldCategoryId","newCategoryId","itemsToMove","categoryToUpdate","SET_MAIN_STYLE","CreateSetMainStyle","SET_HEADER_STYLE","CreateSetHeaderStyle","SET_SHOULD_DISPLAY_NAV","CreateSetShouldDisplayNav","SupportTab","EmptyDefaultSupportItem","dateLastUpdated","releaseNumber","associatedLinks","GET_DRAFT","GET_DRAFT_COMPLETE","GetDraftComplete","GET_PORTAL_PAGES","GetPortalPages","GET_PORTAL_PAGES_COMPLETE","GetPortalPagesComplete","GET_DISABLED_PORTAL_PAGES","GetDisabledPortalPages","GET_DISABLED_PORTAL_PAGES_COMPLETE","GetDisabledPortalPagesComplete","GET_DRAFT_PORTAL_PAGES","GetDraftPortalPages","GET_DRAFT_PORTAL_PAGES_COMPLETE","GetDraftPortalPagesComplete","GET_ENABLED_PORTAL_PAGES","GetEnabledPortalPages","GET_ENABLED_PORTAL_PAGES_COMPLETE","GetEnabledPortalPagesComplete","GET_NAVIGATION","GET_NAVIGATION_COMPLETE","GetNavigationComplete","GetNavigationItemByURLComplete","GET_NAVIGATION_ITEMS","GET_NAVIGATION_ITEMS_COMPLETE","GetNavigationItemsComplete","GetNavigationPortalPages","GET_NAVIGATION_PORTAL_PAGES_COMPLETE","GetNavigationPortalPagesComplete","HIDE_BACK_TO_PORTAL_PAGES","HideBackToPortalPages","HIDE_GLOBAL_COMPONENTS","HideGlobalComponents","HIDE_GO_TO_NAVIGATION_ITEMS","HideGoToNavigationItems","HIDE_NEW_PORTAL_PAGE","HideNewPortalPage","HIDE_PREVIEW","HidePreview","HIDE_PUBLISH_CHANGES","HidePublishChanges","SHOW_BACK_TO_PORTAL_PAGES","ShowBackToPortalPages","SHOW_GLOBAL_COMPONENTS","ShowGlobalComponents","SHOW_GO_TO_NAVIGATION_ITEMS","ShowGoToNavigationItems","SHOW_NEW_PORTAL_PAGE","ShowNewPortalPage","SHOW_PREVIEW","ShowPreview","SHOW_PUBLISH_CHANGES","ShowPublishChanges","CREATE_NEW_CHILD_NAVIGATION_ITEM","CREATE_NEW_CHILD_NAVIGATION_ITEM_COMPLETE","CreateNewChildNavigationItemComplete","CREATE_NEW_NAVIGATION_ITEM","CREATE_NEW_NAVIGATION_ITEM_COMPLETE","CreateNewNavigationItemComplete","DELETE_DRAFT","DELETE_DRAFT_COMPLETE","DeleteDraftComplete","DELETE_NAVIGATION_ITEM","DELETE_NAVIGATION_ITEM_COMPLETE","DeleteNavigationItemComplete","MODIFY_DRAFT_DETAILS","MODIFY_DRAFT_DETAILS_COMPLETE","ModifyDraftDetailsComplete","MODIFY_DRAFT_TITLE","MODIFY_DRAFT_TITLE_COMPLETE","ModifyDraftTitleComplete","MODIFY_PORTAL_PAGE_DETAILS","ModifyPortalPageDetails","MODIFY_PORTAL_PAGE_DETAILS_COMPLETE","ModifyPortalPageDetailsComplete","MODIFY_PORTAL_PAGE_TITLE","ModifyPortalPageTitle","MODIFY_PORTAL_PAGE_TITLE_COMPLETE","ModifyPortalPageTitleComplete","PUBLISH_DRAFT","PUBLISH_DRAFT_COMPLETE","PublishDraftComplete","SAVE_DRAFT","SAVE_DRAFT_COMPLETE","SaveDraftComplete","SET_NAVIGATION_ITEM_AS_PARENT","SET_NAVIGATION_ITEM_AS_PARENT_COMPLETE","SetNavigationItemAsParentComplete","SET_PORTAL_PAGE_AS_HOME","SetPortalPageAsHome","SET_PORTAL_PAGE_AS_HOME_COMPLETE","SetPortalPageAsHomeComplete","UPDATE_DRAFT","UpdateDraft","UPDATE_NAVIGATION_ITEM_SEQUENCE","UPDATE_NAVIGATION_ITEM_SEQUENCE_COMPLETE","UpdateNavigationItemSequenceComplete","DELETE_PORTAL_PAGE","DeletePortalPage","DELETE_PORTAL_PAGE_COMPLETE","DeletePortalPageComplete","DELETE_PORTAL_PAGES","DeletePortalPages","DELETE_PORTAL_PAGES_COMPLETE","DeletePortalPagesComplete","DISABLE_PORTAL_PAGE","DisablePortalPage","DISABLE_PORTAL_PAGE_COMPLETE","DisablePortalPageComplete","ENABLE_PORTAL_PAGE","EnablePortalPage","ENABLE_PORTAL_PAGE_COMPLETE","EnablePortalPageComplete","CHANGED_SINCE_SAVED","ChangedSinceSaved","CLEAR_CHANGED_SINCE_SAVED","ClearChangedSinceSaved","CLEAR_SHOW_PUBLISH_SUCCESS","ClearShowPublishSuccess","ClearSuccessMessage","FETCH_CUSTOM_CSS_REQUEST","FetchCustomCssRequest","FETCH_CUSTOM_CSS_SUCCESS","FetchCustomCssSuccess","FETCH_CUSTOM_CSS_FAILURE","FetchCustomCssFailure","GetAttendanceListing","GetAttendanceListingComplete","GET_ATTENDANCE_LISTING_CSV","GetAttendanceListingCSV","GET_ATTENDANCE_LISTING_CSV_COMPLETE","GetAttendanceListingCSVComplete","GET_DRAFTS","GetDrafts","GET_DRAFTS_COMPLETE","GetDraftsComplete","GET_SUBMISSIONS","GetSubmissions","GET_SUBMISSIONS_COMPLETE","GetSubmissionsComplete","GET_ALL_EVENTS","GET_ALL_EVENTS_COMPLETE","GetAllEventsComplete","GET_EVENT","GET_EVENT_COMPLETE","GET_EVENT_FEED","GET_EVENT_FEED_COMPLETE","GetEventFeedComplete","GET_PUBLISHED","GET_PUBLISHED_COMPLETE","GetPublishedComplete","GET_SCHEDULED","GET_SCHEDULED_COMPLETE","GetScheduledComplete","SET_EVENTS_FEED_TO_DEFAULT","SetEventsFeedToDefault","CHANGE_RSVP_STATUS","CHANGE_RSVP_STATUS_COMPLETE","ChangeRSVPStatusComplete","CLONE_EVENT","CLONE_EVENT_COMPLETE","CloneEventComplete","UNPUBLISH_EVENT","UNPUBLISH_EVENT_COMPLETE","UnpublishEventComplete","DELETE_EVENTS","DeleteEvents","DELETE_EVENTS_COMPLETE","DeleteEventsComplete","EDIT_RESPONSE","EDIT_RESPONSE_COMPLETE","EditResponseComplete","SUBMIT_EVENT","SubmitEvent","SUBMIT_EVENT_COMPLETE","SubmitEventComplete","PUBLISH_EVENT","PUBLISH_EVENT_COMPLETE","PublishEventComplete","RSVP_TO_EVENT","RSVPToEvent","RSVP_TO_EVENT_COMPLETE","RSVPToEventComplete","SAVE_EVENT","SAVE_EVENT_COMPLETE","SaveEventComplete","SET_EVENT_FEED_FILTERS","SetEventFeedFilters","SET_EVENT_FEED_VIEW","SetEventFeedView","UPDATE_EVENT_FEED","UpdateEventFeed","UPDATE_URL","UpdateUrl","UPDATE_URL_COMPLETE","UpdateUrlComplete","CLEAR_EVENT_FEED","ClearEventFeed","CLEAR_EVENT_FEED_FILTERS","ClearEventFeedFilters","CLEAR_EVENT_LIST","ClearEventList","CLEAR_SUCCESS_MESSAGE","updateGlobalExternalUsers","getUserResponse","toggleUserRole","toggleUserEnabled","toggleSubmissionManagement","toggleFlaggingNotifications","setInvitingUserEmail","inviteUser","usersToInvite","userToAdd","resendInviteUser","externalUser","setExternalUserEnabled","provider","uploadBatchInviteFile","resendInvitesForPendingUsers","deletePendingUsersList","deleteExternalUser","fixLegacyUser","handleUserCreationFirstName","handleUserCreationLastName","handleUserCreationUserId","handleUserCreationPassword","handleUserCreationEmail","handleUserCreationEmployeeId","handleUserCreationTitle","handleUserCreationDepartment","handleUserCreationRegion","handleUserCreationCountry","handleUserCreationPreferredEmail","handleUserCreationPreferredSMSPhone","handleUserCreationAudiences","handleUserCreationRoles","handleUserCreationSubmissionManager","HandleUserCreationSubscribedToFlaggingNotifications","createSingleSparrowUser","createOneSparrowUser","userToCreate","updateEditPassword","updateMobileConsent","UpdateUserPermissions","enUS","fr","defaultLangPref","UpdateLocale","UpdateMessages","UpdateLangPref","IconTypes","defaultTimeout","ConfirmationDialog","handleNo","handleYes","fetchIcon","iconToFetch","containerElement","keepMounted","Noty","closeWith","SET_ACTIVE_ACTIVITY_TAB","CreateSetActiveActivityTabAction","SET_TENANT_ID","SET_MOBILE_APP_BANNER_OPEN","CreateSetMobileAppBannerOpen","DefaultState","DEFAULT_GUIDELINE_STATE","guideline","currAttachments","currDescription","currHeader","GetContentSettings","SET_EMPTY","longestSentenceWords","fogScore","rawSentiment","genderNumber","lixScore","longestWord","speakingTime","EXPIRED","supportItem","filteredChonkyFileData","sortGroup","activeSupportTab","FAQ","POST_CREATED_BY_SELECT_VALUES","STANDARD","MANDATORY","PUBLIC","VIEW_ALL_POSTS","VIEW_MY_POSTS","CreateSetActiveMessagingTab","IDLE","SET_SAS_URL","SUCCEEDED","FAILED","GET_ATTACHED_ARTICLES","GetAttachedArticles","GET_ATTACHED_ARTICLES_COMPLETE","GetAttachedArticlesComplete","GET_DOCUMENT_DETAILS","GetDocumentDetails","GET_DOCUMENT_DETAILS_COMPLETE","GetDocumentDetailsComplete","GetCategoryTagById","GET_DOCUMENT_FEED","GetDocumentFeed","GET_DOCUMENT_FEED_COMPLETE","GetDocumentFeedComplete","GetDocumentProperties","GetDocumentPropertiesComplete","GET_DOCUMENTS","GetDocuments","GET_DOCUMENTS_COMPLETE","GetDocumentsComplete","GET_DISABLED_DOCUMENTS","GetDisabledDocuments","GET_DISABLED_DOCUMENTS_COMPLETE","GetDisabledDocumentsComplete","GET_ENABLED_DOCUMENTS","GetEnabledDocuments","GET_ENABLED_DOCUMENTS_COMPLETE","GetEnabledDocumentsComplete","GET_SCHEDULED_DOCUMENTS","GetScheduledDocuments","GET_SCHEDULED_DOCUMENTS_COMPLETE","GetScheduledDocumentsComplete","HIDE_DOCUMENT_FEED_FILTERS","HideDocumentFeedFilters","HIDE_EDITOR","HideEditor","SHOW_DOCUMENT_FEED_FILTERS","ShowDocumentFeedFilters","SHOW_EDITOR","ShowEditor","SET_DOCUMENT_FEED_FILTERS","SetDocumentFeedFilters","SET_DOCUMENT_FEED_LAYOUT","SetDocumentFeedLayout","DELETE_DOCUMENT","DeleteDocument","DELETE_DOCUMENT_COMPLETE","DeleteDocumentComplete","DELETE_DOCUMENTS","DeleteDocuments","DELETE_DOCUMENTS_COMPLETE","DeleteDocumentsComplete","DISABLE_DOCUMENT","DisableDocument","DISABLE_DOCUMENT_COMPLETE","DisableDocumentComplete","ENABLE_DOCUMENT","EnableDocument","ENABLE_DOCUMENT_COMPLETE","EnableDocumentComplete","REPLACE_FILE","ReplaceFile","REPLACE_FILE_COMPLETE","ReplaceFileComplete","UPDATE_DOCUMENT_FEED","UpdateDocumentFeed","UPDATE_DOCUMENT_PROPERTIES","UpdateDocumentProperties","UPDATE_DOCUMENT_PROPERTIES_COMPLETE","UpdateDocumentPropertiesComplete","UPLOAD_FILE","UploadFile","UPLOAD_FILE_COMPLETE","UploadFileComplete","CLEAR_DOCUMENT_FEED","ClearDocumentFeed","CLEAR_DOCUMENT_FEED_FILTERS","ClearDocumentFeedFilters","POST_AVG_IS_LOCAL","cookieName","FETCH_USERS_INIT","CreateFetchUsersInitAction","FETCH_USERS_V1_COMPLETE","CreateFetchUsersV1CompleteAction","FETCH_USERS_COMPLETE","CreateFetchUsersCompleteAction","SET_ACTIVE_USERS_TAB","CreateSetActiveUsersTabAction","SELECT_USER","CreateToggleUserRoleAction","CreateToggleUserEnabledAction","CreateToggleSubmissionManagementAction","CreateToggleFlaggingNotificationAction","SAVE_USER_INIT","CreateSaveUserInitAction","SAVE_USER_COMPLETE","CreateSaveUserCompleteAction","SET_INVITING_USER_EMAIL","CreateSetInvitingUserEmailAction","INVITE_USER_INIT","CreateInviteUserInitAction","INVITE_USER_COMPLETE","CreateInviteUserCompleteAction","RESEND_INVITE_USER_INIT","CreateResendInviteUserInitAction","RESEND_INVITE_USER_COMPLETE","CreateResendInviteUserCompleteAction","INVITE_BATCH_USERS_INIT","InviteBatchUsersInitAction","INVITE_BATCH_USERS_COMPLETE","InviteBatchUsersCompleteAction","GetBulkInviteReportCSV","GetBulkImportCSV","SET_EXTERNAL_USER_ENABLED_INIT","CreateSetExternalUserEnabledInitAction","SET_EXTERNAL_USER_ENABLED_COMPLETE","CreateSetExternalUserEnabledCompleteAction","UPLOAD_BATCH_INVITE_FILE_INIT","CreateUploadBatchInviteFileInitAction","UPLOAD_BATCH_INVITE_FILE_COMPLETE","CreateUploadBatchInviteFileCompleteAction","CREATE_RESEND_PENDING_INVITE_INIT","CreateResendPendingInviteInitAction","CREATE_RESEND_PENDING_INVITE_COMPLETE","CreateResendPendingInviteCompleteAction","DELETE_EXTERNAL_USER_INIT","DeleteExternalUserInitAction","DELETE_EXTERNAL_USER_COMPLETE","DeleteExternalUserCompleteAction","DELETE_PENDING_USER_LIST_INIT","DeletePendingUserListInit","DELETE_PENDING_USER_LIST_COMPLETE","DeletePendingUserListComplete","UPDATE_GLOBAL_USERS","UpdateGlobalUsersAction","UPDATE_GLOBAL_EXTERNAL_USERS","UpdateGlobalExternalUsersAction","LEGACY_FIX_INIT","CreateLegacyFixInitAction","LEGACY_FIX_COMPLETE","CreateLegacyFixCompleteAction","HANDLE_USER_CREATION_FIRSTNAME","CreateHandleUserCreationFirstName","HANDLE_USER_CREATION_LASTNAME","CreateHandleUserCreationLastName","HANDLE_USER_CREATION_USERID","CreateHandleUserCreationUserId","HANDLE_USER_CREATION_PASSWORD","CreateHandleUserCreationPassword","HANDLE_USER_CREATION_EMAIL","CreateHandleUserCreationEmail","HANDLE_USER_CREATION_EMPLOYEEID","CreateHandleUserCreationEmployeeId","HANDLE_USER_CREATION_TITLE","CreateHandleUserCreationTitle","HANDLE_USER_CREATION_DEPARTMENT","CreateHandleUserCreationDepartment","HANDLE_USER_CREATION_REGION","CreateHandleUserCreationRegion","HANDLE_USER_CREATION_COUNTRY","CreateHandleUserCreationCountry","HANDLE_USER_CREATION_PREFERREDEMAIL","CreateHandleUserCreationPreferredEmail","HANDLE_USER_CREATION_PREFERREDSMSPHONE","CreateHandleUserCreationPreferredSMSPhone","HANDLE_USER_CREATION_AUDIENCES","CreateHandleUserCreationAudiences","HANDLE_USER_CREATION_ROLES","CreateHandleUserCreationRoles","HANDLE_USER_CREATION_SUBMISSION_MANAGER","CreateHandleUserCreationSubmissionManager","HANDLE_USER_CREATION_SUBSCRIBED_TO_FLAGGING_NOTIFICATIONS","CreateHandleUserCreationSubscribedToFlaggingNotifications","HANDLE_UPDATE_UPDATING_USER_ID","CreateHandleUpdateUpdatingUserId","CreateHandleSendSMSVerifyUserId","HANDLE_EDIT_PASSWORD","CreateEditPasswordAction","HANDLE_UPDATE_MOBILE_CONSENT","CreateUpdateMobileConsentAction","CreateUpdateUserPermissionsAction","urlOrDefault","localeActions","GetTenantAttributes","getUserSettings","setSyncAllAdUsersEnabled","numberType","setCommentModerationEnabled","setExternalAuthEnabled","chosenLanguages","defaultLanugage","defaultLanguage","msg","textTooLong","parseError","GetLanguageTranslation","translateableLanguageObj","setActiveTagGroup","setMobileColorOption","waitTime","days","AddTenantSettingsExternalPostSource","IsCompleted","Result","UpdateTenantSettingsExternalPostSource","DeleteTenantSettingsExternalPostSource","notificationEvent","ApplyBlackoutPeriodForSMS","SendEmailNotification","SendSMSNotification","SetRemindersAction","createDevTools","toggleVisibilityKey","changePositionKey","defaultIsVisible","blacklist","flaggedItemId","fetchActivityLog","currentFilterState","beforeDate","afterDate","includeReadOnly","getAudience","alreadyFetched","getIncludedUsers","getIncludedGroups","bulkImportUsers","bulkReconcileAudience","audienceToDelete","replacementAudience","GetComment","subscribe","convertFileType","parseFileName","endsWith","fileTypeIndex","properties","models","FetchExpiredPosts","imageTransforms","postText","includeHighlightAnalysis","EventId","MaxDepth","ElapsedTime","SessionId","getId","EventLanguage","eventText","GetUsersByMonthStats","GetRegisteredUsersByDayStats","GetUserTrendStats","GetCommentsByMonthStats","GetReadsByTimeOfDayStats","GetPostOverviewDetails","imagesEncoded","heroImageEncoded","GetPostOverviewAnalytics","GetPostReadershipAnalytics","GetFirstWeekPostStats","fromDate","GetAllTags","PostLanguage","fileExt","appendFileExtension","fileN","GetTenantSettings","externalPostSource","getPortalPages","getDisabledPortalPages","getDraftPortalPages","getEnabledPortalPages","pageJSON","getFilteredUsers","GetUsersCSV","GetInvitedUsersCSV","DeleteInvitedUser","invitedUser","GetFilteredInvitedUsers","GetUserInsightStats","userPreferenceId","GetSelectedTopicsForUser","CreateSparrowLocalAccount","newUser","CheckIfLocalUserIdAvailable","BatchCreateSparrowLocalAccounts","csv","DownloadSampleBatchCSV","GetBatchUploadIds","SearchUsersByTerm","GetEditableUserById","GetUsersById","userids","audienceLock","FetchAllSupportItems","GetDocumentURL","SendReportRequest","report","dateRequested","AnalyticsCsvReport","EmailActivityReport","defaultEventsFeed","pendingDeleting","isSubmitting","Unpublish","deletedIds","deletedDrafts","deletedPublished","deletedScheduled","eventList","itemDefaults","previousLinks","nextLinks","defaultAttemptModel","blackoutPeriod","templaceId","publicAuthAllowed","postBannerColors","docLockerEnabled","postNotificationsEnabled","newsletterEnabled","invitedExternalUsersEnabled","resetLocalUserPasswordOnLogin","customerLicense","emailNotificationsEnabled","smsNotificationsEnabled","commentFlaggedEmailAttempt","commentFlaggedTeamsAttempt","docLockerUpdatedMobileAttempt","eventCancelledEmailAttempt","eventPublishedEmailAttempt","eventPublishedMobileAttempt","eventPublishedSMSAttempt","eventPublishedTeamsAttempt","eventReminderEmailAttempt","eventReminderMobileAttempt","eventReminderSMSAttempt","eventReminderTeamsAttempt","eventRespondedEmailAttempt","eventUpdatedEmailAttempt","postPublishedEmailAttempt","postPublishedMobileAttempt","postPublishedSMSAttempt","postPublishedTeamsAttempt","postReminderEmailAttempt","postReminderMobileAttempt","postReminderSMSAttempt","postReminderTeamsAttempt","userProfileUpdatedEmailAttempt","eventMentionedTeamsAttempt","eventMentionedMobileAttempt","postMentionedTeamsAttempt","postMentionedMobileAttempt","userMentionedTeamsAttempt","userMentionedMobileAttempt","userMentionedEmailAttempt","accessGrantedEmailAttempt","postSubmittedTeamsAttempt","verifyPhoneSMSAttempt","postSubmittedEmailAttempt","eventSubmittedTeamsAttempt","eventSubmittedEmailAttempt","pristineTenantSettingsCopy","showDisabledItems","canManageSupport","pinnedFolders","hideSocialStats","deepValueEqual","obj1","obj2","updateTenantSettingsState","newTenantSettings","updateNotificationSettingsState","newNotificationSettings","blackoutPeriodList","notificationClone","dummySubjectSMS","dummyContent","pristineNotificationsCopy","newBannerColors","newSpecialtyColors","newMobileColors","externalAuthProvidersEnabled","newToggleUrls","newShareNames","newShareUrls","sortReactions","newReactions","newReaction","notificationsCopy","updatingTagInfo","findTag","tagInfo","newtc","currentlyExists","newExternalPostSources","newPristineExternalPostSources","updateExternalSourcesState","sourceToUpdateIndex","pristineSourceToUpdateIndex","sourceToDeleteIndex","pristineSourceToDeleteIndex","updatedExternalPostSources","cloneDeep","newBlackoutPeriods","eventSettings","numberValue","RequestMethod","CreateApiRequestInit","CreateRequestInit","requestMethodFromEnum","getUri","PUT","CREATE_NEW_CATEGORY_TAG","CreateAddNewCategoryTagAction","CREATE_NEW_CATEGORY_TAG_COMPLETE","CreateAddNewCategoryTagComplete","EDIT_CATEGORY_TAG","EditCategoryTagAction","EDIT_CATEGORY_TAG_COMPLETE","EditCategoryTagComplete","SHOW_NEW_CATEGORY_TAG","ShowNewCategoryTagAction","HIDE_NEW_CATEGORY_TAG","HideNewCategoryTagAction","SHOW_EDIT_CATEGORY_TAG","ShowEditCategoryTagAction","HIDE_EDIT_CATEGORY_TAG","HideEditCategoryTagAction","GET_CATEGORY_TAGS","GET_CATEGORY_TAGS_COMPLETE","GetCategoryTagsComplete","GET_DISABLED_CATEGORY_TAGS","GET_DISABLED_CATEGORY_TAGS_COMPLETE","GetDisabledCategoryTagsComplete","GET_ENABLED_CATEGORY_TAGS","GET_ENABLED_CATEGORY_TAGS_COMPLETE","GetEnabledCategoryTagsComplete","GET_USER_CATEGORY_TAGS_COMPLETE","GetUserCategoryTagsComplete","DELETE_CATEGORY_TAG","DELETE_CATEGORY_TAG_COMPLETE","DeleteCategoryTagComplete","ENABLE_CATEGORY_TAG","EnableCategoryTag","ENABLE_CATEGORY_TAG_COMPLETE","EnableCategoryTagComplete","DISABLE_CATEGORY_TAG","DisableCategoryTag","DISABLE_CATEGORY_TAG_COMPLETE","DisableCategoryTagComplete","SET_TAG_TO_EDIT","SetTagToEdit","SET_TAG_TO_VIEW","SetTagToView","DELETE_CATEGORY_TAGS","DeleteCategoryTags","DELETE_CATEGORY_TAGS_COMPLETE","DeleteCategoryTagsComplete","SHOW_VIEW_CATEGORY_TAG","ShowViewCategoryTag","HIDE_VIEW_CATEGORY_TAG","HideViewCategoryTag","LOAD_CATEGORY_TAG_ANALYTICS","LoadCategoryTagAnalytics","LOAD_CATEGORY_TAG_ANALYTICS_COMPLETE","LoadCategoryTagAnalyticsComplete","DEFAULT_EMAIL_FILTERS","GET_POST_STATS_INIT","CreateGetPostStatsInit","GET_POST_STATS_COMPLETE","CreateGetPostStatsComplete","GET_USER_COUNTS_INIT","CreateGetUserCountsInit","GET_USER_COUNTS_COMPLETE","CreateGetUserCountsComplete","GET_COMMENT_REACTION_COUNTS_INIT","CreateGetCommentAndReactionCountsInit","GET_COMMENT_REACTION_COUNTS_COMPLETE","CreateGetCommentAndReactionCountsComplete","GET_PLATFORM_STATS_INIT","CreateGetPlatformStatsInit","GET_PLATFORM_STATS_COMPLETE","CreateGetPlatformStatsComplete","GET_DETAILED_POST_STATS_INIT","CreateGetDetailedPostStatsInit","GET_DETAILED_POST_STATS_COMPLETE","CreateGetDetailedPostStatsComplete","GET_POST_READS_INIT","CreateGetPostReadsInit","GET_POST_READS_COMPLETE","CreateGetPostReadsComplete","GET_READ_VIEW_STATS_INIT","CreateGetReadViewStatsInit","GET_READ_VIEW_STATS_COMPLETE","CreateGetReadViewStatsComplete","GET_TAG_STATS_INIT","CreateGetTagStatsInit","GET_TAG_STATS_COMPLETE","CreateGetTagStatsComplete","GET_TAG_READS_INIT","CreateGetTagReadsInit","GET_TAG_READS_COMPLETE","CreateGetTagReadsComplete","GET_TAG_POSTS_INIT","CreateGetTagPostsInit","GET_TAG_POSTS_COMPLETE","CreateGetTagPostsComplete","GET_TOP_CHANNELS_INIT","CreateGetTopChannelsInit","GET_TOP_CHANNELS_COMPLETE","CreateGetTopChannelsComplete","GET_TOP_SURVEYS_INIT","CreateGetTopSurveysInit","GET_TOP_SURVEYS_COMPLETE","CreateGetTopSurveysComplete","GET_TOP_EVENTS_INIT","CreateGetTopEventsInit","GET_TOP_EVENTS_COMPLETE","CreateGetTopEventsComplete","GET_USER_TRENDS_INIT","CreateGetUserTrendsInit","GET_USER_TRENDS_COMPLETE","CreateGetUserTrendsComplete","SET_TO_FETCH","CreateSetToFetch","GET_AUDIENCES_COMPLETE","GetAudiencesComplete","GetAudienceDetailsComplete","GET_ALL_AUDIENCES","GET_ALL_AUDIENCES_COMPLETE","GetAllAudiencesComplete","GET_DISABLED_AUDIENCES","GET_DISABLED_AUDIENCES_COMPLETE","GetDisabledAudiencesComplete","GET_ENABLED_AUDIENCES","GET_ENABLED_AUDIENCES_COMPLETE","GetEnabledAudiencesComplete","CREATE_AUDIENCE_COMPLETE","CreateAudienceComplete","DELETE_AUDIENCE","DELETE_AUDIENCE_COMPLETE","DeleteAudienceComplete","DELETE_AUDIENCES","DeleteAudiences","DELETE_AUDIENCES_COMPLETE","DeleteAudiencesComplete","DISABLE_AUDIENCE","DISABLE_AUDIENCE_COMPLETE","DisableAudienceComplete","DISABLE_AUDIENCES","DisableAudiences","DISABLE_AUDIENCES_COMPLETE","DisableAudiencesComplete","DOWNLOAD_USER_DATA","DownloadUserData","DOWNLOAD_USER_DATA_COMPLETE","DownloadUserDataComplete","ENABLE_AUDIENCE","ENABLE_AUDIENCE_COMPLETE","EnableAudienceComplete","ENABLE_AUDIENCES","EnableAudiences","ENABLE_AUDIENCES_COMPLETE","EnableAudiencesComplete","SAVE_AUDIENCE_COMPLETE","SaveAudienceComplete","UTF8_BOM","replaceInvalidCharacters","encodedData","isCompressed","processBlobDownload","autoDownload","lines","csvContent","encoded","autoDownloadObject","revokeObjectURL","COMPRESSED_FILE_TYPE","msSaveBlob","getCategoryTagById","getDocumentProperties","getDocuments","getDisabledDocuments","getEnabledDocuments","getScheduledDocuments","showDocumentFeedFilters","documentIds","clearDocumentFeedFilters","DISABLED"],"mappings":"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","file":"static/js/main.433169a8.chunk.js","sourcesContent":["import React from \"react\";\r\nimport { useLocation } from \"react-router-dom\";\r\n\r\nconst QUERY_PARAM_KEYS = {\r\n SIGNED_OUT_SUCCESS: \"signedOutSuccess\",\r\n INVITE_TOKEN: \"inviteToken\",\r\n TENANT_ID: \"tenantId\",\r\n TENANT_NAME: \"tenantName\",\r\n OPEN_UPDATE_OPTIONS: \"updateOptions\",\r\n IS_RESET_PASSWORD_LINK: \"isResetPasswordLink\",\r\n LOAD_PREVIEW_OPEN: \"preview\",\r\n ALL_PAGE_NUMBER: \"allPageNum\",\r\n PUBLISHED_PAGE_NUMBER: \"pubPageNum\",\r\n SCHEDULED_PAGE_NUMBER: \"schPageNum\",\r\n DRAFT_PAGE_NUMBER: \"dftPageNum\",\r\n SUBMISSION_PAGE_NUMBER: \"sbmPageNum\",\r\n TAB_NUMBER: \"tabNum\",\r\n PAGE_CONTEXT: \"context\",\r\n IS_CONTENT_BAND_PUBLISH: \"isPublish\"\r\n};\r\n\r\n/**\r\n * Hook for using query parameters\r\n * - returns a URLSearchParams object\r\n * - see RequireLogin.tsx for usage example\r\n */\r\nconst useQueryParams = () => {\r\n const { search } = useLocation();\r\n return React.useMemo(() => new URLSearchParams(search), [search]);\r\n};\r\n\r\nexport default useQueryParams;\r\nexport { QUERY_PARAM_KEYS };\r\n","export interface ISuggestion {\r\n suggestionId: string;\r\n suggestion: string;\r\n}\r\n\r\nexport interface IBaseSmartContentPageProps {\r\n onClose: () => void;\r\n onBack: () => void;\r\n}\r\n\r\nexport interface IGPTMessage {\r\n content: string;\r\n}\r\n\r\nexport interface IGPTChoice {\r\n message: IGPTMessage;\r\n index: number;\r\n finish_reason: string;\r\n logprogs?: number;\r\n}\r\n\r\nexport interface IGPTUsage {\r\n prompt_tokens: number;\r\n completion_tokens: number;\r\n total_tokens: number;\r\n}\r\n\r\nexport enum PromptTypeEnum {\r\n Title = \"title\",\r\n Body = \"body\",\r\n Idea = \"idea\",\r\n Summarize = \"summarize\",\r\n Rewrite = \"rewrite\",\r\n Shorten = \"shorten\",\r\n Expand = \"expand\",\r\n Friendly = \"friendly\",\r\n Professional = \"professional\",\r\n Heartfelt = \"heartfelt\",\r\n Educational = \"educational\",\r\n Witty = \"witty\",\r\n GenderNeutral = \"genderneutral\",\r\n}\r\n\r\nexport interface IGenerateContentRequest {\r\n sessionId?: string;\r\n contentType: \"post\" | \"event\";\r\n promptType: PromptTypeEnum;\r\n numberOfContentToGenerate?: number;\r\n readability?: string;\r\n tone?: string;\r\n personalism?: string;\r\n sentiment?: string;\r\n length?: string;\r\n text?: string;\r\n}\r\n\r\nexport interface IGenerateContentResponse {\r\n id: string;\r\n object: string;\r\n created: number;\r\n model: string;\r\n choices: IGPTChoice[];\r\n usage: IGPTUsage;\r\n error?: string;\r\n responseStatusCode: number;\r\n isSuccessStatusCode: boolean;\r\n responseReasonPhrase: string;\r\n sessionId: string;\r\n}\r\n","import { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as Actions from \"./actions\";\r\nimport {\r\n Answers, \r\n AttendanceFilterValues,\r\n AttendanceListingPage,\r\n AttendanceType,\r\n Event,\r\n EventFeedFilters,\r\n EventFeedItem,\r\n EventFilterValues,\r\n EventListItem,\r\n EventView,\r\n RSVPType,\r\n TranslatableEventContent\r\n} from \"modules/events/models\";\r\nimport API from \"api\";\r\nimport XhrUpload from \"utils/xhrUpload\";\r\nimport MsalAuthModule from \"authentication/msalAuthModule\";\r\nimport { ImageScale } from \"modules/posts/models\";\r\nimport { AttachedFile, Image as ImageV1 } from \"modules/gallery/models\";\r\nimport { ContentAnalysis } from \"modules/common/components/authoring/models\";\r\nimport { ContentState } from \"utils/managementUtils\";\r\n\r\nexport const changeRSVPStatus = (id: string, attendeeIds: string[], attendanceType: AttendanceType) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.ChangeRSVPStatus({}));\r\n return dispatch(API.events.ChangeRSVPStatus(id, attendeeIds, attendanceType))\r\n .then(response => {\r\n dispatch(Actions.ChangeRSVPStatusComplete({ succeeded: response.status === 200 }));\r\n return true;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.ChangeRSVPStatusComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\n\r\nexport const cloneEvent = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.CloneEvent({}));\r\n return dispatch(API.events.CloneEvent(id))\r\n .then(response => {\r\n dispatch(Actions.CloneEventComplete({ succeeded: true }));\r\n return response.json();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.CloneEventComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\n\r\nexport const deleteEvents = (events: EventListItem[]) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.DeleteEvents({}));\r\n return Promise.all(events.map(e => dispatch(e.status === \"draft\" ? API.events.DeleteEventDraft(e.draftId) : API.events.DeleteEvent(e.draftId))))\r\n .then(results => {\r\n dispatch(Actions.DeleteEventsComplete({ succeeded: true, deletedEvents: events.map(e => e.draftId) }));\r\n return true;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DeleteEventsComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const unpublishEvent = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.UnpublishEvent({}));\r\n return dispatch(API.events.UnpublishEvent(id))\r\n .then(response => {\r\n dispatch(Actions.UnpublishEventComplete({ succeeded: true }));\r\n return true;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.UnpublishEventComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const editResponse = (id: string, attendeeId: string, attendanceType: AttendanceType, answers: Answers) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.EditResponse({}));\r\n return dispatch(API.events.EditResponse(id, attendeeId, attendanceType, answers))\r\n .then(response => {\r\n dispatch(Actions.EditResponseComplete({ succeeded: response.status === 200 }));\r\n return true;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.EditResponseComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\n\r\nexport const getAttendance = (id: string, attendanceTypes: AttendanceType[], pageNumber: number, filters: Partial) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetAttendanceListing({}));\r\n return dispatch(API.events.GetAttendance(id, attendanceTypes, pageNumber, filters))\r\n .then(response => {\r\n dispatch(Actions.GetAttendanceListingComplete({ succeeded: true }));\r\n return response.json();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetAttendanceListingComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\n\r\nexport const getAttendanceCSV = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetAttendanceListingCSV({}));\r\n return dispatch(API.events.GetAttendanceCSV(id))\r\n .then(response => {\r\n dispatch(Actions.GetAttendanceListingCSVComplete({ succeeded: true }));\r\n return response.json();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetAttendanceListingCSVComplete({ succeeded: false }));\r\n return \"\";\r\n });\r\n}\r\n\r\n\r\nexport const getContentAnalysis = (id: string, text: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetContentAnalysis({}));\r\n return dispatch(API.events.GetContentAnalysis(id, text))\r\n .then(response => {\r\n dispatch(Actions.GetContentAnalysisComplete({ succeeded: true }));\r\n return response.json();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetContentAnalysisComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\n\r\nexport const getDocument = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetDocument({}));\r\n return dispatch(API.mediaLibrary.FetchDocumentForId((id)))\r\n .then(response => response.json())\r\n .then(file => {\r\n dispatch(Actions.GetDocumentComplete({ succeeded: true }));\r\n const image: AttachedFile = {\r\n blobId: file.id,\r\n fileExtension: \"\",\r\n fileName: file.name,\r\n fileType: \"application\",\r\n fileUrl: file.url,\r\n ospreyId: file.id\r\n };\r\n return image;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetDocumentComplete({ succeeded: false }));\r\n return;\r\n });\r\n}\r\n\r\n\r\nexport const getDocumentGallery = () => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetDocumentGallery({}));\r\n return dispatch(API.mediaLibrary.FetchDocuments())\r\n .then(response => response.json())\r\n .then(documentGalleryPage => dispatch(Actions.GetDocumentGalleryComplete({ ...documentGalleryPage, succeeded: true })))\r\n .catch(err => dispatch(Actions.GetDocumentGalleryComplete({ currentPage: 1, documents: [], totalDocuments: 0, totalPages: 0, succeeded: false, err })));\r\n}\r\n\r\n\r\nexport const getDraft = (draftId: string, imageScale: ImageScale = ImageScale.Unprocessed) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetDraft({}));\r\n return dispatch(API.events.GetDraft(draftId, imageScale))\r\n .then(response => {\r\n dispatch(Actions.GetDraftComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200 ? response.json() : null;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetDraftComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getSubmissions = (pageNumber: number, filters: Partial, pageAmount?: number) => (dispatch, _: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetSubmissions({}));\r\n return dispatch(API.events.getEventDrafts(pageNumber, {...filters, eventStates: [ContentState.Submission]}, pageAmount))\r\n .then(response => response.json())\r\n .then(eventPage => {\r\n dispatch(Actions.GetSubmissionsComplete({ ...eventPage, succeeded: true }))\r\n })\r\n .catch(err => dispatch(Actions.GetSubmissionsComplete({ currentPage: 1, events: [], totalEvents: 0, totalPages: 0, succeeded: false, err })));\r\n}\r\n\r\nexport const getDrafts = (pageNumber: number, filters: Partial, pageAmount?: number) => (dispatch, _: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetDrafts({}));\r\n return dispatch(API.events.getEventDrafts(pageNumber, {...filters, eventStates: [ContentState.Draft]}, pageAmount))\r\n .then(response => response.json())\r\n .then(eventPage => dispatch(Actions.GetDraftsComplete({ ...eventPage, succeeded: true })))\r\n .catch(err => dispatch(Actions.GetDraftsComplete({ currentPage: 1, events: [], totalEvents: 0, totalPages: 0, succeeded: false, err })));\r\n}\r\n\r\n\r\nexport const getAllEvents = (pageNumber: number, filters: Partial, pageAmount?: number) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetAllEvents({}));\r\n return dispatch(API.events.GetAllEvents(pageNumber, filters, pageAmount))\r\n .then(response => response.json())\r\n .then(eventPage => dispatch(Actions.GetAllEventsComplete({ ...eventPage, succeeded: true })))\r\n .catch(err => dispatch(Actions.GetAllEventsComplete({ currentPage: 1, events: [], totalEvents: 0, totalPages: 0, succeeded: false, err })));\r\n}\r\n\r\n\r\nexport const getDraftTranslation = (id: string, content: TranslatableEventContent, outputLCID: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetDraftTranslation({}));\r\n return dispatch(API.events.GetDraftTranslation(id, content, outputLCID))\r\n .then(response => {\r\n dispatch(Actions.GetDraftTranslationComplete({ succeeded: true }));\r\n return response.json();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetDraftTranslationComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\n\r\nexport const getEvent = (id: string, imageScale: ImageScale = ImageScale.Unprocessed) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetEvent({}));\r\n return dispatch(API.events.GetEvent(id, imageScale))\r\n .then(response => {\r\n dispatch(Actions.GetEventComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200 ? response.json() : null;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetEventComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\n/*\r\n * Fetches the specified section of the event feed. Overwrites the event feed state in redux.\r\n */\r\nexport const getEventFeed = (filters: Partial, filtersApplied: boolean, sortAscending: boolean, pageNumber: number) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.GetEventFeed({}));\r\n\r\n dispatch(API.events.GetEventFeed(filters, sortAscending, pageNumber))\r\n .then(response => response.json())\r\n .then((eventsFeed) => dispatch(Actions.GetEventFeedComplete({ succeeded: true, filtersApplied, eventsFeed, pageNumber })))\r\n .catch(error => dispatch(Actions.GetEventFeedComplete({ succeeded: false, filtersApplied, eventsFeed: [], pageNumber })));\r\n}\r\n\r\n/*\r\n * Fetches the specified section of the event feed, WITHOUT overwriting the event feed state in redux.\r\n */\r\nexport const fetchEventFeedLocal = (filters: Partial, pageNumber: number, pageAmount: number) => (dispatch, _: () => GlobalApplicationState) : Promise => {\r\n return dispatch(API.events.GetEventFeed(filters, true, pageNumber, pageAmount))\r\n .then(res => res.json())\r\n .then((eventsFeed: EventFeedItem[]) => eventsFeed)\r\n .catch(_ => []);\r\n}\r\n\r\nconst getFirstGifFrame = (gif: File): Promise => {\r\n return new Promise((resolve, reject) => {\r\n const canvas = document.createElement(\"canvas\");\r\n const img = new Image();\r\n img.onload = function () {\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n let context = canvas.getContext(\"2d\")!;\r\n context.drawImage(img, 0, 0, img.width, img.height);\r\n canvas.toBlob((newBlob: any) => {\r\n newBlob.lastModifiedDate = new Date();\r\n newBlob.name = gif.name;\r\n return resolve(newBlob as File);\r\n });\r\n }\r\n img.src = URL.createObjectURL(gif);\r\n });\r\n}\r\n\r\n\r\nexport const getImage = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetImage({}));\r\n return dispatch(API.mediaLibrary.FetchImageForId(id))\r\n .then(response => response.json())\r\n .then(file => {\r\n dispatch(Actions.GetImageComplete({ succeeded: true }));\r\n const image: AttachedFile = {\r\n blobId: file.id,\r\n fileExtension: \"\",\r\n fileName: file.name,\r\n fileType: !!file.videoId ? \"video\" : \"image\",\r\n fileUrl: file.url,\r\n ospreyId: file.id\r\n };\r\n return image;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetImageComplete({ succeeded: false }));\r\n return;\r\n });\r\n}\r\n\r\n\r\nexport const getImageGallery = (pageNumber: number = 1, includeVideos: boolean = false) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetImageGallery({}));\r\n return dispatch(API.mediaLibrary.GetImageGallery(pageNumber, includeVideos))\r\n .then(response => response.json())\r\n .then(imageGalleryPage => dispatch(Actions.GetImageGalleryComplete({ ...imageGalleryPage, succeeded: true })))\r\n .catch(err => dispatch(Actions.GetImageGalleryComplete({ currentPage: 1, images: [], totalImages: 0, totalPages: 0, succeeded: false, err })));\r\n}\r\n\r\n\r\nexport const getPublished = (pageNumber: number, filters: Partial, pageAmount?: number) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetPublished({}));\r\n return dispatch(API.events.GetPublished(pageNumber, filters, pageAmount))\r\n .then(response => response.json())\r\n .then(eventPage => dispatch(Actions.GetPublishedComplete({ ...eventPage, succeeded: true })))\r\n .catch(err => dispatch(Actions.GetPublishedComplete({ currentPage: 1, events: [], totalEvents: 0, totalPages: 0, succeeded: false, err })));\r\n}\r\n\r\n\r\nexport const getScheduled = (pageNumber: number, filters: Partial, pageAmount?: number) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetScheduled({}));\r\n return dispatch(API.events.GetScheduled(pageNumber, filters, pageAmount))\r\n .then(response => response.json())\r\n .then(eventPage => dispatch(Actions.GetScheduledComplete({ ...eventPage, succeeded: true })))\r\n .catch(err => dispatch(Actions.GetScheduledComplete({ currentPage: 1, events: [], totalEvents: 0, totalPages: 0, succeeded: false, err })));\r\n}\r\n\r\n\r\nexport const getVideo = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetVideo({}));\r\n return dispatch(API.mediaLibrary.FetchVideoForId(id))\r\n .then(response => response.json())\r\n .then(url => {\r\n dispatch(Actions.GetVideoComplete({ succeeded: true }));\r\n return url;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetVideoComplete({ succeeded: false }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getVideosComplete = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.GetVideosComplete({}));\r\n}\r\n\r\nexport const publishEvent = (eventId: string, sendNotification: boolean) => (dispatch, _: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.PublishEvent({}));\r\n return dispatch(API.events.PublishEvent(eventId, sendNotification))\r\n .then(response => {\r\n if (response.status === 200) {\r\n dispatch(Actions.ClearEventFeed({}));\r\n dispatch(Actions.ClearEventFeedFilters({}));\r\n }\r\n return response;\r\n })\r\n .then(response => response.json())\r\n .then (res => {\r\n dispatch(Actions.PublishEventComplete({ succeeded: true, publishedEvents: res }));\r\n return true;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.PublishEventComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const rsvp = (id: string, attendanceType: AttendanceType, answers: Answers, rsvpType: RSVPType) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.RSVPToEvent({}));\r\n return dispatch(API.events.RSVP(id, attendanceType, answers))\r\n .then(response => {\r\n dispatch(Actions.RSVPToEventComplete({ succeeded: response.status === 200, attendanceType, rsvpType }));\r\n return response.json();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.RSVPToEventComplete({ succeeded: false, err, attendanceType, rsvpType }));\r\n return;\r\n });\r\n}\r\n\r\nexport const submitEvent = (eventId: string) => (dispatch, _: () => GlobalApplicationState) : boolean => {\r\n dispatch(Actions.SubmitEvent({}));\r\n return dispatch(API.events.submitEvent(eventId))\r\n .then(_ => {\r\n dispatch(Actions.SubmitEventComplete({ succeeded: true }));\r\n return true\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SubmitEventComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const saveEvent = (event: Partial) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.SaveEvent({}));\r\n return dispatch(API.events.SaveEvent(event))\r\n .then(response => {\r\n dispatch(Actions.SaveEventComplete({ succeeded: true }));\r\n return response.json();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SaveEventComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\n\r\nexport const setEventFeedFilters = (filters: Partial) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.SetEventFeedFilters({ filters }));\r\n}\r\n\r\nexport const setEventFeedView = (selectedView: string) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.SetEventFeedView({ selectedView }));\r\n}\r\n\r\nexport const updateEventFeed = (eventsFeed: EventFeedItem[]) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.UpdateEventFeed({ eventsFeed }));\r\n}\r\n\r\n\r\nexport const updateUrl = () => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.UpdateUrl({}));\r\n}\r\n\r\nexport const updateUrlComplete = () => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.UpdateUrlComplete({}));\r\n}\r\n\r\n\r\nexport const uploadDocument = (file: File, onProgress: (percentCompleted: number) => void, onLoad?: (e) => void, onError?: (e) => void, onAbort?: (e) => void) => async (dispatch, getState) => {\r\n dispatch(Actions.UploadDocument({}));\r\n return MsalAuthModule.getInstance().getAccessToken().then(accessToken => {\r\n const requestDetails = API.mediaLibrary.UploadDocument(file);\r\n const url = getState().config.SparrowClientApiUrl + requestDetails.url\r\n .replace(\"{tenant}\", getState().tenant.id);\r\n\r\n const handlers = { onLoad, onAbort, onError, onProgress };\r\n\r\n return new XhrUpload(url, requestDetails, handlers)\r\n .authenticateWith(accessToken)\r\n .upload();\r\n })\r\n .then((response: string) => {\r\n let document = JSON.parse(response) as { docId: string, fileName: string };\r\n dispatch(Actions.UploadDocumentComplete({ succeeded: true }));\r\n return { id: document.docId, fileName: document.fileName };\r\n });\r\n}\r\n\r\n\r\n/*\r\n * In the upload image case we cant use the default fetch implementation,\r\n * we have to resort to xhr; hence we need to call the authmanager ourselves.\r\n * This however lets us attach an onProgress event listener.\r\n * This xhr request could have been abstracted in the middleware, but we would lose\r\n * the onProgress event when we dispatch the network request.\r\n */\r\nexport const uploadImage = (image: File, onProgress: (percentCompleted: number) => void, onLoad?: (e) => void, onError?: (e) => void, onAbort?: (e) => void) => async (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n if (!(/^image\\/(jpg|jpeg|png|bmp)/).test(image.type)) {\r\n Actions.UploadImageComplete({ succeeded: false });\r\n return Promise.resolve(\"\");\r\n }\r\n\r\n dispatch(Actions.UploadImage({}));\r\n\r\n const fileToUpload = image.type === \"image/gif\" ? await getFirstGifFrame(image) : image;\r\n\r\n return MsalAuthModule.getInstance().getAccessToken().then(accessToken => {\r\n\r\n const requestDetails = API.mediaLibrary.UploadImage(fileToUpload);\r\n const url = getState().config.SparrowClientApiUrl + requestDetails.url\r\n .replace(\"{tenant}\", getState().tenant.id);\r\n\r\n const handlers = { onLoad, onAbort, onError, onProgress };\r\n\r\n return new XhrUpload(url, requestDetails, handlers)\r\n .authenticateWith(accessToken)\r\n .upload();\r\n\r\n }).then((response: string) => {\r\n let image = JSON.parse(response) as { imageId: string, fileName: string };\r\n dispatch(Actions.UploadImageComplete({ succeeded: true }));\r\n return image.imageId;\r\n });\r\n}\r\n\r\nexport const uploadThumbImage = (blob: Blob, videoId: string, onProgress: (percentCompleted: number) => void, onLoad?: (e) => void, onError?: (e) => void, onAbort?: (e) => void) => (dispatch, getState: () => GlobalApplicationState) => {\r\n return MsalAuthModule.getInstance().getAccessToken()\r\n .then((accessToken) => {\r\n let requestDetails = API.mediaLibrary.VideoUploads.UploadImageThumbnail(blob, videoId);\r\n let url = getState().config.SparrowClientApiUrl + requestDetails.url\r\n .replace('{tenant}', getState().tenant.id);\r\n\r\n let handlers = {\r\n onProgress,\r\n onLoad,\r\n onError,\r\n onAbort\r\n };\r\n return new XhrUpload(url, requestDetails, handlers)\r\n .authenticateWith(accessToken)\r\n .upload();\r\n })\r\n .then((response: string) => {\r\n let resultingThumb = JSON.parse(response) as { id: string, url: string, thumbnail: ImageV1 }\r\n return resultingThumb;\r\n });\r\n}\r\n\r\nexport const hasChangedSinceSaved = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ChangedSinceSaved({}));\r\n}\r\n\r\nexport const clearChangedSinceSaved = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ClearChangedSinceSaved({}));\r\n}\r\n\r\nexport const clearErrorMessage = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ClearErrorMessage({}));\r\n}\r\n\r\nexport const clearEventFeed = () => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.ClearEventFeed({}));\r\n}\r\n\r\nexport const clearEventFeedFilters = () => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.ClearEventFeedFilters({}));\r\n}\r\n\r\nexport const clearEventList = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ClearEventList({}));\r\n}\r\n\r\nexport const clearShouldFetch = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ClearShouldFetch({}));\r\n}\r\n\r\nexport const clearShowPublishSuccess = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ClearShowPublishSuccess({}));\r\n}\r\n\r\nexport const clearSuccessMessage = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ClearSuccessMessage({}));\r\n}\r\n\r\nexport const setEventsFeedToDefault = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.SetEventsFeedToDefault({}));\r\n}\r\n","import { Action } from \"redux\";\r\nimport { ActionCreator, CompleteAction } from 'typedActions';\r\nimport { SupportItem, AssociatedLink, SupportTab } from \"./models\";\r\n\r\nexport const CREATE_NEW_SUPPORT_ITEM = 'CREATE_NEW_SUPPORT_ITEM';\r\nexport interface CreateNewSupportItem extends Action { };\r\nexport const CreateNewSupportItem = ActionCreator(CREATE_NEW_SUPPORT_ITEM);\r\n\r\nexport const CREATE_NEW_ITEM_COMPLETE = 'CREATE_NEW_ITEM_COMPLETE';\r\nexport interface CreateNewItemComplete extends CompleteAction { itemId: string };\r\nexport const CreateNewItemComplete = ActionCreator(CREATE_NEW_ITEM_COMPLETE);\r\n\r\nexport const FETCH_SUPPORT_ITEM = 'FETCH_SUPPORT_ITEM';\r\nexport interface FetchSupportItem extends Action { };\r\nexport const FetchSupportItem = ActionCreator(FETCH_SUPPORT_ITEM);\r\n\r\nexport const FETCH_SUPPORT_ITEM_COMPLETE = 'FETCH_SUPPORT_ITEM_COMPLETE';\r\nexport interface FetchSupportItemComplete extends CompleteAction { item: SupportItem | null};\r\nexport const FetchSupportItemComplete = ActionCreator(FETCH_SUPPORT_ITEM_COMPLETE);\r\n\r\nexport const SAVE_SUPPORT_ITEM = 'SAVE_SUPPORT_ITEM';\r\nexport interface SaveSupportItem extends Action { };\r\nexport const SaveSupportItem = ActionCreator(SAVE_SUPPORT_ITEM);\r\n\r\nexport const SAVE_SUPPORT_ITEM_COMPLETE = 'SAVE_SUPPORT_ITEM_COMPLETE ';\r\nexport interface SaveSupportItemComplete extends CompleteAction { };\r\nexport const SaveSupportItemComplete = ActionCreator(SAVE_SUPPORT_ITEM_COMPLETE );\r\n\r\nexport const DELETE_SUPPORT_ITEM = 'DELETE_SUPPORT_ITEM';\r\nexport interface DeleteSupportItem extends Action { };\r\nexport const DeleteSupportItem = ActionCreator(DELETE_SUPPORT_ITEM);\r\n\r\nexport const DELETE_SUPPORT_ITEM_COMPLETE = 'DELETE_SUPPORT_ITEM_COMPLETE ';\r\nexport interface DeleteSupportItemComplete extends CompleteAction { };\r\nexport const DeleteSupportItemComplete = ActionCreator(DELETE_SUPPORT_ITEM_COMPLETE );\r\n\r\ntype supportKey = keyof SupportItem;\r\nexport const SUPPORT_EDIT_FIELD_UPDATE = 'SUPPORT_EDIT_FIELD_UPDATE';\r\nexport interface FieldUpdate extends Action { field: supportKey, value: any }\r\nexport const FieldUpdate = ActionCreator(SUPPORT_EDIT_FIELD_UPDATE);\r\n\r\nexport const PUBLISH_SUPPORT_ITEM = 'PUBLISH_SUPPORT_ITEM';\r\nexport interface PublishSupportItem extends Action { };\r\nexport const PublishSupportItem = ActionCreator(PUBLISH_SUPPORT_ITEM);\r\n\r\nexport const PUBLISH_SUPPORT_ITEM_COMPLETE = 'PUBLISH_SUPPORT_ITEM_COMPLETE ';\r\nexport interface PublishSupportItemComplete extends CompleteAction {\r\n validationResult?: {\r\n errors?: { [key: string]: string[] },\r\n itemTitle?: string,\r\n id?: string\r\n }\r\n };\r\nexport const PublishSupportItemComplete = ActionCreator(PUBLISH_SUPPORT_ITEM_COMPLETE );\r\n\r\nexport const PUBLISH_SUCCESS = 'PUBLISH_SUCCESS';\r\nexport interface PublishSuccess extends Action { }\r\nexport const PublishSucess = ActionCreator(PUBLISH_SUCCESS);\r\n\r\nexport const UPLOAD_DOCUMENT = 'UPLOAD_DOCUMENT';\r\nexport interface UploadDocument extends Action { }\r\nexport const UploadDocument = ActionCreator(UPLOAD_DOCUMENT);\r\n\r\nexport const SET_UPLOADING_DOC = \"SET_UPLOADING_DOC\";\r\nexport interface SetUploadingDoc extends Action { uploading: boolean }\r\nexport const SetUploadingDoc = ActionCreator(SET_UPLOADING_DOC);\r\n\r\nexport const UPLOAD_DOCUMENT_COMPLETE = 'UPLOAD_DOCUMENT_COMPLETE';\r\nexport interface UploadDocumentComplete extends CompleteAction { id: string | null, fileName?: string }\r\nexport const UploadDocumentComplete = ActionCreator(UPLOAD_DOCUMENT_COMPLETE);\r\n\r\nexport const UPLOAD_FILES = 'UPLOAD_FILES';\r\nexport interface UploadFiles extends Action { }\r\nexport const UploadFiles = ActionCreator(UPLOAD_FILES);\r\n\r\nexport const UPLOAD_FILES_COMPLETE = 'UPLOAD_FILES_COMPLETE';\r\nexport interface UploadFilesComplete extends CompleteAction { id: string | null, fileName?: string }\r\nexport const UploadFilesComplete = ActionCreator(UPLOAD_FILES_COMPLETE);\r\n\r\nexport const SUPPORT_ASSOCIATED_LINKS_UPDATE = 'SUPPORT_ASSOCIATED_LINKS_UPDATE';\r\nexport interface SupportAssociatedLinksUpdate extends Action { associatedLink: AssociatedLink }\r\nexport const SupportAssociatedLinksUpdate = ActionCreator(SUPPORT_ASSOCIATED_LINKS_UPDATE);\r\n\r\nexport const REMOVE_ASSOCIATED_LINK = 'REMOVE_ASSOCIATED_LINK';\r\nexport interface RemoveAssociatedLink extends Action { id: string }\r\nexport const RemoveAssociatedLink = ActionCreator(REMOVE_ASSOCIATED_LINK);\r\n\r\nexport const SET_ACTIVE_SUPPORT_TAB = \"SET_ACTIVE_SUPPORT_TAB\";\r\nexport interface SetActiveSupportTab extends Action {\r\n activeTab: SupportTab;\r\n}\r\nexport const SetActiveSupportTab = ActionCreator(SET_ACTIVE_SUPPORT_TAB);\r\n\r\nexport const CLEAR_VALIDATION_ERRORS = \"CLEAR_VALIDATION_ERRORS\";\r\nexport interface ClearValidationErrors extends Action { }\r\nexport const ClearValidationErrors = ActionCreator(CLEAR_VALIDATION_ERRORS);","import * as React from \"react\";\r\n\r\nclass ToggleSwitch extends React.Component {\r\n\r\n public render() {\r\n return (\r\n
{this._onChangeHandler(e)}} onMouseOver={(e) => {this._onMouseOverHandler(e)}}>\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n private _onChangeHandler = (e: React.MouseEvent) => {\r\n if (!this.props.disabled) {\r\n this.props.onClick(e);\r\n }\r\n e.stopPropagation();\r\n }\r\n\r\n private _onMouseOverHandler = (e: React.MouseEvent) => {\r\n if (!this.props.disabled) {\r\n this.props.onMouseOverHandler && this.props.onMouseOverHandler(e);\r\n }\r\n e.stopPropagation();\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n onClick: (e: any) => void\r\n onMouseOverHandler?: (e: any) => void;\r\n value: boolean\r\n disabled?: boolean\r\n}\r\n\r\nexport default ToggleSwitch\r\n","import { Action } from \"redux\";\r\nimport * as Actions from \"./actions\";\r\n\r\nimport { UsersState, UserListItem, ExternalUser, UsersTab, ValidationResponse } from \"./models\";\r\n\r\nconst defaultState = {\r\n fetching: false,\r\n saving: false,\r\n activeTab: UsersTab.Users,\r\n users: [],\r\n userList: {\r\n currentPage: 0,\r\n totalPages: 0,\r\n totalUsers: 0,\r\n users: new Array()\r\n },\r\n editingUser: null,\r\n creatingUser: {\r\n firstName: \"\",\r\n lastName: \"\",\r\n userName: \"\",\r\n preferredName: \"\",\r\n initialPassword: \"\",\r\n email: null,\r\n audiences:[],\r\n employeeId: null,\r\n title: null,\r\n department: null,\r\n reportsTo: null,\r\n region: null,\r\n country: null,\r\n preferredSMSPhone: null,\r\n roles: [],\r\n canManageSubmissions: false,\r\n subscribedToFlaggingNotifications: false,\r\n },\r\n fetchedUser: {\r\n id: \"\",\r\n azureB2CObjectId: \"\",\r\n audiences: [],\r\n country: \"\",\r\n department: \"\",\r\n firstName: \"\",\r\n lastName: \"\",\r\n email: \"\",\r\n employeeId: \"\",\r\n providerId: \"\",\r\n providerName: \"\",\r\n firstLogin: null,\r\n tagIds: [],\r\n region: \"\",\r\n reportsTo: \"\",\r\n roles: [],\r\n avatarColor: \"\",\r\n enabled: false,\r\n legacyDisabled: false,\r\n title: \"\",\r\n totalComments: 0,\r\n totalReactions: 0,\r\n subscribedToFlaggingNotifications: false,\r\n preferredName: \"\",\r\n preferredEmail: \"\",\r\n preferredSMSConsent: null,\r\n preferredSMSPhone: \"\",\r\n preferredLCID: \"en-us\",\r\n canManageSubmissions: false,\r\n },\r\n invitingUser: false,\r\n invitedTime: new Date(),\r\n deletingUser: false,\r\n externalUserList: new Array(),\r\n invitingUserEmail: null,\r\n invitingUserValidation: null,\r\n invitedUsers: 0,\r\n\r\n processingToggleEnableEmail: null,\r\n processingReinviteEmail: null,\r\n uploadingBatchInvite: false,\r\n batchUploadValidation: null,\r\n\r\n reinvitingPendingUsers: false,\r\n deletingPendingUsers: false,\r\n\r\n legacyFixComplete: false,\r\n\r\n editingLocalAccountPassword: \"\",\r\n} as UsersState;\r\n\r\nconst actionHandler: { [actionType: string]: (state: UsersState, action: Action) => UsersState } = {\r\n\r\n [Actions.UPDATE_GLOBAL_USERS]: (state: UsersState, action: Actions.UpdateGlobalUsers) => {\r\n return {\r\n ...state,\r\n userList: action.userList\r\n }\r\n },\r\n\r\n [Actions.UPDATE_GLOBAL_EXTERNAL_USERS]: (state: UsersState, action: Actions.UpdateGlobalExternalUsers) => {\r\n return {\r\n ...state,\r\n externalUserList: action.users\r\n }\r\n },\r\n\r\n [Actions.FETCH_USERS_INIT]: (state: UsersState, action: Actions.FetchUsersInit) => {\r\n return {\r\n ...state,\r\n fetching: true,\r\n saving: false\r\n };\r\n },\r\n [Actions.FETCH_USERS_V1_COMPLETE]: (state: UsersState, action: Actions.FetchUsersV1Complete) => {\r\n if (action.succeeded) {\r\n return {\r\n ...state,\r\n fetching: false,\r\n saving: false,\r\n users: action.users\r\n };\r\n } else {\r\n return state;\r\n }\r\n },\r\n [Actions.FETCH_USERS_COMPLETE]: (state: UsersState, action: Actions.FetchUsersComplete) => {\r\n if (action.succeeded) {\r\n return {\r\n ...state,\r\n fetching: false,\r\n saving: false,\r\n userList: action.userList\r\n }\r\n } else {\r\n return state;\r\n }\r\n },\r\n [Actions.SET_ACTIVE_USERS_TAB]: (state: UsersState, action: Actions.SetActiveUsersTab) => {\r\n return {\r\n ...state,\r\n activeTab: action.activeTab\r\n }\r\n },\r\n [Actions.SELECT_USER]: (state: UsersState, action: Actions.SelectUser) => {\r\n return {\r\n ...state,\r\n // editingUser: action.user ? { ...action.user } : null,\r\n fetchedUser: action.user,\r\n editingLocalAccountPassword: \"\"\r\n };\r\n },\r\n [Actions.SAVE_USER_INIT]: (state: UsersState, action: Actions.SaveUserInit) => {\r\n return {\r\n ...state,\r\n saving: true\r\n }\r\n },\r\n [Actions.SAVE_USER_COMPLETE]: (state: UsersState, action: Actions.SaveUserComplete) => {\r\n return {\r\n ...state,\r\n saving: false,\r\n editingUser: null,\r\n // update the user in our list with the saved version\r\n userList: {\r\n ...state.userList,\r\n users: state.userList.users.map(user => user.id === action.user!.id ? action.user : user)\r\n }\r\n } as UsersState;\r\n },\r\n [Actions.SET_INVITING_USER_EMAIL]: (state: UsersState, action: Actions.SetInvitingUserEmail) => {\r\n return {\r\n ...state,\r\n invitingUserEmail: action.email.trim(),\r\n invitingUserValidation: validateInvitingUserEmail(action.email.trim())\r\n }\r\n },\r\n [Actions.INVITE_USER_INIT]: (state: UsersState, action: Actions.InviteUserInit) => {\r\n return {\r\n ...state,\r\n saving: true,\r\n invitingUser: true\r\n }\r\n },\r\n [Actions.INVITE_USER_COMPLETE]: (state: UsersState, action: Actions.InviteUserComplete) => {\r\n if (action.succeeded) {\r\n return {\r\n ...state,\r\n saving: false,\r\n invitingUser: false,\r\n invitingUserEmail: null,\r\n invitingUserValidation: null\r\n }\r\n } else {\r\n return {\r\n ...state,\r\n saving: false,\r\n invitingUser: false,\r\n invitingUserValidation: action.validationResponse\r\n }\r\n }\r\n },\r\n [Actions.INVITE_BATCH_USERS_INIT]: (state: UsersState, action: Actions.InviteBatchUsersInit) => {\r\n return {\r\n ...state,\r\n saving: true,\r\n invitingUser: true\r\n }\r\n },\r\n [Actions.INVITE_BATCH_USERS_COMPLETE]: (state: UsersState, action: Actions.InviteBatchUsersComplete) => {\r\n if(action.succeeded) {\r\n return {\r\n ...state,\r\n invitingUser: false,\r\n invitedUsers: action.result ?? 0,\r\n invitedTime: new Date()\r\n }\r\n }\r\n else {\r\n return {\r\n ...state,\r\n invitingUser: false,\r\n invitedUsers: -1\r\n }\r\n }\r\n },\r\n [Actions.RESEND_INVITE_USER_INIT]: (state: UsersState, action: Actions.ResendInviteUserInit) => {\r\n return {\r\n ...state,\r\n saving: true,\r\n processingReinviteEmail: action.user.email\r\n }\r\n },\r\n [Actions.RESEND_INVITE_USER_COMPLETE]: (state: UsersState, action: Actions.ResendInviteUserComplete) => {\r\n return {\r\n ...state,\r\n saving: false,\r\n processingReinviteEmail: null,\r\n externalUserList: state.externalUserList.map(user => user.email === action.user!.email ? action.user : user)\r\n } as UsersState;\r\n },\r\n [Actions.SET_EXTERNAL_USER_ENABLED_INIT]: (state: UsersState, action: Actions.SetExternalUserEnabledInit) => {\r\n return {\r\n ...state,\r\n saving: true,\r\n processingToggleEnableEmail: action.email\r\n }\r\n },\r\n [Actions.SET_EXTERNAL_USER_ENABLED_COMPLETE]: (state: UsersState, action: Actions.SetExternalUserEnabledComplete) => {\r\n return {\r\n ...state,\r\n saving: false,\r\n externalUserList: state.externalUserList.map(user => user.email === action.user!.email ? action.user : user),\r\n processingToggleEnableEmail: null\r\n } as UsersState;\r\n },\r\n [Actions.UPLOAD_BATCH_INVITE_FILE_INIT]: (state: UsersState, action: Actions.UploadBatchInviteFileInit) => {\r\n return {\r\n ...state,\r\n saving: true,\r\n uploadingBatchInvite: true,\r\n batchUploadValidation: null\r\n }\r\n },\r\n [Actions.UPLOAD_BATCH_INVITE_FILE_COMPLETE]: (state: UsersState, action: Actions.UploadBatchInviteFileComplete) => {\r\n if (action.succeeded) {\r\n return {\r\n ...state,\r\n saving: false,\r\n uploadingBatchInvite: false\r\n };\r\n } else {\r\n return {\r\n ...state,\r\n saving: false,\r\n uploadingBatchInvite: false,\r\n batchUploadValidation: action.validationResponse\r\n }\r\n }\r\n },\r\n [Actions.CREATE_RESEND_PENDING_INVITE_INIT] : (state: UsersState, action: Actions.UploadBatchInviteFileInit) => {\r\n return {\r\n ...state,\r\n saving: true,\r\n reinvitingPendingUsers: true\r\n }\r\n },\r\n [Actions.CREATE_RESEND_PENDING_INVITE_COMPLETE] : (state: UsersState, action: Actions.UploadBatchInviteFileComplete) => {\r\n if (action.succeeded) {\r\n return {\r\n ...state,\r\n saving: false,\r\n reinvitingPendingUsers: false\r\n\r\n };\r\n } else {\r\n return {\r\n ...state,\r\n saving: false,\r\n reinvitingPendingUsers: false\r\n }\r\n }\r\n },\r\n [Actions.DELETE_PENDING_USER_LIST_INIT]: (state: UsersState, action: Actions.DeletePendingUserListInit) => {\r\n return {\r\n ...state,\r\n saving: true,\r\n deletingPendingUsers: true\r\n };\r\n },\r\n [Actions.DELETE_PENDING_USER_LIST_COMPLETE]: (state: UsersState, action: Actions.DeletePendingUserListComplete) => {\r\n const externalUserList = !action.succeeded\r\n ? state.externalUserList\r\n : state.externalUserList.filter(user => {\r\n return action.pendingUserEmails.indexOf(user.email) === -1\r\n });\r\n return {\r\n ...state,\r\n saving: false,\r\n deletingPendingUsers: false,\r\n externalUserList\r\n };\r\n },\r\n [Actions.DELETE_EXTERNAL_USER_INIT]: (state: UsersState, action: Actions.DeleteExternalUserInit) => {\r\n return {\r\n ...state,\r\n saving: true,\r\n deletingUser: true\r\n };\r\n },\r\n [Actions.DELETE_EXTERNAL_USER_COMPLETE]: (state: UsersState, action: Actions.DeleteExternalUserComplete) => {\r\n const externalUserList = !action.succeeded\r\n ? state.externalUserList\r\n : state.externalUserList.filter(user => {\r\n return user.email !== action.user!.email;\r\n });\r\n const userList = !action.succeeded\r\n ? state.userList\r\n : {\r\n ...state.userList,\r\n users: state.userList.users.filter(user => {\r\n return user.email !== action.user!.email;\r\n })\r\n };\r\n return {\r\n ...state,\r\n saving: false,\r\n deletingUser: false,\r\n externalUserList,\r\n userList\r\n }\r\n },\r\n [Actions.LEGACY_FIX_INIT]: (state: UsersState, action: Actions.DeleteExternalUserComplete) => {\r\n return {\r\n ...state,\r\n saving: true,\r\n legacyFixComplete: false\r\n }\r\n },\r\n [Actions.LEGACY_FIX_COMPLETE]: (state: UsersState, action: Actions.DeleteExternalUserComplete) => {\r\n return {\r\n ...state,\r\n saving: false,\r\n legacyFixComplete: true\r\n }\r\n },\r\n /* User creation */\r\n [Actions.HANDLE_USER_CREATION_FIRSTNAME]: (state: UsersState, action: Actions.HandleUserCreationFirstName) => {\r\n let newUserState = {\r\n ...state.creatingUser,\r\n firstName: action.firstName\r\n }\r\n\r\n return {\r\n ...state,\r\n creatingUser: newUserState\r\n }\r\n },\r\n [Actions.HANDLE_USER_CREATION_LASTNAME]: (state: UsersState, action: Actions.HandleUserCreationLastName) => {\r\n let newUserState = {\r\n ...state.creatingUser,\r\n lastName: action.lastName\r\n }\r\n\r\n return {\r\n ...state,\r\n creatingUser: newUserState\r\n }\r\n },\r\n [Actions.HANDLE_USER_CREATION_USERID]: (state: UsersState, action: Actions.HandleUserCreationUserId) => {\r\n let newUserState = {\r\n ...state.creatingUser,\r\n userName: action.userId\r\n }\r\n\r\n return {\r\n ...state,\r\n creatingUser: newUserState\r\n }\r\n },\r\n [Actions.HANDLE_USER_CREATION_EMAIL]: (state: UsersState, action: Actions.HandleUserCreationEmail) => {\r\n let newUserState = {\r\n ...state.creatingUser,\r\n email: action.email\r\n }\r\n\r\n return {\r\n ...state,\r\n creatingUser: newUserState\r\n }\r\n },\r\n [Actions.HANDLE_USER_CREATION_PASSWORD]: (state: UsersState, action: Actions.HandleUserCreationPassword) => {\r\n let newUserState = {\r\n ...state.creatingUser,\r\n initialPassword: action.password\r\n }\r\n\r\n return {\r\n ...state,\r\n creatingUser: newUserState\r\n }\r\n },\r\n [Actions.HANDLE_USER_CREATION_EMPLOYEEID]: (state: UsersState, action: Actions.HandleUserCreationEmployeeId) => {\r\n let newUserState = {\r\n ...state.creatingUser,\r\n employeeId: action.employeeId\r\n }\r\n\r\n return {\r\n ...state,\r\n creatingUser: newUserState\r\n } as UsersState\r\n },\r\n [Actions.HANDLE_USER_CREATION_TITLE]: (state: UsersState, action: Actions.HandleUserCreationTitle) => {\r\n let newUserState = {\r\n ...state.creatingUser,\r\n title: action.title\r\n }\r\n\r\n return {\r\n ...state,\r\n creatingUser: newUserState\r\n } as UsersState\r\n },\r\n [Actions.HANDLE_USER_CREATION_DEPARTMENT]: (state: UsersState, action: Actions.HandleUserCreationDepartment) => {\r\n let newUserState = {\r\n ...state.creatingUser,\r\n department: action.department\r\n }\r\n\r\n return {\r\n ...state,\r\n creatingUser: newUserState\r\n } as UsersState\r\n },\r\n [Actions.HANDLE_USER_CREATION_REGION]: (state: UsersState, action: Actions.HandleUserCreationRegion) => {\r\n let newUserState = {\r\n ...state.creatingUser,\r\n region: action.region\r\n }\r\n\r\n return {\r\n ...state,\r\n creatingUser: newUserState\r\n } as UsersState\r\n },\r\n [Actions.HANDLE_USER_CREATION_COUNTRY]: (state: UsersState, action: Actions.HandleUserCreationCountry) => {\r\n let newUserState = {\r\n ...state.creatingUser,\r\n country: action.country\r\n }\r\n\r\n return {\r\n ...state,\r\n creatingUser: newUserState\r\n } as UsersState\r\n },\r\n [Actions.HANDLE_USER_CREATION_PREFERREDEMAIL]: (state: UsersState, action: Actions.HandleUserCreationPreferredEmail) => {\r\n let newUserState = {\r\n ...state.creatingUser,\r\n preferredEmail: action.preferredEmail\r\n }\r\n\r\n return {\r\n ...state,\r\n creatingUser: newUserState\r\n } as UsersState\r\n },\r\n [Actions.HANDLE_USER_CREATION_PREFERREDSMSPHONE]: (state: UsersState, action: Actions.HandleUserCreationPreferredSMSPhone) => {\r\n let newUserState = {\r\n ...state.creatingUser,\r\n preferredSMSPhone: action.preferredSMSPhone\r\n }\r\n\r\n return {\r\n ...state,\r\n creatingUser: newUserState\r\n } as UsersState\r\n },\r\n [Actions.HANDLE_USER_CREATION_AUDIENCES]: (state: UsersState, action: Actions.HandleUserCreationAudiences) => {\r\n let newUserState = {\r\n ...state.creatingUser,\r\n audiences: action.audiences,\r\n }\r\n return {\r\n ...state,\r\n creatingUser: newUserState\r\n } as UsersState\r\n },\r\n [Actions.HANDLE_USER_CREATION_ROLES]: (state: UsersState, action: Actions.ToggleUserRole) => {\r\n let newRoles = state.creatingUser?.roles ?? [];\r\n\r\n if (newRoles.includes(action.roleName)) {\r\n newRoles = newRoles.filter(role => role !== action.roleName)\r\n } else {\r\n newRoles.push(action.roleName)\r\n }\r\n return {\r\n ...state,\r\n creatingUser: {\r\n ...state.creatingUser,\r\n roles: newRoles\r\n }\r\n } as UsersState;\r\n },\r\n [Actions.HANDLE_USER_CREATION_SUBMISSION_MANAGER]: (state: UsersState, action: Actions.HandleUserCreationSubmissionManager) => {\r\n let newUserState = {\r\n ...state.creatingUser,\r\n canManageSubmissions: action.canManageSubmissions\r\n }\r\n\r\n return {\r\n ...state,\r\n creatingUser: newUserState,\r\n } as UsersState;\r\n },\r\n [Actions.HANDLE_USER_CREATION_SUBSCRIBED_TO_FLAGGING_NOTIFICATIONS]: (state: UsersState, action: Actions.HandleUserCreationSubscribedToFlaggingNotifications) => {\r\n let newUserState = {\r\n ...state.creatingUser,\r\n subscribedToFlaggingNotifications: action.subscribedToFlaggingNotifications\r\n }\r\n\r\n return {\r\n ...state,\r\n creatingUser: newUserState,\r\n } as UsersState;\r\n },\r\n\r\n [Actions.HANDLE_UPDATE_UPDATING_USER_ID]: (state: UsersState, action: Actions.HandleUpdateUpdatingUserId) => {\r\n return {\r\n ...state,\r\n fetchedUser: {\r\n ...state.fetchedUser,\r\n id: action.id\r\n }\r\n } as UsersState;\r\n },\r\n [Actions.HANDLE_EDIT_PASSWORD]: (state: UsersState, action: Actions.EditPasswordAction) => {\r\n return {\r\n ...state,\r\n editingLocalAccountPassword: action.password\r\n } as UsersState\r\n },\r\n [Actions.HANDLE_UPDATE_MOBILE_CONSENT]: (state: UsersState, action: Actions.UpdateMobileConsentAction) => {\r\n return {\r\n ...state,\r\n fetchedUser: {\r\n ...state.fetchedUser,\r\n preferredSMSConsent: action.consent\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\nfunction validateInvitingUserEmail(email: string): ValidationResponse | null {\r\n const emailPattern = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\r\n if (email && !emailPattern.test(email)) {\r\n return {\r\n Message: \"Invalid email\",\r\n ModelState: {\r\n Email: [\"Doesn't look like a valid email address.\"]\r\n }\r\n } as ValidationResponse;\r\n }\r\n return null;\r\n}\r\n\r\nexport const reducer = (state: UsersState, action: Action) => {\r\n\r\n const actionHandlerMethod = actionHandler[action.type];\r\n if (actionHandlerMethod) {\r\n return actionHandlerMethod(state, action);\r\n }\r\n\r\n return state || defaultState;\r\n}\r\n","import * as actionCreator from \"./actionCreator\";\r\nimport * as reducer from \"./reducer\";\r\n\r\nexport const actions = {\r\n ...actionCreator\r\n}\r\n\r\nexport const reducers = {\r\n users: reducer.reducer\r\n}\r\n\r\nexport * from \"./actions\"\r\nexport * from \"./models\"\r\n","/**\r\n * Map userSettings.accountType to b2c identity provider domain\r\n * Note: returns must match the idp list in our b2c policy\r\n */\r\nexport const mapSocialProviderNameToDomainHint = (providerName: string): string => {\r\n let result: string = \"\";\r\n providerName = providerName.toLowerCase();\r\n\r\n if (providerName.startsWith(\"azuread\"))\r\n result = \"https://login.microsoftonline.com\";\r\n else if (providerName.startsWith(\"google\"))\r\n result = \"google.com\";\r\n else if (providerName.startsWith(\"linkedin\"))\r\n result = \"linkedin.com\";\r\n else if (providerName.startsWith(\"facebook\"))\r\n result = \"Facebook.com\";\r\n else if (providerName.startsWith(\"apple\"))\r\n result = \"https://appleid.apple.com\";\r\n else if (providerName.startsWith(\"live\"))\r\n result = \"https://login.live.com\";\r\n else if (providerName.startsWith(\"sparrow-local\"))\r\n result = \"sparrowconnected.onmicrosoft.com\";\r\n\r\n return result;\r\n}\r\n","import { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { Store } from \"redux\";\r\nimport confirm, { errorAlert } from 'utils/notyPopups';\r\nimport {\r\n AccountInfo,\r\n AuthenticationResult,\r\n EndSessionRequest,\r\n PublicClientApplication,\r\n RedirectRequest,\r\n SilentRequest,\r\n SsoSilentRequest\r\n} from \"@azure/msal-browser\";\r\nimport { QUERY_PARAM_KEYS } from \"modules/common/hooks/useQueryParams\";\r\nimport { mapSocialProviderNameToDomainHint } from \"utils/idpMapper\";\r\n\r\nexport interface ICustomState {\r\n originatedFrom?: string;\r\n}\r\n\r\nclass MsalAuthModule {\r\n\r\n private _scopes: string[] = `${process.env.REACT_APP_B2CSCOPES}`\r\n .split(\",\")\r\n .map((scope) => `https://${process.env.REACT_APP_B2CTENANTNAME}.onmicrosoft.com/${process.env.REACT_APP_B2CAPICLIENTID}/${scope}`);\r\n\r\n private _graphScopes: string[] = `${process.env.REACT_APP_SYNCFUNCTIONSGRAPHSCOPES}`\r\n .split(\",\")\r\n .map((scope) => `https://${process.env.REACT_APP_B2CTENANTNAME}.onmicrosoft.com/${process.env.REACT_APP_SYNCFUNCTIONSAPICLIENTID}/${scope}`);\r\n\r\n //These are Sparrow known subdomains. If a subdomain is in this list, we will not send them as a domain_hint to B2C\r\n //(which auto directs a user to a specific provider)\r\n private _knownSubDomains: string[] = `${process.env.REACT_APP_KNOWN_SUBDOMAINS}`.split(\",\");\r\n\r\n\r\n private static instance: MsalAuthModule;\r\n private _store: Store | null = null;\r\n\r\n private _msalInstance: PublicClientApplication;\r\n\r\n private constructor(msalInstance: PublicClientApplication, store: Store) {\r\n this._msalInstance = msalInstance;\r\n this._store = store;\r\n }\r\n\r\n public static getInstance(): MsalAuthModule {\r\n return MsalAuthModule.instance;\r\n }\r\n\r\n public static setInstance(msalInstance: PublicClientApplication, store: Store) {\r\n if (!MsalAuthModule.instance) {\r\n MsalAuthModule.instance = new MsalAuthModule(msalInstance, store);\r\n }\r\n }\r\n\r\n public notyOpen: boolean = false;\r\n\r\n login = async (requestConfig: RedirectRequest = {} as RedirectRequest): Promise => {\r\n let baseRequest = this._getBaseRedirectRequest();\r\n await this._msalInstance.loginRedirect({\r\n ...baseRequest,\r\n ...requestConfig,\r\n extraQueryParameters: {\r\n ...baseRequest.extraQueryParameters,\r\n ...requestConfig.extraQueryParameters\r\n }\r\n });\r\n };\r\n\r\n logout = async (signOutSuccess: boolean = false): Promise => {\r\n let currAccount = this.getCurrentAccount();\r\n const endSessionRequest: EndSessionRequest = { account: currAccount };\r\n\r\n if (signOutSuccess)\r\n endSessionRequest.postLogoutRedirectUri = `${this.getLogoutRedirectUri()}?${QUERY_PARAM_KEYS.SIGNED_OUT_SUCCESS}=true`;\r\n\r\n await this._msalInstance.logoutRedirect(endSessionRequest);\r\n };\r\n\r\n invite = async (inviteToken: string, tenantName: string) => {\r\n const authority = `https://${process.env.REACT_APP_B2CTENANTNAME}.b2clogin.com/${process.env.REACT_APP_B2CTENANTNAME}.onmicrosoft.com/${process.env.REACT_APP_B2C_INVITE_FLOW_NAME}`;\r\n const request: RedirectRequest = {\r\n scopes: this._scopes,\r\n extraQueryParameters: {\r\n inviteToken: encodeURIComponent(inviteToken),\r\n tenantName,\r\n },\r\n authority,\r\n };\r\n await this._msalInstance.loginRedirect(request);\r\n }\r\n\r\n resetSparrowPassword = async (token: string) => {\r\n const authority = `https://${process.env.REACT_APP_B2CTENANTNAME}.b2clogin.com/${process.env.REACT_APP_B2CTENANTNAME}.onmicrosoft.com/${process.env.REACT_APP_B2C_RESET_SPARROW_ACCOUNT_PASSWORD_NAME}`;\r\n const request: RedirectRequest = {\r\n scopes: this._scopes,\r\n extraQueryParameters: {\r\n resetPasswordToken: encodeURIComponent(token),\r\n },\r\n authority,\r\n };\r\n\r\n await this._msalInstance.loginRedirect(request);\r\n }\r\n\r\n public getAccessToken = async (): Promise => {\r\n let currAccount = this.getCurrentAccount();\r\n const sid = currAccount?.idTokenClaims!['sid'];\r\n\r\n // if it is an Azure Ad Account, use ssoSilent/sid method\r\n // (sid is the session id of their Azure Active Directory session - a custom claim\r\n // we have configured in the Sparrow Connected Azure Ad Multi Tenant App Registration)\r\n var tokenRequest: SilentRequest;\r\n if (!!sid) {\r\n tokenRequest = {\r\n scopes: this._scopes,\r\n tokenQueryParameters: { accountSelectPrompt: \"none\" },\r\n };\r\n }\r\n else {\r\n let sub = currAccount?.idTokenClaims!['sub'];\r\n currAccount!.username = sub;\r\n\r\n tokenRequest = this._getBaseSilentRequest(currAccount);\r\n }\r\n\r\n try {\r\n let accessTokenResponse = await this._msalInstance.acquireTokenSilent(tokenRequest);\r\n return accessTokenResponse.accessToken;\r\n }\r\n catch {\r\n if (!this.notyOpen) {\r\n this.notyOpen = true;\r\n\r\n try {\r\n if (await this.showRelogPopup()) {\r\n let tokenResponse = await this._msalInstance.acquireTokenPopup(tokenRequest);\r\n this.notyOpen = false;\r\n return tokenResponse.accessToken;\r\n\r\n } else {\r\n let redirectRequest: RedirectRequest;\r\n\r\n if (!!sid) {\r\n redirectRequest = { scopes: this._scopes, sid: sid };\r\n }\r\n else {\r\n redirectRequest = this._getBaseAcquireTokenRedirectRequest(currAccount);\r\n }\r\n\r\n this._msalInstance.acquireTokenRedirect(redirectRequest);\r\n return \"\";\r\n }\r\n }\r\n catch {\r\n this.login();\r\n return \"\";\r\n }\r\n }\r\n }\r\n\r\n return \"\";\r\n };\r\n\r\n getGraphAccessToken = (): Promise => {\r\n let currentAcc = this._msalInstance.getActiveAccount();\r\n var userEmail = this._store?.getState()?.settings.currentUser?.email;\r\n var userIdp = currentAcc!.idTokenClaims!['idp'].replace(\"/v2.0\", \"\");\r\n currentAcc!.username = userEmail!;\r\n\r\n const silentTokenRequest: SilentRequest = {\r\n authority: userIdp,\r\n scopes: this._graphScopes,\r\n account: currentAcc!,\r\n };\r\n\r\n return this._msalInstance\r\n .acquireTokenSilent(silentTokenRequest)\r\n .then((accessTokenResponse) => {\r\n return accessTokenResponse.accessToken;\r\n })\r\n .catch(async (error) => {\r\n if (error.errorCode === \"consent_required\") {\r\n errorAlert(\"Unable to search, Application Consent required, please contact your Administrator or Support\");\r\n }\r\n // user is not authenticated and will need to login again\r\n else if (error.errorCode === \"interaction_required\") {\r\n if (!this.notyOpen) {\r\n this.notyOpen = true;\r\n\r\n if (await this.showRelogPopup()) {\r\n let tokenResponse = await this._msalInstance.acquireTokenPopup(silentTokenRequest);\r\n this.notyOpen = false;\r\n return tokenResponse.accessToken;\r\n\r\n }\r\n else if (currentAcc) {\r\n let redirectRequest = this._getBaseAcquireTokenRedirectRequest(currentAcc);\r\n this._msalInstance.acquireTokenRedirect(redirectRequest);\r\n return \"\";\r\n }\r\n else {\r\n const onErrorTokenRequest: RedirectRequest = { scopes: this._scopes };\r\n this._msalInstance.loginRedirect(onErrorTokenRequest);\r\n return \"\";\r\n }\r\n }\r\n }\r\n else {\r\n const ssoRequest: SsoSilentRequest = {\r\n extraQueryParameters: { accountSelectPrompt: \"none\" },\r\n loginHint: userEmail\r\n };\r\n\r\n return this._msalInstance\r\n .ssoSilent(ssoRequest)\r\n .then((response) => {\r\n this._msalInstance.acquireTokenSilent(silentTokenRequest)\r\n .then((accessTokenResponse) => {\r\n return accessTokenResponse.accessToken;\r\n })\r\n .catch((error) => {\r\n const onErrorTokenRequest: RedirectRequest = { scopes: this._scopes };\r\n this._msalInstance.loginRedirect(onErrorTokenRequest);\r\n return \"\";\r\n })\r\n });\r\n }\r\n });\r\n };\r\n\r\n getCurrentAccount = (): AccountInfo => {\r\n let currAccount = this._msalInstance.getActiveAccount();\r\n\r\n if (!currAccount) {\r\n const accounts = this._msalInstance.getAllAccounts();\r\n if (accounts.length > 0) {\r\n this._msalInstance.setActiveAccount(accounts[0]);\r\n }\r\n\r\n currAccount = accounts[0];\r\n }\r\n\r\n return currAccount;\r\n }\r\n\r\n /**\r\n * Manually handle our redirects\r\n */\r\n public initRedirectHandler = async (handler: (redirectResponse: AuthenticationResult | null) => void) => {\r\n try {\r\n const redirectResponse = await this._msalInstance.handleRedirectPromise();\r\n if (!redirectResponse || !redirectResponse.state) return;\r\n\r\n handler(redirectResponse);\r\n } catch (error) {\r\n }\r\n }\r\n\r\n /**\r\n * Get the base Silent request to use on Silent Requests that do not use an sid\r\n * add domain_hint if subdomain is set\r\n * that way on refresh token or access token renewals the correct auth provider\r\n * is hit (IE: Okta for SSO) rather than the B2C Homepage.\r\n * @returns\r\n */\r\n private _getBaseSilentRequest = (account: AccountInfo): SilentRequest => {\r\n let base: SilentRequest =\r\n {\r\n scopes: this._scopes,\r\n extraQueryParameters: { accountSelectPrompt: \"none\" },\r\n account: account\r\n };\r\n\r\n let subdomain = window.location.host.split(\".\")[0];\r\n\r\n if (!this._subdomainIsKnown(subdomain))\r\n base.extraQueryParameters = { accountSelectPrompt: \"none\", domain_hint: subdomain };\r\n\r\n return base;\r\n };\r\n\r\n /**\r\n * Get the base AcquireTokenRedirect request to use on acquireTokenRedirect\r\n * - add domain hint if custom subdomain is set using _getBaseRedirectRequest\r\n * - note that currently this is only used for non-Azure AD accounts (which have an sid)\r\n * - and mainly for Okta accounts which need to redirect using the domain_hint\r\n * @returns\r\n */\r\n private _getBaseAcquireTokenRedirectRequest = (account: AccountInfo): RedirectRequest => {\r\n let base = this._getBaseRedirectRequest();\r\n let user = this._store?.getState().settings.currentUser;\r\n\r\n let providerName = user?.providerName || \"\";\r\n\r\n account.username = user?.email || \"\";\r\n\r\n base.tokenQueryParameters = { accountSelectPrompt: \"none\" };\r\n base.account = account;\r\n\r\n if (!base.domainHint)\r\n base.domainHint = mapSocialProviderNameToDomainHint(providerName) || \"\";\r\n\r\n return base;\r\n };\r\n\r\n private _getBaseRedirectRequest = (): RedirectRequest => {\r\n let base: RedirectRequest = { scopes: this._scopes, state: JSON.stringify({ originatedFrom: window.location.href }) };\r\n let subdomain = window.location.host.split(\".\")[0];\r\n\r\n const isSubodmainKnown = this._subdomainIsKnown(subdomain);\r\n\r\n // if subodmain is custom, send as extra query param\r\n // otherwise, send as domain hint to direct user to their login provider\r\n if (isSubodmainKnown)\r\n base.extraQueryParameters = {\r\n ...base.extraQueryParameters,\r\n adpOrigin: window.location.origin\r\n };\r\n else\r\n base.domainHint = subdomain;\r\n\r\n return base;\r\n };\r\n\r\n /**\r\n * Check if the subdomain is a known registered one for Sparrow (such as portal in portal.sparrowconnected.com)\r\n * If it is known, it should not be passed into B2C as a domain_hint as portal is not a registered identityProvider\r\n * However in a case like Okta with a custom URL, we do want to pass the subdomain in as the domain_hint\r\n * to hit the identityProvider page directly to use with SSO\r\n */\r\n private _subdomainIsKnown = (subdomain: string): boolean => {\r\n return this._knownSubDomains.includes(subdomain);\r\n };\r\n\r\n /**\r\n * Helper to get the logout redirect uri\r\n */\r\n private getLogoutRedirectUri(): string {\r\n let subdomain = window.location.host.split(\".\")[0];\r\n\r\n //if this is not a known subdomain, do not redirect them to origin\r\n //as it will simply log them back in (the subdomain will be passed\r\n //back in on the login method and they will be logged back in automatically.\r\n if (!this._subdomainIsKnown(subdomain))\r\n return `${window.location.origin}/logout` || \"\";\r\n\r\n return window.location.origin || \"\";\r\n }\r\n\r\n private showRelogPopup = async (): Promise => {\r\n return confirm.show({\r\n text: \"You've been inactive for a while. For security, we closed the session and logged you out. Sign in to continue.\",\r\n title: \"Your session expired\",\r\n yesText: \"Open sign-in window\",\r\n yesColor: \"#2178B0\",\r\n yesIcon: 1,\r\n noText: \"Close\"\r\n })\r\n }\r\n};\r\n\r\nexport default MsalAuthModule;\r\n\r\nexport const msalConfig = {\r\n auth: {\r\n authority: `https://${process.env.REACT_APP_B2CTENANTNAME}.b2clogin.com/${process.env.REACT_APP_B2CTENANTNAME}.onmicrosoft.com/${process.env.REACT_APP_B2CFLOWNAME}`,\r\n clientId: `${process.env.REACT_APP_B2CADMINPORTALCLIENTID}`,\r\n redirectUri: (!!window ? window.location.origin : \"\") + \"/auth\",\r\n knownAuthorities: [\"sparrowconnected.b2clogin.com\"],\r\n postLogoutRedirectUri: (!!window ? window.location.origin : \"\") + \"/\",\r\n navigateToLoginRequestUrl: false\r\n },\r\n cache: {\r\n cacheLocation: \"localStorage\",\r\n storeAuthStateInCookie: false, // Set this to \"true\" if you are having issues on IE11 or Edge\r\n },\r\n // To Enable MSAL Logging to the console, uncomment the following\r\n // system: {\r\n // loggerOptions: {\r\n // loggerCallback: (level, message, containsPii) => {\r\n // if (containsPii) {\r\n // return;\r\n // }\r\n // switch (level) {\r\n // case LogLevel.Error:\r\n // console.error(message);\r\n // return;\r\n // case LogLevel.Info:\r\n // console.info(message);\r\n // return;\r\n // case LogLevel.Verbose:\r\n // console.debug(message);\r\n // return;\r\n // case LogLevel.Warning:\r\n // console.warn(message);\r\n // return;\r\n // }\r\n // }\r\n // }\r\n // }\r\n};\r\n\r\n\r\n","import * as Actions from \"./actions\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { CategoryTagDetails, CategoryTagModel, CategoryTagsListingPage } from \"./models\";\r\nimport API from \"api\";\r\nimport { CategoryTagFilter, CategoryTagsListItem } from \".\";\r\nimport { defaultCategoryTagPage } from \"./reducer\";\r\n\r\n\r\nexport const showNewCategoryTag = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ShowNewCategoryTagAction({}));\r\n}\r\n\r\nexport const hideNewCategoryTag = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.HideNewCategoryTagAction({}));\r\n}\r\n\r\nexport const showViewCategoryTag = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ShowViewCategoryTag({}));\r\n}\r\n\r\nexport const hideViewCategoryTag = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.HideViewCategoryTag({}));\r\n}\r\n\r\nexport const showEditCategoryTag = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ShowEditCategoryTagAction({}));\r\n}\r\n\r\nexport const hideEditCategoryTag = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.HideEditCategoryTagAction({}));\r\n}\r\n\r\nexport const clearErrorMessage = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ClearErrorMessage({}));\r\n}\r\n\r\nexport const addNewTagAction = (toUpload: CategoryTagModel) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.CreateAddNewCategoryTagAction({toUpload}));\r\n\r\n return dispatch(API.categoryTags.CreateCategoryTag(toUpload))\r\n .then(response => {\r\n dispatch(Actions.CreateAddNewCategoryTagComplete({ succeeded: response.status === 200}));\r\n })\r\n .catch(err => {\r\n dispatch(Actions.CreateAddNewCategoryTagComplete({ succeeded: false, err}));\r\n return false;\r\n })\r\n} \r\n\r\nexport const editTagAction = (toUpload: CategoryTagModel) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.EditCategoryTagAction({toUpload}));\r\n\r\n return dispatch(API.categoryTags.EditCategoryTag(toUpload))\r\n .then(response => {\r\n dispatch(Actions.EditCategoryTagComplete({ succeeded: response.status === 200}));\r\n })\r\n .catch(err => {\r\n dispatch(Actions.EditCategoryTagComplete({ succeeded: false, err}));\r\n return false;\r\n })\r\n}\r\n\r\nexport const clearShouldFetch = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ClearShouldFetch({}));\r\n}\r\n\r\nexport const getCategoryTags = (pageNumber: number, filters: Partial) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetCategoryTags({}));\r\n\r\n return dispatch(API.categoryTags.GetCategoryTags(pageNumber, filters))\r\n .then(response => response.json())\r\n .then(page => {\r\n dispatch(Actions.GetCategoryTagsComplete({ succeeded: true, page }));\r\n return page;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetCategoryTagsComplete({ succeeded: false, page: defaultCategoryTagPage, err }));\r\n return;\r\n });\r\n}\r\n \r\n export const getDisabledCategoryTags = (pageNumber: number, filters: Partial) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetDisabledCategoryTags({}));\r\n\r\n return dispatch(API.categoryTags.GetDisabledCategoryTags(pageNumber, filters))\r\n .then(response => response.json())\r\n .then(page => {\r\n dispatch(Actions.GetDisabledCategoryTagsComplete({ succeeded: true, page }));\r\n return page;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetDisabledCategoryTagsComplete({ succeeded: false, page: defaultCategoryTagPage, err }));\r\n return;\r\n });\r\n}\r\n \r\nexport const getEnabledCategoryTags = (pageNumber: number, filters: Partial) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetEnabledCategoryTags({}));\r\n\r\n return dispatch(API.categoryTags.GetEnabledCategoryTags(pageNumber, filters))\r\n .then(response => response.json())\r\n .then(page => {\r\n dispatch(Actions.GetEnabledCategoryTagsComplete({ succeeded: true, page }));\r\n return page;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetEnabledCategoryTagsComplete({ succeeded: false, page: defaultCategoryTagPage, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getUserCategoryTags = () => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.categoryTags.GetUserCategoryTags())\r\n .then(response => response.json())\r\n .then(categoryTags => {\r\n dispatch(Actions.GetUserCategoryTagsComplete({ succeeded: true, categoryTags: categoryTags.map(tag => ({ id: tag.Id, name: tag.Title })) }));\r\n return true;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetUserCategoryTagsComplete({ succeeded: false, categoryTags: [], err }));\r\n return false;\r\n });\r\n }\r\n\r\nexport const deleteCategoryTag = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.DeleteCategoryTag({}));\r\n\r\n return dispatch(API.categoryTags.DeleteCategoryTag(id))\r\n .then(response => {\r\n dispatch(Actions.DeleteCategoryTagComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DeleteCategoryTagComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const deleteCategoryTags = (categoryTags: CategoryTagsListItem[]) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.DeleteCategoryTags({}));\r\n\r\n return Promise.all(categoryTags.map(categoryTag => \r\n dispatch(API.categoryTags.DeleteCategoryTag(categoryTag.id))\r\n ))\r\n .then(response => {\r\n dispatch(Actions.DeleteCategoryTagsComplete({ succeeded: true }));\r\n return true;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DeleteCategoryTagsComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const disableCategoryTag = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.DisableCategoryTag({}))\r\n\r\n return dispatch(API.categoryTags.ChangeCategoryTagState(false, id))\r\n .then(response => {\r\n dispatch(Actions.DisableCategoryTagComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DisableCategoryTagComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const enableCategoryTag = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.EnableCategoryTag({}))\r\n\r\n return dispatch(API.categoryTags.ChangeCategoryTagState(true, id))\r\n .then(response => {\r\n dispatch(Actions.EnableCategoryTagComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.EnableCategoryTagComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const getCategoryTagDownload = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetCategoryTagDownload({}))\r\n\r\n return dispatch(API.categoryTags.GetCategoryTagDownload(id))\r\n .then(response => {\r\n return response.json();\r\n })\r\n .catch(err => {\r\n return \"\";\r\n });\r\n}\r\n\r\nexport const getCategoryTagDownloadFromAnalytics = (toDownload: CategoryTagDetails) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetCategoryTagDownloadFromAnalytics({}))\r\n\r\n return dispatch(API.categoryTags.GetCategoryTagDownloadFromAnalytics(toDownload))\r\n .then(response => {\r\n return response.json();\r\n })\r\n .catch(err => {\r\n return \"\";\r\n })\r\n}\r\n\r\nexport const setTagToEdit = (toEdit: CategoryTagsListItem) => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.SetTagToEdit({toEdit}))\r\n}\r\n\r\nexport const setTagToView = (id: string, tag: CategoryTagsListItem | undefined) => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.SetTagToView({id, tag}));\r\n}\r\n\r\nexport const loadCategoryTagAnalytics = (id: string) => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.LoadCategoryTagAnalytics({}))\r\n\r\n return dispatch(API.categoryTags.GetCategoryTagAnalytics(id))\r\n .then(response => {\r\n dispatch(Actions.LoadCategoryTagAnalyticsComplete({ succeeded: response.status === 200 }));\r\n return response.json();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.LoadCategoryTagAnalyticsComplete({ succeeded: false, err }));\r\n return null;\r\n })\r\n}\r\n\r\nexport const downloadAllCategoryTags = () => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.DownloadAllCategoryTags({}))\r\n\r\n return dispatch(API.categoryTags.DownloadAllCategoryTags())\r\n .then(response => {\r\n return response.json();\r\n })\r\n .catch(err => {\r\n return \"\";\r\n })\r\n}\r\n\r\nexport const downloadCategoryTags = (ids: string[]) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.DownloadCategoryTags({}));\r\n\r\n return dispatch(API.categoryTags.DownloadCategoryTags(ids))\r\n .then(response => {\r\n return response.json();\r\n })\r\n .catch(err => {\r\n return \"\";\r\n })\r\n}","import * as actionCreator from \"./actionCreator\";\r\nimport * as reducer from \"./reducer\";\r\n\r\nexport const actions = {\r\n ...actionCreator\r\n}\r\n\r\nexport const reducers = {\r\n portalPages: reducer.reducer\r\n}\r\n\r\nexport * from \"./actions\";\r\nexport * from \"./models\";","import { Action } from \"redux\";\r\nimport * as Actions from \"./actions\";\r\nimport { ProfileState } from \"./models\";\r\n\r\n\r\nconst defaultState: ProfileState = {\r\n userSettings: null,\r\n errorMessage: \"\",\r\n isFetching: false,\r\n isInitialLoad: true,\r\n isSaving: false,\r\n isUploading: false,\r\n shouldFetch: false\r\n};\r\n\r\nconst actionHandler: { [actionType: string]: (state: ProfileState, action: any) => ProfileState } = {\r\n\r\n [Actions.INITIALIZE_USER_SETTINGS]: (state: ProfileState, action: Actions.InitializeUserSettings) => {\r\n return {\r\n ...state,\r\n userSettings: { ...action.userSettings },\r\n errorMessage: \"\",\r\n isFetching: false,\r\n isInitialLoad: false,\r\n shouldFetch: false\r\n };\r\n },\r\n\r\n [Actions.UPDATE_USER_SETTINGS]: (state: ProfileState, action: Actions.UpdateUserSettings) => {\r\n return {\r\n ...state,\r\n userSettings: {\r\n ...state.userSettings!,\r\n ...action.userSettings\r\n }\r\n };\r\n },\r\n\r\n [Actions.SAVE_USER_SETTINGS]: (state: ProfileState, action: Actions.SaveUserSettings) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.SAVE_USER_SETTINGS_COMPLETE]: (state: ProfileState, action: Actions.SaveUserSettingsComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to save settings\",\r\n isSaving: false\r\n };\r\n },\r\n\r\n [Actions.CLEAR_ERROR_MESSAGE]: (state: ProfileState, action: Actions.ClearErrorMessage) => {\r\n return {\r\n ...state,\r\n errorMessage: \"\"\r\n };\r\n }\r\n\r\n}\r\n\r\nexport const reducer = (state: ProfileState, action: Action) => {\r\n const actionHandlerMethod = actionHandler[action.type];\r\n if (actionHandlerMethod) {\r\n return actionHandlerMethod(state, action);\r\n }\r\n return state || defaultState;\r\n};\r\n","import * as actionCreator from \"./actionCreator\";\r\nimport * as reducer from \"./reducer\";\r\n\r\nexport const actions = {\r\n ...actionCreator\r\n}\r\n\r\nexport const reducers = {\r\n resources: reducer.reducer\r\n}\r\n\r\nexport * from \"./actions\"\r\nexport * from \"./models\"\r\n","import { Action } from 'redux';\r\nimport * as Actions from './actions';\r\nimport { ResourcesState } from './models';\r\n\r\nconst defaultState = {\r\n lcidMappings: {\r\n 'en-us': {\r\n language: \"English (US)\"\r\n }\r\n },\r\n emailSubjectsResource: {\r\n subjects: {\r\n }\r\n },\r\n smsBodiesResource: {\r\n bodies: {\r\n }\r\n },\r\n pushContentsResource: {\r\n contents: {\r\n }\r\n }\r\n} as ResourcesState;\r\n\r\nconst actionHandler: { [actionType: string]: (state: ResourcesState, action: Action) => ResourcesState } = {\r\n\r\n [Actions.SET_LCID_MAPPINGS]: (state: ResourcesState, action: Actions.SetLcidMappings) => {\r\n return {\r\n ...state,\r\n lcidMappings: action.mappings\r\n }\r\n },\r\n [Actions.SET_EMAIL_RESOURCE]: (state: ResourcesState, action: Actions.SetEmailResource) => {\r\n return {\r\n ...state,\r\n emailSubjectsResource: action.resource.subjects\r\n }\r\n },\r\n [Actions.SET_SMS_RESOURCE]: (state: ResourcesState, action: Actions.SetSmsResource) => {\r\n return {\r\n ...state,\r\n smsBodiesResource: action.resource.bodies\r\n }\r\n },\r\n [Actions.SET_MOBILE_RESOURCE]: (state: ResourcesState, action: Actions.SetMobileResource) => {\r\n return {\r\n ...state,\r\n pushContentsResource: action.resource.contents\r\n }\r\n }\r\n\r\n}\r\n\r\nexport const reducer = (state: ResourcesState, action: Action) => {\r\n const actionHandlerMethod = actionHandler[action.type];\r\n return actionHandlerMethod \r\n ? actionHandlerMethod(state, action)\r\n : state || defaultState;\r\n}\r\n","import * as actionCreator from \"./actionCreator\";\r\nimport * as reducer from \"./reducer\";\r\n\r\nexport const actions = {\r\n ...actionCreator\r\n}\r\n\r\nexport const reducers = {\r\n surveys: reducer.reducer\r\n}\r\n\r\nexport * from \"./actions\";\r\nexport * from \"./models\";","import { Action } from \"redux\";\r\nimport * as Actions from \"./actions\";\r\nimport {SurveysState, Survey} from './models';\r\n\r\nconst defaultState: SurveysState = {\r\n surveyList: [],\r\n isFetching: false,\r\n isDeleting: false,\r\n isSaving: false\r\n};\r\n\r\nconst actionHandler: { [actionType: string]: (state: SurveysState, action: any) => SurveysState } = {\r\n\r\n [Actions.GET_SURVEYS]: (state: SurveysState, action: Actions.GetSurveys) => {\r\n return {...state, isFetching: true};\r\n },\r\n\r\n [Actions.GET_SURVEYS_COMPLETE]: (state: SurveysState, action: Actions.GetSurveysComplete) => {\r\n return {\r\n ...state,\r\n isFetching: false,\r\n surveyList: [...state.surveyList, ...(action.succeeded && !!action.surveys ? action.surveys : ([] as Survey[])) ]\r\n } as SurveysState;\r\n },\r\n\r\n\r\n [Actions.GET_SURVEY]: (state: SurveysState, action: Actions.GetSurveys) => {\r\n return {...state, isFetching: true};\r\n },\r\n\r\n [Actions.GET_SURVEY_COMPLETE]: (state: SurveysState, action: Actions.GetSurveysComplete) => {\r\n return { ...state,isFetching: false };\r\n },\r\n\r\n\r\n [Actions.DELETE_SURVEYS]: (state: SurveysState, action: Actions.DeleteSurveys) => {\r\n return { ...state, isDeleting: true };\r\n },\r\n\r\n [Actions.DELETE_SURVEYS_COMPLETE]: (state: SurveysState, action: Actions.DeleteSurveysComplete) => {\r\n const surveyList = action.succeeded && !!action.deletedSurveys\r\n ? state.surveyList.filter(s => action.deletedSurveys!.indexOf(s.id) < 0) \r\n : state.surveyList;\r\n return {\r\n ...state,\r\n isDeleting: false,\r\n surveyList\r\n }\r\n },\r\n\r\n\r\n [Actions.SAVE_SURVEY]: (state: SurveysState, action: Actions.SaveSurvey) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.SAVE_SURVEY_COMPLETE]: (state: SurveysState, action: Actions.SaveSurveyComplete) => {\r\n return {\r\n ...state,\r\n isSaving: false\r\n }\r\n },\r\n\r\n \r\n [Actions.CLEAR_SURVEY_LIST]: (state: SurveysState, action: Actions.ClearSurveyList) => {\r\n return {\r\n ...state,\r\n surveyList: []\r\n }\r\n }\r\n}\r\n\r\nexport const reducer = (state: SurveysState, action: Action) => {\r\n const actionHandlerMethod = actionHandler[action.type];\r\n if (actionHandlerMethod) {\r\n return actionHandlerMethod(state, action);\r\n }\r\n return state || defaultState;\r\n};\r\n","import { Action } from \"redux\";\r\nimport * as Actions from \"./actions\";\r\n\r\nimport { TenantState } from \"./models\";\r\n\r\nconst defaultState = {\r\n id: null\r\n};\r\n\r\nconst actionHandler: { [actionType: string]: (state: TenantState, action: Action) => TenantState } = {\r\n\r\n [Actions.SET_TENANT_ID]: (state: TenantState, action: Actions.SetTenantId) => {\r\n return {...state, id: action.tenantId } as TenantState;\r\n }\r\n}\r\n\r\nexport const reducer = (state: TenantState, action: Action) => {\r\n\r\n const actionHandlerMethod = actionHandler[action.type];\r\n if (actionHandlerMethod) {\r\n return actionHandlerMethod(state, action);\r\n }\r\n\r\n return state || defaultState;\r\n};\r\n","import * as actionCreator from \"./actionCreator\";\r\nimport * as reducer from \"./reducer\";\r\n\r\nexport const actions = {\r\n ...actionCreator\r\n}\r\n\r\nexport const reducers = {\r\n adminLayoutReducer: reducer.reducer\r\n}\r\n\r\nexport * from \"./actions\";\r\nexport * from \"./models\";\r\n","import { Action } from 'redux';\r\nimport * as actions from './actions';\r\nimport { IAdminLayoutState } from './models';\r\n\r\nconst DEFAULT_STATE: IAdminLayoutState = {\r\n mainStyle: undefined,\r\n shouldDisplayNav: true\r\n};\r\n\r\nexport const actionHandler: { [actionType: string]: (state: IAdminLayoutState, action: Action) => IAdminLayoutState } = {\r\n [actions.SET_MAIN_STYLE]: (state: IAdminLayoutState, action: actions.ISetMainStyle) => {\r\n return {\r\n ...state,\r\n mainStyle: action.newStyle\r\n };\r\n },\r\n [actions.SET_HEADER_STYLE]: (state: IAdminLayoutState, action: actions.ISetHeaderStyle) => {\r\n return {\r\n ...state,\r\n headerStyle: action.newStyle\r\n };\r\n },\r\n [actions.SET_SHOULD_DISPLAY_NAV]: (state: IAdminLayoutState, action: actions.ISetShouldDisplayName) => {\r\n return {\r\n ...state,\r\n shouldDisplayNav: action.shouldDisplay\r\n };\r\n }\r\n}\r\n\r\nexport const reducer = (state: IAdminLayoutState, action: Action) => {\r\n const actionHandlerMethod = actionHandler[action.type];\r\n if (actionHandlerMethod) {\r\n return actionHandlerMethod(state, action);\r\n }\r\n\r\n return state || DEFAULT_STATE;\r\n};\r\n","import * as actionCreator from \"./actionCreator\";\r\nimport * as reducer from \"./reducer\";\r\n\r\nexport const actions = {\r\n ...actionCreator\r\n}\r\n\r\nexport const reducers = {\r\n userPortalLayoutReducer: reducer.reducer\r\n}\r\n\r\nexport * from \"./actions\";\r\nexport * from \"./models\";\r\n","import { Survey } from 'modules/surveys';\r\n\r\nexport interface ApplicationState {\r\n insights: InsightsState\r\n}\r\n\r\nexport interface InsightsState {\r\n postStats: PostStats[];\r\n userCounts: UserCount[] | null;\r\n commentAndReactionCounts: CommentAndReactionCount[] | null;\r\n platformStats: PlatformStats[] | null;\r\n post: DetailedPostStats | null;\r\n readViewStats: ReadViewStatByHour[] | null;\r\n topChannels: TagStats[];\r\n tagStats: DetailedTagStats;\r\n surveys: Survey[];\r\n topEvents: TopEvent[];\r\n userTrends: UserTrends | null;\r\n toFetch: boolean;\r\n}\r\n\r\nexport interface TopEvent {\r\n eventId: string;\r\n tenantId: string;\r\n eventName: string;\r\n viewCount: number;\r\n draftId: string;\r\n}\r\n\r\nexport interface UserTrends {\r\n uniqueUserReactionCommentOnPost: number;\r\n uniqueUserViewPostEvent: number;\r\n}\r\n\r\nexport interface CommentAndReactionCount {\r\n commentCount: number;\r\n reactionCount: number;\r\n rangeStart: Date;\r\n friendlyRangeDescription: string;\r\n}\r\n\r\nexport interface UserCount {\r\n countOfUsers: number;\r\n activeLast30Days: number;\r\n registeredUsers: number;\r\n dateRounded: Date;\r\n monthName: string;\r\n}\r\n\r\nexport interface PlatformStats {\r\n platformName: string;\r\n platformDescription: string;\r\n readCount: number;\r\n}\r\n\r\nexport interface PostStats {\r\n id: string;\r\n title: string;\r\n author: string;\r\n readCount: number;\r\n postOpenCount: number;\r\n isMandatory: boolean;\r\n dateCreated: Date;\r\n isDeleted: boolean;\r\n}\r\n\r\nexport interface DetailedPostStats extends PostStats {\r\n translatedContent: {\r\n [lang: string]: {\r\n title: string;\r\n body: string;\r\n }\r\n };\r\n imageId: string;\r\n tags: PostStatsTag[];\r\n readStats: PostRead[] | null;\r\n reactions: PostStatsReaction[];\r\n}\r\n\r\nexport interface PostStatsTag {\r\n id: string;\r\n name: string;\r\n}\r\n\r\nexport interface PostStatsReaction {\r\n id: string;\r\n name: string;\r\n count: number;\r\n}\r\n\r\nexport interface FirstWeekPostStat {\r\n postId: string;\r\n countOfViews: number,\r\n countOfReads: number,\r\n publishDate: Date;\r\n eventDate: Date;\r\n}\r\n\r\nexport interface PostRead {\r\n postId: string;\r\n timestamp: Date;\r\n userId: string;\r\n elapsedTime: number;\r\n depth: number;\r\n}\r\n\r\nexport interface ReadViewStatByHour {\r\n viewCount: number;\r\n readCount: number;\r\n utcHour: number;\r\n rangeStart: number;\r\n rangeEnd: number;\r\n}\r\n\r\nexport interface TagStats {\r\n id: string;\r\n groupName: string;\r\n name: string;\r\n isMandatory: boolean;\r\n subscriberCount: number;\r\n postCount: number;\r\n viewCount: number;\r\n}\r\n\r\nexport const defaultTagStats: TagStats = {\r\n id: \"\",\r\n groupName: \"\",\r\n name: \"\",\r\n isMandatory: false,\r\n subscriberCount: 0,\r\n postCount: 0,\r\n viewCount: 0\r\n}\r\n\r\nexport interface DetailedTagStats extends TagStats {\r\n posts?: TagStatsPost[];\r\n readStats: PostRead[] | null;\r\n}\r\n\r\nexport interface TagStatsPost {\r\n id: string;\r\n title: string;\r\n author: string;\r\n createdTime: Date;\r\n}\r\n\r\nexport interface AnalyticsReportFilters {\r\n startDate?: string;\r\n endDate?: string;\r\n rangeString?: string;\r\n clientTimeZone?: string;\r\n clientTimeOffset?: string;\r\n topics?: string[];\r\n audiences?: string[];\r\n}\r\n\r\nexport interface DownloadAllReport extends AnalyticsReportFilters {\r\n channelUsage?: string;\r\n mostViewedPosts?: string;\r\n mostViewedEvents?: string;\r\n postViewsByHour?: string;\r\n engagedUsers?: string;\r\n commentsAndReactions?: string;\r\n surveysWithMostResponse?: string;\r\n}\r\n\r\nexport interface GetTotalSubscribersModel {\r\n audiencesOrTopics?: string[];\r\n}\r\n\r\nexport const PlatformAnalyticsReport = {\r\n channelUsage: \"channelUsage\",\r\n engagedUsers: \"engagedUsers\",\r\n mostViewedPost: \"mostViewedPost\",\r\n mostViewedEvent: \"mostViewedEvent\",\r\n commentsAndReactions: \"commentsAndReactions\",\r\n postViewsByHour: \"postViewsByHour\",\r\n surveyWithMostResponse: \"surveyWithMostResponse\"\r\n}\r\n\r\nexport const LAST_30_DAYS = \"Last 30 days\";\r\nexport const THIS_MONTH = \"This month\";\r\nexport const LAST_WEEK = \"Last week\";\r\nexport const LAST_MONTH = \"Last month\"\r\nexport const LAST_3_MONTHS = \"Last 3 months\";\r\nexport const LAST_6_MONTHS = \"Last 6 months\";\r\nexport const ALL_TIME = \"All time\";\r\nexport const CUSTOM_RANGE = \"Custom range\";\r\n\r\n\r\n","import { Action } from \"redux\";\r\n\r\nimport { IUserPortalLayoutState } from \"./models\";\r\nimport * as actions from './actions';\r\n\r\nconst DEFAULT_STATE: IUserPortalLayoutState = {\r\n mobileAppBannerOpen: false,\r\n};\r\n\r\nexport const actionHandler: { [actionType: string]: (state: IUserPortalLayoutState, action: Action) => IUserPortalLayoutState } = {\r\n [actions.SET_MOBILE_APP_BANNER_OPEN]: (state: IUserPortalLayoutState, action: actions.ISetMobileAppBannerOpen) => {\r\n return {\r\n ...state,\r\n mobileAppBannerOpen: action.open\r\n };\r\n }\r\n}\r\n\r\nexport const reducer = (state: IUserPortalLayoutState, action: Action) => {\r\n const actionHandlerMethod = actionHandler[action.type];\r\n if (actionHandlerMethod) {\r\n return actionHandlerMethod(state, action);\r\n }\r\n\r\n return state || DEFAULT_STATE;\r\n};\r\n","export const userAttributesSvg = '';","export const magicIconWhiteSVG = '';","import { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as Actions from \"./actions\";\r\nimport API from \"api\";\r\nimport { audiencesApi } from \"api/instances\";\r\n\r\nimport { Audience, AudienceDetails, AudienceFilterValues, AudiencePage, DraftAudience } from \"./models\";\r\nimport { defaultPage } from \"./reducer\";\r\n\r\n\r\nexport const getAudiences = () => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return audiencesApi.getAllAudiences()\r\n .then(audiences => {\r\n dispatch(Actions.GetAudiencesComplete({ succeeded: true, audiences }));\r\n return audiences;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetAudiencesComplete({ succeeded: false, audiences: [], err }));\r\n return [];\r\n });\r\n}\r\n\r\nexport const getAudienceDetails = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetAudienceDetails({}));\r\n\r\n return dispatch(API.audiences.GetAudienceDetails(id))\r\n .then(response => {\r\n dispatch(Actions.GetAudienceDetailsComplete({ succeeded: response.status === 200 }));\r\n return response.json();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetAudienceDetailsComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getAllAudiences = (pageNumber: number, filters: Partial, pageAmount?: number) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetAllAudiences({}));\r\n\r\n return dispatch(API.audiences.GetAllAudiences(pageNumber, pageAmount, filters))\r\n .then(response => response.json())\r\n .then(page => {\r\n dispatch(Actions.GetAllAudiencesComplete({ succeeded: true, page }));\r\n return page;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetAllAudiencesComplete({ succeeded: false, page: defaultPage, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getDisabledAudiences = (pageNumber: number, filters: Partial, pageAmount?: number) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetDisabledAudiences({}));\r\n\r\n return dispatch(API.audiences.GetDisabledAudiences(pageNumber, pageAmount, filters))\r\n .then(response => response.json())\r\n .then(page => {\r\n dispatch(Actions.GetDisabledAudiencesComplete({ succeeded: true, page }));\r\n return page;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetDisabledAudiencesComplete({ succeeded: false, page: defaultPage, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getEnabledAudiences = (pageNumber: number, filters: Partial, pageAmount?: number) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetEnabledAudiences({}));\r\n\r\n return dispatch(API.audiences.GetEnabledAudiences(pageNumber, pageAmount, filters))\r\n .then(response => response.json())\r\n .then(page => {\r\n dispatch(Actions.GetEnabledAudiencesComplete({ succeeded: true, page }));\r\n return page;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetEnabledAudiencesComplete({ succeeded: false, page: defaultPage, err }));\r\n return;\r\n });\r\n}\r\n\r\n\r\nexport const createAudience = (audience: DraftAudience) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.audiences.CreateAudience(audience))\r\n .then(response => {\r\n dispatch(Actions.CreateAudienceComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.CreateAudienceComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const deleteAudience = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.DeleteAudience({}));\r\n\r\n return dispatch(API.audiences.DeleteAudience(id))\r\n .then(response => {\r\n dispatch(Actions.DeleteAudienceComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DeleteAudienceComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const deleteAudiences = (ids: string[]) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.DeleteAudiences({}));\r\n\r\n return Promise.all(ids.map(id => dispatch(API.audiences.DeleteAudience(id))))\r\n .then(() => {\r\n dispatch(Actions.DeleteAudiencesComplete({ succeeded: true }));\r\n return true;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DeleteAudiencesComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const downloadUserData = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.DownloadUserData({}));\r\n\r\n return audiencesApi.getAudienceUsersCsv(id)\r\n .then(response => {\r\n dispatch(Actions.DownloadUserDataComplete({ succeeded: true }));\r\n return response;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DownloadUserDataComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const disableAudience = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.DisableAudience({}));\r\n\r\n return dispatch(API.audiences.DisableAudience(id))\r\n .then(response => {\r\n dispatch(Actions.DisableAudienceComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DisableAudienceComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const disableAudiences = (ids: string[]) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.DisableAudiences({}));\r\n\r\n return Promise.all(ids.map(id => dispatch(API.audiences.DisableAudience(id))))\r\n .then(() => {\r\n dispatch(Actions.DisableAudiencesComplete({ succeeded: true }));\r\n return true;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DisableAudiencesComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const enableAudience = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.EnableAudience({}));\r\n\r\n return dispatch(API.audiences.EnableAudience(id))\r\n .then(response => {\r\n dispatch(Actions.EnableAudienceComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.EnableAudienceComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\n\r\nexport const enableAudiences = (ids: string[]) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.EnableAudiences({}));\r\n\r\n return Promise.all(ids.map(id => dispatch(API.audiences.EnableAudience(id))))\r\n .then(() => {\r\n dispatch(Actions.EnableAudiencesComplete({ succeeded: true }));\r\n return true;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.EnableAudiencesComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const saveAudience = (id: string, audience: DraftAudience) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.audiences.SaveAudience(id, audience))\r\n .then(response => {\r\n dispatch(Actions.SaveAudienceComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SaveAudienceComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\n//Calls API that fetches unique user count from set of audiences.\r\nexport const fetchUniqueUserCount = (ids: string[], grabAll: boolean) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.audiences.GetUniqueUsers(ids, grabAll))\r\n .then(response => {\r\n return response.json();\r\n })\r\n .catch(err => {\r\n return 0;\r\n })\r\n}\r\n\r\nexport const hasChangedSinceSaved = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ChangedSinceSaved({}));\r\n}\r\n\r\nexport const clearChangedSinceSaved = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ClearChangedSinceSaved({}));\r\n}\r\n\r\nexport const clearErrorMessage = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ClearErrorMessage({}));\r\n}\r\n\r\nexport const clearShouldFetch = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ClearShouldFetch({}));\r\n}","import { AttachedFile } from \"modules/gallery\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport { IdNamePair } from \"modules/common/models\";\r\nimport { TenantNotificationSettings } from \"modules/messaging\";\r\nimport { Tag } from \"modules/posts/models\";\r\n\r\n\r\nexport enum ShareUrlEvents {\r\n toggleSpUrl = \"toggleSpUrl\",\r\n toggleTeamsUrl = \"toggleTeamsUrl\",\r\n toggleCompanyPortalUrl = \"toggleCompanyPortalUrl\",\r\n spUrlShareLinkName = \"spUrlShareLinkName\",\r\n teamsUrlShareLinkName = \"teamsUrlShareLinkName\",\r\n companyPortalUrlShareLinkName = \"companyPortalUrlShareLinkName\"\r\n}\r\n\r\nexport enum TeamsEvents {\r\n spUrl = \"spUrl\",\r\n teamsUrl = \"teamsUrl\",\r\n companyPortalUrl = \"companyPortalUrl\",\r\n spEventsUrl = \"spEventsUrl\",\r\n teamsEventsUrl = \"teamsEventsUrl\",\r\n companyPortalEventsUrl = \"companyPortalEventsUrl\"\r\n}\r\n\r\nexport interface ApplicationState {\r\n settings: SettingsState;\r\n}\r\n\r\nexport interface SettingsState {\r\n fetching: boolean;\r\n saving: boolean;\r\n resetting: boolean;\r\n errorMsg: string | null;\r\n pristine: boolean;\r\n clientSettings: ClientSettings;\r\n tenantSettings: TenantSettings;\r\n pristineTenantSettingsCopy: TenantSettings | null;\r\n activeReactionTab: ReactionTab;\r\n activeLanguageLCID: string | null;\r\n showDisabledItems: boolean;\r\n currentUser: CurrentUserSettings;\r\n notificationSettings: TenantNotificationSettings;\r\n pristineNotificationSettingsCopy: TenantNotificationSettings | null;\r\n applyBlackoutPeriodsTo: string[];\r\n tagSettings: TagSettings;\r\n tenantAttributes: TenantAttribute[];\r\n}\r\n\r\nexport interface ClientSettings {\r\n androidAppUrl: string;\r\n bannerColors: string[];\r\n bannerVisibility: BannerOptions;\r\n chatEnabled: boolean;\r\n commentSystem: CommentSystem;\r\n defaultLCID: string;\r\n displayName: string;\r\n documentsEnabled: boolean;\r\n // eventHub: IEventHub;\r\n id: string;\r\n iosAppUrl: string;\r\n keys: {\r\n [value: string]: string;\r\n };\r\n mobileEventsEnabled: boolean;\r\n portalPagesEnabled: boolean;\r\n reactions: ClientSettingsReaction[];\r\n reactionSystem: ReactionSystem;\r\n specialtyPostColors: SpecialtyPostColors;\r\n surveysEnabled: boolean;\r\n teams: {\r\n spUrl: string;\r\n teamsUrl: string;\r\n companyPortalUrl: string;\r\n spEventsUrl: string;\r\n teamsEventsUrl: string;\r\n companyPortalEventsUrl: string;\r\n };\r\n shareUrlsConfig: {\r\n toggleSpUrl: boolean;\r\n toggleTeamsUrl: boolean;\r\n toggleCompanyPortalUrl: boolean;\r\n spUrlShareLinkName: string;\r\n teamsUrlShareLinkName: string;\r\n companyPortalUrlShareLinkName: string;\r\n };\r\n theme: {\r\n color: string;\r\n enabled: boolean;\r\n };\r\n translatedContent: TranslatedContent;\r\n shortcutsEnabled: boolean;\r\n}\r\n\r\nexport interface TenantSettings {\r\n displayName: string;\r\n reactions: TenantSettingsReaction[];\r\n reactionsEnabled: boolean;\r\n isReactingEnabledForNewPostsByDefault: boolean;\r\n canContributorsToggleReactions: boolean;\r\n canContributorsToggleComments: boolean;\r\n tagGroups: TenantSettingsTagGroup[];\r\n securityGroups: TenantSettingsSecurityGroups[];\r\n commentsEnabled: boolean;\r\n isCommentingEnabledForNewPostsByDefault: boolean;\r\n gifSelectionEnabledForComments: boolean;\r\n commentMaxLength: number;\r\n commentModerationEnabled: boolean;\r\n canManageEveryoneAudience: boolean;\r\n lobbyEnabled: boolean;\r\n localAccountsEnabled: boolean;\r\n localAccountPrefix: string;\r\n themeEnabled: boolean;\r\n themeSettings: ThemeSettings | null;\r\n ADGroupSyncEnabled: boolean;\r\n groups: Group[];\r\n defaultLCID: string;\r\n timeZone: string;\r\n translatedContent: TranslatedContent;\r\n mandatoryExpiryTime: number;\r\n flaggingSettings: {\r\n minimumNotificationWait: number;\r\n };\r\n supportEmail: string;\r\n tenantId?: string;\r\n publicAuthAllowed: boolean;\r\n bannerMessage: string | null;\r\n bannerVisibility: BannerOptions;\r\n postBannerColors: string[];\r\n specialtyPostColors: SpecialtyPostColors | null;\r\n maxAllowedAudiences: number;\r\n keys: {\r\n [value: string]: string;\r\n };\r\n manageTopicsAudiencesInAdmin: boolean;\r\n maxAllowedLanguages: number;\r\n reportExpiryDays: number;\r\n surveysEnabled: boolean;\r\n chatEnabled: boolean;\r\n docLockerEnabled: boolean;\r\n documentsEnabled: boolean;\r\n postSmartContentEnabledByTenant: boolean;\r\n mobileEventsEnabled: boolean;\r\n totalUserCountForReporting: number;\r\n mobilePublishingEnabled: boolean;\r\n portalPagesEnabled: boolean;\r\n postNotificationsEnabled: boolean;\r\n invitedExternalUsersEnabled: boolean;\r\n resetLocalUserPasswordOnLogin: boolean;\r\n showFeatures: {\r\n audiences: boolean;\r\n documentsEnabled: boolean;\r\n externalPostSources: boolean;\r\n everyoneAudienceEnabled: boolean;\r\n portalPagesEnabled: boolean;\r\n categoryTagsEnabled: boolean;\r\n equalToAnySmartAudienceRuleEnabled: boolean;\r\n asyncReportProcessingEnabled: boolean;\r\n postSmartContentEnabledForTenant: boolean;\r\n tinyMceCustomCssEnabled: boolean;\r\n homeScreenConfigEnabled: boolean;\r\n emailManagementEnabled: boolean;\r\n shortcutsEnabled: boolean;\r\n };\r\n syncConfig: {\r\n mobileSyncConfig: {\r\n mobileSyncEnabled: boolean;\r\n graphMobileFieldSource: string;\r\n oktaMobileFieldSource: string;\r\n };\r\n syncLevel: string;\r\n syncType: string;\r\n syncAllAdUsers: boolean;\r\n syncDetails: {\r\n organizationId: string;\r\n portalClientId: string;\r\n };\r\n }\r\n customerLicense: CustomerLicenseTypes | null;\r\n externalPostSources: ExternalPostSource[];\r\n iosAppUrl: string;\r\n androidAppUrl: string;\r\n externalPostPurgeInDays: number;\r\n externalPostPurgeEnabled: boolean;\r\n mobileThemeColors: MobileThemeColors | null;\r\n everyoneAudienceEnforcementEnabled: boolean;\r\n emailNotificationsEnabled: boolean;\r\n smsNotificationsEnabled: boolean;\r\n teams: {\r\n spUrl: string;\r\n teamsUrl: string;\r\n companyPortalUrl: string;\r\n spEventsUrl: string;\r\n teamsEventsUrl: string;\r\n companyPortalEventsUrl: string;\r\n };\r\n shareUrlsConfig: {\r\n toggleSpUrl: boolean;\r\n toggleTeamsUrl: boolean;\r\n toggleCompanyPortalUrl: boolean;\r\n spUrlShareLinkName: string;\r\n teamsUrlShareLinkName: string;\r\n companyPortalUrlShareLinkName: string;\r\n };\r\n shortcutsEnabled: boolean;\r\n}\r\n\r\nexport interface BannerOptions {\r\n showRestrictedBanner: boolean;\r\n}\r\n\r\nexport interface CommentSystem {\r\n enabled: boolean;\r\n commentMaxLength: number;\r\n isCommentingEnabledForNewPostsByDefault: boolean;\r\n gifSelectionEnabledForComments: boolean;\r\n moderationEnabled: boolean;\r\n}\r\n\r\nexport interface ReactionSystem {\r\n enabled: boolean;\r\n isReactingEnabledForNewPostsByDefault: boolean;\r\n}\r\n\r\nexport interface TagSettings {\r\n tagGroups: ClientSettingsTagGroup[];\r\n shouldFetch: boolean;\r\n}\r\n\r\nexport interface TenantAttribute {\r\n id: string;\r\n description: string;\r\n key: string;\r\n title: string;\r\n}\r\n\r\nexport interface ThemeSettings {\r\n color: string | null;\r\n accent: string | null;\r\n brandLight: string | null;\r\n}\r\n\r\nexport class MobileThemeColors {\r\n accent: string;\r\n brandLight: string;\r\n}\r\nexport class SpecialtyPostColors {\r\n mandatory: string;\r\n compliance: string;\r\n complianceChecked: string;\r\n breaking: string;\r\n featured: string;\r\n restricted: string;\r\n public: string;\r\n}\r\n\r\nexport enum SettingsTab {\r\n General = 2,\r\n Theme = 3,\r\n Language = 4,\r\n Features = 5,\r\n External = 6,\r\n Newsletter = 7,\r\n Messaging = 8,\r\n ContentSettings = 9,\r\n}\r\n\r\nexport interface TenantSettingsReaction {\r\n id: string;\r\n sortIndex: number;\r\n sentiment: string;\r\n name: string;\r\n enabled: boolean;\r\n}\r\n\r\nexport enum ReactionTab {\r\n Enabled = 1,\r\n Disabled = 2,\r\n}\r\n\r\nexport interface ClientSettingsReaction {\r\n id: string;\r\n name: string;\r\n order: number;\r\n sentiment: string;\r\n}\r\n\r\nexport interface ClientSettingsTagGroup {\r\n id: string;\r\n name: string;\r\n tags: ClientSettingsTag[];\r\n}\r\n\r\nexport interface ClientSettingsTag {\r\n disabled: boolean;\r\n id: string;\r\n mandatory: boolean;\r\n name: string;\r\n restricted: boolean;\r\n selected: boolean;\r\n}\r\n\r\nexport interface TenantSettingsTagGroup extends MultiSelectTopicGroup {\r\n id: string;\r\n name: string;\r\n disabled: boolean;\r\n deleted: boolean;\r\n tags: TenantSettingsTag[];\r\n isNew?: boolean;\r\n}\r\n\r\nexport interface TenantSettingsSecurityGroups {\r\n id: string;\r\n name: string;\r\n}\r\n\r\nexport interface TenantSettingsTag extends MultiSelectTopic {\r\n id: string;\r\n name: string;\r\n mandatory: boolean;\r\n disabled: boolean;\r\n deleted: boolean;\r\n default: boolean;\r\n isNew?: boolean;\r\n restrictedTo: string[];\r\n mandatoryFor: string[];\r\n defaultFor: string[];\r\n restricted: boolean;\r\n}\r\n\r\nexport interface MultiSelectTopic extends IdNamePair{\r\n restricted: boolean;\r\n}\r\n\r\nexport interface MultiSelectTopicGroup {\r\n id: string;\r\n name: string;\r\n tags: MultiSelectTopic[];\r\n}\r\n\r\nexport type TranslatableField = keyof ITranslatableFields;\r\n\r\ninterface ITranslatableFields {\r\n breakingPost: string | null;\r\n breakingBannerDescription: string | null;\r\n compliancePost: string | null;\r\n complianceText: string | null;\r\n complianceBannerDescription: string | null;\r\n compliedPost: string | null;\r\n compliedBannerDescription: string | null;\r\n featuredPost: string | null;\r\n featuredBannerDescription: string | null;\r\n mandatoryPost: string | null;\r\n mandatoryBannerDescription: string | null;\r\n publicPost: string | null;\r\n publicBannerDescription: string | null;\r\n publicBannerDescriptionShareTitle: string | null;\r\n restrictedContent: string | null;\r\n restrictedBannerDescription: string | null;\r\n}\r\n\r\ninterface TranslatedContent {\r\n [lcid: string]: ITranslatableFields\r\n}\r\n\r\nexport interface Group {\r\n id: string;\r\n name: string;\r\n}\r\n\r\nexport type CommentNotificationSettings = \"accessible\" | \"engaged\" | \"subscribed\" | \"none\";\r\n\r\nexport interface CurrentUserSettings {\r\n email: string;\r\n firstName: string;\r\n lastName: string;\r\n userId: string;\r\n roles: UserRoleStrings[];\r\n canManageSupport: boolean;\r\n canManageSubmissions: boolean;\r\n pinnedFolders: string[];\r\n cardCount: number;\r\n chatEnabled: boolean;\r\n commentNotificationSettings: CommentNotificationSettings;\r\n gradientColor: string;\r\n hideReadTime: boolean;\r\n hideSocialStats: boolean;\r\n hideWhenRead: boolean;\r\n isSocialUser: boolean;\r\n isSparrowLocalUser: boolean;\r\n isWorkAccount: boolean;\r\n layout: string;\r\n preferredLCID: string;\r\n preferredName: string;\r\n preferredSMSConsent: boolean | null;\r\n preferredSMSPhone: string;\r\n sendNotificationsWhenAuthor: boolean;\r\n subscribedTags: string[];\r\n localId: string;\r\n showContentAnalysesCallout: boolean;\r\n showContentAnalysesDialog: boolean;\r\n showSmartContentHelpCallouts: boolean;\r\n showMediaGalleryGridView: boolean;\r\n hideContentGuidelines: boolean;\r\n hidePublishDialog: boolean;\r\n providerName: string;\r\n}\r\n\r\nexport interface CustomerLicenseTypes {\r\n intranet: IntranetLicenseTypes;\r\n mobile: MobileLicenseTypes;\r\n collaboration: CollaborationLicenseTypes;\r\n crisis: CrisisLicenseTypes;\r\n}\r\n\r\nexport enum IntranetLicenseTypes {\r\n SpOnline = 0,\r\n SpOnPrem = 1,\r\n None = -1,\r\n}\r\n\r\nexport enum MobileLicenseTypes {\r\n Generic = 0,\r\n Branded = 1,\r\n None = -1,\r\n}\r\n\r\nexport enum CollaborationLicenseTypes {\r\n Teams = 0,\r\n None = -1,\r\n}\r\n\r\nexport enum CrisisLicenseTypes {\r\n Generic = 0,\r\n None = -1,\r\n}\r\n\r\nexport interface ExternalPostSource {\r\n id: string;\r\n name: string;\r\n sourceType: ExternalPostSourceTypes;\r\n topics: Tag[];\r\n lastChecked: Date;\r\n enabled: boolean;\r\n url: string;\r\n defaultAuthorName: string;\r\n defaultAuthorEmail: string;\r\n defaultDraftImage: string;\r\n}\r\n\r\nexport enum ExternalPostSourceTypes {\r\n RSS = 1,\r\n}\r\n\r\nexport interface TranslatableLanguage {\r\n outputLCID: string;\r\n breakingPost: string | null;\r\n breakingBannerDescription: string | null;\r\n compliancePost: string | null;\r\n complianceText: string | null;\r\n complianceBannerDescription: string | null;\r\n compliedPost: string | null;\r\n compliedBannerDescription: string | null;\r\n featuredPost: string | null;\r\n featuredBannerDescription: string | null;\r\n mandatoryPost: string | null;\r\n mandatoryBannerDescription: string | null;\r\n publicPost: string | null;\r\n publicBannerDescription: string | null;\r\n publicBannerDescriptionShareTitle: string | null;\r\n restrictedContent: string | null;\r\n restrictedBannerDescription: string | null;\r\n}\r\n\r\nexport interface IReadabilityOptionModel {\r\n name: string;\r\n description: string;\r\n isDefault: boolean;\r\n value?: string;\r\n}\r\n\r\nexport interface IReadabilitySettingsOptionModel {\r\n readability: IReadabilityOptionModel[];\r\n tone: IReadabilityOptionModel[];\r\n personalism: IReadabilityOptionModel[];\r\n sentiment: IReadabilityOptionModel[];\r\n gender: IReadabilityOptionModel[];\r\n length: IReadabilityOptionModel[];\r\n}\r\n\r\nexport interface IReadabilitySettings {\r\n id: string;\r\n readability: string;\r\n tone: string;\r\n personalism: string;\r\n sentiment: string;\r\n gender: string;\r\n length: string;\r\n}\r\n\r\nexport const EMPTY_READABILITY_SETTINGS: IReadabilitySettings = {\r\n id: \"\",\r\n tone: \"\",\r\n readability: \"\",\r\n personalism: \"\",\r\n sentiment: \"\",\r\n gender: \"\",\r\n length: \"\",\r\n};\r\n\r\nexport interface IMobileConfig {\r\n isWhiteLabel: boolean;\r\n appName: string;\r\n dynamicLink: string;\r\n iosBundleId: string;\r\n iosAppUrl: string;\r\n androidAppUrl: string;\r\n dynamicLinkApiKey: string;\r\n androidPackageName: string;\r\n firebaseProjectId: string;\r\n}\r\n\r\nexport interface IContentGuidelines {\r\n id: string;\r\n header: string;\r\n description: string;\r\n attachments: AttachedFile[];\r\n}\r\n\r\nexport const DEFAULT_CONTENT_GUIDELINES : IContentGuidelines = {\r\n id: \"\",\r\n header: \"\",\r\n description: \"\",\r\n attachments: [],\r\n}\r\n\r\nexport interface IContentGuidelinesState {\r\n guidelines: IContentGuidelines | undefined;\r\n isEmpty: boolean;\r\n isPristine: boolean;\r\n}\r\n","import { Action } from 'redux';\r\nimport * as Actions from './actions'\r\nimport { InsightsState } from './models'\r\n\r\nconst actionHandler: { [actionType: string]: (state: InsightsState, action: Action) => InsightsState } = {\r\n [Actions.GET_POST_STATS_INIT]: (state: InsightsState, action: Actions.GetPostStatsInit) => {\r\n return state;\r\n },\r\n [Actions.GET_POST_STATS_COMPLETE]: (state: InsightsState, action: Actions.GetPostStatsComplete) => {\r\n return {\r\n ...state,\r\n postStats: action.posts\r\n };\r\n },\r\n [Actions.GET_USER_COUNTS_INIT]: (state: InsightsState, action: Actions.GetUserCountsInit) => {\r\n return {\r\n ...state,\r\n userCounts: null\r\n } as InsightsState;\r\n },\r\n [Actions.GET_USER_COUNTS_COMPLETE]: (state: InsightsState, action: Actions.GetUserCountsComplete) => {\r\n return {\r\n ...state,\r\n userCounts: action.userCounts.map(userCount => {\r\n return {\r\n ...userCount,\r\n rangeStart: new Date(userCount.dateRounded),\r\n }\r\n })\r\n } as InsightsState;\r\n },\r\n [Actions.GET_COMMENT_REACTION_COUNTS_INIT]: (state: InsightsState, action: Actions.GetCommentAndReactionCountsInit) => {\r\n return {\r\n ...state,\r\n commentCounts: null\r\n } as InsightsState;\r\n },\r\n [Actions.GET_COMMENT_REACTION_COUNTS_COMPLETE]: (state: InsightsState, action: Actions.GetCommentAndReactionCountsComplete) => {\r\n return {\r\n ...state,\r\n commentAndReactionCounts: action.commentAndReactionCounts.map(commentAndReactionCount => {\r\n return {\r\n ...commentAndReactionCount,\r\n rangeStart: new Date(commentAndReactionCount.rangeStart),\r\n }\r\n })\r\n };\r\n },\r\n [Actions.GET_PLATFORM_STATS_INIT]: (state: InsightsState, action: Actions.GetPlatformStatsInit) => {\r\n return {\r\n ...state,\r\n platformStats: null\r\n } as InsightsState;\r\n },\r\n [Actions.GET_PLATFORM_STATS_COMPLETE]: (state: InsightsState, action: Actions.GetPlatformStatsComplete) => {\r\n return {\r\n ...state,\r\n platformStats: action.platformStats\r\n };\r\n },\r\n [Actions.GET_DETAILED_POST_STATS_INIT]: (state: InsightsState, action: Actions.GetDetailedPostStatsInit) => {\r\n return {\r\n ...state,\r\n post: null\r\n } as InsightsState;\r\n },\r\n [Actions.GET_DETAILED_POST_STATS_COMPLETE]: (state: InsightsState, action: Actions.GetDetailedPostStatsComplete) => {\r\n return {\r\n ...state,\r\n post: action.post\r\n };\r\n },\r\n [Actions.GET_POST_READS_INIT]: (state: InsightsState, action: Actions.GetPostReadsInit) => {\r\n return state;\r\n },\r\n [Actions.GET_POST_READS_COMPLETE]: (state: InsightsState, action: Actions.GetPostReadsComplete) => {\r\n return {\r\n ...state,\r\n post: {\r\n ...state.post,\r\n readStats: action.postReads\r\n }\r\n } as InsightsState;\r\n },\r\n [Actions.GET_READ_VIEW_STATS_INIT]: (state: InsightsState, action: Actions.GetReadViewStatsInit) => {\r\n return state;\r\n },\r\n [Actions.GET_READ_VIEW_STATS_COMPLETE]: (state: InsightsState, action: Actions.GetReadViewStatsComplete) => {\r\n return {\r\n ...state,\r\n readViewStats: action.readViewStats\r\n };\r\n },\r\n [Actions.GET_TAG_STATS_INIT]: (state: InsightsState, action: Actions.GetTagStatsInit) => {\r\n return state;\r\n },\r\n [Actions.GET_TAG_STATS_COMPLETE]: (state: InsightsState, action: Actions.GetTagStatsComplete) => {\r\n return {\r\n ...state,\r\n tagStats: {\r\n ...state.tagStats,\r\n ...action.tagStats\r\n }\r\n } as InsightsState;\r\n },\r\n [Actions.GET_TAG_READS_INIT]: (state: InsightsState, action: Actions.GetTagReadsInit) => {\r\n return state;\r\n },\r\n [Actions.GET_TAG_READS_COMPLETE]: (state: InsightsState, action: Actions.GetTagReadsComplete) => {\r\n return {\r\n ...state,\r\n tagStats: {\r\n ...state.tagStats,\r\n readStats: action.postReads\r\n }\r\n };\r\n },\r\n [Actions.GET_TAG_POSTS_INIT]: (state: InsightsState, action: Actions.GetTagPostsInit) => {\r\n return state;\r\n },\r\n [Actions.GET_TAG_POSTS_COMPLETE]: (state: InsightsState, action: Actions.GetTagPostsComplete) => {\r\n return {\r\n ...state,\r\n tagStats: {\r\n ...state.tagStats,\r\n posts: action.posts\r\n }\r\n } as InsightsState;\r\n },\r\n [Actions.GET_TOP_CHANNELS_INIT]: (state: InsightsState, action: Actions.GetTopChannelsInit) => {\r\n return state;\r\n },\r\n [Actions.GET_TOP_CHANNELS_COMPLETE]: (state: InsightsState, action: Actions.GetTopChannelsComplete) => {\r\n return {\r\n ...state,\r\n topChannels: action.tags\r\n } as InsightsState;\r\n },\r\n [Actions.GET_TOP_SURVEYS_INIT]: (state: InsightsState, action: Actions.GetTopSurveysInit) => {\r\n return state;\r\n },\r\n [Actions.GET_TOP_SURVEYS_COMPLETE]: (state: InsightsState, action: Actions.GetTopSurveysComplete) => {\r\n return {\r\n ...state,\r\n surveys: action.surveys\r\n } as InsightsState;\r\n },\r\n [Actions.GET_TOP_EVENTS_INIT]: (state: InsightsState, action: Actions.GetTopEventsInit) => {\r\n return state;\r\n },\r\n [Actions.GET_TOP_EVENTS_COMPLETE]: (state: InsightsState, action: Actions.GetTopEventsComplete) => {\r\n return {\r\n ...state,\r\n topEvents: action.events\r\n } as InsightsState;\r\n },\r\n [Actions.GET_USER_TRENDS_INIT]: (state: InsightsState, action: Actions.GetUserTrendsInit) => {\r\n return state;\r\n },\r\n [Actions.GET_USER_TRENDS_COMPLETE]: (state: InsightsState, action: Actions.GetUserTrendsComplete) => {\r\n return {\r\n ...state,\r\n userTrends: action.userTrends\r\n } as InsightsState;\r\n },\r\n [Actions.SET_TO_FETCH]: (state: InsightsState, action: Actions.SetToFetch) => {\r\n return {\r\n ...state,\r\n toFetch: action.toSet\r\n } as InsightsState;\r\n },\r\n}\r\n\r\nexport const reducer = (state: InsightsState, action: Action) => {\r\n\r\n const actionHandlerMethod = actionHandler[action.type];\r\n if (actionHandlerMethod) {\r\n return actionHandlerMethod(state, action);\r\n }\r\n\r\n return state || {} as InsightsState;\r\n};\r\n","import * as actionCreator from './actionCreator';\r\nimport * as reducer from './reducer';\r\n\r\nexport const actions = {\r\n ...actionCreator\r\n};\r\n\r\nexport const reducers = {\r\n insights: reducer.reducer\r\n};\r\n\r\nexport * from './actions'\r\nexport * from './models'\r\n","import { Action, createSlice, createAsyncThunk } from \"@reduxjs/toolkit\";\r\n\r\nimport {\r\n ContentBandContentType,\r\n ContentBandLayoutType,\r\n ContentBandStatus,\r\n IContentBand,\r\n IContentBandConfig,\r\n IContentBandsState,\r\n ReadStatus,\r\n} from \"./models\";\r\nimport { contentBandApi } from \"api/instances\";\r\nimport { ImageScale } from \"modules/posts/models\";\r\nimport { SortStyle } from \"utils/managementUtils\";\r\nimport { IColorOption } from \"modules/homeScreens/models\";\r\n\r\nexport interface IIdxPayload {\r\n idx: number;\r\n}\r\n\r\nexport interface ISetFetchIdxAction extends Action {\r\n payload: IIdxPayload;\r\n}\r\n\r\nexport interface IDeleteContentBandAction extends Action {\r\n payload: IIdxPayload;\r\n}\r\n\r\nexport interface ISetContentBandsPayload {\r\n contentBands: IContentBand[];\r\n reordered: boolean;\r\n}\r\n\r\nexport interface ISetContentBandsAction extends Action {\r\n payload: ISetContentBandsPayload;\r\n}\r\n\r\nexport interface IEditContentBandsActionPayload {\r\n idx: number;\r\n values: IContentBand;\r\n}\r\n\r\nexport interface IEditContentBandsAction extends Action {\r\n payload: IEditContentBandsActionPayload;\r\n}\r\n\r\nexport interface IAddDefaultContentBandsActionPayload {\r\n defaultLcid: string;\r\n}\r\n\r\nexport interface IAddDefaultContentBandsAction extends Action {\r\n payload: IAddDefaultContentBandsActionPayload;\r\n}\r\n\r\nexport interface IInsertDefaultContentBandActionPayload extends IAddDefaultContentBandsActionPayload {\r\n idx: number;\r\n}\r\nexport interface IInsertDefaultContentBandAction extends Action {\r\n payload: IInsertDefaultContentBandActionPayload;\r\n}\r\n\r\nexport interface IInsertContentBandActionPayload extends IInsertDefaultContentBandActionPayload {\r\n contentBand: IContentBand;\r\n}\r\n\r\nexport interface IInsertContentBandAction extends Action {\r\n payload: IInsertContentBandActionPayload;\r\n}\r\n\r\nexport interface IAddLanguageAction extends Action {\r\n payload: Record;\r\n}\r\n\r\nexport interface IRemoveLanguageAction extends Action {\r\n payload: string;\r\n}\r\n\r\nexport interface ISetSuccessMessageAction extends Action {\r\n payload: string;\r\n}\r\n\r\nexport interface IEditLanguagePayload {\r\n lcid: string;\r\n header: string;\r\n idx: number;\r\n}\r\n\r\nexport interface IEditLanguageAction extends Action {\r\n payload: IEditLanguagePayload;\r\n}\r\n\r\nexport interface ISetHeaderTextColorAction extends Action {\r\n payload: IColorOption;\r\n}\r\n\r\nexport interface ISetGradientColorAction extends Action {\r\n payload: IColorOption;\r\n}\r\n\r\nexport interface ISetBooleanAction extends Action {\r\n payload: boolean;\r\n}\r\n\r\nexport interface ISetConfigAction extends Action {\r\n payload: IContentBandConfig;\r\n}\r\n\r\nexport interface IPublishContentBandConfigPayload {\r\n id: string;\r\n config: IContentBandConfig;\r\n}\r\n\r\nexport interface ISetAddFinishedPayload {\r\n addFinished: boolean;\r\n addIdx?: number;\r\n}\r\n\r\nexport interface ISetAddFinishedAction extends Action {\r\n payload: ISetAddFinishedPayload;\r\n}\r\n\r\nexport const DEFAULT_COLOR_OPTION: IColorOption = {\r\n hexCode: \"#333333\",\r\n rgb: {\r\n r: 51,\r\n g: 51,\r\n b: 51,\r\n },\r\n};\r\n\r\nexport const DEFAULT_CONFIG: IContentBandConfig = {\r\n id: \"\",\r\n parentId: null,\r\n contentBandsGradientColor: DEFAULT_COLOR_OPTION,\r\n contentBandsHeaderTextColor: DEFAULT_COLOR_OPTION,\r\n status: ContentBandStatus.Draft,\r\n};\r\n\r\nconst DEFAULT_CONTENT_BAND: IContentBand = {\r\n id: \"\",\r\n parentId: null,\r\n contentType: ContentBandContentType.Post,\r\n layoutType: ContentBandLayoutType.Card,\r\n seeMoreEnabled: false,\r\n displayFullTitles: false,\r\n sortBy: SortStyle.publishDesc,\r\n contentCount: 10,\r\n pinnedIds: [],\r\n lockToReadStatus: ReadStatus.Both,\r\n lockToTopicIds: [],\r\n lockToTypes: [],\r\n ignoreSubscriptions: false,\r\n autoPlayCarousel: false,\r\n status: ContentBandStatus.Draft,\r\n publishedDateTimeUtc: null,\r\n createdById: \"\",\r\n createdDateTimeUtc: null,\r\n events: [],\r\n posts: [],\r\n order: -1,\r\n};\r\n\r\nconst DEFAULT_STATE: IContentBandsState = {\r\n contentBands: [],\r\n publishedContentBands: null,\r\n fetched: false,\r\n pristineContentBands: [],\r\n publishCount: 0,\r\n fetchIdx: -1,\r\n addFinished: false,\r\n reordered: false,\r\n isLoadingContentBandConfig: false,\r\n isLoadingContentBands: false,\r\n isLoadingContent: false,\r\n isLoadingPublishedContentBands: false,\r\n isPublishingContentBandConfig: false,\r\n isPublishingContentBands: false,\r\n isSavingContentBands: false,\r\n isSavingContentBandConfig: false,\r\n};\r\n\r\n// get a default content band using tenant default lcid\r\nconst getDefaultContentBand = (defaultLcid: string, order: number): IContentBand => {\r\n return {\r\n ...DEFAULT_CONTENT_BAND,\r\n headers: {\r\n [defaultLcid]: {\r\n header: \"\",\r\n },\r\n },\r\n order,\r\n };\r\n};\r\n\r\nexport interface ISaveContentBandsThunkPayload {\r\n contentBands: IContentBand[];\r\n includeContent: boolean;\r\n successMessage: string;\r\n}\r\n\r\nexport const fetchContentBandsAsync = createAsyncThunk(\"FETCH_CONTENT_BANDS\", async (includeContent: boolean, thunkApi) => {\r\n try {\r\n const { data } = await contentBandApi.getContentBands(ImageScale.Mobile, { statuses: [ContentBandStatus.Draft], includeContent });\r\n thunkApi.dispatch({ type: contentBandsSlice.actions.SET_PRISTINE_BANDS, payload: { contentBands: data.contentBands } });\r\n\r\n return data;\r\n } catch (err) {\r\n throw err;\r\n }\r\n});\r\n\r\nexport const fetchPublishedBandsAsync = createAsyncThunk(\"FETCH_PUBLISHED_BANDS\", async (includeContent: boolean = false, thunkApi) => {\r\n try {\r\n const { data } = await contentBandApi.getContentBands(ImageScale.Mobile, {\r\n statuses: [ContentBandStatus.Published],\r\n includeContent,\r\n });\r\n thunkApi.dispatch({ type: contentBandsSlice.actions.SET_PUBLISHED_BANDS, payload: { contentBands: data.contentBands } });\r\n\r\n return data;\r\n } catch (err) {\r\n throw err;\r\n }\r\n});\r\n\r\nexport const saveContentBandsAsync = createAsyncThunk(\"SAVE_CONTENT_BANDS\", async (payload: ISaveContentBandsThunkPayload, thunkApi) => {\r\n try {\r\n await contentBandApi.saveContentBands(payload.contentBands);\r\n\r\n // re-fetch content bands\r\n thunkApi.dispatch(fetchContentBandsAsync(true));\r\n thunkApi.dispatch({ type: contentBandsSlice.actions.SET_SUCCESS_MESSAGE, payload: payload.successMessage });\r\n } catch (err) {\r\n throw err;\r\n }\r\n});\r\n\r\nexport interface IFetchContentForBandThunkPayload {\r\n idx: number;\r\n band: IContentBand;\r\n}\r\n\r\nexport const fetchContentForBandAsync = createAsyncThunk(\r\n \"FETCH_CONTENT_FOR_BAND\",\r\n async (payload: IFetchContentForBandThunkPayload, thunkApi) => {\r\n try {\r\n thunkApi.dispatch({ type: contentBandsSlice.actions.SET_FETCH_IDX, payload });\r\n\r\n const { data } = await contentBandApi.getContentBandContent(payload.band, ImageScale.Mobile, 1);\r\n\r\n const newBand = {\r\n ...payload.band,\r\n ...data,\r\n posts: data.posts || [],\r\n events: data.events || [],\r\n };\r\n\r\n thunkApi.dispatch({\r\n type: contentBandsSlice.actions.EDIT_CONTENT_BAND,\r\n payload: {\r\n idx: payload.idx,\r\n values: newBand,\r\n },\r\n });\r\n } catch (err) {\r\n throw err;\r\n }\r\n }\r\n);\r\n\r\nexport const publishContentBandsAsync = createAsyncThunk(\r\n \"PUBLISH_CONTENT_BANDS\",\r\n async (payload: ISaveContentBandsThunkPayload, thunkApi) => {\r\n try {\r\n await contentBandApi.publishContentBands(payload.contentBands);\r\n\r\n // re-fetch draft and published bands\r\n thunkApi.dispatch(fetchContentBandsAsync(false));\r\n thunkApi.dispatch(fetchPublishedBandsAsync(false));\r\n thunkApi.dispatch({ type: contentBandsSlice.actions.SET_SUCCESS_MESSAGE, payload: payload.successMessage });\r\n } catch (err) {\r\n throw err;\r\n }\r\n }\r\n);\r\n\r\nexport const fetchContentBandConfigAsync = createAsyncThunk(\"FETCH_CONTENT_BAND_CONFIG\", async (_, thunkApi) => {\r\n try {\r\n const { data } = await contentBandApi.getContentBandConfig(ContentBandStatus.Draft);\r\n\r\n thunkApi.dispatch({ type: contentBandsSlice.actions.SET_CONFIG, payload: data });\r\n thunkApi.dispatch({ type: contentBandsSlice.actions.SET_PRISTINE_CONFIG, payload: data });\r\n } catch (err) {\r\n throw err;\r\n }\r\n});\r\n\r\nexport const saveContentBandConfigAsync = createAsyncThunk(\"SAVE_CONTENT_BAND_CONFIG\", async (payload: IContentBandConfig, thunkApi) => {\r\n try {\r\n await contentBandApi.saveContentBandConfig(payload);\r\n\r\n // set pristine copy\r\n thunkApi.dispatch({ type: contentBandsSlice.actions.SET_PRISTINE_CONFIG, payload });\r\n } catch (err) {\r\n throw err;\r\n }\r\n});\r\n\r\nexport const publishContentBandConfigAsync = createAsyncThunk(\r\n \"PUBLISH_CONTENT_BAND_CONFIG\",\r\n async (payload: IContentBandConfig, thunkApi) => {\r\n try {\r\n await contentBandApi.publishContentBandConfig(payload);\r\n\r\n // set pristine copy\r\n thunkApi.dispatch({ type: contentBandsSlice.actions.SET_PRISTINE_CONFIG, payload: payload });\r\n } catch (err) {\r\n throw err;\r\n }\r\n }\r\n);\r\n\r\nconst reorderMap = (cb: IContentBand, idx: number) => ({ ...cb, order: idx });\r\nconst sortBands = (a: IContentBand, b: IContentBand) => a.order - b.order\r\n\r\nexport const contentBandsSlice = createSlice({\r\n name: \"contentBands\",\r\n initialState: DEFAULT_STATE,\r\n reducers: {\r\n SET_CONTENT_BANDS: (state: IContentBandsState, action: ISetContentBandsAction) => {\r\n // setting state directly here is ok because this gets passed to createReducer\r\n // https://redux-toolkit.js.org/api/createslice#reducers\r\n state.contentBands = action.payload.contentBands;\r\n state.reordered = action.payload.reordered;\r\n },\r\n SET_PUBLISHED_BANDS: (state: IContentBandsState, action: ISetContentBandsAction) => {\r\n state.publishedContentBands = action.payload.contentBands;\r\n },\r\n SET_PRISTINE_BANDS: (state: IContentBandsState, action: ISetContentBandsAction) => {\r\n state.pristineContentBands = action.payload.contentBands;\r\n },\r\n APPEND_DEFUALT_CONTENT_BAND: (state: IContentBandsState, action: IAddDefaultContentBandsAction) => {\r\n state.contentBands = [...state.contentBands, getDefaultContentBand(action.payload.defaultLcid, state.contentBands.length)];\r\n state.addFinished = true;\r\n },\r\n INSERT_DEFAULT_CONTENT_BAND: (state: IContentBandsState, action: IInsertDefaultContentBandAction) => {\r\n // insert item at index\r\n let newBands = [...state.contentBands];\r\n newBands.splice(action.payload.idx, 0, getDefaultContentBand(action.payload.defaultLcid, action.payload.idx));\r\n\r\n state.contentBands = newBands.map(reorderMap).sort(sortBands);\r\n state.addFinished = true;\r\n state.addIdx = action.payload.idx;\r\n state.reordered = true;\r\n },\r\n INSERT_CONTENT_BAND: (state: IContentBandsState, action: IInsertContentBandAction) => {\r\n // insert item at index\r\n let newBands = [...state.contentBands];\r\n newBands.splice(action.payload.idx, 0, action.payload.contentBand);\r\n\r\n state.reordered = true;\r\n state.contentBands = newBands.map(reorderMap).sort(sortBands);\r\n },\r\n EDIT_CONTENT_BAND: (state: IContentBandsState, action: IEditContentBandsAction) => {\r\n let newBands = state.contentBands.map((contentBand: IContentBand, index: number) => {\r\n let newBand = { ...contentBand };\r\n\r\n if (index === action.payload.idx)\r\n newBand = {\r\n ...newBand,\r\n ...action.payload.values,\r\n };\r\n\r\n return newBand;\r\n });\r\n\r\n state.contentBands = newBands;\r\n },\r\n DELETE_CONTENT_BAND: (state: IContentBandsState, action: IDeleteContentBandAction) => {\r\n let newBands = [...state.contentBands];\r\n newBands.splice(action.payload.idx, 1);\r\n\r\n state.reordered = true;\r\n state.contentBands = newBands.map(reorderMap).sort(sortBands);;\r\n },\r\n ADD_LANGUAGE: (state: IContentBandsState, action: IAddLanguageAction) => {\r\n const lang = action.payload;\r\n\r\n let newBands = state.contentBands.map((band: IContentBand) => ({\r\n ...band,\r\n headers: {\r\n ...band.headers,\r\n [lang.key]: {\r\n header: band.headers ? band.headers[lang.key]?.header : \"\",\r\n },\r\n },\r\n }));\r\n\r\n state.contentBands = newBands;\r\n },\r\n REMOVE_LANGUAGE: (state: IContentBandsState, action: IRemoveLanguageAction) => {\r\n const lcid = action.payload;\r\n\r\n let newBands = state.contentBands.map((band: IContentBand) => {\r\n const newBand = { ...band };\r\n\r\n if (newBand.headers) {\r\n const { [lcid!]: removed, ...withOutLang } = newBand.headers;\r\n\r\n return {\r\n ...newBand,\r\n headers: {\r\n ...withOutLang,\r\n },\r\n };\r\n }\r\n\r\n return newBand;\r\n });\r\n\r\n state.contentBands = newBands;\r\n },\r\n EDIT_LANGUAGE: (state: IContentBandsState, action: IEditLanguageAction) => {\r\n const { lcid, header, idx } = action.payload;\r\n\r\n let newBands = state.contentBands.map((band: IContentBand, index: number) => {\r\n const newBand = { ...band };\r\n\r\n if (idx === index && newBand.headers) {\r\n if (Object.keys(newBand.headers).includes(lcid))\r\n newBand.headers[lcid] = {\r\n header,\r\n };\r\n }\r\n\r\n return newBand;\r\n });\r\n\r\n state.contentBands = newBands;\r\n },\r\n SET_SUCCESS_MESSAGE: (state: IContentBandsState, action: ISetSuccessMessageAction) => {\r\n state.successMessage = action.payload;\r\n },\r\n SET_FETCH_IDX: (state: IContentBandsState, action: ISetFetchIdxAction) => {\r\n state.fetchIdx = action.payload.idx;\r\n },\r\n SET_HEADER_TEXT_COLOR: (state: IContentBandsState, action: ISetHeaderTextColorAction) => {\r\n state.config = state.config === undefined ? DEFAULT_CONFIG : { ...state.config, contentBandsHeaderTextColor: action.payload };\r\n },\r\n SET_GRADIENT_COLOR: (state: IContentBandsState, action: ISetGradientColorAction) => {\r\n state.config = state.config === undefined ? DEFAULT_CONFIG : { ...state.config, contentBandsGradientColor: action.payload };\r\n },\r\n SET_ADD_FINISHED: (state: IContentBandsState, action: ISetAddFinishedAction) => {\r\n state.addFinished = action.payload.addFinished;\r\n state.addIdx = action.payload.addIdx;\r\n },\r\n SET_REORDERED: (state: IContentBandsState, action: ISetBooleanAction) => {\r\n state.reordered = action.payload;\r\n },\r\n SET_CONFIG: (state: IContentBandsState, action: ISetConfigAction) => {\r\n state.config = action.payload;\r\n },\r\n SET_PRISTINE_CONFIG: (state: IContentBandsState, action: ISetConfigAction) => {\r\n state.pristineConfig = action.payload;\r\n },\r\n CLEAR_BANDS: (state: IContentBandsState) => {\r\n state.contentBands = [];\r\n state.publishedContentBands = null;\r\n state.fetched = false;\r\n state.publishCount = 0;\r\n }\r\n },\r\n extraReducers: (builder) => {\r\n builder\r\n .addCase(fetchContentBandsAsync.pending, (state: IContentBandsState) => {\r\n state.isLoadingContentBands = true;\r\n })\r\n .addCase(fetchContentBandsAsync.fulfilled, (state: IContentBandsState, action) => {\r\n state.isLoadingContentBands = false;\r\n state.fetched = true;\r\n state.publishCount = action.payload.publishCount;\r\n state.contentBands = action.payload.contentBands;\r\n })\r\n .addCase(fetchContentBandsAsync.rejected, (state: IContentBandsState) => {\r\n state.isLoadingContentBands = false;\r\n })\r\n .addCase(saveContentBandsAsync.pending, (state: IContentBandsState) => {\r\n state.isSavingContentBands = true;\r\n })\r\n .addCase(saveContentBandsAsync.fulfilled, (state) => {\r\n state.isSavingContentBands = false;\r\n })\r\n .addCase(saveContentBandsAsync.rejected, (state: IContentBandsState) => {\r\n state.isSavingContentBands = false;\r\n })\r\n .addCase(fetchContentForBandAsync.pending, (state: IContentBandsState) => {\r\n state.isLoadingContent = true;\r\n })\r\n .addCase(fetchContentForBandAsync.fulfilled, (state: IContentBandsState) => {\r\n state.isLoadingContent = false;\r\n state.fetchIdx = null;\r\n state.reordered = false;\r\n })\r\n .addCase(fetchContentForBandAsync.rejected, (state: IContentBandsState) => {\r\n state.isLoadingContent = false;\r\n state.fetchIdx = null;\r\n })\r\n .addCase(publishContentBandsAsync.pending, (state: IContentBandsState) => {\r\n state.isPublishingContentBands = true;\r\n })\r\n .addCase(publishContentBandsAsync.fulfilled, (state: IContentBandsState) => {\r\n state.isPublishingContentBands = false;\r\n })\r\n .addCase(publishContentBandsAsync.rejected, (state: IContentBandsState) => {\r\n state.isPublishingContentBands = false;\r\n })\r\n .addCase(fetchPublishedBandsAsync.pending, (state: IContentBandsState) => {\r\n state.isLoadingPublishedContentBands = true;\r\n })\r\n .addCase(fetchPublishedBandsAsync.fulfilled, (state: IContentBandsState) => {\r\n state.isLoadingPublishedContentBands = false;\r\n })\r\n .addCase(fetchPublishedBandsAsync.rejected, (state: IContentBandsState) => {\r\n state.isLoadingPublishedContentBands = false;\r\n })\r\n .addCase(fetchContentBandConfigAsync.pending, (state: IContentBandsState) => {\r\n state.isLoadingContentBandConfig = true;\r\n })\r\n .addCase(fetchContentBandConfigAsync.fulfilled, (state: IContentBandsState) => {\r\n state.isLoadingContentBandConfig = false;\r\n })\r\n .addCase(fetchContentBandConfigAsync.rejected, (state: IContentBandsState) => {\r\n state.isLoadingContentBandConfig = false;\r\n })\r\n .addCase(saveContentBandConfigAsync.pending, (state: IContentBandsState) => {\r\n state.isSavingContentBandConfig = true;\r\n })\r\n .addCase(saveContentBandConfigAsync.fulfilled, (state: IContentBandsState) => {\r\n state.isSavingContentBandConfig = false;\r\n })\r\n .addCase(saveContentBandConfigAsync.rejected, (state: IContentBandsState) => {\r\n state.isSavingContentBandConfig = false;\r\n })\r\n .addCase(publishContentBandConfigAsync.pending, (state: IContentBandsState) => {\r\n state.isPublishingContentBandConfig = true;\r\n })\r\n .addCase(publishContentBandConfigAsync.fulfilled, (state: IContentBandsState) => {\r\n state.isPublishingContentBandConfig = false;\r\n })\r\n .addCase(publishContentBandConfigAsync.rejected, (state: IContentBandsState) => {\r\n state.isPublishingContentBandConfig = false;\r\n });\r\n },\r\n});\r\n","import { FileData } from \"chonky\";\r\nimport { IdNamePair } from \"modules/common/models\";\r\nimport { Document } from \"modules/documents/models\";\r\nimport { Epoch } from \"modules/posts/models\";\r\n\r\nexport interface GalleryState {\r\n documentGallery: DocumentGalleryPage;\r\n imageGallery: ImageGalleryPage;\r\n isFetching: boolean;\r\n isUploading: boolean;\r\n}\r\n\r\nexport interface AttachedFile {\r\n blobId: string;\r\n fileUrl?: string | null;\r\n fileName: string;\r\n fileType: \"image\" | \"video\" | \"application\";\r\n fileExtension: string;\r\n ospreyId: string;\r\n transforms?: { points: number[], zoom?: number }\r\n}\r\n\r\nexport interface DocumentGalleryPage {\r\n currentPage: number;\r\n documents: Document[];\r\n totalDocuments: number;\r\n totalPages: number;\r\n isFetching: boolean;\r\n shouldFetch: boolean;\r\n}\r\nexport interface Image {\r\n blobId: string;\r\n createdTime: Epoch;\r\n updatedTime?: Epoch;\r\n deletedTime?: Epoch;\r\n id: string;\r\n name: string;\r\n tenantId: string;\r\n url: string;\r\n videoId?: string;\r\n keywords: string[];\r\n fileType: ImageType;\r\n parentId?: string;\r\n fileSize?: number;\r\n createdBy?: string;\r\n}\r\n\r\nexport enum ImageType {\r\n Png,\r\n Jpeg,\r\n Bmp,\r\n Jpg,\r\n Gif,\r\n All\r\n}\r\n\r\nexport interface ImageGalleryPage {\r\n currentPage: number;\r\n images: Image[];\r\n totalImages: number;\r\n totalPages: number;\r\n isFetching: boolean;\r\n shouldFetch: boolean;\r\n}\r\n\r\nexport interface CustomFileData extends FileData {\r\n parentId?: string;\r\n childrenIds?: string[];\r\n createdBy?: string;\r\n mimeType?: string;\r\n keywords?: string[];\r\n blobId?: string;\r\n}\r\n\r\nexport interface ImageUploadReturn extends IdNamePair {}\r\n\r\nexport enum MediaType {\r\n Folder,\r\n Image,\r\n Video,\r\n}\r\n\r\nexport interface MediaFile {\r\n createdTime: Epoch;\r\n updatedTime?: Epoch;\r\n deletedTime?: Epoch;\r\n id: string;\r\n name: string;\r\n tenantId: string;\r\n keyWords: string[];\r\n isDirectory: boolean;\r\n childrenIds: string[];\r\n parentId?: string;\r\n}\r\n\r\nexport interface VerifiedFile {\r\n file: File,\r\n action: FileUploadAction,\r\n}\r\n\r\nexport interface VerifiedFileData {\r\n file: CustomFileData,\r\n action: FileUploadAction,\r\n}\r\n\r\nexport enum FileUploadAction {\r\n New,\r\n Rename,\r\n Replace,\r\n Move\r\n}\r\n\r\nexport interface DuplicateFiles {\r\n newFile: File,\r\n duplicateImage: Image,\r\n}\r\n\r\nexport interface DuplicateFileData {\r\n fileDataToMove: CustomFileData,\r\n duplicateFileData: CustomFileData,\r\n}\r\n\r\nexport interface FileWithUrl {\r\n name: string;\r\n url: string;\r\n id: string;\r\n}\r\n\r\nexport interface ConsolidatedDuplicateFiles {\r\n newFile: FileWithUrl\r\n duplicateFile: FileWithUrl\r\n isDir?: boolean;\r\n}\r\n\r\nexport interface MoveFilesWithSrc {\r\n filesToMove: CustomFileData[];\r\n moveSrc: CustomFileData | null;\r\n}\r\n\r\nexport interface MoveFiles extends MoveFilesWithSrc {\r\n filesToMove: CustomFileData[];\r\n moveDest: CustomFileData | null;\r\n} \r\n\r\nexport interface VerifiedMoveFiles {\r\n filesToMove: VerifiedFileData[];\r\n moveDest: CustomFileData | null;\r\n moveSrc: CustomFileData | null;\r\n}\r\n\r\nexport interface ImageAndFolderCountReturn {\r\n folderCount: number;\r\n imageCount: number;\r\n}\r\n\r\n// this is kept in the same order as MediaSortType in the API to match up the enums\r\nexport enum SortGroupName {\r\n Az = \"Sort by A-Z\",\r\n Za = \"Sort by Z-A\",\r\n Newest = \"Sort by Newest\",\r\n Oldest = \"Sort by Oldest\",\r\n}\r\n\r\n// this is kept in the same order as MediaFilterType in the API to match up the enums\r\nexport enum FilterGroupName {\r\n AllImages = \"All Images\",\r\n MyImages = \"My Images\"\r\n}\r\n\r\nexport interface MediaFiltersModel {\r\n sortType?: SortGroupName;\r\n showFoldersFirst?: boolean;\r\n parentId?: string;\r\n filterType?: FilterGroupName;\r\n searchText?: string;\r\n}","import { Action } from \"redux\";\r\nimport { CompleteAction, ActionCreator } from \"typedActions\";\r\n\r\n\r\nimport { Document } from \"modules/documents/models\";\r\nimport { Image } from \"modules/gallery/models\";\r\n\r\n\r\nexport const GET_DOCUMENT = \"GET_DOCUMENT\";\r\nexport interface GetDocument extends Action {}\r\nexport const GetDocument = ActionCreator(GET_DOCUMENT);\r\n\r\nexport const GET_DOCUMENT_COMPLETE = \"GET_DOCUMENT_COMPLETE\";\r\nexport interface GetDocumentComplete extends Action {}\r\nexport const GetDocumentComplete = ActionCreator(GET_DOCUMENT_COMPLETE);\r\n\r\n\r\nexport const GET_DOCUMENT_GALLERY = \"GET_DOCUMENT_GALLERY\";\r\nexport interface GetDocumentGallery extends Action {}\r\nexport const GetDocumentGallery = ActionCreator(GET_DOCUMENT_GALLERY);\r\n\r\nexport const GET_DOCUMENT_GALLERY_COMPLETE = \"GET_DOCUMENT_GALLERY_COMPLETE\";\r\nexport interface GetDocumentGalleryComplete extends CompleteAction {\r\n currentPage: number;\r\n documents: Document[];\r\n totalDocuments: number;\r\n totalPages: number;\r\n}\r\nexport const GetDocumentGalleryComplete = ActionCreator(GET_DOCUMENT_GALLERY_COMPLETE);\r\n\r\n\r\nexport const GET_IMAGE = \"GET_IMAGE\";\r\nexport interface GetImage extends Action {}\r\nexport const GetImage = ActionCreator(GET_IMAGE);\r\n\r\nexport const GET_IMAGE_COMPLETE = \"GET_IMAGE_COMPLETE\";\r\nexport interface GetImageComplete extends CompleteAction {}\r\nexport const GetImageComplete = ActionCreator(GET_IMAGE_COMPLETE);\r\n\r\n\r\nexport const GET_IMAGE_GALLERY = \"GET_IMAGE_GALLERY\";\r\nexport interface GetImageGallery extends Action {}\r\nexport const GetImageGallery = ActionCreator(GET_IMAGE_GALLERY);\r\n\r\nexport const GET_IMAGE_GALLERY_COMPLETE = \"GET_IMAGE_GALLERY_COMPLETE\";\r\nexport interface GetImageGalleryComplete extends CompleteAction {\r\n currentPage: number;\r\n images: Image[];\r\n totalImages: number;\r\n totalPages: number;\r\n}\r\nexport const GetImageGalleryComplete = ActionCreator(GET_IMAGE_GALLERY_COMPLETE);\r\n\r\n\r\nexport const GET_VIDEO = \"GET_VIDEO\";\r\nexport interface GetVideo extends Action {}\r\nexport const GetVideo = ActionCreator(GET_VIDEO);\r\n\r\nexport const GET_VIDEO_COMPLETE = \"GET_VIDEO_COMPLETE\";\r\nexport interface GetVideoComplete extends CompleteAction {}\r\nexport const GetVideoComplete = ActionCreator(GET_VIDEO_COMPLETE);\r\n\r\nexport const GET_VIDEOS_COMPLETE = \"GET_VIDEOS_COMPLETE\";\r\nexport interface GetVideosComplete extends Action {}\r\nexport const GetVideosComplete = ActionCreator(GET_VIDEOS_COMPLETE);\r\n\r\n\r\nexport const UPLOAD_DOCUMENT = \"UPLOAD_DOCUMENT\";\r\nexport interface UploadDocument extends Action {}\r\nexport const UploadDocument = ActionCreator(UPLOAD_DOCUMENT);\r\n\r\nexport const UPLOAD_DOCUMENT_COMPLETE = \"UPLOAD_DOCUMENT_COMPLETE\";\r\nexport interface UploadDocumentComplete extends CompleteAction {}\r\nexport const UploadDocumentComplete = ActionCreator(UPLOAD_DOCUMENT_COMPLETE);\r\n\r\n\r\nexport const UPLOAD_IMAGE = \"UPLOAD_IMAGE\";\r\nexport interface UploadImage extends Action {}\r\nexport const UploadImage = ActionCreator(UPLOAD_IMAGE);\r\n\r\nexport const UPLOAD_IMAGE_COMPLETE = \"UPLOAD_IMAGE_COMPLETE\";\r\nexport interface UploadImageComplete extends CompleteAction {}\r\nexport const UploadImageComplete = ActionCreator(UPLOAD_IMAGE_COMPLETE);","import * as actions from './actions';\r\n\r\ninterface IRequestBuilder {\r\n build: () => { init: any, url: string }\r\n setBaseUrl: (baseURL: string) => void\r\n addAuthToken: (authToken: string) => void\r\n addParam: (key: string, value: string) => void\r\n}\r\n\r\nclass RequestBuilder implements IRequestBuilder {\r\n\r\n private action: actions.NetworkRequest\r\n private init: RequestInit = {}\r\n private url: string = \"\"\r\n private baseUrl: string = \"\"\r\n\r\n private headers: any = {}\r\n private params: any = {}\r\n private queryParams: any = {}\r\n private body: any = {}\r\n\r\n constructor(action: actions.NetworkRequest) {\r\n this.action = action\r\n this.url = this.action.url\r\n this.headers = { ...action.headers }\r\n this.params = { ...this.action.params }\r\n this.queryParams = { ...this.action.queryParams }\r\n this.body = typeof this.action.body === \"string\" ?\r\n this.action.body : { ...this.action.body }\r\n \r\n return this;\r\n }\r\n\r\n public setBaseUrl(baseURL: string) {\r\n this.baseUrl = baseURL\r\n return this;\r\n }\r\n\r\n public addAuthToken(authToken: string) {\r\n this.headers.Authorization = \"Bearer \" + authToken\r\n return this;\r\n }\r\n\r\n public addParam(key: string, value: string) {\r\n this.params[key] = value;\r\n }\r\n\r\n public build() {\r\n let urlBuilder = new UrlBuilder(this.baseUrl)\r\n urlBuilder.addPath(this.url)\r\n urlBuilder.mapParams(this.params || {})\r\n urlBuilder.addQueryParams(this.queryParams || {})\r\n\r\n let reqHeaders = new Headers();\r\n this.init = {\r\n method: this.action.method,\r\n mode: \"cors\",\r\n signal: this.action.abortSignal\r\n } as RequestInit\r\n\r\n if (this.body && Object.keys(this.body).length > 0)\r\n this.init.body = typeof this.body == \"string\" ? \r\n this.body : JSON.stringify(this.body)\r\n\r\n if (this.init.method === \"POST\" && !this.headers.hasOwnProperty(\"Content-Type\"))\r\n this.headers[\"Content-Type\"] = \"application/json; charset=UTF-8\";\r\n\r\n Object.keys(this.headers || {}).forEach((value, index) => {\r\n if (this.headers[value] !== null)\r\n reqHeaders.set(value, this.headers[value]);\r\n });\r\n \r\n if (this.action.internal === true) {\r\n this.init.mode = \"same-origin\";\r\n this.init.credentials = \"same-origin\";\r\n }\r\n\r\n if (this.action.mode) this.init.mode = this.action.mode\r\n if (this.action.credentials) this.init.credentials = this.action.credentials as RequestCredentials\r\n\r\n this.init.headers = reqHeaders;\r\n\r\n return { init: this.init, url: urlBuilder.getUrl() }\r\n }\r\n}\r\n\r\nclass UrlBuilder {\r\n private url: string;\r\n\r\n constructor(baseUri: string) {\r\n this.url = baseUri;\r\n }\r\n\r\n public addPath(path: string) {\r\n if (!path.startsWith(\"/\")) throw Error(\"Invalid Request URL; path must start with /\");\r\n\r\n this.url += path;\r\n return this;\r\n }\r\n\r\n public mapParams(params) {\r\n const keys = Object.keys(params);\r\n for (let i = 0; i < keys.length; i++) {\r\n if (this.url.indexOf(keys[i]) < 0) throw Error(\"Invalid Path Parameter\");\r\n\r\n this.url = this.url.replace(`{${keys[i]}}`, params[keys[i]]);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public addQueryParams(queryParams: {[key: string]: string}) {\r\n if(Object.keys(queryParams).length === 0) {\r\n if (this.url.indexOf(\"?\") < 0) {\r\n this.url += \"?platform=Web\";\r\n } else {\r\n this.url += \"&platform=Web\";\r\n }\r\n return this;\r\n }\r\n\r\n let queryString = Object.keys(queryParams)\r\n .reduce((a, key) => {\r\n const b = key + \"=\" + queryParams[key];\r\n return (a && a.length > 0) ? a + \"&\" + b : b;\r\n }, \"\");\r\n \r\n if (this.url.indexOf(\"?\") < 0) {\r\n this.url += (\"?\" + queryString);\r\n } else {\r\n this.url += (\"&\" + queryString);\r\n }\r\n\r\n this.url += \"&platform=Web\";\r\n\r\n return this;\r\n }\r\n\r\n public getUrl() {\r\n return encodeURI(this.url);\r\n }\r\n}\r\n\r\nexport default RequestBuilder;\r\n","import RequestBuilder from \"network/requestBuilder\";\r\nimport { utils } from \"api/network/utils\";\r\nimport { Store } from \"redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport MsalAuthModule from \"./msalAuthModule\";\r\nimport { NetworkRequest } from \"network/actions\";\r\n\r\nconst handleNetworkRequest = (store: Store, next, action: NetworkRequest) => {\r\n let config = store.getState().config;\r\n let baseURL = (!!action.internal) ? utils.getWebAppUrl() : config.SparrowClientApiUrl;\r\n\r\n const req = new RequestBuilder(action);\r\n req.setBaseUrl(baseURL);\r\n\r\n if (action.url.indexOf(\"{tenant}\") > -1) {\r\n req.addParam(\"tenant\", store.getState().tenant?.id);\r\n }\r\n\r\n return MsalAuthModule.getInstance().getAccessToken().then(accessToken => {\r\n req.addAuthToken(accessToken);\r\n const { url, init } = req.build();\r\n\r\n return fetch(url, init)\r\n .then(response => {\r\n switch(response.status) {\r\n case 200: \r\n return response;\r\n default: // should handle error codes here\r\n return response;\r\n }\r\n })\r\n .catch(error => {\r\n // could not complete request\r\n // something terrible went wrong? no network?\r\n throw error;\r\n });\r\n });\r\n}\r\n\r\nconst createAuthenticatedRequestMiddleware = () => {\r\n return store => next => action => {\r\n if (action.type !== \"NETWORK_REQUEST\") {\r\n return next(action);\r\n }\r\n \r\n return handleNetworkRequest(store, next, action)\r\n }\r\n}\r\n\r\nconst middleware = createAuthenticatedRequestMiddleware();\r\nexport default middleware;","export interface ApplicationState {\r\n head: HeadDefinition\r\n}\r\n\r\nexport interface HeadDefinition {\r\n title?: string;\r\n description?: string;\r\n openGraphTitle?: string;\r\n openGraphDescription?: string;\r\n openGraphUrl?: string;\r\n openGraphImageUrl?: string;\r\n openGraphVideo?: string;\r\n}\r\n\r\nexport const DefaultHeadValues = {\r\n title: \"Sparrow\",\r\n description: \"\",\r\n openGraphTitle: \"\",\r\n openGraphDescription: \"\",\r\n openGraphUrl: \"https://sparrowapp.io\",\r\n openGraphImageUrl: \"\",\r\n openGraphVideo: \"\"\r\n}\r\n","\r\nimport { Action } from \"redux\";\r\nimport { HeadDefinition, DefaultHeadValues } from \"./models\"\r\nimport * as Actions from \"./actions\"\r\n\r\nconst actionHandler: { [actionType: string]: (state: HeadDefinition | undefined, action: Action) => HeadDefinition } = {\r\n [Actions.HEAD_UPDATED]: (state: HeadDefinition, action: Actions.HeadUpdated) => {\r\n return {\r\n title: action.payload.title || state.title,\r\n description: action.payload.description || state.description,\r\n openGraphTitle: action.payload.openGraphTitle || state.openGraphTitle,\r\n openGraphDescription: action.payload.openGraphDescription || state.openGraphDescription,\r\n openGraphUrl: action.payload.openGraphUrl || state.openGraphUrl,\r\n openGraphImageUrl: action.payload.openGraphImageUrl || state.openGraphImageUrl,\r\n openGraphVideo: action.payload.openGraphVideo || state.openGraphVideo,\r\n };\r\n }\r\n}\r\n\r\nexport const reducer = (state: HeadDefinition | undefined, action: any) : HeadDefinition => {\r\n\r\n const actionHandlerMethod = actionHandler[action.type];\r\n if (actionHandlerMethod) {\r\n return actionHandlerMethod(state, action);\r\n }\r\n\r\n return state || DefaultHeadValues;\r\n}","import { Action } from \"redux\";\r\nimport { ActionCreator } from \"typedActions\";\r\nimport { HeadDefinition } from \"./models\";\r\n\r\nexport const HEAD_UPDATED = \"HEAD_UPDATED\"\r\nexport interface HeadUpdated extends Action {\r\n payload: HeadDefinition\r\n}\r\nexport const CreateUpdatedHeadAction = ActionCreator(HEAD_UPDATED);\r\n","import * as headTags from \"./reducer\";\r\nimport { updateHead } from \"./actionCreator\";\r\n\r\nexport const reducers = {\r\n head: headTags.reducer\r\n};\r\n\r\nexport const actions = { updateHead: updateHead };\r\n\r\nexport * from \"./actions\";","import { Action } from \"redux\";\r\nimport * as Actions from \"./actions\";\r\n\r\nimport { ActivityState, ActivityTab } from \"./models\";\r\n\r\nconst defaultState = {\r\n activeTab: ActivityTab.FlaggedItems\r\n} as ActivityState;\r\n\r\nconst actionHandler: { [actionType: string]: (state: ActivityState, action: Action) => ActivityState } = {\r\n\r\n [Actions.SET_ACTIVE_ACTIVITY_TAB]: (state: ActivityState, action: Actions.SetActiveActivityTab) => {\r\n return {\r\n ...state,\r\n activeTab: action.activeTab\r\n }\r\n }\r\n}\r\n\r\nexport const reducer = (state: ActivityState, action: Action) => {\r\n\r\n const actionHandlerMethod = actionHandler[action.type];\r\n if (actionHandlerMethod) {\r\n return actionHandlerMethod(state, action);\r\n }\r\n\r\n return state || defaultState;\r\n}\r\n","import * as actionCreator from \"./actionCreator\";\r\nimport * as reducer from \"./reducer\";\r\n\r\nexport const actions = {\r\n ...actionCreator\r\n}\r\n\r\nexport const reducers = {\r\n activity: reducer.reducer\r\n}\r\n\r\nexport * from \"./actions\"\r\nexport * from \"./models\"\r\n","export interface ConfigDictionary { \r\n SparrowClientApiUrl: string,\r\n SyncFunctionsApiUrl: string,\r\n AnalyticsErrorMessage: string,\r\n\r\n FetchPostList: string,\r\n FetchSinglePost: string,\r\n FetchTagList: string,\r\n TagUpdated: string,\r\n LogEvents: string,\r\n FetchTenantConfig: string,\r\n SelectReaction: string,\r\n Search: string,\r\n FetchTagSettings: string,\r\n FetchUserTagSettings: string,\r\n FetchUserSettings: string\r\n\r\n smsVerify: string\r\n\r\n GetComments: string,\r\n CreateComment: string,\r\n UpdateComment: string,\r\n DeleteComment: string,\r\n\r\n // analytics\r\n UserCounts: string,\r\n CommentAndReactionCounts: string,\r\n PlatformStats: string,\r\n PostStats: string,\r\n ReadViewStats: string,\r\n TagStats: string,\r\n TopSurveys: string,\r\n TopEvents: string,\r\n UserTrends: string\r\n\r\n downloadAllAnalyticsReportAsImage: string,\r\n\r\n totalUsersInAudiences: string,\r\n totalUsersSubscribedInTopics: string,\r\n\r\n FetchNotificationSettings: string,\r\n\r\n Users: string,\r\n ExternalUsers: string,\r\n ClientSettings: string,\r\n TenantSettings: string,\r\n LocalUsers: string,\r\n InviteSparrowUsers: string,\r\n\r\n FetchDraftPosts: string,\r\n FetchDraftPost: string,\r\n SaveDraftPost: string,\r\n CreateNewDraftPost: string,\r\n DeleteDraftPost: string,\r\n\r\n LCIDMappings: string\r\n FetchEmailResource: string\r\n FetchSMSResource: string\r\n FetchMobileResource: string\r\n }\r\n\r\nexport interface ApplicationState {\r\n config: ConfigDictionary\r\n}\r\n\r\nexport const DefaultConfigState: ConfigDictionary = {\r\n SparrowClientApiUrl: `${process.env.REACT_APP_CLIENTAPIURL}`,\r\n SyncFunctionsApiUrl: `${process.env.REACT_APP_SYNCFUNCTIONSAPIURL}`,\r\n AnalyticsErrorMessage: \"\",\r\n\r\n FetchPostList: \"/{tenant}/api/v1/posts?format=html\",\r\n FetchSinglePost: \"/{tenant}/api/v1/posts/{post}?format=html\",\r\n FetchTagList: \"/{tenant}/adminapi/v1/tags\",\r\n TagUpdated: \"/{tenant}/api/v1/tags/{mode}?tag={tagId}\",\r\n LogEvents: \"/{tenant}/api/v1/loggedEvents\",\r\n FetchTenantConfig: \"/{tenant}/api/v1/config\",\r\n SelectReaction: \"/{tenant}/api/v1/reactions\",\r\n Search: \"/{tenant}/api/v1/search\",\r\n FetchTagSettings: \"/{tenant}/adminapi/v1/tags?audienceLocked=true\",\r\n FetchUserTagSettings: \"/{tenant}/api/v1/tags?audienceLocked=true\",\r\n FetchUserSettings: \"/{tenant}/api/v1/userSettings\",\r\n\r\n smsVerify: \"/{tenant}/api/v1/userSettings/smsVerify\",\r\n\r\n GetComments: \"/{tenant}/api/v1/comment\",\r\n CreateComment: \"/{tenant}/api/v1/comment\",\r\n UpdateComment: \"/{tenant}/api/v1/comment\",\r\n DeleteComment: \"/{tenant}/api/v1/comment\",\r\n\r\n // analytics\r\n UserCounts: \"/{tenant}/platformAnalytics/v1/activeUsers\",\r\n CommentAndReactionCounts: \"/{tenant}/platformAnalytics/v1/commentsAndReactions\",\r\n PlatformStats: \"/{tenant}/platformAnalytics/v1/channelUsage\",\r\n PostStats: \"/{tenant}platformAnalytics/v1/postStats\",\r\n ReadViewStats: \"/{tenant}/platformAnalytics/v1/postReadsViews\",\r\n TagStats: \"/{tenant}/insightsapi/v1/tagStats\", //CURRENTLY UNUSED\r\n TopSurveys: \"/{tenant}/platformAnalytics/v1/surveyWithMostResponse\",\r\n TopEvents: \"/{tenant}/platformAnalytics/v1/mostViewedEvents\",\r\n UserTrends: \"/{tenant}/platformAnalytics/v1/userTrend\",\r\n\r\n totalUsersInAudiences: \"/{tenant}/platformAnalytics/v1/totalUsersInAudiences\",\r\n totalUsersSubscribedInTopics: \"/{tenant}/platformAnalytics/v1/totalUsersSubscribedInTopics\",\r\n\r\n // analytics report\r\n downloadAllAnalyticsReportAsImage: \"/{tenant}/platformAnalytics/v1/report/image\",\r\n\r\n FetchNotificationSettings: \"/{tenant}/adminapi/v1/notifications\",\r\n\r\n Users: \"/{tenant}/adminapi/v1/users\",\r\n ExternalUsers: \"/{tenant}/adminapi/v1/invitedUsers\",\r\n ClientSettings: \"/{tenant}/api/v1/config\",\r\n TenantSettings: \"/{tenant}/adminapi/v1/tenantSettings\",\r\n LocalUsers: \"/{tenant}/adminapi/v1/users/local\",\r\n InviteSparrowUsers: \"/{tenant}/adminapi/v1/invitedUsers/inviteSparrow\",\r\n\r\n FetchDraftPosts: \"/{tenant}/adminapi/v1/drafts\",\r\n FetchDraftPost: \"/{tenant}/adminapi/v1/drafts\",\r\n SaveDraftPost: \"/{tenant}/adminapi/v1/drafts\",\r\n CreateNewDraftPost: \"/{tenant}/adminapi/v1/drafts/newDraft\",\r\n DeleteDraftPost: \"/{tenant}/adminapi/v1/drafts\",\r\n\r\n LCIDMappings: \"/{tenant}/api/v1/Resources/LCIDMappings\",\r\n FetchEmailResource: \"/{tenant}/api/v1/Resources/EmailSubjects\",\r\n FetchSMSResource: \"/{tenant}/api/v1/Resources/SMSBodies\",\r\n FetchMobileResource: \"/{tenant}/api/v1/Resources/PushContents\"\r\n}\r\n\r\nexport const ReactionSentimentMap = {\r\n add: \"add\",\r\n angry: \"angry\",\r\n bored: \"bored\",\r\n concerned: \"concerned\",\r\n curious: \"curious\",\r\n excited: \"excited\",\r\n idea: \"idea\",\r\n like: \"like\"\r\n}\r\n","import { ConfigDictionary } from './models';\r\nimport { createAction } from '@reduxjs/toolkit';\r\n\r\nexport const ConfigStoreUpdate = createAction>('CONFIG_STORE_UPDATE');","import { DefaultConfigState } from './models';\r\nimport * as Actions from './actions';\r\nimport { createReducer } from '@reduxjs/toolkit';\r\n\r\nexport const reducer = createReducer (DefaultConfigState, builder => {\r\n builder.addCase(Actions.ConfigStoreUpdate, (state, action) => {\r\n return { ...state, ...action.payload }\r\n });\r\n});","import * as Actions from \"./actions\";\r\nimport { LocalizationState, defaultState } from \"./models\";\r\nimport { createReducer } from \"@reduxjs/toolkit\";\r\n\r\nexport const reducer = createReducer(defaultState, builder => {\r\n builder.addCase(Actions.UpdateLocale, (state, action) => {\r\n return { ...state, locale: action.payload } as LocalizationState;\r\n });\r\n builder.addCase(Actions.UpdateMessages, (state, action) => {\r\n return { ...state, messages: action.payload.messages } as LocalizationState;\r\n });\r\n builder.addCase(Actions.UpdateLangPref, (state, action) => {\r\n return { ...state, langPref: action.payload } as LocalizationState;\r\n });\r\n});","import * as Actions from './actions';\r\nimport { PostsState } from './models';\r\nimport { Reducer } from './index';\r\n\r\n\r\nexport const actionHandler: Reducer = {\r\n\r\n [Actions.FETCH_DOCUMENTS_FROM_DIRECTORY]: (state: PostsState, action: Actions.FetchDocumentsFromDirectory) => {\r\n return { ...state, documentDirectory: { ...state.documentDirectory, fetching: true, files: state.documentDirectory.files || [] } }\r\n },\r\n\r\n [Actions.FETCH_DOCUMENTS_FROM_DIRECTORY_COMPLETE]: (state: PostsState, action: Actions.FetchDocumentsFromDirectoryComplete) => {\r\n let previousDocuments = state.documentDirectory.files || []\r\n let nextDocuments = action.files || []\r\n\r\n return {\r\n ...state,\r\n documentDirectory: {\r\n ...state.documentDirectory,\r\n continuationToken: action.continuationToken || null,\r\n fetching: false,\r\n files: [ ...previousDocuments, ...nextDocuments ],\r\n shouldFetch: false,\r\n lastFetched: new Date().getTime()\r\n }\r\n }\r\n },\r\n\r\n \r\n [Actions.FETCH_DOCUMENT_FROM_DIRECTORY_COMPLETE]: (state: PostsState, action: Actions.FetchDocumentFromDirectoryComplete) => {\r\n const docIndex = state.documentDirectory.files.findIndex(i => i.id === action.file.id);\r\n const existsInLibrary = docIndex >= 0;\r\n let files = [...state.documentDirectory.files];\r\n if(existsInLibrary){\r\n files[docIndex] = action.file\r\n }else{\r\n files.unshift(action.file);\r\n }\r\n return {\r\n ...state,\r\n documentDirectory: {\r\n ...state.documentDirectory,\r\n files\r\n }\r\n }\r\n },\r\n\r\n}","import * as Actions from './actions';\r\nimport { PostsState, EmptyDefaultPost, EditorState } from './models';\r\nimport { Reducer } from './index';\r\n\r\nimport * as Validation from \"./components/post-creation/validation\";\r\n\r\n\r\nexport const actionHandler: Reducer = {\r\n\r\n [Actions.CREATE_NEW_DRAFT]: (state: PostsState, action: Actions.CreateNewDraft) => {\r\n return { ...state, creatingNewPost: true }\r\n },\r\n\r\n [Actions.CREATE_NEW_DRAFT_COMPLETE]: (state: PostsState, action: Actions.CreateNewDraftComplete) => {\r\n return {\r\n ...state,\r\n creatingNewPost: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.SET_NEW_DRAFT]: (state: PostsState, action: Actions.SetNewDraft) => {\r\n const validationChecks = Validation.getValidationChecks(action.post);\r\n\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n post: action.post,\r\n fetching: false,\r\n isValid: Validation.isValid(validationChecks),\r\n validationChecks: validationChecks\r\n }\r\n };\r\n },\r\n\r\n [Actions.FETCH_DRAFT_POST]: (state: PostsState, action: Actions.FetchDraftPost) => {\r\n let editorState = {\r\n ...state.editor,\r\n post: { },\r\n fetching: true,\r\n } as EditorState;\r\n\r\n return { ...state, editor: editorState }\r\n },\r\n\r\n [Actions.FETCH_DRAFT_POST_COMPLETE]: (state: PostsState, action: Actions.FetchDraftPostComplete) => {\r\n let postDefaults = {...EmptyDefaultPost};\r\n let stringProperties = Object.keys(postDefaults).filter(k => typeof postDefaults[k] === 'string')\r\n let translatedContent = (!!action.post && action.post.translatedContent) ? action.post.translatedContent :\r\n (state.editor.post.translatedContent || postDefaults.translatedContent);\r\n let editorState = {\r\n ...state.editor,\r\n post: { ...action.post, translatedContent: {...translatedContent} },\r\n fetching: false,\r\n } as EditorState;\r\n\r\n // dont allow possible null values in the editor; default to empty string\r\n stringProperties.forEach((value, index) => {\r\n if(editorState.post[value] == null)\r\n editorState.post[value] = \"\"\r\n });\r\n\r\n let tc = editorState.post.translatedContent!;\r\n for(let lang of Object.keys(tc || {})){\r\n for(let field of Object.keys(tc[lang])){\r\n if(tc[lang][field] === null)\r\n tc[lang][field] = ''\r\n }\r\n }\r\n\r\n const validationChecks = Validation.getValidationChecks(editorState.post);\r\n\r\n return {\r\n ...state,\r\n editor: {\r\n ...editorState,\r\n isValid: Validation.isValid(validationChecks),\r\n validationChecks: validationChecks\r\n }\r\n };\r\n },\r\n\r\n [Actions.CLEAR_EDITOR]: (state: PostsState, action: Actions.ClearEditor) => {\r\n return { ...state, editor: { post: {} } as EditorState };\r\n },\r\n\r\n [Actions.UPDATE_POST]: (state: PostsState, action: Actions.UpdatePost) => {\r\n const post = {\r\n ...state.editor.post,\r\n ...action.post\r\n };\r\n\r\n const validationChecks = Validation.getValidationChecks(post);\r\n\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n changedSinceSaved: true,\r\n post: post,\r\n isValid: Validation.isValid(validationChecks),\r\n validationChecks: validationChecks\r\n }\r\n };\r\n },\r\n\r\n [Actions.POST_EDIT_FIELD_UPDATE]: (state: PostsState, action: Actions.FieldUpdate) => {\r\n const post = {\r\n ...state.editor.post,\r\n [action.field]: action.value\r\n };\r\n\r\n const validationChecks = Validation.getValidationChecks(post);\r\n\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n changedSinceSaved: true,\r\n post: post,\r\n isValid: Validation.isValid(validationChecks),\r\n validationChecks: validationChecks\r\n }\r\n };\r\n },\r\n\r\n [Actions.DRAFT_POST_SAVE]: (state: PostsState, action: Actions.DraftPostSave) => {\r\n return { ...state, editor: { ...state.editor, saving: true } };\r\n },\r\n\r\n [Actions.DRAFT_POST_SAVE_COMPLETE]: (state: PostsState, action: Actions.DraftPostSaveComplete) => {\r\n return { ...state, editor: { ...state.editor, saving: false, changedSinceSaved: false } };\r\n },\r\n\r\n [Actions.IMAGE_SELECTED]: (state: PostsState, action: Actions.ImageSelected) => {\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n image: {\r\n id: action.imageId,\r\n url: action.imageUrl,\r\n transforms: { points: [] }\r\n }\r\n }\r\n }\r\n },\r\n\r\n // [Actions.DOCUMENT_SELECTED]: (state: PostsState, action: Actions.DocumentSelected) => {\r\n // return {\r\n // ... state,\r\n // editor: {\r\n // ...state.editor,\r\n // file: {\r\n // id: action.docId,\r\n // url: action.docUrl,\r\n // }\r\n // }\r\n // }\r\n // },\r\n\r\n [Actions.IMAGE_TRANSFORMED]: (state: PostsState, action: Actions.ImageTransformed) => {\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n image: {\r\n ...state.editor.image,\r\n transforms: action.transforms\r\n }\r\n }\r\n } as PostsState;\r\n },\r\n\r\n [Actions.IMAGE_TWEAK_CONFIRMED]: (state: PostsState, action: Actions.ImageTweaksConfirmed) => {\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n post: {\r\n ...state.editor.post,\r\n image: { ...state.editor.image }\r\n },\r\n image: {\r\n id: \"\",\r\n url: \"\",\r\n transforms: { points: [] }\r\n },\r\n changedSinceSaved: true\r\n }\r\n } as PostsState;\r\n },\r\n\r\n [Actions.CANCEL_IMAGE_CHANGES]: (state: PostsState, action: Actions.CancelImageChanges) => {\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n image: {\r\n id: \"\",\r\n url: \"\",\r\n transforms: { points: [] }\r\n }\r\n }\r\n }\r\n },\r\n\r\n [Actions.DELETE_EDITOR_POST_IMAGE]: (state: PostsState, action: Actions.DeleteEditorPostImage) => {\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n post: {\r\n ...state.editor.post,\r\n image: {\r\n id: \"\",\r\n url: \"\",\r\n transforms: { points: [] }\r\n },\r\n video: {\r\n id: \"\",\r\n url: \"\"\r\n }\r\n },\r\n changedSinceSaved: true\r\n }\r\n }\r\n },\r\n\r\n [Actions.EDIT_PLACED_IMAGE]: (state: PostsState, action: Actions.EditPlacedImage) => {\r\n let currentPostImage = !!state.editor.post.image ? state.editor.post.image : { id: \"\", url: \"\", transforms: { points: [] } }\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n image: { ...currentPostImage },\r\n changedSinceSaved: true\r\n }\r\n }\r\n },\r\n\r\n [Actions.SET_POST_TYPE]: (state: PostsState, action: Actions.SetPostType) => {\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n post: {\r\n ...state.editor.post,\r\n postType: action.postType,\r\n compliance: action.postType === \"compliance\",\r\n mandatory: action.postType === \"mandatory\",\r\n public: action.postType === \"public\"\r\n },\r\n changedSinceSaved: true\r\n }\r\n }\r\n },\r\n\r\n [Actions.SET_CHANGED_SINCE_SAVE]: (state: PostsState, action: Actions.SetChangedSinceSave) => {\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n changedSinceSaved: action.changed\r\n }\r\n }\r\n },\r\n\r\n [Actions.SET_SAVING]: (state: PostsState, action: Actions.SetSaving) => {\r\n return { ...state, editor: {...state.editor, saving: action.saving} };\r\n },\r\n\r\n [Actions.SET_NOTIFICATIONS_ENABLED]: (state: PostsState, action: Actions.SetNotificationsEnabled) => {\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n post: {\r\n ...state.editor.post,\r\n notificationsEnabled: action.enabled,\r\n }\r\n }\r\n }\r\n },\r\n\r\n [Actions.SET_COMMENTING_ENABLED]: (state: PostsState, action: Actions.SetCommentingEnabled) => {\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n post: {\r\n ...state.editor.post,\r\n commentingEnabled: action.enabled,\r\n }\r\n }\r\n }\r\n },\r\n\r\n [Actions.SET_REACTING_ENABLED]: (state: PostsState, action: Actions.SetReactingEnabled) => {\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n post: {\r\n ...state.editor.post,\r\n reactingEnabled: action.enabled,\r\n }\r\n }\r\n }\r\n },\r\n\r\n // [Actions.SET_EMAIL_CHANNEL_ENABLED]: (state: PostsState, action: Actions.SetEmailChannelEnabled) => {\r\n // return {\r\n // ...state,\r\n // editor: {\r\n // ...state.editor,\r\n // post: {\r\n // ...state.editor.post,\r\n // emailNotifications: {\r\n // ...state.editor.post.emailNotifications,\r\n // enabled: action.enabled\r\n // }\r\n // }\r\n // }\r\n // }\r\n // },\r\n\r\n // [Actions.SET_SMS_CHANNEL_ENABLED]: (state: PostsState, action: Actions.SetSMSChannelEnabled) => {\r\n // return {\r\n // ...state,\r\n // editor: {\r\n // ...state.editor,\r\n // post: {\r\n // ...state.editor.post,\r\n // smsNotifications: {\r\n // ...state.editor.post.smsNotifications,\r\n // enabled: action.enabled\r\n // }\r\n // }\r\n // }\r\n // }\r\n // },\r\n\r\n // [Actions.SET_EMAIL_NOTIFICATION_FREQUENCY]: (state: PostsState, action: Actions.SetEmailNotificationFrequency) => {\r\n // return {\r\n // ...state,\r\n // editor: {\r\n // ...state.editor,\r\n // post: {\r\n // ...state.editor.post,\r\n // emailNotifications: {\r\n // ...state.editor.post.emailNotifications,\r\n // frequency: action.frequency\r\n // }\r\n // }\r\n // }\r\n // }\r\n // },\r\n\r\n // [Actions.SET_SMS_NOTIFICATION_HOURS]: (state: PostsState, action: Actions.SetSMSNotificationHours) => {\r\n // return {\r\n // ...state,\r\n // editor: {\r\n // ...state.editor,\r\n // post: {\r\n // ...state.editor.post,\r\n // smsNotifications: {\r\n // ...state.editor.post.smsNotifications,\r\n // hours: action.hours\r\n // }\r\n // }\r\n // }\r\n // }\r\n // },\r\n\r\n // [Actions.SET_SMS_NOTIFICATION_FREQUENCY]: (state: PostsState, action: Actions.SetSMSNotificationFrequency) => {\r\n // return {\r\n // ...state,\r\n // editor: {\r\n // ...state.editor,\r\n // post: {\r\n // ...state.editor.post,\r\n // smsNotifications: {\r\n // ...state.editor.post.smsNotifications,\r\n // frequency: action.frequency\r\n // }\r\n // }\r\n // }\r\n // }\r\n // },\r\n\r\n // [Actions.SET_EMAIL_NOTIFICATION_HOURS]: (state: PostsState, action: Actions.SetEmailNotificationHours) => {\r\n // return {\r\n // ...state,\r\n // editor: {\r\n // ...state.editor,\r\n // post: {\r\n // ...state.editor.post,\r\n // emailNotifications: {\r\n // ...state.editor.post.emailNotifications,\r\n // hours: action.hours\r\n // }\r\n // }\r\n // }\r\n // }\r\n // },\r\n\r\n [Actions.SET_MOBILE_NOTIFICATIONS_ENABLED]: (state: PostsState, action: Actions.SetMobileNotificationsEnabled) => {\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n post: {\r\n ...state.editor.post,\r\n mobileNotificationsEnabled: action.enabled\r\n }\r\n }\r\n }\r\n },\r\n\r\n [Actions.SET_CHATBOT_NOTIFICATIONS_ENABLED]: (state: PostsState, action: Actions.SetChatbotNotificationsEnabled) => {\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n post: {\r\n ...state.editor.post,\r\n chatbotNotificationsEnabled: action.enabled\r\n }\r\n }\r\n }\r\n },\r\n\r\n\r\n [Actions.GET_DRAFT_TRANSLATION]: (state: PostsState, action: Actions.GetDraftTranslation) => {\r\n return {\r\n ...state,\r\n // isFetching: true\r\n }\r\n },\r\n\r\n [Actions.GET_DRAFT_TRANSLATION_COMPLETE]: (state: PostsState, action: Actions.GetDraftTranslationComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to load draft translation\",\r\n // isFetching: false\r\n }\r\n },\r\n\r\n\r\n}\r\n","import * as Actions from './actions';\r\nimport { PostsState } from './models';\r\nimport { Reducer } from './index';\r\n\r\nexport const actionHandler: Reducer = {\r\n\r\n [Actions.SET_NEW_POST_LIST]: (state: PostsState, action: Actions.setNewPostList) => {\r\n return {\r\n ...state,\r\n publishedPostList: {\r\n ...state.publishedPostList,\r\n page: action.page\r\n }\r\n };\r\n },\r\n\r\n [Actions.FETCH_DRAFT_POST_LIST]: (state: PostsState, action: Actions.FetchDraftPostList) => {\r\n return {\r\n ...state,\r\n draftPostList: {\r\n ...state.draftPostList,\r\n isFetching: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.FETCH_DRAFT_POST_LIST_COMPLETE]: (state: PostsState, action: Actions.FetchDraftPostListComplete) => {\r\n return {\r\n ...state,\r\n draftPostList: {\r\n ...state.draftPostList,\r\n ...action.page,\r\n isFetching: false\r\n },\r\n isInitialLoad: false\r\n };\r\n },\r\n\r\n [Actions.FETCH_EXPIRED_POST_LIST]: (state: PostsState, action: Actions.FetchExpiredPostList) => {\r\n return {\r\n ...state,\r\n expiredPostList: {\r\n ...state.expiredPostList,\r\n isFetching: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.FETCH_EXPIRED_POST_LIST_COMPLETE]: (state: PostsState, action: Actions.FetchExpiredPostListComplete) => {\r\n return {\r\n ...state,\r\n expiredPostList: {\r\n ...state.expiredPostList,\r\n ...action.page,\r\n isFetching: false\r\n },\r\n isInitialLoad: false\r\n };\r\n },\r\n\r\n [Actions.FETCH_PUBLISHED_POST_LIST]: (state: PostsState, action: Actions.FetchPublishedPostList) => {\r\n return {\r\n ...state,\r\n publishedPostList: {\r\n ...state.publishedPostList,\r\n isFetching: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.FETCH_PUBLISHED_POST_LIST_COMPLETE]: (state: PostsState, action: Actions.FetchPublishedPostListComplete) => {\r\n return {\r\n ...state,\r\n publishedPostList: {\r\n ...state.publishedPostList,\r\n ...action.page,\r\n isFetching: false\r\n },\r\n isInitialLoad: false\r\n };\r\n },\r\n\r\n [Actions.FETCH_SCHEDULED_POST_LIST]: (state: PostsState, action: Actions.FetchScheduledPostList) => {\r\n return {\r\n ...state,\r\n scheduledPostList: {\r\n ...state.scheduledPostList,\r\n isFetching: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.FETCH_SCHEDULED_POST_LIST_COMPLETE]: (state: PostsState, action: Actions.FetchScheduledPostListComplete) => {\r\n return {\r\n ...state,\r\n scheduledPostList: {\r\n ...state.scheduledPostList,\r\n ...action.page,\r\n isFetching: false\r\n }\r\n };\r\n },\r\n\r\n [Actions.FETCH_SUBMISSION_POST_LIST]: (state: PostsState, action: Actions.FetchSubmissionPostList) => {\r\n return {\r\n ...state,\r\n submissionPostList: {\r\n ...state.submissionPostList,\r\n isFetching: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.FETCH_SUBMISSION_POST_LIST_COMPLETE]: (state: PostsState, action: Actions.FetchSubmissionPostListComplete) => {\r\n return {\r\n ...state,\r\n submissionPostList: {\r\n ...state.submissionPostList,\r\n ...action.page,\r\n isFetching: false\r\n }\r\n };\r\n },\r\n\r\n [Actions.FETCH_ALL_POST_LIST]: (state: PostsState, action: Actions.FetchAllPostList) => {\r\n return {\r\n ...state,\r\n allPostList: {\r\n ...state.allPostList,\r\n isFetching: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.FETCH_ALL_POST_LIST_COMPLETE]: (state: PostsState, action: Actions.FetchAllPostListComplete) => {\r\n return {\r\n ...state,\r\n allPostList: {\r\n ...state.allPostList,\r\n ...action.page,\r\n isFetching: false\r\n }\r\n };\r\n },\r\n\r\n [Actions.DRAFT_POST_DELETE]: (state: PostsState, action: Actions.DraftPostDelete) => {\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n deleting: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.DRAFT_POST_DELETE_COMPLETE]: (state: PostsState, action: Actions.DraftPostDeleteComplete) => {\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n deleting: false\r\n },\r\n errorMessage: action.succeeded ? \"\" : \"Unable to delete post\",\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.DRAFT_POST_DELETE_COMPLETE_BATCH]: (state: PostsState, action: Actions.DraftPostDeleteCompleteBatch) => {\r\n return {\r\n ...state,\r\n editor: {\r\n ...state.editor,\r\n deleting: false\r\n },\r\n errorMessage: action.succeeded ? \"\" : \"Unable to delete post(s)\",\r\n shouldFetch: true\r\n };\r\n },\r\n\r\n [Actions.PUBLISH_POST]: (state: PostsState, action: Actions.PublishPost) => {\r\n return { ...state, publishing: true, publishValidationErrors: { errors: {}, title: null, id: null } };\r\n },\r\n\r\n [Actions.PUBLISH_POST_COMPLETE]: (state: PostsState, action: Actions.PublishPostComplete) => {\r\n let publishValidationErrors = (!action.succeeded && action.validationResult) ? {\r\n id: action.validationResult.postId,\r\n title: action.validationResult.postTitle,\r\n errors: { ...action.validationResult.errors },\r\n } : {id: null, title: null, errors: {}};\r\n\r\n return {\r\n ...state,\r\n publishValidationErrors,\r\n publishing: false,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to publish post\"\r\n } as PostsState;\r\n },\r\n\r\n [Actions.PUBLISH_SUCCESSFUL]: (state: PostsState, action: Actions.PublishSuccessful) => {\r\n let newDraftPostList = [ ...state.draftPostList.posts ];\r\n let index = newDraftPostList.findIndex(p => p.id === action.id);\r\n if (index >= 0) {\r\n newDraftPostList[index].status = 'publishing';\r\n }\r\n return {\r\n ...state,\r\n draftPostList: {\r\n ...state.draftPostList,\r\n posts: newDraftPostList\r\n },\r\n publishConfirmation: {\r\n shouldShowDialog: true,\r\n containsVideoContent: action.containsVideoContent || false,\r\n expectedPublishTime: action.expectedPublishTime || '',\r\n publishedDraftId: action.id\r\n },\r\n shouldFetch: true\r\n } as PostsState\r\n },\r\n\r\n [Actions.HIDE_PUBLISH_SUCCESSFUL_DIALOG]: (state: PostsState, action: Actions.HidePublishSuccessfulDialog) => {\r\n return {\r\n ...state,\r\n publishConfirmation: {\r\n shouldShowDialog: false,\r\n containsVideoContent: false,\r\n expectedPublishTime: '',\r\n publishedDraftId: undefined\r\n }\r\n };\r\n },\r\n\r\n [Actions.SUBMIT_POST]: (state: PostsState, action: Actions.SubmitPost) => {\r\n return { ...state, submitting: true, };\r\n },\r\n\r\n [Actions.SUBMIT_POST_COMPLETE]: (state: PostsState, action: Actions.SubmitPostComplete) => {\r\n return { \r\n ...state, \r\n submitting: false,\r\n shouldFetch: true,\r\n successMessage: action.succeeded ? \"Successfully submitted! Your post is now in review.\" : \"\"\r\n };\r\n },\r\n\r\n [Actions.UNPUBLISH_POST]: (state: PostsState, action: Actions.UnpublishPost) => {\r\n return {\r\n ...state,\r\n unpublishing: true\r\n };\r\n },\r\n\r\n [Actions.UNPUBLISH_POST_COMPLETE]: (state: PostsState, action: Actions.UnpublishPostComplete) => {\r\n return {\r\n ...state,\r\n unpublishing: false,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to unpublish post\",\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.CLEAR_POST_AUTHORING_ERROR_MESSAGE]: (state: PostsState, action: Actions.ClearPostAuthoringErrorMessage) => {\r\n return {\r\n ...state,\r\n errorMessage: \"\"\r\n };\r\n },\r\n\r\n [Actions.CLEAR_POST_AUTHORING_SUCCESS_MESSAGE]: (state: PostsState, action: Actions.ClearPostAuthoringSuccessMessage) => {\r\n return {\r\n ...state,\r\n successMessage: \"\"\r\n };\r\n },\r\n\r\n [Actions.CLEAR_SHOULD_FETCH]: (state: PostsState, action: Actions.ClearShouldFetch) => {\r\n return {\r\n ...state,\r\n shouldFetch: false\r\n };\r\n }\r\n\r\n}\r\n","import * as Actions from './actions';\r\nimport { PostsState } from './models';\r\nimport { Reducer } from './index';\r\n\r\n\r\nexport const actionHandler: Reducer = {\r\n [Actions.FETCH_POSTS_FEED]: (state: PostsState, action: Actions.FetchPostsFeed) => {\r\n return {\r\n ...state,\r\n postsFeed: {\r\n ...state.postsFeed,\r\n errorMessage: \"\",\r\n fetching: true,\r\n filtersApplied: false,\r\n shouldFetch: false\r\n }\r\n };\r\n },\r\n\r\n [Actions.FETCH_POSTS_FEED_COMPLETE]: (state: PostsState, action: Actions.FetchPostsFeedComplete) => {\r\n return {\r\n ...state,\r\n postsFeed: {\r\n ...state.postsFeed,\r\n postsFeed: action.pageNumber === 1 ? action.postsFeed : state.postsFeed.postsFeed.concat(action.postsFeed),\r\n canLoadMore: action.postsFeed.length === 12,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to fetch posts\",\r\n fetching: false,\r\n filtersApplied: action.filtersApplied,\r\n shouldFetch: false\r\n }\r\n };\r\n },\r\n\r\n [Actions.SET_POST_FEED_FILTERS]: (state: PostsState, action: Actions.SetPostFeedFilters) => {\r\n return {\r\n ...state,\r\n postsFeed: {\r\n ...state.postsFeed,\r\n filters: action.filters,\r\n shouldFetch: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.UPDATE_POSTS_FEED]: (state: PostsState, action: Actions.UpdatePostsFeed) => {\r\n return {\r\n ...state,\r\n postsFeed: {\r\n ...state.postsFeed,\r\n postsFeed: action.postsFeed\r\n }\r\n };\r\n },\r\n\r\n [Actions.CLEAR_POST_FEED]: (state: PostsState, action: Actions.ClearPostFeed) => {\r\n return {\r\n ...state,\r\n postsFeed: {\r\n ...state.postsFeed,\r\n postsFeed: [],\r\n shouldFetch: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.CLEAR_POST_FEED_ERROR_MESSAGE]: (state: PostsState, action: Actions.ClearPostFeedErrorMessage) => {\r\n return {\r\n ...state,\r\n postsFeed: {\r\n ...state.postsFeed,\r\n errorMessage: \"\"\r\n }\r\n };\r\n },\r\n\r\n [Actions.CLEAR_POST_FEED_FILTERS]: (state: PostsState, action: Actions.ClearPostFeedFilters) => {\r\n return {\r\n ...state,\r\n postsFeed: {\r\n ...state.postsFeed,\r\n filters: {\r\n postTypes: [],\r\n postStates: [],\r\n tags: [],\r\n textToSearch: \"\"\r\n },\r\n filtersApplied: false\r\n }\r\n }\r\n }\r\n}\r\n\r\n","import * as Actions from './actions';\r\nimport { PostsState } from './models';\r\nimport { Reducer } from './index';\r\nimport { asChonkyFileMap } from 'modules/gallery/chonkyFileAdapter';\r\n\r\nexport const actionHandler: Reducer = {\r\n\r\n [Actions.FETCH_IMAGES_FROM_LIBRARY]: (state: PostsState, action: Actions.FetchImagesFromLibrary) => {\r\n let images = state.imageLibrary.images || [];\r\n let chonkyFileData = state.imageLibrary.chonkyFileData || [];\r\n\r\n return { ...state, imageLibrary: { \r\n ...state.imageLibrary, \r\n fetching: true, \r\n images: images,\r\n imagesGalleryMap: asChonkyFileMap(chonkyFileData),\r\n chonkyFileData: chonkyFileData,\r\n }}\r\n },\r\n\r\n [Actions.FETCH_IMAGES_FROM_LIBRARY_COMPLETE]: (state: PostsState, action: Actions.FetchImagesFromLibraryComplete) => {\r\n let fileData = action.chonkyFileData ;\r\n \r\n const filesToMoveIds = action.moveFilesForAppBar?.filesToMove.map(i => i.id) ?? [];\r\n if (action.moveFilesForAppBar && fileData.filter(x => filesToMoveIds.includes(x.id)).length > 0)\r\n fileData = fileData.map(x => x.isDir && filesToMoveIds.includes(x.id) ? {...x, selectable: false, openable: false} : x);\r\n \r\n return {\r\n ...state,\r\n imageLibrary: {\r\n ...state.imageLibrary,\r\n fetching: false,\r\n shouldFetch: false,\r\n lastFetched: new Date().getTime(),\r\n imagesGalleryMap: asChonkyFileMap(fileData, action.currDir),\r\n chonkyFileData: fileData,\r\n totalCount: action.totalCount,\r\n totalPages: action.totalPages,\r\n currDir: action.currDir,\r\n folderChain: action.folderChain,\r\n }\r\n }\r\n },\r\n\r\n [Actions.FETCH_IMAGE_FROM_LIBRARY_COMPLETE]: (state: PostsState, action: Actions.FetchImageFromLibraryComplete) => {\r\n const imageIndex = state.imageLibrary.images.findIndex(i => i.id === action.image.id);\r\n const existsInLibrary = imageIndex >= 0;\r\n let images = [...state.imageLibrary.images];\r\n if(existsInLibrary){\r\n images[imageIndex] = action.image\r\n }else{\r\n images.unshift(action.image);\r\n }\r\n return {\r\n ...state,\r\n imageLibrary: {\r\n ...state.imageLibrary,\r\n images\r\n }\r\n }\r\n },\r\n\r\n\r\n [Actions.DELETE_IMAGES_FROM_LIBRARY_INIT]: (state: PostsState, action: Actions.DeleteImagesFromLibraryInit) => {\r\n return { ...state, imageLibrary: { ...state.imageLibrary, deleting: true, images: state.imageLibrary.images || [] } }\r\n },\r\n\r\n [Actions.DELETE_IMAGES_FROM_LIBRARY_COMPLETE]: (state: PostsState, action: Actions.DeleteImagesFromLibraryComplete) => {\r\n return {\r\n ...state,\r\n imageLibrary: {\r\n ...state.imageLibrary,\r\n deleting: false,\r\n images: (state.imageLibrary.images || []).filter(i => !action.succeeded || !action.ids || action.ids.indexOf(i.id) < 0)\r\n }\r\n }\r\n },\r\n\r\n [Actions.UPLOAD_IMAGE]: (state: PostsState, action: Actions.UploadImage) => {\r\n return { ...state, imageLibrary: { ...state.imageLibrary, uploading: true } }\r\n },\r\n\r\n [Actions.UPLOAD_IMAGE_COMPLETE]: (state: PostsState, action: Actions.UploadImageComplete) => {\r\n return { ...state, imageLibrary: { ...state.imageLibrary }, shouldFetch: false }\r\n },\r\n\r\n [Actions.SET_UPLOADING]: (state: PostsState, action: Actions.SetUploading) => {\r\n return {\r\n ...state,\r\n imageLibrary: {\r\n ...state.imageLibrary,\r\n uploading: action.uploading\r\n }\r\n }\r\n }\r\n}\r\n","import * as Actions from './actions';\r\nimport { PostsState } from './models';\r\nimport { Reducer } from './index';\r\n\r\nexport const actionHandler: Reducer = {\r\n [Actions.SEND_ACKNOWLEDGEMENT_COMPLETE]: (state: PostsState, action: Actions.SendAcknowledgementComplete) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to send acknowledgement\",\r\n shouldFetch: action.succeeded\r\n }\r\n };\r\n },\r\n [Actions.SET_REACTION]: (state: PostsState, action: Actions.SetReaction) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n savingReaction: true\r\n }\r\n }\r\n },\r\n [Actions.SET_REACTION_COMPLETE]: (state: PostsState, action: Actions.SetReactionComplete) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to set reaction\",\r\n shouldFetch: action.succeeded,\r\n savingReaction: false\r\n }\r\n };\r\n },\r\n\r\n [Actions.ADD_COMMENT]: (state: PostsState, action: Actions.AddComment) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n savingComment: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.ADD_COMMENT_COMPLETE]: (state: PostsState, action: Actions.AddCommentComplete) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to add comment\",\r\n savingComment: false,\r\n shouldFetch: action.succeeded\r\n }\r\n };\r\n },\r\n\r\n [Actions.ADD_COMMENT_REPLY]: (state: PostsState, action: Actions.AddCommentReply) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n savingComment: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.ADD_COMMENT_REPLY_COMPLETE]: (state: PostsState, action: Actions.AddCommentReplyComplete) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to add comment\",\r\n savingComment: false,\r\n shouldFetch: action.succeeded\r\n }\r\n };\r\n },\r\n\r\n [Actions.DELETE_COMMENT]: (state: PostsState, action: Actions.DeleteComment) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n savingComment: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.DELETE_COMMENT_COMPLETE]: (state: PostsState, action: Actions.DeleteCommentComplete) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to delete comment\",\r\n savingComment: false,\r\n shouldFetch: action.succeeded\r\n }\r\n };\r\n },\r\n\r\n [Actions.DESTAR_COMMENT_COMPLETE]: (state: PostsState, action: Actions.DestarCommentComplete) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to remove star\"\r\n }\r\n };\r\n },\r\n\r\n [Actions.EDIT_COMMENT]: (state: PostsState, action: Actions.EditComment) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n savingComment: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.EDIT_COMMENT_COMPLETE]: (state: PostsState, action: Actions.EditCommentComplete) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to edit comment\",\r\n savingComment: false,\r\n shouldFetch: action.succeeded\r\n }\r\n };\r\n },\r\n\r\n [Actions.FLAG_COMMENT]: (state: PostsState, action: Actions.FlagComment) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n savingComment: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.FLAG_COMMENT_COMPLETE]: (state: PostsState, action: Actions.FlagCommentComplete) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to report comment\",\r\n savingComment: false,\r\n shouldFetch: action.succeeded\r\n }\r\n };\r\n },\r\n\r\n [Actions.STAR_COMMENT_COMPLETE]: (state: PostsState, action: Actions.StarCommentComplete) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to star comment\"\r\n }\r\n };\r\n },\r\n\r\n [Actions.SUBSCRIBE_TO_COMMENTS_COMPLETE]: (state: PostsState, action: Actions.SubscribeToCommentsComplete) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to subscribe to comments\"\r\n }\r\n }\r\n },\r\n\r\n [Actions.UNSUBSCRIBE_FROM_COMMENTS_COMPLETE]: (state: PostsState, action: Actions.UnsubscribeFromCommentsComplete) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to unsubscribe from comments\"\r\n }\r\n }\r\n },\r\n\r\n [Actions.CLEAR_FETCH_POST]: (state: PostsState, action: Actions.ClearFetchPost) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n shouldFetch: false\r\n }\r\n };\r\n },\r\n\r\n [Actions.CLEAR_POST_VIEW_ERROR_MESSAGE]: (state: PostsState, action: Actions.ClearPostViewErrorMessage) => {\r\n return {\r\n ...state,\r\n postView: {\r\n ...state.postView,\r\n errorMessage: \"\"\r\n }\r\n };\r\n }\r\n}\r\n\r\n","import * as Actions from './actions';\r\nimport { PostsState } from './models';\r\nimport { Reducer } from './index';\r\n\r\nexport const actionHandler: Reducer = {\r\n\r\n [Actions.FETCH_IDEAL_WORD_COUNT]: (state: PostsState, action: Actions.FetchIdealWordCount) => {\r\n return {\r\n ...state,\r\n tips: {\r\n ...state.tips,\r\n loading: true,\r\n dismissed: false\r\n }\r\n }\r\n },\r\n\r\n [Actions.FETCH_IDEAL_WORD_COUNT_COMPLETE]: (state: PostsState, action: Actions.FetchIdealWordCountComplete) => {\r\n return {\r\n ...state,\r\n tips: {\r\n ...state.tips,\r\n loading: false,\r\n idealWordCount: action.succeeded ? action.idealWordCount : state.tips.idealWordCount\r\n }\r\n }\r\n },\r\n\r\n [Actions.DISMISS_IDEAL_WORD_COUNT_TIP]: (state: PostsState, action: Actions.FetchIdealWordCountComplete) => {\r\n return {\r\n ...state,\r\n tips: {\r\n ...state.tips,\r\n loading: false,\r\n dismissed: true\r\n }\r\n }\r\n },\r\n}\r\n\r\n","import { Action } from 'redux';\r\nimport { actionHandler as documentReducer } from './reducer.documentDirectory';\r\nimport { actionHandler as editorReducer } from './reducer.editor';\r\nimport { actionHandler as postListReducer } from './reducer.postList';\r\nimport { actionHandler as postsFeedReducer } from './reducer.postFeed';\r\nimport { actionHandler as imageLibraryReducer } from './reducer.imageLibrary';\r\nimport { actionHandler as postViewReducer } from './reducer.postView';\r\nimport { actionHandler as tipsReducer } from './reducer.tips';\r\nimport { actionHandler as supportEditorReducer } from '../support/reducer.supportEditor';\r\nimport { PostsState, DefaultPostsState } from './models';\r\n\r\n/* Not sure where to put this interface yet. */\r\nexport interface Reducer { [actionType: string]: (state: T, action: any) => T }\r\n\r\nexport const reducer = (prevState: PostsState | undefined, action: Action) => {\r\n const state = prevState || DefaultPostsState;\r\n\r\n let actionHandler = documentReducer[action.type];\r\n if (actionHandler) {\r\n return actionHandler(state, action);\r\n }\r\n\r\n actionHandler = editorReducer[action.type];\r\n if (actionHandler) {\r\n return actionHandler(state, action);\r\n }\r\n\r\n actionHandler = postListReducer[action.type];\r\n if (actionHandler) {\r\n return actionHandler(state, action);\r\n }\r\n\r\n actionHandler = postsFeedReducer[action.type];\r\n if (actionHandler) {\r\n return actionHandler(state, action);\r\n }\r\n\r\n actionHandler = imageLibraryReducer[action.type];\r\n if (actionHandler) {\r\n return actionHandler(state, action);\r\n }\r\n\r\n actionHandler = postViewReducer[action.type];\r\n if (actionHandler) {\r\n return actionHandler(state, action);\r\n }\r\n\r\n actionHandler = tipsReducer[action.type];\r\n if (actionHandler) {\r\n return actionHandler(state, action);\r\n }\r\n\r\n actionHandler = supportEditorReducer[action.type];\r\n if (actionHandler) {\r\n return actionHandler(state, action);\r\n }\r\n\r\n return state;\r\n};\r\n\r\nexport const reducers = {\r\n posts: reducer\r\n}\r\n","import * as head from \"modules/head\";\r\nimport * as activity from \"modules/activity\";\r\nimport * as audiences from \"modules/audiences\";\r\nimport { reducer as config } from \"modules/config/reducer\";\r\nimport * as documents from \"modules/documents\";\r\nimport * as events from \"modules/events\";\r\nimport * as gallery from \"modules/gallery\";\r\nimport * as insights from \"modules/insights\";\r\nimport { reducer as localization } from \"modules/localization/reducer\";\r\nimport * as portalPages from \"modules/portalPages\";\r\nimport * as posts from \"modules/posts\";\r\nimport * as profile from \"modules/profile\";\r\nimport * as resources from \"modules/resources\";\r\nimport * as settings from \"modules/settings\";\r\nimport * as surveys from \"modules/surveys\";\r\nimport * as tenant from \"modules/tenant\";\r\nimport * as users from \"modules/users\";\r\nimport * as messaging from \"modules/messaging\";\r\nimport * as categoryTags from \"modules/categorytags\";\r\nimport * as adminLayout from \"modules/adminLayout\";\r\nimport * as userPortalLayout from \"modules/userPortalLayout\";\r\n\r\nimport { ReducersMapObject } from \"redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { globalLayoutSlice } from \"modules/globalLayout/reducer\";\r\nimport { contentBandsSlice } from \"modules/contentBands/reducer\";\r\nimport { homeScreensSlice } from \"modules/homeScreens/reducer\";\r\nimport { guidelinesSlice } from \"modules/settings/components/content/guidelines/reducer\";\r\nimport { emailsSlice } from \"modules/emails/reducer\";\r\nimport { snackbarsSlice } from \"modules/common/components/snackbars/reducer\";\r\nimport { shortcutsSlice } from \"modules/shortcuts/reducer\";\r\n\r\nexport const reducers: ReducersMapObject = {\r\n activity: activity.reducers.activity,\r\n adminLayout: adminLayout.reducers.adminLayoutReducer,\r\n audiences: audiences.reducers.audiences,\r\n snackbars: snackbarsSlice.reducer,\r\n categoryTags: categoryTags.reducers.categoryTags,\r\n config,\r\n contentBands: contentBandsSlice.reducer,\r\n documents: documents.reducers.documents,\r\n emails: emailsSlice.reducer,\r\n events: events.reducers.events,\r\n head: head.reducers.head,\r\n homeScreenConfigs: homeScreensSlice.reducer,\r\n insights: insights.reducers.insights,\r\n gallery: gallery.reducers.gallery,\r\n guidelines : guidelinesSlice.reducer,\r\n localization: localization,\r\n messaging: messaging.reducers.messaging,\r\n portalPages: portalPages.reducers.portalPages,\r\n posts: posts.reducers.posts,\r\n profile: profile.reducers.profile,\r\n resources: resources.reducers.resources,\r\n settings: settings.reducers.settings,\r\n shortcuts: shortcutsSlice.reducer,\r\n surveys: surveys.reducers.surveys,\r\n tenant: tenant.reducers.tenant,\r\n users: users.reducers.users,\r\n globalLayout: globalLayoutSlice.reducer,\r\n userPortalLayout: userPortalLayout.reducers.userPortalLayoutReducer,\r\n};\r\n\r\nexport default reducers;\r\n","import {\r\n applyMiddleware,\r\n combineReducers,\r\n compose,\r\n createStore,\r\n ReducersMapObject,\r\n StoreEnhancer,\r\n StoreEnhancerStoreCreator\r\n} from \"redux\";\r\nimport thunk from 'redux-thunk';\r\nimport { connectRouter, routerMiddleware } from 'connected-react-router';\r\nimport { DevTools } from './modules/common/components/DevTools';\r\nimport { createBrowserHistory, History } from 'history';\r\nimport authenticatedRequestMiddleware from './authentication/auth-request-middleware';\r\nimport { GlobalApplicationState } from \"./globalApplicationState\";\r\nimport { reducers } from './rootReducer';\r\nimport { isDevEnvironment } from \"utils/isDevEnvironment\";\r\n\r\nfunction buildRootReducer(allReducers: ReducersMapObject, history: History) {\r\n return combineReducers({\r\n ...allReducers,\r\n router: connectRouter(history)\r\n } as any);\r\n}\r\n\r\n// Create browser history to use in the Redux store\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href') as string;\r\nexport const browserHistory = createBrowserHistory({ basename: baseUrl });\r\n\r\n// Build middleware. These are functions that can process the actions before they reach the store.\r\nconst windowIfDefined = typeof window === \"undefined\" ? null : (window as any);\r\n// If devTools is installed, connect to it\r\nexport const devToolsExtension = windowIfDefined && (windowIfDefined.__REDUX_DEVTOOLS_EXTENSION__ as () => StoreEnhancer);\r\n\r\nexport function configureStore(history:History, initialState?: GlobalApplicationState) {\r\n\r\n const middlewares = [thunk, routerMiddleware(history), authenticatedRequestMiddleware];\r\n\r\n const allReducers = buildRootReducer(reducers, history);\r\n\r\n const store = createStore(allReducers, initialState,\r\n compose(\r\n applyMiddleware(...middlewares),\r\n isDevEnvironment ? ( !!devToolsExtension ? devToolsExtension() : DevTools.instrument() ) : (next: StoreEnhancerStoreCreator) => next\r\n )\r\n );\r\n\r\n // Enable Webpack hot module replacement for reducers\r\n if (!!(module as any).hot) {\r\n (module as any).hot.accept(\"./rootReducer\", () => {\r\n const nextRootReducer = require(\"./rootReducer\");\r\n store.replaceReducer(buildRootReducer(nextRootReducer, history));\r\n });\r\n }\r\n\r\n return store;\r\n};\r\n\r\nexport const store = configureStore(browserHistory);","import { ApiRequest } from \"./network\";\r\nimport { SparrowApi } from \"./network/adapters/SparrowApi\";\r\n\r\nexport interface ExpiryLink {\r\n isExists: boolean;\r\n isUsed: boolean;\r\n maskedEmail: string;\r\n isEnabled: boolean;\r\n isExpired: boolean;\r\n isPasswordResetLink: boolean;\r\n}\r\n\r\ninterface ILinkApi {\r\n getExpiryLink: (token: string, tenantId?: string | null, isResetPasswordLink?: boolean | null) => Promise;\r\n resendSocialInvite: (tenantId: string, token: string) => Promise;\r\n resendSparrowAccountPasswordResetLink: (token: string) => Promise;\r\n}\r\n\r\nexport class LinkApi implements ILinkApi {\r\n constructor(private _sparrowApi: SparrowApi) { }\r\n\r\n async getExpiryLink(token: string, tenantId?: string | null, isResetPasswordLink?: boolean | null): Promise {\r\n try {\r\n const res = await new ApiRequest(\r\n this._sparrowApi.CreateAnonymousRequest().post(`api/v1/links`, { tenantId, token, isResetPasswordLink })\r\n );\r\n\r\n return res;\r\n } catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n async resendSocialInvite(tenantId: string, token: string): Promise {\r\n try {\r\n await new ApiRequest(\r\n this._sparrowApi.CreateAnonymousRequest().post(\"api/v1/links/resendInvite\", { tenantId, token })\r\n );\r\n } catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n async resendSparrowAccountPasswordResetLink(token: string): Promise {\r\n try {\r\n await new ApiRequest(\r\n this._sparrowApi.CreateAnonymousRequest().post(\"/api/v1/links/sendResetPassword\", { token })\r\n );\r\n } catch (error) {\r\n throw error;\r\n }\r\n }\r\n}\r\n","import { AxiosInstance, AxiosRequestConfig } from 'axios'\r\nimport MsalAuthModule from 'authentication/msalAuthModule';\r\n\r\nexport class AuthInterceptor {\r\n public bind(networkLayer: AxiosInstance) {\r\n networkLayer.interceptors.request.use(this.handle);\r\n }\r\n\r\n public handle = (config: AxiosRequestConfig) => {\r\n return MsalAuthModule.getInstance().getAccessToken()\r\n .then(accessToken => {\r\n config.headers.Authorization = `Bearer ${accessToken}`;\r\n return config;\r\n });\r\n }\r\n}\r\n","import { AxiosInstance, AxiosRequestConfig } from 'axios'\r\nimport MsalAuthModule from 'authentication/msalAuthModule';\r\n\r\nexport class GraphAuthInterceptor {\r\n public bind(networkLayer: AxiosInstance) {\r\n networkLayer.interceptors.request.use(this.handle);\r\n }\r\n\r\n public handle = (config: AxiosRequestConfig) => {\r\n return MsalAuthModule.getInstance().getGraphAccessToken()\r\n .then(accessToken => {\r\n config.headers.Authorization = `Bearer ${accessToken}`;\r\n return config;\r\n });\r\n }\r\n}\r\n","import { AxiosInstance, AxiosRequestConfig } from 'axios';\r\n\r\nexport class RequestFormatInterceptor {\r\n\r\n public bind (networkLayer: AxiosInstance) {\r\n networkLayer.interceptors.request.use(this.handle);\r\n }\r\n\r\n public handle = (config: AxiosRequestConfig) => {\r\n let url = config.url;\r\n let baseURL = config.baseURL;\r\n\r\n if (!config.params && config.data) {\r\n config.params = config.data.params;\r\n }\r\n\r\n (Object.keys(config.params || {}) || []).forEach(p => {\r\n const regex = new RegExp(`{${p}}`, 'i');\r\n if (!!url && url.match(regex)) {\r\n url = url.replace(regex, config.params[p])\r\n delete config.params[p];\r\n } else if (!!baseURL && baseURL.match(regex)) {\r\n baseURL = baseURL.replace(regex, config.params[p])\r\n delete config.params[p];\r\n }\r\n });\r\n return Promise.resolve({ ...config, url, baseURL });\r\n }\r\n}\r\n","import { AxiosInstance, AxiosRequestConfig } from 'axios';\r\n\r\nexport class RequestPlatformInterceptor {\r\n\r\n public bind (networkLayer: AxiosInstance) {\r\n networkLayer.interceptors.request.use(this.handle);\r\n }\r\n\r\n public handle = (config: AxiosRequestConfig) => {\r\n let url = config.url;\r\n\r\n if (!!url && url.indexOf(\"platform=\") < 0) {\r\n if (url.indexOf(\"?\") < 0)\r\n url += \"?platform=Web\";\r\n else\r\n url += \"&platform=Web\";\r\n }\r\n\r\n return Promise.resolve({ ...config, url });\r\n }\r\n}\r\n","import { AxiosInstance, AxiosRequestConfig } from \"axios\";\r\nimport { store } from \"configureStore\";\r\n\r\ninterface StateWithTenant {\r\n tenant: { id: string } | null;\r\n}\r\n\r\nexport class TenantAutoFillInterceptor {\r\n public bind(networkLayer: AxiosInstance) {\r\n networkLayer.interceptors.request.use(this.handle);\r\n }\r\n\r\n public handle = (config: AxiosRequestConfig) => {\r\n let tenantId = store.getState().tenant?.id\r\n let tenantRegex = new RegExp('{tenant}', 'i');\r\n \r\n var url;\r\n var baseURL;\r\n\r\n if (tenantId) {\r\n url = config.url!.replace(tenantRegex, tenantId);\r\n baseURL = config.baseURL!.replace(tenantRegex, tenantId);\r\n }\r\n\r\n return Promise.resolve({ ...config, url, baseURL });\r\n };\r\n}\r\n","import axios from \"axios\";\r\nimport { AuthInterceptor } from \"../interceptors/AuthInterceptor\";\r\nimport { RequestFormatInterceptor } from \"../interceptors/RequestFormatInterceptor\";\r\nimport { RequestPlatformInterceptor } from \"../interceptors/RequestPlatformInterceptor\";\r\nimport { TenantAutoFillInterceptor } from \"../interceptors/TenantAutoFillInterceptor\";\r\nimport { store } from \"configureStore\";\r\n\r\nexport class SparrowApi {\r\n constructor(\r\n private _authInterceptor: AuthInterceptor,\r\n private _formatInterceptor: RequestFormatInterceptor,\r\n private _platformInterceptor: RequestPlatformInterceptor,\r\n private _tenantAutoFillInterceptor: TenantAutoFillInterceptor\r\n ) {}\r\n\r\n public CreateRequest() {\r\n const instance = axios.create();\r\n instance.defaults.baseURL = store.getState().config.SparrowClientApiUrl;\r\n this._authInterceptor.bind(instance);\r\n this._formatInterceptor.bind(instance);\r\n this._platformInterceptor.bind(instance);\r\n return instance;\r\n }\r\n\r\n public CreateAnonymousRequest() {\r\n const instance = axios.create();\r\n instance.defaults.baseURL = store.getState().config.SparrowClientApiUrl;\r\n this._formatInterceptor.bind(instance);\r\n this._platformInterceptor.bind(instance);\r\n return instance;\r\n }\r\n\r\n public TenantRequest() {\r\n let instance = this.CreateRequest();\r\n this._tenantAutoFillInterceptor.bind(instance);\r\n this._platformInterceptor.bind(instance);\r\n return instance;\r\n }\r\n}\r\n","import axios from \"axios\";\r\nimport { RequestFormatInterceptor } from \"../interceptors/RequestFormatInterceptor\";\r\nimport { TenantAutoFillInterceptor } from \"../interceptors/TenantAutoFillInterceptor\";\r\nimport { store } from \"configureStore\";\r\nimport { GraphAuthInterceptor } from \"../interceptors/GraphAuthInterceptor\";\r\n\r\nexport class SyncFunctionsGraphApi {\r\n constructor(\r\n private _authInterceptor: GraphAuthInterceptor,\r\n private _formatInterceptor: RequestFormatInterceptor,\r\n private _tenantAutoFillInterceptor: TenantAutoFillInterceptor\r\n ) {}\r\n\r\n public CreateRequest() {\r\n const instance = axios.create();\r\n instance.defaults.baseURL = store.getState().config.SyncFunctionsApiUrl;\r\n this._authInterceptor.bind(instance);\r\n this._formatInterceptor.bind(instance);\r\n return instance;\r\n }\r\n\r\n public TenantRequest() {\r\n let instance = this.CreateRequest();\r\n this._tenantAutoFillInterceptor.bind(instance);\r\n return instance;\r\n }\r\n}\r\n","\r\nimport { OktaAuth, OktaAuthOptions, TokenParams } from \"@okta/okta-auth-js\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { Store } from \"redux\";\r\nimport MsalAuthModule from \"./msalAuthModule\";\r\n\r\n//This class uses an OktaAuthModule using Okta-Auth-Js which gets a token silently using the User's logged in context\r\n//Or if that fails, it acquires one through redirect. This token is used to query groups from the SyncFunctions\r\n//as well as to initiate the sync.\r\nclass OktaAuthModule{\r\n\r\n private _oktaScopes: string[] = `${process.env.REACT_APP_SYNCFUNCTIONSOKTASCOPES}`.split(\",\");\r\n\r\n //This is the Client Id of the Sparrow Portal App Registration that exists in the customer's Okta\r\n private _portalClientId: string;\r\n\r\n private _oktaInstance: OktaAuth;\r\n\r\n private _store: Store | null = null;\r\n \r\n constructor(oktaOrganizationName: string, clientId: string){ \r\n this._oktaInstance = new OktaAuth(this.GetOktaAuthOptions(oktaOrganizationName));\r\n this._portalClientId = clientId;\r\n }\r\n\r\n public getAccessToken(){\r\n\r\n var userEmail = this._store?.getState()?.settings.currentUser?.email;\r\n\r\n const tokenParams: TokenParams = {\r\n scopes: this._oktaScopes,\r\n responseType: 'token',\r\n loginHint: userEmail,\r\n clientId: this._portalClientId,\r\n redirectUri: (!!window ? window.location.origin : \"\") + \"/auth\",\r\n };\r\n\r\n return this._oktaInstance.token.getWithoutPrompt(tokenParams)\r\n .then((tokenResponse) => {\r\n return tokenResponse.tokens.accessToken?.accessToken;\r\n })\r\n .catch((error) => {\r\n return this._oktaInstance.token.getWithRedirect(tokenParams)\r\n .catch((error) => {\r\n MsalAuthModule.getInstance().login();\r\n return \"\";\r\n })\r\n });\r\n } \r\n\r\n private GetOktaAuthOptions(oktaOrganizationName: string): OktaAuthOptions {\r\n return {\r\n issuer: `https://${oktaOrganizationName}.okta.com`\r\n }\r\n }\r\n}\r\n\r\nexport default OktaAuthModule;","import { AxiosInstance, AxiosRequestConfig } from 'axios'\r\nimport OktaAuthModule from 'authentication/oktaAuthModule';\r\nimport { store } from \"configureStore\";\r\n\r\n//This class uses the Okta Organization Name and Portal ClientId from the state\r\n//to create an OktaAuthModule, which is used to query groups from the SyncFunctions\r\n//as well as to initiate the sync.\r\nexport class OktaAuthInterceptor {\r\n public bind(networkLayer: AxiosInstance) {\r\n networkLayer.interceptors.request.use(this.handle);\r\n }\r\n\r\n public handle = (config: AxiosRequestConfig) => {\r\n const oktaOrganizationName = store.getState().settings.tenantSettings.syncConfig.syncDetails.organizationId;\r\n const portalClientId = store.getState().settings.tenantSettings.syncConfig.syncDetails.portalClientId;\r\n\r\n return new OktaAuthModule(oktaOrganizationName, portalClientId).getAccessToken()\r\n .then(accessToken => {\r\n config.headers.Authorization = `Bearer ${accessToken}`;\r\n return config;\r\n });\r\n }\r\n}\r\n","import axios from \"axios\";\r\nimport { RequestFormatInterceptor } from \"../interceptors/RequestFormatInterceptor\";\r\nimport { TenantAutoFillInterceptor } from \"../interceptors/TenantAutoFillInterceptor\";\r\nimport { store } from \"configureStore\";\r\nimport { OktaAuthInterceptor } from \"../interceptors/OktaAuthInterceptor\";\r\n\r\n//This class is used to call the SyncFunctions in order to query Groups using the User's Okta Token, as well\r\n//as to to initiate the Sync of Groups through the SyncFunctions, also using their Token.\r\nexport class SyncFunctionsOktaApi {\r\n constructor(\r\n private _authInterceptor: OktaAuthInterceptor,\r\n private _formatInterceptor: RequestFormatInterceptor,\r\n private _tenantAutoFillInterceptor: TenantAutoFillInterceptor\r\n ) {}\r\n\r\n public CreateRequest() {\r\n const instance = axios.create();\r\n instance.defaults.baseURL = store.getState().config.SyncFunctionsApiUrl;\r\n this._authInterceptor.bind(instance);\r\n this._formatInterceptor.bind(instance);\r\n return instance;\r\n }\r\n\r\n public TenantRequest() {\r\n let instance = this.CreateRequest();\r\n this._tenantAutoFillInterceptor.bind(instance);\r\n return instance;\r\n }\r\n}\r\n","import { ApiRequest } from \"./network\";\r\nimport { SparrowApi } from \"api/network/adapters/SparrowApi\";\r\nimport { IUpdateOption } from \"modules/updateOptions/models\";\r\n\r\ninterface IResourcesApi {\r\n getSharePointPackage(): Promise;\r\n}\r\n\r\nexport class ResourcesApi implements IResourcesApi {\r\n constructor(private _sparrowApi: SparrowApi) {}\r\n\r\n async getSharePointPackage(): Promise {\r\n try {\r\n const res = await new ApiRequest(\r\n this._sparrowApi.TenantRequest()\r\n .get(`/{tenant}/adminapi/v1/resources/sharepoint/download`)\r\n );\r\n return res;\r\n } catch (error) {\r\n throw error;\r\n }\r\n }\r\n}\r\n","import { ApiRequest } from './network';\r\nimport { SparrowApi } from 'api/network/adapters/SparrowApi';\r\nimport { AxiosPromise } from 'axios';\r\nimport { IReadabilitySettings, IReadabilitySettingsOptionModel } from 'modules/settings';\r\nimport { IGenerateContentRequest, IGenerateContentResponse, ISuggestion } from 'modules/smartContent/models';\r\n\r\ninterface ITranslateRequest {\r\n toLcid: string;\r\n fromLcid: string;\r\n text: string;\r\n}\r\n\r\ninterface ITranslatorTextResult {\r\n Translations: ITranslation[];\r\n}\r\n\r\ninterface ITranslation {\r\n text: string;\r\n}\r\n\r\ninterface ICognitiveServicesApi {\r\n getSuggestions(): ApiRequest;\r\n getReadabilityOptions(): ApiRequest;\r\n getReadabilitySettings(): ApiRequest;\r\n generateContent(req: IGenerateContentRequest): AxiosPromise;\r\n saveReadabilitySettings(settings: IReadabilitySettings): ApiRequest;\r\n translateText(req: ITranslateRequest): AxiosPromise;\r\n}\r\n\r\nexport class CognitiveServicesApi implements ICognitiveServicesApi {\r\n constructor(private _sparrowApi: SparrowApi) { }\r\n\r\n /**\r\n * Generate content via GPT\r\n * @param req\r\n * @returns ApiReqeust\r\n */\r\n public generateContent = (req: IGenerateContentRequest): AxiosPromise => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(\"{tenant}/adminapi/v1/cognitiveservices/generateContent?platform=web\", req)\r\n )\r\n .catch((err) => {\r\n throw err;\r\n });\r\n }\r\n\r\n /**\r\n * Get tenant suggestions for prompts to GPT\r\n * @returns ApiRequest\r\n */\r\n public getSuggestions = (): ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().get(`{tenant}/adminapi/v1/cognitiveservices/suggestions`)\r\n );\r\n }\r\n\r\n /**\r\n * Get tenant's current readability settings\r\n * @returns ApiRequest\r\n */\r\n public getReadabilitySettings(): ApiRequest {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().get(`{tenant}/adminapi/v1/cognitiveservices/readabilitysettings`)\r\n );\r\n }\r\n\r\n /**\r\n * Get the options for readability settings\r\n * @returns ApiRequest\r\n */\r\n public getReadabilityOptions(): ApiRequest {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().get(`{tenant}/adminapi/v1/cognitiveservices/readabilitysettings/options`)\r\n );\r\n }\r\n\r\n /**\r\n * Save readability settings\r\n * @param settings\r\n * @returns ApiRequest\r\n */\r\n public saveReadabilitySettings(settings: IReadabilitySettings): ApiRequest {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(`{tenant}/adminapi/v1/cognitiveservices/readabilitysettings`, settings)\r\n );\r\n }\r\n\r\n public translateText(translateReq: ITranslateRequest): AxiosPromise {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(`{tenant}/adminapi/v1/cognitiveservices/translate`, translateReq)\r\n ).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n}\r\n","import { ContentBandStatus, IContentBand, IContentBandConfig, IContentBandInfo } from \"modules/contentBands/models\";\r\nimport { ApiRequest } from \"./network\";\r\nimport { SparrowApi } from \"./network/adapters/SparrowApi\";\r\nimport { AxiosPromise } from \"axios\";\r\nimport { ImageScale } from \"modules/posts/models\";\r\n\r\nexport interface IContentBandsApi {\r\n getContentBands: (imageScale: ImageScale, filters?: IContentBandFilters) => AxiosPromise;\r\n saveContentBands: (bands: IContentBand[]) => AxiosPromise;\r\n getContentBandContent: (\r\n band: IContentBand,\r\n imageScale?: ImageScale,\r\n pageNumber?: number\r\n ) => AxiosPromise;\r\n publishContentBands: (bands: IContentBand[]) => AxiosPromise;\r\n getContentBandConfig: (status?: ContentBandStatus) => AxiosPromise;\r\n saveContentBandConfig: (config: IContentBandConfig) => AxiosPromise;\r\n publishContentBandConfig: (config: IContentBandConfig) => AxiosPromise;\r\n}\r\n\r\nexport interface IContentBandFilters {\r\n statuses: ContentBandStatus[];\r\n includeContent: boolean;\r\n}\r\n\r\nexport class ContentBandsApi implements IContentBandsApi {\r\n constructor(private _sparrowApi: SparrowApi) {}\r\n\r\n getContentBands(imageScale: ImageScale = ImageScale.Mobile, filters?: IContentBandFilters): AxiosPromise {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(`/{tenant}/adminapi/v1/contentbands`, filters, { params: { imageScale } })\r\n ).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n\r\n saveContentBands(bands: IContentBand[]): AxiosPromise {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(`/{tenant}/adminapi/v1/contentbands/draft`, bands)\r\n ).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n\r\n getContentBandContent(\r\n band: IContentBand,\r\n imageScale: ImageScale = ImageScale.Mobile,\r\n pageNumber: number = 1\r\n ): AxiosPromise {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(`/{tenant}/adminapi/v1/contentbands/content`, band, {\r\n params: { pageNumber, imageScale },\r\n })\r\n ).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n\r\n publishContentBands(bands: IContentBand[]): AxiosPromise {\r\n return new ApiRequest(this._sparrowApi.TenantRequest().post(`/{tenant}/adminapi/v1/contentbands/publish`, bands)).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n\r\n getContentBandConfig(status: ContentBandStatus = ContentBandStatus.Draft): AxiosPromise {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().get(`/{tenant}/adminapi/v1/contentbands/config`, { params: { status } })\r\n ).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n\r\n saveContentBandConfig(config: IContentBandConfig): AxiosPromise {\r\n return new ApiRequest(this._sparrowApi.TenantRequest().post(`/{tenant}/adminapi/v1/contentbands/config`, config)).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n\r\n publishContentBandConfig(config: IContentBandConfig): AxiosPromise {\r\n return new ApiRequest(this._sparrowApi.TenantRequest().post(`/{tenant}/adminapi/v1/contentbands/config/${config.id}/publish`, config)).catch(\r\n (err) => {\r\n throw err;\r\n }\r\n );\r\n }\r\n}\r\n","import { ApiRequest } from \"./network\";\r\nimport { SparrowApi } from \"./network/adapters/SparrowApi\";\r\n\r\nexport interface ExpiryLink {\r\n isExists: boolean;\r\n isUsed: boolean;\r\n maskedEmail: string;\r\n isEnabled: boolean;\r\n isExpired: boolean;\r\n isPasswordResetLink: boolean;\r\n}\r\n\r\ninterface IDynamicLinkApi {\r\n getDynamicLink: (link: string) => Promise;\r\n}\r\n\r\ninterface IDynamicLinkResponse {\r\n shortLink: string;\r\n}\r\n\r\nexport class DynamicLinkApi implements IDynamicLinkApi {\r\n constructor(private _sparrowApi: SparrowApi) { }\r\n\r\n async getDynamicLink(link: string): Promise {\r\n let result = await new ApiRequest(\r\n this._sparrowApi.TenantRequest().get(`/{tenant}/api/v1/dynamicLink?link=${link}`)\r\n );\r\n\r\n return result.shortLink;\r\n }\r\n}\r\n","import { AxiosPromise } from \"axios\";\r\nimport { HomeScreenPlatform, IHomeScreenConfig } from \"modules/homeScreens/models\";\r\nimport { SparrowApi } from \"./network/adapters/SparrowApi\";\r\nimport { ApiRequest } from \"./network\";\r\n\r\nexport interface IHomeScreenConfigApi {\r\n getHomeScreenConfigs: (platform: HomeScreenPlatform | null) => AxiosPromise;\r\n saveHomeScreenConfigs: (configs: IHomeScreenConfig[]) => AxiosPromise;\r\n}\r\n\r\nexport class HomeScreenConfigApi implements IHomeScreenConfigApi {\r\n constructor(private _sparrowApi: SparrowApi) {}\r\n\r\n getHomeScreenConfigs(platform: HomeScreenPlatform | null): AxiosPromise {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().get(`/{tenant}/adminapi/v1/homescreen`, { params: { platform }})\r\n ).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n\r\n saveHomeScreenConfigs(configs: IHomeScreenConfig[]): AxiosPromise {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(`/{tenant}/adminapi/v1/homescreen`, configs)\r\n ).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n}\r\n","import { AxiosPromise } from \"axios\";\r\nimport { SparrowApi } from \"./network/adapters/SparrowApi\";\r\nimport { ApiRequest } from \"./network/ApiRequest\";\r\nimport { IEmail, IEmailFilters, IEmailInput, IEmailListing } from \"modules/emails/models\";\r\n\r\nexport class EmailsApi {\r\n constructor(private _sparrowApi: SparrowApi) {}\r\n\r\n getEmailList(pageAmount: number, pageNumber: number, filters: IEmailFilters): AxiosPromise {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest()\r\n .post(\r\n `/{tenant}/adminapi/v2/notifications/emails/paged?pageNumber=${pageNumber}&pageAmount=${pageAmount}`,\r\n filters\r\n )\r\n ).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n\r\n getEmail(emailId: string): AxiosPromise {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().get(`/{tenant}/adminapi/v2/notifications/emails/${emailId}`)\r\n ).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n\r\n deleteEmail(emailId: string): AxiosPromise {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().delete(`/{tenant}/adminapi/v2/notifications/emails/${emailId}`)\r\n ).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n\r\n cloneEmail(emailId: string): AxiosPromise {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(`/{tenant}/adminapi/v2/notifications/emails/${emailId}/clone`)\r\n ).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n\r\n cancelSend(emailId: string): AxiosPromise {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(`/{tenant}/adminapi/v2/notifications/emails/${emailId}/cancelSend`)\r\n ).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n \r\n createNewEmail(email: IEmail): AxiosPromise {\r\n const body: IEmailInput = {\r\n ...email,\r\n audiences: email.audiences.map(a => a.id),\r\n sentTime: email.sentTime && new Date(email.sentTime) >= new Date() ? email.sentTime : undefined\r\n };\r\n\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(`/{tenant}/adminapi/v2/notifications/emails/new`, body)\r\n ).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n\r\n saveExistingEmail(email: IEmail): AxiosPromise {\r\n const body: IEmailInput = {\r\n ...email,\r\n audiences: email.audiences.map(a => a.id),\r\n sentTime: email.sentTime && new Date(email.sentTime) >= new Date() ? email.sentTime : undefined\r\n };\r\n\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().put(`/{tenant}/adminapi/v2/notifications/emails/${email.id}`, body)\r\n ).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n\r\n getRecipientsReport(emailId: string) : AxiosPromise {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(`/{tenant}/adminapi/v2/notifications/emails/${emailId}/recipientReport`)\r\n ).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n\r\n testEmail(emailId: string, emails: string[]) : AxiosPromise {\r\n\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(`/{tenant}/adminapi/v2/notifications/emails/${emailId}/testSend`, emails)\r\n ).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n\r\n sendEmail(emailId: string) : AxiosPromise {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(`/{tenant}/adminapi/v2/notifications/emails/${emailId}/send`)\r\n ).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n}","import { ActivityApi } from \"./activity\";\r\nimport { CommentApi } from \"./comments\";\r\nimport { InsightsApi } from \"./insights\";\r\nimport { MediaApi } from \"./media\";\r\nimport { PostsApi } from \"./posts\";\r\nimport { LinkApi } from \"./links\";\r\nimport { SettingsApi } from \"./settings\";\r\nimport { UsersApi } from \"./users\";\r\nimport { AudiencesApi } from \"./audiences\";\r\nimport { AuthInterceptor } from \"./network/interceptors/AuthInterceptor\";\r\nimport { GraphAuthInterceptor } from \"./network/interceptors/GraphAuthInterceptor\";\r\nimport { RequestFormatInterceptor } from \"./network/interceptors/RequestFormatInterceptor\";\r\nimport { RequestPlatformInterceptor } from \"./network/interceptors/RequestPlatformInterceptor\";\r\nimport { TenantAutoFillInterceptor } from \"./network/interceptors/TenantAutoFillInterceptor\";\r\nimport { SparrowApi } from \"./network/adapters/SparrowApi\";\r\nimport { MultitenancyApi } from \"./multitenancy\";\r\nimport { TagsApi } from \"./tags\";\r\nimport { SupportApi } from \"./support\";\r\nimport { DocumentsApi } from \"./documents\";\r\nimport { SyncFunctionsGraphApi } from \"./network/adapters/SyncFunctionsGraphApi\";\r\nimport { SyncApi } from \"./syncFunctions\";\r\nimport { MessagingApi } from \"./messaging\";\r\nimport { EventsApi } from \"./events\";\r\nimport { OktaAuthInterceptor } from \"./network/interceptors/OktaAuthInterceptor\";\r\nimport { SyncFunctionsOktaApi } from \"./network/adapters/SyncFunctionsOktaApi\";\r\nimport { ResourcesApi } from \"./resources\";\r\nimport { DraftPostsApi } from \"./draftPosts\";\r\nimport { LoggedEventsApi } from \"./loggedEvents\";\r\nimport { ReportsApi } from \"./reports\";\r\nimport { TenantManagementApi } from \"./tenantManagement\";\r\nimport { CognitiveServicesApi } from \"./cognitiveServices\";\r\nimport { AdminTinyTemplatesApi } from \"./adminTinyTemplates\";\r\nimport { SubmissionsApi } from \"./submissions\";\r\nimport { OspreyApi } from \"./osprey\";\r\nimport { ContentBandsApi, IContentBandsApi } from \"./contentBands\";\r\nimport { FilesApi } from \"./files\";\r\nimport { DynamicLinkApi } from \"./dynamicLinks\";\r\nimport { AdminFilesApi } from \"./adminFiles\";\r\nimport { SharingApi } from \"./sharing\";\r\nimport { HomeScreenConfigApi } from \"./homeScreens\";\r\nimport { DraftEventsApi } from \"./draftEvents\";\r\nimport { EmailsApi } from \"./emails\";\r\nimport { ShortcutsApi } from \"./shortcuts\";\r\n\r\nexport const authInterceptor = new AuthInterceptor();\r\nexport const graphAuthInterceptor = new GraphAuthInterceptor();\r\nexport const oktaAuthInterceptor = new OktaAuthInterceptor();\r\nexport const requestFormatInterceptor = new RequestFormatInterceptor();\r\nexport const requestPlatformInterceptor = new RequestPlatformInterceptor();\r\nexport const tenantAutoFillInterceptor = new TenantAutoFillInterceptor();\r\n\r\nexport const sparrowApi = new SparrowApi(authInterceptor, requestFormatInterceptor, requestPlatformInterceptor, tenantAutoFillInterceptor);\r\nexport const syncFunctionsGraphApi = new SyncFunctionsGraphApi(graphAuthInterceptor, requestFormatInterceptor, tenantAutoFillInterceptor);\r\nexport const syncFunctionsOktaApi = new SyncFunctionsOktaApi(oktaAuthInterceptor, requestFormatInterceptor, tenantAutoFillInterceptor);\r\n\r\n/* API */\r\nexport const activityApi = new ActivityApi(sparrowApi);\r\nexport const commentApi = new CommentApi(sparrowApi);\r\nexport const insightsApi = new InsightsApi(sparrowApi);\r\nexport const mediaApi = new MediaApi(sparrowApi);\r\nexport const postsApi = new PostsApi(sparrowApi);\r\nexport const linkApi = new LinkApi(sparrowApi);\r\nexport const eventsApi = new EventsApi(sparrowApi);\r\nexport const draftEventsApi = new DraftEventsApi(sparrowApi);\r\nexport const settingsApi = new SettingsApi(sparrowApi);\r\nexport const usersApi = new UsersApi(sparrowApi);\r\nexport const audiencesApi = new AudiencesApi(sparrowApi);\r\nexport const syncFunctionsApi = new SyncApi(syncFunctionsGraphApi, syncFunctionsOktaApi);\r\nexport const multitenancyApi = new MultitenancyApi(sparrowApi);\r\nexport const tagsApi = new TagsApi(sparrowApi);\r\nexport const supportApi = new SupportApi(sparrowApi)\r\nexport const documentsApi = new DocumentsApi(sparrowApi);\r\nexport const messagingApi = new MessagingApi(sparrowApi);\r\nexport const resourcesApi = new ResourcesApi(sparrowApi);\r\nexport const draftPostsApi = new DraftPostsApi(sparrowApi);\r\nexport const submissionsApi = new SubmissionsApi(sparrowApi);\r\nexport const loggedEventsApi = new LoggedEventsApi(sparrowApi);\r\nexport const reportsApi = new ReportsApi(sparrowApi);\r\nexport const tenantManagementApi = new TenantManagementApi(sparrowApi);\r\nexport const cognitiveServicesApi = new CognitiveServicesApi(sparrowApi);\r\nexport const adminTinyTemplatesApi = new AdminTinyTemplatesApi(sparrowApi);\r\nexport const ospreyApi = new OspreyApi(sparrowApi);\r\nexport const dynamicLinksApi = new DynamicLinkApi(sparrowApi);\r\nexport const contentBandApi: IContentBandsApi = new ContentBandsApi(sparrowApi);\r\nexport const filesApi = new FilesApi(sparrowApi);\r\nexport const adminFilesApi = new AdminFilesApi(sparrowApi);\r\nexport const sharingApi = new SharingApi(sparrowApi);\r\nexport const homeScreenConfigApi = new HomeScreenConfigApi(sparrowApi);\r\nexport const emailsApi = new EmailsApi(sparrowApi);\r\nexport const shortcutsApi = new ShortcutsApi(sparrowApi);\r\n","import { ApiRequest } from './network';\r\nimport { SparrowApi } from './network/adapters/SparrowApi';\r\n\r\nexport class MediaApi {\r\n\r\n constructor(private _sparrowApi: SparrowApi) {\r\n }\r\n\r\n public GetVideoUrl = (id: string) => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest()\r\n .get(`/{tenant}/ospreyapi/v1/videos/${id}`)\r\n ).then(response => response)\r\n }\r\n\r\n public GetImageUrl = (id: string) => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest()\r\n .get(`/{tenant}/ospreyapi/v1/images/${id}`)\r\n ).then(response => response.url)\r\n }\r\n}","import { AxiosPromise } from 'axios';\r\nimport { ApiRequest } from './network';\r\nimport { SparrowApi } from 'api/network/adapters/SparrowApi';\r\n\r\nexport class DraftEventsApi {\r\n constructor(private _sparrowApi: SparrowApi) {\r\n }\r\n\r\n public getPublishedFromDraftId = (id: string) : AxiosPromise=> {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest()\r\n .get('/{tenant}/adminapi/v1/drafts/events/published', { params: { id }})\r\n ).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n}","import { ApiRequest } from './network';\r\nimport { SyncFunctionsGraphApi } from './network/adapters/SyncFunctionsGraphApi';\r\nimport { SyncFunctionsOktaApi } from './network/adapters/SyncFunctionsOktaApi';\r\nimport { SyncAction, SyncType } from 'modules/audiences/models';\r\n\r\nexport class SyncApi {\r\n constructor(private _syncFunctionsGraphApi: SyncFunctionsGraphApi, private _syncFunctionsOktaApi: SyncFunctionsOktaApi) {\r\n }\r\n\r\n public searchForGroupByName = (groupName: string) => {\r\n return new ApiRequest(\r\n this._syncFunctionsGraphApi.CreateRequest()\r\n .post('api/groups/search', \r\n { params: { groupName: groupName }})\r\n );\r\n }\r\n \r\n public getUserGroupSuggestions = (searchText: string, amount: number, skipToken: string) => {\r\n return new ApiRequest(\r\n this._syncFunctionsGraphApi.TenantRequest()\r\n .get('api/{tenant}/groups/search', \r\n { params: { searchText, amount, skipToken } } )\r\n );\r\n }\r\n\r\n public getOktaUserGroupSuggestions = (searchText: string, amount: number, skipToken: string) => {\r\n return new ApiRequest(\r\n this._syncFunctionsOktaApi.TenantRequest()\r\n .get('api/{tenant}/groups/search', \r\n { params: { searchText, amount, skipToken } } )\r\n );\r\n }\r\n\r\n public startGroupSync = (syncAction: SyncAction[], syncType: string = \"\") : ApiRequest => {\r\n if(syncType === SyncType.MicrosoftAD){\r\n return new ApiRequest(\r\n this._syncFunctionsGraphApi.TenantRequest()\r\n .post('api/{tenant}/groups/sync', \r\n { groupIds: syncAction })\r\n );\r\n }\r\n else if(syncType === SyncType.Okta){\r\n return new ApiRequest(\r\n this._syncFunctionsOktaApi.TenantRequest()\r\n .post('api/{tenant}/groups/sync', \r\n { groupIds: syncAction })\r\n );\r\n }\r\n else{\r\n throw new Error(\"syncType is missing from tenantSettings, unable to proceed.\");\r\n }\r\n }\r\n\r\n public getUsersInGroup = (id: string) => {\r\n return new ApiRequest(\r\n this._syncFunctionsGraphApi.CreateRequest()\r\n .get('api/groups/{id}/members',\r\n {params: {id} } )\r\n );\r\n }\r\n\r\n public manageAdUserSync = (action: string) => {\r\n return new ApiRequest(\r\n this._syncFunctionsGraphApi.TenantRequest()\r\n .post('api/{tenant}/users/sync', { action: action})\r\n )\r\n }\r\n}","import { SparrowApi } from \"./network/adapters/SparrowApi\";\r\nimport { ApiRequest } from './network';\r\nimport { Blast, TenantNotificationSettings } from \"modules/messaging\";\r\n\r\nexport class MessagingApi {\r\n constructor(private _sparrowApi: SparrowApi) {\r\n \r\n }\r\n\r\n public SendSMSBlast = (smsBlast: Blast): ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post('/{tenant}/api/v1/notifications/sms/blast', smsBlast)\r\n )\r\n }\r\n\r\n public MassSendConsent = (smsBlast: Blast): ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post('/{tenant}/api/v1/notifications/sms/consent', smsBlast)\r\n )\r\n }\r\n\r\n public UpdateNotificationSettings = (newSettings: TenantNotificationSettings): ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().put('/{tenant}/adminapi/v1/notifications', newSettings)\r\n )\r\n }\r\n\r\n public ApplyBlackoutPeriods = (events: string[]): ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().put('/{tenant}/adminapi/v1/notifications/blackoutperiods', events)\r\n )\r\n }\r\n\r\n public GetSMSStats = (): ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().get('/{tenant}/adminapi/v1/users/notification/smsstats')\r\n )\r\n }\r\n\r\n public GetTeamsStats = (): ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().get('/{tenant}/adminapi/v1/users/notification/teamsstats')\r\n )\r\n }\r\n\r\n public GetMobileStats = (): ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().get('/{tenant}/adminapi/v1/users/notification/mobilestats')\r\n )\r\n }\r\n\r\n public GetEmailUserCsv = () => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().get('/{tenant}/adminapi/v1/notifications/useremailcsv')\r\n )\r\n }\r\n\r\n public GetSMSUserCsv = () => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().get('/{tenant}/adminapi/v1/notifications/usersmscsv')\r\n )\r\n }\r\n\r\n public GetTeamsUserCsv = () => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().get('/{tenant}/adminapi/v1/notifications/userteamscsv')\r\n )\r\n }\r\n\r\n public GetMobileUserCsv = () => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().get('/{tenant}/adminapi/v1/notifications/usermobilecsv')\r\n )\r\n }\r\n\r\n public GetOutbox = (outboxType: string) => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().get(`/{tenant}/adminapi/v1/notifications/dispatchcsv/${outboxType}`)\r\n )\r\n }\r\n}","import { ApiRequest } from './network';\r\nimport { SparrowApi } from 'api/network/adapters/SparrowApi';\r\nimport MsalAuthModule from 'authentication/msalAuthModule';\r\nimport { DEVICE_PLATFORM } from 'modules/common/models';\r\nimport { getSessionId } from 'utils/ids';\r\n\r\nexport class LoggedEventsApi {\r\n constructor(private _sparrowApi: SparrowApi) {\r\n }\r\n\r\n public sendFeatureUsageEvent = (featureActionCode: string, userId: string, tenantId: string) => {\r\n const body = {\r\n Events: [{\r\n UserId: userId,\r\n TenantId: tenantId,\r\n Name: \"FeatureUsage\",\r\n Platform: DEVICE_PLATFORM.WEB,\r\n Body: {\r\n FeatureActionCode: featureActionCode\r\n },\r\n Id: getSessionId(),\r\n Time: new Date().toUTCString()\r\n }]\r\n };\r\n\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post('{tenant}/api/v1/loggedevents', body)\r\n );\r\n }\r\n\r\n public sendPostAuthoringOpenedEvent = (postId: string, time?: string): ApiRequest => {\r\n const body = {\r\n Events: [{\r\n Name: \"PostAuthoringOpened\",\r\n Platform: \"Web\",\r\n Time: time || new Date().toISOString(),\r\n Body: {\r\n PostId: postId,\r\n AuthoringUIVersion: \"v2\"\r\n },\r\n }]\r\n };\r\n\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(`{tenant}/api/v1/loggedevents`, body)\r\n );\r\n }\r\n\r\n /**\r\n * Send post authoring closed event\r\n * - uses fetch api in order to use keepalive\r\n */\r\n public sendPostAuthoringClosedEvent = async (tenantId: string, postId: string, userId: string) => {\r\n const url = `${process.env.REACT_APP_CLIENTAPIURL}/${tenantId}/api/v1/loggedevents`;\r\n const accessToken = await MsalAuthModule.getInstance().getAccessToken();\r\n\r\n const body = {\r\n Events: [{\r\n Name: \"PostAuthoringClosed\",\r\n Platform: \"Web\",\r\n TenantId: tenantId,\r\n UserId: userId,\r\n Time: new Date().toISOString(),\r\n Body: {\r\n PostId: postId,\r\n AuthoringUIVersion: \"v2\"\r\n },\r\n }]\r\n };\r\n\r\n const headers = new Headers();\r\n headers.append(\"Content-Type\", \"application/json; charset=utf-8\");\r\n headers.append(\"Authorization\", `Bearer ${accessToken}`);\r\n\r\n const request = {\r\n method: \"POST\",\r\n headers,\r\n keepalive: true, // keeps request alive even if page unloads\r\n body: JSON.stringify(body)\r\n };\r\n\r\n return fetch(url, request);\r\n }\r\n\r\n /**\r\n * Sends post authoring closed event via beacon api\r\n */\r\n public sendPostAuthoringClosedEventBeacon = async (tenantId: string, postId: string, userId: string) => {\r\n let url = `${process.env.REACT_APP_CLIENTAPIURL}/${tenantId}/api/v1/loggedevents/beacon`;\r\n const accessToken = await MsalAuthModule.getInstance().getAccessToken();\r\n\r\n const body = new URLSearchParams({\r\n \"Authorization\": accessToken,\r\n \"Events[0]\": JSON.stringify({\r\n Name: \"PostAuthoringClosed\",\r\n TenantId: tenantId,\r\n UserId: userId,\r\n Platform: \"Web\",\r\n Time: new Date().toISOString(),\r\n Body: {\r\n PostId: postId,\r\n AuthoringUIVersion: \"v2\"\r\n },\r\n })\r\n });\r\n\r\n navigator.sendBeacon(url, body);\r\n }\r\n\r\n public sendShortcutOpenedEvent = (shortcutId: string, time?: string): ApiRequest => {\r\n const body = {\r\n Events: [{\r\n Name: \"ShortcutOpened\",\r\n Platform: DEVICE_PLATFORM.WEB,\r\n Time: time || new Date().toISOString(),\r\n Body: {\r\n ShortcutId: shortcutId,\r\n },\r\n }]\r\n };\r\n\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(`{tenant}/api/v1/loggedevents`, body)\r\n );\r\n }\r\n}\r\n","/**\r\n * Helper to get a time based session id\r\n * - used for event ids\r\n */\r\nexport const getSessionId = (): number => 10000 * (Date.parse(new Date().toISOString()) - Date.parse(new Date(2001, 0, 1).toISOString()));\r\n","import { TenantCreation } from 'modules/tenantManagement/models';\r\nimport { ApiRequest } from './network';\r\nimport { SparrowApi } from './network/adapters/SparrowApi';\r\n\r\n\r\nexport class TenantManagementApi {\r\n\r\n constructor(private _sparrowApi: SparrowApi) {\r\n }\r\n \r\n public CreateNewTenant = (tenantCreationValues: TenantCreation): ApiRequest => {\r\n\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post('{tenant}/sparrowapi/v1/newTenant/createNewTenant', tenantCreationValues)\r\n );\r\n }\r\n}","import { IdObject } from 'modules/common/models';\r\nimport { ApiRequest } from './network';\r\nimport { SparrowApi } from 'api/network/adapters/SparrowApi';\r\nimport { ITinyCategoryFilters } from 'modules/common/services/tinyMceTemplateService';\r\n\r\nexport interface ITinyTemplate {\r\n id: string;\r\n title: string;\r\n content?: string;\r\n}\r\n\r\nexport interface ITinyCategory {\r\n id: string;\r\n title: string;\r\n content?: string;\r\n items?: ITinyTemplate[];\r\n}\r\n\r\nexport class AdminTinyTemplatesApi {\r\n constructor(private _sparrowApi: SparrowApi) {}\r\n\r\n /**\r\n * Get all tiny templates for tenant\r\n * @returns list of templates and categories\r\n */\r\n public getAllTinyTemplates = (filters?: ITinyCategoryFilters): ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(\"{tenant}/adminapi/v1/tiny/templates\", filters)\r\n );\r\n }\r\n\r\n /**\r\n * Upsert TinyMCE template category\r\n * @returns id of document\r\n */\r\n public upsertTinyCategory = (category: ITinyCategory): ApiRequest> => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(\"{tenant}/adminapi/v1/tiny/category\", category)\r\n );\r\n }\r\n\r\n /**\r\n * Upsert TinyMCE template\r\n * @returns id of document\r\n */\r\n public upsertTinyTemplate = (template: ITinyTemplate): ApiRequest> => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(\"{tenant}/adminapi/v1/tiny/template\", template)\r\n );\r\n }\r\n\r\n /**\r\n * Delete a TinyMCE template\r\n */\r\n public deleteTinyTemplate = (id: string): ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().delete(`{tenant}/adminapi/v1/tiny/template/${id}`)\r\n );\r\n }\r\n\r\n /**\r\n * Delete a TinyMCE template category\r\n */\r\n public deleteTinyCategory = (id: string): ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().delete(`{tenant}/adminapi/v1/tiny/category/${id}`)\r\n );\r\n }\r\n\r\n /**\r\n * Get template by id\r\n */\r\n public getTinyTemplate = (id: string): ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().get(`{tenant}/adminapi/v1/tiny/template/${id}`)\r\n );\r\n }\r\n}\r\n","import { AttachedFile } from \"modules/gallery\";\r\nimport { ApiRequest } from \"./network\";\r\nimport { SparrowApi } from \"./network/adapters/SparrowApi\";\r\n\r\nexport class OspreyApi {\r\n constructor(private _sparrowApi: SparrowApi) {}\r\n\r\n public uploadImage = (blobInfo) => {\r\n const formData = new FormData();\r\n formData.append('file', blobInfo.blob(), blobInfo.filename());\r\n\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(`/{tenant}/ospreyapi/v1/images/upload?fileName=${blobInfo.filename()}`, formData)\r\n );\r\n }\r\n\r\n public getFilesWithUrls = (files: AttachedFile []) : ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest().post(`/{tenant}/ospreyapi/v1/blob/files`, files)\r\n );\r\n }\r\n}\r\n","import { ApiRequest } from \"./network\";\r\nimport { SparrowApi } from \"./network/adapters/SparrowApi\";\r\n\r\nexport interface ICustomCssModelv1 {\r\n sasUrl?: string;\r\n}\r\n\r\nexport class FilesApi {\r\n constructor(private _sparrowApi: SparrowApi) {}\r\n\r\n public getCustomTinyMceCss = (tenantId: string): ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi\r\n .CreateAnonymousRequest()\r\n .get(`/${tenantId}/api/v1/files/css/tinymce`)\r\n );\r\n }\r\n\r\n public getCustomPortalPagesCss = (pageId: string): ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi\r\n .TenantRequest()\r\n .get(`/{tenant}/api/v1/files/css/portalPages?portalPagesDraftId=${pageId}`)\r\n );\r\n }\r\n}\r\n","import { ICustomCssModelv1 } from \"./files\";\r\nimport { ApiRequest } from \"./network\";\r\nimport { SparrowApi } from \"./network/adapters/SparrowApi\";\r\n\r\nexport class AdminFilesApi {\r\n constructor(private _sparrowApi: SparrowApi) {}\r\n\r\n public getCustomTinyMceCss = (): ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi\r\n .TenantRequest()\r\n .get(`/{tenant}/adminapi/v1/files/css/tinymce`)\r\n );\r\n }\r\n\r\n public getCustomPortalPagesCss = (pageId: string): ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi\r\n .TenantRequest()\r\n .get(`/{tenant}/adminapi/v1/files/css/portalPages?portalPagesDraftId=${pageId}`)\r\n );\r\n }\r\n}\r\n","import { ShortcutGroup, ShortcutGroupToShortcuts, ShortcutState, ShortcutUpdateModelv1, ShortcutsFilterv1 } from \"modules/shortcuts/models\";\r\nimport { ApiRequest } from \"./network/ApiRequest\";\r\nimport { SparrowApi } from \"./network/adapters/SparrowApi\";\r\n\r\nexport class ShortcutsApi {\r\n constructor(private _sparrowApi: SparrowApi) {}\r\n\r\n public getShortcutsFormat = (filters: ShortcutsFilterv1): ApiRequest => {\r\n const body = {\r\n searchText: filters.searchText,\r\n audiences: filters.audiences,\r\n enabled: filters.state.length === 1 ? filters.state.includes(ShortcutState.ENABLED) : undefined\r\n };\r\n\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest()\r\n .post(\"/{tenant}/adminapi/v1/shortcuts/format/filter\", body)\r\n );\r\n }\r\n\r\n public updateShortcutsFormat = (newFormat: ShortcutGroupToShortcuts[]) => {\r\n const body = JSON.stringify(newFormat);\r\n\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest()\r\n .post(\r\n `/{tenant}/adminapi/v1/shortcuts/format`, \r\n body, \r\n { headers: { \"content-type\": \"application/json\" } })\r\n );\r\n }\r\n\r\n public getShortcut = (shortcutId: string) => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest()\r\n .post(`/{tenant}/adminapi/v1/shortcuts?id=${shortcutId}`)\r\n );\r\n }\r\n\r\n public updateShortcut = (shortcutId: string, shortcutUpdateModel: ShortcutUpdateModelv1) => {\r\n const body = {\r\n audiences: shortcutUpdateModel.audiences,\r\n openInNewWindow: shortcutUpdateModel.openInNewWindow,\r\n isEnabled: shortcutUpdateModel.isEnabled,\r\n url: shortcutUpdateModel.url,\r\n groupId: shortcutUpdateModel.groupId,\r\n name: shortcutUpdateModel.name\r\n };\r\n\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest()\r\n .post(`/{tenant}/adminapi/v1/shortcuts?id=${shortcutId}`, body)\r\n );\r\n }\r\n\r\n public createNewShortcut = (shortcutUpdateModel: ShortcutUpdateModelv1) => {\r\n const body = {\r\n audiences: shortcutUpdateModel.audiences,\r\n openInNewWindow: shortcutUpdateModel.openInNewWindow,\r\n isEnabled: shortcutUpdateModel.isEnabled,\r\n url: shortcutUpdateModel.url,\r\n groupId: shortcutUpdateModel.groupId,\r\n name: shortcutUpdateModel.name\r\n };\r\n\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest()\r\n .post(`/{tenant}/adminapi/v1/shortcuts/new`, body)\r\n );\r\n }\r\n\r\n public bulkUpdateShortcuts = (shortcutIds: string[], setIsEnabled?: boolean, groupIdToMoveTo: string = \"\") => {\r\n const body = JSON.stringify(shortcutIds);\r\n\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest()\r\n .post(\r\n `/{tenant}/adminapi/v1/shortcuts/bulk?groupIdToMoveTo=${groupIdToMoveTo}${setIsEnabled !== undefined ? '&setIsEnabled=' + setIsEnabled : ''}`,\r\n body,\r\n { headers: { \"content-type\": \"application/json\" } }\r\n )\r\n );\r\n }\r\n\r\n public bulkDeleteShortcuts = (shortcutIds: string[]) => {\r\n const body = JSON.stringify(shortcutIds);\r\n\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest()\r\n .post(\r\n `/{tenant}/adminapi/v1/shortcuts/bulk/delete`, \r\n body,\r\n { headers: { \"content-type\": \"application/json\" } }\r\n )\r\n );\r\n }\r\n\r\n public getShortcutGroups = (searchText: string = \"\"): ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest()\r\n .get(`/{tenant}/adminapi/v1/shortcuts/groups?searchText=${searchText}`)\r\n );\r\n }\r\n\r\n public bulkDeleteShortcutGroups = (shortcutGroupids: string[]) => {\r\n const body = JSON.stringify(shortcutGroupids);\r\n\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest()\r\n .post(\r\n `/{tenant}/adminapi/v1/shortcuts/groups/delete`, \r\n body,\r\n { headers: { \"content-type\": \"application/json\" } }\r\n )\r\n );\r\n }\r\n\r\n public updateShortcutGroupName = (shortcutGroupId: string, newName: string) => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest()\r\n .post(`/{tenant}/adminapi/v1/shortcuts/groups?id=${shortcutGroupId}&name=${newName}`)\r\n );\r\n }\r\n\r\n public createNewShortcutGroup = (name: string) => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest()\r\n .post(`/{tenant}/adminapi/v1/shortcuts/groups/new?name=${name}`)\r\n );\r\n }\r\n\r\n public getClientShortcutsList = (): ApiRequest => {\r\n return new ApiRequest(\r\n this._sparrowApi.TenantRequest()\r\n .get(`/{tenant}/api/v1/shortcuts`)\r\n );\r\n }\r\n}","import { GlobalApplicationState } from \"globalApplicationState\"\r\nimport * as actions from \"./actions\";\r\n\r\nexport const setMainStyle = (newStyle?: React.CSSProperties) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(actions.CreateSetMainStyle({ newStyle }));\r\n}\r\n\r\nexport const setHeaderStyle = (newStyle?: React.CSSProperties) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(actions.CreateSetHeaderStyle({ newStyle }));\r\n}\r\n\r\nexport const setShouldDisplayNav = (shouldDisplay: boolean) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(actions.CreateSetShouldDisplayNav({ shouldDisplay }));\r\n}\r\n","export type AccountCategory = \"social\" | \"sparrow\" | \"work\";\r\nexport type AccountRole = \"author\" | \"default\" | \"owner\" | \"user\";\r\nexport type AccountType = \"adfs\" | \"apple\" | \"default\" | \"facebook\" | \"google\" | \"linkedIn\" | \"microsoft\" | \"sparrow\" | \"work\";\r\nexport type AccountStatus = \"disabled\" | \"enabled\" | \"pending\";\r\nexport type SortField = \"User\" | \"Registration\" | \"Comments\" | \"Reactions\" | \"Checkbox\";\r\nexport type UserActivityType = \"AddSparrowUser\" | \"AddSocialUser\" | \"BulkAddSparrowUser\" | \"BulkAddSocialUser\" | \"DeleteSparrowUser\" | \"DeleteSocialUser\" | \"UpdateUser\" | \"ResetUserPassword\" | \"ResendSocialUserInvite\" | \"CancelledSocialUserInvite\" | \"EnabledUser\" | \"DisabledUser\";\r\nexport type UserActivityStatus = \"New\" | \"Successful\" | \"Failed\"\r\nexport type UserSort = {\r\n order: \"increasing\" | \"decreasing\" | \"lastModified\";\r\n category: UserSortCategory;\r\n}\r\n\r\nexport type UserSortCategory = \"name\" | \"state\" | \"role\" | \"accountType\" | \"lastLogin\";\r\n\r\n\r\nexport interface ApplicationState {\r\n users: UsersState\r\n}\r\n\r\nexport enum InvitePlatform\r\n{\r\n Social,\r\n Sparrow,\r\n}\r\n\r\n//Designed to mimic the userRole enum in the backend.\r\nexport enum UserRole {\r\n DEFAULT,\r\n AUTHOR,\r\n OWNER,\r\n USER,\r\n CONTRIBUTOR\r\n}\r\n\r\nexport interface UsersState {\r\n fetching: boolean;\r\n saving: boolean;\r\n activeTab: UsersTab;\r\n users: User[];\r\n userList: UserList;\r\n editingUser: UserEdit | null;\r\n creatingUser: UserCreation;\r\n fetchedUser: User;\r\n invitedUsers: number;\r\n invitedTime: Date;\r\n\r\n continuationToken?: string;\r\n\r\n invitingUser: boolean;\r\n deletingUser: boolean;\r\n externalUserList: ExternalUser[];\r\n invitingUserEmail: string | null;\r\n invitingUserValidation: ValidationResponse | null;\r\n\r\n processingToggleEnableEmail: string | null;\r\n processingReinviteEmail: string | null;\r\n\r\n uploadingBatchInvite: boolean;\r\n batchUploadValidation: ValidationResponse | null;\r\n\r\n reinvitingPendingUsers: boolean;\r\n deletingPendingUsers: boolean;\r\n\r\n legacyFixComplete: boolean;\r\n editingLocalAccountPassword: string;\r\n}\r\n\r\nexport interface InvitedUser {\r\n inviteType: InvitePlatform,\r\n email?: string;\r\n smsPhone: string;\r\n enabled?: boolean;\r\n inviteToken?: string;\r\n inviteTokenused?: boolean;\r\n invitedAt?: Date;\r\n provider?: string;\r\n user?: User;\r\n sequenceNumber?: number\r\n attributes?: object\r\n userDetails?: object\r\n}\r\n\r\nexport interface UserActivity {\r\n userId: string;\r\n tenantId: string;\r\n activityType: UserActivityType;\r\n activityDescription: string;\r\n time: Date;\r\n moreInfo?: string;\r\n message?: string;\r\n status: string;\r\n email: string;\r\n name: string;\r\n reference: string;\r\n}\r\n\r\nexport interface UserActivityLogType {\r\n activityType?: string;\r\n activityDescription?: string;\r\n}\r\n\r\nexport interface UserActivityFilter {\r\n userIds: string[];\r\n textToSearch: string | null;\r\n activityTypes: UserActivityType[];\r\n status: UserActivityStatus | null;\r\n from: string | null;\r\n to: string | null;\r\n}\r\n\r\nexport interface SimpleTag {\r\n id: string;\r\n name: string;\r\n}\r\n\r\nexport interface UserActivityLogPage {\r\n currentPage: number;\r\n results: UserActivity[];\r\n totalItems: number;\r\n totalPages: number;\r\n}\r\nexport interface UserCreation {\r\n firstName: string;\r\n lastName: string;\r\n userName: string;\r\n preferredName: string;\r\n initialPassword: string;\r\n email: string | null;\r\n audiences: string[];\r\n employeeId: string | null;\r\n title: string | null;\r\n department: string | null;\r\n reportsTo: string | null;\r\n region: string | null;\r\n country: string | null;\r\n preferredSMSPhone: string | null;\r\n roles: string[];\r\n canManageSubmissions: boolean;\r\n subscribedToFlaggingNotifications: boolean;\r\n}\r\n\r\nexport interface UserCreationRequiredDetails {\r\n firstName: string;\r\n lastName: string;\r\n userName: string;\r\n initialPassword: string;\r\n email: string;\r\n}\r\n\r\nexport interface UserEdit {\r\n addSubscribedTags: string[];\r\n bio: string;\r\n country: string;\r\n department: string;\r\n firstName: string;\r\n lastName: string;\r\n isEnabled: boolean;\r\n isFlaggingSubscribed: boolean;\r\n isSubmissionManager: boolean;\r\n preferredName: string;\r\n pronouns: string;\r\n officeLocation: string;\r\n region: string;\r\n removeSubscribedTags: string[];\r\n reportsTo: string;\r\n role: AccountRole;\r\n smsPhone: string;\r\n employeeId: string;\r\n title: string;\r\n email: string;\r\n updateCustomDetails: { [key: string]: string };\r\n}\r\n\r\nexport enum UsersTab {\r\n Users = 1,\r\n Insights = 2,\r\n Permissions = 3,\r\n}\r\n\r\nexport enum AccountCreationTypes {\r\n Social,\r\n Sparrow,\r\n}\r\n\r\nexport interface UserList {\r\n currentPage: number;\r\n totalPages: number;\r\n totalUsers: number;\r\n users: UserListItem[];\r\n}\r\n\r\nexport interface UserListItem {\r\n id: string;\r\n accountCategory: AccountCategory;\r\n accountType: AccountType;\r\n avatar: string;\r\n comments: number;\r\n email: string;\r\n eventReads: number;\r\n eventViews: number;\r\n initials: string;\r\n lastLoginDate: string;\r\n lastModifiedDate: string;\r\n localId: string;\r\n name: string;\r\n postReads: number;\r\n postViews: number;\r\n reactions: number;\r\n role: AccountRole;\r\n status: AccountStatus;\r\n totalInteractions: number;\r\n totalReads: number;\r\n totalViews: number;\r\n}\r\n\r\nexport interface User {\r\n id: string;\r\n azureB2CObjectId: string;\r\n audiences: string[];\r\n country: string;\r\n department: string;\r\n firstName: string;\r\n lastName: string;\r\n email: string;\r\n employeeId: string;\r\n providerId: string;\r\n providerName: string;\r\n // applicationLastOpened: Date;\r\n firstLogin: Date | null;\r\n tagIds: string[];\r\n region: string;\r\n reportsTo: string;\r\n roles: string[];\r\n avatarColor: string;\r\n enabled: boolean;\r\n legacyDisabled: boolean;\r\n title: string;\r\n totalComments: number;\r\n totalReactions: number;\r\n subscribedToFlaggingNotifications: boolean;\r\n preferredName: string;\r\n preferredEmail: string;\r\n preferredSMSConsent: boolean | null;\r\n preferredSMSPhone: string\r\n preferredLCID: string;\r\n canManageSubmissions: boolean;\r\n}\r\n\r\nexport interface ExternalUser {\r\n email: string;\r\n inviteTokenUsed: boolean;\r\n inviteToken: string;\r\n provider: string;\r\n invitedAt?: Date;\r\n enabled: boolean;\r\n user: User;\r\n}\r\n\r\nexport interface UninvitedUser {\r\n email: string;\r\n providerName: string;\r\n accessDate: Date;\r\n attempts: number;\r\n}\r\n\r\nexport interface LobbyUser {\r\n email: string;\r\n firstName: string;\r\n lastName: string;\r\n objectId: string;\r\n issuerName: string;\r\n createdDateTime: Date;\r\n}\r\n\r\nexport interface ValidationResponse {\r\n Message: string;\r\n ModelState: {\r\n [prop: string]: string[]\r\n }\r\n}\r\n\r\nexport interface UserCustomDetail {\r\n id: string;\r\n description: string;\r\n key: string;\r\n title: string;\r\n value: string;\r\n}\r\n\r\nexport interface UserDetails {\r\n id: string;\r\n localId: string;\r\n isLocalIdValidEmail: boolean; // used to differentiate between v1 and v2 sparrow accounts\r\n accountCategory: AccountCategory;\r\n accountType: AccountType;\r\n avatar: string;\r\n created: string;\r\n customDetails: UserCustomDetail[];\r\n dataDetails: {\r\n comments: number;\r\n eventReads: number;\r\n eventViews: number;\r\n postReads: number;\r\n postViews: number;\r\n reactions: number;\r\n totalInteractions: number;\r\n totalReads: number;\r\n totalViews: number;\r\n };\r\n email: string;\r\n initials: string;\r\n isEnabled: boolean;\r\n name: string;\r\n securityDetails: {\r\n audiences: UserDetailsAudience[];\r\n isAuthor: boolean;\r\n isFlaggingSubscribed: boolean;\r\n isOwner: boolean;\r\n isSubmissionManager: boolean;\r\n };\r\n standardDetails: {\r\n bio: UserDetailsEditableField;\r\n country: UserDetailsEditableField;\r\n department: UserDetailsEditableField;\r\n email: string;\r\n firstName: string;\r\n lastName: string;\r\n employeeId: string;\r\n preferredName: string;\r\n pronouns: UserDetailsEditableField;\r\n officeLocation: UserDetailsEditableField;\r\n region: UserDetailsEditableField;\r\n reportsTo: UserDetailsEditableField;\r\n smsConsent: boolean;\r\n smsPhone: string;\r\n subscribedTags: SubscribedTag[];\r\n title: UserDetailsEditableField;\r\n };\r\n permissionDetails: PermissionDetails;\r\n isWorkAccount: boolean;\r\n}\r\n\r\nexport interface UserDetailsAudience {\r\n id: string;\r\n audienceType: \"smart\" | \"standard\";\r\n description: string;\r\n isEditable: boolean;\r\n isIncluded: boolean;\r\n title: string;\r\n totalUsers: number;\r\n}\r\n\r\nexport interface PermissionDetails {\r\n role: UserRole;\r\n topics: string[];\r\n isSubmissionManager: boolean;\r\n}\r\n\r\nexport interface UserDetailsEditableField {\r\n value: string;\r\n isEditable: boolean;\r\n}\r\n\r\nexport interface UserSelectFilters {\r\n userState: string;\r\n lastLogin: string;\r\n dateRange: string;\r\n equality: string;\r\n userActivity: string;\r\n role: string;\r\n type: string;\r\n}\r\n\r\nexport class UserFilterValues {\r\n public name: string;\r\n public email: string;\r\n public numOf: string;\r\n public selectVals: UserSelectFilters;\r\n}\r\n\r\nexport const defaultFilters: UserFilterValues = {\r\n name: \"\",\r\n email: \"\",\r\n numOf: \"\",\r\n selectVals: {\r\n userState: \"\",\r\n lastLogin: \"\",\r\n dateRange: \"\",\r\n equality: \"\",\r\n userActivity: \"\",\r\n role: \"\",\r\n type: \"\"\r\n }\r\n};\r\n\r\nexport interface UsersFilterValues {\r\n accountTypes: AccountType[];\r\n hasCustomDetails: boolean | null;\r\n loggedInAfter: string;\r\n roles: AccountRole[];\r\n statuses: AccountStatus[];\r\n textToSearch: string;\r\n authorTopics: string[];\r\n}\r\n\r\nexport class ExternalUserFilterValues {\r\n public registeredEmail: string;\r\n public invitedEmail: string;\r\n public inviteState: string;\r\n}\r\n\r\nexport class PagedInviteFilterValues {\r\n public invitedEmail: string;\r\n public pageNumber: number;\r\n public pageAmount: number;\r\n}\r\n\r\nexport const defaultExternalFilters: ExternalUserFilterValues = {\r\n registeredEmail: \"\",\r\n invitedEmail: \"\",\r\n inviteState: \"\"\r\n};\r\n\r\n\r\nexport interface SubscribedTag {\r\n id: string;\r\n name: string;\r\n tags: {\r\n id: string;\r\n isMandatory: boolean;\r\n name: string;\r\n }[];\r\n}\r\n","import { Action } from 'redux';\r\nimport { CompleteAction, ActionCreator } from 'typedActions';\r\nimport { Survey } from './models';\r\n\r\nexport const GET_SURVEYS = 'GET_SURVEYS'\r\nexport interface GetSurveys extends Action { }\r\nexport const GetSurveys = ActionCreator(GET_SURVEYS);\r\n\r\nexport const GET_SURVEYS_COMPLETE = 'GET_SURVEYS_COMPLETE'\r\nexport interface GetSurveysComplete extends CompleteAction {\r\n surveys?: Survey[]\r\n}\r\nexport const GetSurveysComplete = ActionCreator(GET_SURVEYS_COMPLETE);\r\n\r\n\r\n\r\nexport const GET_SURVEY = 'GET_SURVEY'\r\nexport interface GetSurvey extends Action { }\r\nexport const GetSurvey = ActionCreator(GET_SURVEY);\r\n\r\nexport const GET_SURVEY_COMPLETE = 'GET_SURVEY_COMPLETE'\r\nexport interface GetSurveyComplete extends CompleteAction {}\r\nexport const GetSurveyComplete = ActionCreator(GET_SURVEY_COMPLETE);\r\n\r\n\r\n\r\nexport const DELETE_SURVEYS = 'DELETE_SURVEYS'\r\nexport interface DeleteSurveys extends Action { }\r\nexport const DeleteSurveys = ActionCreator(DELETE_SURVEYS);\r\n\r\nexport const DELETE_SURVEYS_COMPLETE = 'DELETE_SURVEYS_COMPLETE'\r\nexport interface DeleteSurveysComplete extends CompleteAction { \r\n deletedSurveys?: string[]\r\n}\r\nexport const DeleteSurveysComplete = ActionCreator(DELETE_SURVEYS_COMPLETE);\r\n\r\n\r\n\r\nexport const SAVE_SURVEY = 'SAVE_SURVEY';\r\nexport interface SaveSurvey extends Action {}\r\nexport const SaveSurvey = ActionCreator(SAVE_SURVEY);\r\n\r\nexport const SAVE_SURVEY_COMPLETE = 'SAVE_SURVEY_COMPLETE';\r\nexport interface SaveSurveyComplete extends CompleteAction {}\r\nexport const SaveSurveyComplete = ActionCreator(SAVE_SURVEY_COMPLETE);\r\n\r\n\r\n\r\nexport const CLEAR_SURVEY_LIST = 'CLEAR_SURVEY_LIST';\r\nexport interface ClearSurveyList extends Action {}\r\nexport const ClearSurveyList = ActionCreator(CLEAR_SURVEY_LIST);\r\n","export interface IHomeScreensState {\r\n homeScreenConfigs: IHomeScreenConfig[] | undefined;\r\n status: HomeScreensStateStatus;\r\n pristineConfigs: IHomeScreenConfig[] | undefined;\r\n successMessage: string | undefined;\r\n}\r\n\r\nexport enum HomeScreensStateStatus {\r\n Succeeded,\r\n Failed,\r\n Loading,\r\n Idle\r\n}\r\n\r\nexport interface IColorOption {\r\n hexCode: string;\r\n rgb: IRgb;\r\n}\r\n\r\nexport interface IRgb {\r\n r: number;\r\n g: number;\r\n b: number;\r\n}\r\n\r\nexport interface IHomeScreenConfig {\r\n id: string;\r\n showMyFeedBelowContentBands: boolean;\r\n feedHeader: string | null;\r\n homeScreenType: HomeScreenType;\r\n platform: HomeScreenPlatform;\r\n}\r\n\r\nexport enum HomeScreenPlatform {\r\n Mobile = \"mobile\",\r\n Teams = \"teams\"\r\n}\r\n\r\nexport enum HomeScreenType {\r\n ContentBands = \"contentBands\",\r\n MyFeed = \"myFeed\"\r\n}\r\n\r\nexport const HOME_SCREEN_TYPE_MAP: Record = {\r\n [HomeScreenType.ContentBands]: \"Content Bands\",\r\n [HomeScreenType.MyFeed]: \"My Feed\"\r\n}\r\n\r\nexport const HOME_SCREEN_PLATFORM_MAP: Record = {\r\n [HomeScreenPlatform.Mobile]: \"Mobile app\",\r\n [HomeScreenPlatform.Teams]: \"MS Teams app\"\r\n}\r\n","import { Action, createSlice, createAsyncThunk, isAnyOf } from \"@reduxjs/toolkit\";\r\nimport { IEmailFilters, IEmailsState, IEmailListing, IEmail, IEmailSentConfirmation, EmailStatus } from \"./models\";\r\nimport { emailsApi } from \"api/instances\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nconst DEFAULT_EMAILS_LIST_STATE = {\r\n currentPage: 0,\r\n totalEmails: 0,\r\n totalPages: 0,\r\n emails: [],\r\n isFetching: false\r\n}\r\n\r\nexport const DEFAULT_EMAIL: IEmail = {\r\n id: \"\",\r\n tenantId: \"\",\r\n sentBy: undefined,\r\n sentTime: undefined,\r\n subject: [\r\n {\r\n lcid: \"en-us\",\r\n text: \"\"\r\n }\r\n ],\r\n body: [\r\n {\r\n lcid: \"en-us\",\r\n text: \"\"\r\n }\r\n ],\r\n status: EmailStatus.Draft,\r\n audiences: [],\r\n sendToAllUsers: false,\r\n fromSender: {\r\n name: \"\",\r\n email: \"\"\r\n },\r\n replyAddress: \"\",\r\n}\r\n\r\nconst DEFAULT_EMAILS_STATE: IEmailsState = {\r\n draftEmailsList: { id: EmailStatus.Draft, ...DEFAULT_EMAILS_LIST_STATE },\r\n scheduledEmailsList: { id: EmailStatus.Scheduled, ...DEFAULT_EMAILS_LIST_STATE },\r\n sentEmailsList: { id: EmailStatus.Sent, ...DEFAULT_EMAILS_LIST_STATE },\r\n editor: {\r\n email: DEFAULT_EMAIL,\r\n originalEmail: DEFAULT_EMAIL,\r\n changedSinceLastSaved: false,\r\n isFetching: false,\r\n isSaving: false,\r\n shouldDownloadRecipientsList: false,\r\n shouldSendTestEmails: false,\r\n testEmails: [],\r\n shouldOpenOneLastCheck: false,\r\n },\r\n successMessage: \"\",\r\n errorMessage: \"\",\r\n sentConfirmation: {\r\n shouldShowDialog: false,\r\n expectedSentTime: \"\",\r\n emailId: \"\"\r\n }\r\n}\r\n\r\nexport interface ISetEmailListAction extends Action {\r\n payload: IEmailListing;\r\n}\r\n\r\nexport interface IGetEmailListThunkPayload {\r\n pageAmount: number;\r\n pageNumber: number;\r\n filters: IEmailFilters;\r\n}\r\n\r\nexport const getDraftEmailList = createAsyncThunk(\r\n \"GET_DRAFT_EMAIL_POST_LIST\",\r\n async (payload: IGetEmailListThunkPayload, { dispatch }) => {\r\n try {\r\n const { data } = \r\n await emailsApi.getEmailList(payload.pageAmount, payload.pageNumber, {...payload.filters, status: EmailStatus.Draft});\r\n\r\n dispatch({ type: emailsSlice.actions.SET_DRAFT_EMAIL_LIST, payload: data});\r\n } catch (err) {\r\n throw err;\r\n }\r\n }\r\n);\r\n\r\nexport const getScheduledEmailList = createAsyncThunk(\r\n \"GET_SCHEDULED_EMAIL_POST_LIST\",\r\n async (payload: IGetEmailListThunkPayload, { dispatch }) => {\r\n try {\r\n const { data } = \r\n await emailsApi.getEmailList(payload.pageAmount, payload.pageNumber, {...payload.filters, status: EmailStatus.Scheduled});\r\n\r\n dispatch({ type: emailsSlice.actions.SET_SCHEDULED_EMAIL_LIST, payload: data});\r\n } catch (err) {\r\n throw err;\r\n }\r\n }\r\n);\r\n\r\nexport const getSentEmailList = createAsyncThunk(\r\n \"GET_SENT_EMAIL_POST_LIST\",\r\n async (payload: IGetEmailListThunkPayload, { dispatch }) => {\r\n try {\r\n const { data } = \r\n await emailsApi.getEmailList(payload.pageAmount, payload.pageNumber, {...payload.filters, status: EmailStatus.Sent});\r\n\r\n dispatch({ type: emailsSlice.actions.SET_SENT_EMAIL_LIST, payload: data});\r\n } catch (err) {\r\n throw err;\r\n }\r\n }\r\n);\r\n\r\nexport interface IGetEmailToEditThunkPayload {\r\n emailId: string;\r\n}\r\n\r\nexport interface ISetMessageThunkPayload {\r\n message: string;\r\n messageType: \"success\" | \"error\";\r\n}\r\n\r\nexport interface ICreateNewEmailThunkPayload {\r\n redirectUrl?: string;\r\n}\r\n\r\nexport interface IUpdateEmailEditorAction extends Action {\r\n payload: {\r\n email: Partial;\r\n changedSinceLastSaved?: boolean;\r\n };\r\n}\r\n\r\nexport interface IUpdateOrigninalEmailEditorAction extends Action {\r\n payload: {\r\n originalEmail: Partial;\r\n };\r\n}\r\n\r\nexport interface ISetEmailEditorAction extends Action {\r\n payload: {\r\n email: IEmail;\r\n };\r\n}\r\n\r\nexport interface IChangedSinceLastSavedEditorAction extends Action {\r\n payload: {\r\n changedSinceLastSaved: boolean;\r\n };\r\n}\r\n\r\nexport interface ISetEmailMessageAction extends Action {\r\n payload: {\r\n message: string;\r\n };\r\n}\r\n\r\nexport interface ISetShouldDownloadAction extends Action {\r\n payload: {\r\n shouldDownload: boolean;\r\n };\r\n}\r\n\r\nexport interface ISetShouldSendAction extends Action {\r\n payload: {\r\n shouldSend: boolean;\r\n };\r\n}\r\n\r\nexport interface ISetShouldOpenAction extends Action {\r\n payload: {\r\n shouldOpen: boolean;\r\n };\r\n}\r\n\r\nexport interface ISetShouldShowSentConfirmAction extends Action {\r\n payload: {\r\n sentConfirmation: IEmailSentConfirmation;\r\n };\r\n}\r\n\r\nexport interface ISetRedirectUrlAction extends Action {\r\n payload: {\r\n redirectUrl?: string;\r\n };\r\n}\r\n\r\nexport interface ISetTestEmailsAction extends Action {\r\n payload: {\r\n testEmails: string[];\r\n };\r\n}\r\n\r\nexport const getEmailToEdit = createAsyncThunk(\r\n \"GET_EMAIL_TO_EDIT\",\r\n async (payload: IGetEmailToEditThunkPayload, { dispatch }) => {\r\n try {\r\n const { data } = await emailsApi.getEmail(payload.emailId);\r\n\r\n dispatch({ type: emailsSlice.actions.SET_EMAIL_EDITOR, payload: { email: data }});\r\n } catch (err) {\r\n throw err;\r\n }\r\n }\r\n);\r\n\r\nexport const createNewEmail = createAsyncThunk(\r\n \"CREATE_NEW_EMAIL\",\r\n async (payload: ICreateNewEmailThunkPayload, { dispatch, getState }) => {\r\n try {\r\n const { data } = await emailsApi.createNewEmail(getState().emails.editor.email);\r\n\r\n dispatch({ type: emailsSlice.actions.SET_REDIRECT_URL, payload: { redirectUrl: payload.redirectUrl } });\r\n dispatch({ type: emailsSlice.actions.SET_EMAIL_EDITOR, payload: { email: data }});\r\n } catch (err) {\r\n throw err;\r\n }\r\n }\r\n);\r\n\r\nexport const saveExistingEmail = createAsyncThunk(\r\n \"SAVE_EXISTING_EMAIL\",\r\n async (payload: ICreateNewEmailThunkPayload, { dispatch, getState }) => {\r\n try {\r\n await emailsApi.saveExistingEmail(getState().emails.editor.email);\r\n\r\n dispatch({ type: emailsSlice.actions.SET_REDIRECT_URL, payload: { redirectUrl: payload.redirectUrl } });\r\n dispatch({ type: emailsSlice.actions.SET_CHANGED_SINCE_LAST_SAVED, payload: { changedSinceLastSaved: false } });\r\n dispatch({ type: emailsSlice.actions.SET_EMAIL_EDITOR, payload: { email: getState().emails.editor.email } });\r\n } catch (err) {\r\n throw err;\r\n }\r\n }\r\n);\r\n\r\nexport const emailsSlice = createSlice({\r\n name: \"emails\",\r\n initialState: DEFAULT_EMAILS_STATE,\r\n reducers: {\r\n SET_DRAFT_EMAIL_LIST: (state: IEmailsState, action: ISetEmailListAction) => {\r\n state.draftEmailsList = {\r\n ...action.payload,\r\n id: EmailStatus.Draft,\r\n isFetching: false\r\n }\r\n },\r\n SET_SCHEDULED_EMAIL_LIST: (state: IEmailsState, action: ISetEmailListAction) => {\r\n state.scheduledEmailsList = {\r\n ...action.payload,\r\n id: EmailStatus.Scheduled,\r\n isFetching: false\r\n }\r\n },\r\n SET_SENT_EMAIL_LIST: (state: IEmailsState, action: ISetEmailListAction) => {\r\n state.sentEmailsList = {\r\n ...action.payload,\r\n id: EmailStatus.Sent,\r\n isFetching: false\r\n }\r\n },\r\n UPDATE_EMAIL_EDITOR: (state: IEmailsState, action: IUpdateEmailEditorAction) => {\r\n state.editor.email = { ...state.editor.email, ...action.payload.email };\r\n state.editor.changedSinceLastSaved = action.payload.changedSinceLastSaved ?? state.editor.changedSinceLastSaved;\r\n },\r\n UPDATE_ORIGINAL_EMAIL_EDITOR: (state: IEmailsState, action: IUpdateOrigninalEmailEditorAction) => {\r\n state.editor.originalEmail = { ...state.editor.originalEmail, ...action.payload.originalEmail };\r\n },\r\n SET_EMAIL_EDITOR: (state: IEmailsState, action: ISetEmailEditorAction) => {\r\n state.editor.originalEmail = action.payload.email;\r\n state.editor.email = action.payload.email;\r\n state.editor.changedSinceLastSaved = false;\r\n },\r\n SET_SHOULD_DOWNLOAD_RECIPIENTS_LIST: (state: IEmailsState, action: ISetShouldDownloadAction) => {\r\n state.editor.shouldDownloadRecipientsList = action.payload.shouldDownload;\r\n },\r\n SET_SHOULD_SEND_TEST_EMAILS: (state: IEmailsState, action: ISetShouldSendAction) => {\r\n state.editor.shouldSendTestEmails = action.payload.shouldSend;\r\n },\r\n SET_TEST_EMAILS: (state: IEmailsState, action: ISetTestEmailsAction) => {\r\n state.editor.testEmails = action.payload.testEmails;\r\n },\r\n SET_SHOULD_OPEN_ONE_LAST_CHECK: (state: IEmailsState, action: ISetShouldOpenAction) => {\r\n state.editor.shouldOpenOneLastCheck = action.payload.shouldOpen;\r\n },\r\n SET_SHOW_SENT_CONFIRMATION: (state: IEmailsState, action: ISetShouldShowSentConfirmAction) => {\r\n state.sentConfirmation = action.payload.sentConfirmation;\r\n },\r\n SET_REDIRECT_URL: (state: IEmailsState, action: ISetRedirectUrlAction) => {\r\n state.redirectUrl = action.payload.redirectUrl;\r\n },\r\n SET_CHANGED_SINCE_LAST_SAVED: (state: IEmailsState, action: IChangedSinceLastSavedEditorAction) => {\r\n state.editor.changedSinceLastSaved = action.payload.changedSinceLastSaved;\r\n },\r\n },\r\n extraReducers: (builder) => {\r\n builder\r\n .addCase(getDraftEmailList.pending, (state: IEmailsState) => {\r\n state.draftEmailsList.isFetching = true;\r\n })\r\n .addCase(getDraftEmailList.fulfilled, (state: IEmailsState) => {\r\n state.draftEmailsList.isFetching = false;\r\n })\r\n .addCase(getDraftEmailList.rejected, (state: IEmailsState) => {\r\n state.draftEmailsList.isFetching = false;\r\n })\r\n .addCase(getScheduledEmailList.pending, (state: IEmailsState) => {\r\n state.scheduledEmailsList.isFetching = true;\r\n })\r\n .addCase(getScheduledEmailList.fulfilled, (state: IEmailsState) => {\r\n state.scheduledEmailsList.isFetching = false;\r\n })\r\n .addCase(getScheduledEmailList.rejected, (state: IEmailsState) => {\r\n state.scheduledEmailsList.isFetching = false;\r\n })\r\n .addCase(getSentEmailList.pending, (state: IEmailsState) => {\r\n state.sentEmailsList.isFetching = true;\r\n })\r\n .addCase(getSentEmailList.fulfilled, (state: IEmailsState) => {\r\n state.sentEmailsList.isFetching = false;\r\n })\r\n .addCase(getSentEmailList.rejected, (state: IEmailsState) => {\r\n state.sentEmailsList.isFetching = false;\r\n })\r\n .addCase(getEmailToEdit.pending, (state: IEmailsState) => {\r\n state.editor.isFetching = true;\r\n })\r\n .addCase(getEmailToEdit.fulfilled, (state: IEmailsState) => {\r\n state.editor.isFetching = false;\r\n })\r\n .addCase(getEmailToEdit.rejected, (state: IEmailsState) => {\r\n state.editor.isFetching = false;\r\n })\r\n .addMatcher(isAnyOf(createNewEmail.pending, saveExistingEmail.pending), (state: IEmailsState) => {\r\n state.editor.isSaving = true;\r\n })\r\n .addMatcher(isAnyOf(createNewEmail.fulfilled, saveExistingEmail.fulfilled), (state: IEmailsState) => {\r\n state.editor.isSaving = false;\r\n })\r\n .addMatcher(isAnyOf(createNewEmail.rejected, saveExistingEmail.rejected), (state: IEmailsState) => {\r\n state.editor.isSaving = false;\r\n });\r\n }\r\n});","import { AxiosPromise } from 'axios';\r\n\r\nexport class ApiRequest {\r\n private pending: boolean;\r\n private resolved: boolean;\r\n private rejected: boolean;\r\n private promise: AxiosPromise;\r\n\r\n constructor(promise: AxiosPromise) {\r\n this.pending = true;\r\n this.resolved = false;\r\n this.rejected = false;\r\n this.promise = promise;\r\n\r\n this.promise\r\n .then((p) => {\r\n this.pending = false;\r\n this.resolved = true;\r\n return p;\r\n })\r\n .catch((p) => {\r\n this.pending = false;\r\n this.rejected = true;\r\n return p;\r\n })\r\n }\r\n\r\n public isLoading = () => {\r\n return this.pending;\r\n }\r\n\r\n public then = (cb: (response: T) => any) => {\r\n return this.promise.then(req => cb(req.data))\r\n }\r\n\r\n public catch = (cb: (error: any) => any) => {\r\n return this.promise.catch(err => cb(err))\r\n }\r\n}\r\n","var React = require('react');\r\n\r\nfunction add_a_photo() {\r\n return \r\n}\r\nmodule.exports = add_a_photo;\r\n","var React = require('react');\r\n\r\nfunction check() {\r\n return \r\n}\r\nmodule.exports = check\r\n","var React = require('react');\r\n\r\nfunction close() {\r\n return \r\n}\r\nmodule.exports = close;","var React = require('react');\r\n\r\nfunction crop() {\r\n return \r\n}\r\nmodule.exports = crop\r\n","var React = require('react');\r\n\r\nfunction dragHandle() {\r\n return \r\n}\r\nmodule.exports = dragHandle;","var React = require('react');\r\n\r\nfunction mode_edit() {\r\n return \r\n}\r\nmodule.exports = mode_edit\r\n","var React = require('react');\r\n\r\nfunction more_vert() {\r\n return \r\n}\r\nmodule.exports = more_vert\r\n","var React = require('react');\r\n\r\nfunction person() {\r\n return \r\n}\r\nmodule.exports = person\r\n","var React = require('react');\r\n\r\nfunction show_chart() {\r\n return \r\n}\r\nmodule.exports = show_chart\r\n","var React = require('react');\r\n\r\nfunction insert_chart() {\r\n return \r\n}\r\nmodule.exports = insert_chart\r\n","var React = require('react');\r\n\r\nfunction cloud() {\r\n return \r\n}\r\nmodule.exports = cloud\r\n","var React = require('react');\r\n\r\nfunction check_box_outline_blank() {\r\n return \r\n}\r\nmodule.exports = check_box_outline_blank\r\n","var React = require('react');\r\n\r\nfunction check_box() {\r\n return \r\n}\r\nmodule.exports = check_box\r\n","var React = require('react');\r\n\r\nfunction devices() {\r\n return \r\n}\r\nmodule.exports = devices\r\n","var React = require('react');\r\n\r\nfunction comment() {\r\n return \r\n}\r\nmodule.exports = comment\r\n","var React = require('react');\r\n\r\nfunction pageview() {\r\n return \r\n}\r\nmodule.exports = pageview\r\n","var React = require('react');\r\n\r\nfunction info() {\r\n return \r\n}\r\nmodule.exports = info\r\n","var React = require('react');\r\n\r\nfunction rss_feed() {\r\n return \r\n}\r\nmodule.exports = rss_feed\r\n","import { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as Actions from './actions';\r\n\r\nimport API from \"api\";\r\nimport XhrUpload from \"utils/xhrUpload\";\r\nimport MsalAuthModule from \"authentication/msalAuthModule\";\r\n\r\nimport { AttachedFile, Image as ImageV1 } from \"modules/gallery/models\";\r\nimport { SortStyle } from \"utils/managementUtils\";\r\n\r\nexport const getDocument = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetDocument({}));\r\n return dispatch(API.mediaLibrary.FetchDocumentForId((id)))\r\n .then(response => response.json())\r\n .then(file => {\r\n dispatch(Actions.GetDocumentComplete({ succeeded: true }));\r\n const image: AttachedFile = {\r\n blobId: file.id,\r\n fileExtension: \"\",\r\n fileName: file.name,\r\n fileType: \"application\",\r\n fileUrl: file.url,\r\n ospreyId: file.id\r\n };\r\n return image;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetDocumentComplete({ succeeded: false }));\r\n return;\r\n });\r\n}\r\n\r\n\r\nexport const getDocumentGallery = (pageNumber: number, text?: string, sort?: SortStyle) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetDocumentGallery({}));\r\n return dispatch(API.documents.GetDocumentGallery(pageNumber, text, sort))\r\n .then(response => response.json())\r\n .then(documentGalleryPage => dispatch(Actions.GetDocumentGalleryComplete({ ...documentGalleryPage, succeeded: true })))\r\n .catch(err => dispatch(Actions.GetDocumentGalleryComplete({ currentPage: 1, documents: [], totalDocuments: 0, totalPages: 0, succeeded: false, err })));\r\n}\r\n\r\n\r\nconst getFirstGifFrame = (gif: File): Promise => {\r\n return new Promise((resolve, reject) => {\r\n const canvas = document.createElement(\"canvas\");\r\n const img = new Image();\r\n img.onload = function () {\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n let context = canvas.getContext(\"2d\")!;\r\n context.drawImage(img, 0, 0, img.width, img.height);\r\n canvas.toBlob((newBlob: any) => {\r\n newBlob.lastModifiedDate = new Date();\r\n newBlob.name = gif.name;\r\n return resolve(newBlob as File);\r\n });\r\n }\r\n img.src = URL.createObjectURL(gif);\r\n });\r\n}\r\n\r\n\r\nexport const getImage = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetImage({}));\r\n return dispatch(API.mediaLibrary.FetchImageForId(id))\r\n .then(response => response.json())\r\n .then(file => {\r\n dispatch(Actions.GetImageComplete({ succeeded: true }));\r\n const image: AttachedFile = {\r\n blobId: file.id,\r\n fileExtension: \"\",\r\n fileName: file.name,\r\n fileType: !!file.videoId ? \"video\" : \"image\",\r\n fileUrl: file.url,\r\n ospreyId: file.id\r\n };\r\n return image;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetImageComplete({ succeeded: false }));\r\n return;\r\n });\r\n}\r\n\r\n\r\nexport const getImageGallery = (pageNumber: number = 1, includeVideos: boolean = false) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetImageGallery({}));\r\n return dispatch(API.mediaLibrary.GetImageGallery(pageNumber, includeVideos))\r\n .then(response => response.json())\r\n .then(imageGalleryPage => dispatch(Actions.GetImageGalleryComplete({ ...imageGalleryPage, succeeded: true })))\r\n .catch(err => dispatch(Actions.GetImageGalleryComplete({ currentPage: 1, images: [], totalImages: 0, totalPages: 0, succeeded: false, err })));\r\n}\r\n\r\nexport const getVideo = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetVideo({}));\r\n return dispatch(API.mediaLibrary.FetchVideoForId(id))\r\n .then(response => response.json())\r\n .then(url => {\r\n dispatch(Actions.GetVideoComplete({ succeeded: true }));\r\n return url;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetVideoComplete({ succeeded: false }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getVideosComplete = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.GetVideosComplete({}));\r\n}\r\n\r\n\r\n\r\nexport const uploadDocument = (file: File, onProgress: (percentCompleted: number) => void, onLoad?: (e) => void, onError?: (e) => void, onAbort?: (e) => void) => async (dispatch, getState) => {\r\n dispatch(Actions.UploadDocument({}));\r\n return MsalAuthModule.getInstance().getAccessToken().then(accessToken => {\r\n const requestDetails = API.documents.UploadAttachedFile(file);\r\n const url = getState().config.SparrowClientApiUrl + requestDetails.url\r\n .replace(\"{tenant}\", getState().tenant.id);\r\n\r\n const handlers = { onLoad, onAbort, onError, onProgress };\r\n\r\n return new XhrUpload(url, requestDetails, handlers)\r\n .authenticateWith(accessToken)\r\n .upload();\r\n })\r\n .then((response: string) => {\r\n let document = JSON.parse(response);\r\n dispatch(Actions.UploadDocumentComplete({ succeeded: true }));\r\n return document;\r\n });\r\n}\r\n\r\n/*\r\n * In the upload image case we cant use the default fetch implementation,\r\n * we have to resort to xhr; hence we need to call the authmanager ourselves.\r\n * This however lets us attach an onProgress event listener.\r\n * This xhr request could have been abstracted in the middleware, but we would lose\r\n * the onProgress event when we dispatch the network request.\r\n */\r\nexport const uploadImage = (image: File, onProgress: (percentCompleted: number) => void, onLoad?: (e) => void, onError?: (e) => void, onAbort?: (e) => void) => async (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n if (!(((((((((((((((((((((((((((((((((((((((((/^image\\/(jpg|jpeg|png|bmp)/))))))))))))))))))))))))))))))))))))))))).test(image.type)) {\r\n Actions.UploadImageComplete({ succeeded: false });\r\n return Promise.resolve(\"\");\r\n }\r\n\r\n dispatch(Actions.UploadImage({}));\r\n\r\n const fileToUpload = image.type === \"image/gif\" ? await getFirstGifFrame(image) : image;\r\n\r\n return MsalAuthModule.getInstance().getAccessToken().then(accessToken => {\r\n\r\n const requestDetails = API.mediaLibrary.UploadImage(fileToUpload);\r\n const url = getState().config.SparrowClientApiUrl + requestDetails.url\r\n .replace(\"{tenant}\", getState().tenant.id);\r\n\r\n const handlers = { onLoad, onAbort, onError, onProgress };\r\n\r\n return new XhrUpload(url, requestDetails, handlers)\r\n .authenticateWith(accessToken)\r\n .upload();\r\n\r\n }).then((response: string) => {\r\n let image = JSON.parse(response) as { imageId: string, fileName: string };\r\n dispatch(Actions.UploadImageComplete({ succeeded: true }));\r\n return image.imageId;\r\n });\r\n}\r\n\r\nexport const uploadThumbImage = (blob: Blob, videoId: string, onProgress: (percentCompleted: number) => void, onLoad?: (e) => void, onError?: (e) => void, onAbort?: (e) => void) => (dispatch, getState: () => GlobalApplicationState) => {\r\n return MsalAuthModule.getInstance().getAccessToken()\r\n .then((accessToken) => {\r\n let requestDetails = API.mediaLibrary.VideoUploads.UploadImageThumbnail(blob, videoId);\r\n let url = getState().config.SparrowClientApiUrl + requestDetails.url\r\n .replace('{tenant}', getState().tenant.id);\r\n\r\n let handlers = {\r\n onProgress,\r\n onLoad,\r\n onError,\r\n onAbort\r\n };\r\n return new XhrUpload(url, requestDetails, handlers)\r\n .authenticateWith(accessToken)\r\n .upload();\r\n })\r\n .then((response: string) => {\r\n let resultingThumb = JSON.parse(response) as { id: string, url: string, thumbnail: ImageV1 }\r\n return resultingThumb;\r\n });\r\n}\r\n","var React = require('react');\r\n\r\nfunction sort() {\r\n return \r\n}\r\nmodule.exports = sort\r\n","var React = require('react');\r\n\r\nfunction access_time() {\r\n return \r\n}\r\nmodule.exports = access_time\r\n","var React = require('react');\r\n\r\nfunction deleteIcon() {\r\n return \r\n}\r\nmodule.exports = deleteIcon\r\n","var React = require('react');\r\n\r\nfunction lock() {\r\n return \r\n}\r\nmodule.exports = lock\r\n","import { NetworkRequest } from \"network/actions\";\r\n\r\nexport interface Handlers {\r\n onLoad?: (e: ProgressEvent, xhr: XMLHttpRequest) => void,\r\n onError?: (e: ProgressEvent, xhr: XMLHttpRequest) => void,\r\n onAbort?: (e: ProgressEvent, xhr: XMLHttpRequest) => void,\r\n onProgress?: (progress: number) => void,\r\n}\r\n\r\nclass XhrUpload {\r\n private url: string;\r\n private requestDetails: NetworkRequest;\r\n private xhr: XMLHttpRequest;\r\n private accessToken;\r\n private calculatePercentage: () => void;\r\n\r\n /* Expect these to be overriden */\r\n private onLoad?: (e: ProgressEvent, xhr: XMLHttpRequest) => void;\r\n private onError?: (e: ProgressEvent, xhr: XMLHttpRequest) => void;\r\n private onAbort?: (e: ProgressEvent, xhr: XMLHttpRequest) => void;\r\n private onProgress?: (progress: number) => void;\r\n\r\n /**\r\n * Use this class to upload files and hook into progress / error / loaded events\r\n * \r\n * @param url the url to upload to\r\n * @param requestDetails a network request object defining request properties (including the file to upload)\r\n * @param handlers an object containing onLoad, onError, onAbort, and onProgress handlers\r\n */\r\n constructor(url: string, requestDetails: NetworkRequest, handlers?: Handlers) {\r\n this.url = url;\r\n this.requestDetails = requestDetails;\r\n this.xhr = new XMLHttpRequest();\r\n\r\n if (handlers) {\r\n this.onLoad = handlers.onLoad;\r\n this.onError = handlers.onError;\r\n this.onAbort = handlers.onAbort;\r\n this.onProgress = handlers.onProgress;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * authenticate the upload with an access token\r\n */\r\n public authenticateWith = (accessToken: string) => {\r\n this.accessToken = accessToken;\r\n return this;\r\n }\r\n\r\n /**\r\n * begin the upload process and return a promise.\r\n */\r\n public upload = () => {\r\n return new Promise((res, rej) => {\r\n // set headers\r\n this.xhr.open(this.requestDetails.method, this.url);\r\n for (let k in this.requestDetails.headers) {\r\n this.xhr.setRequestHeader(k, this.requestDetails.headers[k]);\r\n }\r\n if (this.accessToken)\r\n this.xhr.setRequestHeader(\"Authorization\", `Bearer ${this.accessToken}`);\r\n\r\n // override callbacks\r\n this.xhr.onload = e => {\r\n if (this.onLoad)\r\n this.onLoad(e, this.xhr);\r\n res(this.xhr.responseText);\r\n };\r\n this.xhr.onerror = e => {\r\n if (this.onError)\r\n this.onError(e, this.xhr);\r\n rej(e);\r\n };\r\n this.xhr.onabort = e => {\r\n if (this.onAbort)\r\n this.onAbort(e, this.xhr);\r\n rej(e);\r\n };\r\n this.xhr.upload.addEventListener(\"progress\", e => {\r\n if (this.onProgress)\r\n this.onProgress((e.loaded / e.total) * 100 | 5);\r\n });\r\n\r\n // send the request\r\n this.xhr.send(this.requestDetails.body);\r\n });\r\n }\r\n}\r\n\r\nexport default XhrUpload;\r\n","import { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as Actions from \"./actions\";\r\nimport * as EventsActions from \"modules/events/actions\";\r\nimport * as PostsActions from \"modules/posts/actions\";\r\nimport * as SettingsActions from \"modules/settings/actions\";\r\nimport API from \"api\";\r\n\r\nimport { CurrentUserSettings } from \"modules/settings/models\";\r\n\r\n\r\nexport const initializeUserSettings = (userSettings: CurrentUserSettings) => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.InitializeUserSettings({ userSettings }));\r\n}\r\n\r\nexport const saveUserSettings = (userSettings: Partial, shouldDispatchUpdates: boolean = true) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n const updatedUserSettings: CurrentUserSettings = { ...getState().profile.userSettings!, ...userSettings };\r\n\r\n dispatch(Actions.UpdateUserSettings({ userSettings }));\r\n dispatch(Actions.SaveUserSettings({}));\r\n return dispatch(API.profile.SaveUserSettings(updatedUserSettings))\r\n .then((response: Response) => {\r\n dispatch(Actions.SaveUserSettingsComplete({ succeeded: response.status === 200 }));\r\n if (shouldDispatchUpdates) {\r\n response\r\n .json()\r\n .then((userSettings: Partial) => {\r\n dispatch(SettingsActions.UpdateUserSettings({ userSettings }));\r\n dispatch(EventsActions.ClearEventFeed({}));\r\n dispatch(EventsActions.ClearEventFeedFilters({}));\r\n dispatch(PostsActions.ClearPostFeed({}));\r\n dispatch(PostsActions.ClearPostFeedFilters({}));\r\n });\r\n }\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SaveUserSettingsComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const sendSMSVerifyRequest = () => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.SendSMSVerify({}));\r\n return dispatch(API.profile.SendSMSVerify())\r\n .then(response => {\r\n dispatch(Actions.SendSMSVerifyComplete({ succeeded: response.status === 200 }))\r\n return response.status === 200;\r\n })\r\n .catch (err => {\r\n dispatch(Actions.SendSMSVerifyComplete({ succeeded: false, err }));\r\n return false; \r\n })\r\n}\r\n\r\nexport const clearErrorMessage = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ClearErrorMessage({}));\r\n}","import React from \"react\";\r\n\r\nimport CircularProgress from \"@mui/material/CircularProgress\";\r\n\r\n\r\ninterface ComponentProps {\r\n size: number | string;\r\n style?: React.CSSProperties;\r\n}\r\n\r\nconst LoadingCircle: React.FunctionComponent = props => {\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport default LoadingCircle;\r\n","import { CustomFileData, MediaFile, Image } from \"./models\"\r\n\r\nexport const ROOT_FOLDER_ID = 'rootFolder';\r\n\r\nexport const asChonkyFileData = (images: Image[], folders: MediaFile[]): CustomFileData[] => {\r\n let resultList = [] as CustomFileData[];\r\n\r\n if (folders.length)\r\n resultList.push(\r\n ...folders.map(x => {\r\n const childrenIdArrays = Object.values(x.childrenIds);\r\n const mergedChildrenIds = ([] as string[]).concat(...childrenIdArrays);\r\n \r\n return {\r\n id: x.id,\r\n isDir: true,\r\n name: x.name,\r\n parentId: x.parentId,\r\n childrenIds: mergedChildrenIds,\r\n modDate: x.updatedTime?.date ?? x.createdTime.date,\r\n };\r\n })\r\n );\r\n \r\n if (images.length)\r\n resultList.push(\r\n ...images.map(x => {\r\n return {\r\n id: x.id,\r\n isDir: false,\r\n name: x.name,\r\n parentId: x.parentId,\r\n thumbnailUrl: x.url,\r\n modDate: x.updatedTime?.date ?? x.createdTime.date,\r\n size: x.fileSize,\r\n };\r\n })\r\n );\r\n\r\n return resultList;\r\n}\r\n\r\nexport const asChonkyFileMap = (mediaFiles: CustomFileData[], currDir?: MediaFile): Record => {\r\n let fileMap = mediaFiles.length ? Object.fromEntries(mediaFiles.map(x => [x.id, x])) : {};\r\n\r\n if (currDir) {\r\n let currDirChildIds = new Set(currDir.childrenIds);\r\n\r\n fileMap[currDir.id] = {\r\n id: currDir.id,\r\n name: currDir.name,\r\n // map out the correct ordering of the files using mediaFiles\r\n childrenIds: mediaFiles.filter(x => currDirChildIds.has(x.id)).map(x => x.id)\r\n };\r\n }\r\n\r\n fileMap[ROOT_FOLDER_ID] = {\r\n id: ROOT_FOLDER_ID,\r\n name: \"Media Gallery\",\r\n childrenIds: currDir ? [] : Object.values(fileMap).filter(x => !x.parentId)?.map(x => x.id),\r\n isDir: true,\r\n }\r\n\r\n return fileMap;\r\n}\r\n\r\nexport const imageExtFromMimeType = (mimeType?: string): string => {\r\n let imageExt = \"\";\r\n\r\n if (mimeType === \"image/jpg\" || mimeType === \"image/jpeg\") {\r\n imageExt = \".jpg\";\r\n }\r\n else if (mimeType === \"image/png\") {\r\n imageExt = \".png\";\r\n }\r\n\r\n return imageExt;\r\n}","import { AxiosError } from \"axios\";\r\nimport { ShortcutGroupToShortcuts, ShortcutUpdateModelv1, ShortcutsFilterv1, ShortcutsState, defaultShortcutsFilter } from \"./models\";\r\nimport { createAsyncThunk, createSlice, isFulfilled, isPending, isRejected, PayloadAction } from \"@reduxjs/toolkit\";\r\nimport { shortcutsApi } from \"api/instances\";\r\n\r\nconst defaultState: ShortcutsState = {\r\n filteredShortcutFormat: [],\r\n originalShortcutFormat: [],\r\n shortcutFeed: [],\r\n isLoadingOriginalShortcutFormat: false,\r\n isFetching: false,\r\n isUpdating: false,\r\n successMessage: \"\",\r\n errorMessage: \"\",\r\n scrollToRowId: undefined,\r\n};\r\n\r\ninterface ISetMsgAction {\r\n payload: string | undefined;\r\n}\r\n\r\ninterface ISetScrollToRowIdAction {\r\n payload: string | undefined;\r\n}\r\n\r\nconst handleError = (err: AxiosError, thunkApi) => {\r\n if (!err.isAxiosError) throw err;\r\n\r\n if (err.response?.status !== 200) {\r\n thunkApi.dispatch({ type: SET_ERR_MSG , payload: \"There was an error. Please try again later.\" });\r\n }\r\n}\r\n\r\nconst handleSuccess = (thunkApi, successMsg?: string) => {\r\n thunkApi.dispatch(SET_SUCCESS_MSG(successMsg));\r\n}\r\n\r\nexport const getShortcutFormat = createAsyncThunk(\r\n \"GET_SHORTCUT_FORMAT\",\r\n async (filter?: ShortcutsFilterv1) => {\r\n try {\r\n return await shortcutsApi.getShortcutsFormat(filter ?? defaultShortcutsFilter);\r\n }\r\n catch (err) {\r\n throw err;\r\n }\r\n }\r\n);\r\n\r\nexport const getOriginalShortcutFormat = createAsyncThunk(\r\n \"GET_ORIGINAL_SHORTCUT_FORMAT\",\r\n async _ => {\r\n try {\r\n return await shortcutsApi.getShortcutsFormat(defaultShortcutsFilter);\r\n }\r\n catch(err) {\r\n throw err;\r\n }\r\n }\r\n);\r\n\r\nexport const getShortcutGroups = createAsyncThunk(\r\n \"GET_SHORTCUT_GROUPS\",\r\n async (searchText: string) => {\r\n try {\r\n await shortcutsApi.getShortcutGroups(searchText);\r\n }\r\n catch(err) {\r\n throw err;\r\n }\r\n }\r\n)\r\n\r\nexport const createShortcut = createAsyncThunk(\r\n \"CREATE_SHORTCUT\", \r\n async (payload: {shortcutUpdateModel: ShortcutUpdateModelv1, filter: ShortcutsFilterv1, scrollToId?: string, successMsg?: string}, thunkApi) => {\r\n await shortcutsApi.createNewShortcut(payload.shortcutUpdateModel)\r\n .then(() => handleSuccess(thunkApi, payload.successMsg))\r\n .catch((err: AxiosError) => {\r\n handleError(err, thunkApi);\r\n throw err;\r\n });\r\n\r\n thunkApi.dispatch(getShortcutFormat(payload.filter));\r\n thunkApi.dispatch(getOriginalShortcutFormat());\r\n thunkApi.dispatch(SET_SCROLL_TO_ROW_ID(payload.scrollToId));\r\n }\r\n);\r\n\r\nexport const createShortcutGroup = createAsyncThunk(\r\n \"CREATE_SHORTCUT_GROUP\", \r\n async (payload: {shortcutGroupName: string, filter: ShortcutsFilterv1, scrollToId?: string, successMsg?: string}, thunkApi) => {\r\n await shortcutsApi.createNewShortcutGroup(payload.shortcutGroupName)\r\n .catch((err: AxiosError) => {\r\n handleError(err, thunkApi);\r\n throw err;\r\n });\r\n\r\n handleSuccess(thunkApi, payload.successMsg);\r\n\r\n thunkApi.dispatch(getShortcutFormat(payload.filter));\r\n thunkApi.dispatch(getOriginalShortcutFormat());\r\n thunkApi.dispatch(SET_SCROLL_TO_ROW_ID(payload.scrollToId));\r\n }\r\n);\r\n\r\ninterface IUpdateShortcutPayload {\r\n shortcutId: string;\r\n shortcutUpdateModel: ShortcutUpdateModelv1;\r\n filter: ShortcutsFilterv1;\r\n successMsg?: string;\r\n}\r\n\r\nexport const updateShortcut = createAsyncThunk(\r\n \"UPDATE_SHORTCUT\", \r\n async ({ shortcutId, shortcutUpdateModel, filter, successMsg }: IUpdateShortcutPayload, thunkApi) => {\r\n await shortcutsApi.updateShortcut(shortcutId, shortcutUpdateModel)\r\n .then(() => handleSuccess(thunkApi, successMsg))\r\n .catch((err: AxiosError) => {\r\n handleError(err, thunkApi);\r\n throw err;\r\n });\r\n \r\n thunkApi.dispatch(getShortcutFormat(filter));\r\n }\r\n);\r\n\r\ninterface IUpdateShortcutGroupPayload {\r\n shortcutGroupId: string;\r\n name: string;\r\n filter: ShortcutsFilterv1,\r\n successMsg?: string;\r\n}\r\n\r\nexport const updateShortcutGroup = createAsyncThunk(\r\n \"UPDATE_SHORTCUT_GROUP\", \r\n async ({ shortcutGroupId, name, filter, successMsg }: IUpdateShortcutGroupPayload, thunkApi) => {\r\n await shortcutsApi.updateShortcutGroupName(shortcutGroupId, name)\r\n .catch((err: AxiosError) => {\r\n handleError(err, thunkApi);\r\n throw err;\r\n });\r\n\r\n handleSuccess(thunkApi, successMsg);\r\n\r\n thunkApi.dispatch(getShortcutFormat(filter));\r\n }\r\n);\r\n\r\nexport const bulkDeleteShortcutsAndGroups = createAsyncThunk(\r\n \"DELETE_SHORTCUTS_AND_GROUPS\", \r\n async (payload: {shortcutIds: string[], shortcutGroupIds: string[], filter: ShortcutsFilterv1, successMsg?: string}, thunkApi) => {\r\n if (payload.shortcutIds.length)\r\n await shortcutsApi.bulkDeleteShortcuts(payload.shortcutIds)\r\n .catch((err: AxiosError) => {\r\n handleError(err, thunkApi);\r\n throw err;\r\n });\r\n\r\n if (payload.shortcutGroupIds.length)\r\n await shortcutsApi.bulkDeleteShortcutGroups(payload.shortcutGroupIds)\r\n .catch((err: AxiosError) => {\r\n handleError(err, thunkApi);\r\n throw err;\r\n });\r\n\r\n handleSuccess(thunkApi, payload.successMsg);\r\n thunkApi.dispatch(getShortcutFormat(payload.filter));\r\n thunkApi.dispatch(getOriginalShortcutFormat());\r\n }\r\n);\r\n\r\nexport const bulkDeleteShortcuts = createAsyncThunk(\r\n \"DELETE_SHORTCUTS\", \r\n async (payload: {shortcutIds: string[], filter: ShortcutsFilterv1}, thunkApi) => {\r\n await shortcutsApi.bulkDeleteShortcuts(payload.shortcutIds)\r\n .catch((err: AxiosError) => {\r\n handleError(err, thunkApi);\r\n throw err;\r\n });\r\n\r\n thunkApi.dispatch(getShortcutFormat(payload.filter));\r\n thunkApi.dispatch(getOriginalShortcutFormat());\r\n }\r\n);\r\n\r\nexport const bulkDeleteShortcutGroups = createAsyncThunk(\r\n \"DELETE_SHORTCUT_GROUPS\", \r\n async (payload: {shortcutGroupIds: string[], filter: ShortcutsFilterv1}, thunkApi) => {\r\n await shortcutsApi.bulkDeleteShortcutGroups(payload.shortcutGroupIds)\r\n .catch((err: AxiosError) => {\r\n handleError(err, thunkApi);\r\n throw err;\r\n });\r\n\r\n thunkApi.dispatch(getShortcutFormat(payload.filter));\r\n thunkApi.dispatch(getOriginalShortcutFormat());\r\n }\r\n);\r\n\r\ninterface IBulkUpdateShortcutsPayload {\r\n shortcutIds: string[];\r\n setIsEnabled?: boolean;\r\n groupIdToMoveTo?: string;\r\n filter: ShortcutsFilterv1;\r\n scrollToId?: string;\r\n successMsg?: string;\r\n}\r\n\r\nexport const bulkUpdateShortcuts = createAsyncThunk(\r\n \"BULK_UPDATE_SHORTCUTS\",\r\n async ({shortcutIds, setIsEnabled, groupIdToMoveTo, filter, scrollToId, successMsg}: IBulkUpdateShortcutsPayload, thunkApi) => {\r\n await shortcutsApi.bulkUpdateShortcuts(shortcutIds, setIsEnabled, groupIdToMoveTo)\r\n .then(() => handleSuccess(thunkApi, successMsg))\r\n .catch((err: AxiosError) => {\r\n handleError(err, thunkApi);\r\n throw err;\r\n });\r\n\r\n thunkApi.dispatch(getShortcutFormat(filter));\r\n\r\n thunkApi.dispatch(SET_SCROLL_TO_ROW_ID(scrollToId));\r\n }\r\n)\r\n\r\nexport const updateShortcutsFormat = createAsyncThunk(\r\n \"UPDATE_SHORTCUTS_FORMAT\",\r\n async (payload: {newFormat: ShortcutGroupToShortcuts[], filter: ShortcutsFilterv1, successMsg?: string}, thunkApi) => {\r\n await shortcutsApi.updateShortcutsFormat(payload.newFormat)\r\n .then(() => handleSuccess(thunkApi, payload.successMsg))\r\n .catch((err: AxiosError) => {\r\n handleError(err, thunkApi);\r\n throw err;\r\n });\r\n\r\n thunkApi.dispatch(getShortcutFormat(payload.filter));\r\n thunkApi.dispatch(getOriginalShortcutFormat());\r\n }\r\n)\r\n\r\nexport const getShortcutsFeed = createAsyncThunk(\r\n \"GET_SHORTCUTS_FEED_LIST\",\r\n async _ => {\r\n try {\r\n return await shortcutsApi.getClientShortcutsList();\r\n }\r\n catch(err) {\r\n throw err;\r\n }\r\n }\r\n)\r\n\r\nconst pendingUpdateMatcher = isPending(\r\n updateShortcut,\r\n updateShortcutGroup,\r\n bulkUpdateShortcuts,\r\n updateShortcutsFormat,\r\n bulkDeleteShortcutsAndGroups\r\n);\r\n\r\nconst fulfilledUpdateMatcher = isFulfilled(\r\n updateShortcut,\r\n updateShortcutGroup,\r\n bulkUpdateShortcuts,\r\n updateShortcutsFormat,\r\n bulkDeleteShortcutsAndGroups\r\n);\r\n\r\nconst rejectedUpdateMatcher = isRejected(\r\n updateShortcut,\r\n updateShortcutGroup,\r\n bulkUpdateShortcuts,\r\n updateShortcutsFormat,\r\n bulkDeleteShortcutsAndGroups\r\n);\r\n\r\nconst pendingFetchMatcher = isPending(\r\n getShortcutFormat,\r\n getShortcutsFeed\r\n)\r\n\r\nconst rejectedFetchMatcher = isRejected(\r\n getShortcutFormat,\r\n getShortcutsFeed\r\n)\r\n\r\nexport const shortcutsSlice = createSlice({\r\n name: \"shortcuts\",\r\n initialState: defaultState,\r\n reducers: {\r\n SET_ERR_MSG: (state: ShortcutsState, action: ISetMsgAction) => {\r\n state.errorMessage = action.payload;\r\n },\r\n SET_SUCCESS_MSG: (state: ShortcutsState, action: ISetMsgAction) => {\r\n state.successMessage = action.payload;\r\n },\r\n SET_SCROLL_TO_ROW_ID: (state: ShortcutsState, action: ISetScrollToRowIdAction) => {\r\n state.scrollToRowId = action.payload;\r\n }\r\n },\r\n extraReducers: (builder) => builder\r\n .addCase(getShortcutFormat.fulfilled, (state, action: PayloadAction) => { \r\n state.isFetching = false;\r\n state.filteredShortcutFormat = action.payload;\r\n })\r\n .addCase(getShortcutsFeed.fulfilled, (state, action: PayloadAction) => { \r\n state.isFetching = false;\r\n state.shortcutFeed = action.payload;\r\n })\r\n .addCase(getOriginalShortcutFormat.fulfilled, (state, action: PayloadAction) => {\r\n state.isLoadingOriginalShortcutFormat = false;\r\n state.originalShortcutFormat = action.payload;\r\n })\r\n .addCase(getOriginalShortcutFormat.pending, state => { state.isLoadingOriginalShortcutFormat = true })\r\n .addCase(getOriginalShortcutFormat.rejected, state => { state.isLoadingOriginalShortcutFormat = false })\r\n .addMatcher(pendingFetchMatcher, state => { state.isFetching = true })\r\n .addMatcher(rejectedFetchMatcher, state => { state.isFetching = false })\r\n .addMatcher(pendingUpdateMatcher, state => { state.isUpdating = true })\r\n .addMatcher(fulfilledUpdateMatcher, state => {\r\n state.isUpdating = false;\r\n if (state.errorMessage !== \"\") state.errorMessage = \"\";\r\n })\r\n .addMatcher(rejectedUpdateMatcher, state => {\r\n state.isUpdating = false;\r\n if (state.successMessage !== \"\") state.successMessage = \"\";\r\n })\r\n});\r\n\r\nexport const { SET_SCROLL_TO_ROW_ID, SET_ERR_MSG, SET_SUCCESS_MSG } = shortcutsSlice.actions;","export type AudienceState = \"disabled\" | \"enabled\";\r\nexport type AudienceType = \"smart\" | \"standard\";\r\nexport type RuleApplicability = \"all\" | \"any\";\r\nexport type RuleComparator = \"contains\" | \"equals\" | \"notContains\" | \"notEquals\" | \"equalToAny\";\r\nexport const RuleComparatorOptions = {\r\n contains: \"contains\",\r\n equals: \"equals\",\r\n notContains: \"notContains\",\r\n notEquals: \"notEquals\",\r\n equalToAny: \"equalToAny\"\r\n}\r\n\r\nexport interface AudiencesState {\r\n audiences: Audience[];\r\n all: AudiencePage;\r\n enabled: AudiencePage;\r\n disabled: AudiencePage;\r\n changedSinceSaved: boolean;\r\n errorMessage: string;\r\n isDeleting: boolean;\r\n isFetching: boolean;\r\n isInitialLoad: boolean;\r\n isSaving: boolean;\r\n isUploading: boolean;\r\n shouldFetch: boolean;\r\n }\r\n\r\nexport interface Audience {\r\n id: string\r\n displayName: string\r\n description: string\r\n enabled: boolean\r\n type: string\r\n}\r\n\r\nexport interface AudienceDetails {\r\n id: string;\r\n audienceType: AudienceType;\r\n description: string;\r\n includedGroups: AudienceGroup[];\r\n includedUsers: AudienceUser[];\r\n includedInvites: AudienceInvite[];\r\n isEnabled: boolean;\r\n isReadOnly: boolean;\r\n ruleApplicability: RuleApplicability;\r\n rules: Rule[];\r\n title: string;\r\n totalGroups: number;\r\n totalIndividualUsers: number;\r\n totalUsers: number;\r\n totalInvites: number;\r\n}\r\n\r\nexport interface AudienceGroup {\r\n groupId: string;\r\n name: string;\r\n}\r\n\r\nexport interface AudienceItem {\r\n audienceType: AudienceType;\r\n description: string;\r\n id: string;\r\n internalUsers: number;\r\n isReadOnly: boolean;\r\n socialUsers: number;\r\n sparrowUsers: number;\r\n invitedUsers: number;\r\n state: \"disabled\" | \"enabled\";\r\n title: string;\r\n totalUsers: number;\r\n}\r\n\r\nexport interface AudienceFilterValues {\r\n audienceTypes: AudienceType[];\r\n textToSearch: string;\r\n maxResults: number;\r\n audienceId: string;\r\n}\r\n\r\nexport interface AudiencePage {\r\n audiences: AudienceItem[];\r\n currentPage: number;\r\n totalAudiences: number;\r\n totalPages: number;\r\n isFetching?: boolean;\r\n}\r\n\r\nexport interface AudienceUser {\r\n userId: string;\r\n email: string;\r\n name: string;\r\n}\r\n\r\nexport interface AudienceInvite {\r\n inviteId: string;\r\n email: string;\r\n}\r\n\r\nexport interface DraftAudience {\r\n audienceType: AudienceType;\r\n description: string;\r\n emails: string[];\r\n groups: AudienceGroup[];\r\n isEnabled: boolean;\r\n ruleApplicability: RuleApplicability;\r\n rules: Rule[];\r\n title: string;\r\n users: AudienceUser[];\r\n invites: AudienceInvite[];\r\n}\r\n\r\nexport interface EmailValidation {\r\n validEmailCount: number;\r\n invalidEmailCount: number;\r\n}\r\n\r\nexport interface Rule {\r\n comparator: RuleComparator;\r\n key: string;\r\n value: string;\r\n valueCollection?: string[];\r\n}\r\n\r\nexport interface UpdateAudience {\r\n displayName: string\r\n description: string\r\n enabled: boolean\r\n includedUsers: UserSuggestions[]\r\n includedGroups: GroupSuggestions[]\r\n readOnly: boolean\r\n bulkUploadUsers: string[]\r\n}\r\n\r\nexport interface UserSuggestions {\r\n Id: string\r\n Details: { firstName: string, lastName: string, email: string }\r\n}\r\n\r\nexport interface AudienceUserSuggestionsV2 {\r\n id: string\r\n name: string\r\n email: string\r\n isIncluded: boolean\r\n}\r\n\r\nexport interface AudienceInviteSuggestions {\r\n id: string\r\n email: string\r\n isIncluded: boolean\r\n}\r\n\r\nexport interface GroupSuggestions {\r\n id: string\r\n name: string\r\n disabled: boolean\r\n isIncluded: boolean\r\n}\r\n\r\nexport interface GroupSuggestionsV1 {\r\n Id: string;\r\n Name: string;\r\n Disabled: boolean;\r\n}\r\n\r\nexport interface AudienceSuggestions {\r\n Id: string\r\n DisplayName: string\r\n Enabled: boolean\r\n}\r\n\r\nexport interface UpdateEveryoneAudience {\r\n displayName: string\r\n description: string\r\n enabled: boolean\r\n includedGroups: AdGroupSuggestions[]\r\n}\r\n\r\nexport interface AdGroupSuggestions {\r\n id: string\r\n displayName: string\r\n referenceId: string\r\n syncStatus: GroupSyncStatus\r\n}\r\n\r\nexport interface GroupGraphSuggestions {\r\n group: Group\r\n Disabled: boolean\r\n}\r\nexport interface Group {\r\n id: string\r\n displayName: string\r\n memberCount: number\r\n referenceId: string\r\n syncStatus: GroupSyncStatus\r\n}\r\nexport interface GroupSyncStatus {\r\n status: string;\r\n lastSyncCompletedTime: string;\r\n}\r\n\r\nexport interface SyncAction {\r\n id: string;\r\n action: string;\r\n}\r\n\r\nexport enum SyncType {\r\n MicrosoftAD = \"Microsoft AD\",\r\n Okta = \"Okta\"\r\n}\r\n\r\nexport enum SyncLevel {\r\n Basic = \"basic\",\r\n Essentials = \"essentialsOnly\"\r\n}\r\n","import * as network from 'utils/network';\r\nimport * as Actions from './actions';\r\nimport { PostStats, DetailedPostStats, UserCount, PlatformStats, ReadViewStatByHour, TagStats, DetailedTagStats, PostRead, TagStatsPost, CommentAndReactionCount, TopEvent, UserTrends, AnalyticsReportFilters } from './models';\r\nimport { AppThunkResult } from 'typedActions';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport { Survey } from 'modules/surveys';\r\n\r\nexport const fetchPostStats = (reportFilter: AnalyticsReportFilters): AppThunkResult => (dispatch, getState) => {\r\n const uri = getState().config.PostStats;\r\n\r\n dispatch(Actions.CreateGetPostStatsInit({}));\r\n\r\n return network.CreateApiRequestInit(uri, { type: network.RequestMethod.POST, body: JSON.stringify(reportFilter) }, getState)\r\n .then(request => {\r\n return fetch(request.uri, request.init);\r\n })\r\n .then(response => {\r\n if (response.status === 200) {\r\n return response.json();\r\n } else {\r\n const posts = new Array();\r\n dispatch(Actions.CreateGetPostStatsComplete({ posts, succeeded: false }));\r\n return undefined;\r\n }\r\n })\r\n .then((posts?: PostStats[] ) => {\r\n if (posts) {\r\n dispatch(Actions.CreateGetPostStatsComplete({ posts, succeeded: true }));\r\n }\r\n });\r\n \r\n}\r\n\r\nexport const fetchUserCountsByMonth = (reportFilter: AnalyticsReportFilters): AppThunkResult => (dispatch, getState) => {\r\n const uri = getState().config.UserCounts;\r\n\r\n dispatch(Actions.CreateGetUserCountsInit({}));\r\n\r\n return network.CreateApiRequestInit(uri, { type: network.RequestMethod.POST, body: JSON.stringify(reportFilter) }, getState)\r\n .then(request => {\r\n return fetch(request.uri, request.init);\r\n })\r\n .then(response => {\r\n if (response.status === 200) {\r\n return response.json();\r\n } else {\r\n const userCounts = new Array();\r\n dispatch(Actions.CreateGetUserCountsComplete({ userCounts, succeeded: false }));\r\n return undefined;\r\n }\r\n })\r\n .then((userCounts?: UserCount[] ) => {\r\n if (userCounts) {\r\n dispatch(Actions.CreateGetUserCountsComplete({ userCounts, succeeded: true }));\r\n }\r\n });\r\n}\r\n\r\nexport const fetchCommentAndReactionCountsByMonth = (reportFilter: AnalyticsReportFilters): AppThunkResult => (dispatch, getState) => {\r\n const uri = getState().config.CommentAndReactionCounts;\r\n dispatch(Actions.CreateGetCommentAndReactionCountsInit({}));\r\n\r\n return network.CreateApiRequestInit(uri, { type: network.RequestMethod.POST, body: JSON.stringify(reportFilter) }, getState)\r\n .then(request => {\r\n return fetch(request.uri, request.init);\r\n })\r\n .then(response => {\r\n if (response.status === 200) {\r\n return response.json();\r\n } else {\r\n const commentAndReactionCounts = new Array();\r\n dispatch(Actions.CreateGetCommentAndReactionCountsComplete({ commentAndReactionCounts, succeeded: false }));\r\n return undefined;\r\n }\r\n })\r\n .then((commentAndReactionCounts?: CommentAndReactionCount[] ) => {\r\n if (commentAndReactionCounts) {\r\n dispatch(Actions.CreateGetCommentAndReactionCountsComplete({ commentAndReactionCounts, succeeded: true }));\r\n }\r\n });\r\n}\r\n\r\nexport const fetchPlatformStats = (reportFilter: AnalyticsReportFilters): AppThunkResult => (dispatch, getState) => {\r\n const uri = getState().config.PlatformStats;\r\n\r\n dispatch(Actions.CreateGetPlatformStatsInit({}))\r\n\r\n return network.CreateApiRequestInit(uri, { type: network.RequestMethod.POST, body: JSON.stringify(reportFilter) }, getState)\r\n .then(request => {\r\n return fetch(request.uri, request.init);\r\n })\r\n .then(response => {\r\n if (response.status === 200) {\r\n return response.json();\r\n } else {\r\n const platformStats = new Array();\r\n dispatch(Actions.CreateGetPlatformStatsComplete({ platformStats, succeeded: false }));\r\n return undefined;\r\n }\r\n })\r\n .then((platformStats?: PlatformStats[] ) => {\r\n if (platformStats) {\r\n dispatch(Actions.CreateGetPlatformStatsComplete({ platformStats, succeeded: true }));\r\n }\r\n });\r\n}\r\n\r\nexport const fetchSurveyStats = (reportFilter: AnalyticsReportFilters): AppThunkResult => (dispatch, getState) => {\r\n const uri = getState().config.TopSurveys;\r\n\r\n dispatch(Actions.CreateGetTopSurveysInit({}))\r\n\r\n return network.CreateApiRequestInit(uri, { type: network.RequestMethod.POST, body: JSON.stringify(reportFilter) }, getState)\r\n .then(request => {\r\n return fetch(request.uri, request.init);\r\n })\r\n .then(response => {\r\n if (response.status === 200) {\r\n return response.json();\r\n } else {\r\n const surveys = new Array();\r\n dispatch(Actions.CreateGetTopSurveysComplete({ surveys, succeeded: false }));\r\n return undefined;\r\n }\r\n })\r\n .then((surveys?: Survey[] ) => {\r\n if (surveys) {\r\n dispatch(Actions.CreateGetTopSurveysComplete({ surveys, succeeded: true }));\r\n }\r\n });\r\n}\r\n\r\nexport const fetchTopEvents = (reportFilter: AnalyticsReportFilters): AppThunkResult => (dispatch, getState) => {\r\n const uri = getState().config.TopEvents;\r\n\r\n dispatch(Actions.CreateGetTopEventsInit({}))\r\n\r\n return network.CreateApiRequestInit(uri, { type: network.RequestMethod.POST, body: JSON.stringify(reportFilter) }, getState)\r\n .then(request => {\r\n return fetch(request.uri, request.init);\r\n })\r\n .then(response => {\r\n if (response.status === 200) {\r\n return response.json();\r\n } else {\r\n const events = new Array();\r\n dispatch(Actions.CreateGetTopEventsComplete({ events, succeeded: false }));\r\n return undefined;\r\n }\r\n })\r\n .then((events?: TopEvent[] ) => {\r\n if (events) {\r\n dispatch(Actions.CreateGetTopEventsComplete({ events, succeeded: true }));\r\n }\r\n });\r\n}\r\n\r\nexport const fetchUserTrends = (reportFilter: AnalyticsReportFilters): AppThunkResult => (dispatch, getState) => {\r\n const uri = getState().config.UserTrends;\r\n\r\n dispatch(Actions.CreateGetUserTrendsInit({}))\r\n\r\n return network.CreateApiRequestInit(uri, { type: network.RequestMethod.POST, body: JSON.stringify(reportFilter) }, getState)\r\n .then(request => {\r\n return fetch(request.uri, request.init);\r\n })\r\n .then(response => {\r\n if (response.status === 200) {\r\n return response.json();\r\n } else {\r\n const userTrends:UserTrends = {uniqueUserReactionCommentOnPost: 0, uniqueUserViewPostEvent: 0};\r\n dispatch(Actions.CreateGetUserTrendsComplete({ userTrends, succeeded: false }));\r\n return undefined;\r\n }\r\n })\r\n .then((userTrends?: UserTrends ) => {\r\n if (userTrends) {\r\n dispatch(Actions.CreateGetUserTrendsComplete({ userTrends, succeeded: true }));\r\n }\r\n });\r\n}\r\n\r\nexport const setToFetch = (toSet: boolean): AppThunkResult => (dispatch, getState) => {\r\n dispatch(Actions.CreateSetToFetch({toSet}));\r\n}\r\n\r\nexport const fetchDetailedPostStats = (postId): AppThunkResult => (dispatch, getState) => {\r\n const postStatsBaseUri = getState().config.PostStats + \"/\" + postId;\r\n\r\n dispatch(Actions.CreateGetDetailedPostStatsInit({ postId }));\r\n\r\n return network.CreateApiRequestInit(postStatsBaseUri, {\r\n type: network.RequestMethod.GET,\r\n params: { }\r\n }, getState).then(request => {\r\n return fetch(request.uri, request.init).then(response => {\r\n if (response.status === 200) {\r\n return response.json().then((post: DetailedPostStats) => {\r\n if (post) {\r\n dispatch(Actions.CreateGetDetailedPostStatsComplete({ postId, post, succeeded: true }))\r\n \r\n dispatch(Actions.CreateGetPostReadsInit({id: postId}));\r\n \r\n return network.CreateApiRequestInit(postStatsBaseUri + \"/reads\", {\r\n type: network.RequestMethod.GET,\r\n params: { }\r\n }, getState).then(readsRequest => {\r\n return fetch(readsRequest.uri, readsRequest.init)\r\n .then(response => {\r\n if (response.status === 200) {\r\n return response.json().then((postReads: PostRead[]) => {\r\n if (postReads) {\r\n dispatch(Actions.CreateGetPostReadsComplete({ id: postId, postReads, succeeded: true}));\r\n }\r\n });\r\n } else {\r\n dispatch(Actions.CreateGetPostReadsComplete({ id: postId, postReads: null, succeeded: false }));\r\n }\r\n });\r\n });\r\n }\r\n });\r\n } else {\r\n dispatch(Actions.CreateGetDetailedPostStatsComplete({ postId, post: null, succeeded: false }))\r\n }\r\n });\r\n });\r\n}\r\n\r\nexport const fetchReadViewStats = (reportFilter: AnalyticsReportFilters): AppThunkResult => (dispatch, getState) => {\r\n const uri = getState().config.ReadViewStats;\r\n\r\n dispatch(Actions.CreateGetReadViewStatsInit({ }));\r\n\r\n return network.CreateApiRequestInit(uri, { type: network.RequestMethod.POST, body: JSON.stringify(reportFilter) }, getState)\r\n .then(request => {\r\n return fetch(request.uri, request.init);\r\n })\r\n .then(response => {\r\n if (response.status === 200) {\r\n return response.json();\r\n } else {\r\n const readViewStats = new Array();\r\n dispatch(Actions.CreateGetReadViewStatsComplete({ readViewStats, succeeded: false }));\r\n return undefined;\r\n }\r\n })\r\n .then(( readViewStats?: ReadViewStatByHour[] ) => {\r\n if (readViewStats) {\r\n dispatch(Actions.CreateGetReadViewStatsComplete({ readViewStats, succeeded: true }));\r\n }\r\n });\r\n}\r\n\r\n\r\nexport const fetchTopChannels = (): AppThunkResult => (dispatch, getState) => {\r\n const uri = getState().config.TagStats;\r\n\r\n dispatch(Actions.CreateGetTopChannelsInit({}));\r\n\r\n return network.CreateApiRequestInit(uri, { type: network.RequestMethod.GET }, getState)\r\n .then(request => {\r\n return fetch(request.uri, request.init);\r\n })\r\n .then(response => {\r\n if (response.status === 200) {\r\n return response.json();\r\n } else {\r\n const tags = new Array();\r\n dispatch(Actions.CreateGetTopChannelsComplete({ tags, succeeded: false }));\r\n return undefined;\r\n }\r\n })\r\n .then(( tags?: TagStats[] ) => {\r\n if (tags) {\r\n dispatch(Actions.CreateGetTopChannelsComplete({ tags, succeeded: true }));\r\n }\r\n });\r\n}\r\n\r\nexport const fetchTagStats = (id) => async (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n\r\n const tagStatsBaseUri = getState().config.TagStats + \"/\" + id;\r\n\r\n dispatch(Actions.CreateGetTagStatsInit({ id }));\r\n\r\n const detailsPromise = network.CreateApiRequestInit(tagStatsBaseUri, {\r\n type: network.RequestMethod.GET\r\n }, getState).then(detailsRequest => {\r\n return fetch(detailsRequest.uri, detailsRequest.init)\r\n .then(response => {\r\n if (response.status === 200) {\r\n return response.json() as Promise;\r\n } else {\r\n dispatch(Actions.CreateGetTagStatsComplete({ tagStats: null, succeeded: false }));\r\n }\r\n })\r\n .then((tagStats: DetailedTagStats) => {\r\n if (tagStats) {\r\n dispatch(Actions.CreateGetTagStatsComplete({ tagStats, succeeded: true }));\r\n }\r\n });\r\n })\r\n\r\n return Promise.resolve(detailsPromise);\r\n}\r\n\r\nexport const fetchTagReadsAndPostReads = (id) => async (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n\r\n const tagStatsBaseUri = getState().config.TagStats + \"/\" + id;\r\n\r\n dispatch(Actions.CreateGetTagReadsInit({ id }));\r\n dispatch(Actions.CreateGetTagPostsInit({ id }));\r\n\r\n const readsPromise = network.CreateApiRequestInit(tagStatsBaseUri + \"/reads\", {\r\n type: network.RequestMethod.GET\r\n }, getState).then(readsRequest => {\r\n return fetch(readsRequest.uri, readsRequest.init)\r\n .then(response => {\r\n if (response.status === 200) {\r\n return response.json() as Promise;\r\n } else {\r\n dispatch(Actions.CreateGetTagReadsComplete({ id, postReads: null, succeeded: false }));\r\n }\r\n })\r\n .then((postReads: PostRead[]) => {\r\n if (postReads) {\r\n dispatch(Actions.CreateGetTagReadsComplete({ id, postReads, succeeded: true}));\r\n }\r\n });\r\n })\r\n\r\n const postsPromise = network.CreateApiRequestInit(tagStatsBaseUri + \"/posts\", {\r\n type: network.RequestMethod.GET\r\n }, getState).then(postsRequest => {\r\n return fetch(postsRequest.uri, postsRequest.init)\r\n .then(response => {\r\n if (response.status === 200) {\r\n return response.json() as Promise;\r\n } else {\r\n dispatch(Actions.CreateGetTagPostsComplete({ id, posts: null, succeeded: false }));\r\n }\r\n })\r\n .then((posts: TagStatsPost[]) => {\r\n if (posts) {\r\n dispatch(Actions.CreateGetTagPostsComplete({ id, posts, succeeded: true}));\r\n }\r\n });\r\n });\r\n\r\n return Promise.all([readsPromise, postsPromise]);\r\n}\r\n\r\n","// In production, we register a service worker to serve assets from local cache.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport default function register() {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const url = process.env.PUBLIC_URL as string;\r\n const publicUrl = new URL(url, window.location.toString());\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl);\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: string) {\r\n var refreshing = false;\r\n \r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(_ => navigator.serviceWorker.oncontrollerchange = _ => {\r\n if (refreshing) return;\r\n\r\n refreshing = true;\r\n\r\n setTimeout(() => window.location.reload(), 1000);\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (response.status === 404 || (contentType && contentType.indexOf('javascript') === -1)) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl);\r\n }\r\n })\r\n .catch(() => {\r\n console.log('No internet connection found. App is running in offline mode.');\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import {connect} from \"react-redux\";\r\nimport {IntlProvider} from \"react-intl\";\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\n\r\nexport default connect(\r\n (state: GlobalApplicationState) => ({\r\n locale: state.localization.locale,\r\n messages: state.localization.messages,\r\n key: state.localization.locale,\r\n })\r\n )(IntlProvider);","import React from \"react\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { withRouter, RouteComponentProps } from \"react-router\";\r\nimport { createGlobalStyle } from \"styled-components\";\r\n\r\nimport { createTheme, ThemeProvider } from \"@mui/material/styles\"; //v5\r\n\r\nconst AdminPalette = {\r\n blue: \"#3b78ab\",\r\n rose: \"#aa214e\"\r\n};\r\n\r\nconst PublicPalette = {\r\n blue: \"#3b78ab\"\r\n};\r\n\r\nconst TinaTheme = createGlobalStyle<{}>`\r\n html body {\r\n --tina-color-primary-light: ${AdminPalette.blue};\r\n --tina-color-primary: ${AdminPalette.blue};\r\n --tina-color-primary-dark: ${AdminPalette.blue};\r\n }\r\n`;\r\n\r\nconst Theme: React.FunctionComponent = props => {\r\n const isAdminTheme: boolean = props.history.location.pathname.includes(\"/admin\");\r\n const isPublicTheme: boolean = props.history.location.pathname.includes(\"/public\");\r\n const primary: string = props.themeEnabled ? (props.brand || \"#333333\") : \"#2196f3\";\r\n\r\n const theme = createTheme({\r\n palette: {\r\n background: {\r\n default: \"#f3f3f4\"\r\n },\r\n primary: {\r\n main: isAdminTheme\r\n ? AdminPalette.blue\r\n : isPublicTheme\r\n ? PublicPalette.blue\r\n : primary\r\n },\r\n secondary: {\r\n main: isAdminTheme\r\n ? AdminPalette.rose\r\n : isPublicTheme\r\n ? PublicPalette.blue\r\n : primary\r\n },\r\n info: {\r\n main: \"#888888\"\r\n }\r\n },\r\n breakpoints: {\r\n values: {\r\n xs: 0,\r\n sm: 600,\r\n md: 960,\r\n lg: 1280,\r\n xl: 1920,\r\n },\r\n },\r\n typography: {\r\n h1: {\r\n fontSize: \"2rem\",\r\n fontWeight: 500\r\n },\r\n h2: {\r\n fontSize: \"1.25rem\",\r\n fontWeight: 500\r\n },\r\n h3: {\r\n fontSize: \"1rem\",\r\n fontWeight: 500\r\n },\r\n h4: {\r\n fontSize: \"1rem\",\r\n fontWeight: 500\r\n },\r\n h5: {\r\n fontSize: \"1rem\",\r\n fontWeight: 500\r\n },\r\n h6: {\r\n fontSize: \"1rem\",\r\n fontWeight: 500\r\n },\r\n caption: {\r\n color: \"#666666\",\r\n fontSize: 12\r\n },\r\n button : {\r\n color: \"red\"\r\n }\r\n },\r\n components: {\r\n MuiLink: {\r\n styleOverrides: {\r\n root: {\r\n color: isAdminTheme\r\n ? AdminPalette.blue\r\n : isPublicTheme\r\n ? PublicPalette.blue\r\n : primary,\r\n \"&:hover\": {\r\n color: isAdminTheme\r\n ? AdminPalette.blue\r\n : isPublicTheme\r\n ? PublicPalette.blue\r\n : primary\r\n }\r\n }\r\n }\r\n },\r\n MuiInputBase: {\r\n styleOverrides: {\r\n root: {\r\n backgroundColor: \"#ffffff\",\r\n \".Mui-disabled\": {\r\n backgroundColor: \"#f0f0f0\",\r\n color: \"#888888\"\r\n }\r\n }\r\n }\r\n },\r\n MuiSnackbar: {\r\n styleOverrides: {\r\n root: {\r\n position: \"absolute\"\r\n }\r\n }\r\n },\r\n MuiTableCell: {\r\n styleOverrides: {\r\n root: {\r\n borderBottom: \"none\"\r\n }\r\n }\r\n },\r\n MuiTableHead: {\r\n styleOverrides: {\r\n root: {\r\n backgroundColor: \"#f3f3f4\"\r\n }\r\n }\r\n },\r\n MuiTableRow: {\r\n styleOverrides: {\r\n root: {\r\n \"&$hover\": {\r\n \"&:hover\": {\r\n backgroundColor: isAdminTheme ? \"rgba(59, 120, 171, 0.08)\" : `${primary}14`\r\n },\r\n \"&$selected\": {\r\n backgroundColor: isAdminTheme ? \"rgba(59, 120, 171, 0.08)\" : `${primary}14`\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n return (\r\n \r\n \r\n {props.children}\r\n \r\n );\r\n};\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n brand: state.settings.clientSettings.theme.enabled ? state.settings.clientSettings.theme.color : \"\",\r\n themeEnabled: !!state.settings.clientSettings.id ? state.settings.clientSettings.theme.enabled : true\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps & RouteComponentProps<{}>;;\r\n\r\nexport default withRouter(connector(Theme));","import { ApplicationInsights } from '@microsoft/applicationinsights-web';\r\nimport { ReactPlugin } from '@microsoft/applicationinsights-react-js';\r\nimport { browserHistory } from 'configureStore';\r\n\r\nexport const appInsightsReactPlugin = new ReactPlugin();\r\n\r\nif(!!process.env.REACT_APP_APPINSIGHTSKEY){\r\n const appInsights = new ApplicationInsights({\r\n config: {\r\n instrumentationKey: process.env.REACT_APP_APPINSIGHTSKEY,\r\n extensions: [appInsightsReactPlugin],\r\n extensionConfig: {\r\n [appInsightsReactPlugin.identifier]: { history: browserHistory }\r\n }\r\n }\r\n });\r\n appInsights.loadAppInsights();\r\n}","import { UserRole } from \"modules/users\";\r\n\r\nexport enum UserRoleStrings {\r\n SPARROW_SUPER_ADMIN = \"role_sparrowsuperadmin\",\r\n OWNER = \"role_owner\",\r\n AUTHOR = \"role_author\",\r\n INTERNAL = \"role_internal\",\r\n CONTRIBUTOR = \"role_contributor\"\r\n}\r\n\r\nexport const USER_ROLE_DESCRIPTIONS : Record = {\r\n [UserRole.DEFAULT]: \"\",\r\n [UserRole.AUTHOR]: \"Authors can publish and manage content. You can also customize the access of authors to optimize the tools they can use within the portal.\",\r\n [UserRole.OWNER]: \"Owners have access to all features and tools in your portal.\",\r\n [UserRole.USER]: \"Users can access the portal and view content targeted to them or content they are subscribed to. You can also allow users to submit and contribute content.\",\r\n [UserRole.CONTRIBUTOR]: \"Contributors are allowed to submit draft content for review using topics they have access to.\\n\\nThey also have limited access to certain settings when creating or publishing content.\"\r\n}\r\n","import React, { useEffect, useState } from \"react\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n image: {\r\n boxSizing: \"border-box\",\r\n height: \"100%\",\r\n maxHeight: \"100vh\",\r\n maxWidth: \"100vw\",\r\n objectFit: \"contain\",\r\n padding: \"25px 0 50px 0\"\r\n },\r\n message: {\r\n position: \"absolute\",\r\n fontSize: 14,\r\n bottom: 20,\r\n left: 0,\r\n right: 0\r\n },\r\n screenBase: {\r\n position: \"relative\",\r\n backgroundImage: \"url('/images/portal-bg.png')\",\r\n backgroundPosition: \"top left\",\r\n backgroundRepeat: \"no-repeat\",\r\n backgroundSize: \"cover\",\r\n fontFamily: theme.typography.fontFamily,\r\n height: \"100vh\",\r\n textAlign: \"center\"\r\n }\r\n })\r\n);\r\n\r\nconst AdminPortalSplashScreen: React.FunctionComponent = props => {\r\n const [display, setDisplay] = useState(true);\r\n const [timestamp] = useState(new Date().getTime());\r\n const classes = useStyles();\r\n\r\n useEffect(() => {\r\n const timer = setTimeout(() => setDisplay(false), 4500);\r\n return () => {\r\n clearTimeout(timer);\r\n };\r\n }, []);\r\n\r\n if (props.displaySplashScreen && display) {\r\n return (\r\n
\r\n \"redirecting\r\n
Redirecting you to the Admin Portal...
\r\n
\r\n );\r\n }\r\n\r\n return (\r\n {props.children}\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n displaySplashScreen?: boolean;\r\n}\r\n\r\nexport default AdminPortalSplashScreen;","import { useState } from \"react\";\r\nimport { useIsAuthenticated, useMsal } from \"@azure/msal-react\";\r\nimport { InteractionStatus } from \"@azure/msal-browser\";\r\nimport Cookies from \"js-cookie\";\r\n\r\nimport MsalAuthModule from \"authentication/msalAuthModule\";\r\n\r\n\r\n/**\r\n * Sign out logic\r\n * @returns array where:\r\n * - first element is function to begin sign out process\r\n * - second element is boolean indicating singing out is in process\r\n*/\r\n\r\nexport type SignOut = {\r\n signOut: () => Promise;\r\n isSigningOut: boolean;\r\n}\r\n\r\nconst useSignOut = (): SignOut => {\r\n const isAuthenticated = useIsAuthenticated();\r\n const { inProgress } = useMsal();\r\n const [isSigningOut, setIsSigningOut] = useState(false);\r\n\r\n /**\r\n * Sign user out with msal\r\n */\r\n const signOut = async () => {\r\n // msal instance set up to redirect for us on logout\r\n if (isAuthenticated && inProgress === InteractionStatus.None) {\r\n setIsSigningOut(true);\r\n Cookies.remove(\"tenantId\");\r\n Cookies.remove(\"multitenancy\");\r\n await MsalAuthModule.getInstance().logout(true);\r\n }\r\n };\r\n\r\n return {\r\n signOut, isSigningOut\r\n }\r\n};\r\n\r\nexport default useSignOut;\r\n","import React from \"react\";\r\nimport { ListItem, ListItemText } from \"@mui/material\";\r\nimport ExitToAppIcon from \"@mui/icons-material/ExitToApp\";\r\n\r\nimport useSignOut from \"modules/common/hooks/useSignOut\";\r\n\r\nconst SignOutListItem: React.FunctionComponent = (props) => {\r\n const signOutData = useSignOut();\r\n\r\n const signOutAsync = async () => {\r\n await signOutData.signOut();\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\ninterface ISignOutProps {\r\n optionsMenuItemClassName: string;\r\n optionsMenuItemTextClassName: string;\r\n}\r\n\r\nexport default SignOutListItem;\r\n","import * as React from \"react\";\r\nimport \"./avatar.sass\";\r\n\r\ninterface ComponentProps {\r\n firstname: string;\r\n lastname: string;\r\n color: string;\r\n}\r\n\r\nexport default class Avatar extends React.Component {\r\n\r\n public shouldComponentUpdate(nextProps: ComponentProps, nextState) {\r\n return nextProps.firstname !== this.props.firstname || nextProps.color !== this.props.color\r\n }\r\n\r\n public render() {\r\n let firstLetter = this.props.firstname?.substr(0, 1); \r\n let lastletter = this.props.lastname?.substr(0, 1);\r\n\r\n return (\r\n
\r\n {firstLetter + lastletter}\r\n
\r\n );\r\n }\r\n}\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { Link, LinkProps } from \"react-router-dom\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\"\r\n\r\nclass TenantLink extends React.Component {\r\n\r\n public shouldComponentUpdate(nextProps: PropsWithRedux) {\r\n return (nextProps.to !== this.props.to || nextProps.tenantId !== this.props.tenantId || nextProps.children !== this.props.children)\r\n }\r\n\r\n public render() {\r\n return (\r\n \r\n {this.props.children}\r\n \r\n );\r\n }\r\n\r\n private addTenantToLink(to: string): string {\r\n if (!!this.props.tenantId)\r\n return to.replace(\"~/\", \"/\" + this.props.tenantId + \"/\");\r\n else\r\n return to.replace(\"~/\", \"/\");\r\n }\r\n\r\n private onClick = () => {\r\n this.props.onClick ? this.props.onClick() : (() => {})();\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n pushToBrowserHistory?: boolean;\r\n to: string;\r\n onClick?: () => any;\r\n inNewTab?: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: LinkProps & ComponentProps)=>({\r\n ...ownProps,\r\n tenantId: state.tenant.id\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(TenantLink);\r\n","import _ from \"lodash\";\r\nimport uuid from \"uuid\";\r\n\r\nconst colors = [\"#F44336\",\"#E53935\",\"#E91E63\",\"#D81B60\",\"#9C27B0\",\"#8E24AA\",\"#673AB7\",\"#5E35B1\",\"#3F51B5\",\"#3949AB\",\"#2196F3\",\"#1E88E5\",\"#009688\",\"#00897B\",\"#43A047\",\"#388E3C\"];\r\n\r\nexport const generateColor = (str?: string | null) => {\r\n let num = 0;\r\n _.each(str ?? uuid(), (s)=> {num += s.charCodeAt(0);})\r\n return colors[num % 16];\r\n}","\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport { CurrentUserSettings } from \"modules/settings/models\";\r\nimport { UserRole } from \"modules/users\";\r\n\r\n\r\nexport const getRole = (userSettings: CurrentUserSettings) => {\r\n if (userSettings.roles.indexOf(UserRoleStrings.OWNER) >= 0)\r\n return \"Owner\";\r\n else if (userSettings.roles.indexOf(UserRoleStrings.AUTHOR) >= 0)\r\n return \"Author\";\r\n else if (userSettings.roles.indexOf(UserRoleStrings.CONTRIBUTOR) >= 0)\r\n return \"Contributor\";\r\n return \"User\";\r\n}\r\n\r\n/**\r\n * Get an array of roles that a role should have according to our hierarchy\r\n */\r\nexport const getHierarchyRoles = (role: UserRole): string[] => {\r\n let hierarchyRoles: string[] = [UserRoleStrings.INTERNAL];\r\n\r\n if (role === UserRole.CONTRIBUTOR || role === UserRole.AUTHOR || role === UserRole.OWNER)\r\n hierarchyRoles.push(UserRoleStrings.CONTRIBUTOR);\r\n\r\n if (role === UserRole.AUTHOR || role === UserRole.OWNER)\r\n hierarchyRoles.push(UserRoleStrings.AUTHOR);\r\n\r\n if (role === UserRole.OWNER)\r\n hierarchyRoles.push(UserRoleStrings.OWNER);\r\n\r\n return hierarchyRoles;\r\n}\r\n","import React from \"react\";\r\n\r\ninterface IConditionalWrapperProps {\r\n condition?: boolean;\r\n wrapper: (children: React.ReactNode | React.ReactElement) => React.ReactElement;\r\n}\r\n\r\n/**\r\n * Conditionally wrap children in a component\r\n * - see Account.tsx for usage\r\n * @returns\r\n */\r\nconst ConditionalWrapper: React.FunctionComponent = ({ condition, wrapper, children }) =>\r\n condition ? wrapper(children) : <>{children};\r\n\r\nexport default ConditionalWrapper;\r\n","import * as React from \"react\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { withRouter, RouteComponentProps } from \"react-router\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Avatar from \"modules/common/components/avatar\";\r\nimport TenantLink from \"modules/common/components/tenantLink\";\r\n\r\nimport { generateColor } from \"utils/colorGenerator\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { getRole } from \"utils/getRole\";\r\nimport ConditionalWrapper from \"../conditionalWrapper\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n account: {\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n marginRight: 10,\r\n \"& a\": {\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n color: \"inherit\",\r\n textDecoration: \"none\",\r\n },\r\n \"& a:hover\": {\r\n textDecoration: \"none\",\r\n color: \"inherit\",\r\n }\r\n },\r\n avatar: {\r\n marginRight: 5,\r\n \"& .avatar-icon-container\": {\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n height: 30,\r\n width: 30,\r\n },\r\n \"& .avatar-letter\": {\r\n fontSize: 12,\r\n fontWeight: 300,\r\n lineHeight: \"1em\",\r\n marginTop: 0,\r\n },\r\n },\r\n avatarName: {\r\n fontSize: 14,\r\n },\r\n })\r\n);\r\n\r\nconst Account: React.FunctionComponent = ({ fetching, currentUser, linkToProfile, showRole }) => {\r\n const classes = useStyles();\r\n if (!currentUser.userId || fetching) return <>;\r\n\r\n return (\r\n
\r\n {children}}>\r\n
\r\n \r\n
\r\n
\r\n {`${currentUser.firstName} ${currentUser.lastName}`} {showRole && `(${getRole(currentUser)})`}\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\ninterface IAccountComponentProps {\r\n showRole?: boolean;\r\n linkToProfile?: boolean;\r\n}\r\n\r\nconst accountConnector = connect((state: GlobalApplicationState, ownProps: IAccountComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n fetching: state.settings.fetching,\r\n currentUser: state.settings.currentUser,\r\n}));\r\ntype IAccountPropsWithRedux = ConnectedProps;\r\nexport default withRouter(accountConnector(Account));\r\n","/**\r\n * written by: https://github.com/juliencrn/usehooks-ts\r\n */\r\n\r\nimport { useCallback, useEffect, useRef } from \"react\";\r\n\r\nfunction useIsMounted() {\r\n const isMounted = useRef(false);\r\n\r\n useEffect(() => {\r\n isMounted.current = true;\r\n\r\n return () => {\r\n isMounted.current = false;\r\n };\r\n }, []);\r\n\r\n return useCallback(() => isMounted.current, []);\r\n}\r\n\r\nexport default useIsMounted;\r\n","import React from \"react\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport TenantLink from \"modules/common/components/tenantLink\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport { UserRoleWrapper } from \"./wrappers/UserRoleWrapper\";\r\nimport { AccordionWrapper } from \"./wrappers/AccordionWrapper\";\r\nimport { useMenuStyles } from \"../styles/menuItemStyles\";\r\nimport { ListItemButton } from \"@mui/material\";\r\n\r\nexport enum MenuItemType {\r\n Divider,\r\n Link,\r\n Header,\r\n Button\r\n}\r\n\r\nexport enum MenuItemLabel {\r\n EMPTY = \"\",\r\n HOME = \"Home\",\r\n FEED = \"My Feed\",\r\n EVENTS = \"Events\",\r\n PORTAL_PAGES = \"Portal Pages\",\r\n DOCUMENTS = \"Documents\",\r\n SHORTCUTS = \"Shortcuts\",\r\n PROFILE = \"My Profile\",\r\n ADMIN_PORTAL = \"Go to Admin Portal\",\r\n MANAGE_MY_POSTS = \"Manage My Posts\",\r\n SIGN_IN = \"Sign in\",\r\n MORE = \"More\",\r\n DASHBOARD = \"Dashboard\",\r\n POSTS = \"Posts\",\r\n CONTENT_MANAGEMENT = \"Content Management\",\r\n SURVEYS = \"Surveys\",\r\n QUICK_LINKS = \"QuickLinks\",\r\n TARGETTING_TOOLS = \"Targetting Tools\",\r\n AUDIENCES = \"Audiences\",\r\n TOPICS = \"Topics (Posts & Events)\",\r\n CATEGORY_TAGS = \"Category Tags\",\r\n MESSAGING_CENTER = \"Messaging Center\",\r\n DIRECT_MESSAGING = \"Direct Messaging\",\r\n NEWSLETTERS = \"Newsletters\",\r\n MEDIA_GALLERY = \"Media Gallery\",\r\n ACTIVITY_TOOLS = \"Activity Tools\",\r\n PLATFORM_ANALYTICS = \"Platform Analytics\",\r\n USER_PERMISSIONS = \"Users & Permissions\",\r\n TENANT_CONFIGURATIONS = \"Tenant Configurations\",\r\n TENANT_MANAGEMENT = \"Tenant Management\",\r\n COMAPANY_PORTAL = \"Go to Company Portal\",\r\n HOME_SCREENS = \"Home Screens\",\r\n CHANNEL_LAYOUTS = \"Channel Layouts\",\r\n MANAGE_MY_CONTENT = \"Manage my content\",\r\n EMAILS = \"Emails\",\r\n}\r\n\r\nexport interface IMenuItem {\r\n children?: IMenuItem[];\r\n endIcon?: JSX.Element;\r\n hide?: boolean;\r\n icon?: JSX.Element;\r\n label: MenuItemLabel;\r\n pushToBrowserHistory?: boolean;\r\n type: MenuItemType;\r\n url?: string;\r\n userRole?: UserRoleStrings;\r\n userRoles?: UserRoleStrings[];\r\n strictRole?: boolean; // for restricting users who are ONLY a certain role instead of having a role via the hierarchy\r\n onButtonClick?: () => void;\r\n buttonItemSelected?: boolean; // for dictating if a button menu item is selected or not\r\n}\r\n\r\nexport const MenuItem: React.FunctionComponent = props => {\r\n const { menuItem } = props;\r\n const classes = useMenuStyles();\r\n\r\n if (menuItem.hide)\r\n return ;\r\n\r\n return (\r\n \r\n \r\n
\r\n props.onMenuItemClicked && props.onMenuItemClicked(menuItem)}\r\n >\r\n props.setExpandedMenuItem(\"\")}\r\n className={`${classes.listItem} ${props.selected ? \"selected\" : \"\"}`}\r\n >\r\n {!props.hideIcons &&\r\n \r\n {menuItem.icon}\r\n \r\n }\r\n
\r\n \r\n {menuItem.endIcon}\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\ninterface ComponentProps {\r\n expand?: boolean;\r\n expandedMenuItem: string;\r\n hideIcons?: boolean;\r\n menuItem: IMenuItem;\r\n selected?: boolean;\r\n toggleExpand: () => void;\r\n setExpandedMenuItem: (menuItem: string) => void;\r\n onMenuItemClicked?: (menuItem: IMenuItem) => void;\r\n}\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { useHistory } from \"react-router\";\r\nimport { AppBar, Toolbar, IconButton, Link } from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\n\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { dynamicLinksApi } from \"api/instances\";\r\nimport cookies, { COMMON_COOKIE_KEYS } from \"utils/cookie\";\r\nimport useIsMounted from \"modules/common/hooks/useIsMounted\";\r\nimport * as userLayoutActions from \"modules/userPortalLayout/actionCreator\";\r\n\r\nimport \"./openInMobileAppBanner.sass\";\r\n\r\ninterface IOpenInMobileAppBannerProps {\r\n}\r\n\r\nconst OpenInMobileAppBanner: React.FunctionComponent = ({\r\n mobileAppBannerOpen,\r\n userEmail,\r\n setMobileAppBannerOpen\r\n}) => {\r\n const [dynamicLink, setDynamicLink] = useState();\r\n const [fetching, setFetching] = useState(false);\r\n const isMounted = useIsMounted();\r\n const { location: { pathname, search} } = useHistory();\r\n\r\n useEffect(() => {\r\n // if the banner is showing, then scroll to top of page so banner is visible at first\r\n if (mobileAppBannerOpen && !fetching && dynamicLink)\r\n document.documentElement.scrollTop = 0;\r\n }, [mobileAppBannerOpen, fetching, dynamicLink]);\r\n\r\n useEffect(() => {\r\n const fetch = async () => {\r\n try {\r\n setFetching(true);\r\n const link = await dynamicLinksApi.getDynamicLink(window.location.href);\r\n\r\n if (isMounted())\r\n setDynamicLink(link);\r\n } catch (err) { }\r\n finally {\r\n if (isMounted())\r\n setFetching(false);\r\n }\r\n }\r\n\r\n if (mobileAppBannerOpen)\r\n fetch();\r\n }, [isMounted, pathname, search, mobileAppBannerOpen]);\r\n\r\n const onClose = () => {\r\n setMobileAppBannerOpen(false);\r\n cookies.setWithOpts(cookies.getPrefixedKey(userEmail, COMMON_COOKIE_KEYS.MOBILE_APP_BANNER_CLOSED), \"true\", { expires: 60 });\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n {mobileAppBannerOpen && !fetching && dynamicLink &&\r\n \r\n \r\n
\r\n \r\n \r\n \r\n Join us on mobile!\r\n
\r\n \r\n OPEN IN APP\r\n \r\n
\r\n
\r\n }\r\n
\r\n \r\n );\r\n}\r\n\r\nconst connector = connect((state: GlobalApplicationState, ownProps: IOpenInMobileAppBannerProps) => ({\r\n ...ownProps,\r\n mobileAppBannerOpen: state.userPortalLayout.mobileAppBannerOpen,\r\n userEmail: state.settings.currentUser.email\r\n}),\r\n {\r\n setMobileAppBannerOpen: userLayoutActions.setMobileAppBannerOpen\r\n });\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport const MobileAppBanner = connector(OpenInMobileAppBanner);\r\n","const TIME_UNITS = {\r\n hours: {\r\n requiredLength: 3,\r\n },\r\n minutes: {\r\n requiredLength: 2,\r\n },\r\n seconds: {\r\n requiredLength: 1,\r\n }\r\n};\r\n\r\n/**\r\n * Convert a timer string value, ex. 2:11:02, to a nice string, ex. 2 hrs 11 mins 2 sec\r\n * @param timerValue\r\n */\r\nexport const getNiceTimerString = (timerValue: string): string => {\r\n if (!timerValue) return \"\";\r\n\r\n let separated = timerValue.split(\":\");\r\n\r\n if (separated.length > 3){\r\n throw new Error(\"I don't know how to do more time units\");\r\n }\r\n\r\n let hours: string = \"\", minutes: string = \"\", seconds: string = \"\";\r\n\r\n if (separated.length >= TIME_UNITS.hours.requiredLength) {\r\n hours = separated[0];\r\n let hourNum = Number(hours);\r\n\r\n if (hourNum > 0)\r\n hours = `${hourNum} ${hourNum === 1 ? \"hr\" : \"hrs\"}`;\r\n else\r\n hours = \"\";\r\n }\r\n\r\n if (separated.length >= TIME_UNITS.minutes.requiredLength) {\r\n minutes = separated[separated.length - 2];\r\n let minutesNum = Number(minutes);\r\n\r\n if (minutesNum > 0)\r\n minutes = `${minutesNum} ${minutesNum === 1 ? \"min\" : \"mins\"}`;\r\n else\r\n minutes = \"\";\r\n }\r\n\r\n if (separated.length >= TIME_UNITS.seconds.requiredLength) {\r\n seconds = separated[separated.length - 1];\r\n let secondsNum = Number(seconds);\r\n\r\n if (secondsNum > 0)\r\n seconds = `${secondsNum} sec`;\r\n else\r\n seconds = \"\";\r\n }\r\n\r\n return `${hours ? `${hours} `: \"\"}${minutes ? `${minutes} `: \"\"}${seconds ? `${seconds} ` : \"\"}`;\r\n}\r\n\r\nexport const getPercentString = (total: number, value: number) => {\r\n if (total === 0) return \"0%\";\r\n\r\n return `${Math.round((value / total) * 100)}%`;\r\n}\r\n\r\nexport const truncateStringWithElipsis = (source: string, size: number) => {\r\n return source.length > size ? source.slice(0, size - 1) + \"…\" : source;\r\n};\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { withRouter, RouteComponentProps } from \"react-router\";\r\nimport { Link } from \"react-router-dom\";\r\nimport Cookies from \"utils/cookie\";\r\n\r\nimport SignOutListItem from \"./SignOutListItem\";\r\nimport Account from \"./Account\";\r\n\r\nimport AppBar from \"@mui/material/AppBar\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport Popover from \"@mui/material/Popover\";\r\nimport Toolbar from \"@mui/material/Toolbar\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\nimport ExitToAppIcon from \"@mui/icons-material/ExitToApp\";\r\nimport HelpOutlineIcon from \"@mui/icons-material/HelpOutline\";\r\nimport MoreVertIcon from \"@mui/icons-material/MoreVert\";\r\nimport SyncAltIcon from \"@mui/icons-material/SyncAlt\";\r\nimport MenuIcon from \"@mui/icons-material/Menu\";\r\nimport { KeyboardArrowRight } from \"@mui/icons-material\";\r\nimport { Backdrop, Button, useMediaQuery, useTheme } from \"@mui/material\";\r\nimport Loading from \"../loading\";\r\nimport { MobileAppBanner } from \"../banners/openInMobileAppBanner\";\r\nimport { truncateStringWithElipsis } from \"utils/stringFormatting\";\r\n\r\ninterface IStyleProps {\r\n headerBackgroundColor?: string;\r\n useElevatedHeader?: boolean; // this is to ensure that the drawer for the shortcuts on the user page is not covered by the header\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n header: ({ headerBackgroundColor, useElevatedHeader }) => ({\r\n backgroundColor: headerBackgroundColor || theme.palette.background.default,\r\n color: theme.palette.text.primary,\r\n \"& .tenant-name\": {\r\n marginLeft: 24,\r\n },\r\n zIndex: useElevatedHeader ? theme.zIndex.drawer + 5 : undefined\r\n }),\r\n info: {\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n },\r\n infoDivider: {\r\n marginBottom: 8,\r\n marginTop: 8,\r\n },\r\n menuIcon: {\r\n marginRight: 5,\r\n },\r\n options: {\r\n position: \"relative\",\r\n },\r\n optionsMenu: {\r\n fontSize: 14,\r\n \"& a\": {\r\n color: \"inherit\",\r\n textDecoration: \"none\",\r\n },\r\n },\r\n optionsMenuItem: {\r\n \"&:hover\": {\r\n backgroundColor: theme.palette.background.default,\r\n cursor: \"pointer\",\r\n },\r\n \"& svg\": {\r\n fill: \"#888888\",\r\n },\r\n },\r\n optionsMenuItemIcon: {\r\n minWidth: 36,\r\n },\r\n optionsMenuItemText: {\r\n fontSize: 14,\r\n },\r\n toolbar: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n padding: \"0 9px\",\r\n },\r\n wordmark: {\r\n marginLeft: 10,\r\n width: 190,\r\n marginRight: 20,\r\n },\r\n updateHeader: {\r\n backgroundColor: \"#366531\"\r\n },\r\n updateToolbar: {\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n },\r\n updateToolbarBtn: {\r\n textTransform: \"none\",\r\n color: \"#FFFFFF\"\r\n },\r\n backdrop: ({ useElevatedHeader }) => ({\r\n zIndex: theme.zIndex.drawer + (useElevatedHeader ? 10 : 1),\r\n backgroundColor: \"#ffffff80\",\r\n })\r\n })\r\n);\r\n\r\nconst Header: React.FunctionComponent = ({\r\n publicAccess,\r\n onClickMenu,\r\n displayName,\r\n wordMark,\r\n history,\r\n headerBackgroundColor,\r\n showRole,\r\n linkToProfile,\r\n light,\r\n headerStyle,\r\n useElevatedHeader = false\r\n}) => {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const classes = useStyles({ headerBackgroundColor, useElevatedHeader });\r\n const [showUpdateAppBar, setShowUpdateAppBar] = useState(false);\r\n const [waitingForUpdate, setWaitingForUpdate] = useState(false);\r\n const theme = useTheme();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down('sm'), { noSsr: true });\r\n\r\n const update = async () => {\r\n try {\r\n setWaitingForUpdate(true);\r\n const registration = await navigator.serviceWorker.getRegistration();\r\n\r\n // if somehow the user is allowed to update but we don't have a service worker, reload to re-render the page\r\n if (registration === undefined) return;\r\n\r\n // check to see if we are running an older version of the application\r\n if (registration.active && registration.waiting) {\r\n // force the waiting service worker to skip its waiting and replace the older version\r\n // see https://github.com/facebook/create-react-app/issues/5316\r\n registration.waiting.postMessage({ type: 'SKIP_WAITING' });\r\n }\r\n }\r\n catch(_) { window.location.reload(); }\r\n }\r\n\r\n useEffect(() => {\r\n const checkForUpdate = async () => {\r\n if (!('serviceWorker' in navigator)) return;\r\n\r\n // get our current service worker registration\r\n const registration = await navigator.serviceWorker.getRegistration();\r\n if (registration === undefined) return;\r\n\r\n // if we have a service worker waiting on an active service worker,\r\n // it means we have an update pending and user is on an older version\r\n if (registration.active && registration.waiting) {\r\n setShowUpdateAppBar(true);\r\n }\r\n else {\r\n // set a listener on the registration for updates to display the banner\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing as ServiceWorker;\r\n installingWorker.onstatechange = () => {\r\n // if an update is found, and our service worker's state has shifted from\r\n // installing -> installed/waiting, then the update is ready to go\r\n if (installingWorker.state === 'installed' && navigator.serviceWorker.controller) {\r\n setShowUpdateAppBar(true);\r\n }\r\n };\r\n };\r\n }\r\n }\r\n\r\n checkForUpdate();\r\n }, []);\r\n\r\n return (\r\n <>\r\n \r\n {showUpdateAppBar &&\r\n \r\n \r\n }\r\n >\r\n A new version is available.\r\n {waitingForUpdate ? ' Updating...' : ' Update now'}\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n {wordMark && \"wordmark\"}\r\n
\r\n {isSmallAndSmaller\r\n ? truncateStringWithElipsis(displayName, 18)\r\n : displayName}\r\n
\r\n
\r\n
\r\n \r\n setAnchorEl(event.currentTarget)}>\r\n \r\n \r\n setAnchorEl(null)}\r\n anchorOrigin={{\r\n vertical: \"bottom\",\r\n horizontal: \"right\",\r\n }}\r\n transformOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"right\",\r\n }}\r\n className={classes.optionsMenu}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {!publicAccess && Cookies.get(\"multitenancy\") === \"true\" && (\r\n \r\n {\r\n Cookies.remove(\"tenantId\");\r\n Cookies.remove(\"multitenancy\");\r\n history.replace(\"/\");\r\n window.location.reload();\r\n }}\r\n className={classes.optionsMenuItem}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n {!publicAccess ? (\r\n \r\n ) : (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\ninterface ComponentProps {\r\n onClickMenu: () => void;\r\n publicAccess?: boolean;\r\n wordMark?: boolean;\r\n displayName: string;\r\n headerBackgroundColor?: string;\r\n showRole?: boolean;\r\n linkToProfile?: boolean;\r\n light?: boolean;\r\n headerStyle?: React.CSSProperties;\r\n useElevatedHeader?: boolean;\r\n}\r\n\r\nconst connector = connect((state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n}));\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default withRouter(connector(Header));\r\n\r\n","import { store } from \"configureStore\"\r\nimport { SetTenantIdAction } from \"modules/tenant\";\r\nimport { multitenancyApi } from \"api/instances\";\r\nimport * as actions from \"modules/settings/actionCreator\";\r\nimport Cookies from \"utils/cookie\";\r\n\r\nexport interface ISelectOpt {\r\n label: string;\r\n value: string;\r\n}\r\n\r\nexport default {\r\n /**\r\n * Reusable function for tasks and actions that are needed when first logging in a user into a tenant\r\n * Sets the tenantId and multitenancy cookies, the redux store's tenantId, as well as a GET for the user's settings.\r\n * This then navigates to the tenant portal page.\r\n * @param tenantId The tenant's id\r\n * @param multitenancy true if user belongs to multiple tenants (part of multiple B2C groups), false otherwise\r\n */\r\n setTenantUserDataAndNav(tenantId: string, multitenancy: boolean) {\r\n Cookies.set(\"tenantId\", tenantId);\r\n Cookies.set(\"multitenancy\", Boolean(multitenancy).toString());\r\n store.dispatch(SetTenantIdAction({ tenantId }));\r\n actions.getUserSettings();\r\n },\r\n /**\r\n * Maps tenant data to an array of objects implementing ISelectOpt { label: , value: }\r\n * @returns an array of formatted tenant data in the form of ISelectOpt[] { label: , value: }[]\r\n */\r\n async getTenantData(): Promise {\r\n const res = await multitenancyApi.getTenants();\r\n let keys = Object.keys(res);\r\n return keys.sort().map((key) => ({\r\n label: key,\r\n value: res[key],\r\n }));\r\n },\r\n /**\r\n * Get the tenant name and tenant id of tenants the user belongs to from the backend, and then set the corresponding redux stores\r\n * and cookies in the frontend.\r\n * \r\n * NOTE: If the user belongs to multiple tenants AND a default tenant id is not provided, the setup will not be run, and just tenant data is returned.\r\n * This is expected behaviour so that on the tenantSelection page, the user can first choose their tenant from a list and then run the setup.\r\n * @param defaultTenantId Setup the user to this default tenant in case they belong to multiple.\r\n * @returns an array of formatted tenant data in the form of ISelectOpt[] { label: , value: }[]\r\n */\r\n async setupTenantUserData(defaultTenantId?: string): Promise {\r\n const tenantData: ISelectOpt[] = await this.getTenantData();\r\n // If there is only 1 tenant, set that tenant's data in the frontend and navigate to the portal\r\n if (tenantData.length === 1) {\r\n this.setTenantUserDataAndNav(tenantData[0].value, false);\r\n }\r\n // If there are multiple tenants and a default is provided (and matches what we get from the backend), navigate to it\r\n else if (defaultTenantId && tenantData.some((ele) => ele.value === defaultTenantId)) {\r\n this.setTenantUserDataAndNav(defaultTenantId, true);\r\n }\r\n // we have multiple tenants for the user and a default is not chosen, don't navigate\r\n else {\r\n // pass\r\n }\r\n return tenantData;\r\n }\r\n}","import React, { useEffect, useState } from \"react\";\r\n\r\nimport Cookies from \"js-cookie\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Drawer from \"@mui/material/Drawer\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { COMMON_COOKIE_KEYS, COOKIE_OPT_IN_EXPIRY_DAYS } from \"utils/cookie\";\r\nimport tenantManagementUtils from \"utils/tenantManagementUtils\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n drawer: {\r\n position: \"relative\",\r\n zIndex: 9999\r\n },\r\n cookieBanner: {\r\n padding: \"30px 60px\"\r\n },\r\n disclaimer: {\r\n margin: \"15px 0\"\r\n },\r\n options: {\r\n marginTop: 20,\r\n textAlign: \"right\",\r\n \"& > button\": {\r\n marginLeft: 8\r\n }\r\n }\r\n })\r\n);\r\n\r\nconst CookieBanner: React.FunctionComponent = ({ tenantId }) => {\r\n const [showBanner, setShowBanner] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!Cookies.get(COMMON_COOKIE_KEYS.OPT_IN)) setShowBanner(true);\r\n }, []);\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n
\r\n
Sparrow Connected uses cookies and similar technologies to improve your experience and measure your interactions with our websites, products, and services. We do not share this activity with any vendors. If that’s okay, click “Accept”.
\r\n
\r\n
Disclaimer Text:
\r\n
We won't track your personal information when you visit our site. But in order to comply with your preferences, we'll have to use a cookie so that you're not asked to make this choice again.
\r\n
\r\n
\r\n
\r\n {\r\n Cookies.set(COMMON_COOKIE_KEYS.OPT_IN, \"false\", { expires: COOKIE_OPT_IN_EXPIRY_DAYS });\r\n setShowBanner(false);\r\n }}\r\n >\r\n Decline\r\n \r\n {\r\n Cookies.set(COMMON_COOKIE_KEYS.OPT_IN, \"true\", { expires: COOKIE_OPT_IN_EXPIRY_DAYS });\r\n setShowBanner(false);\r\n \r\n // User accepts cookies, now we can set the tenant cookie data\r\n await tenantManagementUtils.setupTenantUserData(tenantId);\r\n }}\r\n >\r\n Accept\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id,\r\n })\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(CookieBanner);\r\n","import React from \"react\"\r\n\r\ninterface ComponentProps {\r\n size: string,\r\n color?: string,\r\n style?: React.CSSProperties\r\n}\r\nexport default class LoadingSpinner extends React.Component {\r\n\r\n public render() {\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n }\r\n}","import * as React from \"react\";\r\nimport LoadingSpinner from '../loadingSpinner';\r\n\r\nimport Button from \"@mui/material/Button\";\r\n\r\nimport SaveAltIcon from \"@mui/icons-material/SaveAlt\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\n\r\n\r\ninterface IProps {\r\n onClick: () => Promise;\r\n text: string;\r\n downloadName: string;\r\n fileType?: string;\r\n}\r\n\r\ninterface IState {\r\n isLoading: boolean\r\n}\r\n\r\nexport default class DownloadButton extends React.Component {\r\n constructor(props: IProps) {\r\n super(props);\r\n\r\n this.state = {\r\n isLoading: false\r\n };\r\n }\r\n\r\n public render() {\r\n return (\r\n }\r\n disabled={this.state.isLoading}\r\n onClick={this.onClick}\r\n >\r\n {\r\n this.state.isLoading ? :\r\n \r\n {this.props.text}\r\n \r\n }\r\n \r\n );\r\n }\r\n\r\n private onClick = (e) => {\r\n e.stopPropagation();\r\n this.setState({isLoading: true}, () => {\r\n\r\n const file = {\r\n name: this.props.downloadName,\r\n type: this.props.fileType\r\n }\r\n \r\n this.props.onClick()\r\n .then(data => new FileDownloader(file).downloadBlob(data))\r\n .then(_ => this.setState({isLoading: false}))\r\n .catch(_ => this.setState({isLoading: false}));\r\n \r\n });\r\n }\r\n\r\n}\r\n","import React, { useEffect, useState } from \"react\";\r\nimport {\r\n Button,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogTitle,\r\n IconButton,\r\n Theme,\r\n} from \"@mui/material\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport moment from \"moment\";\r\nimport Axios from \"axios\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\nimport { resourcesApi } from \"api/instances\";\r\nimport LoadingCircle from \"modules/common/components/loadingCircle\";\r\nimport useIsMounted from \"modules/common/hooks/useIsMounted\";\r\nimport { IUpdateOption } from \"./models\";\r\nimport DownloadButton from \"modules/common/components/buttons/muiDownloadButton\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n titleContainer: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n },\r\n updateTitle: {\r\n fontWeight: 500,\r\n fontSize: 18\r\n },\r\n lastUpdated: {\r\n color: \"#7F7F7F\",\r\n marginTop: \"1rem\"\r\n },\r\n footer: {\r\n padding: \"16px 24px\"\r\n },\r\n closeIconButton: {\r\n padding: 0,\r\n },\r\n instructions: {\r\n textDecoration: \"underline\",\r\n },\r\n downloadContainer: {\r\n marginTop: \"1rem\"\r\n }\r\n })\r\n);\r\n\r\n/**\r\n * Update options dialog component\r\n * - for now we only allow download of SP pacakge so strings are hard coded and update option is singular\r\n */\r\nconst UpdateOptionsDialog: React.FunctionComponent = ({ open, onClose }) => {\r\n const classes = useStyles();\r\n const [loading, setLoading] = useState(false);\r\n const [updateOption, setUpdateOption] = useState();\r\n const isMounted = useIsMounted();\r\n\r\n useEffect(() => {\r\n const getUpdates = async () => {\r\n try {\r\n const spUpdateOption = await resourcesApi.getSharePointPackage();\r\n if (isMounted()) setUpdateOption(spUpdateOption);\r\n } catch {\r\n } finally {\r\n if (isMounted()) setLoading(false);\r\n }\r\n };\r\n\r\n if (open) {\r\n setLoading(true);\r\n getUpdates();\r\n }\r\n }, [isMounted, open]);\r\n\r\n /**\r\n * Converts ISO 8601 date string to local date string formatted like so: Nov 7, 2022\r\n */\r\n const getDateString = (date: string) => {\r\n return moment(date).format(\"MMM D, YYYY\");\r\n };\r\n\r\n const download = async () => {\r\n if (!updateOption || !updateOption.downloadLink) return Promise.reject(\"No file to download\");\r\n\r\n try {\r\n let { data } = await Axios.get(updateOption.downloadLink, { responseType: \"arraybuffer\" });\r\n return data;\r\n } catch (error) {\r\n return Promise.reject(\"No file to download\");\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n
\r\n Update Options\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n {updateOption &&\r\n <>\r\n

Update available:

\r\n

Updating Sparrow Intranet Modern SPPKG

\r\n \r\n Follow these instructions and download the installation files below to update your MS SharePoint package for your company intranet.\r\n \r\n

Last updated: {getDateString(updateOption.lastModifiedUTC)}

\r\n }\r\n {!loading && !updateOption && No updates available at this time.}\r\n
\r\n {loading && }\r\n {!loading && updateOption &&\r\n \r\n }\r\n
\r\n
\r\n \r\n \r\n DONE\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\n\r\ninterface IUpdateOptionsProps {\r\n open: boolean;\r\n onClose: () => void;\r\n}\r\n\r\nexport default UpdateOptionsDialog;\r\n","\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport { CurrentUserSettings } from \"modules/settings\";\r\n\r\nexport const getHighestRole = (currentUser: CurrentUserSettings): UserRoleStrings => {\r\n if (currentUser.roles.includes(UserRoleStrings.OWNER)) return UserRoleStrings.OWNER;\r\n else if (currentUser.roles.includes(UserRoleStrings.AUTHOR)) return UserRoleStrings.AUTHOR;\r\n else if (currentUser.roles.includes(UserRoleStrings.CONTRIBUTOR)) return UserRoleStrings.CONTRIBUTOR;\r\n else return UserRoleStrings.INTERNAL;\r\n}\r\n","import { IMenuItem } from \"./components/MenuItem\";\r\n\r\nexport class MenuUtils {\r\n private tenant: string;\r\n private locationPathName: string;\r\n\r\n constructor(tenant: string, locationPathName: string) {\r\n this.tenant = tenant;\r\n this.locationPathName = locationPathName;\r\n }\r\n\r\n private matchesCurrentUrl = (myUrl: string): boolean => {\r\n const urlWithTenant = myUrl.replace(\"~/\", `/${this.tenant}/`);\r\n return this.locationPathName.indexOf(urlWithTenant) >= 0;\r\n };\r\n\r\n private isChildSelected = (childrenItems?: IMenuItem[]): boolean => {\r\n if (!childrenItems || childrenItems.length === 0) return false;\r\n return childrenItems\r\n .some((childItem: IMenuItem) => this.matchesCurrentUrl(childItem.url || \"\"));\r\n };\r\n\r\n private subMenuMatchesCurrentUrl = (subMenuItems?: IMenuItem[]): boolean => {\r\n if (!subMenuItems || subMenuItems.length === 0) return false;\r\n\r\n return subMenuItems.some((subItem: IMenuItem) =>\r\n this.matchesCurrentUrl(subItem.url || \"\") || this.isChildSelected(subItem.children)\r\n );\r\n };\r\n\r\n public isLinkItemSelected = (menuItem: IMenuItem): boolean => {\r\n const menuItemUrl = menuItem.url ?? \"\";\r\n\r\n return menuItemUrl.startsWith(\"~/\")\r\n ? this.matchesCurrentUrl(menuItemUrl)\r\n : this.subMenuMatchesCurrentUrl(menuItem.children);\r\n };\r\n}","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\"\r\nimport { PropsWithChildren } from \"typedActions\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport { getHighestRole } from \"utils/userRoleUtils\";\r\n\r\nclass RequireRole extends React.Component {\r\n public render() {\r\n const userHighestRole = getHighestRole(this.props.currentUser);\r\n let userHasRole = false;\r\n\r\n // If we have a strict role, then user's highest role must be equal to the role we are restricting to\r\n if (this.props.strictRole)\r\n userHasRole = userHighestRole === this.props.roleName;\r\n // Users of Sparrow have a hierarchical role structure, so an Owner has all roles\r\n else if (this.props.roleName === UserRoleStrings.AUTHOR)\r\n userHasRole = userHighestRole === UserRoleStrings.OWNER ||\r\n userHighestRole === UserRoleStrings.AUTHOR;\r\n else if (this.props.roleName === UserRoleStrings.CONTRIBUTOR)\r\n userHasRole = userHighestRole === UserRoleStrings.OWNER ||\r\n userHighestRole === UserRoleStrings.AUTHOR ||\r\n userHighestRole === UserRoleStrings.CONTRIBUTOR;\r\n else\r\n userHasRole = userHighestRole === this.props.roleName;\r\n\r\n let renderEle = this.props.unauthorizedElement ?? null;\r\n\r\n if (userHasRole && !this.props.children)\r\n renderEle = null;\r\n else if (userHasRole && React.isValidElement(this.props.children))\r\n renderEle = this.props.children;\r\n else if (userHasRole)\r\n renderEle = {this.props.children}\r\n\r\n return renderEle;\r\n }\r\n}\r\n\r\ninterface ComponentProps extends PropsWithChildren {\r\n roleName: UserRoleStrings;\r\n unauthorizedElement?: React.ReactElement;\r\n strictRole?: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps )=>({\r\n ...ownProps,\r\n currentUser: state.settings.currentUser\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(RequireRole);\r\n","import React from \"react\";\r\n\r\nimport RequireRole from \"modules/common/components/requireRole\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\n\r\ninterface IUserRoleWrapperProps {\r\n userRole?: UserRoleStrings;\r\n strictRole?: boolean;\r\n}\r\n\r\nexport const UserRoleWrapper: React.FunctionComponent = props => {\r\n if (!props.userRole) return <>{props.children};\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n};","import { Theme } from \"@mui/material/styles\";\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\nexport const useMenuStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n menuItem: {\r\n position: \"relative\",\r\n \"& a\": {\r\n color: \"inherit\",\r\n textDecoration: \"none\",\r\n \"&:hover\": {\r\n textDecoration: \"none\"\r\n }\r\n }\r\n },\r\n expandableText: {\r\n opacity: 0,\r\n overflow: \"hidden\",\r\n width: 0,\r\n \"&.expanded\": {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n opacity: 1,\r\n transition: \"opacity linear 0.1s 0.2s\",\r\n width: \"100%\"\r\n },\r\n \"& svg\": {\r\n fill: \"#888888\",\r\n marginTop: -3\r\n }\r\n },\r\n listItem: {\r\n borderLeftColor: \"transparent\",\r\n borderLeftStyle: \"solid\",\r\n borderLeftWidth: 5,\r\n height: 45,\r\n \"&:hover\": {\r\n backgroundColor: \"inherit\",\r\n \"& $listItemText\": {\r\n fontWeight: 500\r\n }\r\n },\r\n \"&.selected\": {\r\n borderLeftColor: theme.palette.secondary.main,\r\n \"& $listItemIcon svg\": {\r\n fill: theme.palette.secondary.main\r\n },\r\n \"& $listItemText\": {\r\n fontWeight: 500\r\n }\r\n }\r\n },\r\n listItemIcon: {\r\n minWidth: 36,\r\n \"& svg\": {\r\n fill: \"#333333\"\r\n }\r\n },\r\n listItemText: {\r\n color: \"#333333\",\r\n fontSize: 14,\r\n whiteSpace: \"nowrap\"\r\n }\r\n })\r\n);","import React from \"react\";\r\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { Theme } from \"@mui/material/styles\";\r\nimport { Accordion, AccordionDetails, AccordionSummary, List, ListItemButton, ListItemText } from \"@mui/material\";\r\nimport { IMenuItem, MenuItemLabel } from \"../MenuItem\";\r\nimport TenantLink from \"modules/common/components/tenantLink\";\r\nimport { useMenuStyles } from \"../../styles/menuItemStyles\";\r\n\r\nconst useAccordionStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n accordion: {\r\n backgroundColor: theme.palette.background.default,\r\n \"&::before\": {\r\n display: \"none\"\r\n },\r\n \"&$accordionExpanded\": {\r\n margin: 0\r\n },\r\n \"& $accordion\": {\r\n backgroundColor: \"inherit\",\r\n \"& $accordionDetails\": {\r\n borderTop: \"1px solid rgba(0, 0, 0, 0.08)\",\r\n marginLeft: 20\r\n },\r\n \"& $accordionSummary\": {\r\n \"&:hover\": {\r\n backgroundColor: theme.palette.background.default\r\n }\r\n }\r\n }\r\n },\r\n accordionDetails: {\r\n backgroundColor: \"#e8e8e8\",\r\n display: \"block\",\r\n padding: 0\r\n },\r\n accordionExpanded: {\r\n \"& $accordionSummary\": {\r\n minHeight: 45\r\n },\r\n \"& $accordionSummaryContent\": {\r\n margin: 0\r\n },\r\n \"& > div > $accordionExpandIcon\": {\r\n transform: \"rotate(90deg)\"\r\n }\r\n },\r\n accordionExpandIcon: {\r\n color: \"#666666\"\r\n },\r\n accordionSummary: {\r\n boxSizing: \"border-box\",\r\n display: \"inline-flex\",\r\n height: 45,\r\n margin: 0,\r\n minHeight: 45,\r\n minWidth: \"100%\",\r\n padding: \"0 8px 0 0\",\r\n \"&:hover $listItemText\": {\r\n fontWeight: 500\r\n },\r\n \"&.collapsed\": {\r\n display: \"block\",\r\n \"& $accordionExpandIcon\": {\r\n display: \"none\"\r\n },\r\n },\r\n \"&.selected $accordionExpandIcon\": {\r\n color: theme.palette.secondary.main\r\n }\r\n },\r\n accordionSummaryContent: {\r\n display: \"block\",\r\n margin: 0\r\n },\r\n subList: {\r\n padding: 0,\r\n \"& $listItem\": {\r\n \"&:hover\": {\r\n backgroundColor: theme.palette.background.default\r\n }\r\n }\r\n }\r\n })\r\n);\r\n\r\ninterface ComponentProps {\r\n expand?: boolean;\r\n expandedMenuItem: string;\r\n hideIcons?: boolean;\r\n menuItem: IMenuItem;\r\n selected?: boolean;\r\n toggleExpand: () => void;\r\n setExpandedMenuItem: (menuItem: string) => void;\r\n onMenuItemClicked?: (menuItem: IMenuItem) => void;\r\n }\r\n\r\nexport const AccordionWrapper: React.FunctionComponent void; }> = props => {\r\n const [expandedMenuItem, setExpandedMenuItem] = React.useState(\"\");\r\n\r\n const accordionClasses = useAccordionStyles();\r\n const menuClasses = useMenuStyles(); \r\n\r\n const { menuItem } = props;\r\n\r\n if (!!menuItem.children && !!menuItem.children.length) {\r\n const subList: JSX.Element = (\r\n \r\n
\r\n {menuItem.children.map((subMenuItem, i) => {\r\n if (subMenuItem.hide)\r\n return ;\r\n\r\n return (\r\n \r\n \r\n {\r\n if (!!props.setExpandedParentMenuItem)\r\n props.setExpandedParentMenuItem(\"\");\r\n else\r\n props.setExpandedMenuItem(\"\");\r\n }}\r\n className={menuClasses.listItem}\r\n >\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n );\r\n })}\r\n
\r\n
\r\n );\r\n\r\n return (\r\n {\r\n if (expanded && !menuItem.url)\r\n props.setExpandedMenuItem(menuItem.label);\r\n else\r\n props.setExpandedMenuItem(\"\");\r\n\r\n if (!props.expand && menuItem.label !== MenuItemLabel.SHORTCUTS)\r\n props.toggleExpand();\r\n }}\r\n classes={{ expanded: accordionClasses.accordionExpanded }}\r\n className={accordionClasses.accordion}\r\n >\r\n }\r\n disableRipple\r\n onClick={(event: any) => {\r\n if (!!menuItem.url) {\r\n event.stopPropagation();\r\n\r\n if (props.expandedMenuItem !== menuItem.label)\r\n props.setExpandedMenuItem(menuItem.label);\r\n else\r\n props.setExpandedMenuItem(\"\");\r\n }\r\n }}\r\n classes={{\r\n content: accordionClasses.accordionSummaryContent,\r\n expandIconWrapper: accordionClasses.accordionExpandIcon\r\n }}\r\n className={`${accordionClasses.accordionSummary} ${props.expand ? \"\" : \"collapsed\"} ${props.selected ? \"selected\" : \"\"}`}\r\n >\r\n {props.children}\r\n \r\n \r\n {subList}\r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n};","import { EventTimes as IEventTimes } from \"modules/events\";\r\n\r\nexport enum dateOptions {\r\n basicFormatting = \"MMM D, YYYY\",\r\n basicWithHours = \"MMM D, YYYY, h:mmA\",\r\n basicWithHoursWithSpacing = \"MMM D, YYYY, h:mm A\",\r\n datePickerFormatting = \"MMM d, yyyy\",\r\n dateAndTime = \"dddd, MMMM Do YYYY, h:mm a\" // ex) Monday, February 25th 2019, 2:06 AM\r\n};\r\n\r\n/**\r\n * Used to format all day times to use an exact day. Ie if the event is all day and was created in the timezone est,\r\n * it will show the correct day as an all day. If it was created on the 20th, it would be showing as the 19th for timezones less than est.\r\n * Used to format a full date. Ie a full date with month, day, and year.\r\n * @param date \r\n * @param useUtcTimeZone \r\n * @returns \r\n */\r\nexport function formatDate(date: Date, useUtcTimeZone: boolean, includeWeekDay?: boolean): string {\r\n const options: Intl.DateTimeFormatOptions = {\r\n weekday: includeWeekDay ? 'short' : undefined,\r\n day: 'numeric',\r\n month: 'short',\r\n year: 'numeric'\r\n };\r\n \r\n if (useUtcTimeZone) {\r\n options.timeZone = 'UTC';\r\n }\r\n \r\n return new Intl.DateTimeFormat('en-US', options).format(date);\r\n }\r\n\r\n /**\r\n * Used to check whether an event is an all day event.\r\n * @param eventTime \r\n * @returns boolean\r\n */\r\n export function isAllDayEvent(eventTimes: IEventTimes, eventStartTime: string): boolean {\r\n return eventTimes[eventStartTime] === null;\r\n }","import React, { useEffect, useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport Drawer from \"@mui/material/Drawer\";\r\nimport List from \"@mui/material/List\";\r\nimport { Theme } from \"@mui/material/styles\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport {\r\n DashboardOutlined,\r\n PostAddOutlined,\r\n LocalOfferOutlined,\r\n SendOutlined,\r\n MenuBookOutlined,\r\n AssessmentOutlined,\r\n HistoryOutlined,\r\n PhotoLibraryOutlined,\r\n AccountCircleOutlined,\r\n SettingsOutlined,\r\n OpenInNewOutlined,\r\n AdminPanelSettingsOutlined,\r\n MenuBook,\r\n CalendarTodayOutlined,\r\n Description,\r\n} from \"@mui/icons-material\";\r\nimport { Button, Typography } from \"@mui/material\";\r\nimport UpdateOptionsDialog from \"modules/updateOptions/updateOptionsDialog\";\r\nimport useQueryParams, { QUERY_PARAM_KEYS } from \"modules/common/hooks/useQueryParams\";\r\nimport { useHistory, useLocation } from \"react-router\";\r\nimport { getHighestRole } from \"utils/userRoleUtils\";\r\nimport { MenuUtils } from \"routes/_layout/common/menuUtils\";\r\nimport { IMenuItem, MenuItemType, MenuItem, MenuItemLabel } from \"routes/_layout/common/components/MenuItem\";\r\nimport { UserRoleWrapper } from \"routes/_layout/common/components/wrappers/UserRoleWrapper\";\r\n\r\nimport \"../../common/styles/menuItem.sass\"\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n list: {\r\n position: \"static\",\r\n overflow: \"hidden auto\"\r\n },\r\n poweredBy: {\r\n color: \"#aaaaaa\",\r\n fontSize: 10,\r\n marginBottom: 10,\r\n marginLeft: 23,\r\n marginTop: 10,\r\n opacity: 0,\r\n \"&.expanded\": {\r\n opacity: 1,\r\n transition: \"opacity linear 0.1s 0.2s\"\r\n }\r\n },\r\n updateOptions: {\r\n textTransform: \"none\",\r\n fontSize: 10,\r\n padding: 0,\r\n textDecoration: \"underline\",\r\n fontWeight: \"normal\",\r\n \"&:hover\": {\r\n backgroundColor: \"transparent\",\r\n textDecoration: \"underline\"\r\n },\r\n color: \"rgb(170, 170, 170)\"\r\n },\r\n versionContainer: {\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n justifyContent: \"flex-start\",\r\n alignItems: \"center\"\r\n },\r\n pipe: {\r\n margin: \"0 8px\"\r\n }\r\n })\r\n);\r\n\r\n/**\r\n * If both portal pages and home screen enabled, nest in Channel Layouts,\r\n * otherwise show either/neither separately\r\n */\r\nconst processPortalPagesAndHomeScreens = (homeScreenConfigEnabled: boolean, portalPagesEnabled: boolean, items: IMenuItem[]): IMenuItem[] => {\r\n const portalPages: IMenuItem = {\r\n label: MenuItemLabel.PORTAL_PAGES,\r\n type: MenuItemType.Link,\r\n icon: ,\r\n url: \"~/admin/portalPages\",\r\n userRole: UserRoleStrings.OWNER,\r\n hide: !portalPagesEnabled\r\n };\r\n\r\n const homeScreens: IMenuItem = {\r\n label: MenuItemLabel.HOME_SCREENS,\r\n type: MenuItemType.Link,\r\n icon: ,\r\n url: \"~/admin/homeScreens\",\r\n userRole: UserRoleStrings.OWNER,\r\n hide: !homeScreenConfigEnabled\r\n };\r\n\r\n if (portalPagesEnabled && homeScreenConfigEnabled) {\r\n items = [\r\n ...items,\r\n {\r\n label: MenuItemLabel.CHANNEL_LAYOUTS,\r\n type: MenuItemType.Link,\r\n icon: ,\r\n userRole: UserRoleStrings.OWNER,\r\n children: [\r\n portalPages,\r\n homeScreens\r\n ]\r\n }\r\n ];\r\n } else {\r\n items.push(portalPages);\r\n items.push(homeScreens);\r\n }\r\n\r\n return items;\r\n}\r\n\r\nconst contributorOnlyMenu = (eventsEnabled: boolean) : IMenuItem[] => [\r\n {\r\n label: MenuItemLabel.MANAGE_MY_CONTENT,\r\n type: MenuItemType.Header,\r\n userRole: UserRoleStrings.CONTRIBUTOR,\r\n strictRole: true\r\n },\r\n {\r\n label: MenuItemLabel.POSTS,\r\n icon: ,\r\n type: MenuItemType.Link,\r\n url: \"~/admin/posts\",\r\n userRole: UserRoleStrings.CONTRIBUTOR,\r\n strictRole: true\r\n },\r\n {\r\n label: MenuItemLabel.EVENTS,\r\n icon: ,\r\n type: MenuItemType.Link,\r\n url: \"~/admin/events\",\r\n userRole: UserRoleStrings.CONTRIBUTOR,\r\n strictRole: true,\r\n hide: !eventsEnabled,\r\n }\r\n]\r\n\r\nconst menuItems = ({\r\n portalPagesEnabled,\r\n eventsEnabled,\r\n documentsEnabled,\r\n audiencesEnabled,\r\n currentUser,\r\n categoryTagsEnabled,\r\n homeScreenConfigEnabled,\r\n emailsManagementEnabled,\r\n shortcutsEnabled\r\n}: PropsWithRedux): IMenuItem[] => {\r\n let items: IMenuItem[] = [\r\n {\r\n label: MenuItemLabel.DASHBOARD,\r\n type: MenuItemType.Link,\r\n url: \"~/admin/dashboard\",\r\n icon: ,\r\n userRole: UserRoleStrings.AUTHOR\r\n },\r\n { label: MenuItemLabel.EMPTY, type: MenuItemType.Divider },\r\n {\r\n label: MenuItemLabel.CONTENT_MANAGEMENT,\r\n type: MenuItemType.Link,\r\n icon: ,\r\n userRole: UserRoleStrings.AUTHOR,\r\n children: [\r\n {\r\n label: MenuItemLabel.POSTS,\r\n type: MenuItemType.Link,\r\n url: \"~/admin/posts\",\r\n userRole: UserRoleStrings.AUTHOR,\r\n },\r\n {\r\n label: MenuItemLabel.EVENTS,\r\n type: MenuItemType.Link,\r\n url: \"~/admin/events\",\r\n userRole: UserRoleStrings.AUTHOR,\r\n hide: !eventsEnabled,\r\n },\r\n {\r\n label: MenuItemLabel.SURVEYS,\r\n type: MenuItemType.Link,\r\n url: \"~/admin/surveys\",\r\n userRole: UserRoleStrings.AUTHOR,\r\n },\r\n {\r\n label: MenuItemLabel.DOCUMENTS,\r\n type: MenuItemType.Link,\r\n url: \"~/admin/documents\",\r\n userRole: UserRoleStrings.AUTHOR,\r\n hide: !documentsEnabled,\r\n },\r\n {\r\n label: MenuItemLabel.SHORTCUTS,\r\n type: MenuItemType.Link,\r\n url: \"~/admin/shortcuts\",\r\n userRole: UserRoleStrings.OWNER,\r\n hide: !shortcutsEnabled ||\r\n !currentUser.roles.includes(UserRoleStrings.OWNER),\r\n }\r\n ],\r\n },\r\n {\r\n label: MenuItemLabel.TARGETTING_TOOLS,\r\n type: MenuItemType.Link,\r\n icon: ,\r\n userRole: UserRoleStrings.OWNER,\r\n children: [\r\n {\r\n label: MenuItemLabel.AUDIENCES,\r\n type: MenuItemType.Link,\r\n url: \"~/admin/audiences\",\r\n userRole: UserRoleStrings.OWNER,\r\n hide:\r\n !audiencesEnabled ||\r\n !currentUser.roles.includes(UserRoleStrings.OWNER),\r\n },\r\n {\r\n label: MenuItemLabel.TOPICS,\r\n type: MenuItemType.Link,\r\n url: \"~/admin/topics\",\r\n userRole: UserRoleStrings.OWNER,\r\n hide: !currentUser.roles.includes(UserRoleStrings.OWNER),\r\n },\r\n {\r\n label: MenuItemLabel.CATEGORY_TAGS,\r\n type: MenuItemType.Link,\r\n url: \"~/admin/categoryTags\",\r\n userRole: UserRoleStrings.OWNER,\r\n hide:\r\n !categoryTagsEnabled ||\r\n !currentUser.roles.includes(UserRoleStrings.OWNER),\r\n },\r\n ],\r\n },\r\n {\r\n label: MenuItemLabel.MESSAGING_CENTER,\r\n type: MenuItemType.Link,\r\n icon: ,\r\n userRole: UserRoleStrings.OWNER,\r\n children: [\r\n {\r\n label: MenuItemLabel.DIRECT_MESSAGING,\r\n type: MenuItemType.Link,\r\n url: \"~/admin/messaging\",\r\n userRole: UserRoleStrings.OWNER,\r\n },\r\n {\r\n label: MenuItemLabel.EMAILS,\r\n type: MenuItemType.Link,\r\n url: \"~/admin/emails\",\r\n userRole: UserRoleStrings.OWNER,\r\n hide: !emailsManagementEnabled\r\n },\r\n {\r\n label: MenuItemLabel.NEWSLETTERS,\r\n type: MenuItemType.Link,\r\n url: \"~/admin/newsletters\",\r\n userRole: UserRoleStrings.OWNER,\r\n },\r\n ],\r\n },\r\n { label: MenuItemLabel.EMPTY, type: MenuItemType.Divider }\r\n ];\r\n\r\n // handle channel layouts menu\r\n items = processPortalPagesAndHomeScreens(homeScreenConfigEnabled, portalPagesEnabled, items);\r\n\r\n items = [...items,\r\n {\r\n label: MenuItemLabel.MEDIA_GALLERY,\r\n type: MenuItemType.Link,\r\n icon: ,\r\n url: \"~/admin/gallery\",\r\n userRole: UserRoleStrings.AUTHOR,\r\n },\r\n {\r\n label: MenuItemLabel.ACTIVITY_TOOLS,\r\n type: MenuItemType.Link,\r\n icon: ,\r\n url: \"~/admin/activity\",\r\n userRole: UserRoleStrings.OWNER,\r\n },\r\n {\r\n label: MenuItemLabel.PLATFORM_ANALYTICS,\r\n type: MenuItemType.Link,\r\n icon: ,\r\n url: \"~/admin/insights\",\r\n userRole: UserRoleStrings.AUTHOR,\r\n },\r\n {\r\n label: MenuItemLabel.USER_PERMISSIONS,\r\n type: MenuItemType.Link,\r\n icon: ,\r\n url: \"~/admin/users\",\r\n userRole: UserRoleStrings.OWNER,\r\n },\r\n {\r\n label: MenuItemLabel.TENANT_CONFIGURATIONS,\r\n type: MenuItemType.Link,\r\n icon: ,\r\n url: \"~/admin/settings\",\r\n userRole: UserRoleStrings.OWNER,\r\n },\r\n { label: MenuItemLabel.EMPTY, type: MenuItemType.Divider },\r\n {\r\n label: MenuItemLabel.TENANT_MANAGEMENT,\r\n type: MenuItemType.Link,\r\n icon: ,\r\n url: \"~/admin/tenantManagement\",\r\n userRole: UserRoleStrings.SPARROW_SUPER_ADMIN,\r\n },\r\n ...contributorOnlyMenu(eventsEnabled),\r\n {\r\n label: MenuItemLabel.EMPTY,\r\n type: MenuItemType.Divider,\r\n userRole: UserRoleStrings.CONTRIBUTOR\r\n },\r\n {\r\n label: MenuItemLabel.COMAPANY_PORTAL,\r\n icon: ,\r\n type: MenuItemType.Link,\r\n url: \"~/home\",\r\n pushToBrowserHistory: true,\r\n }\r\n ];\r\n\r\n return items;\r\n};\r\n\r\n\r\nconst Menu: React.FunctionComponent = props => {\r\n const [expandedMenuItem, setExpandedMenuItem] = useState(\"\");\r\n const [updateDialogOpen, setUpdateDialogOpen] = useState(false);\r\n const classes = useStyles();\r\n const query = useQueryParams();\r\n const location = useLocation();\r\n const history = useHistory();\r\n\r\n const isContributor = getHighestRole(props.currentUser) === UserRoleStrings.CONTRIBUTOR;\r\n\r\n // toggle state value of updateDialogOpen\r\n const toggleUpdateDialogOpen = () => {\r\n setUpdateDialogOpen((prev) => !prev);\r\n };\r\n\r\n // handle default update options modal behaviour\r\n useEffect(() => {\r\n const showUpdateOptions = query.get(QUERY_PARAM_KEYS.OPEN_UPDATE_OPTIONS);\r\n if (showUpdateOptions) {\r\n // remove the query param for next time component renders\r\n const queryParams = new URLSearchParams(location.search);\r\n queryParams.delete(QUERY_PARAM_KEYS.OPEN_UPDATE_OPTIONS);\r\n history.replace({ search: queryParams.toString() });\r\n\r\n setUpdateDialogOpen(showUpdateOptions === \"true\");\r\n }\r\n }, [query, history, location.search]);\r\n\r\n const getDivider = (userRole: UserRoleStrings | undefined, index: number): JSX.Element | undefined=> {\r\n if (!isContributor || (isContributor && userRole === UserRoleStrings.CONTRIBUTOR))\r\n return ;\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n {menuItems(props).map((menuItem, index) => {\r\n switch (menuItem.type) {\r\n case MenuItemType.Divider:\r\n return getDivider(menuItem.userRole, index);\r\n \r\n case MenuItemType.Header:\r\n if (props.expand)\r\n return \r\n \r\n Manage My Content\r\n \r\n \r\n return <>;\r\n\r\n case MenuItemType.Link:\r\n const selected = new MenuUtils(props.tenant, props.locationPathName)\r\n .isLinkItemSelected(menuItem);\r\n\r\n return (\r\n \r\n ); \r\n default:\r\n return <>;\r\n }\r\n })}\r\n \r\n \r\n
\r\n
Powered by Sparrow Connected
\r\n
\r\n {process.env.REACT_APP_ADMINPORTAL_VERSION}\r\n {\r\n !isContributor &&\r\n <>\r\n |\r\n { toggleUpdateDialogOpen(); }}>\r\n Update Options\r\n \r\n \r\n }\r\n
\r\n
\r\n \r\n \r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n expand?: boolean;\r\n locationPathName: string;\r\n toggleExpand: () => void;\r\n tenant: string;\r\n drawerPaperClassName: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n audiencesEnabled: state.settings.tenantSettings.showFeatures.audiences,\r\n documentsEnabled: state.settings.tenantSettings.showFeatures.documentsEnabled && state.settings.tenantSettings.documentsEnabled,\r\n eventsEnabled: state.settings.tenantSettings.mobileEventsEnabled,\r\n categoryTagsEnabled: state.settings.tenantSettings.showFeatures.categoryTagsEnabled,\r\n portalPagesEnabled: state.settings.tenantSettings.showFeatures.portalPagesEnabled && state.settings.tenantSettings.portalPagesEnabled,\r\n homeScreenConfigEnabled: state.settings.tenantSettings.showFeatures.homeScreenConfigEnabled,\r\n currentUser: state.settings.currentUser,\r\n emailsManagementEnabled: state.settings.tenantSettings.showFeatures.emailManagementEnabled,\r\n shortcutsEnabled: state.settings.tenantSettings.showFeatures.shortcutsEnabled && state.settings.tenantSettings.shortcutsEnabled\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(Menu);\r\n","import { useState } from \"react\";\r\nimport Cookies from \"../../../utils/cookie\";\r\nimport { useMediaQuery, useTheme } from \"@mui/material\";\r\n\r\n/**\r\n * Encapsulate drawer expand logic\r\n * - read/set expand state into cookies\r\n * @param cookieKey - the cookie key value to store with\r\n * @param useSmallScreenLogic - whether or not to default closed if on small screen (currently only used for user portal)\r\n * @returns\r\n * expanded: boolean,\r\n * toggleExpanded: () => void\r\n */\r\n\r\nexport type DrawerStatus = {\r\n drawerExpanded: boolean;\r\n toggleDrawerExpanded: () => void;\r\n}\r\n\r\nconst useDrawerExpanded = (cookieKey: string, useSmallScreenLogic: boolean = false): DrawerStatus => {\r\n const theme = useTheme();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down('sm'), { noSsr: true });\r\n\r\n /**\r\n * try get default expanded from cookies\r\n * - if doesn't exist default to expanded\r\n * @returns boolean\r\n */\r\n const getDefaultExpandedState = (): boolean => {\r\n const savedExpandedSetting = Cookies.get(\r\n cookieKey\r\n );\r\n\r\n let result: boolean;\r\n // default to expanded if no saved value\r\n if (savedExpandedSetting === undefined) result = true;\r\n // convert the stored string to boolean\r\n else result = savedExpandedSetting === \"true\";\r\n\r\n return useSmallScreenLogic && isSmallAndSmaller\r\n ? false\r\n : result;\r\n };\r\n\r\n\r\n const [drawerExpanded, setDrawerExpanded] = useState(getDefaultExpandedState());\r\n\r\n // toggle drawer expanded state\r\n const toggleDrawerExpanded = () => {\r\n setDrawerExpanded((prev) => {\r\n // update state and save value in cookies\r\n let newValue = !prev;\r\n Cookies.setWithOpts(\r\n cookieKey,\r\n newValue.toString(),\r\n { expires: 365 }\r\n );\r\n\r\n return newValue;\r\n });\r\n };\r\n\r\n return { drawerExpanded, toggleDrawerExpanded };\r\n}\r\n\r\nexport default useDrawerExpanded;\r\n","import React from \"react\";\r\n\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { Theme } from \"@mui/material/styles\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { withAITracking } from \"@microsoft/applicationinsights-react-js\";\r\nimport { appInsightsReactPlugin } from \"appInsights\";\r\nimport { withRouter, RouteComponentProps } from \"react-router\";\r\n\r\nimport AdminPortalSplashScreen from \"modules/common/components/splash-screens/adminPortalSplashScreen\";\r\nimport Header from \"../../../modules/common/components/header/Header\";\r\nimport { GlobalApplicationState } from \"../../../globalApplicationState\";\r\nimport CookieBanner from \"../common/components/CookieBanner\";\r\nimport Menu from \"./components/Menu\";\r\nimport { COMMON_COOKIE_KEYS } from \"../../../utils/cookie\";\r\nimport useDrawerExpanded from \"modules/common/hooks/useDrawerExpanded\";\r\n\r\nimport \"./index.sass\";\r\n\r\nconst drawerWidth = 62;\r\nconst expandedDrawerWidth = 254;\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n main: {\r\n display: \"flex\",\r\n maxHeight: `calc(100vh - 48px)`,\r\n minHeight: `calc(100vh - 48px)`,\r\n overflow: \"hidden\",\r\n position: \"relative\"\r\n },\r\n drawer: {\r\n flexShrink: 0,\r\n position: \"relative\",\r\n transition: \"width linear 0.2s\",\r\n width: drawerWidth,\r\n \"&.expanded\": {\r\n width: expandedDrawerWidth,\r\n \"& $drawerPaper\": {\r\n width: expandedDrawerWidth\r\n }\r\n }\r\n },\r\n drawerPaper: {\r\n backgroundColor: theme.palette.background.default,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"space-between\",\r\n overflow: \"hidden\",\r\n position: \"absolute\",\r\n transition: \"width linear 0.2s\",\r\n width: drawerWidth,\r\n zIndex: 1\r\n },\r\n content: {\r\n flexGrow: 1,\r\n overflow: \"auto\",\r\n padding: \"12px 0\",\r\n position: \"relative\",\r\n zIndex: 0\r\n }\r\n })\r\n);\r\n\r\nconst Layout: React.FunctionComponent = props => {\r\n const { location, tenant, displayName } = props;\r\n const classes = useStyles();\r\n const isFullEditScreen = location.pathname.indexOf(\"/admin/portalPages/edit/\") !== -1;\r\n const { drawerExpanded, toggleDrawerExpanded } = useDrawerExpanded(COMMON_COOKIE_KEYS.ADMIN_DRAWER_EXPANDED);\r\n\r\n // re-factor\r\n const showBarAndMenu = !(\r\n location.pathname.includes(\"/posts/edit\") || \r\n location.pathname.includes(\"admin/contentBands/editor\") || \r\n location.pathname.includes(\"/guidelines\") ||\r\n location.pathname.includes(\"admin/emails/edit/\")\r\n ); \r\n\r\n return (\r\n
\r\n {showBarAndMenu &&
}\r\n
\r\n {props.adminLayout.shouldDisplayNav &&\r\n \r\n }\r\n \r\n {props.children}\r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nclass AdminAppLayout extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n displaySplashScreen: false\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n document.title = \"Admin Portal\";\r\n\r\n let favicon: any = document.querySelector(\"link[rel~='icon']\");\r\n if (!!favicon)\r\n favicon.href = \"/favicon-admin.png\";\r\n\r\n if (!!this.props.history.location.state && !!this.props.history.location.state.prevPath && !this.props.history.location.state.prevPath.includes(\"/admin/\"))\r\n this.setState({ displaySplashScreen: true });\r\n }\r\n\r\n public render() {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n userIsInternalOnly?: boolean;\r\n}\r\n\r\ninterface ComponentState {\r\n displaySplashScreen: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenant: state.tenant,\r\n displayName: state.settings.tenantSettings.displayName,\r\n adminLayout: state.adminLayout\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps & RouteComponentProps<{}>;\r\n\r\nexport default withRouter(connector(withAITracking(appInsightsReactPlugin, AdminAppLayout)));\r\n","import React, { useEffect, useState } from \"react\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n image: {\r\n boxSizing: \"border-box\",\r\n height: \"100%\",\r\n maxHeight: \"100vh\",\r\n maxWidth: \"100vw\",\r\n objectFit: \"contain\",\r\n padding: \"25px 0 50px 0\"\r\n },\r\n message: {\r\n position: \"absolute\",\r\n fontSize: 14,\r\n bottom: 20,\r\n left: 0,\r\n right: 0\r\n },\r\n screenBase: {\r\n position: \"relative\",\r\n backgroundImage: \"url('/images/portal-bg.png')\",\r\n backgroundPosition: \"top left\",\r\n backgroundRepeat: \"no-repeat\",\r\n backgroundSize: \"cover\",\r\n fontFamily: theme.typography.fontFamily,\r\n height: \"100vh\",\r\n textAlign: \"center\"\r\n }\r\n })\r\n);\r\n\r\nconst RedirectingToUserPortal: React.FunctionComponent = props => {\r\n const [display, setDisplay] = useState(true);\r\n const [timestamp] = useState(new Date().getTime());\r\n const classes = useStyles();\r\n\r\n useEffect(() => {\r\n const timer = setTimeout(() => setDisplay(false), 3000);\r\n return () => {\r\n clearTimeout(timer);\r\n };\r\n }, []);\r\n \r\n if (props.displaySplashScreen && display)\r\n return (\r\n
\r\n \"redirecting\r\n
Redirecting you to the Company Portal...
\r\n
\r\n );\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n displaySplashScreen?: boolean;\r\n}\r\n\r\nexport default RedirectingToUserPortal;","import React, { useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport { IMenuItem, MenuItem, MenuItemType, MenuItemLabel } from \"../../common/components/MenuItem\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport Drawer from \"@mui/material/Drawer\";\r\nimport List from \"@mui/material/List\";\r\nimport { Theme } from \"@mui/material/styles\";\r\nimport createStyles from \"@mui/styles/createStyles\";\r\nimport makeStyles from \"@mui/styles/makeStyles\";\r\nimport AccountCircleOutlinedIcon from \"@mui/icons-material/AccountCircleOutlined\";\r\nimport BuildIcon from \"@mui/icons-material/Build\";\r\nimport EventOutlinedIcon from \"@mui/icons-material/EventOutlined\";\r\nimport FolderOutlinedIcon from \"@mui/icons-material/FolderOutlined\";\r\nimport HomeOutlinedIcon from \"@mui/icons-material/HomeOutlined\";\r\nimport LibraryBooksIcon from \"@mui/icons-material/LibraryBooks\";\r\nimport MenuBookIcon from \"@mui/icons-material/MenuBook\";\r\nimport PostAddIcon from '@mui/icons-material/PostAdd';\r\nimport { MenuUtils } from \"routes/_layout/common/menuUtils\";\r\nimport LinkIcon from \"@mui/icons-material/Link\";\r\nimport { ShortcutGroupToShortcuts } from \"modules/shortcuts/models\";\r\nimport { useMediaQuery, useTheme } from \"@mui/material\";\r\n\r\nconst useStyles = makeStyles<\r\n Theme, \r\n { \r\n drawerExpanded: boolean, \r\n drawerWidth: number, \r\n expandedDrawerWidth: number\r\n }\r\n>((theme: Theme) =>\r\n createStyles({\r\n list: {\r\n position: \"static\"\r\n },\r\n poweredBy: {\r\n color: \"#aaaaaa\",\r\n fontSize: 10,\r\n marginBottom: 10,\r\n marginLeft: 23,\r\n marginTop: 10,\r\n opacity: 0,\r\n \"&.expanded\": {\r\n opacity: 1,\r\n transition: \"opacity linear 0.1s 0.2s\"\r\n }\r\n }\r\n })\r\n);\r\n\r\nconst MenuItems = (\r\n props: PropsWithRedux\r\n): IMenuItem[] => {\r\n let items: IMenuItem[] = [];\r\n\r\n if (props.portalPagesEnabled && !!props.navigation.navigationItems.length) {\r\n items = [\r\n { label: MenuItemLabel.HOME, icon: , type: MenuItemType.Link, url: \"~/home\" }\r\n ];\r\n\r\n if (props.portalPagesEnabled && props.navigation.navigationItems.length > 1) {\r\n items = items.concat([\r\n {\r\n label: MenuItemLabel.PORTAL_PAGES, icon: , type: MenuItemType.Link, children: props.navigation.navigationItems.slice(1).map((navigationItem) => (\r\n {\r\n label: navigationItem.name, type: MenuItemType.Link, url: `~/page/${navigationItem.url}`, children: navigationItem.children.map((childNavigationItem) => (\r\n { label: childNavigationItem.name, type: MenuItemType.Link, url: `~/page/${childNavigationItem.url}` }\r\n ))\r\n }\r\n ))\r\n }\r\n ]);\r\n }\r\n\r\n items = items.concat([\r\n { label: MenuItemLabel.EMPTY, type: MenuItemType.Divider },\r\n { label: MenuItemLabel.FEED, icon: , type: MenuItemType.Link, url: \"~/posts\" }\r\n ]);\r\n } else {\r\n items = [\r\n { label: MenuItemLabel.FEED, icon: , type: MenuItemType.Link, url: \"~/home\" }\r\n ];\r\n }\r\n\r\n items = items.concat([\r\n { label: MenuItemLabel.EVENTS, icon: , type: MenuItemType.Link, url: \"~/events\", hide: !props.eventsEnabled },\r\n { label: MenuItemLabel.DOCUMENTS, icon: , type: MenuItemType.Link, url: \"~/documents\", hide: !props.documentsEnabled },\r\n { \r\n label: MenuItemLabel.SHORTCUTS, \r\n icon: , \r\n type: MenuItemType.Button, \r\n hide: !props.shortcutsEnabled || \r\n props.shortcutsList.length === 0 ||\r\n props.shortcutsList.flatMap(sgts => sgts.shortcuts).length === 0,\r\n buttonItemSelected: props.expandShortcutsList\r\n },\r\n { label: MenuItemLabel.EMPTY, type: MenuItemType.Divider},\r\n { label: MenuItemLabel.PROFILE, icon: , type: MenuItemType.Link, url: \"~/me\" },\r\n { label: MenuItemLabel.EMPTY, type: MenuItemType.Divider },\r\n { label: MenuItemLabel.ADMIN_PORTAL, type: MenuItemType.Link, icon: , pushToBrowserHistory: true, url: \"~/admin/dashboard\", userRole: UserRoleStrings.AUTHOR },\r\n { label: MenuItemLabel.MANAGE_MY_POSTS, type: MenuItemType.Link, icon: , pushToBrowserHistory: true, url: \"~/admin/posts\", userRole: UserRoleStrings.CONTRIBUTOR, strictRole: true },\r\n ]);\r\n\r\n return items;\r\n}\r\n\r\nconst SignInMenuItem = (): IMenuItem => {\r\n return { label: MenuItemLabel.SIGN_IN, icon: , type: MenuItemType.Link, url: \"~/\" };\r\n}\r\n\r\nconst Menu: React.FunctionComponent = props => {\r\n const [expandedMenuItem, setExpandedMenuItem] = useState(\"\");\r\n const theme = useTheme();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down('sm'), { noSsr: true });\r\n\r\n const classes = useStyles({\r\n drawerExpanded: props.expand, \r\n drawerWidth: props.drawerWidth,\r\n expandedDrawerWidth: props.expandedDrawerWidth\r\n });\r\n\r\n return (\r\n \r\n \r\n {!props.publicAccess\r\n ? MenuItems(props).map((menuItem, index) => {\r\n switch (menuItem.type) {\r\n case MenuItemType.Divider:\r\n return ;\r\n case MenuItemType.Link:\r\n const isLinkSelected = new MenuUtils(props.tenant, props.locationPathName)\r\n .isLinkItemSelected(menuItem);\r\n return (\r\n \r\n );\r\n case MenuItemType.Button:\r\n const isButtonSelected = menuItem.buttonItemSelected ?? false;\r\n return (\r\n \r\n );\r\n default:\r\n return <>;\r\n }\r\n })\r\n : \r\n }\r\n \r\n
\r\n
Powered by Sparrow Connected
\r\n
{process.env.REACT_APP_ADMINPORTAL_VERSION}
\r\n
\r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n expand: boolean;\r\n locationPathName: string;\r\n publicAccess?: boolean;\r\n toggleExpand: () => void;\r\n tenant: string;\r\n drawerPaperClassName: string;\r\n hideIcons?: boolean;\r\n drawerWidth: number;\r\n expandedDrawerWidth: number;\r\n shortcutsList: ShortcutGroupToShortcuts[];\r\n expandShortcutsList: boolean;\r\n onMenuItemClicked?: (menuItem: IMenuItem) => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n documentsEnabled: state.settings.clientSettings.documentsEnabled,\r\n eventsEnabled: state.settings.clientSettings.mobileEventsEnabled,\r\n navigation: state.portalPages.navigation,\r\n portalPagesEnabled: state.settings.clientSettings.portalPagesEnabled,\r\n currentUser: state.settings.currentUser,\r\n shortcutsEnabled: state.settings.clientSettings.shortcutsEnabled\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(Menu);\r\n","import React from \"react\";\r\nimport { List, ListItem, ListItemIcon, ListItemText } from \"@mui/material\";\r\nimport { ShortcutGroupToShortcuts } from \"modules/shortcuts/models\";\r\nimport LinkIcon from '@mui/icons-material/Link';\r\nimport { loggedEventsApi } from \"api/instances\";\r\n\r\nimport \"../../styles/shortcutsFeedList.sass\";\r\n\r\nconst MAX_URL_DISPLAY_LENGTH = 35;\r\n\r\ninterface IShortcutsFeedListProps {\r\n shortcutsList: ShortcutGroupToShortcuts[];\r\n delayShowListItemsInMs?: number; // for setting the delay in ms for showing the list items. If this is set, you must also set the isListShowing prop\r\n isListShowing?: boolean; // paired with the delay, this is to ensure that the list will immediately dissapear if the parent component isn't showing anymore\r\n}\r\n\r\nconst ShortcutsFeedList: React.FC = ({\r\n shortcutsList,\r\n delayShowListItemsInMs,\r\n isListShowing\r\n}) => {\r\n const getDisplayUrl = (url: string) => url.length > MAX_URL_DISPLAY_LENGTH\r\n ? url.slice(0, MAX_URL_DISPLAY_LENGTH - 3) + \"...\"\r\n : url;\r\n\r\n const [contentVisible, setContentVisible] = React.useState(delayShowListItemsInMs === undefined);\r\n\r\n React.useEffect(() => {\r\n if (delayShowListItemsInMs !== undefined && isListShowing !== undefined) {\r\n isListShowing \r\n ? setTimeout(() => setContentVisible(true), delayShowListItemsInMs)\r\n : setContentVisible(false);\r\n }\r\n }, [delayShowListItemsInMs, isListShowing]);\r\n\r\n const onClick = async (shortcutId: string) => {\r\n await loggedEventsApi.sendShortcutOpenedEvent(shortcutId);\r\n }\r\n \r\n return \r\n {\r\n contentVisible &&\r\n shortcutsList\r\n .filter(sgts => sgts.shortcuts.length > 0)\r\n .map(sgts =>\r\n \r\n \r\n \r\n {sgts.shortcutGroup.name}\r\n \r\n \r\n {\r\n sgts.shortcuts.map(s =>\r\n \r\n \r\n onClick(s.id)}\r\n >\r\n {getDisplayUrl(s.url)}\r\n \r\n }\r\n />\r\n \r\n )\r\n }\r\n \r\n )\r\n }\r\n ;\r\n};\r\n\r\nexport default ShortcutsFeedList;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport Header from \"../../../modules/common/components/header/Header\";\r\nimport { GlobalApplicationState } from \"../../../globalApplicationState\";\r\nimport { connect, ConnectedProps, useDispatch, useSelector } from \"react-redux\";\r\nimport UserPortalSplashScreen from \"modules/common/components/splash-screens/userPortalSplashScreen\";\r\nimport useDrawerExpanded from \"modules/common/hooks/useDrawerExpanded\";\r\nimport { COMMON_COOKIE_KEYS } from \"utils/cookie\";\r\nimport CookieBanner from \"../common/components/CookieBanner\";\r\nimport Menu from \"./components/Menu\";\r\nimport { Theme } from \"@mui/material/styles\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { withAITracking } from \"@microsoft/applicationinsights-react-js\";\r\nimport { appInsightsReactPlugin } from \"appInsights\";\r\nimport { Drawer, useMediaQuery, useTheme } from \"@mui/material\";\r\nimport { withRouter, RouteComponentProps } from \"react-router\";\r\nimport ShortcutsFeedList from \"modules/shortcuts/components/feedList/shortcutsFeedList\";\r\nimport { getShortcutsFeed } from \"modules/shortcuts/reducer\";\r\nimport { MenuItemLabel } from \"../common/components/MenuItem\";\r\n\r\nimport \"./index.sass\";\r\n\r\nconst DRAWER_WIDTH = 62;\r\nconst EXPANDED_DRAWER_WIDTH = 230;\r\nconst HEADER_HEIGHT = 48;\r\nconst EXPANDED_SHORTCUTS_DRAWER_WIDTH = 330;\r\nconst DEFAULT_DRAWER_BOX_SHADOW = \"0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)\";\r\nconst DEFAULT_DRAWER_RIGHT_BORDER = \"1px solid rgba(0, 0, 0, 0.12)\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n main: {\r\n display: \"flex\",\r\n maxHeight: `calc(100vh - ${HEADER_HEIGHT}px)`,\r\n minHeight: `calc(100vh - ${HEADER_HEIGHT}px)`,\r\n overflow: \"hidden\",\r\n position: \"relative\"\r\n },\r\n drawer: ({ isSmallAndSmaller, drawerExpanded }) => ({\r\n flexShrink: 0,\r\n position: \"relative\",\r\n transition: \"width linear 0.2s\",\r\n width: (!isSmallAndSmaller || drawerExpanded)\r\n ? DRAWER_WIDTH\r\n : 0,\r\n \"&.expanded\": {\r\n width: isSmallAndSmaller\r\n ? \"100%\"\r\n : EXPANDED_DRAWER_WIDTH,\r\n \"& $drawerPaper\": {\r\n width: isSmallAndSmaller\r\n ? \"100%\"\r\n : EXPANDED_DRAWER_WIDTH,\r\n }\r\n },\r\n zIndex: theme.zIndex.drawer + 1\r\n }),\r\n drawerPaper: ({ isSmallAndSmaller, drawerExpanded, expandShortcutsList }) => ({\r\n backgroundColor: theme.palette.background.default,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"space-between\",\r\n overflow: \"visible\",\r\n position: \"absolute\",\r\n transition: \"width linear 0.2s\",\r\n width: (!isSmallAndSmaller || drawerExpanded)\r\n ? DRAWER_WIDTH\r\n : 0,\r\n boxShadow : expandShortcutsList ? \"none\" : DEFAULT_DRAWER_BOX_SHADOW,\r\n borderRight: expandShortcutsList ? \"none\" : DEFAULT_DRAWER_RIGHT_BORDER\r\n }),\r\n content: {\r\n flexGrow: 1,\r\n overflow: \"auto\",\r\n padding: 12,\r\n position: \"relative\",\r\n zIndex: 0,\r\n \"& .portal-page\": {\r\n margin: -12\r\n }\r\n },\r\n shortcutsDrawerPaper: ({ isSmallAndSmaller, drawerExpanded, expandShortcutsList }) => {\r\n const currentDrawerWidth = drawerExpanded ? EXPANDED_DRAWER_WIDTH : DRAWER_WIDTH;\r\n\r\n return {\r\n backgroundColor: theme.palette.background.default,\r\n left: isSmallAndSmaller ? 0 : currentDrawerWidth,\r\n width: isSmallAndSmaller ? '100%' : currentDrawerWidth + EXPANDED_SHORTCUTS_DRAWER_WIDTH,\r\n boxShadow: expandShortcutsList ? DEFAULT_DRAWER_BOX_SHADOW : 'none',\r\n overflowX: 'clip',\r\n top: isSmallAndSmaller ? undefined : HEADER_HEIGHT,\r\n height: isSmallAndSmaller ? '50%' : '95%'\r\n }\r\n },\r\n shortcutsDrawerBackdropRoot: ({ isSmallAndSmaller, drawerExpanded }) => {\r\n const currentDrawerWidth = drawerExpanded ? EXPANDED_DRAWER_WIDTH : DRAWER_WIDTH;\r\n\r\n return {\r\n backgroundColor: isSmallAndSmaller ? undefined : 'initial',\r\n left: isSmallAndSmaller ? 0 : currentDrawerWidth + EXPANDED_SHORTCUTS_DRAWER_WIDTH\r\n }\r\n \r\n }\r\n })\r\n);\r\n\r\nconst Layout: React.FunctionComponent = ({\r\n publicAccess,\r\n clientName,\r\n tenant,\r\n location,\r\n children\r\n}) => {\r\n const { drawerExpanded, toggleDrawerExpanded } = useDrawerExpanded(COMMON_COOKIE_KEYS.USER_DRAWER_EXPANDED, true);\r\n const theme = useTheme();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down('sm'), { noSsr: true });\r\n const [expandShortcutsList, setExpandShortcutsList] = useState(false);\r\n const [lastExpandedState, setLastExpandedState] = useState(drawerExpanded);\r\n const shortcutsList = useSelector((state: GlobalApplicationState) => state.shortcuts.shortcutFeed);\r\n const dispatch = useDispatch();\r\n const classes = useStyles({ isSmallAndSmaller, drawerExpanded, expandShortcutsList });\r\n\r\n useEffect(() => {\r\n dispatch(getShortcutsFeed());\r\n }, []);\r\n\r\n const toggleShortcuts = () => { \r\n if (expandShortcutsList) {\r\n setExpandShortcutsList(false);\r\n\r\n if (lastExpandedState !== drawerExpanded && !isSmallAndSmaller)\r\n toggleDrawerExpanded();\r\n }\r\n else {\r\n setLastExpandedState(drawerExpanded);\r\n\r\n if (drawerExpanded)\r\n toggleDrawerExpanded();\r\n\r\n setExpandShortcutsList(true);\r\n }\r\n }\r\n\r\n const toggleExpand = () => {\r\n setExpandShortcutsList(false);\r\n toggleDrawerExpanded();\r\n }\r\n\r\n return (\r\n
\r\n \r\n
\r\n \r\n toggleShortcuts()}\r\n variant=\"temporary\"\r\n classes={{ paper: classes.shortcutsDrawerPaper }}\r\n ModalProps={{ BackdropProps: { classes: { root: classes.shortcutsDrawerBackdropRoot } } }}\r\n anchor={ isSmallAndSmaller ? 'bottom' : 'left' }\r\n >\r\n \r\n \r\n
\r\n {children}\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nclass UserAppLayout extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n displaySplashScreen: false\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n document.title = this.props.clientName || \"Loading...\";\r\n\r\n let favicon: any = document.querySelector(\"link[rel~='icon']\");\r\n if (!!favicon)\r\n favicon.href = \"/favicon.png\";\r\n\r\n if (!!this.props.history.location.state && !!this.props.history.location.state.prevPath && this.props.history.location.state.prevPath.includes(\"/admin/\"))\r\n this.setState({ displaySplashScreen: true });\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (!!this.props.clientName && !prevProps.clientName)\r\n document.title = this.props.clientName;\r\n }\r\n\r\n public render() {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n publicAccess?: boolean;\r\n}\r\n\r\ninterface ComponentState {\r\n displaySplashScreen: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n clientName: state.settings.clientSettings.displayName,\r\n tenant: state.tenant\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps & RouteComponentProps<{}>;\r\n\r\nexport default withRouter(connector(withAITracking(appInsightsReactPlugin, UserAppLayout)));\r\n","import * as React from \"react\";\r\nimport { FormattedMessage } from \"react-intl\";\r\n\r\nclass InsufficientPermissions extends React.Component<{}, {}> {\r\n\r\n public render() {\r\n return (\r\n
\r\n

\r\n \r\n

\r\n

\r\n \r\n

\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default InsufficientPermissions;\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as portalPagesActions from \"modules/portalPages/actionCreator\";\r\nimport * as settingsActions from \"modules/settings/actionCreator\";\r\nimport * as resourceActions from \"modules/resources/actionCreator\";\r\nimport { withRouter, RouteComponentProps } from \"react-router\";\r\n\r\nclass ClientRouteWrapper extends React.Component {\r\n public async componentDidMount() {\r\n let path = this.props.location.pathname.split(`${this.props.match.url}/`);\r\n this.props.history.replace(`/${this.props.tenantId}/${path[1] !== undefined ? path[1] : \"home\"}`);\r\n\r\n //Await first call in case the token is expired, if we do not await then it will call all \r\n //others and fail the requests with unauthorized. (This is due to the popup for MSAL)\r\n await this.props.getLCIDMappings();\r\n await Promise.all([\r\n this.props.getClientSettings(),\r\n this.props.getCurrentUser(),\r\n this.props.getNavigation(),\r\n this.props.getNotificationSettings(),\r\n this.props.getUserTagSettings(),\r\n ]);\r\n }\r\n\r\n public render() {\r\n return
{this.props.children}
;\r\n }\r\n}\r\n\r\ninterface RouteParams {\r\n tenant: string;\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id,\r\n }),\r\n {\r\n getClientSettings: settingsActions.getClientSettings,\r\n getLCIDMappings: resourceActions.getLCIDMappings,\r\n getCurrentUser: settingsActions.getUserSettings,\r\n getNavigation: portalPagesActions.getNavigation,\r\n getNotificationSettings: settingsActions.getNotificationSettings,\r\n getUserTagSettings: settingsActions.getUserTagSettings\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default withRouter(connector(ClientRouteWrapper));\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as settingsActions from \"modules/settings/actionCreator\";\r\nimport * as resourceActions from \"modules/resources/actionCreator\";\r\nimport { withRouter, RouteComponentProps } from \"react-router\";\r\n\r\nclass TenantRouteWrapper extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n isLoading: true\r\n };\r\n }\r\n\r\n public async componentDidMount() {\r\n let pathArr = this.props.location.pathname.split(`${this.props.match.url}/`);\r\n const path = `/${this.props.tenantId}/admin/${pathArr[1] !== undefined ? `${pathArr[1]}` : \"dashboard\"}${this.props.location.search}`;\r\n\r\n this.props.history.replace(path);\r\n\r\n //Await first call in case the token is expired, if we do not await then it will call all \r\n //others and fail the requests with unauthorized. (This is due to the popup for MSAL)\r\n await this.props.getLCIDMappings();\r\n await Promise.all([\r\n this.props.getCurrentUser(),\r\n this.props.getEmailResource(),\r\n this.props.getSMSResource(),\r\n this.props.getMobileResource(),\r\n this.props.getNotificationSettings(),\r\n this.props.getTenantConfig()\r\n ]);\r\n\r\n this.setState({isLoading: false});\r\n }\r\n\r\n public render() {\r\n return
{!this.state.isLoading ? this.props.children : null}
;\r\n }\r\n}\r\n\r\ninterface RouteParams {\r\n tenant: string;\r\n}\r\n\r\ninterface ComponentState {\r\n isLoading: boolean;\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id,\r\n }),\r\n {\r\n getTenantConfig: settingsActions.getTenantSettings,\r\n getLCIDMappings: resourceActions.getLCIDMappings,\r\n getEmailResource: resourceActions.getEmailResource,\r\n getSMSResource: resourceActions.getSMSResource,\r\n getMobileResource: resourceActions.getMobileResource,\r\n getCurrentUser: settingsActions.getUserSettings,\r\n getNotificationSettings: settingsActions.getNotificationSettings,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default withRouter(connector(TenantRouteWrapper));\r\n","import * as React from \"react\"\r\nimport TenantLink from \"modules/common/components/tenantLink\";\r\n\r\nexport interface DashboardTileProps {\r\n actionText: string;\r\n materialIconName?: string;\r\n materialIconColor?: string;\r\n linkTo?: string;\r\n icon?: JSX.Element;\r\n}\r\n\r\nexport default class DashboardTile extends React.PureComponent {\r\n public render() {\r\n return (\r\n \r\n {this.props.icon\r\n ? this.props.icon\r\n : {this.props.materialIconName}}\r\n \r\n {this.props.actionText}\r\n \r\n \r\n );\r\n }\r\n}\r\n","import * as React from \"react\";\r\nimport LoadingCircle from \"modules/common/components/loadingCircle\";\r\n\r\ninterface ComponentProps {\r\n mssg: string;\r\n}\r\n\r\nexport default class AnalyticsErrorBanner extends React.Component {\r\n public render() {\r\n return (\r\n
\r\n
\r\n \r\n
\r\n {this.props.mssg}\r\n\r\n
\r\n );\r\n }\r\n}","import * as React from \"react\";\r\nimport RequireRole from \"modules/common/components/requireRole\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport DashboardTile from \"./dashboardTile\";\r\nimport { injectIntl, IntlShape } from \"react-intl\";\r\nimport AnalyticsErrorBanner from \"modules/common/components/analyticsErrorBanner\";\r\nimport { connect, ConnectedProps } from \"react-redux\"\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { ViewCarouselOutlined } from \"@mui/icons-material\";\r\n\r\nclass Dashboard extends React.Component {\r\n public render() {\r\n const formatMessage = this.props.intl.formatMessage;\r\n return (\r\n
\r\n {this.props.bannerMessage &&\r\n \r\n \r\n
\r\n \r\n }\r\n
\r\n \r\n \r\n \r\n {this.props.eventsEnabled &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n {this.props.showFeatures && this.props.showFeatures.documentsEnabled &&\r\n \r\n \r\n \r\n }\r\n {this.props.shortcutsEnabled &&\r\n \r\n \r\n \r\n }\r\n {this.props.showFeatures && this.props.showFeatures.audiences &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n {this.props.showFeatures && this.props.showFeatures.categoryTagsEnabled &&\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n this.props.showFeatures && this.props.showFeatures.emailManagementEnabled &&\r\n \r\n \r\n \r\n }\r\n {this.props.showFeatures && this.props.showFeatures.portalPagesEnabled && this.props.portalPagesEnabled &&\r\n \r\n \r\n \r\n }\r\n {this.props.showFeatures && this.props.showFeatures.homeScreenConfigEnabled &&\r\n \r\n }\r\n actionText=\"Home Screens\"\r\n linkTo=\"~/admin/homeScreens\"\r\n />\r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n
\r\n );\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n intl: IntlShape;\r\n}\r\n\r\ninterface ComponentState {\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n androidAppUrl: state.settings.tenantSettings.androidAppUrl,\r\n bannerMessage: state.settings.tenantSettings.bannerMessage,\r\n documentsEnabled: state.settings.tenantSettings.showFeatures.documentsEnabled && state.settings.tenantSettings.documentsEnabled,\r\n eventsEnabled: state.settings.tenantSettings.mobileEventsEnabled,\r\n iosAppUrl: state.settings.tenantSettings.iosAppUrl,\r\n showFeatures: state.settings.tenantSettings.showFeatures,\r\n portalPagesEnabled: state.settings.tenantSettings.showFeatures.portalPagesEnabled && state.settings.tenantSettings.portalPagesEnabled,\r\n shortcutsEnabled: state.settings.tenantSettings.shortcutsEnabled\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default injectIntl(connector(Dashboard))\r\n","import React from \"react\";\r\n\r\nimport Container from \"@mui/material/Container\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n basePage: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n height: \"100%\"\r\n },\r\n container: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n height: \"100%\"\r\n }\r\n })\r\n);\r\n\r\n\r\nconst BasePage: React.FunctionComponent = props => {\r\n const classes = useStyles();\r\n\r\n return (\r\n
\r\n \r\n \r\n {props.children}\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n fullWidth?: boolean;\r\n id?: string;\r\n}\r\n\r\nexport default BasePage;\r\n","import React from \"react\"\r\n\r\nimport Typography from \"@mui/material/Typography\";\r\nimport { Theme } from \"@mui/material/styles\";\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n header: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n height: 48,\r\n marginBottom: 10,\r\n minHeight: 48\r\n },\r\n headerOptions: {\r\n display: \"inline-flex\",\r\n \"& button, & div\": {\r\n marginRight: 8,\r\n \"&:last-child\": {\r\n marginRight: 0\r\n }\r\n }\r\n },\r\n title: {\r\n display: \"inline-flex\",\r\n alignItems: \"center\"\r\n }\r\n })\r\n);\r\n\r\nconst Header: React.FunctionComponent = props => {\r\n const classes = useStyles();\r\n \r\n return (\r\n
\r\n {props.title}\r\n {props.rightComponent &&\r\n
{props.rightComponent}
\r\n }\r\n
\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n rightComponent?: JSX.Element;\r\n title: string | JSX.Element;\r\n}\r\n\r\nexport default Header;","import React from \"react\"\r\n\r\nimport Paper from \"@mui/material/Paper\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\n\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n paper: {\r\n boxSizing: \"border-box\",\r\n flexShrink: 1,\r\n flexGrow: 0,\r\n maxHeight: \"100%\",\r\n overflowY: \"auto\",\r\n \"&.add-content-padding\": {\r\n padding: 20\r\n },\r\n \"&.add-content-padding-10\": {\r\n padding: 10\r\n },\r\n \"&.add-margin-top\": {\r\n marginTop: 15\r\n },\r\n \"&.full-height\": {\r\n height: '100%'\r\n }\r\n }\r\n })\r\n);\r\n\r\n\r\nconst MainContent: React.FunctionComponent = props => {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n id?: string;\r\n addPadding?: boolean;\r\n addPadding10?: boolean;\r\n addMarginTop?: boolean;\r\n className?: string;\r\n fullHeight?: boolean;\r\n elevation?: number;\r\n}\r\n\r\nexport default MainContent;\r\n","import React from \"react\";\r\n\r\nimport Paper from \"@mui/material/Paper\";\r\nimport MuiTab from \"@mui/material/Tab\";\r\nimport MuiTabs from \"@mui/material/Tabs\";\r\nimport { Theme } from \"@mui/material/styles\";\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n tabNavigation: {\r\n alignItems: \"center\",\r\n display: \"flex\",\r\n height: 48,\r\n justifyContent: \"space-between\",\r\n position: \"sticky\",\r\n top: 0,\r\n zIndex: 3\r\n },\r\n tabItem: {\r\n textTransform: \"none\",\r\n minWidth: 160\r\n },\r\n tabDottedItem: {\r\n paddingLeft: 28\r\n },\r\n tabDottedLabel: {\r\n position: \"relative\",\r\n width: \"fit-content\",\r\n \"&::before\": {\r\n content: `\"\"`,\r\n borderRadius: \"50%\",\r\n height: 8,\r\n left: -16,\r\n marginTop: 4,\r\n position: \"absolute\",\r\n width: 8\r\n },\r\n \"&.green::before\": {\r\n backgroundColor: \"#3b6531\"\r\n },\r\n \"&.grey::before\": {\r\n backgroundColor: \"#adb7c1\"\r\n },\r\n \"&.yellow::before\": {\r\n backgroundColor: \"#e9b848\"\r\n },\r\n \"&.red::before\": {\r\n backgroundColor: \"#ff0000\"\r\n },\r\n },\r\n tabOptions: {\r\n position: \"relative\",\r\n \"& button\": {\r\n marginRight: 15,\r\n \"&:first-child\": {\r\n marginLeft: 15\r\n }\r\n }\r\n }\r\n })\r\n);\r\n\r\n\r\nconst Tabs: React.FunctionComponent = props => {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n props.onSelectTab(tabIndex)}\r\n >\r\n {props.tabs.map((tab, index) => (\r\n \r\n {tab.label}\r\n
\r\n }\r\n value={tab.value}\r\n className={`${classes.tabItem} ${tab.dotColor ? classes.tabDottedItem : \"\"}`}\r\n id={tab.id}\r\n />\r\n ))}\r\n \r\n {props.tabOptions &&\r\n
\r\n {props.tabOptions}\r\n
\r\n }\r\n \r\n );\r\n}\r\n\r\n\r\nexport interface Tab {\r\n dotColor?: \"green\" | \"grey\" | \"yellow\" | \"red\";\r\n label: string;\r\n value?: any;\r\n id: string;\r\n}\r\n\r\ninterface ComponentProps {\r\n tabs: Tab[];\r\n tabOptions?: JSX.Element;\r\n selectedTab: number | any;\r\n onSelectTab: (tab: number | any) => void;\r\n className?: string;\r\n}\r\n\r\nexport default Tabs;\r\n","import React from \"react\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n content: {\r\n margin: 20\r\n }\r\n })\r\n);\r\n\r\n\r\nconst TabContent: React.FunctionComponent = props => {\r\n const classes = useStyles();\r\n\r\n return (\r\n
\r\n {props.children}\r\n
\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n id?: string;\r\n}\r\n\r\nexport default TabContent;","import React from \"react\";\r\nimport Toolbar from \"@mui/material/Toolbar\";\r\nimport { Theme } from \"@mui/material/styles\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { CSSProperties } from \"@mui/styles\";\r\n\r\ninterface ITabContentToolbar {\r\n toolBarStyles?: CSSProperties;\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n toolbar: ({ toolbarStyles }) => ({\r\n backgroundColor: theme.palette.background.paper,\r\n boxSizing: \"border-box\",\r\n justifyContent: \"space-between\",\r\n marginTop: -48,\r\n padding: \"0 5px\",\r\n position: \"sticky\",\r\n top: 0,\r\n width: \"100%\",\r\n zIndex: 3,\r\n ...toolbarStyles\r\n })\r\n })\r\n);\r\n\r\nconst TabContentToolbar: React.FunctionComponent = props => {\r\n const classes = useStyles({toolbarStyles: {...props.toolBarStyles}});\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n}\r\n\r\nexport default TabContentToolbar;","import React from \"react\";\r\n\r\nimport Snackbar from \"@mui/material/Snackbar\";\r\n\r\nimport Alert from '@mui/material/Alert';\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\n\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n snackbar: {\r\n position: \"absolute\"\r\n },\r\n alert: {\r\n minWidth: 350\r\n }\r\n })\r\n);\r\n\r\n/**\r\n * An error snackbar\r\n * - if you need more control over the base MUI components use snackbarWrapper.tsx\r\n */\r\nconst ErrorSnackbar: React.FunctionComponent = props => {\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n {props.errorMessage}\r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n errorMessage: string;\r\n clearErrorMessage: () => void;\r\n}\r\n\r\nexport default ErrorSnackbar;\r\n","import React, { useRef, useState } from \"react\";\r\n\r\nimport Popover from \"@mui/material/Popover\";\r\n\r\nimport HelpOutlineIcon from \"@mui/icons-material/HelpOutline\";\r\n\r\n\r\nimport \"./infoHover.sass\";\r\n\r\n\r\nconst InfoHover: React.FC = ({ size, children }) => {\r\n const [showPopover, setShowPopover] = useState(false);\r\n const popoverRef = useRef(null);\r\n\r\n return (\r\n <>\r\n setShowPopover(true)}\r\n onMouseLeave={() => setShowPopover(false)}\r\n style={size === \"small\" ? { fontSize: 16 } : {}}\r\n className=\"help-icon\"\r\n />\r\n setShowPopover(true),\r\n onMouseLeave: () => setShowPopover(false),\r\n style: {\r\n maxWidth: 250\r\n }\r\n }}\r\n style={{ pointerEvents: \"none\" }}\r\n onClose={() => setShowPopover(false)}\r\n classes={{\r\n paper: \"help-icon-description\"\r\n }}\r\n >\r\n {children}\r\n \r\n \r\n )\r\n}\r\n\r\ninterface ComponentProps {\r\n size?: \"initial\" | \"small\";\r\n}\r\n\r\nexport default InfoHover;","import * as React from \"react\";\r\nimport Loading from \"./loading\";\r\n\r\nexport interface LoadingProps{\r\n show: boolean\r\n absolute?: boolean\r\n styles?: React.CSSProperties;\r\n}\r\n\r\nexport default class LoadingOverlay extends React.PureComponent {\r\n public render() {\r\n return !this.props.show\r\n ? null\r\n :
\r\n { \r\n \r\n }\r\n
;\r\n }\r\n}\r\n","import React, { useState } from \"react\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Popover from \"@mui/material/Popover\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\nimport MoreVertIcon from \"@mui/icons-material/MoreVert\";\r\n\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n optionsWrapper: {\r\n position: \"relative\",\r\n visibility: \"hidden\",\r\n \"&.visible\": {\r\n visibility: \"visible\"\r\n }\r\n },\r\n options: {\r\n position: \"absolute\",\r\n top: 8\r\n },\r\n iconButton: {\r\n minWidth: 0,\r\n padding: 3\r\n }\r\n })\r\n);\r\n\r\n\r\nconst MoreOptionsIconButton: React.FunctionComponent = props => {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n\r\n const classes = useStyles();\r\n\r\n const onClose = (ev) => {\r\n ev.stopPropagation();\r\n setAnchorEl(null);\r\n }\r\n\r\n return (\r\n
\r\n {\r\n ev.stopPropagation();\r\n setAnchorEl(ev.currentTarget);\r\n }}\r\n className={`${classes.iconButton} ${props.className || \"\"}`}\r\n id=\"more-options-icon-button\"\r\n >\r\n \r\n \r\n onClose(ev)}\r\n anchorOrigin={{\r\n vertical: \"bottom\",\r\n horizontal: \"left\"\r\n }}\r\n transformOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"left\"\r\n }}\r\n onClick={(ev: any) => onClose(ev)}\r\n >\r\n {props.children}\r\n \r\n
\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n onClick?: (ev) => void;\r\n className?: string;\r\n buttonDivClassName?: string;\r\n}\r\n\r\nexport default MoreOptionsIconButton;","//Intention is to replace all of the items with this univeral one. \r\n//Any functionality beyond text and onClick() should be optional, to avoid updating a million files on change.\r\n\r\nimport * as React from 'react';\r\nimport { ListItemButton, ListItemText } from \"@mui/material\";\r\n\r\nexport interface Option {\r\n text: string | JSX.Element;\r\n disabled?: boolean;\r\n onClick: (any) => any;\r\n textStyle?: any;\r\n buttonStyle?: any;\r\n hoverStyle?: any;\r\n buttonId?: string;\r\n}\r\n\r\nexport const MoreOptionsItem: React.FunctionComponent
\r\n popoverStaysOpenOnMouseover ? setIsVisible(true) : null,\r\n onMouseLeave: () => popoverStaysOpenOnMouseover ? setIsVisible(false) : null,\r\n style: paperStyle\r\n }\r\n }}\r\n style={{ pointerEvents: \"none\" }}\r\n onClose={() => setIsVisible(false)}\r\n classes={{\r\n paper: \"help-icon-description\"\r\n }}\r\n {...popoverProps}\r\n >\r\n {children}\r\n \r\n \r\n );\r\n};\r\n\r\ninterface IHoverTextProps {\r\n label: string | JSX.Element;\r\n labelClassName?: string;\r\n inline?: boolean;\r\n labelContainerClassName?: string;\r\n underline?: boolean;\r\n popoverProps?: Partial;\r\n paperStyle?: React.CSSProperties;\r\n style?: React.CSSProperties;\r\n popoverStaysOpenOnMouseover?: boolean;\r\n}\r\n\r\nexport default HoverText;\r\n","import React, { useRef, useState } from \"react\";\r\n\r\nimport Popover from \"@mui/material/Popover\";\r\n\r\nimport { Chip } from \"@mui/material\";\r\n\r\nconst ExtraChipsMessage: React.FunctionComponent = props => {\r\n const [showPopover, setShowPopover] = useState(false);\r\n const popoverRef = useRef(null);\r\n\r\n return (\r\n \r\n setShowPopover(true)}\r\n onMouseLeave={() => setShowPopover(false)}\r\n label={props.chipText}\r\n >\r\n setShowPopover(true),\r\n onMouseLeave: () => setShowPopover(false),\r\n style: {\r\n maxWidth: 250\r\n }\r\n }}\r\n style={{ pointerEvents: \"none\" }}\r\n onClose={() => setShowPopover(false)}\r\n classes={{\r\n paper: \"help-text-description\"\r\n }}\r\n >\r\n {props.hoverText}\r\n \r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n chipText: string;\r\n hoverText: string;\r\n}\r\n\r\nexport default ExtraChipsMessage;\r\n","import React, { ReactElement } from \"react\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport { Chip } from \"@mui/material\";\r\nimport { IdNamePair } from \"../models\";\r\nimport ExtraChipsMessage from \"./forms/messages/extraChipsMessage\";\r\nimport uuid from \"uuid\";\r\n\r\ninterface IChipListProps {\r\n items: IChipListItem[];\r\n truncateAtIndex?: number; // exclusive index\r\n closable?: boolean;\r\n onClose?: (item: IdNamePair) => void;\r\n showEmptyChip?: boolean;\r\n emptyLabel?: HTMLElement | string;\r\n emptyStyle?: React.CSSProperties;\r\n chipStyle?: React.CSSProperties;\r\n}\r\n\r\nexport interface IChipListItem extends IdNamePair {\r\n disabled?: boolean;\r\n labelStyle?: React.CSSProperties;\r\n}\r\n\r\nconst defaultChipStyle: React.CSSProperties = {\r\n marginRight: \"8px\",\r\n marginBottom: \"4px\",\r\n backgroundColor: \"#e0e0e0\", //Background color prevents background change on hover.\r\n fontSize: 16,\r\n width: \"fit-content\"\r\n};\r\n\r\nconst defaultEmptyChipStyle: React.CSSProperties = {\r\n ...defaultChipStyle,\r\n fontStyle: \"italic\",\r\n color: \"#808080\",\r\n};\r\n\r\nconst ChipList: React.FunctionComponent = ({\r\n items,\r\n chipStyle,\r\n truncateAtIndex,\r\n closable = false,\r\n onClose,\r\n showEmptyChip = false,\r\n emptyStyle,\r\n emptyLabel = \"No Topics Selected\"\r\n}) => {\r\n const id = uuid();\r\n\r\n const getExtraNames = (): string => {\r\n if (!truncateAtIndex) return \"\";\r\n let result = \"\";\r\n\r\n if (items.length > truncateAtIndex) {\r\n let remainingItemNames = items.slice(truncateAtIndex).map(item => item.name);\r\n result = remainingItemNames.join(\", \");\r\n }\r\n\r\n return result;\r\n };\r\n\r\n const getDefaultChip = (item: IChipListItem): ReactElement => {\r\n return \r\n {item.name}\r\n \r\n }\r\n style={chipStyle || defaultChipStyle}\r\n onDelete={setupClose ? () => onClose!(item) : undefined}\r\n deleteIcon={setupClose ? : undefined}\r\n disabled={item.disabled}\r\n />;\r\n };\r\n\r\n const setupClose = closable && onClose !== undefined;\r\n\r\n return (\r\n <>\r\n {\r\n showEmptyChip && items.length === 0 &&\r\n \r\n }\r\n {\r\n items.slice(0, truncateAtIndex).map((item) => (getDefaultChip(item)))\r\n }\r\n {\r\n truncateAtIndex && items.length > truncateAtIndex &&\r\n \r\n }\r\n \r\n );\r\n};\r\n\r\nexport default ChipList;\r\n","import React from \"react\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport { TextField } from \"@mui/material\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport Popover from \"@mui/material/Popover\";\r\n\r\nimport \"./callout.sass\";\r\n\r\n/*\r\n This component is designed to mirror the existing Callout component.\r\n The difference is that this one has a search bar at the top, which you can pass functions in for.\r\n It displays as a Popover, meaning it'll open a menu when activated.\r\n\r\n Note:\r\n MUI has a component called Autocomplete that does the same as this component. We'll want to\r\n use Autocomplete when possible...\r\n*/\r\nconst CalloutWithSearch: React.FunctionComponent = props => {\r\n const [searchText, setSearchText] = React.useState(\"\");\r\n\r\n const onTextChange = (ev) => {\r\n setSearchText(ev.target.value);\r\n if(props.searchOnType)\r\n props.performSearch(ev.target.value);\r\n }\r\n\r\n const onKeyUp = (key) => {\r\n if (key.keyCode === 13) {\r\n props.performSearch(searchText);\r\n }\r\n }\r\n\r\n return (\r\n {\r\n props.setAnchorEl(null);\r\n setSearchText(\"\");\r\n }}\r\n >\r\n
\r\n
\r\n
\r\n ,\r\n endAdornment: searchText &&\r\n {\r\n setSearchText(\"\");\r\n props.performSearch(\"\");\r\n }}\r\n />\r\n }}\r\n onChange={onTextChange}\r\n onKeyUp={onKeyUp}\r\n />\r\n
\r\n
\r\n {props.children}\r\n
\r\n {!!props.footer &&\r\n
\r\n {props.footer}\r\n
\r\n }\r\n
\r\n \r\n );\r\n}\r\n\r\n\r\ninterface ICalloutWithSearchProps {\r\n anchorEl: any;\r\n placeholder: string;\r\n setAnchorEl: (anchorEl: any) => void;\r\n arrowStyle?: React.CSSProperties;\r\n footer?: JSX.Element;\r\n performSearch: (input: string) => void;\r\n searchOnType: boolean;\r\n highlight: boolean;\r\n calloutContainerStyle?: React.CSSProperties;\r\n calloutFooterStyle?: React.CSSProperties;\r\n}\r\n\r\n\r\nexport default CalloutWithSearch;\r\n","import React from \"react\";\r\n\r\nimport { Checkbox, ListItemButton, ListItemIcon, ListItemText } from \"@mui/material\";\r\n\r\nimport LockIcon from \"@mui/icons-material/Lock\";\r\n\r\nimport { IMultiSelectItem } from \"modules/common/models\";\r\nimport \"./../styles/calloutMultiselect.sass\";\r\n\r\ninterface IMultiSelectContent> {\r\n availableOptions: IMultiSelectItem[]; // a list of items available, can contain nested children.\r\n selectedOptions: TItem[];\r\n onChange: (topics: TItem[]) => void;\r\n nestingAllowed: boolean;\r\n disableOptions?: boolean;\r\n}\r\n\r\nexport const MultiSelectContent = ,>(props: IMultiSelectContent) => {\r\n const { selectedOptions } = props;\r\n const onClickItem = (clickedItem: TItem) => {\r\n const isAlreadySelected = selectedOptions.map(opt => opt.id).includes(clickedItem.id);\r\n\r\n const updatedItemList = isAlreadySelected\r\n ? selectedOptions.filter(item => item.id !== clickedItem.id)\r\n : [...selectedOptions, clickedItem]\r\n\r\n props.onChange(updatedItemList);\r\n };\r\n\r\n const isParentSelected = (parent: TItem) => {\r\n const selectedIds = selectedOptions.map((selected: TItem) => selected.id);\r\n return parent.children?.every((item: TItem) => selectedIds.includes(item.id));\r\n };\r\n\r\n const selectParent = (parent: TItem) => {\r\n const itemsToAdd = parent.children\r\n ?.filter(item => !selectedOptions.map(t => t.id).includes(item.id))\r\n ?? [];\r\n\r\n props.onChange([...selectedOptions, ...itemsToAdd]);\r\n };\r\n\r\n const deselectParent = (parent: TItem) => {\r\n const itemsToRemove = parent.children?.map((t: TItem) => t.id);\r\n const newItems = selectedOptions.filter(currentTag => !itemsToRemove?.includes(currentTag.id));\r\n\r\n props.onChange(newItems);\r\n };\r\n\r\n const handleParentClick = (tagGroup: TItem) => {\r\n isParentSelected(tagGroup)\r\n ? deselectParent(tagGroup)\r\n : selectParent(tagGroup);\r\n };\r\n\r\n const getChildItem = (item: TItem) => {\r\n return (\r\n !props.disableOptions && onClickItem(item)}\r\n style={props.nestingAllowed ? { paddingLeft: \"40px\" } : {}}\r\n disabled={props.disableOptions}\r\n >\r\n \r\n selectedItem.id === item.id)}\r\n disabled={props.disableOptions}\r\n />\r\n \r\n : undefined}\r\n classes={{ dense: \"callout-list-item-text-dense\" }}\r\n />\r\n \r\n );\r\n };\r\n\r\n const getParentItem = (item: TItem) => {\r\n if (!item.children || item.children.length <= 0) return;\r\n\r\n return (\r\n \r\n handleParentClick(item)}\r\n className=\"select-popover-group-header-clickable\"\r\n >\r\n \r\n {item.name}\r\n \r\n\r\n {item.children.map((child: TItem) => getChildItem(child))}\r\n \r\n );\r\n };\r\n\r\n return (\r\n \r\n {\r\n props.availableOptions.map((item: TItem) =>\r\n props.nestingAllowed\r\n ? getParentItem(item)\r\n : getChildItem(item))\r\n }\r\n \r\n );\r\n};\r\n","import React, { ReactElement, useState } from \"react\";\r\nimport { Button } from \"@mui/material\";\r\nimport CalloutWithSearch from \"../../calloutWithSearch\";\r\nimport { MultiSelectContent } from \"./multiSelectContent\";\r\nimport { IMultiSelectItem } from \"modules/common/models\";\r\n\r\ninterface IMultiSelectCallout> {\r\n defaultOptions: IMultiSelectItem[];\r\n selectedOptions: T[];\r\n onChange: (items: T[]) => void;\r\n onClose?: () => void;\r\n nestingAllowed?: boolean;\r\n buttonStyle?: IMultiSelectButtonStyle;\r\n containerClassName?: string;\r\n searchBarText?: string;\r\n footerComponent?: ReactElement;\r\n calloutContainerStyle?: React.CSSProperties;\r\n disableOptions?: boolean;\r\n calloutFooterStyle?: React.CSSProperties;\r\n buttonId: string;\r\n}\r\n\r\nexport interface IMultiSelectButtonStyle {\r\n buttonClassName?: string;\r\n buttonText?: string;\r\n buttonVariant?: \"text\" | \"outlined\";\r\n startIcon?: ReactElement;\r\n endIcon?: ReactElement;\r\n buttonCssStyle?: React.CSSProperties;\r\n}\r\n\r\nconst defaultButtonStyle: IMultiSelectButtonStyle = {\r\n buttonClassName: \"\",\r\n buttonText: \"Add/Edit Topics\",\r\n buttonVariant: \"text\",\r\n};\r\n\r\nconst MultiSelectCalloutWithSearch = >(props: IMultiSelectCallout) => {\r\n const {\r\n defaultOptions,\r\n containerClassName,\r\n selectedOptions = [],\r\n onChange,\r\n onClose,\r\n buttonStyle,\r\n nestingAllowed = true,\r\n searchBarText = \"Search topic group or topic\",\r\n footerComponent,\r\n calloutContainerStyle,\r\n disableOptions,\r\n calloutFooterStyle,\r\n buttonId\r\n } = props;\r\n const [filteredOptions, setFilteredOptions] = useState[]>([...defaultOptions]);\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const {\r\n buttonClassName,\r\n buttonText,\r\n buttonVariant,\r\n startIcon,\r\n endIcon,\r\n buttonCssStyle\r\n } = { ...defaultButtonStyle, ...buttonStyle };\r\n\r\n const resetItems = () => setFilteredOptions([...defaultOptions]);\r\n\r\n const onCalloutClose = (anchorEl: any) => {\r\n setAnchorEl(anchorEl);\r\n\r\n if (onClose) onClose();\r\n }\r\n\r\n const getAllItems = (): TItem[] => {\r\n const items = nestingAllowed\r\n ? filteredOptions.filter(opt => opt.children).flatMap(opt => opt.children!)\r\n : filteredOptions.map(opt => opt as TItem);\r\n\r\n return items ?? [];\r\n };\r\n\r\n const onToggleAll = (itemsSelected: boolean) => {\r\n const newSelection = itemsSelected ? [] : getAllItems();\r\n onChange(newSelection);\r\n };\r\n\r\n const onSearch = (searchText: string) => {\r\n const matchesText = (myText: string, textToCompare: string): boolean =>\r\n myText.trim().toLowerCase().includes(\r\n textToCompare.trim().toLowerCase()\r\n );\r\n\r\n const text = searchText.trim().toLowerCase();\r\n if (text.length <= 0) return resetItems();\r\n\r\n let newOptions = defaultOptions.filter(parent => {\r\n const childMatchesText = parent.children?.some(child => matchesText(child.name, searchText));\r\n return matchesText(parent.name, searchText) || childMatchesText;\r\n });\r\n\r\n if (nestingAllowed) {\r\n newOptions = newOptions.map(parent => {\r\n const children = matchesText(parent.name, searchText)\r\n ? parent.children\r\n : parent.children?.filter(child => matchesText(child.name, searchText));\r\n\r\n return { ...parent, children };\r\n });\r\n }\r\n\r\n setFilteredOptions(newOptions);\r\n };\r\n\r\n\r\n const getCalloutFooter = (): JSX.Element => {\r\n if (footerComponent) return footerComponent;\r\n\r\n const anySelections = selectedOptions.length > 0;\r\n\r\n return
\r\n onToggleAll(anySelections)}\r\n >\r\n {anySelections ? \"Unselect\" : \"Select\"} All\r\n \r\n
;\r\n };\r\n\r\n return (\r\n
\r\n
\r\n { setAnchorEl(event.currentTarget); resetItems(); }}\r\n startIcon={startIcon}\r\n endIcon={endIcon}\r\n className={buttonClassName}\r\n variant={buttonVariant}\r\n id={buttonId}\r\n >\r\n {buttonText}\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default MultiSelectCalloutWithSearch;\r\n","import React, { ReactElement } from \"react\";\r\n\r\nimport AddIcon from '@mui/icons-material/Add';\r\n\r\nimport ChipList from \"../../chipList\";\r\nimport MultiSelectCalloutWithSearch from \"./multiSelectCalloutWithSearch\";\r\n\r\nimport { IMultiSelectItem } from \"modules/common/models\";\r\nimport \"./../styles/calloutMultiselect.sass\";\r\n\r\ninterface IMultiselectAndChipsWithSearch> {\r\n defaultOptions: IMultiSelectItem[];\r\n selectedOptions?: T[];\r\n containerClassName?: string;\r\n buttonClassName?: string;\r\n buttonText?: string;\r\n truncateAtIndex?: number;\r\n showEmptyChip?: boolean;\r\n onChange: (items: T[]) => void;\r\n nestingAllowed?: boolean;\r\n footerComponent?: ReactElement;\r\n calloutContainerStyle?: React.CSSProperties;\r\n searchPlaceholder?: string;\r\n emptyChipText?: string;\r\n buttonCssStyle?: React.CSSProperties;\r\n disableOptions?: boolean;\r\n calloutFooterStyle?: React.CSSProperties;\r\n buttonId: string;\r\n}\r\n\r\n/**\r\n * Button and list component\r\n * - button opens multi-select\r\n * - selections displayed in chips list\r\n */\r\nconst MultiselectAndChipsWithSearch = > (props: IMultiselectAndChipsWithSearch) => {\r\n const {\r\n defaultOptions,\r\n containerClassName,\r\n selectedOptions = [],\r\n buttonClassName,\r\n buttonText,\r\n onChange,\r\n truncateAtIndex = 4,\r\n nestingAllowed = true,\r\n showEmptyChip = false,\r\n footerComponent,\r\n calloutContainerStyle,\r\n searchPlaceholder,\r\n emptyChipText,\r\n buttonCssStyle,\r\n disableOptions,\r\n calloutFooterStyle,\r\n buttonId\r\n } = props;\r\n\r\n const onUpdateItems = (item: TItem) => {\r\n const isAlreadySelected: boolean = selectedOptions.map(opt => opt.id).includes(item.id);\r\n\r\n const updatedItemList = isAlreadySelected\r\n ? selectedOptions.filter(i => i.id !== item.id)\r\n : [...selectedOptions, item]\r\n\r\n onChange(updatedItemList);\r\n };\r\n\r\n return (\r\n
\r\n
\r\n {defaultOptions.length !== 0 &&\r\n ,\r\n ...(buttonText && {buttonText}),\r\n ...(buttonClassName && {buttonClassName}),\r\n ...(buttonCssStyle && {buttonCssStyle})\r\n }}\r\n nestingAllowed={nestingAllowed}\r\n footerComponent={footerComponent}\r\n calloutContainerStyle={calloutContainerStyle}\r\n searchBarText={searchPlaceholder}\r\n disableOptions={disableOptions}\r\n calloutFooterStyle={calloutFooterStyle}\r\n buttonId={buttonId}\r\n />\r\n }\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default MultiselectAndChipsWithSearch;\r\n","import React from \"react\";\r\nimport { MultiSelectTopic, TenantSettingsTagGroup } from \"modules/settings\";\r\nimport { UserRole } from \"modules/users/models\";\r\nimport MultiSelectAndChipsWithSearch from \"modules/common/components/forms/inputs/multiSelectAndChipsWithSearch\";\r\n\r\nimport \"./permissionDrawer.sass\";\r\n\r\ninterface ComponentProps {\r\n topics: TenantSettingsTagGroup[];\r\n selectedTopics: MultiSelectTopic[];\r\n setSelectedTopics: (topics: MultiSelectTopic[]) => void;\r\n role: UserRole;\r\n defaultChipLabel?: string;\r\n}\r\n\r\nconst SECTION_HEADER = {\r\n [UserRole.CONTRIBUTOR]: \"Content Submission\",\r\n [UserRole.AUTHOR]: \"Content Creation\"\r\n};\r\n\r\nconst SECTION_DESCRIPTION = {\r\n [UserRole.CONTRIBUTOR]:

Allow to submit content in these topics*

,\r\n [UserRole.AUTHOR]:

Assign specific topics when authoring

\r\n};\r\n\r\nconst SECTION_CLAUSE = {\r\n [UserRole.CONTRIBUTOR]: \"Contributor cannot submit content to any topics.\",\r\n [UserRole.AUTHOR]: \"Author can publish content using any topic.\"\r\n};\r\n\r\nconst TopicPermissionSection: React.FunctionComponent = (props: ComponentProps) => {\r\n return (\r\n
\r\n
{SECTION_HEADER[props.role]}
\r\n
\r\n
\r\n {SECTION_DESCRIPTION[props.role]}\r\n {`If none are selected, ${SECTION_CLAUSE[props.role]}`}\r\n
\r\n ({id: opt.id, name: opt.name, children: opt.tags}))}\r\n selectedOptions={props.selectedTopics}\r\n onChange={(topics) => props.setSelectedTopics(topics)}\r\n buttonText=\"Add/Edit Topics\"\r\n truncateAtIndex={5}\r\n nestingAllowed\r\n showEmptyChip\r\n buttonId=\"add-edit-topics-button\"\r\n />\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default TopicPermissionSection;","import React from \"react\";\r\n\r\nimport { FormControl, MenuItem, Select } from \"@mui/material\";\r\nimport { UserRole } from \"modules/users\";\r\n\r\ninterface IRoleSelectorProps {\r\n selectedRole: UserRole;\r\n onSelectRole: (newRole: UserRole) => void;\r\n formControlStyle?: React.CSSProperties;\r\n selectStyle?: React.CSSProperties;\r\n}\r\n\r\nexport const RoleSelector: React.FunctionComponent = ({\r\n selectedRole,\r\n formControlStyle,\r\n selectStyle,\r\n onSelectRole,\r\n}) => {\r\n return (\r\n \r\n \r\n onSelectRole(UserRole.USER)}>User\r\n onSelectRole(UserRole.CONTRIBUTOR)}>Contributor\r\n onSelectRole(UserRole.AUTHOR)}>Author\r\n onSelectRole(UserRole.OWNER)}>Owner\r\n \r\n \r\n );\r\n}\r\n","import React, { useEffect } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { Button, Dialog, DialogContent, DialogTitle, Divider, FormControl, IconButton, Switch, TextField, Typography } from \"@mui/material\";\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport ArrowIcon from '@mui/icons-material/ArrowForwardIos';\r\nimport OpenNewIcon from '@mui/icons-material/OpenInNew';\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\n\r\nimport { actions, InvitedUser, InvitePlatform, UserRole } from 'modules/users';\r\nimport { usersApi } from 'api/instances';\r\n\r\nimport Disclaimer from 'modules/common/components/disclaimer';\r\nimport InfoHover from 'modules/common/components/hovers/infoHover';\r\nimport HoverText from 'modules/documents/components/action-buttons/hoverText';\r\n\r\nimport { emailRegex } from \"utils/regexUserValidation\";\r\nimport { USER_ROLE_DESCRIPTIONS, UserRoleStrings } from \"modules/authorization/models\";\r\nimport TopicPermissionSection from './dialogs/topicPermissionSection';\r\nimport { MultiSelectTopic } from 'modules/settings';\r\nimport { RoleSelector } from \"modules/common/components/forms/inputs/roleSelector\";\r\nimport { getHierarchyRoles } from \"utils/getRole\";\r\n\r\ninterface ComponentProps {\r\n isOpen: boolean;\r\n closeDialog: () => void;\r\n swapDialogs: () => void;\r\n closeReport: () => void;\r\n bulkClicked: () => void;\r\n setLoading: (loading: boolean) => void;\r\n setUploadFailed: (status: boolean) => void;\r\n updateSparrowUser: (name: string, email: string) => void;\r\n}\r\n\r\nconst specialCharacterRegex = /[ `!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?~]/; //eslint-disable-line\r\n\r\nconst LocalUserDialog: React.FC = (props: PropsWithRedux) => {\r\n const [optionalFieldsOpen, setOptionalFieldsOpen] = React.useState(false);\r\n const [permissionsOpen, setPermissionsOpen] = React.useState(false);\r\n\r\n const [firstName, setFirstName] = React.useState(\"\");\r\n const [lastName, setLastName] = React.useState(\"\");\r\n const [email, setEmail] = React.useState(\"\");\r\n\r\n const [errorFirstName, setErrorFirstName] = React.useState(false);\r\n const [errorLastName, setErrorLastName] = React.useState(false);\r\n const [errorEmail, setErrorEmail] = React.useState(false);\r\n const [errorEmailMessage, setErrorEmailMessage] = React.useState(\"\");\r\n\r\n const [phoneNumber, setPhoneNumber] = React.useState(\"\");\r\n const [title, setTitle] = React.useState(\"\");\r\n const [department, setDepartment] = React.useState(\"\");\r\n const [reportsTo, setReportsTo] = React.useState(\"\");\r\n const [country, setCountry] = React.useState(\"\");\r\n const [region, setRegion] = React.useState(\"\");\r\n const [nickname, setNickname] = React.useState(\"\");\r\n\r\n const [errorPhoneNumber, setErrorPhoneNumber] = React.useState(false);\r\n\r\n const [roleSelected, setRoleSelected] = React.useState(UserRole.USER);\r\n const [isSubManager, setIsSubManager] = React.useState(false);\r\n\r\n const [selectedTopics, setSelectedTopics] = React.useState([]);\r\n\r\n const errorPermissions = roleSelected === UserRole.CONTRIBUTOR && selectedTopics.length === 0;\r\n const isUserValid = firstName !== \"\" && lastName !== \"\" && email !== \"\" &&\r\n !errorFirstName && !errorLastName && !errorEmail && errorEmailMessage === \"\" && !errorPermissions;\r\n\r\n //Reset error values when the component is re-opened\r\n useEffect(() => {\r\n if (props.isOpen) {\r\n setErrorEmail(false);\r\n setErrorFirstName(false);\r\n setErrorLastName(false);\r\n setErrorPhoneNumber(false);\r\n setRoleSelected(UserRole.USER);\r\n setOptionalFieldsOpen(false);\r\n setPermissionsOpen(false);\r\n }\r\n }, [props.isOpen]);\r\n\r\n //Only check the inputted email after they stop typing for .5 seconds.\r\n useEffect(() => {\r\n const interval = setTimeout(() => {\r\n if (!email.match(emailRegex) || !validateEmail(email)) {\r\n setErrorEmail(true);\r\n setErrorEmailMessage(\"Enter valid email address.\");\r\n } else {\r\n usersApi.CheckIfEmailAvailable(email).then((response) => {\r\n if (response) {\r\n setErrorEmail(false);\r\n setErrorEmailMessage(\"\");\r\n } else {\r\n setErrorEmail(true);\r\n setErrorEmailMessage(\"Email address is already taken.\");\r\n }\r\n });\r\n }\r\n }, 500);\r\n\r\n return () => clearInterval(interval);\r\n }, [email]);\r\n\r\n const validateEmail = (email: string) => {\r\n if (specialCharacterRegex.test(email.charAt(0)) || specialCharacterRegex.test(email.charAt(email.length - 1))) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n let updateNumber = (e) => {\r\n if (e.target.value.match(/^[0-9\\+\\-\\(\\)]*$/))\r\n //eslint-disable-line\r\n setPhoneNumber(e.target.value);\r\n };\r\n\r\n const updateEmail = (newValue: string) => {\r\n setEmail(newValue);\r\n };\r\n\r\n const verifyAndSubmitUser = async () => {\r\n var validToUpload = true;\r\n\r\n if (firstName === \"\") {\r\n setErrorFirstName(true);\r\n validToUpload = false;\r\n }\r\n\r\n if (lastName === \"\") {\r\n setErrorLastName(true);\r\n validToUpload = false;\r\n }\r\n\r\n //Email validation handled elsewhere.\r\n\r\n let submissionManager = false;\r\n let userRoles: string[] = getHierarchyRoles(roleSelected);\r\n\r\n if (userRoles.includes(UserRoleStrings.AUTHOR) && isSubManager)\r\n submissionManager = true;\r\n\r\n let number: string = (phoneNumber || \"\").replace(/[^0-9]/g, \"\");\r\n\r\n if (number.length < 10 && phoneNumber !== \"\") {\r\n setErrorPhoneNumber(true);\r\n validToUpload = false;\r\n }\r\n\r\n const countryCode: string = `+${!!number.slice(0, -10).length ? number.slice(0, -10) : \"1\"} `;\r\n let formattedNumber = countryCode + \"(\" + number.slice(-10, -7) + \") \" + number.slice(-7, -4) + \"-\" + number.slice(-4);\r\n\r\n if (validToUpload) {\r\n let toSend: InvitedUser = {\r\n inviteType: InvitePlatform.Sparrow,\r\n enabled: true,\r\n email: email.toLowerCase(),\r\n smsPhone: phoneNumber === \"\" ? \"\" : formattedNumber,\r\n userDetails: {\r\n firstName: firstName,\r\n lastName: lastName,\r\n title: title,\r\n department: department,\r\n reportsTo: reportsTo,\r\n country: country,\r\n region: region,\r\n preferredName: nickname,\r\n roles: userRoles,\r\n canManageSubmissions: submissionManager,\r\n permissionSetTopics: roleSelected === UserRole.CONTRIBUTOR ? selectedTopics.map(t => t.id) : []\r\n },\r\n };\r\n\r\n props.swapDialogs();\r\n props.setUploadFailed(false); //Reset value to false before making request.\r\n let result = await props.inviteSparrowUser([toSend]);\r\n\r\n //Check if call failed\r\n if (result && result.toString() !== \"200\") {\r\n props.setUploadFailed(true);\r\n }\r\n else {\r\n props.updateSparrowUser(firstName + \" \" + lastName, email);\r\n }\r\n clearUserData();\r\n props.setLoading(false);\r\n }\r\n };\r\n\r\n const clearUserData = () => {\r\n setLastName(\"\");\r\n setFirstName(\"\");\r\n setEmail(\"\");\r\n setPhoneNumber(\"\");\r\n setTitle(\"\");\r\n setDepartment(\"\");\r\n setReportsTo(\"\");\r\n setNickname(\"\");\r\n setCountry(\"\");\r\n setRoleSelected(UserRole.USER);\r\n };\r\n\r\n const onRoleChange = (newRole: UserRole) => {\r\n setRoleSelected(newRole);\r\n };\r\n\r\n const finishButton = () => \r\n Finish\r\n ;\r\n\r\n return (\r\n \r\n \r\n \r\n
\r\n Add New Sparrow User\r\n
\r\n \r\n Sparrow Users are accounts directly provided, managed and created by our system. These users do not require\r\n external providers to login.\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n First name*\r\n \r\n setFirstName(e.target.value)}\r\n onClick={() => setErrorFirstName(false)}\r\n placeholder=\"Enter first name\"\r\n className=\"textfield-formatting\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n />\r\n
\r\n\r\n
\r\n \r\n Last name*\r\n \r\n setLastName(e.target.value)}\r\n onClick={() => setErrorLastName(false)}\r\n placeholder=\"Enter last name\"\r\n className=\"textfield-formatting\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n />\r\n
\r\n\r\n
\r\n \r\n Email address*\r\n \r\n
\r\n updateEmail(e.target.value)}\r\n onClick={() => setErrorEmail(false)}\r\n error={errorEmail}\r\n placeholder=\"Ex. alan.smith@example.com\"\r\n variant=\"outlined\"\r\n helperText={errorEmailMessage}\r\n size=\"small\"\r\n />\r\n
\r\n
\r\n
\r\n\r\n \r\n\r\n setOptionalFieldsOpen(!optionalFieldsOpen)}\r\n >\r\n Standard profile fields (optional) \r\n {!optionalFieldsOpen && errorPhoneNumber ? - Errors inside : null}\r\n {optionalFieldsOpen ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n\r\n \r\n {optionalFieldsOpen && (\r\n
\r\n
\r\n Mobile no.\r\n setErrorPhoneNumber(false)}\r\n onChange={updateNumber}\r\n error={errorPhoneNumber}\r\n placeholder=\"Ex. +1-123-867-5309\"\r\n className=\"textfield-formatting\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={phoneNumber}\r\n />\r\n
\r\n\r\n
\r\n Title\r\n setTitle(e.target.value)}\r\n placeholder=\"Enter role or title\"\r\n className=\"textfield-formatting\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={title}\r\n />\r\n
\r\n\r\n
\r\n Department\r\n setDepartment(e.target.value)}\r\n placeholder=\"Enter department\"\r\n className=\"textfield-formatting\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={department}\r\n />\r\n
\r\n\r\n
\r\n Reports to\r\n setReportsTo(e.target.value)}\r\n placeholder=\"Enter name\"\r\n className=\"textfield-formatting\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={reportsTo}\r\n />\r\n
\r\n\r\n
\r\n Country\r\n setCountry(e.target.value)}\r\n placeholder=\"Enter country\"\r\n className=\"textfield-formatting\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={country}\r\n />\r\n
\r\n\r\n
\r\n Region\r\n setRegion(e.target.value)}\r\n placeholder=\"Enter region, city, or province\"\r\n className=\"textfield-formatting\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={region}\r\n />\r\n
\r\n\r\n
\r\n Preferred Name\r\n setNickname(e.target.value)}\r\n placeholder=\"Enter preferred name\"\r\n className=\"textfield-formatting\"\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={nickname}\r\n />\r\n
\r\n\r\n \r\n
\r\n )}\r\n\r\n setPermissionsOpen(!permissionsOpen)}\r\n >\r\n
\r\n Roles\r\n Set more roles for this user\r\n
\r\n {permissionsOpen ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n\r\n \r\n\r\n {permissionsOpen && (\r\n
\r\n
\r\n Give permissions of a \r\n \r\n
\r\n\r\n
\r\n\r\n }\r\n text={\r\n \r\n {USER_ROLE_DESCRIPTIONS[roleSelected]}\r\n \r\n }\r\n />\r\n
\r\n\r\n {(roleSelected === UserRole.AUTHOR || roleSelected === UserRole.OWNER) &&\r\n
\r\n
\r\n Assign as a Submission Manager\r\n \r\n setIsSubManager(e.target.checked)} />\r\n \r\n
\r\n \r\n Notify this {UserRole[roleSelected].toString().toLocaleLowerCase()} when Content is submitted by a Contributor.\r\n \r\n
\r\n }\r\n\r\n {\r\n roleSelected === UserRole.CONTRIBUTOR &&\r\n \r\n }\r\n
\r\n )}\r\n
\r\n \r\n \r\n
\r\n \r\n {\r\n !isUserValid\r\n ? \r\n Complete required fields\r\n \r\n : finishButton()\r\n }\r\n \r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n topics: state.settings.tenantSettings.tagGroups\r\n }),\r\n {\r\n inviteSparrowUser: actions.inviteSparrowUsers,\r\n }\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(LocalUserDialog);\r\n","import React from 'react';\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { Button, Dialog, DialogContent, DialogTitle, IconButton, Snackbar, Typography } from '@mui/material';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport { usersApi } from 'api/instances';\r\n\r\nimport { Alert } from '@mui/material';\r\n\r\nimport Disclaimer from 'modules/common/components/disclaimer';\r\nimport InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';\r\nimport UserCSVUploader from './userCSVUploader';\r\nimport UserInsightsBlockTiny from './userInsightsBlockTiny';\r\nimport BackArrow from '@mui/icons-material/ArrowBack';\r\nimport LoadingSpinner from 'modules/common/components/loadingSpinner';\r\nimport Loading from 'modules/common/components/loading';\r\nimport InfoHover from 'modules/common/components/hovers/infoHover';\r\nimport { SeverityOptions } from 'utils/muiHelpers';\r\nimport { FileDownloader } from 'utils/fileDownloader';\r\n\r\ninterface ComponentProps {\r\n isOpen: boolean;\r\n showDialog: () => void;\r\n closeDialog: () => void;\r\n showDrawer: () => void;\r\n}\r\n\r\nconst BulkLocalDialog: React.FC = ({isOpen, closeDialog, showDialog, showDrawer}) => {\r\n\r\n const [alertOpen, setAlertOpen] = React.useState(false);\r\n const [alertMessage, setAlertMessage] = React.useState(\"\");\r\n const [alertSeverity, setAlertSeverity] = React.useState(\"info\");\r\n\r\n const [valid, setValid] = React.useState(0);\r\n const [invalid, setInvalid] = React.useState(0);\r\n const [duplicate, setDuplicate] = React.useState(0);\r\n\r\n const [file, setFile] = React.useState();\r\n const [sending, setSending] = React.useState(false);\r\n\r\n const [loading, setLoading] = React.useState(false);\r\n const [reportLoading, setReportLoading] = React.useState(false);\r\n const [displayWarning, setDisplayWarning] = React.useState(false);\r\n\r\n const [confirmationOpen, setConfirmationOpen] = React.useState(false);\r\n const [resultsOpen, setResultsOpen] = React.useState(false);\r\n\r\n const [uploadedUsers, setUploadedUsers] = React.useState(0);\r\n\r\n let expectedHeaders = [ \"First Name\", \"Last Name\", \"Preferred Name\",\r\n \"Email Address\", \"Mobile Number\", \"EmployeeID\", \"Title\", \"Department\", \"Region\", \"Country\\r\" ]\r\n\r\n let setNewAlert = (message: string, open: boolean, type: SeverityOptions) => {\r\n setAlertOpen(open)\r\n setAlertMessage(message)\r\n setAlertSeverity(type)\r\n }\r\n\r\n let hideSnackbar = () => {\r\n setAlertOpen(false);\r\n setAlertMessage(\"\");\r\n }\r\n\r\n let swapToUpload = () => {\r\n setConfirmationOpen(false);\r\n showDialog();\r\n }\r\n\r\n let uploadFileAndCreateUsers = () => {\r\n if (file) {\r\n setSending(true)\r\n usersApi.BatchInviteSparrowLocalAccounts(file)\r\n .then((response) => {\r\n setSending(false);\r\n setUploadedUsers(response.newUsers);\r\n })\r\n .catch((error) => {\r\n setSending(false);\r\n setNewAlert(error.response.data.Message, true, \"error\");\r\n })\r\n } else {\r\n setSending(false);\r\n setNewAlert(\"There was an error uploading your CSV. Please try again.\", true, \"error\");\r\n }\r\n\r\n setConfirmationOpen(false);\r\n setResultsOpen(true);\r\n }\r\n\r\n const swapToUserInvites = () => {\r\n setResultsOpen(false);\r\n showDrawer();\r\n }\r\n\r\n const parseCSV = async (file: File) => {\r\n await new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n const contents = reader.result!.toString().trim();\r\n var rows = contents.split(\"\\n\");\r\n\r\n //Check for errors\r\n if(rows.length > 0)\r\n {\r\n var rowOne = rows[0].split(\",\");\r\n if (rowOne.length !== 10) {\r\n setNewAlert(\"File follows an incorrect format and/or contains commas (,). Please use the provided CSV template.\", true, \"error\");\r\n reader.readAsText(file);\r\n return;\r\n }\r\n\r\n var headers = rowOne;\r\n if (JSON.stringify(headers).toLowerCase() !== JSON.stringify(expectedHeaders).toLocaleLowerCase())\r\n {\r\n setNewAlert(\"File follows an incorrect format and/or contains commas (,). Please use the provided CSV template.\", true, \"error\");\r\n reader.readAsText(file);\r\n return;\r\n }\r\n\r\n for(var i in rows) {\r\n if(rows[i].split(\",\").length > expectedHeaders.length ){\r\n setNewAlert(\"File follows an incorrect format and/or contains commas (,). Please use the provided CSV template.\", true, \"error\");\r\n reader.readAsText(file);\r\n return;\r\n } \r\n }\r\n }\r\n if(rows.length > 5000) {\r\n setDisplayWarning(true);\r\n }\r\n\r\n resolve();\r\n };\r\n reader.readAsText(file);\r\n });\r\n\r\n setLoading(true);\r\n setFile(file);\r\n closeDialog();\r\n setConfirmationOpen(true);\r\n var results = await usersApi.GetIntermediateResultsBulk(file);\r\n setLoading(false);\r\n setDisplayWarning(false);\r\n\r\n setValid(results.valid);\r\n setInvalid(results.invalid);\r\n setDuplicate(results.duplicate); \r\n }\r\n\r\n const downloadSample = () => {\r\n let rows = [\r\n [\"\", \"First Name\", \"Last Name\", \"Preferred Name\", \"Email Address\", \"Mobile Number\",\r\n \"EmployeeID\", \"Title\", \"Department\", \"Region\", \"Country\"],\r\n ];\r\n const file = {\r\n name: \"sampleBulkUpload.csv\",\r\n type: \"data:text/csv;charset=utf-8\"\r\n };\r\n new FileDownloader(file).downloadSampleCSV(rows);\r\n }\r\n\r\n let downloadCSVReport = async () => {\r\n if(file) {\r\n setReportLoading(true)\r\n var results = await usersApi.GetIntermediateResultsCSV(file);\r\n var link = window.document.createElement(\"a\");\r\n link.setAttribute(\"href\", \"data:text/csv;charset=utf-8\" + encodeURI(results));\r\n link.setAttribute(\"download\", `bulk-upload-sparrow-users-${new Date().toISOString()}.csv`);\r\n link.click(); \r\n setReportLoading(false)\r\n }\r\n else {\r\n return;\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n
\r\n Bulk Import New Sparrow Users\r\n
\r\n \r\n Sparrow Users are accounts directly provided, managed and created by our system. These users do not require external providers to login.\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n }\r\n text={\r\n \r\n \r\n Download and complete the CSV template below. First name, last name, and an email address are required to add and invite each user.\r\n Sparrow Invites allow users to activate their accounts.\r\n \r\n \r\n }\r\n />\r\n\r\n
\r\n \r\n
\r\n\r\n \r\n \r\n
\r\n \r\n {alertMessage}\r\n \r\n
\r\n\r\n setConfirmationOpen(false)}>\r\n \r\n
\r\n Bulk Import New Sparrow Users\r\n
\r\n \r\n Sparrow Users are accounts directly provided, managed and created by our system. These users do not require external providers to login.\r\n \r\n
\r\n setConfirmationOpen(false)} size=\"large\">\r\n \r\n \r\n
\r\n
\r\n \r\n {loading\r\n ?
\r\n {displayWarning \r\n ? }\r\n text={\r\n \r\n
\r\n Due to the volume of users in attached CSV, this may take a while.\r\n
\r\n
\r\n }\r\n />\r\n : null}\r\n \r\n
\r\n :
\r\n
\r\n }\r\n text={\r\n \r\n
\r\n CSV successfully scanned! In case of invalid or duplicate entries, download scan results \r\n {reportLoading\r\n ?
\r\n : here.}\r\n
\r\n
\r\n }\r\n />\r\n\r\n
\r\n \r\n \r\n \r\n
\r\n\r\n
\r\n Quick Reminders:\r\n
    \r\n
  • Only valid user profiles will be added and invited.
  • \r\n
  • Users with existing emails or mobile numbers in your CSV are skipped.
  • \r\n
  • Invalid user profiles are rows in your CSV which are missing required fields, or have invalid emails.
  • \r\n
\r\n To proceed and complete this process, click Finish.\r\n
\r\n\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n }\r\n
\r\n
\r\n\r\n setResultsOpen(false)}>\r\n \r\n
\r\n {sending ? \"Inviting users...\" : \"Successfully sent!\"}\r\n setResultsOpen(false)} size=\"large\">\r\n \r\n \r\n
\r\n
\r\n \r\n {sending ?\r\n \r\n :
\r\n
\r\n You've successfully send invites to {uploadedUsers} user{uploadedUsers !== 1 ? \"s\" : \"\"}!
\r\n The invitees are required to accept the invitation, and use the link to activate their account.
\r\n
\r\n Learn what's next\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n }\r\n
\r\n \r\n {alertMessage}\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n }),\r\n {\r\n },\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(BulkLocalDialog);","import * as React from 'react';\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers\";\r\nimport { AdapterDateFns } from \"@mui/x-date-pickers/AdapterDateFns\";\r\n\r\n//DateUtils now included automically. See https://mui.com/material-ui/guides/pickers-migration/#muipickersutilsprovider\r\n\r\nexport const PickerLocalization = props => {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}","import * as React from \"react\";\r\n\r\nimport AuthoringSearch from \"modules/common/components/filters/authoringSearch\";\r\nimport FilterContainer from \"modules/common/components/filters/filterContainer\";\r\nimport FilterDropdown from \"modules/common/components/filters/filterDropdown\";\r\n\r\nimport { UserActivityFilter, SimpleTag, UserActivityLogType} from \"../models\"\r\n\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Chip from \"@mui/material/Chip\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\n\r\nimport moment from \"moment\";\r\nimport _ from \"lodash\";\r\n\r\nimport { DatePicker } from \"@mui/x-date-pickers/DatePicker\";\r\nimport { PickerLocalization } from \"modules/common/components/pickerLocalization\";\r\n\r\nimport { Grid, TextField, Typography } from \"@mui/material\";\r\nimport { UserActivityType } from \"..\";\r\n\r\nclass UserActivitiesFilters extends React.Component {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n canSearch: false,\r\n textToSearch: props.filters.textToSearch || \"\"\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: ComponentProps) {\r\n if (this.props.filters.textToSearch !== prevProps.filters.textToSearch)\r\n this.setState({ textToSearch: this.props.filters.textToSearch || \"\" });\r\n }\r\n\r\n public render() {\r\n const { filters, userActivityLogType } = this.props;\r\n return (\r\n \r\n \r\n }}\r\n onChange={this.onUpdateTextToSearch}\r\n onKeyUp={this.onKeyUp}\r\n className=\"text-to-search\"\r\n />\r\n \r\n \r\n {userActivityLogType && userActivityLogType.map((activityEvent) =>\r\n this.onToggleUserActivityType(activityEvent.activityType as UserActivityType)}>\r\n \r\n name === activityEvent.activityType)}\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n From \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n To \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n }\r\n filterCommands={\r\n \r\n }\r\n filterSelection={this.getFilterSelection()}\r\n />\r\n );\r\n }\r\n \r\n private getFilterSelection = () => {\r\n const { filters } = this.props;\r\n\r\n return (\r\n \r\n {!!filters.textToSearch &&\r\n }\r\n />\r\n }\r\n {filters.activityTypes.map((selectedEventName) =>\r\n this.onClearActivityType(selectedEventName)}\r\n deleteIcon={}\r\n />\r\n )}\r\n {!!filters.from && }\r\n /> }\r\n {!!filters.to && }\r\n /> }\r\n \r\n );\r\n }\r\n \r\n private getActivityDescription = (selectedActivityType: UserActivityType) => {\r\n return this.props.userActivityLogType?.find(c => c.activityType === selectedActivityType)?.activityDescription\r\n }\r\n\r\n private onToggleUserActivityType = (selectedActivityType: UserActivityType) => {\r\n const isRemoving = _.some(this.props.filters.activityTypes,(e) => e === selectedActivityType);\r\n if (isRemoving)\r\n this.onChangeFilters({ activityTypes: _.filter(this.props.filters.activityTypes, e => selectedActivityType !== e) });\r\n else\r\n this.onChangeFilters({ activityTypes: _.concat(this.props.filters.activityTypes,[selectedActivityType]) });\r\n }\r\n\r\n private onChangeFromDate = (date) => {\r\n this.onChangeFilters({ from: !!date ? date : null });\r\n }\r\n\r\n private onChangeTextToSearch = () => {\r\n this.onChangeFilters({ textToSearch: this.state.textToSearch });\r\n }\r\n\r\n private onChangeToDate = (date) => {\r\n this.onChangeFilters({ to: !!date ? date : null });\r\n }\r\n\r\n private onChangeFilters = (value: Partial) => {\r\n this.setState({ canSearch: true });\r\n this.props.onChangeFilters({ ...this.props.filters, textToSearch: this.state.textToSearch, ...value });\r\n }\r\n\r\n private onClearActivityType = (selectedActivityType: UserActivityType) => {\r\n this.props.onChangeFilters({...this.props.filters, activityTypes: _.filter(this.props.filters.activityTypes, e => selectedActivityType !== e) });\r\n }\r\n\r\n private onKeyUp = (key) => {\r\n if (key.keyCode === 13)\r\n this.onChangeTextToSearch();\r\n }\r\n\r\n private onUpdateTextToSearch = (event) => {\r\n this.setState({ textToSearch: event.target.value });\r\n }\r\n\r\n private onClearTextToSearch = () => {\r\n this.props.onChangeFilters({ ...this.props.filters, textToSearch: \"\" });\r\n }\r\n\r\n private onClearFromDate = () => {\r\n this.props.onChangeFilters({...this.props.filters, from: null });\r\n }\r\n\r\n private onClearToDate = () => {\r\n this.props.onChangeFilters({...this.props.filters, to: null });\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.setState({ canSearch: false });\r\n this.props.onClearFilters();\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n filters: UserActivityFilter;\r\n activityTypeTags?: SimpleTag[];\r\n userActivityLogType?: UserActivityLogType[];\r\n onChangeFilters: (filters: UserActivityFilter) => void;\r\n onClearFilters: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n canSearch: boolean;\r\n textToSearch: string;\r\n}\r\n\r\nexport default UserActivitiesFilters;","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { usersApi } from \"api/instances\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Drawer from \"@mui/material/Drawer\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableContainer from \"@mui/material/TableContainer\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TablePagination from \"@mui/material/TablePagination\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\n\r\nimport ArrowBackIcon from \"@mui/icons-material/ArrowBack\";\r\nimport SaveAltIcon from \"@mui/icons-material/SaveAlt\";\r\n\r\nimport moment from \"moment\";\r\nimport { SimpleTag, UserActivityFilter, UserActivityLogPage, UserActivityLogType } from \"../models\";\r\nimport UserActivitiesFilters from \"./userActivitiesFilters\";\r\nimport { UserActivity } from \"..\";\r\nimport { push } from \"react-router-redux\";\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\n\r\nclass UserActivityLogs extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n activityLog: undefined,\r\n filters: this.getDefaultFilters(props),\r\n isDownloading: false,\r\n isInitialized: false,\r\n isLoading: false\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n this.getActivityTypes();\r\n this.setState({filters: this.getDefaultFilters(this.props)});\r\n this.getUserActivityLog(1);\r\n }\r\n \r\n private getDefaultFilters(props: PropsWithRedux): UserActivityFilter {\r\n return {\r\n activityTypes: [],\r\n userIds: !!props.defaultUserId ? [props.defaultUserId] : [],\r\n status: null,\r\n from: null,\r\n to: null,\r\n textToSearch: ''\r\n } as UserActivityFilter;\r\n }\r\n\r\n public render() {\r\n return (\r\n \r\n \r\n
\r\n \r\n \r\n \r\n
{`User Management Activity Log${!!this.props.displayContext ? (' - ' + this.props.displayContext) : ''}`}
\r\n
\r\n \r\n
\r\n
\r\n {this.getList()}\r\n
\r\n \r\n
\r\n );\r\n }\r\n\r\n private downloadActivityLog = () => {\r\n this.setState({ isDownloading: true });\r\n const file = { name: `User Management Activity Log.csv` };\r\n usersApi.downloadUserActivity(this.state.filters)\r\n .then((url) => new FileDownloader(file).downloadProvided(url))\r\n .then(_ => this.setState({ isDownloading: false }))\r\n .catch(_ => this.setState({ isDownloading: false }));\r\n }\r\n\r\n private downloadBulkSocialUserReport = (id: string) => {\r\n this.setState({ isDownloading: true });\r\n const file = { name: `Bulk Social Users-${new Date().toISOString()}.csv` };\r\n\r\n usersApi.downloadSocialUserReport(id)\r\n .then((url) => new FileDownloader(file).downloadProvided(url))\r\n .then(_ => this.setState({ isDownloading: false }))\r\n .catch(_ => this.setState({ isDownloading: false }));\r\n }\r\n\r\n private downloadBulkSparrowUserReport = (id: string) => {\r\n if (!id) return;\r\n const file = {\r\n name: `Bulk Sparrow Users-${new Date().toISOString()}.csv`\r\n }\r\n return usersApi.GetBatchCSVForBatchId(id)\r\n .then( data => new FileDownloader(file).downloadBlob(data))\r\n }\r\n\r\n private getUserActivityLog = (pageNumber: number, filters: UserActivityFilter = this.state.filters) => {\r\n this.setState({ isLoading: true });\r\n usersApi.getuserActivity(pageNumber, filters).then((activityLog) => {\r\n this.setState({ activityLog , isInitialized: true, isLoading: false });\r\n });\r\n }\r\n\r\n private getActivityTypes = () => {\r\n usersApi.getuserActivityTypes().then(response => {\r\n this.setState({userActivityLogType: response as UserActivityLogType[]})\r\n });\r\n }\r\n\r\n private getList = () => {\r\n const { activityLog } = this.state;\r\n \r\n return (\r\n
\r\n
\r\n }\r\n text={\r\n \r\n The User Management Activity Log keeps track of all modifications and actions of Admins/Owners within the Manage Users & Permissions screen.\r\n \r\n }\r\n />\r\n
\r\n \r\n {this.state.isLoading || !activityLog\r\n ? \r\n : activityLog.totalItems === 0\r\n ?
No activities were found.
\r\n : \r\n \r\n \r\n \r\n \r\n Activity\r\n Activity date\r\n Admin/Owner\r\n Actions\r\n \r\n \r\n \r\n {activityLog.results.map((activity, index) => {\r\n return (\r\n \r\n {activity.activityDescription}\r\n {moment(activity.time).format(\"MMM D, YYYY, h:mmA\")}\r\n {activity.name}\r\n {this.getAction(activity)}\r\n \r\n );\r\n })}\r\n \r\n
\r\n
\r\n {activityLog.currentPage > 0 && activityLog.totalPages > 1 &&\r\n {\r\n this.getUserActivityLog(pageNumber + 1);\r\n }}\r\n />\r\n }\r\n
\r\n }\r\n
\r\n );\r\n }\r\n\r\n private getAction = (activity: UserActivity) => {\r\n if(activity.activityType === \"BulkAddSocialUser\" ){\r\n return ()\r\n }\r\n if(activity.activityType === \"BulkAddSparrowUser\") {\r\n return ()\r\n }\r\n if(activity.activityType === \"CancelledSocialUserInvite\" || activity.activityType === \"DeleteSocialUser\" || activity.activityType === \"DeleteSparrowUser\") {\r\n return \"\";\r\n }\r\n if (activity.activityType === \"AddSocialUser\" && activity.activityDescription?.includes(\"@\")){\r\n return (Pending Invite)\r\n }\r\n if (activity.activityType === \"AddSparrowUser\" && activity.activityDescription?.includes(\"@\")){\r\n return (Pending Invite)\r\n }\r\n }\r\n\r\n private onChangeFilters = (filters: UserActivityFilter) => {\r\n this.setState({ filters: filters });\r\n this.getUserActivityLog(1, filters);\r\n }\r\n \r\n private onClearFilters = () => {\r\n const filters = this.getDefaultFilters(this.props);\r\n this.setState({ filters: filters });\r\n this.getUserActivityLog(1, filters);\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n selectedNewsletterId?: string;\r\n defaultUserId?: string | null;\r\n newsletterTags?: SimpleTag[];\r\n issueTags?: SimpleTag[];\r\n displayContext?: string;\r\n onClose: () => any;\r\n}\r\n\r\ninterface ComponentState {\r\n activityLog?: UserActivityLogPage;\r\n userActivityLogType?: UserActivityLogType[];\r\n filters: UserActivityFilter;\r\n isDownloading: boolean;\r\n isLoading: boolean;\r\n isInitialized:boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenant: state.tenant.id\r\n }),\r\n {\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(UserActivityLogs);","import React, { useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport FiberManualRecordIcon from \"@mui/icons-material/FiberManualRecord\";\r\nimport HelpIcon from \"@mui/icons-material/Help\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\nimport \"./tutorial.sass\";\r\n\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n iconButton: {\r\n color: \"#aaaaaa\",\r\n margin: \"0 5px\"\r\n }\r\n })\r\n);\r\n\r\n\r\nconst Tutorial: React.FunctionComponent = props => {\r\n const [showTutorial, setShowTutorial] = useState(!!props.openOnLoad);\r\n const [currentSlide, setCurrentSlide] = useState(0);\r\n\r\n const classes = useStyles();\r\n\r\n const { slides } = props;\r\n\r\n return (\r\n \r\n {\r\n setCurrentSlide(0);\r\n setShowTutorial(true);\r\n }}\r\n className={classes.iconButton}\r\n >\r\n \r\n \r\n setShowTutorial(false)}>\r\n setShowTutorial(false)}\r\n className=\"close-tutorial\"\r\n size=\"large\">\r\n \r\n \r\n
\r\n {slides.map((slide, index) =>\r\n
\r\n \"\"\r\n
{slide.title}
\r\n
{slide.content}
\r\n
\r\n )}\r\n
\r\n
\r\n
\r\n {slides.map((_, index) =>\r\n setCurrentSlide(index)}>\r\n )}\r\n
\r\n
\r\n {currentSlide > 0 &&\r\n \r\n }\r\n {currentSlide < (slides.length - 1)\r\n ? \r\n : \r\n }\r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\n\r\nexport interface Slide {\r\n title: string;\r\n content: JSX.Element;\r\n}\r\n\r\ninterface ComponentProps {\r\n openOnLoad?: boolean;\r\n slides: Slide[];\r\n imageSrc: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(Tutorial);","import React, { useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Tutorial, { Slide } from \"modules/common/components/tutorial\";\r\n\r\nimport Cookies, { COMMON_COOKIE_KEYS } from \"utils/cookie\";\r\nimport { Link } from \"@mui/material\";\r\n\r\nconst TUTORIAL_SLIDES: Slide[] = [\r\n {\r\n title: \"Users, Roles and Elevated Permissions\",\r\n content: (\r\n
\r\n Manage and specify permissions granted to each member of your internal communications teams—on top of managing their roles and profiles.\r\n

\r\n Start with our new Content Creation permissions, and ensure the right teams are reaching the right people with the right message.\r\n
\r\n )\r\n },\r\n {\r\n title: \"Assign specific authoring permissions\",\r\n content: (\r\n
\r\n Decide which Authors can publish to certain topics, and which authors can reach certain audiences.\r\n

\r\n Select the user and assign them with an Author role. Next, specify which topics the user will be able to use when creating and publishing content.\r\n
\r\n )\r\n },\r\n {\r\n title: \"After assigning permissions\",\r\n content: (\r\n
\r\n Setting authoring permissions and assigning specific topics will hide all other topics from an Author when they are creating new content.\r\n

\r\n The Author will be able to create and publish content using only topics they have access to, and will be able to target audiences attached to the topics they used. Learn more at support.sparrowconnected.com.\r\n
\r\n )\r\n },\r\n];\r\n\r\nconst UsersTutorial: React.FunctionComponent = props => {\r\n const [showTutorial] = useState(Cookies.isFirstSet(COMMON_COOKIE_KEYS.USER_TUTORIAL_VISITED));\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(UsersTutorial);","import * as React from \"react\";\r\nimport { push } from \"react-router-redux\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { usersApi } from \"api/instances\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Header from \"pages/common/header\";\r\nimport MainContent from \"pages/common/mainContent\";\r\nimport Tabs from \"pages/common/tabs\";\r\n\r\nimport { actions } from \"modules/users\";\r\nimport { UsersTab } from \"../models\";\r\nimport UsersView from \"./usersView\";\r\nimport UserInsightsView from \"./userInsightsView\";\r\nimport InvitedUsersDrawer from \"./invitedUsersDrawer\";\r\n\r\nimport './userOverview.sass';\r\n\r\nimport AddUserButtonDropdown from \"./addUserButtonDropdown\";\r\nimport AdditionalUserOptionsDropdown from \"./additionalUserOptionsDropdown\";\r\n\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport { Button, IconButton, TextField, Typography } from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport InfoIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport OpenNewIcon from \"@mui/icons-material/OpenInNew\";\r\nimport LoadingSpinner from \"modules/common/components/loadingSpinner\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport BulkSocialDialog from \"./bulkSocialDialog\";\r\nimport LocalUserDialog from \"./localUserDialog\";\r\nimport BulkLocalDialog from \"./bulkLocalDialog\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport UserActivityLogs from \"./userActivities\";\r\nimport { emailRegex } from \"utils/regexUserValidation\";\r\n\r\n\r\nimport \"modules/common/components/authoring/authoring.sass\";\r\nimport \"../styles/userList.sass\";\r\nimport UsersTutorial from \"./dialogs/usersTutorial\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\n\r\nclass UsersManagementPage extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n showInvitedUsers: false,\r\n showInviteSocial: false,\r\n showUserActivities: false,\r\n showInvitedUsersSent: false,\r\n showCSVInvite: false,\r\n showInviteLocal: false,\r\n showInviteLocalResult: false,\r\n showLocalBulk: false,\r\n emailString: \"\",\r\n emailValid: true,\r\n errorMessage: \"\",\r\n isDownloading: false,\r\n localCreating: false,\r\n sparrowFailed: false,\r\n\r\n invitedUserEmail: \"\",\r\n invitedUserName: \"\"\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n this.props.getUsersV1();\r\n }\r\n\r\n public render() {\r\n return (\r\n \r\n \r\n Manage Users & Permissions\r\n
\r\n \r\n }\r\n rightComponent={\r\n \r\n \r\n \r\n \r\n }\r\n />\r\n \r\n
\r\n \r\n \r\n \r\n \r\n { this.state.showUserActivities && this.closeUserActivities()} />}\r\n
\r\n \r\n
\r\n\r\n \r\n \r\n
\r\n Add a new social user\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n A Social User is created once the invitee successfully logs in using the link in the invitation email. Once the invitation link is opened, the user can create their account through any preferred social account provider (Google, Facebook, LinkedIn or Apple).\r\n \r\n
\r\n\r\n
\r\n Send invitations to\r\n \r\n \r\n
\r\n
\r\n { !this.state.emailValid ? {this.state.errorMessage} : }\r\n
\r\n\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n
\r\n {this.props.invitingUser ? Sending invites... : Successfully sent! }\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n {this.props.invitingUser ?\r\n \r\n\r\n :
\r\n
\r\n You've successfully sent invites to {this.props.invitedUserCount} new user(s)! The invitees are required to accept the invitation, and log in using the unique link to set up and complete their user profile.\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n }\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n {this.state.localCreating ? Creating user... \r\n : !this.state.sparrowFailed ? Successfully sent! : User Creation Failed. }\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n {this.state.localCreating \r\n ? \r\n :
\r\n {!this.state.sparrowFailed &&
\r\n \r\n You've successfully sent an invite to {this.state.invitedUserName} at {this.state.invitedUserEmail}. \r\n
\r\n The invitee is required to accept the invitation, and use the link to activate their account.\r\n

\r\n Learn what's next\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n }\r\n {\r\n this.state.sparrowFailed && \r\n
\r\n \r\n Something has gone wrong uploading the sparrow user.\r\n
\r\n Please ensure all provided values are valid, and that emails do not match existing users.\r\n
\r\n
\r\n \r\n
\r\n
\r\n }\r\n
\r\n }\r\n
\r\n
\r\n\r\n \r\n \r\n \r\n
\r\n );\r\n }\r\n\r\n private uploadFailed = (status: boolean) => {\r\n this.setState({sparrowFailed: status});\r\n }\r\n\r\n private showInvitedUsersDrawer = () => {\r\n this.setState({ ...this.state, showInvitedUsers: true })\r\n }\r\n\r\n private closeInvitedUsersDrawer = () => {\r\n this.setState({ ...this.state, showInvitedUsers: false })\r\n }\r\n\r\n private showUserActivities = () => {\r\n this.setState({...this.state, showUserActivities: true})\r\n}\r\n\r\nprivate closeUserActivities = () => {\r\n this.setState({...this.state, showUserActivities: false})\r\n}\r\n\r\n private swapToCSVInvite = () => {\r\n this.setState({ ...this.state, showCSVInvite: true, showInviteSocial: false, emailString: \"\", errorMessage: \"\", emailValid: true })\r\n }\r\n\r\n private showCSVInvite = () => {\r\n this.setState({ ...this.state, showCSVInvite: true })\r\n }\r\n\r\n private hideCSVInvite = () => {\r\n this.setState({ ...this.state, showCSVInvite: false })\r\n }\r\n\r\n private hideInvitedUsersSent = () => {\r\n this.setState({ ...this.state, showInvitedUsersSent: false })\r\n }\r\n\r\n private navigateToUserCreation = () => {\r\n this.props.redirectTo(`/${this.props.tenantId}/admin/users/creation`);\r\n }\r\n\r\n private navigateToLobby = () => {\r\n this.props.redirectTo(`/${this.props.tenantId}/admin/users/externallobby`)\r\n }\r\n\r\n private updateSparrowUser = (name: string, email: string) => {\r\n this.setState({invitedUserName: name, invitedUserEmail: email});\r\n }\r\n\r\n private downloadUserData = (userIds?: string[]) => {\r\n this.setState({ isDownloading: true });\r\n\r\n const file = {\r\n name: `User Data-${new Date().toISOString()}.csv`\r\n };\r\n usersApi.downloadUserData(userIds || [])\r\n .then((url) => new FileDownloader(file).downloadProvided(url))\r\n .then( (_) => this.setState({ isDownloading: false }))\r\n .catch( (_) => this.setState({ isDownloading: false }));\r\n }\r\n\r\n private showInviteSocial = () => {\r\n this.setState({ ...this.state, showInviteSocial: true });\r\n }\r\n\r\n private hideInviteSocial = () => {\r\n this.setState({ ...this.state, showInviteSocial: false, emailString: \"\", errorMessage: \"\", emailValid: true })\r\n }\r\n\r\n private swapToInviteConfirm = () => {\r\n this.setState({ ...this.state, showInviteSocial: false, showInvitedUsersSent: true, emailString: \"\", errorMessage: \"\", emailValid: true })\r\n }\r\n\r\n private swapToUserInvites = () => {\r\n this.setState({ ...this.state, showInvitedUsersSent: false, showInviteLocalResult: false, showInvitedUsers: true })\r\n }\r\n\r\n private processEmails = (e) => {\r\n var rawEmails = e.target.value;\r\n rawEmails = rawEmails.replace(/ /g, '');\r\n var emails = rawEmails.split(\",\");\r\n\r\n if (emails.length > 10) {\r\n this.setState({ emailString: e.target.value, emailValid: false, errorMessage: \"Cannot send invitations to more than 10 emails. Consider using bulk import below.\" })\r\n return;\r\n }\r\n\r\n this.setState({ emailString: e.target.value, emailValid: true, errorMessage: \"\" })\r\n }\r\n\r\n private showInviteLocal = () => {\r\n this.setState({...this.state, showInviteLocal: true});\r\n }\r\n\r\n private hideInviteLocal = () => {\r\n this.setState({...this.state, showInviteLocal: false});\r\n }\r\n\r\n private hideLocalInviteResult = () => {\r\n this.setState({...this.state, showInviteLocalResult: false})\r\n }\r\n \r\n private hideBulkInviteLocal = () => {\r\n this.setState({ ...this.state, showLocalBulk: false})\r\n }\r\n\r\n private showBulkInviteLocal = () => {\r\n this.setState({ ...this.state, showLocalBulk: true})\r\n }\r\n\r\n private localSwapToBulk = () => {\r\n this.setState({...this.state, showInviteLocal: false, showLocalBulk: true});\r\n }\r\n\r\n private setLoading = (loading: boolean) => {\r\n this.setState({...this.state, localCreating: loading})\r\n }\r\n\r\n private swapAfterSingleCreation = () => {\r\n this.setState({...this.state, showInviteLocal: false, showInviteLocalResult: true, localCreating: true});\r\n }\r\n\r\n private validateAndSendEmails = () => {\r\n var emailsToCheck = this.state.emailString.replace(/ /g, '').split(\",\");\r\n\r\n var flaggedEmails:string[] = [];\r\n var toSend:string[] = [];\r\n\r\n if(this.state.emailString === \"\")\r\n {\r\n this.setState({emailValid: false, errorMessage: \"Must have at least one email in order to send invites.\"})\r\n return;\r\n }\r\n\r\n emailsToCheck.forEach(email => {\r\n var testResult = emailRegex.test(email) || email.trim() === \"\";\r\n\r\n if(!testResult)\r\n {\r\n flaggedEmails.push(email)\r\n }\r\n\r\n if(email.trim() !== \"\")\r\n {\r\n toSend.push(email);\r\n }\r\n })\r\n\r\n if(flaggedEmails.length !== 0 )\r\n {\r\n var badEmails = flaggedEmails.join(\", \")\r\n this.setState({emailValid: false, errorMessage: \"One or more emails provided is of an invalid format. (\"+badEmails+\")\"})\r\n return;\r\n }\r\n else if(toSend.length === 0)\r\n {\r\n this.setState({emailValid: false, errorMessage: \"Please enter at least one valid email.\"})\r\n return;\r\n }\r\n else if(toSend.length > 10)\r\n {\r\n this.setState({emailValid: false, errorMessage: \"Cannot send invitations to more than 10 emails. Consider using bulk import below.\"})\r\n return;\r\n }\r\n //Making it here means all the emails are valid.\r\n this.props.sendBulkInvite(toSend);\r\n this.swapToInviteConfirm();\r\n }\r\n}\r\n\r\ninterface ComponentState {\r\n showInvitedUsers: boolean;\r\n showUserActivities: boolean;\r\n showInviteSocial: boolean;\r\n showInvitedUsersSent: boolean;\r\n showInviteLocal: boolean;\r\n showInviteLocalResult: boolean;\r\n showCSVInvite: boolean;\r\n showLocalBulk: boolean;\r\n emailString: string;\r\n emailValid: boolean;\r\n errorMessage: string;\r\n isDownloading: boolean;\r\n localCreating: boolean;\r\n sparrowFailed: boolean;\r\n\r\n invitedUserName: string;\r\n invitedUserEmail: string;\r\n}\r\ninterface ComponentProps { }\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n fetching: state.users.fetching,\r\n saving: state.users.saving,\r\n activeTab: state.users.activeTab,\r\n tenantSettings: state.settings.tenantSettings,\r\n tenantId: state.tenant.id,\r\n invitingUser: state.users.invitingUser,\r\n invitedUserCount: state.users.invitedUsers,\r\n invitedTime: state.users.invitedTime\r\n }),\r\n {\r\n getUsersV1: actions.getUsersV1,\r\n sendBulkInvite: actions.inviteBatchUsers,\r\n setActiveTab: actions.setActiveTab,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(UsersManagementPage)\r\n","import _ from 'lodash';\r\n\r\ninterface IColumnWidthSettings {\r\n maxColumns: number\r\n}\r\n\r\nconst defaultSettings: IColumnWidthSettings = {\r\n maxColumns: 16\r\n}\r\n\r\ninterface IColumn {\r\n key: string,\r\n width?: number\r\n}\r\n\r\nexport default class ColumnWidthCalculator {\r\n private settings: IColumnWidthSettings;\r\n\r\n constructor(columnWidthSettings?: IColumnWidthSettings) {\r\n this.settings = { ...defaultSettings, ...columnWidthSettings };\r\n }\r\n\r\n public CalculateWidth = (columns: IColumn[]) => {\r\n this.guardAgainstBadWidths(columns);\r\n\r\n const results = {};\r\n let modifier = 1;\r\n const undefineds = columns.filter(c => !c.width);\r\n\r\n // there is an undefined value, so we need to use math\r\n if (undefineds.length > 0) {\r\n const constant = columns.filter(c => !!c.width)\r\n .map(c => c.width)\r\n .reduce((a, c) => a! += c!, 0);\r\n modifier = (this.settings.maxColumns - undefineds.length) / constant!;\r\n columns.forEach(col => {\r\n results[col.key] = { flexGrow: ((!!col.width) ? col.width * modifier : 1) };\r\n });\r\n } else {\r\n let smallestWidth = _.min(columns.map(c => c.width));\r\n columns.forEach(col => {\r\n results[col.key] = { flexGrow: ((!!col.width) ? col.width : 1) / (smallestWidth || 1) };\r\n });\r\n }\r\n\r\n return results;\r\n }\r\n\r\n private guardAgainstBadWidths = (columns: IColumn[]) => {\r\n const expectedColumnCount = this.settings.maxColumns;\r\n const colMap = columns.map(c => c.width);\r\n if (colMap.indexOf(undefined) === -1) {\r\n // no columns have undefined / flexible width\r\n // ensure they add to max column count\r\n if (colMap.reduce((prev, current) => prev! += current!) !== expectedColumnCount) {\r\n throw Error('Unexpected Column Widths. Widths do not add up to ' + expectedColumnCount);\r\n }\r\n }\r\n }\r\n}\r\n","function ShallowEquals(objA: any, objB: any): boolean {\r\n if (objA === objB)\r\n return true;\r\n\r\n if ((!objA && objB) || (!objB && objA))\r\n return false;\r\n\r\n if (objA && objB && Object.keys(objA).length !== Object.keys(objB).length)\r\n return false;\r\n\r\n for (const key in objA) {\r\n if (objA[key] !== objB[key]) {\r\n return false\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport default ShallowEquals;\r\n","import * as React from 'react';\r\nimport shallowEquals from 'utils/shallowEquals'; \r\n\r\ninterface componentProps {\r\n color?: string\r\n width?: string\r\n height?: string\r\n viewBox?: string,\r\n style?: React.CSSProperties\r\n}\r\n\r\nclass Icon extends React.Component {\r\n\r\n private defaultColor = \"#000000\"\r\n private defaultWidth = \"24\"\r\n private defaultHeight = \"24\"\r\n private defaultViewBox = `0 0 ${this.defaultWidth} ${this.defaultHeight}`\r\n\r\n public shouldComponentUpdate(nextProps: componentProps) {\r\n return !shallowEquals(this.props, nextProps)\r\n }\r\n\r\n public render() {\r\n let props = {\r\n ...this.props as any,\r\n fill: this.props.color || this.defaultColor,\r\n width: this.props.width || this.defaultWidth,\r\n height: this.props.height || this.defaultHeight,\r\n viewBox: this.props.viewBox || this.defaultViewBox\r\n };\r\n\r\n return (\r\n \r\n {this.props.children}\r\n \r\n )\r\n }\r\n}\r\n\r\nconst iconify = (component: () => JSX.Element) => (props: componentProps) => {\r\n return (\r\n \r\n {component()}\r\n \r\n )\r\n}\r\n\r\nexport abstract class Icons {\r\n static AddImage = iconify(require('./src/add-image.jsx'))\r\n static Check = iconify(require('./src/check.jsx'))\r\n static Close = iconify(require('./src/close.jsx'))\r\n static Crop = iconify(require('./src/crop.jsx'))\r\n static DragHandle = iconify(require('./src/drag-handle.jsx'))\r\n static Edit = iconify(require('./src/edit.jsx'))\r\n static VerticalOverflow = iconify(require('./src/vertical-overflow.jsx'))\r\n static User = iconify(require('./src/user.jsx'))\r\n static LineGraph = iconify(require('./src/show-chart.jsx'))\r\n static Graph = iconify(require('./src/insert-chart.jsx'))\r\n static Cloud = iconify(require('./src/cloud.jsx'))\r\n static CheckBox = iconify(require('./src/check-box-empty.jsx'))\r\n static CheckBoxChecked = iconify(require('./src/check-box-checked.jsx'))\r\n static Devices = iconify(require('./src/devices.jsx'))\r\n static Comment = iconify(require('./src/comment.jsx'))\r\n static Pageview = iconify(require('./src/pageview.jsx'))\r\n static Info = iconify(require('./src/info.jsx'))\r\n static RssFeed = iconify(require('./src/rss-feed.jsx'))\r\n static Sort = iconify(require('./src/sort.jsx'))\r\n static AccessTime = iconify(require('./src/access-time.jsx'))\r\n static Delete = iconify(require('./src/deleteIcon.jsx'))\r\n static Lock = iconify(require('./src/lock.jsx'))\r\n\r\n //export const CheckedCircleIcon = iconify('./src/checked-circle-icon') // this is a special case\r\n}\r\n","import * as React from \"react\";\r\nimport ColumnWidthCalculator from \"./column-width-calculator\";\r\nimport shallowEquals from \"utils/shallowEquals\";\r\n\r\nimport { Icons } from \"modules/common/icons\";\r\nimport { PostsSortField } from \"modules/posts/models\";\r\n\r\nimport \"../styles/table-view.sass\";\r\n\r\ntype KeyValuePair = { [key: string]: T };\r\n\r\nexport interface DataColumn {\r\n dataKey: string;\r\n name: string;\r\n width?: number;\r\n fixedWidth?: string;\r\n truncate?: boolean;\r\n renderer?: (data: any, column: DataColumn, selected: boolean) => JSX.Element;\r\n sortable?: boolean;\r\n}\r\n\r\ninterface ComponentProps {\r\n forPosts?: boolean;\r\n collapsed?: boolean;\r\n columns: DataColumn[];\r\n data: KeyValuePair;\r\n multiselect?: boolean;\r\n columnGridMax?: number;\r\n headerRenderer?: (column: any, index: number) => JSX.Element;\r\n onSelectionChange?: (keys: string[]) => void;\r\n onRowClick?: (key: string) => void;\r\n noCheckbox?: boolean;\r\n makeRowClickSelect?: boolean;\r\n forceUpdate?: boolean;\r\n lastSort?: PostsSortField;\r\n currentSort?: PostsSortField;\r\n sortAscending?: boolean; //if false, sort by descending\r\n setSort?: (sort: PostsSortField, ascending: boolean) => any;\r\n}\r\n\r\ninterface ComponentState {\r\n selectedRowKeys: string[];\r\n}\r\n\r\nexport default class TableView extends React.Component {\r\n private columnWidthCalc: ColumnWidthCalculator;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = { selectedRowKeys: [] };\r\n }\r\n\r\n public componentWillMount() {\r\n let calcSettings = { maxColumns: this.props.columnGridMax || 16 };\r\n this.columnWidthCalc = new ColumnWidthCalculator(calcSettings);\r\n this.setState((prev) => ({ ...prev, selectedRowKeys: [] }));\r\n }\r\n\r\n public shouldComponentUpdate(nextProps, nextState) {\r\n return (\r\n nextProps.forceUpdate ||\r\n !shallowEquals(this.props.data, nextProps.data) ||\r\n !shallowEquals(this.state.selectedRowKeys, nextState.selectedRowKeys) ||\r\n !shallowEquals(\r\n this.props.columns.map((c) => c.dataKey),\r\n nextProps.columns.map((c) => c.dataKey)\r\n ) ||\r\n this.props.collapsed !== nextProps.collapsed\r\n );\r\n }\r\n\r\n public componentDidUpdate(prevProps: ComponentProps, prevState: ComponentState) {\r\n if (!shallowEquals(this.state.selectedRowKeys, prevState.selectedRowKeys)) {\r\n this.onSelectionChange();\r\n } else if (!shallowEquals(this.props.data, prevProps.data)) {\r\n // check to ensure selected keys are still available\r\n this.setState((prev) => ({ ...prev, selectedRowKeys: this.state.selectedRowKeys.filter((k) => this.props.data[k]) }));\r\n }\r\n }\r\n\r\n public render() {\r\n return (\r\n \r\n {this.renderRowHeadings()}\r\n {this.renderRows()}\r\n \r\n );\r\n }\r\n\r\n public onRowClicked = (key: string) => {\r\n if (this.props.makeRowClickSelect) {\r\n return this.onRowSelected(key);\r\n }\r\n if (this.props.onRowClick) {\r\n return this.props.onRowClick(key);\r\n }\r\n };\r\n\r\n public onRowSelected = (key: string) => {\r\n let index = this.state.selectedRowKeys.indexOf(key);\r\n if (index > -1) {\r\n this.setState(\r\n {\r\n ...this.state,\r\n selectedRowKeys: this.state.selectedRowKeys.filter((r) => r !== key),\r\n },\r\n this.onSelectionChange\r\n );\r\n } else {\r\n this.setState(\r\n {\r\n ...this.state,\r\n selectedRowKeys: this.props.multiselect === true ? [...this.state.selectedRowKeys, key] : [key],\r\n },\r\n this.onSelectionChange\r\n );\r\n }\r\n };\r\n\r\n public getSelectedRows = () => {\r\n return this.state.selectedRowKeys;\r\n };\r\n\r\n public deselectAll = () => {\r\n this.setState({\r\n ...this.state,\r\n selectedRowKeys: [],\r\n });\r\n };\r\n\r\n private onSelectionChange = () => {\r\n if (this.props.onSelectionChange) {\r\n this.props.onSelectionChange(this.getSelectedRows());\r\n }\r\n };\r\n\r\n private isRowSelected = (key) => {\r\n return this.state.selectedRowKeys.indexOf(key) > -1;\r\n };\r\n\r\n private renderRowHeadings = () => {\r\n return (\r\n
\r\n {this.props.noCheckbox ? null : this.renderCheckboxSpaceForHeader()}\r\n {this.props.columns.map((c, i) => this.renderHeader(c, i))}\r\n
\r\n );\r\n };\r\n\r\n private renderRows = () => {\r\n if (Object.keys(this.props.data).length === 0) {\r\n return (\r\n
\r\n

No items were found.

\r\n
\r\n );\r\n } else {\r\n return (\r\n
\r\n {Object.keys(this.props.data).map((k, i) => this.renderRow(this.props.data[k], this.isRowSelected(k), k, i))}\r\n
\r\n );\r\n }\r\n };\r\n\r\n private renderHeader = (column: DataColumn, i) => {\r\n if (this.props.headerRenderer) {\r\n return this.props.headerRenderer(column, i);\r\n }\r\n return (\r\n {\r\n return !!this.props.forPosts && !!column.sortable && this.sortByCol(column.name as PostsSortField);\r\n }}\r\n key={column.dataKey}\r\n style={{ ...this.getColumnWidth(column.dataKey), cursor: this.props.forPosts && column.sortable ? \"pointer\" : \"default\" }}\r\n >\r\n {column.name}\r\n {this.props.forPosts ? (\r\n column.name === this.props.currentSort ? (\r\n \r\n ) : null\r\n ) : null}\r\n \r\n );\r\n };\r\n\r\n private renderRow = (dataRow: any, selected: boolean, key: string, index: number) => {\r\n return (\r\n this.onRowClicked(key)}\r\n >\r\n {this.props.noCheckbox === true ? null : this.renderSelectableCheckbox(key, selected)}\r\n {this.props.columns.map((column) => this.renderColumn(dataRow, column, selected))}\r\n \r\n );\r\n };\r\n\r\n private renderCheckboxSpaceForHeader = () => {\r\n return
;\r\n };\r\n\r\n private renderSelectableCheckbox = (key: string, selected: boolean) => {\r\n return (\r\n {\r\n e.stopPropagation();\r\n this.onRowSelected(key);\r\n }}\r\n >\r\n {\r\n e.stopPropagation();\r\n this.onRowSelected(key);\r\n }}\r\n >\r\n
\r\n {selected ? (\r\n \r\n ) : (\r\n \r\n )}\r\n
\r\n \r\n );\r\n };\r\n\r\n private renderColumn = (dataRow: any, column: DataColumn, selected: boolean) => {\r\n return (\r\n
\r\n
\r\n {column.renderer ? (\r\n column.renderer(dataRow, column, selected)\r\n ) : (\r\n {dataRow[column.dataKey]}\r\n )}\r\n
\r\n
\r\n );\r\n };\r\n\r\n private getColumnWidth = (colKey) => {\r\n const column = this.props.columns.find((c) => c.dataKey === colKey);\r\n if (!!column && column.fixedWidth) {\r\n return { flexGrow: 0, flexBasis: column.fixedWidth };\r\n }\r\n let cols = this.props.columns.map((c) => {\r\n return { key: c.dataKey, width: c.width };\r\n });\r\n return this.columnWidthCalc.CalculateWidth(cols)[colKey];\r\n };\r\n\r\n private sortByCol = (colName: PostsSortField) => {\r\n let ascending = this.props.lastSort === colName ? !this.props.sortAscending : true;\r\n !!this.props.setSort && this.props.setSort(colName, ascending);\r\n };\r\n}\r\n","import * as React from 'react';\r\nimport './pageToolBar.sass';\r\n\r\ninterface FixedOptions {\r\n fixedAtHeight: number,\r\n}\r\n\r\nexport interface MenuButton {\r\n label: string | JSX.Element,\r\n onClick?: () => void,\r\n key: string,\r\n disabled?: boolean\r\n\r\n}\r\n\r\ninterface DefaultButton {\r\n label: string | JSX.Element,\r\n key: string\r\n}\r\n\r\ninterface ComponentProps {\r\n defaultButtons?: DefaultButton[],\r\n callToActionButton?: MenuButton,\r\n refreshButton?: MenuButton,\r\n rightSideButtons?: MenuButton[],\r\n overflowButtons?: MenuButton[],\r\n fixedOptions?: FixedOptions,\r\n}\r\n\r\ninterface ComponentState {\r\n toolBarFixed: boolean,\r\n overflowMenuOpened: boolean\r\n}\r\n\r\nexport default class PageToolBar extends React.Component {\r\n\r\n constructor(props){\r\n super(props);\r\n this.state = { toolBarFixed: false, overflowMenuOpened: false };\r\n }\r\n\r\n public componentDidMount() {\r\n if (typeof window !== 'undefined' && this.props.fixedOptions) {\r\n window.addEventListener('scroll', this.windowScrolledHandler);\r\n }\r\n }\r\n\r\n public render() {\r\n let callToAction = ( !this.props.callToActionButton ? null :\r\n \r\n {this.props.callToActionButton.label} \r\n \r\n );\r\n\r\n let rightSideButtons = ( !this.props.rightSideButtons || this.props.rightSideButtons.length === 0 ? \r\n
\r\n {\r\n !!this.props.defaultButtons && this.props.defaultButtons.map(button => {\r\n return ( \r\n \r\n {button.label} \r\n \r\n )\r\n })\r\n }\r\n
:\r\n
\r\n {\r\n this.props.rightSideButtons.map(button => {\r\n let labelCheck = button.label.toString();\r\n return (\r\n \r\n )\r\n })\r\n }\r\n
\r\n );\r\n\r\n let overflowButtons = (\r\n
\r\n {\r\n !this.props.overflowButtons ? null :\r\n this.props.overflowButtons.map(button => {\r\n return (\r\n {button.label}\r\n )\r\n })\r\n }\r\n
\r\n\r\n );\r\n\r\n let refreshButton = (\r\n this.props.refreshButton ?\r\n
\r\n \r\n {this.props.refreshButton.label} refresh \r\n \r\n
\r\n : null\r\n )\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n { callToAction }\r\n { rightSideButtons }\r\n { overflowButtons }\r\n { this.props.refreshButton ? refreshButton : null }\r\n
\r\n
\r\n
\r\n {\r\n //prevents content from jumping when transitioning to fixed position since div leaves flow of the page\r\n this.state.toolBarFixed &&\r\n
\r\n }\r\n
\r\n \r\n );\r\n }\r\n\r\n public componentWillUnmount() {\r\n window.removeEventListener('click', this.clickedAnywhereOutsideContextMenu);\r\n\r\n if (typeof window !== 'undefined' && this.props.fixedOptions) {\r\n window.removeEventListener('scroll', this.windowScrolledHandler);\r\n }\r\n }\r\n\r\n private windowScrolledHandler = (e) => {\r\n const fixedHeight = this.props.fixedOptions!.fixedAtHeight;\r\n const toolBarFixed = fixedHeight && window.pageYOffset >= fixedHeight;\r\n this.setState({ ...this.state, toolBarFixed:!!toolBarFixed })\r\n }\r\n\r\n private overflowButtonClicked = (e) => {\r\n e.stopPropagation();\r\n if (!this.state.overflowMenuOpened) {\r\n this.setState({ ...this.state, overflowMenuOpened: true });\r\n window.addEventListener('click', this.clickedAnywhereOutsideContextMenu);\r\n } else {\r\n this.setState({ ...this.state, overflowMenuOpened: false });\r\n }\r\n }\r\n\r\n private overflowMenuClicked = (e) => {\r\n e.stopPropagation();\r\n }\r\n\r\n private clickedAnywhereOutsideContextMenu = (e) => {\r\n this.setState({\r\n ...this.state,\r\n overflowMenuOpened: false\r\n })\r\n\r\n window.removeEventListener('click', this.clickedAnywhereOutsideContextMenu);\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport * as actions from '../actionCreator';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport { push } from 'react-router-redux';\r\nimport TableView from \"modules/common/components/table-view/components/table-view\";\r\nimport { Survey } from '../models';\r\nimport PageToolBar, { MenuButton } from 'modules/common/components/pageToolBar';\r\nimport moment from 'moment';\r\nimport LoadingOverlay from 'modules/common/components/loadingOverlay';\r\nimport confirm from 'utils/notyPopups';\r\n\r\nclass SurveyListing extends React.Component{\r\n private _tableView: TableView;\r\n \r\n constructor(props){\r\n super(props);\r\n this.state = { selectedItems: [] };\r\n }\r\n\r\n public componentWillMount(){\r\n this.props.surveyList.length === 0 &&\r\n !this.props.isFetching &&\r\n this.props.getSurveys();\r\n }\r\n\r\n public render() {\r\n moment.locale(\"en\");\r\n\r\n let defaultButtons = (\r\n [\r\n { key: 'edit', label: 'Edit' },\r\n { key: 'details', label: 'Details' }\r\n ]\r\n );\r\n\r\n return (\r\n
\r\n \r\n
\r\n this._tableView = e!}\r\n onSelectionChange={this.onTableSelectionChanged}\r\n onRowClick={this.onRowClicked}\r\n />\r\n \r\n
);\r\n }\r\n\r\n private tableData = () => {\r\n return this.props.surveyList.reduce((data, survey) => ({...data, [survey.id]: survey}), {});\r\n }\r\n\r\n private columns = () => {\r\n return [\r\n {\r\n dataKey: 'title',\r\n name: 'Title',\r\n truncate: true,\r\n renderer: (rowData: Survey) => ({rowData.title}),\r\n width: 8\r\n },\r\n {\r\n dataKey: 'publishTime',\r\n name: 'Publish Date',\r\n width: 2,\r\n renderer: (rowData: Survey) => ({this.formatPublishTime(rowData.publishTime!)})\r\n },\r\n {\r\n dataKey: 'expiryTime',\r\n name: 'Expiry Date',\r\n width: 2,\r\n renderer: (rowData: Survey) => ({this.formatExpiryTime(rowData.expiryTime!)})\r\n },\r\n {\r\n dataKey: 'author',\r\n name: 'Author',\r\n width: 2\r\n },\r\n {\r\n dataKey: 'responses',\r\n name: 'Responses',\r\n width: 2,\r\n renderer: (rowData: Survey, column, selected) => ({Object.keys(rowData.aggregatedResults).reduce((acc, key) => acc + rowData.aggregatedResults[key], 0)})\r\n }\r\n ]}\r\n\r\n private onTableSelectionChanged = (selectedItems: string[]) => {\r\n this.setState({ ...this.state, selectedItems });\r\n }\r\n\r\n private onRowClicked = (id: string) => {\r\n let survey = this.props.surveyList.find(s => s.id === id)!;\r\n if(this.isPublished(survey))\r\n this.props.redirectTo(`/${this.props.tenant}/admin/surveys/${id}`);\r\n else\r\n this.props.redirectTo(`/${this.props.tenant}/admin/surveys/edit/${id}`);\r\n }\r\n\r\n private isPublished = (survey: Survey) => {\r\n return !survey.publishTime || new Date(survey.publishTime).getTime() <= Date.now();\r\n }\r\n\r\n private getActionButtons = () => {\r\n let buttons = [] as MenuButton[];\r\n const numSelected = this.state.selectedItems.length;\r\n if (numSelected === 1){\r\n buttons.push({onClick:() => this.props.redirectTo(`/${this.props.tenant}/admin/surveys/edit/${this.state.selectedItems[0]}`), label: 'Edit', key:'edit'});\r\n buttons.push({onClick:() => this.props.redirectTo(`/${this.props.tenant}/admin/surveys/${this.state.selectedItems[0]}`), label: \"Details\", key: 'details'});\r\n }\r\n // if (numSelected > 0){\r\n // buttons.push({onClick: this.deleteSurveys, label: `Delete ${numSelected} Survey(s)`, key:'delete'});\r\n // }\r\n return buttons;\r\n }\r\n\r\n private getDeleteButton = () => {\r\n const numSelected = this.state.selectedItems.length;\r\n return numSelected > 0 ? \r\n [{onClick: this.deleteSurveys, label: `Delete ${numSelected} Survey(s)`, key:'delete'}] : [];\r\n }\r\n\r\n private getCallToActionButton = () => {\r\n const numSelected = this.state.selectedItems.length;\r\n return this.state.selectedItems.length === 0\r\n ? { onClick: () => this.props.redirectTo(`/${this.props.tenant}/admin/surveys/edit/`), label: \"New Survey\", key: \"newSurvey\"}\r\n : { key: 'deselect', label: `Deselect ${numSelected} Survey(s)`, onClick: this.deselectAllSurveys }\r\n }\r\n\r\n private deselectAllSurveys = () => {\r\n this._tableView.deselectAll();\r\n}\r\n\r\n private deleteSurveys = async () => {\r\n if(await confirm.show({ text: `Are you sure you want to delete these surveys?`, title: \"Survey deletion\" })){\r\n this.props.deleteSurveys(this.state.selectedItems);\r\n }\r\n }\r\n\r\n\r\n private formatPublishTime = (time: string) => {\r\n if (time){\r\n return moment(new Date(time)).fromNow();\r\n }\r\n return 'Immediate';\r\n }\r\n\r\n private formatExpiryTime = (time: string) => {\r\n if (time){\r\n return moment(new Date(time)).fromNow();\r\n }\r\n return 'Never';\r\n }\r\n}\r\n\r\ninterface ComponentProps{\r\n}\r\n\r\ninterface ComponentState{\r\n selectedItems: string[];\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n surveyList: state.surveys.surveyList,\r\n isFetching: state.surveys.isFetching,\r\n isDeleting: state.surveys.isDeleting,\r\n tenant: state.tenant.id\r\n }),\r\n {\r\n getSurveys: actions.getSurveys,\r\n redirectTo: push,\r\n deleteSurveys: actions.deleteSurveys\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(SurveyListing);","import * as React from \"react\"\r\nimport SurveyListing from \"./surveyListing\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Header from \"pages/common/header\";\r\nimport MainContent from \"pages/common/mainContent\";\r\n\r\nclass SurveyManagementPage extends React.Component<{}, {}> {\r\n public render() {\r\n return (\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n}\r\n\r\nexport default SurveyManagementPage;\r\n","import * as React from 'react';\r\n\r\nconst RemoteFocusRequestEventName = 'remoteFocusRequestEvent';\r\nconst registeredListeners: listeners = {};\r\n\r\n/**\r\n * returning true from the event handler will indicate that the event\r\n * has been handled and other handlers will not receieve the event.\r\n */\r\ntype requestCallback = (e: CustomEvent) => boolean\r\ninterface listeners {\r\n [fieldName: string]: requestCallback[]\r\n}\r\n\r\nexport const dispatchRemoteFocusRequestEvent = (fieldName: string) => {\r\n window.dispatchEvent(new CustomEvent(RemoteFocusRequestEventName, { detail: fieldName }));\r\n}\r\n\r\nexport class Component extends React.Component<{}, {}> {\r\n public componentDidMount() {\r\n window.addEventListener(RemoteFocusRequestEventName, callbackListener)\r\n }\r\n public componentWillUnmount() {\r\n window.removeEventListener(RemoteFocusRequestEventName, callbackListener)\r\n }\r\n public render() {\r\n return
\r\n }\r\n}\r\n\r\nexport const RegisterListener = (fieldName: string, callback: requestCallback) => {\r\n if (!registeredListeners[fieldName])\r\n registeredListeners[fieldName] = [];\r\n\r\n registeredListeners[fieldName].push(callback);\r\n}\r\n\r\nexport const DeregisterListener = (fieldName: string, callback: requestCallback) => {\r\n const availableListeners = registeredListeners[fieldName].filter(l => l !== callback);\r\n if (availableListeners.length === 0) // that was the last listener, remove the key\r\n delete registeredListeners[fieldName]\r\n}\r\n\r\nconst callbackListener = (e: CustomEvent) => {\r\n const listeners = registeredListeners[e.detail];\r\n if (listeners) {\r\n listeners.forEach(l => {\r\n if (l(e)) {\r\n return;\r\n }\r\n });\r\n }\r\n}","import * as React from 'react';\r\nimport '../styles/InlineError.sass';\r\n\r\ninterface componentProps {\r\n props?: any\r\n}\r\n\r\nexport default class InlineError extends React.Component {\r\n\r\n public render() {\r\n return (\r\n

\r\n { this.props.children }\r\n

\r\n )\r\n }\r\n}\r\n","import * as React from \"react\";\r\nimport \"../styles/textInput.sass\";\r\nimport InlineError from \"modules/common/components/forms/messages/InlineError\";\r\n\r\ninterface ComponentProps {\r\n label?: string;\r\n placeholder?: string;\r\n value?: string | null;\r\n tooltip?: string;\r\n multiline?: boolean;\r\n isTitle?: boolean;\r\n onChange?: (value: string) => void;\r\n onBlur?: () => void;\r\n onFocus?: () => void;\r\n onKeyDown?: (e) => void;\r\n isRequired?: boolean;\r\n isRequiredErrorMessage?: string;\r\n showError?: boolean;\r\n errorMessage?: string;\r\n registerFocus?: (ref) => void;\r\n disabled?: boolean;\r\n maxLength?: number;\r\n className?: string;\r\n checkError?: (text: string, maxLength: number) => boolean\r\n isLanguageField?: boolean;\r\n}\r\n\r\ninterface ComponentState {\r\n isFocused: boolean;\r\n touched: boolean;\r\n hasError: boolean;\r\n}\r\n\r\nexport default class TextInput extends React.PureComponent {\r\n private textInput: HTMLInputElement;\r\n private multiLineTextInput: HTMLTextAreaElement;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = { \r\n isFocused: false, \r\n touched: false, \r\n hasError: false,\r\n }\r\n }\r\n\r\n public render() {\r\n if(this.props.value && !!this.props.checkError && this.props.isLanguageField) {\r\n this.setState({hasError: this.props.checkError(this.props.value ?? \"\", this.props.maxLength ?? 0)})\r\n }\r\n\r\n return (\r\n
\r\n {this.props.children}\r\n
\r\n \r\n {this.props.label}\r\n \r\n
\r\n {!this.props.multiline ? (\r\n (this.textInput = input!)}\r\n autoComplete=\"new-password\"\r\n style={{\r\n textOverflow: this.props.isTitle ? \"\" : \"ellipsis\",\r\n whiteSpace: this.props.isTitle ? \"normal\" : \"nowrap\",\r\n }}\r\n {...this.inputProps()}\r\n />\r\n ) : (\r\n (this.multiLineTextInput = input!)}\r\n {...this.inputProps()}\r\n >\r\n )}\r\n \r\n {this.checkTextMaxLength()}\r\n
\r\n {this.showRequiredErrorMessage() && {this.props.isRequiredErrorMessage}}\r\n {this.props.showError && this.props.errorMessage && {this.props.errorMessage}}\r\n
\r\n
\r\n );\r\n }\r\n\r\n private checkTextMaxLength = () => {\r\n return (\r\n this.props.maxLength && (\r\n \r\n {this.props.isLanguageField \r\n ?\r\n (this.props.value == null ? 0 : this.props.value.length) \r\n : \r\n Math.min(this.props.maxLength, this.props.value == null ? 0 : this.props.value.length)}/\r\n {this.props.maxLength}\r\n \r\n )\r\n )\r\n }\r\n\r\n private styleModifier = () => {\r\n let modifier = \"\";\r\n if (this.props.value === \"\") modifier = \"-empty\";\r\n\r\n if (this.state.isFocused) modifier = \"-focused\";\r\n return modifier;\r\n };\r\n\r\n private inputProps = () => {\r\n const value = this.props.value || \"\";\r\n let props = {\r\n placeholder: this.props.placeholder || \" \", // IE and Edge textarea height collapses when empty without this\r\n value: this.props.isLanguageField ? value : (this.props.maxLength ? value.slice(0, this.props.maxLength) : value),\r\n onKeyDown: this.onKeyDown,\r\n onChange: this.onChange,\r\n onBlur: this.onBlur,\r\n onFocus: this.onFocus,\r\n disabled: this.props.disabled,\r\n };\r\n if (this.showRequiredErrorMessage()) {\r\n props[\"style\"] = { borderBottom: \"solid 1px #de6262\" };\r\n }\r\n return props;\r\n };\r\n\r\n public componentDidMount() {\r\n if (this.props.multiline) this.resizeMultiLineTextAreaToFitContent();\r\n\r\n // register element with remote focus events\r\n if (this.props.registerFocus) {\r\n this.props.multiline ? this.props.registerFocus(this.multiLineTextInput) : this.props.registerFocus(this.textInput);\r\n }\r\n }\r\n\r\n private onKeyDown = (e) => {\r\n if (this.props.onKeyDown) {\r\n this.props.onKeyDown(e);\r\n }\r\n };\r\n\r\n private onChange = (e) => {\r\n let textValue = this.props.multiline ? this.multiLineTextInput.value : this.textInput.value;\r\n\r\n if (!!this.props.checkError && this.props.isLanguageField === true) this.setState({hasError: this.props.checkError(textValue ?? \"\", this.props.maxLength ?? 0)})\r\n\r\n if (this.props.multiline) this.resizeMultiLineTextAreaToFitContent();\r\n\r\n if (this.props.onChange) this.props.onChange(textValue);\r\n };\r\n\r\n private onBlur = (e) => {\r\n if (this.state.isFocused) this.setState({ ...this.state, touched: true, isFocused: false });\r\n\r\n if (this.props.onBlur) this.props.onBlur();\r\n };\r\n\r\n private onFocus = (e) => {\r\n if (!this.state.isFocused) this.setState({ ...this.state, isFocused: true });\r\n\r\n if (this.props.onFocus) this.props.onFocus();\r\n\r\n if (this.props.multiline) this.resizeMultiLineTextAreaToFitContent();\r\n };\r\n\r\n private resizeMultiLineTextAreaToFitContent = () => {\r\n let input = this.multiLineTextInput;\r\n if (!input) return;\r\n\r\n input.style.height = \"0px\"; // reset to 0. (otherwise there is weird behavior)\r\n let scrollHeight = input.scrollHeight < 35 ? (this.props.isTitle ? 46 : 35) : input.scrollHeight; //scrollHeight is bunk in IE\r\n let paddingTotal = (parseInt(input.style.paddingTop || \"0\") || 0) + (parseInt(input.style.paddingBottom || \"0\") || 0);\r\n let borderTotal = (parseInt(input.style.borderTopWidth || \"0\") || 0) + (parseInt(input.style.borderBottomWidth || \"0\") || 0);\r\n\r\n let totalHeight = Number(scrollHeight - paddingTotal - borderTotal);\r\n input.style.height = `${totalHeight}px`;\r\n };\r\n\r\n private showRequiredErrorMessage = () => {\r\n return (\r\n ((this.props.showError === undefined && this.state.touched) || this.props.showError === true) &&\r\n this.props.isRequired &&\r\n (this.props.value || \"\").trim().length === 0\r\n );\r\n };\r\n}\r\n","import * as React from 'react';\r\nimport DateTime from 'react-datetime';\r\nimport {connect, ConnectedProps} from \"react-redux\";\r\nimport './dateTimePicker.sass';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\ninterface ComponentProps {\r\n forFiltering?: boolean;\r\n value: Date | null;\r\n onChange: (moment) => void;\r\n onError?: (error: string) => void;\r\n disabled?: boolean;\r\n inputError?: boolean;\r\n valid?: (current: any) => boolean;\r\n}\r\n\r\nclass DateTimePicker extends React.Component {\r\n\r\n public render() {\r\n\r\n return (\r\n
\r\n \r\n
\r\n ); \r\n }\r\n\r\n private onChange = (moment) => {\r\n if (typeof moment === \"string\")\r\n this.props.onError && this.props.onError(moment);\r\n else\r\n this.props.onChange(moment);\r\n }\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n locale: state.localization.locale\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(DateTimePicker)\r\n","import React, { CSSProperties } from \"react\";\r\nimport { Link } from \"react-router-dom\";\r\n\r\nimport TenantLink from \"modules/common/components/tenantLink\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\r\nimport { Box } from \"@mui/material\";\r\n\r\nconst useStyles = makeStyles(() =>\r\n createStyles({\r\n breadcrumb: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n marginBottom: 10,\r\n \"& a\": {\r\n \"&:hover\": {\r\n textDecoration: \"none\"\r\n }\r\n },\r\n \"& > a\": {\r\n display: \"inline-block\",\r\n marginTop: 5\r\n }\r\n },\r\n crumbs: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n fontWeight: 600,\r\n \"& > div\": {\r\n display: \"inline-flex\",\r\n alignItems: \"center\"\r\n },\r\n \"& a\": {\r\n color: \"#adb7c1\"\r\n }\r\n },\r\n separator: {\r\n color: \"#adb7c1\",\r\n padding: \"0 8px\"\r\n },\r\n title: {\r\n color: \"#adb7c1\"\r\n },\r\n titleLink: {\r\n color: \"#adb7c1\",\r\n cursor: \"pointer\"\r\n },\r\n backItem: {\r\n fontWeight: 400,\r\n paddingLeft: 0,\r\n textTransform: \"none\",\r\n \"&:hover\": {\r\n backgroundColor: \"transparent\"\r\n }\r\n },\r\n breadcrumbOptions: {\r\n \"& button, & div\": {\r\n marginRight: 8,\r\n \"&:last-child\": {\r\n marginRight: 0\r\n }\r\n },\r\n \"&.flex\": {\r\n display: \"flex\",\r\n alignItems: \"center\"\r\n },\r\n }\r\n })\r\n);\r\n\r\nconst BackItem: React.FunctionComponent = props => {\r\n const classes = useStyles();\r\n\r\n const getButton = (onClick?: () => void): JSX.Element =>\r\n ;\r\n\r\n return props.link\r\n ? {getButton()}\r\n : getButton(props.onClick);\r\n}\r\n\r\nconst Breadcrumb: React.FunctionComponent = props => {\r\n const classes = useStyles();\r\n const getLeftComponent = () => {\r\n return
\r\n
\r\n {props.items.map((item, index) => (\r\n
\r\n {item.link\r\n ? \r\n {item.title}\r\n \r\n : item.onClick\r\n ? {item.title}\r\n : item.handleLinkByParent\r\n ? \r\n {item.title}\r\n \r\n : {item.title}\r\n }\r\n {index < props.items.length - 1 ?
/
: null}\r\n
\r\n ))}\r\n
\r\n {!!props.backItem && }\r\n
\r\n }\r\n\r\n return (\r\n
\r\n \r\n {getLeftComponent()}\r\n {props.middleComponent}\r\n \r\n {props.rightComponent &&\r\n
\r\n {props.rightComponent}\r\n
\r\n }\r\n
\r\n );\r\n}\r\n\r\ninterface BreadcrumbItem {\r\n title: string;\r\n link?: string;\r\n handleLinkByParent?: () => void;\r\n onClick?: () => void;\r\n}\r\n\r\ninterface BackItem {\r\n title: string;\r\n link?: string;\r\n onClick?: () => void;\r\n textStyle?: CSSProperties;\r\n}\r\n\r\ninterface ComponentProps {\r\n items: BreadcrumbItem[];\r\n backItem?: BackItem;\r\n middleComponent?: JSX.Element;\r\n rightComponent?: JSX.Element;\r\n isFlex?: boolean;\r\n}\r\n\r\nexport default Breadcrumb;\r\nexport { BackItem };\r\n","import * as React from \"react\";\r\nimport { withRouter, RouteComponentProps, Prompt } from \"react-router\";\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport * as actions from '../actionCreator';\r\nimport { push } from 'react-router-redux';\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { Survey, SurveyQuestion } from \"../models\";\r\nimport * as RemoteFocusRequests from 'modules/common/remoteFocusRequest';\r\nimport PageToolBar from \"modules/common/components/pageToolBar\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport TextInput from 'modules/common/components/forms/inputs/textInput';\r\nimport moment from 'moment';\r\nimport DateTimePicker from \"modules/common/components/DateTimePicker\";\r\nimport confirm from 'utils/notyPopups';\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Breadcrumb from \"pages/common/breadcrumb\";\r\nimport MainContent from \"pages/common/mainContent\";\r\n\r\nimport './surveyEdit.sass';\r\n\r\nclass SurveyEdit extends React.Component{\r\n\r\n constructor(props){\r\n super(props);\r\n\r\n let survey = {\r\n id: '',\r\n title: '',\r\n author: this.props.currentUserFullName || '',\r\n questions: [{body: '', answers: [{body: ''}, {body: ''}]}] as SurveyQuestion[],\r\n publishTime: `${moment().add(1, 'days').toISOString()}`,\r\n expiryTime: `${moment().add(1, 'months').toISOString()}`\r\n } as Survey;\r\n\r\n this.state = {\r\n survey,\r\n changedSinceSaved: false,\r\n errors: [],\r\n top: 0,\r\n published: false,\r\n contentLoaded: !!!this.props.match.params.surveyId\r\n };\r\n }\r\n\r\n public componentWillMount() {\r\n if(this.props.match.params.surveyId){\r\n this.props.getSurvey(this.props.match.params.surveyId)\r\n .then(survey => {\r\n this.setState(prev => ({\r\n ...prev,\r\n survey,\r\n published: new Date(survey.publishTime!).getTime() <= Date.now(),\r\n contentLoaded: true\r\n }));\r\n });\r\n }\r\n }\r\n\r\n public componentDidMount() {\r\n this.props.clearSurveyList();\r\n\r\n if (typeof (window as any) !== 'undefined') {\r\n window.addEventListener('scroll', this.windowScrolledHandler);\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n if (typeof (window as any) !== 'undefined') {\r\n window.removeEventListener('scroll', this.windowScrolledHandler);\r\n }\r\n }\r\n\r\n private windowScrolledHandler = (e) => {\r\n this.setState(prev => ({...prev, top: window.pageYOffset })); // pageYOffset instead of scrollY for IE compatibility\r\n }\r\n\r\n public shouldComponentUpdate(np, nextState) {\r\n return nextState.top === this.state.top\r\n || nextState.errors.length > 0\r\n || nextState.errors.length !== this.state.errors.length;\r\n }\r\n\r\n public render() {\r\n moment.locale(\"en\");\r\n\r\n // https://github.com/arqex/react-datetime#selectable-dates - for getting valid dates\r\n var yesterday = moment().subtract( 1, 'day' );\r\n var valid = function( current ) {\r\n return current.isAfter( yesterday );\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {`Save`}, onClick: this.save },\r\n { key: 'back', label: 'Back', onClick: this.cancelEditing }\r\n ]}\r\n overflowButtons={this.state.survey.id ? [{ key: 'delete', label: 'Delete', onClick: this.delete }] : []}\r\n fixedOptions={{ fixedAtHeight: 91 }} />\r\n
\r\n
\r\n
\r\n
\r\n {\r\n this.state.contentLoaded &&\r\n \r\n }\r\n\r\n \r\n
\r\n

{`Publish Time:`}

\r\n \r\n

{`Note: Once a survey becomes available, only its Expiry Time can be edited.`}

\r\n
\r\n
\r\n

{`Expiry Time:`}

\r\n \r\n
\r\n
\r\n
\r\n {\r\n this.state.survey.questions.map((question, questionIndex) => {\r\n return (\r\n
\r\n { this.state.contentLoaded &&\r\n this.questionBodyChanged(questionIndex, changedVal)}\r\n value={question.body}\r\n disabled={this.state.published}\r\n />\r\n }\r\n
\r\n {\r\n question.answers\r\n .concat(!this.state.published && question.answers.length < 5 && question.answers[question.answers.length - 1].body ? [{body: ''}] : [])\r\n .map((answer, answerIndex) => {\r\n return (\r\n this.state.contentLoaded &&\r\n this.answerChanged(questionIndex, answerIndex, s)}\r\n value={answer.body}\r\n disabled={this.state.published}\r\n key={`question-${questionIndex}-answer-${answerIndex}`}\r\n />\r\n );\r\n })\r\n }\r\n
\r\n {\r\n question.answers.length > 2 && !this.state.published &&\r\n this.removeAnswer(questionIndex)} value='Remove Answer' />\r\n }\r\n
\r\n );\r\n })\r\n }\r\n
\r\n
\r\n
\r\n {\r\n this.isBusy() &&\r\n
\r\n \r\n
\r\n }\r\n
\r\n { this.state.errors.length > 0 &&\r\n
50 ) ? `${this.state.top + 60}px` : 'auto' }}>\r\n
{this.state.errors.map((e,i) =>
  • {`- ${e}`}
  • ) }
    \r\n
    \r\n }\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private onPublishTimeChanged = (moment) => {\r\n let date = moment.toDate ? new Date(moment.toDate()).toISOString() : moment;\r\n this.fieldChanged(\"publishTime\", date);\r\n }\r\n\r\n private onExpiryTimeChanged = (moment) => {\r\n let date = moment.toDate ? new Date(moment.toDate()).toISOString() : moment;\r\n this.fieldChanged(\"expiryTime\", date);\r\n }\r\n\r\n private removeAnswer = (questionIndex: number) => {\r\n const questions = [...this.state.survey.questions];\r\n questions[questionIndex].answers.pop();\r\n this.fieldChanged(\"questions\", questions);\r\n }\r\n\r\n private answerChanged = (questionIndex: number, answerIndex: number, answerBody: string) => {\r\n const questions = [...this.state.survey.questions];\r\n const answers = questions[questionIndex].answers;\r\n if(!answers[answerIndex])\r\n answers.push({body: ''})\r\n answers[answerIndex].body = answerBody;\r\n this.fieldChanged(\"questions\", questions);\r\n }\r\n\r\n private questionBodyChanged = (index: number, questionBody: string) => {\r\n const questions = [...this.state.survey.questions];\r\n questions[index].body = questionBody;\r\n this.fieldChanged(\"questions\", questions);\r\n }\r\n\r\n private titleChanged = (title: string) => this.fieldChanged(\"title\", title);\r\n private authorChanged = (author: string) => this.fieldChanged(\"author\", author);\r\n\r\n private fieldChanged = (fieldName: string, value: any) => {\r\n this.setState(prev => ({\r\n ...prev,\r\n survey: {\r\n ...prev.survey,\r\n [fieldName]: value\r\n },\r\n changedSinceSaved: true\r\n }));\r\n }\r\n\r\n private cancelEditing = () => {\r\n this.props.redirectTo(`/${this.props.match.params.tenant}/admin/surveys`)\r\n }\r\n\r\n private save = async () => {\r\n const errors = this.surveyErrors();\r\n if (errors.length > 0) {\r\n this.setState(prev => ({ ...prev, errors }));\r\n }else if (!this.isBusy()) {\r\n const updateMethod = this.state.published ? this.props.updateExpiryTime : this.props.saveSurvey;\r\n let published = this.state.published;\r\n const saveWillPublish = \"Based on the Publish Time, this survey will be immediately available after saving. After a survey is available, it cannot be changed. Are you sure you want to save?\";\r\n\r\n if(new Date(this.state.survey.publishTime!).getTime() <= Date.now() && !published){\r\n if(!(await confirm.show({ text: saveWillPublish, title: \"Immediate publishing\" })))\r\n return;\r\n published = true;\r\n }\r\n\r\n updateMethod(this.state.survey)\r\n .then(survey => {\r\n this.setState(prev => ({\r\n ...prev,\r\n survey,\r\n changedSinceSaved: false,\r\n errors: [],\r\n published\r\n }));\r\n });\r\n }\r\n }\r\n\r\n private surveyErrors = (): string[] => {\r\n let errors = [] as string[];\r\n const survey = this.state.survey;\r\n const publishDate = new Date(survey.publishTime!);\r\n const expiryDate = new Date(survey.expiryTime!);\r\n\r\n if (publishDate.getTime() >= expiryDate.getTime())\r\n errors.push(\"Expiry time must come after publish time.\");\r\n\r\n if (!survey.title || !survey.author)\r\n errors.push(\"Surveys must include a Title and an Author.\");\r\n\r\n for (let question of survey.questions){\r\n if (!question.body)\r\n errors.push(\"All questions must have content.\");\r\n if (question.answers.filter(a => a.body).length < 2)\r\n errors.push(\"Questions must have at least 2 answers with content.\");\r\n for (let answer of question.answers){\r\n if(!answer.body)\r\n errors.push(\"Each answer must have content. Add content or remove empty answers.\");\r\n }\r\n }\r\n return Array.from(new Set(errors)); //remove duplicates\r\n }\r\n\r\n private delete = async () => {\r\n if (!this.isBusy() && (await confirm.show({ text: \"Are you sure you want to delete this survey?\", title: \"Survey deletion\" }))){\r\n this.props.deleteSurveys([this.state.survey.id])\r\n .then(() => this.props.redirectTo(`/${this.props.match.params.tenant}/admin/surveys`));\r\n }\r\n }\r\n\r\n private isBusy = () => this.props.loading || this.props.saving || this.props.deleting;\r\n}\r\n\r\ninterface RouteParams {\r\n tenant: string;\r\n surveyId: string;\r\n}\r\n\r\ninterface ComponentState {\r\n survey: Survey;\r\n changedSinceSaved: boolean;\r\n errors: string[];\r\n top: number;\r\n published: boolean;\r\n /** Used so that text inputs only render after content arrives (unless creating new). This\r\n fixed an issue where multi-line text inputs were not refitting to content size b/c on their\r\n initial render, there was no content */\r\n contentLoaded: boolean;\r\n}\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n surveyList: state.surveys.surveyList,\r\n loading: state.surveys.isFetching,\r\n deleting: state.surveys.isDeleting,\r\n saving: state.surveys.isSaving,\r\n currentUserFullName: state.settings.currentUser ? `${state.settings.currentUser.firstName} ${state.settings.currentUser.lastName}` : null\r\n }),\r\n {\r\n deleteSurveys: actions.deleteSurveys,\r\n saveSurvey: actions.saveSurvey,\r\n updateExpiryTime: actions.updateSurveyExpiry,\r\n redirectTo: push,\r\n getSurvey: actions.getSurvey,\r\n clearSurveyList: actions.clearSurveyList\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(withRouter(SurveyEdit));\r\n","import * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport { HorizontalBar } from 'react-chartjs-2';\r\nimport { Survey, SurveyAnswer } from '../models';\r\nimport Loading from \"modules/common/components/loading\";\r\nimport * as actions from '../actionCreator';\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Breadcrumb from \"pages/common/breadcrumb\";\r\nimport MainContent from \"pages/common/mainContent\";\r\n\r\nimport './surveyDetails.sass';\r\nimport { withRouter, RouteComponentProps } from 'react-router';\r\n\r\nclass SurveyDetails extends React.Component{\r\n constructor(props){\r\n super(props);\r\n this.state = { \r\n survey: null\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n if(this.props.match.params.surveyId){\r\n this.props.getSurvey(this.props.match.params.surveyId)\r\n .then(survey => {\r\n this.setState(prev => ({ ...prev, survey}));\r\n });\r\n }\r\n }\r\n \r\n public render() {\r\n if(this.props.loading || !this.state.survey) return ;\r\n return (\r\n \r\n \r\n \r\n
    \r\n

    {this.state.survey.title}

    \r\n
    \r\n
    \r\n

    \r\n {`Total Responses`}
    \r\n {Object.keys(this.state.survey.aggregatedResults).reduce((acc, key) => acc + this.state.survey!.aggregatedResults[key] , 0)}\r\n

    \r\n
    \r\n
    \r\n
  • {`Author: `}{this.state.survey.author}
  • \r\n
  • {`Publish Time: `}{this.formattedDate(this.state.survey.publishTime)}
  • \r\n
  • {`Expiry Time: `}{this.state.survey.expiryTime ? this.formattedDate(this.state.survey.expiryTime) : 'Never'}
  • \r\n
    \r\n
    \r\n
    \r\n

    {this.state.survey.questions[0].body}

    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private formattedDate = (dateString) => {\r\n return new Date(dateString).toLocaleString();\r\n }\r\n\r\n private getQuestionData = () => {\r\n const results = this.state.survey!.aggregatedResults;\r\n return Object.keys(results)\r\n .map(key => results[key]);\r\n }\r\n\r\n private getLabels = (questionIndex) => {\r\n const answers = this.state.survey!.questions[questionIndex].answers;\r\n return answers\r\n .map(a => this.makeMultiline(a.body).concat(`${this.isYourAnswer(a) ? ' (your response)' : ''}`));\r\n }\r\n\r\n private makeMultiline = (label: string): string[] => {\r\n const words = label.split(\" \");\r\n let newLabel = [] as string[];\r\n let i = 0;\r\n while (words.length > 0){\r\n let selectedWords = words.slice(0, i);\r\n if(i === words.length - 1 || this.totalCharactersInWords(selectedWords) > 18){\r\n newLabel.push(words.splice(0, i+1).join(\" \"));\r\n i = 0;\r\n }else{\r\n i++;\r\n }\r\n }\r\n return newLabel;\r\n }\r\n\r\n private totalCharactersInWords = (words: string[]) => {\r\n return words.reduce((acc, word) => acc + word.length, 0);\r\n }\r\n\r\n private isYourAnswer = (answer: SurveyAnswer) => {\r\n return !!this.state.survey && this.state.survey.userResponse && answer.id === this.state.survey.userResponse.answerId;\r\n }\r\n}\r\n\r\ninterface RouteParams {\r\n surveyId: string;\r\n}\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\ninterface ComponentState{\r\n survey: Survey | null\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n loading: state.surveys.isFetching\r\n }),\r\n {\r\n getSurvey: actions.getSurvey\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(withRouter(SurveyDetails));","import * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux'\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport * as actions from '../actionCreator';\r\nimport { ReactionTab } from '../models';\r\nimport ToggleSwitch from 'modules/common/components/toggleSwitch';\r\nimport { errorAlert } from 'utils/notyPopups';\r\n\r\nconst SystemMaxCommentLength = 1000;\r\n\r\nclass GeneralSettingsForm extends React.Component {\r\n\r\n private maxReactionCount = 6;\r\n\r\n public render() {\r\n const working = this.props.saving || this.props.fetching;\r\n\r\n const enabledReactions = this.props.tenantSettings.reactions.filter(reaction => reaction.enabled);\r\n\r\n const disabledReactions = this.props.tenantSettings.reactions.filter(reaction => !reaction.enabled);\r\n\r\n const showingEnabledReactions = this.props.activeReactionTab === ReactionTab.Enabled;\r\n\r\n const reactionsEnabledClass = \"form-group group-\" + (this.props.tenantSettings.reactionsEnabled ? 'visible' : 'hidden');\r\n const commentsEnabledClass = \"form-group group-\" + (this.props.tenantSettings.commentsEnabled ? 'visible' : 'hidden');\r\n\r\n return
    \r\n
    \r\n

    Reactions

    \r\n
    \r\n
      \r\n
    • \r\n { this.props.setActiveReactionTab(ReactionTab.Enabled); } }\r\n className={'tab-btn' + (showingEnabledReactions ? ' active' : '')}>\r\n Enabled ({enabledReactions.length})\r\n \r\n
    • \r\n
    • \r\n { this.props.setActiveReactionTab(ReactionTab.Disabled); } }\r\n className={'tab-btn' + (!showingEnabledReactions ? ' active' : '')}>\r\n Disabled ({disabledReactions.length})\r\n \r\n
    • \r\n
    \r\n
    \r\n
    \r\n {!enabledReactions.length\r\n ? 'All reactions are currently disabled'\r\n :
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n enabledReactions.map((reaction, index, reactions) => {\r\n return \r\n \r\n \r\n \r\n \r\n \r\n })}\r\n \r\n
    NameEnabled
    \r\n {\r\n reaction.enabled ?\r\n
    \r\n \r\n \r\n
    \r\n :\r\n null\r\n }\r\n
    \r\n \r\n {reaction.sentiment}\r\n\r\n \r\n \r\n { this.handleReactionNameChange(reaction.id, e); } } />\r\n \r\n \r\n
    \r\n
    \r\n Limit {this.maxReactionCount}\r\n
    \r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n {!disabledReactions.length\r\n ? 'All reactions are currently enabled'\r\n :
    \r\n \r\n \r\n {\r\n disabledReactions.map((reaction, index, reactions) => {\r\n return \r\n \r\n \r\n \r\n \r\n })}\r\n \r\n
    \r\n \r\n {reaction.sentiment}\r\n\r\n \r\n \r\n { this.enableReaction(reaction.id, true) } }\r\n disabled={this.props.saving}>Enable\r\n {reaction.name}
    \r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    Reaction Toggles

    \r\n
    \r\n \r\n
    \r\n { this.props.setReactionsEnabled(!this.props.tenantSettings.reactionsEnabled); } }\r\n disabled={working} />\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n { this.props.setIsReactingEnabledForNewPostsByDefault(!this.props.tenantSettings.isReactingEnabledForNewPostsByDefault); } }\r\n disabled={working} />\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n { this.props.setCanContributorsToggleReactions(!this.props.tenantSettings.canContributorsToggleReactions); } }\r\n disabled={working} />\r\n
    \r\n
    \r\n

    Comments

    \r\n
    \r\n \r\n
    \r\n { this.props.setCommentsEnabled(!this.props.tenantSettings.commentsEnabled); } }\r\n disabled={working} />\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n { this.props.setIsCommentingEnabledForNewPostsByDefault(!this.props.tenantSettings.isCommentingEnabledForNewPostsByDefault); } }\r\n disabled={working || !this.props.tenantSettings.commentsEnabled} />\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n { this.props.setGifSelectionEnabledForComments(!this.props.tenantSettings.gifSelectionEnabledForComments); } }\r\n disabled={working || !this.props.tenantSettings.commentsEnabled} />\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n { this.props.setIsCommentModerationEnabled(!this.props.tenantSettings.commentModerationEnabled); } }\r\n disabled={working || !this.props.tenantSettings.commentsEnabled} />\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n { this.props.setCanContributorsToggleComments(!this.props.tenantSettings.canContributorsToggleComments); } }\r\n disabled={working} />\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n {`characters (Max. ${SystemMaxCommentLength})`}\r\n
    \r\n
    \r\n
    \r\n
    \r\n

    Users

    \r\n \r\n
    \r\n {`${this.props.tenantSettings.totalUserCountForReporting}`}\r\n
    \r\n\r\n\r\n
    \r\n {/* for some tenant's with a custom url portal, we handle the prefix behind the scenes */}\r\n {this.props.tenantSettings.localAccountsEnabled &&\r\n this.props.tenantSettings.localAccountPrefix &&\r\n window.location.host.split(\".\")[0].toLowerCase() !== this.props.tenantSettings.localAccountPrefix.toLowerCase() &&\r\n
    \r\n

    Local Accounts

    \r\n
    \r\n\r\n \r\n
    \r\n {`${this.props.tenantSettings.localAccountPrefix}`}\r\n
    \r\n
    \r\n
    \r\n }\r\n
    \r\n

    External Post Sources

    \r\n
    \r\n \r\n\r\n

    \r\n Set this to determine how many days it will take for external draft posts to automatically delete.\r\n

    \r\n
    \r\n { this.props.setExternalPostPurgeEnabled(!this.props.tenantSettings.externalPostPurgeEnabled); } }\r\n disabled={working} />\r\n\r\n \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n

    Managing Topics and Audiences

    \r\n
    \r\n \r\n
    \r\n { this.props.setManageTopicsAudiencesInAdmin(!this.props.tenantSettings.manageTopicsAudiencesInAdmin); } }\r\n disabled={working} />\r\n
    \r\n

    \r\n Topics and audiences will be managed from SharePoint or Teams if disabled.\r\n

    \r\n
    \r\n
    \r\n
    \r\n

    Posts

    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n {\r\n this.hasMandatoryExpiryTime() &&\r\n
    \r\n \r\n

    \r\n
    \r\n \r\n days\r\n
    \r\n
    \r\n }\r\n
    \r\n
    \r\n

    Support

    \r\n
    \r\n \r\n

    \r\n User issues, requests, and feedback will be sent to this email.\r\n

    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n\r\n\r\n
    \r\n

    Banners

    \r\n
    \r\n \r\n
    \r\n { this.props.setRestrictedBannerEnabled(!this.props.tenantSettings.bannerVisibility.showRestrictedBanner)}}\r\n disabled={working} />\r\n
    \r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n\r\n private NotificationWait = () => {\r\n let ts = this.props.tenantSettings;\r\n let propExists = ts && ts.flaggingSettings;\r\n if(propExists && isNaN(ts.flaggingSettings.minimumNotificationWait)){\r\n return NaN;\r\n }\r\n return propExists ? ts.flaggingSettings.minimumNotificationWait || 30 : 30;\r\n }\r\n\r\n private externalPostPurgeInDaysWait = () => {\r\n let ts = this.props.tenantSettings;\r\n let propExists = ts && ts.flaggingSettings;\r\n\r\n return propExists ? ts.externalPostPurgeInDays : 0;\r\n }\r\n\r\n private flaggingNotificationWaitChanged = (e: React.FormEvent) => {\r\n let input = e.target as HTMLInputElement;\r\n let value = parseInt(input.value, 10);\r\n this.props.setFlaggingNotificationWait(value);\r\n }\r\n\r\n private hasMandatoryExpiryTime = (): boolean => {\r\n const ts = this.props.tenantSettings;\r\n //check NaN so user can empty the number input without making the form disappear\r\n return !!(ts && (ts.mandatoryExpiryTime || (isNaN(ts.mandatoryExpiryTime) && typeof ts.mandatoryExpiryTime !== \"undefined\")))\r\n }\r\n\r\n private handleExternalPostPurgeInDaysChange = (e: React.FormEvent) => {\r\n let input = e.target as HTMLInputElement;\r\n let value = parseInt(input.value, 10);\r\n this.props.setExternalPostPurgeInDays(value)\r\n }\r\n\r\n private handleMandatoryExpiryTimeChange = (e: React.FormEvent) => {\r\n const input = e.target as HTMLInputElement;\r\n const value = parseInt(input.value, 10); //can be NaN when form is empty\r\n this.props.setMandatoryExpiryTime(value);\r\n }\r\n\r\n private handleCommentMaxLengthChange = (e: React.FormEvent) => {\r\n let input = e.target as HTMLInputElement;\r\n let value = parseInt(input.value, 10);\r\n value = Math.min(value, SystemMaxCommentLength)\r\n this.props.setCommentMaxLength(value);\r\n }\r\n\r\n private handleReactionNameChange = (id: any, e: React.FormEvent) => {\r\n let input = e.target as HTMLInputElement;\r\n this.props.setReactionName(id, input.value);\r\n }\r\n\r\n private handleSupportEmailChange = (e: React.FormEvent) => {\r\n let input = e.target as HTMLInputElement;\r\n this.props.setSupportEmail(input.value);\r\n }\r\n\r\n private enableReaction = (reactionId, value) => {\r\n if (value && this.props.tenantSettings.reactions.filter(reaction => reaction.enabled).length >= this.maxReactionCount) {\r\n errorAlert(\"Only 6 enabled reactions are permitted\");\r\n }\r\n else {\r\n this.props.setReactionEnabled(reactionId, value)\r\n }\r\n }\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n fetching: state.settings.fetching,\r\n saving: state.settings.saving,\r\n lcids: Object.keys(state.settings.tenantSettings.translatedContent).sort(),\r\n lcidMappings: state.resources.lcidMappings,\r\n tenantSettings: state.settings.tenantSettings,\r\n activeReactionTab: state.settings.activeReactionTab\r\n }),\r\n {\r\n setShowInvitedExternalUsers: actions.setShowInvitedExternalUsers,\r\n setPostNotificationsEnabled: actions.setPostNotificationsEnabled,\r\n setSmsNotificationsEnabled: actions.setSmsNotificationsEnabled,\r\n setEmailNotificationsEnabled: actions.setEmailNotificationsEnabled,\r\n setCommentsEnabled: actions.setCommentsEnabled,\r\n setReactionsEnabled: actions.setReactionsEnabled,\r\n setIsReactingEnabledForNewPostsByDefault: actions.setIsReactingEnabledForNewPostsByDefault,\r\n setCanContributorsToggleReactions: actions.setCanContributorsToggleReactions,\r\n setCanContributorsToggleComments: actions.setCanContributorsToggleComments,\r\n setManageTopicsAudiencesInAdmin: actions.setManageTopicsAudiencesInAdmin,\r\n setExternalPostPurgeEnabled: actions.setExternalPostPurgeEnabled,\r\n setEveryoneAudienceEnforcementEnabled: actions.setEveryoneAudienceEnforcementEnabled,\r\n setIsCommentingEnabledForNewPostsByDefault: actions.setIsCommentingEnabledForNewPostsByDefault,\r\n setIsCommentModerationEnabled: actions.setCommentModerationEnabled,\r\n setGifSelectionEnabledForComments: actions.setGifSelectionEnabledForComments,\r\n setCommentMaxLength: actions.setCommentMaxLength,\r\n setReactionEnabled: actions.setReactionEnabled,\r\n setReactionName: actions.setReactionName,\r\n moveReaction: actions.moveReaction,\r\n setActiveReactionTab: actions.setActiveReactionTab,\r\n setResetLocalUserPassword: actions.setResetLocalUserPassword,\r\n\r\n setExternalPostPurgeInDays: actions.setExternalPostPurgeInDays,\r\n setMandatoryExpiryTime: actions.setMandatoryExpiryTime,\r\n setFlaggingNotificationWait: actions.setFlaggingNotificationWait,\r\n toggleMandatoryExpiryTime: actions.toggleMandatoryExpiryTime,\r\n setSupportEmail: actions.setSupportEmail,\r\n setRestrictedBannerEnabled: actions.setRestrictedBannerEnabled\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(GeneralSettingsForm);\r\n","import * as React from 'react';\r\nimport './specialtyBanner.sass';\r\n\r\ninterface ComponentProps {\r\n bannerType: string\r\n title: string\r\n color: string\r\n width?: string\r\n height?: string\r\n}\r\n\r\nclass SpecialtyBanner extends React.Component {\r\n\r\n public render() {\r\n return
    \r\n
    \r\n {this.getIcon(this.props.bannerType, this.props.height!)}\r\n {this.props.bannerType !== \"public\" ? \r\n
    {this.props.title}
    \r\n :\r\n
    {this.props.title}
    \r\n }\r\n
    \r\n \r\n \r\n \r\n
    \r\n }\r\n\r\n private getIcon = (type: string, height: string): JSX.Element => {\r\n if (type === \"mandatory\") {\r\n return \r\n \r\n \r\n \r\n \r\n \r\n\r\n }\r\n else if (type === \"compliance\") {\r\n\r\n return \r\n \r\n \r\n }\r\n else if (type === \"complianceChecked\") {\r\n return \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n else if (type === \"breaking\") {\r\n return \r\n \r\n \r\n }\r\n else if (type === \"featured\") {\r\n return \r\n \r\n \r\n \r\n } else if (type === \"restricted\") {\r\n return \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n } else if (type === \"public\") {\r\n return \r\n \r\n \r\n }\r\n else {\r\n return \r\n }\r\n }\r\n}\r\n\r\nexport default SpecialtyBanner;","//Checks to make sure a given string is is a valid hex code, returns null if not.\r\n\r\nexport const hexCodeFromText = (text: string) => {\r\n if (/^#[0-9a-fA-F]{6}$/.test(text)) {\r\n return text;\r\n } else if (/^#[0-9a-fA-F]{3}$/.test(text)) {\r\n return text.replace(/[0-9a-fA-F]{1}/g, `$&$&`);\r\n }\r\n return null;\r\n}","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\"\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { actions } from \"../\";\r\nimport { ThemeSettings, SpecialtyPostColors, MobileThemeColors } from \"../models\";\r\n\r\nimport { ChromePicker } from 'react-color';\r\nimport SpecialtyBanner from 'modules/common/components/specialtyBanner';\r\nimport { hexCodeFromText } from \"utils/hexFunctions\";\r\n\r\n\r\nconst DEFAULT_THEME_COLOR = \"#174e87\"\r\nconst DEFAULT_BRAND_LIGHT_COLOR = \"#ffffff\";\r\nconst DEFAULT_ACCENT_COLOR = \"#ffffff\";\r\nconst DEFAULT_SPECIALTY_BANNER_COLORS = { mandatory: \"#004e79\", compliance: \"#faaf18\", complianceChecked: \"#05b34b\", breaking: \"#fe0004\", featured: \"#e6911a\", restricted: \"#b72026\", public: \"#fcfcf9\"}\r\n\r\nclass ThemeSettingsForm extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = { \r\n isPendingBrandColorValid: true, \r\n isPendingSpecialtyOptionsValid: { mandatory: true, compliance: true, complianceChecked: true, breaking: true, featured: true, restricted: true, public: true},\r\n isPendingAccentColorValid: true,\r\n isPendingBrandLightColorValid: true,\r\n\r\n pendingBrandColor: props.brandColor, \r\n pendingAccentColor: props.accentColor,\r\n pendingBrandLightColor: props.brandLightColor,\r\n\r\n pendingSpecialtyOptionColors: props.specialtyColors,\r\n pendingMobileOptionColors: props.mobileThemeColors,\r\n\r\n showingBrandColorPicker: false,\r\n showingAccentColorPicker: false,\r\n showingBrandLightColorPicker: false,\r\n showingSpecialtyOptionColorPicker: { mandatory: false, compliance: false, complianceChecked: false, breaking: false, featured: false, restricted: false, public: false },\r\n };\r\n }\r\n\r\n public shouldComponentUpdate(nextProps, nextState) {\r\n return (\r\n \r\n this.props.brandColor !== nextProps.brandColor\r\n || this.props.accentColor !== nextProps.accentColor\r\n || this.props.brandLightColor !== nextProps.brandLightColor\r\n || this.props.tenantDisplayName !== nextProps.tenantDisplayName\r\n || this.props.specialtyColors !== nextProps.specialtyColors\r\n || this.props.translatedContent !== nextProps.translatedContent\r\n\r\n\r\n || this.state.isPendingBrandColorValid !== nextState.isPendingBrandColorValid\r\n || this.state.isPendingAccentColorValid !== nextState.isPendingAccentColorValid\r\n || this.state.isPendingBrandLightColorValid !== nextState.isPendingBrandLightColorValid\r\n || this.state.isPendingSpecialtyOptionsValid !== nextState.isPendingSpecialtyOptionsValid\r\n\r\n || this.state.pendingBrandColor !== nextState.pendingBrandColor\r\n || this.state.pendingAccentColor !== nextState.pendingAccentColor\r\n || this.state.pendingBrandLightColor !== nextState.pendingBrandLightColor\r\n || this.state.pendingSpecialtyOptionColors !== nextState.pendingSpecialtyOptionColors\r\n\r\n || this.state.showingBrandColorPicker !== nextState.showingBrandColorPicker\r\n || this.state.showingAccentColorPicker !== nextState.showingAccentColorPicker\r\n || this.state.showingBrandLightColorPicker !== nextState.showingBrandLightColorPicker\r\n || this.state.showingSpecialtyOptionColorPicker !== nextState.showingSpecialtyOptionColorPicker\r\n );\r\n }\r\n\r\n public componentWillReceiveProps(nextProps: PropsWithRedux) {\r\n this.setState({ \r\n ...this.state,\r\n isPendingBrandColorValid: true, \r\n isPendingAccentColorValid: true,\r\n isPendingBrandLightColorValid: true,\r\n isPendingSpecialtyOptionsValid: { mandatory: true, compliance: true, complianceChecked: true, breaking: true, featured: true, restricted: true, public: true},\r\n pendingBrandColor: nextProps.brandColor!,\r\n pendingAccentColor: nextProps.accentColor!,\r\n pendingBrandLightColor: nextProps.brandLightColor!,\r\n pendingSpecialtyOptionColors: nextProps.specialtyColors,\r\n });\r\n }\r\n\r\n public render() {\r\n let working = this.props.saving || this.props.fetching;\r\n\r\n let brandColorPicker = (\r\n
    \r\n
    { e.stopPropagation(); }}>\r\n \r\n
    \r\n
    );\r\n\r\n return
    \r\n
    \r\n

    Theme

    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n this.validatePrimaryColor(e, \"brand\")}\r\n onClick={() => this.colorBlockClicked(\"brand\")}\r\n onChange={(e) => this.handlePrimaryColorChanged(e, \"brand\")}\r\n value={this.state.pendingBrandColor}\r\n style={{\r\n borderRightWidth: \"35px\",\r\n borderRightColor: this.state.pendingBrandColor\r\n }}\r\n />\r\n
    \r\n \r\n
    this.colorBlockClicked(\"brand\")} hidden={!this.state.showingBrandColorPicker}>\r\n clear\r\n
    \r\n {this.state.showingBrandColorPicker ? brandColorPicker : null}\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n

    Specialty Post Banner Colors

    \r\n
    \r\n
    \r\n {Object.keys(this.props.specialtyColors || {}).map((key, i) => {\r\n return
    \r\n \r\n
    \r\n this.validatePrimaryColor(e, \"specialtyBanner\", key)}\r\n onClick={() => this.colorBlockClicked(\"specialtyBanner\", key)}\r\n onChange={(e) => this.handlePrimaryColorChanged(e, \"specialtyBanner\", key)}\r\n value={this.state.pendingSpecialtyOptionColors[key]}\r\n style={{\r\n borderRightWidth: \"35px\",\r\n borderRightColor: this.state.pendingSpecialtyOptionColors[key]\r\n }}\r\n />\r\n
    \r\n
    \r\n \r\n
    \r\n \r\n
    this.colorBlockClicked(\"specialtyBanner\", key)} hidden={!this.state.showingSpecialtyOptionColorPicker[key]}>\r\n clear\r\n
    \r\n {this.state.showingSpecialtyOptionColorPicker[key] ? this.renderSpecialtyColorPicker(key) : null} \r\n
    \r\n })}\r\n
    \r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n private handleNameChange = (e: React.FormEvent) => {\r\n let input = e.target as HTMLInputElement;\r\n this.props.setTenantDisplayName(input.value);\r\n }\r\n\r\n private validatePrimaryColor = (e: React.FormEvent, type: string, option?: number | string) => {\r\n let input = e.target as HTMLInputElement;\r\n let hexcode = hexCodeFromText(input.value);\r\n let isHexCodeValid = hexcode !== null;\r\n\r\n if (type === \"brand\") {\r\n if (isHexCodeValid) {\r\n let themeSettings: ThemeSettings = { ...this.props.themeSettings!, color: hexcode };\r\n this.settingTheme(themeSettings);\r\n return;\r\n }\r\n this.setState({ \r\n ...this.state,\r\n isPendingBrandColorValid: false, \r\n pendingBrandColor: input.value \r\n });\r\n }\r\n else if (type === \"accent\") {\r\n if (isHexCodeValid) {\r\n let themeSettings: ThemeSettings = { ...this.props.themeSettings!, accent: hexcode };\r\n this.settingTheme(themeSettings);\r\n return;\r\n }\r\n this.setState({ \r\n ...this.state,\r\n isPendingAccentColorValid: false, \r\n pendingAccentColor: input.value \r\n });\r\n } \r\n else if (type === \"brandLight\") {\r\n if (isHexCodeValid) {\r\n let themeSettings: ThemeSettings = { ...this.props.themeSettings!, brandLight: hexcode };\r\n this.settingTheme(themeSettings);\r\n return;\r\n }\r\n this.setState({ \r\n ...this.state,\r\n isPendingBrandLightColorValid: false, \r\n pendingBrandLightColor: input.value \r\n });\r\n }\r\n else {\r\n if (isHexCodeValid) {\r\n this.props.setSpecialtyColorOption(option!, hexcode!)\r\n return;\r\n }\r\n\r\n let newIsPendingColorOptionValid = {...this.state.isPendingSpecialtyOptionsValid};\r\n newIsPendingColorOptionValid[option!] = false;\r\n\r\n let newPendingOptionColors = {...this.state.pendingSpecialtyOptionColors};\r\n newPendingOptionColors[option!] = input.value;\r\n\r\n this.setState({ \r\n ...this.state,\r\n isPendingSpecialtyOptionsValid: newIsPendingColorOptionValid, \r\n pendingSpecialtyOptionColors: newPendingOptionColors\r\n });\r\n } \r\n }\r\n\r\n private handlePrimaryColorChanged = (e: React.FormEvent, type: string, option?: number | string) => {\r\n let input = e.target as HTMLInputElement;\r\n let hexcode = hexCodeFromText(input.value);\r\n let isHexCodeValid = hexcode !== null;\r\n\r\n if (type === \"brand\") {\r\n if (isHexCodeValid) {\r\n let themeSettings: ThemeSettings = { ...this.props.themeSettings!, color: input.value };\r\n this.settingTheme(themeSettings);\r\n return;\r\n }\r\n\r\n this.setState({ \r\n ...this.state,\r\n pendingBrandColor: input.value });\r\n } else if (type === \"accent\") {\r\n if (isHexCodeValid) {\r\n let themeSettings: ThemeSettings = { ...this.props.themeSettings!, accent: input.value };\r\n this.settingTheme(themeSettings);\r\n return;\r\n }\r\n\r\n this.setState({ \r\n ...this.state,\r\n pendingAccentColor: input.value });\r\n } else if (type === \"brandLight\") {\r\n if (isHexCodeValid) {\r\n let themeSettings: ThemeSettings = { ...this.props.themeSettings!, brandLight: input.value };\r\n this.settingTheme(themeSettings);\r\n return;\r\n }\r\n\r\n this.setState({ \r\n ...this.state,\r\n pendingBrandLightColor: input.value });\r\n } else {\r\n if (isHexCodeValid) {\r\n this.props.setSpecialtyColorOption(option!, hexcode!)\r\n return;\r\n }\r\n\r\n let newPendingOptionColors = {...this.state.pendingSpecialtyOptionColors};\r\n newPendingOptionColors[option!] = input.value;\r\n\r\n this.setState({ \r\n ...this.state,\r\n pendingSpecialtyOptionColors: newPendingOptionColors\r\n });\r\n }\r\n }\r\n\r\n private handleBrandColorChangedFromPicker = (color) => {\r\n let themeSettings: ThemeSettings = { ...this.props.themeSettings!, color: color.hex };\r\n this.settingTheme(themeSettings);\r\n\r\n this.setState({\r\n ...this.state,\r\n isPendingBrandColorValid: true,\r\n pendingBrandColor: color.hex\r\n });\r\n }\r\n\r\n private handleAccentColorChangedFromPicker = (color) => {\r\n let themeSettings: ThemeSettings = { ...this.props.themeSettings!, accent: color.hex };\r\n this.settingTheme(themeSettings);\r\n\r\n this.setState({\r\n ...this.state,\r\n isPendingAccentColorValid: true,\r\n pendingAccentColor: color.hex\r\n });\r\n }\r\n\r\n private handleBrandLightColorChangedFromPicker = (color) => {\r\n let themeSettings: ThemeSettings = { ...this.props.themeSettings!, brandLight: color.hex };\r\n this.settingTheme(themeSettings);\r\n\r\n this.setState({\r\n ...this.state,\r\n isPendingBrandLightColorValid: true,\r\n pendingBrandLightColor: color.hex\r\n });\r\n }\r\n\r\n private handleSpecialtyColorChangedFromPicker = (color, option) => {\r\n this.props.setSpecialtyColorOption(option, color.hex);\r\n\r\n let newIsPendingOptionsValid = {...this.state.isPendingSpecialtyOptionsValid }\r\n newIsPendingOptionsValid[option] = true;\r\n\r\n let newPendingOptionColors = { ...this.state.pendingSpecialtyOptionColors }\r\n newPendingOptionColors[option] = color.hex;\r\n\r\n this.setState({\r\n ...this.state,\r\n isPendingSpecialtyOptionsValid: newIsPendingOptionsValid,\r\n pendingSpecialtyOptionColors: newPendingOptionColors\r\n });\r\n }\r\n\r\n private handleRestricted = (color) => {this.handleSpecialtyColorChangedFromPicker(color, \"restricted\")}\r\n private handlePublic = (color) => {this.handleSpecialtyColorChangedFromPicker(color, \"public\")}\r\n private handleMandatory = (color) => { this.handleSpecialtyColorChangedFromPicker(color, \"mandatory\") }\r\n private handleCompliance = (color) => { this.handleSpecialtyColorChangedFromPicker(color, \"compliance\") }\r\n private handleComplianceChecked = (color) => { this.handleSpecialtyColorChangedFromPicker(color, \"complianceChecked\") }\r\n private handleBreaking = (color) => { this.handleSpecialtyColorChangedFromPicker(color, \"breaking\") }\r\n private handleFeatured = (color) => { this.handleSpecialtyColorChangedFromPicker(color, \"featured\") }\r\n\r\n private colorBlockClicked = (type: string, option?: number | string) => {\r\n var newShowingSpecialtyColorPicker;\r\n\r\n if (type === \"specialtyBanner\") {\r\n newShowingSpecialtyColorPicker = {...this.state.showingSpecialtyOptionColorPicker}\r\n newShowingSpecialtyColorPicker[option!] = !this.state.showingSpecialtyOptionColorPicker[option!];\r\n }\r\n\r\n this.setState({\r\n ...this.state,\r\n showingBrandColorPicker: type === \"brand\"? !this.state.showingBrandColorPicker : this.state.showingBrandColorPicker,\r\n showingAccentColorPicker: type === \"accent\"? !this.state.showingAccentColorPicker : this.state.showingAccentColorPicker,\r\n showingBrandLightColorPicker: type === \"brandLight\"? !this.state.showingBrandLightColorPicker : this.state.showingBrandLightColorPicker,\r\n showingSpecialtyOptionColorPicker: type === \"specialtyBanner\" ? newShowingSpecialtyColorPicker : this.state.showingSpecialtyOptionColorPicker\r\n })\r\n }\r\n\r\n private resetColor = (color: string, type: string, option?: number | string ) => {\r\n if (type === \"brand\") {\r\n let themeSettings: ThemeSettings = {...this.props.themeSettings!, color: color};\r\n this.settingTheme(themeSettings);\r\n\r\n this.setState({\r\n ...this.state,\r\n isPendingBrandColorValid: true,\r\n pendingBrandColor: color\r\n });\r\n } else if (type === \"accent\") {\r\n let themeSettings: ThemeSettings = {...this.props.themeSettings!, accent: color};\r\n this.settingTheme(themeSettings);\r\n\r\n this.setState({\r\n ...this.state,\r\n isPendingAccentColorValid: true,\r\n pendingAccentColor: color\r\n });\r\n } else if (type === \"brandLight\") {\r\n let themeSettings: ThemeSettings = {...this.props.themeSettings!, brandLight: color};\r\n this.settingTheme(themeSettings);\r\n\r\n this.setState({\r\n ...this.state,\r\n isPendingBrandLightColorValid: true,\r\n pendingBrandLightColor: color\r\n });\r\n } else {\r\n if (option) {\r\n this.props.setSpecialtyColorOption(option, color);\r\n\r\n let newIsPendingOptionsValid = {...this.state.isPendingSpecialtyOptionsValid }\r\n newIsPendingOptionsValid[option] = color;\r\n \r\n let newPendingOptionColors = { ...this.state.pendingSpecialtyOptionColors }\r\n newPendingOptionColors[option] = color;\r\n \r\n this.setState({\r\n ...this.state,\r\n isPendingSpecialtyOptionsValid: newIsPendingOptionsValid,\r\n pendingSpecialtyOptionColors: newPendingOptionColors\r\n });\r\n }\r\n }\r\n }\r\n\r\n private renderSpecialtyColorPicker = (key: string): JSX.Element => {\r\n const handleColorChange = { mandatory: this.handleMandatory, compliance: this.handleCompliance, complianceChecked: this.handleComplianceChecked, breaking: this.handleBreaking, featured: this.handleFeatured, restricted: this.handleRestricted, public: this.handlePublic};\r\n\r\n return
    \r\n
    { e.stopPropagation(); }}>\r\n \r\n
    \r\n
    \r\n }\r\n\r\n private getMobileTitles = (key: string) => {\r\n let mobileTitles = { accent: \"Accent Color\", brandLight: \"Brand Color (Light)\" }\r\n return mobileTitles[key];\r\n }\r\n\r\n private getSpecialtyTitles = (key: string) => {\r\n let specialtyTitles = { mandatory: \"mandatoryPost\" , compliance: \"compliancePost\", complianceChecked: \"compliedPost\", breaking: \"breakingPost\", featured: \"featuredPost\", restricted: \"restrictedContent\", public: \"publicPost\" }\r\n let title = specialtyTitles[key];\r\n return this.props.translatedContent[this.props.defaultLCID][title];\r\n }\r\n\r\n private settingTheme = (themeSettings?: ThemeSettings) => {\r\n let skinningEnabled = !!themeSettings && (themeSettings.color !== DEFAULT_THEME_COLOR || themeSettings.accent !== DEFAULT_ACCENT_COLOR || themeSettings.brandLight !== DEFAULT_BRAND_LIGHT_COLOR) ;\r\n this.props.setThemeSettings(skinningEnabled, themeSettings)\r\n }\r\n}\r\n\r\ninterface ComponentState {\r\n isPendingBrandColorValid: boolean,\r\n isPendingBrandLightColorValid: boolean,\r\n isPendingAccentColorValid: boolean;\r\n pendingBrandColor: string,\r\n pendingBrandLightColor: string,\r\n pendingAccentColor: string,\r\n isPendingSpecialtyOptionsValid: { mandatory: boolean, compliance: boolean, complianceChecked: boolean, breaking: boolean, featured: boolean, restricted: boolean, public: boolean, },\r\n pendingSpecialtyOptionColors: SpecialtyPostColors,\r\n pendingMobileOptionColors: MobileThemeColors,\r\n showingBrandColorPicker: boolean,\r\n showingAccentColorPicker: boolean,\r\n showingBrandLightColorPicker: boolean,\r\n showingSpecialtyOptionColorPicker:{ mandatory: boolean, compliance: boolean, complianceChecked: boolean, breaking: boolean, featured: boolean, restricted: boolean, public: boolean },\r\n\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => {\r\n let tenantSettings = state.settings.tenantSettings;\r\n let themeSettings = tenantSettings.themeSettings;\r\n let brandColor = themeSettings && tenantSettings.themeEnabled ? themeSettings.color : DEFAULT_THEME_COLOR;\r\n let accentColor = themeSettings && tenantSettings.themeEnabled ? themeSettings.accent : DEFAULT_ACCENT_COLOR;\r\n let brandLightColor = themeSettings && tenantSettings.themeEnabled ? themeSettings.brandLight : DEFAULT_BRAND_LIGHT_COLOR;\r\n let specialtyColors = tenantSettings.specialtyPostColors ? tenantSettings.specialtyPostColors : DEFAULT_SPECIALTY_BANNER_COLORS;\r\n return {\r\n ...ownProps,\r\n fetching: state.settings.fetching,\r\n saving: state.settings.saving,\r\n tenantDisplayName: tenantSettings.displayName,\r\n specialtyColors: specialtyColors,\r\n brandColor: brandColor,\r\n accentColor: accentColor,\r\n brandLightColor: brandLightColor,\r\n translatedContent: tenantSettings.translatedContent,\r\n defaultLCID: tenantSettings.defaultLCID,\r\n themeSettings: themeSettings,\r\n }\r\n },\r\n {\r\n setThemeSettings: actions.setThemeSettings,\r\n setTenantDisplayName: actions.setDisplayName,\r\n setBannerColorOption: actions.setBannerColorOption,\r\n setSpecialtyColorOption: actions.setSpecialtyColorOption\r\n }\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(ThemeSettingsForm)\r\n","import React from \"react\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogContentText from \"@mui/material/DialogContentText\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport LoadingSpinner from \"modules/common/components/loadingSpinner\";\r\n\r\nconst TranslateDialog: React.FunctionComponent = props => {\r\n return (\r\n \r\n Auto Translate\r\n \r\n The banner text will be automatically translated using Microsoft translation services. Do you wish to continue?\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n isLoading: boolean;\r\n show: boolean;\r\n onSendTranslateRequest: () => void;\r\n onClose: () => void;\r\n}\r\n\r\nexport default TranslateDialog;","import React from \"react\";\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogContentText from \"@mui/material/DialogContentText\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\n\r\nconst TranslateErrorMaxLengthDialog: React.FunctionComponent = props => {\r\n return (\r\n \r\n Maximum Length Exceeded\r\n \r\n One or more auto translated fields exceeds the maximum character length allowed. Please review the highlighted fields and provide a new translation.\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n onClose: () => void;\r\n}\r\n\r\nexport default TranslateErrorMaxLengthDialog;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as actions from \"../actionCreator\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport { injectIntl, IntlShape } from \"react-intl\";\r\nimport TextInput from \"modules/common/components/forms/inputs/textInput\";\r\nimport \"./styles/languageSettingsForm.sass\";\r\nimport Select from 'react-select';\r\nimport { settingsApi } from \"api/instances\";\r\nimport { ValueLabel } from \"modules/common/components/selectFilter\";\r\nimport { Grid } from \"@mui/material\";\r\nimport TranslateDialog from \"./translateDialog\";\r\nimport TranslateErrorMaxLengthDialog from \"./translateErrorMaxLengthDialog\";\r\nimport { isBannerText } from \"utils/bannerText\";\r\n\r\nclass LanguageSettingsForm extends React.PureComponent {\r\n private maxLangCount = this.props.tenantSettings.maxAllowedLanguages;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n availableTimeZones:[],\r\n loading: true,\r\n showTranslateDialog: false,\r\n showTranslationMaxLengthErrorDialog: false,\r\n isFetchingTranslation: false,\r\n };\r\n }\r\n\r\n public componentDidMount(){\r\n settingsApi.GetAvailableTimeZones()\r\n .then(resp => {\r\n this.setState({...this.state, availableTimeZones: resp, loading: false});\r\n });\r\n }\r\n\r\n public render() {\r\n if (!this.props.lcids) return
    ;\r\n const working = this.props.fetching || this.props.saving || this.state.loading;\r\n\r\n const offeredLocales = Object.keys(this.props.lcidMappings || {}).filter(\r\n (locale) => this.props.lcids.findIndex((cl) => cl === locale) < 0\r\n );\r\n\r\n const selectedTimeZone = this.state.availableTimeZones.filter(t=>t.value === this.props.tenantSettings.timeZone).pop();\r\n\r\n return (\r\n
    \r\n
    \r\n

    Time

    \r\n
    \r\n Default Time Zone\r\n

    The default time zone is used as a fallback if a user's local time cannot be applied. All reports and scheduled tasks are based of a user's local time zone.

    \r\n\r\n {!working && ( ({...base, zIndex:5})}}\r\n />)}\r\n
    \r\n
    \r\n
    \r\n

    Language

    \r\n
    \r\n infoThis page allows you to choose your languages and edit post and event banner text and messages per language. You can set up to {this.maxLangCount} languages for your system. These languages can also be used when publishing content. Your company's default language is set to {this.languageFrom(this.props.defaultLcid)}\r\n
    \r\n
    \r\n
    \r\n
    \r\n {this.props.intl.formatMessage(\r\n { id: \"common.limitNum\", defaultMessage: \"Limit {num, number}\" },\r\n { num: this.maxLangCount }\r\n )}\r\n
    \r\n
      \r\n {this.props.lcids.map((lcid) => (\r\n e.preventDefault()}\r\n onClick={() => {\r\n this.props.setActiveLanguage(lcid);\r\n }}\r\n >\r\n \r\n {this.languageFrom(lcid)}\r\n \r\n \r\n ))}\r\n
    \r\n
    \r\n \r\n
    \r\n {this.props.lcids.length < this.maxLangCount &&\r\n offeredLocales.map((locale) => (\r\n this.addLanguage(e, locale)} key={`offered-${this.languageFrom(locale)}`}>\r\n {this.languageFrom(locale)}\r\n \r\n ))}\r\n
    \r\n
    \r\n
    \r\n
    \r\n {this.props.lcids.map((lcid, i) => {\r\n return (\r\n
    \r\n \r\n \r\n this.onShowTranslateDialog()}\r\n >\r\n {this.props.intl.formatMessage({\r\n id: \"localization.translateLanguage\",\r\n defaultMessage: \"Translate\",\r\n })}\r\n \r\n translate\r\n \r\n \r\n this.removeLanguage(lcid)}\r\n >\r\n {this.props.intl.formatMessage({\r\n id: \"localization.removeLanguage\",\r\n defaultMessage: \"Remove Language\",\r\n })}\r\n \r\n delete\r\n \r\n \r\n \r\n \r\n
    \r\n \r\n
      \r\n {Object.keys(this.props.tenantSettings.translatedContent[lcid]).map((key) => {\r\n let labels = {\r\n breakingPost: \"Breaking News Thumbnail Banner\",\r\n breakingBannerDescription: \"Breaking News Banner Description\",\r\n compliancePost: \"Compliance Thumbnail Banner\",\r\n complianceBannerDescription: \"Compliance Banner Description\",\r\n complianceText: \"Compliance Checkbox Message\",\r\n compliedPost: \"Complied Thumbnail Banner\",\r\n compliedBannerDescription: \"Complied Banner Description\",\r\n featuredPost: \"Featured News Thumbnail Banner\",\r\n featuredBannerDescription: \"Featured News Banner Description\",\r\n mandatoryPost: \"Mandatory Thumbnail Banner\",\r\n mandatoryBannerDescription: \"Mandatory Banner Description\",\r\n publicPost: \"Public Posts Thumbnail Banner\",\r\n publicBannerDescription: \"Public Banner Description\",\r\n publicBannerDescriptionShareTitle: \"Public Banner Description Share Title\",\r\n restrictedContent: \"Private Posts and Events Thumbnail Banner\",\r\n restrictedBannerDescription: \"Private Banner Description\",\r\n };\r\n\r\n if(!labels[key]) return null;\r\n\r\n return (\r\n
    • \r\n {\r\n this.handleTranslatedTextChange(key, value, lcid)\r\n }}\r\n isLanguageField={true}\r\n checkError={this.validateTextLength}\r\n placeholder={this.getTextPlaceholder(key)}\r\n value={this.props.tenantSettings.translatedContent[lcid][key]}\r\n maxLength={(isBannerText(key)) ? 100 : 50}\r\n />\r\n\r\n
      \r\n {this.getBannerTextDescription(key)}\r\n
      \r\n
    • \r\n );\r\n })}\r\n
    \r\n
    \r\n
    \r\n );\r\n })}\r\n
    \r\n
    \r\n \r\n
    \r\n \r\n \r\n
    \r\n );\r\n }\r\n\r\n private getBannerTextDescription(key: string) {\r\n switch (key) {\r\n case \"breakingPost\":\r\n return \"If a post is set as Breaking News, the thumbnail banner displays this text.\"\r\n case \"breakingBannerDescription\":\r\n return \"This message supports the breaking news banner, and appears on the hero image within a post set as breaking news.\"\r\n case \"complianceBannerDescription\":\r\n return \"This message supports the compliance banner text, and appears on the hero image within a compliance post.\"\r\n case \"compliancePost\":\r\n return \"Compliance Posts will display this text as a banner on the post thumbnail, which informs readers that the post requires compliance.\"\r\n case \"complianceText\":\r\n return \"This message is accompanied by a checkbox and appears under the body of a compliance post, which allows readers to acknowledge and/or agree to the post.\";\r\n case \"compliedPost\":\r\n return \"If a reader has already complied to the compliance post, the Complied Banner replaces the Compliance Banner.\"\r\n case \"compliedBannerDescription\":\r\n return \"If a reader has already complied with the post, this message appears on the hero image within a complied post.\"\r\n case \"featuredPost\":\r\n return \"If a post is set as Featured News, the thumbnail banner displays this text.\"\r\n case \"featuredBannerDescription\":\r\n return \"This message supports the featured news banner, and appears on the hero image within a post set as featured news.\"\r\n case \"mandatoryPost\":\r\n return \"Mandatory Posts will display this text as a banner on the post thumbnail, which informs readers that the post is a mandatory read.\"\r\n case \"mandatoryBannerDescription\":\r\n return \"This message supports the mandatory banner text, and appears on the hero image within a mandatory post.\"\r\n case \"restrictedContent\":\r\n return \"This text appears on a thumbnail banner if a post or event is tagged with topics that are restricted/exclusive to specific audiences.\"\r\n case \"restrictedBannerDescription\":\r\n return \"This message supports private post and event banners, and appears on hero images within private posts and events.\"\r\n case \"publicPost\":\r\n return \"This text appears on a thumbnail banner if a post is readable and accessible to everyone in the company.\"\r\n case \"publicBannerDescription\":\r\n return \"This message supports public post banners, and appears on hero images within public posts.\"\r\n case \"publicBannerDescriptionShareTitle\":\r\n return \"This will be displayed to replace the Deep Linking URL at the end of the Public Banner Description.\"\r\n default:\r\n return \"\";\r\n }\r\n }\r\n private getTextPlaceholder(textField: string) {\r\n switch (textField) {\r\n case \"complianceText\":\r\n return \"Ex. I acknowledge that I have read and understood the post in its entirety.\";\r\n case \"restrictedText\":\r\n return \"Ex. This post is exlusive to specific audiences.\";\r\n case \"publicText\":\r\n return \"Ex. This is a public post.\";\r\n case \"publicTextShareUrl\":\r\n return \"\"\r\n case \"publicTextShareTitle\":\r\n return \"Ex. Share it through here.\"\r\n default:\r\n return \"\";\r\n }\r\n }\r\n private addLanguage = (e, code: string) => {\r\n let i = this.props.offeredLocales.findIndex((cl) => cl === code);\r\n if (i < 0) return;\r\n\r\n this.props.setLanguageSettings(this.props.lcids.concat(this.props.offeredLocales[i]));\r\n };\r\n\r\n private removeLanguage = (code: string) => {\r\n if (this.props.lcids.length <= 1) return;\r\n this.props.setLanguageSettings(this.props.lcids.filter((locale) => locale !== code));\r\n };\r\n\r\n // use this at a later time when you are allowed to change the default language\r\n // private setDefault = (code: string) => {\r\n // this.props.setLanguageSettings(this.props.lcids, code)\r\n // }\r\n\r\n private defaultIndicator = (locale: string) => {\r\n return locale === this.props.defaultLcid ? (\r\n \r\n \r\n settings\r\n \r\n \r\n ) : null;\r\n // use this at a later time when you are allowed to change the default language\r\n // : this.setDefault(locale)}>\r\n // {this.props.intl.formatMessage({id: \"common.makeDefault\", defaultMessage: \"Make Default\"})}\r\n // ;\r\n };\r\n\r\n private handleTranslatedTextChange = (key: string, newText: string, lcid: string) => {\r\n this.props.setTranslatedText(key, newText, lcid);\r\n };\r\n\r\n private validateTextLength = (text: string, maxLength: number) => {\r\n if(text && text.length > maxLength) {\r\n return true; \r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n private languageFrom = (lcid: string) => {\r\n return this.props.lcidMappings[lcid] ? this.props.lcidMappings[lcid].language : lcid;\r\n };\r\n\r\n private handleTimeZoneChangeDropDown = (o: ValueLabel) => {\r\n this.props.setTimeZone(o.value);\r\n }\r\n\r\n private onSendTranslateRequest = async () => {\r\n this.setState({ isFetchingTranslation: true });\r\n if(this.props.activeLanguage) {\r\n var translatedResponse = await this.props.getTranslatedLanguage(this.props.activeLanguage, this.props.defaultLcid);\r\n //Added default to be defaultLcid if no activeLanguage (but we should always have one...)\r\n if(translatedResponse) {\r\n this.checkTranslatedResponseKeys(translatedResponse);\r\n } \r\n }\r\n this.setState({ showTranslateDialog: false, isFetchingTranslation: false });\r\n }\r\n\r\n private checkTranslatedResponseKeys(translatedResponse) {\r\n Object.keys(translatedResponse).forEach((key) => {\r\n let currentMaxtextLength = isBannerText(key) ? 100 : 50;\r\n let checkForTextLengthError = translatedResponse[key] && (translatedResponse[key].length > currentMaxtextLength && this.state.showTranslationMaxLengthErrorDialog === false);\r\n \r\n this.handleTranslatedTextChange(key, translatedResponse[key], this.props.activeLanguage ?? this.props.defaultLcid)\r\n\r\n if(checkForTextLengthError) {\r\n this.setState({ showTranslationMaxLengthErrorDialog: true })\r\n }\r\n })\r\n }\r\n\r\n private onHideTranslateDialog = () => {\r\n this.setState({ showTranslateDialog: false });\r\n }\r\n\r\n private onShowTranslateDialog = () => {\r\n this.setState({ showTranslateDialog: true });\r\n }\r\n\r\n private onHideTranslateMaxLengthErrorDialog = () => {\r\n this.setState({ showTranslationMaxLengthErrorDialog: false });\r\n }\r\n}\r\n\r\ninterface ComponentState {\r\n availableTimeZones: {value:string, label:string}[];\r\n loading: boolean;\r\n showTranslateDialog: boolean;\r\n showTranslationMaxLengthErrorDialog: boolean;\r\n isFetchingTranslation: boolean;\r\n}\r\n\r\ninterface ComponentProps {\r\n intl: IntlShape;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n fetching: state.settings.fetching,\r\n saving: state.settings.saving,\r\n lcids: Object.keys(state.settings.tenantSettings.translatedContent),\r\n lcidMappings: state.resources.lcidMappings,\r\n defaultLcid: state.settings.tenantSettings.defaultLCID,\r\n offeredLocales: Object.keys(state.resources.lcidMappings),\r\n tenantSettings: state.settings.tenantSettings,\r\n activeLanguage: state.settings.activeLanguageLCID,\r\n }),\r\n {\r\n getTranslatedLanguage: actions.GetLanguageTranslation,\r\n setLanguageSettings: actions.setLanguageSettings,\r\n setTranslatedText: actions.setTranslatedText,\r\n setActiveLanguage: actions.setActiveLanguage,\r\n setTimeZone: actions.setTimeZone\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default injectIntl(connector(LanguageSettingsForm));\r\n","import * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux'\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport * as actions from '../actionCreator';\r\nimport ToggleSwitch from 'modules/common/components/toggleSwitch';\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\n\r\nclass FeatureControlsSettingsForm extends React.Component {\r\n public render() {\r\n const working = this.props.saving || this.props.fetching;\r\n\r\n return
    \r\n
    \r\n

    Content Creation, Management & Accessibility

    \r\n
    \r\n \r\n
    \r\n { this.props.setMobileEventsEnabled(!this.props.tenantSettings.mobileEventsEnabled); }}\r\n disabled={working} />\r\n
    \r\n
    \r\n {this.props.tenantSettings.showFeatures.documentsEnabled &&\r\n
    \r\n \r\n
    \r\n { this.props.setDocumentsEnabled(!this.props.tenantSettings.documentsEnabled); }}\r\n disabled={working} />\r\n
    \r\n
    \r\n }\r\n {this.props.tenantSettings.showFeatures.shortcutsEnabled &&\r\n
    \r\n \r\n
    \r\n { this.props.setShortcutsEnabled(!this.props.tenantSettings.shortcutsEnabled); }}\r\n disabled={working} />\r\n
    \r\n
    \r\n }\r\n {this.props.tenantSettings.showFeatures.portalPagesEnabled &&\r\n
    \r\n \r\n
    \r\n {\r\n if (!this.props.tenantSettings.portalPagesEnabled) {\r\n if (await confirm.show({\r\n title: \"Enable Portal Pages\",\r\n text: (\r\n
    The Homepage will be automatically published and accessible in the Company Portal when you enable this feature. Click here to preview the Homepage. Would you like to continue?
    \r\n )\r\n }))\r\n this.props.setPortalPagesEnabled(true);\r\n } else {\r\n this.props.setPortalPagesEnabled(false);\r\n }\r\n }}\r\n disabled={working} />\r\n
    \r\n
    \r\n }\r\n {this.props.tenantSettings.showFeatures.postSmartContentEnabledForTenant &&\r\n
    \r\n \r\n
    \r\n {\r\n let newValue = !this.props.tenantSettings.postSmartContentEnabledByTenant;\r\n\r\n this.props.setPostSmartContentEnabled(newValue)\r\n }}\r\n disabled={working}\r\n />\r\n
    \r\n
    \r\n }\r\n
    \r\n
    \r\n

    Mobile App Features

    \r\n
    \r\n \r\n
    \r\n { this.props.setSurveysEnabled(!this.props.tenantSettings.surveysEnabled); }}\r\n disabled={working} />\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n { this.props.setChatEnabled(!this.props.tenantSettings.chatEnabled); }}\r\n disabled={working} />\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n { this.props.setMobilePublishingEnabled(!this.props.tenantSettings.mobilePublishingEnabled); }}\r\n disabled={working} />\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n }\r\n}\r\n\r\ninterface ComponentProps { }\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n fetching: state.settings.fetching,\r\n saving: state.settings.saving,\r\n tenantSettings: state.settings.tenantSettings,\r\n }),\r\n {\r\n setSurveysEnabled: actions.setSurveysEnabled,\r\n setChatEnabled: actions.setChatEnabled,\r\n setDocumentsEnabled: actions.setDocumentsEnabled,\r\n setMobilePublishingEnabled: actions.setMobilePublishingEnabled,\r\n setMobileEventsEnabled: actions.setMobileEventsEnabled,\r\n setPortalPagesEnabled: actions.setPortalPagesEnabled,\r\n setPostSmartContentEnabled: actions.SetPostSmartContentEnabledByTenant,\r\n setShortcutsEnabled: actions.setShortcutsEnabled,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(FeatureControlsSettingsForm);\r\n","import * as React from 'react';\r\nimport '../styles/multiselect.sass';\r\nimport Select, {Props} from 'react-select';\r\n\r\ninterface componentProps extends Props {\r\n registerFocus?: (ref) => void\r\n disabled?: boolean\r\n}\r\n\r\nexport default class MultiSelect extends React.PureComponent {\r\n\r\n private instance: any;\r\n\r\n public componentDidMount() {\r\n if (this.props.registerFocus) {\r\n this.props.registerFocus(this.instance);\r\n }\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n \r\n
    \r\n )\r\n }\r\n\r\n}\r\n","import * as React from 'react';\r\nimport '../styles/InlineWarning.sass';\r\n\r\ninterface componentProps {\r\n props?: any\r\n}\r\n\r\nexport default class InlineWarning extends React.Component {\r\n\r\n public render() {\r\n return (\r\n

    \r\n { this.props.children }\r\n

    \r\n )\r\n }\r\n}\r\n","import { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nexport const TenantTagGroupsSelector = (state: GlobalApplicationState) => {\r\n return state?.settings?.tenantSettings?.tagGroups;\r\n};\r\n","import React, { useCallback, useState, useEffect } from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport MultiSelect from \"modules/common/components/forms/inputs/multiselect\";\r\nimport { Tag } from \"modules/tenant/models\";\r\nimport InlineWarning from \"modules/common/components/forms/messages/InlineWarning\";\r\n\r\nimport { Icons } from \"modules/common/icons\";\r\nimport { FormattedMessage, FormattedNumber } from \"react-intl\";\r\n\r\nimport { ValueLabel } from \"modules/common/components/selectFilter\";\r\n\r\nimport { TagStats } from \"modules/insights\";\r\nimport { insightsApi } from \"api/instances\";\r\nimport { TenantTagGroupsSelector } from \"modules/common/commonSelectors\";\r\nimport InlineError from \"modules/common/components/forms/messages/InlineError\";\r\nimport { TenantSettingsTag } from \"modules/settings\";\r\n\r\ninterface ComponentProps {\r\n value: Tag[] | undefined;\r\n onChange: (value: { id: string }[]) => any;\r\n errorMessage?: string;\r\n showError?: boolean;\r\n}\r\n\r\ninterface OptionGroup {\r\n label: string;\r\n options: Option[]\r\n}\r\ninterface Option {\r\n value: string;\r\n label: string;\r\n color: React.CSSProperties;\r\n restricted: boolean;\r\n}\r\n\r\nexport default function TopicsSelect(props: ComponentProps) {\r\n const [tagStats, setTagStats] = useState([] as TagStats[]);\r\n const [fetchingTagStats, setFetchingTagStats] = useState(false);\r\n const [isPublicPrivateTagMixed, setIsPublicPrivateTagMixed] = useState(false);\r\n const [selectedOptions, setSelectedOptions] = useState([] as Option[]);\r\n const [options, setOptions] = useState([] as Option[]);\r\n const [tags, setTags] = useState([] as TenantSettingsTag[]);\r\n const [groupOptions, setGroupOptions] = useState([] as OptionGroup[]);\r\n const tenantTagGroups = useSelector(TenantTagGroupsSelector);\r\n\r\n const setValue = useCallback((value: Tag[] | undefined) => {\r\n const values = (value || ([] as Tag[])).map((i) => i.id);\r\n const opts = options.filter((o) => values.some((v) => v === o.value));\r\n setSelectedOptions(opts);\r\n setIsPublicPrivateTagMixed(hasPublicAndPrivateOptions(opts || []));\r\n }, [options]);\r\n\r\n useEffect(() => {\r\n setFetchingTagStats(true);\r\n\r\n insightsApi\r\n .GetTagStats()\r\n .then((response) => {\r\n setTagStats(Array.isArray(response) ? response : []);\r\n setFetchingTagStats(false);\r\n })\r\n .catch(() => {\r\n setTagStats([]);\r\n setFetchingTagStats(false);\r\n });\r\n\r\n const availableTags = tenantTagGroups\r\n ?.filter((t) => !t.disabled && !t.deleted)\r\n .map((tagGroup) => {\r\n return tagGroup.tags.filter((t) => !t.disabled && !t.deleted) as TenantSettingsTag[];\r\n })\r\n .flat();\r\n\r\n setTags(availableTags);\r\n setOptions(availableTags.map((i) => ({ value: i.id, label: i.name, restricted: i.restricted } as Option)));\r\n\r\n setGroupOptions(tenantTagGroups.map((i) =>( {\r\n label: i.name, options: updateTagsInGroup(i.tags)\r\n } as OptionGroup )));\r\n\r\n\r\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n useEffect(() => {\r\n setValue(props.value);\r\n }, [props.value]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n useEffect(() => {\r\n if (options && options.length > 0) {\r\n setValue(props.value);\r\n }\r\n }, [options, props.value, setValue]);\r\n\r\n const updateTagsInGroup = (tags : TenantSettingsTag[]) => {\r\n setSelectedOptions(tags.map((i) => ({value: i.id, label: i.name, restricted: i.restricted} as Option)));\r\n return tags.map((i) => ({value: i.id, label: i.name, restricted: i.restricted} as Option));\r\n }\r\n\r\n const selectStyles = {\r\n multiValue: (styles, { data }) => {\r\n if (data.restricted) {\r\n return {\r\n ...styles,\r\n backgroundColor: \"rgba(255,166,0,0.2)\",\r\n border: \"1px solid orange\",\r\n color: \"brown\",\r\n };\r\n } else {\r\n return {\r\n ...styles,\r\n backgroundColor: \"rgba(242,249,252,0.2)\",\r\n border: \"1px solid rgba(201,230,242)\",\r\n color: \"rgb(3,169,244)\",\r\n };\r\n }\r\n },\r\n multiValueLabel: (styles, { data }) => ({\r\n ...styles,\r\n fontSize: \"14px\",\r\n }),\r\n };\r\n\r\n const TagsWarning = (\r\n \r\n \r\n \r\n );\r\n\r\n // const isMandatoryTag = (option: Option) => {\r\n // return (tagStats.find((t) => t.id === option.value) || { isMandatory: false }).isMandatory;\r\n // };\r\n\r\n const getSubscriberCountForOption = (option: Option) => {\r\n let stats = tagStats || ([] as string[]);\r\n if (stats.length === 0) return ;\r\n\r\n let count = (tagStats.find((t) => t.id === option.value) || { subscriberCount: 0 }).subscriberCount;\r\n\r\n if (!count) {\r\n return ;\r\n }\r\n\r\n return ;\r\n };\r\n\r\n const renderOption = (option: Option) => {\r\n let count = getSubscriberCountForOption(option);\r\n return (\r\n \r\n {option.label}\r\n {option.restricted ? (\r\n \r\n ({count}\r\n )\r\n \r\n ) : (\r\n \r\n ({count}\r\n )\r\n \r\n )}\r\n \r\n );\r\n };\r\n\r\n const hasPublicAndPrivateOptions = (options: Option[]): boolean =>\r\n options && options?.some((t) => t?.restricted) && options?.some((t) => !t?.restricted);\r\n\r\n const onChange = (newValues: ValueLabel[]) => {\r\n let convertValuesToTags = tags!\r\n .filter((t) => {\r\n return (newValues || []).map((i) => i.value).find((i) => i === t.id);\r\n })\r\n .map((t) => ({ id: t.id }));\r\n\r\n props.onChange(convertValuesToTags);\r\n };\r\n\r\n return (\r\n
    \r\n \r\n {isPublicPrivateTagMixed && TagsWarning}\r\n \r\n {props.showError && props.errorMessage && {props.errorMessage}}\r\n
    \r\n );\r\n}\r\n","import * as React from \"react\";\r\nimport LoadingSpinner from \"modules/common/components/loadingSpinner\";\r\nimport \"./modal.sass\";\r\n\r\nexport interface ModalButton {\r\n title: string;\r\n isWorking?: boolean;\r\n workingTitle?: string;\r\n isPrimary: boolean;\r\n isEnabled: boolean;\r\n onClick: () => any;\r\n className?: string;\r\n}\r\n\r\nexport interface ModalProps {\r\n onCloseClick: () => any;\r\n title: string;\r\n titleLogo?: string;\r\n isWorking?: boolean;\r\n active: boolean;\r\n buttons?: ModalButton[];\r\n showControls: boolean;\r\n hideForNoty?: boolean;\r\n styles?: any;\r\n}\r\n\r\nclass Modal extends React.Component {\r\n public render() {\r\n return (\r\n
    \r\n
    \r\n
    \r\n \r\n {this.props.titleLogo ? (\r\n \r\n \"logo\"\r\n \r\n ) : null}\r\n {this.props.title}\r\n {this.props.isWorking ? : null}\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n {this.props.active ? this.props.children : null}\r\n
    \r\n {this.props.showControls ? (\r\n
    \r\n {this.props.buttons!.map((button) => (\r\n button.onClick()}\r\n disabled={!button.isEnabled}\r\n >\r\n {button.isWorking ? button.workingTitle || button.title : button.title}\r\n {button.isWorking ? : null}\r\n \r\n ))}\r\n
    \r\n ) : null}\r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default Modal;\r\n","export const getTranslatedContentField = (field: string, tc: {[lang: string]: any}, lang: string): string => {\r\n const langs = Object.keys(tc || {}).sort();\r\n if(!tc || langs.length === 0) return \"\";\r\n return tc[lang] ? tc[lang][field] : tc[langs[0]][field];\r\n}\r\n\r\nexport const getTranslatedBody = (tc, lang: string) => getTranslatedContentField(\"body\", tc, lang)\r\nexport const getTranslatedTitle = (tc, lang: string) => getTranslatedContentField(\"title\", tc, lang)\r\nexport const getTranslatedComplianceText = (tc, lang: string) => getTranslatedContentField(\"complianceText\", tc, lang)\r\nexport const getTranslatedDescription = (tc, lang: string) => getTranslatedContentField(\"description\", tc, lang)\r\nexport const getTranslatedExcerpt = (tc, lang: string) => getTranslatedContentField(\"excerpt\", tc, lang)","import { GlobalApplicationState } from 'globalApplicationState';\r\nimport {\r\n Comment,\r\n ValidationResponse,\r\n Post,\r\n PostFeedItem,\r\n PostListingPage,\r\n PostFilterValues,\r\n TranslatablePostContent,\r\n ImageScale,\r\n PostDeleteModel,\r\n PostListingPageId,\r\n PostFeedFilters\r\n} from 'modules/posts/models';\r\nimport * as Actions from 'modules/posts/actions';\r\nimport { push } from 'react-router-redux';\r\nimport XhrUpload from 'utils/xhrUpload';\r\nimport API from 'api';\r\nimport { getTranslatedTitle } from 'utils/getTranslatedContent';\r\nimport { errorAlert } from 'utils/notyPopups'\r\nimport MsalAuthModule from 'authentication/msalAuthModule';\r\nimport { ContentAnalysis } from 'modules/common/components/authoring/models';\r\nimport cookie, { ROWS_PER_PAGE_COOKIE_NAMES } from 'utils/cookie';\r\nimport { CustomFileData, ImageAndFolderCountReturn, ImageUploadReturn, Image as ImageV1, MediaFile, MediaFiltersModel, MoveFiles, MoveFilesWithSrc } from 'modules/gallery';\r\n\r\nexport const setChatbotNotificationsEnabled = (enabled: boolean) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.CreateSetChatbotNotificationsEnabled({ enabled }));\r\n}\r\n\r\nexport const setMobileNotificationsEnabled = (enabled: boolean) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.CreateSetMobileNotificationsEnabled({ enabled }));\r\n}\r\nexport const setSMSNotificationHours = (hours: number) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.CreateSetSMSNotificationHours({ hours }));\r\n}\r\n\r\nexport const setSMSNotificationFrequency = (frequency: number) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.CreateSetSMSNotificationFrequency({ frequency }));\r\n}\r\n\r\nexport const setEmailNotificationHours = (hours: number) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.CreateSetEmailNotificationHours({ hours }));\r\n}\r\n\r\nexport const setEmailNotificationFrequency = (frequency: number) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.CreateSetEmailNotificationFrequency({ frequency }));\r\n}\r\n\r\nexport const setCommentingEnabled = (enabled: boolean) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.CreateSetCommentingEnabledAction({ enabled }));\r\n}\r\n\r\nexport const setReactingEnabled = (enabled: boolean) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.CreateSetReactingEnabledAction({ enabled }));\r\n}\r\n\r\nexport const setNotificationsEnabled = (enabled: boolean) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.CreateSetNotificationsEnabledAction({ enabled }));\r\n}\r\n\r\nexport const setEmailChannelEnabled = (enabled: boolean) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.CreateSetEmailChannelEnabled({ enabled }));\r\n}\r\n\r\nexport const setSMSChannelEnabled = (enabled: boolean) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.CreateSetSMSChannelEnabled({ enabled }));\r\n}\r\n\r\nexport const getMentionsUsers = (filter: string) => (dispatch, getState: () => GlobalApplicationState) => {\r\n return dispatch(API.comments.FetchMentionsUsers(filter))\r\n .then(response => response.json());\r\n}\r\n\r\nexport const fetchAllReplies = (parentId: string) => (dispatch, getState: () => GlobalApplicationState) => {\r\n return dispatch(API.comments.FetchAllReplies(parentId))\r\n .then(response => response.json());\r\n}\r\n\r\nexport const fetchDraftPostList = (\r\n pageNumber: number, \r\n filters: Partial, \r\n pageAmount?: number\r\n) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.FetchDraftPostList({}));\r\n\r\n dispatch(API.draftPost.FetchDraftPosts(pageNumber, filters, pageAmount))\r\n .then(response => response.json())\r\n .then((page: PostListingPage) => dispatch(Actions.FetchDraftPostListComplete({ succeeded: true, page })))\r\n .catch(err => dispatch(\r\n Actions.FetchDraftPostListComplete({ \r\n succeeded: false, \r\n page: { \r\n currentPage: 1, \r\n id: PostListingPageId.DRAFTS, \r\n isFetching: false, \r\n posts: [], \r\n totalPages: 0, \r\n totalPosts: 0 \r\n } \r\n })\r\n ));\r\n}\r\n\r\nexport const FetchExpiredPosts = (pageNumber: number, filters: Partial) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.FetchExpiredPostList({}));\r\n\r\n //TODO: Once API is available\r\n}\r\n\r\nexport const fetchPublishedPosts = (\r\n pageNumber: number, \r\n filters: Partial, \r\n pageAmount?: number\r\n) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.FetchPublishedPostList({}));\r\n\r\n dispatch(API.draftPost.FetchPublishedPosts(pageNumber, filters, pageAmount))\r\n .then(response => response.json())\r\n .then((page: PostListingPage) => dispatch(Actions.FetchPublishedPostListComplete({ succeeded: true, page })))\r\n .catch(err => dispatch(\r\n Actions.FetchPublishedPostListComplete({ \r\n succeeded: false, \r\n page: { \r\n currentPage: 1, \r\n id: PostListingPageId.PUBLISHED, \r\n isFetching: false, \r\n posts: [], \r\n totalPages: 0, \r\n totalPosts: 0 \r\n }\r\n })\r\n ));\r\n}\r\n\r\nexport const fetchAllPost = (\r\n pageNumber: number, \r\n filters: Partial, \r\n pageAmount?: number\r\n) => (dispatch, _: () => GlobalApplicationState) => {\r\n dispatch(Actions.FetchAllPostList({}));\r\n\r\n dispatch(API.draftPost.FetchAllPost(pageNumber, filters, pageAmount))\r\n .then(response => response.json())\r\n .then((page: PostListingPage) => dispatch(Actions.FetchAllPostListComplete({ succeeded: true, page })))\r\n .catch(err => dispatch(\r\n Actions.FetchAllPostListComplete({ \r\n succeeded: false, \r\n page: { \r\n currentPage: 1, \r\n id: PostListingPageId.ALL, \r\n isFetching: false, \r\n posts: [], \r\n totalPages: 0, \r\n totalPosts: 0 \r\n } \r\n })\r\n ));\r\n}\r\n\r\nexport const fetchScheduledPosts = (\r\n pageNumber: number, \r\n filters: Partial, \r\n pageAmount?: number\r\n) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.FetchScheduledPostList({}));\r\n\r\n dispatch(API.draftPost.FetchScheduledPosts(pageNumber, filters, pageAmount))\r\n .then(response => response.json())\r\n .then((page: PostListingPage) => dispatch(Actions.FetchScheduledPostListComplete({ succeeded: true, page })))\r\n .catch(err => dispatch(\r\n Actions.FetchScheduledPostListComplete({ \r\n succeeded: false, \r\n page: { \r\n currentPage: 1, \r\n id: PostListingPageId.SCHEDULED, \r\n isFetching: false, \r\n posts: [], \r\n totalPages: 0, \r\n totalPosts: 0 \r\n } \r\n })\r\n ));\r\n}\r\n\r\nexport const fetchSubmissionPosts = (\r\n pageNumber: number, \r\n filters: Partial, \r\n pageAmount?: number\r\n) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.FetchSubmissionPostList({}));\r\n\r\n dispatch(API.submissionPosts.FetchSubmissionPosts(pageNumber, filters, pageAmount))\r\n .then(response => response.json())\r\n .then((page: PostListingPage) => dispatch(Actions.FetchSubmissionPostListComplete({ succeeded: true, page })))\r\n .catch(err => dispatch(\r\n Actions.FetchSubmissionPostListComplete({ \r\n succeeded: false, \r\n page: { \r\n currentPage: 1, \r\n id: PostListingPageId.SUBMISSIONS, \r\n isFetching: false, \r\n posts: [], \r\n totalPages: 0, \r\n totalPosts: 0 \r\n } \r\n })\r\n ));\r\n}\r\n\r\nexport const fetchPostsFeedLocal = (filters: Partial, maxResults: number, pageNumber: number) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.FetchPostsFeedLocal({}));\r\n\r\n return dispatch(API.clientPosts.FetchPostsFeedLocal(filters, maxResults, pageNumber))\r\n .then(response => response.json())\r\n .then((postsFeed) => {\r\n dispatch(Actions.FetchPostsFeedLocalComplete({ succeeded: true }));\r\n return postsFeed;\r\n })\r\n .catch(error => {\r\n dispatch(Actions.FetchPostsFeedLocalComplete({ succeeded: false }));\r\n return [];\r\n });\r\n}\r\n\r\nexport const fetchPostsFeed = (filters: Partial, filtersApplied: boolean, pageNumber: number) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.FetchPostsFeed({}));\r\n\r\n dispatch(API.clientPosts.FetchPostsFeed(filters, pageNumber))\r\n .then(response => response.json())\r\n .then((postsFeed) => dispatch(Actions.FetchPostsFeedComplete({ succeeded: true, filtersApplied, postsFeed, pageNumber })))\r\n .catch(error => dispatch(Actions.FetchPostsFeedComplete({ succeeded: false, filtersApplied, postsFeed: [], pageNumber })));\r\n}\r\n\r\nexport const updatePostsFeed = (postsFeed: PostFeedItem[]) => (dispatch, _: () => GlobalApplicationState) => {\r\n dispatch(Actions.UpdatePostsFeed({ postsFeed }));\r\n}\r\n\r\nexport const fetchDraftPost = (id: string, _: ImageScale = ImageScale.Mobile) => (dispatch, _: () => GlobalApplicationState) => {\r\n dispatch(Actions.FetchDraftPost({}));\r\n\r\n return dispatch(API.draftPost.FetchDraftPost(id))\r\n .then(response => response.json())\r\n .then((post: Post) => {\r\n dispatch(Actions.FetchDraftPostComplete({ succeeded: true, post }));\r\n return post;\r\n })\r\n .catch(err => Actions.FetchDraftPostComplete({ succeeded: false, post: null }));\r\n}\r\n\r\nexport const createNewDraftPost = () => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.CreateNewDraft({}));\r\n\r\n return dispatch(API.draftPost.CreateNewPost())\r\n .then(response => response.json())\r\n .then((postId: string) => {\r\n dispatch(Actions.CreateNewDraftComplete({ succeeded: true, postId }));\r\n return postId;\r\n });\r\n}\r\n\r\nexport const setNewDraftPost = (post: Partial) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.SetNewDraft({ post }));\r\n}\r\n\r\nexport const submitPost = (draftId: string) => async (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.SubmitPost({}));\r\n\r\n try {\r\n await dispatch(API.draftPost.SubmitPost(draftId));\r\n dispatch(Actions.ClearPostFeed({}));\r\n dispatch(Actions.ClearPostFeedFilters({}));\r\n dispatch(Actions.SubmitPostComplete({ succeeded: true }));\r\n dispatch(push(`/${getState().tenant.id}/admin/posts`));\r\n return true;\r\n }\r\n catch {\r\n dispatch(Actions.SubmitPostComplete({ succeeded: false }));\r\n errorAlert(\"There was an error while attempting to submit.\");\r\n return false;\r\n }\r\n}\r\n\r\nexport const clonePost = (draftId: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.CreateNewDraft({}));\r\n\r\n return dispatch(API.draftPost.CreateClonedPost(draftId))\r\n .then(response => response.json())\r\n .then((draftId: string) => {\r\n dispatch(Actions.CreateNewDraftComplete({ succeeded: true, postId: draftId }));\r\n return draftId;\r\n });\r\n}\r\n\r\nexport const updateField = (field: F) => (value: Post[F]) => (dispatch, getState: () => GlobalApplicationState) => {\r\n return dispatch(Actions.FieldUpdate({ field, value }));\r\n}\r\n\r\nexport const updatePost = (post: Partial) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.UpdatePost({ post }));\r\n}\r\n\r\nexport const saveDraft = (isSubmission: boolean = false) => (dispatch, getState: () => GlobalApplicationState) : Promise => {\r\n dispatch(Actions.DraftPostSave({}));\r\n return dispatch(API.draftPost.SaveDraftPost(getState().posts.editor.post, isSubmission))\r\n .then(response => {\r\n if (response.status === 200) {\r\n dispatch(Actions.DraftPostSaveComplete({ succeeded: true }))\r\n return true;\r\n }\r\n else {\r\n dispatch(Actions.DraftPostSaveComplete({ succeeded: false }))\r\n errorAlert(\"There was an error while attempting to save\")\r\n return false;\r\n }\r\n })\r\n .catch(e => {\r\n dispatch(Actions.DraftPostSaveComplete({ succeeded: false }));\r\n errorAlert(\"There was an error while attempting to save\");\r\n return false;\r\n });\r\n}\r\n\r\n\r\nexport const deleteDraftPosts = (postList: PostDeleteModel[]) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.DraftPostDelete({ id: '' }));\r\n\r\n return Promise.all(postList.map(p => dispatch(p.status === 'draft' ? API.draftPost.DeleteDraftOnlyPost(p.draftId) : API.draftPost.DeleteDraftPost(p.draftId))))\r\n .then(response => dispatch(Actions.DraftPostDeleteCompleteBatch({ succeeded: true, ids: postList.map(c => c.draftId) })))\r\n}\r\n\r\nexport const fetchImages = (\r\n forGallery?: boolean, \r\n pageAmount?: number, \r\n pageNumber?: number,\r\n moveFilesForAppBar?: MoveFilesWithSrc,\r\n mediaFilter?: MediaFiltersModel,\r\n) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.FetchImagesFromLibrary({}));\r\n\r\n let cookiePageAmount = cookie.getRowsPerPage(ROWS_PER_PAGE_COOKIE_NAMES.GALLERY, 100);\r\n return dispatch(API.mediaLibrary.FetchImages(forGallery, pageAmount ?? cookiePageAmount, pageNumber ?? 1, mediaFilter))\r\n .then(response => response.json())\r\n .then(results => {\r\n dispatch(Actions.FetchImagesFromLibraryComplete({\r\n succeeded: true,\r\n chonkyFileData: results.mediaFiles,\r\n totalCount: results.totalCount,\r\n totalPages: results.totalPages,\r\n currDir: results.currDir,\r\n folderChain: results.folderChain,\r\n moveFilesForAppBar\r\n }));\r\n });\r\n}\r\n\r\nexport const fetchImageByName = (filename: string, type: string, parentId?: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.mediaLibrary.FetchImageByName(filename, type, parentId, false))\r\n .then(response => response.json())\r\n .catch(_ => undefined);\r\n}\r\n\r\nexport const fetchFolderByName = (fileName: string, parentId?: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.mediaLibrary.FetchFolderByName(fileName, parentId, false))\r\n .then(response => response.json())\r\n .catch(_ => undefined);\r\n}\r\n\r\nexport const fetchImageByNameAsFileData = (filename: string, type: string, parentId?: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.mediaLibrary.FetchImageByName(filename, type, parentId, true))\r\n .then(response => response.json())\r\n .catch(_ => undefined);\r\n}\r\n\r\nexport const fetchFolderByNameAsFileData = (fileName: string, parentId?: string, asChonkyFileData: boolean = false) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.mediaLibrary.FetchFolderByName(fileName, parentId, true))\r\n .then(response => response.json())\r\n .catch(_ => undefined);\r\n}\r\n\r\nexport const uploadFolder = (fileName: string, parentId?: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.mediaLibrary.UploadFolder(fileName, parentId))\r\n .catch(_ => undefined);\r\n}\r\n\r\nexport const getUniqueFileName = (filename: string, type: string, parentId?: string, abortSignal?: AbortSignal) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.mediaLibrary.GetUniqueFileName(filename, type, parentId, abortSignal))\r\n .then(response => response.json());\r\n}\r\n\r\nexport const getUniqueFolderName = (folderName: string, parentId?: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.mediaLibrary.GetUniqueFolderName(folderName, parentId))\r\n .then(response => response.json());\r\n}\r\n\r\nexport const deleteImageByName = (filename: string, type: string, parentId?: string, abortSignal?: AbortSignal) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.mediaLibrary.DeleteImageByName(filename, type, parentId, abortSignal))\r\n .then(_ => undefined);\r\n}\r\n\r\nexport const deleteFolderByName = (folderName: string, parentId?: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.mediaLibrary.DeleteFolderByName(folderName, parentId))\r\n .then(_ => undefined);\r\n}\r\n\r\nexport const renameImage = (id: string, newFileName: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.mediaLibrary.RenameImage(id, newFileName))\r\n .then(_ => undefined);\r\n}\r\n\r\nexport const renameFolder = (id: string, newFolderName: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.mediaLibrary.RenameFolder(id, newFolderName))\r\n .then(_ => undefined);\r\n}\r\n\r\nexport const fetchDocuments = (forDirectory?: boolean) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.FetchDocumentsFromDirectory({}));\r\n\r\n let continuationToken = getState().posts.documentDirectory.continuationToken;\r\n\r\n return dispatch(API.mediaLibrary.FetchDocuments(continuationToken!, forDirectory))\r\n\r\n .then(response => response.json()).catch(err => console.log(err))\r\n .then(results => {\r\n dispatch(Actions.FetchDocumentsFromDirectoryComplete({\r\n succeeded: true,\r\n files: results.documents,\r\n continuationToken: results.continuationToken\r\n }))\r\n })\r\n}\r\n\r\nexport const fetchImage = (imageId: string) => (dispatch): Promise => {\r\n return dispatch(API.draftPost.FetchImageForId(imageId))\r\n .then(response => response.json())\r\n .then(image => {\r\n dispatch(Actions.FetchImageFromLibraryComplete({ succeeded: true, image }))\r\n return image;\r\n });\r\n}\r\n\r\nexport const fetchDocument = (docId: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.draftPost.FetchDocumentForId(docId))\r\n .then(response => response.json())\r\n .then(file => {\r\n dispatch(Actions.FetchDocumentFromDirectoryComplete({ succeeded: true, file }))\r\n return file;\r\n });\r\n}\r\n\r\nexport const deleteImagesFromLibrary = (imageIds: string[]) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.DeleteImagesFromLibraryInit({}));\r\n\r\n return dispatch(API.mediaLibrary.DeleteBulkImages(imageIds))\r\n .then(response => response.status === 200 ? imageIds : null)\r\n .then((ids: string[]) => {\r\n const deletedImageIds = ids.filter(id => id);\r\n dispatch(Actions.DeleteImagesFromLibraryComplete({ succeeded: true, ids: deletedImageIds }))\r\n })\r\n .catch(e => null);\r\n}\r\n\r\nexport const getFolderAndImageCount = (folderId: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.mediaLibrary.GetFolderAndImageCount(folderId))\r\n .then(response => response.json())\r\n .catch(_ => undefined);\r\n}\r\n\r\nexport const getBulkFolderAndImageCount = (folderIds: string[]) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.mediaLibrary.GetBulkFolderAndImageCount(folderIds))\r\n .then(response => response.json())\r\n .catch(_ => undefined);\r\n}\r\n\r\nexport const deleteFolder = (folderId: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.mediaLibrary.DeleteFolder(folderId))\r\n .then(_ => undefined);\r\n}\r\n\r\nexport const deleteBulkFolders = (folderIds: string[]) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.mediaLibrary.DeleteBulkFolders(folderIds))\r\n .then(_ => undefined);\r\n}\r\n\r\nexport const moveMedia = (movePayload: MoveFiles) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n return dispatch(API.mediaLibrary.MoveMedia(movePayload))\r\n .then(_ => undefined);\r\n}\r\n\r\n/*\r\n * In the upload image case we cant use the default fetch implementation,\r\n * we have to resort to xhr; hence we need to call the authmanager ourselves.\r\n * This however lets us attach an onProgress event listener.\r\n * This xhr request could have been abstracted in the middleware, but we would lose\r\n * the onProgress event when we dispatch the network request.\r\n */\r\nexport const uploadImage = (\r\n file: File,\r\n onProgress: (percentCompleted: number) => void, \r\n onLoad?: (e: ProgressEvent, xhr: XMLHttpRequest) => void, \r\n onError?: (e: ProgressEvent, xhr: XMLHttpRequest) => void, \r\n onAbort?: (e: ProgressEvent, xhr: XMLHttpRequest) => void,\r\n parentId?: string,\r\n abortSignal?: AbortSignal,\r\n) => async (dispatch, getState: () => GlobalApplicationState): Promise | null> => {\r\n if (!(/^image\\/(jpg|jpeg|png|bmp)/).test(file.type)) {\r\n Actions.UploadImageComplete({ succeeded: false, id: null })\r\n return Promise.resolve(null);\r\n }\r\n\r\n dispatch(Actions.UploadImage({}));\r\n\r\n const fileToUpload = file.type === 'image/gif' ? await getFirstGifFrame(file) : file;\r\n\r\n return MsalAuthModule\r\n .getInstance()\r\n .getAccessToken()\r\n .then(accessToken => {\r\n const requestDetails = API.mediaLibrary.UploadImage(fileToUpload, parentId, abortSignal);\r\n const url = getState().config.SparrowClientApiUrl + requestDetails.url\r\n .replace(\"{tenant}\", getState().tenant.id);\r\n\r\n const handlers = { onLoad, onAbort, onError, onProgress };\r\n\r\n return new XhrUpload(url, requestDetails, handlers)\r\n .authenticateWith(accessToken)\r\n .upload();\r\n })\r\n .then((response: string) => {\r\n let image = JSON.parse(response) as { imageId: string, fileName: string }\r\n dispatch(Actions.UploadImageComplete({ succeeded: true, id: image.imageId, fileName: image.fileName }))\r\n return { id: image.imageId, name: image.fileName }\r\n });\r\n}\r\n\r\n\r\nconst getFirstGifFrame = (gif: File): Promise => {\r\n return new Promise((resolve, reject) => {\r\n const canvas = document.createElement('canvas');\r\n const img = new Image();\r\n img.onload = function () {\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n let context = canvas.getContext('2d')!;\r\n context.drawImage(img, 0, 0, img.width, img.height);\r\n canvas.toBlob((newBlob: any) => {\r\n newBlob.lastModifiedDate = new Date();\r\n newBlob.name = gif.name;\r\n return resolve(newBlob as File);\r\n });\r\n }\r\n img.src = URL.createObjectURL(gif);\r\n })\r\n}\r\n\r\n\r\nexport const ImageSelected = (id: string, url: string) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.ImageSelected({ imageId: id, imageUrl: url }));\r\n}\r\n\r\nexport const DocumentSelected = (id: string, url: string) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.DocumentSelected({ docId: id, docUrl: url }));\r\n}\r\n\r\nexport const ImageTransformed = (transforms: { points: number[], zoom?: number }) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.ImageTransformed({ transforms }));\r\n}\r\n\r\nexport const SaveImageTransformations = () => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.ImageTweaksConfirmed({}));\r\n}\r\n\r\nexport const CancelImageChanges = () => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.CancelImageChanges({}));\r\n}\r\n\r\nexport const DeleteImage = () => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.DeleteEditorPostImage({}));\r\n}\r\n\r\nexport const EditPlacedImage = () => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.EditPlacedImage({}));\r\n}\r\n\r\nexport const setImageKeywords = (imageId: string, keywords: string[]) => (dispatch): Promise => {\r\n return dispatch(API.mediaLibrary.SetImageKeywords(imageId, keywords))\r\n .then(_ => undefined);\r\n}\r\n\r\nexport const getContentAnalysis = (id: string, text: string, includeHighlightResults: boolean = false) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetContentAnalysis({}));\r\n return dispatch(API.draftPost.GetContentAnalysis(id, text, includeHighlightResults))\r\n .then(response => {\r\n dispatch(Actions.GetContentAnalysisComplete({ succeeded: true }));\r\n return response.json();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetContentAnalysisComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\n\r\nexport const getDraftTranslation = (id: string, content: TranslatablePostContent, outputLCID: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetDraftTranslation({}));\r\n return dispatch(API.events.GetDraftTranslation(id, content, outputLCID))\r\n .then(response => {\r\n dispatch(Actions.GetDraftTranslationComplete({ succeeded: true }));\r\n return response.json();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetDraftTranslationComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const unpublishPost = (postId: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.UnpublishPost({}));\r\n\r\n dispatch(Actions.ClearPostFeed({}));\r\n dispatch(Actions.ClearPostFeedFilters({}));\r\n\r\n return dispatch(API.draftPost.UnpublishPost(postId))\r\n .then(response => {\r\n dispatch(Actions.UnpublishPostComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.UnpublishPostComplete({ succeeded: false }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const publishPost = (id: string, time?: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.PublishPost({}));\r\n\r\n let defaultLang = getState().settings.tenantSettings.defaultLCID;\r\n\r\n let attemptedPost = getState().posts.draftPostList.posts.find(p => p.id === id)\r\n || getState().posts.editor.post;\r\n\r\n // let editingPost = getState().posts.editor.post;\r\n\r\n // if (editingPost.emailNotifications.enabled && (editingPost.emailNotifications.frequency === 1 || editingPost.emailNotifications.frequency === 2)) {\r\n // if (editingPost.emailNotifications.hours! < 1) {\r\n // errorAlert(\"Publishing hours for Email must be greater than 0\");\r\n // return dispatch(Actions.PublishPostComplete({ succeeded: false }));\r\n // }\r\n // }\r\n\r\n // if (editingPost.smsNotifications.enabled && (editingPost.smsNotifications.frequency === 1 || editingPost.smsNotifications.frequency === 2)) {\r\n // if (editingPost.smsNotifications.hours! < 1) {\r\n // errorAlert(\"Publishing hours for SMS must be greater than 0\");\r\n // return dispatch(Actions.PublishPostComplete({ succeeded: false }));\r\n // }\r\n // }\r\n\r\n return dispatch(API.draftPost.PublishPost(id, time))\r\n .then(response => {\r\n if (response.status !== 200)\r\n throw response;\r\n\r\n dispatch(Actions.ClearPostFeed({}));\r\n dispatch(Actions.ClearPostFeedFilters({}));\r\n\r\n return dispatch(Actions.PublishPostComplete({ succeeded: true }))\r\n })\r\n .then(() => dispatch(publishSuccess(id, time)))\r\n .then(() => true)\r\n .catch((response) => {\r\n let validationResult = { postId: id, postTitle: getTranslatedTitle(attemptedPost.translatedContent, defaultLang) };\r\n let unexpectedError = 'An unexpected error occured. Please try again later or contact support if this issue persists.';\r\n\r\n if (response && response.json && response.status === 400) {\r\n (response.json() as Promise)\r\n .then(errors => dispatch(Actions.PublishPostComplete({ succeeded: false, validationResult: { ...validationResult, errors: errors.ModelState } })))\r\n } else {\r\n dispatch(Actions.PublishPostComplete({ succeeded: false, validationResult: { ...validationResult, errors: { 'server error': [unexpectedError] } } }));\r\n }\r\n\r\n return false;\r\n });\r\n}\r\n\r\nexport const publishSuccess = (id?: string, time?: string) => (dispatch, getState: () => GlobalApplicationState) => {\r\n const state = getState();\r\n const returnUrl = `/${state.tenant.id}/admin/posts`;\r\n\r\n const postInList = state.posts.draftPostList.posts.filter(p => p.id === id)[0] || {} as any;\r\n const postInEditor = state.posts.editor.post;\r\n\r\n const video = id ? postInList.video\r\n : postInEditor.video;\r\n\r\n const videoExists = !!(video && video.id);\r\n\r\n const videoInAttachments = (postInEditor.attachedContent || []).filter(f => f.fileType === \"video\").length > 0\r\n || (postInList.attachedContent || []).filter(f => f.fileType === \"video\").length > 0\r\n\r\n dispatch(Actions.PublishSuccessful({ containsVideoContent: videoExists || videoInAttachments, expectedPublishTime: time, id }))\r\n dispatch(push(returnUrl));\r\n}\r\n\r\nexport const hidePublishSuccessfulDialog = () => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.HidePublishSuccessfulDialog({}))\r\n}\r\n\r\nexport const FetchIdealWordCount = () => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.FetchIdealWordCount({}));\r\n return dispatch(API.authoring.FetchIdealWordCountLimit())\r\n .then(response => response.json())\r\n .then(response => {\r\n return dispatch(Actions.FetchIdealWordCountComplete({ succeeded: true, idealWordCount: response.wordCount }))\r\n })\r\n}\r\n\r\nexport const DismissIdealWordCountTip = () => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.DismissIdealWordCountTip({}));\r\n}\r\n\r\nexport const GetCurrentSentiment = (content: string, cb: (err: any, n: number) => void) => (dispatch, getState: () => GlobalApplicationState) => {\r\n return dispatch(API.authoring.FetchCurrentPostSentiment(content))\r\n .then(response => response.json())\r\n .then(result => {\r\n result.Score\r\n ? cb(null, result.Score)\r\n : cb('Sentiment Analysis Failed', 0);\r\n });\r\n}\r\n\r\n\r\nexport const SetPostType = (postType: string) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.SetPostType({ postType }));\r\n}\r\n\r\nexport const SetChangedSinceSaved = (changed: boolean) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.SetChangedSinceSave({ changed }));\r\n}\r\n\r\nexport const SetSaving = (saving: boolean) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.SetSaving({ saving }));\r\n}\r\n\r\nexport const updatePostList = (newPostList: PostListingPage) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.setNewPostList({ page: newPostList }))\r\n}\r\n\r\n\r\nexport const setUploading = (uploading: boolean) => (dispatch, getState) => {\r\n dispatch(Actions.SetUploading({ uploading }))\r\n}\r\n\r\nexport const uploadThumbImage = (blob: Blob, videoId: string, onProgress: (percentCompleted: number) => void, onLoad?: (e) => void, onError?: (e) => void, onAbort?: (e) => void) => (dispatch, getState: () => GlobalApplicationState) => {\r\n return MsalAuthModule.getInstance().getAccessToken()\r\n .then((accessToken) => {\r\n let requestDetails = API.mediaLibrary.VideoUploads.UploadImageThumbnail(blob, videoId);\r\n let url = getState().config.SparrowClientApiUrl + requestDetails.url\r\n .replace('{tenant}', getState().tenant.id);\r\n\r\n let handlers = {\r\n onProgress,\r\n onLoad,\r\n onError,\r\n onAbort\r\n }\r\n return new XhrUpload(url, requestDetails, handlers)\r\n .authenticateWith(accessToken)\r\n .upload();\r\n })\r\n .then((response: string) => {\r\n let resultingThumb = JSON.parse(response) as { id: string, url: string, thumbnail: ImageV1 }\r\n return resultingThumb;\r\n });\r\n}\r\n\r\nexport const setPostFeedFilters = (filters: Partial) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.SetPostFeedFilters({ filters }));\r\n}\r\n\r\nexport const sendAcknowledgement = (postId: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.SendAcknowledgement({}));\r\n return dispatch(API.compliance.SendAcknowledgement(postId))\r\n .then(response => {\r\n dispatch(Actions.SendAcknowledgementComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SendAcknowledgementComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\n\r\nexport const setReaction = (postId: string, reactionId: string | null) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.SetReaction({}));\r\n return dispatch(API.reactions.SetReaction(postId, reactionId))\r\n .then(response => {\r\n dispatch(Actions.SetReactionComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SetReactionComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const addComment = (postId: string, bodyHtml: string, bodySimple: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.AddComment({}));\r\n return dispatch(API.comments.AddComment(postId, bodyHtml, bodySimple))\r\n .then(response => {\r\n dispatch(Actions.AddCommentComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200\r\n })\r\n .catch(err => {\r\n dispatch(Actions.AddCommentComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const addCommentReply = (postId: string, bodyHtml: string, bodySimple: string, parentId: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.AddCommentReply({}));\r\n return dispatch(API.comments.AddCommentReply(postId, bodyHtml, bodySimple, parentId))\r\n .then(response => {\r\n dispatch(Actions.AddCommentReplyComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200\r\n })\r\n .catch(err => {\r\n dispatch(Actions.AddCommentReplyComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const deleteComment = (commentId: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.DeleteComment({}));\r\n return dispatch(API.comments.DeleteComment(commentId))\r\n .then(response => {\r\n dispatch(Actions.DeleteCommentComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DeleteCommentComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const destarComment = (commentId: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.DestarComment({}));\r\n return dispatch(API.comments.DestarComment(commentId))\r\n .then(response => {\r\n dispatch(Actions.DestarCommentComplete({ succeeded: response.status === 200 }));\r\n return response.json();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DestarCommentComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const editComment = (commentId: string, bodyHtml: string, bodySimple: string, snapshot: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.EditComment({}));\r\n return dispatch(API.comments.EditComment(commentId, bodyHtml, bodySimple, snapshot))\r\n .then(response => {\r\n dispatch(Actions.EditCommentComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.EditCommentComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const flagComment = (commentId: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.FlagComment({}));\r\n return dispatch(API.comments.FlagComment(commentId))\r\n .then(response => {\r\n dispatch(Actions.FlagCommentComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.FlagCommentComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const starComment = (commentId: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.StarComment({}));\r\n return dispatch(API.comments.StarComment(commentId))\r\n .then(response => {\r\n dispatch(Actions.StarCommentComplete({ succeeded: response.status === 200 }));\r\n return response.json();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.StarCommentComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const subscribeToComments = (postId: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.SubscribeToComments({}));\r\n return dispatch(API.comments.SubscribeToPostComments(postId, true))\r\n .then(response => {\r\n dispatch(Actions.SubscribeToCommentsComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SubscribeToCommentsComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const unsubscribeFromComments = (postId: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.UnsubscribeFromComments({}));\r\n return dispatch(API.comments.SubscribeToPostComments(postId, false))\r\n .then(response => {\r\n dispatch(Actions.UnsubscribeFromCommentsComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.UnsubscribeFromCommentsComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const clearFetchPost = () => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.ClearFetchPost({}));\r\n}\r\n\r\nexport const clearPostAuthoringErrorMessage = () => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.ClearPostAuthoringErrorMessage({}));\r\n}\r\n\r\nexport const clearPostAuthoringSuccessMessage = () => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.ClearPostAuthoringSuccessMessage({}));\r\n}\r\n\r\nexport const clearPostFeed = () => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.ClearPostFeed({}));\r\n}\r\n\r\nexport const clearPostFeedErrorMessage = () => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.ClearPostFeedErrorMessage({}));\r\n}\r\n\r\nexport const clearPostFeedFilters = () => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.ClearPostFeedFilters({}));\r\n}\r\n\r\nexport const clearPostViewErrorMessage = () => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.ClearPostViewErrorMessage({}));\r\n}\r\n\r\nexport const clearShouldFetch = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ClearShouldFetch({}));\r\n}\r\n","import * as React from 'react';\r\nimport shallowEquals from 'utils/shallowEquals';\r\n\r\ninterface ComponentProps {\r\n distanceThreshold: number\r\n forPosts?: boolean\r\n hasNext: boolean\r\n loading: boolean\r\n usesWindowScroll?: boolean\r\n onThresholdCrossed: () => void\r\n loadingBlockRenderer: () => JSX.Element | null\r\n loadingBlockFallbackRenderer: () => JSX.Element | null\r\n collapsed?: boolean\r\n \r\n}\r\n\r\nexport default class InfiniteScrollView extends React.Component {\r\n\r\n private _container: HTMLElement;\r\n private _childrenContainer: HTMLElement;\r\n\r\n public shouldComponentUpdate(nextProps: ComponentProps) {\r\n return !shallowEquals(nextProps, this.props);\r\n }\r\n\r\n public componentDidMount() {\r\n if(this.props.usesWindowScroll) {\r\n window.addEventListener('scroll', this.handleScrollEvent);\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n if(this.props.usesWindowScroll){\r\n window.removeEventListener('scroll', this.handleScrollEvent)\r\n }\r\n }\r\n\r\n public render() {\r\n const containerStyle: React.CSSProperties = this.props.usesWindowScroll ? {} :\r\n { position: 'absolute', width: '100%', height: '100%', overflowY: 'scroll', overflowX: 'hidden'}\r\n\r\n return (\r\n
    this._container = e!}\r\n onScroll={this.onContainerScroll}\r\n style={{display: this.props.collapsed? 'none' : 'block', paddingBottom: this.props.forPosts? '40px' : '', ...containerStyle}}>\r\n
    this._childrenContainer = e!}>\r\n { this.props.children }\r\n
    \r\n
    \r\n { this.renderLoadingBlock() }\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n public handleScrollEvent = () => {\r\n if (this.props.loading || !this.props.hasNext) {\r\n return;\r\n }\r\n\r\n if (this.getDistance() < this.props.distanceThreshold) {\r\n this.props.onThresholdCrossed()\r\n }\r\n }\r\n\r\n public onContainerScroll = () => {\r\n if(!this.props.usesWindowScroll){\r\n this.handleScrollEvent();\r\n }\r\n }\r\n\r\n private renderLoadingBlock = () => {\r\n if (!this.props.loading && !this.props.hasNext) {\r\n return null;\r\n }\r\n else if (this.props.loading) {\r\n return this.props.loadingBlockRenderer();\r\n } \r\n else {\r\n return this.props.loadingBlockFallbackRenderer();\r\n }\r\n }\r\n\r\n private getDistance = () => {\r\n if (this.props.usesWindowScroll) {\r\n let bottomOfWindow = window.pageYOffset + window.innerHeight;\r\n return this._childrenContainer.clientHeight - bottomOfWindow;\r\n } else {\r\n let bottomOfPane = this._container.scrollTop + this._container.offsetHeight;\r\n return this._childrenContainer.clientHeight - bottomOfPane;\r\n }\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\n\r\nimport * as Actions from 'modules/posts/actionCreator';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport Loading from 'modules/common/components/loading';\r\nimport InfiniteScrollView from 'modules/common/components/table-view/components/infinite-scroll-view';\r\nimport {injectIntl, IntlShape} from \"react-intl\";\r\nimport { Image } from \"modules/gallery/models\";\r\nimport { mediaApi } from 'api/instances';\r\n\r\nimport './imageSelector.sass';\r\n\r\nclass ImageSelector extends React.Component {\r\n\r\n private videoRef: HTMLVideoElement;\r\n\r\n constructor(props){\r\n super(props);\r\n this.state = {\r\n videoPreviewUrl: null,\r\n videoId: null\r\n };\r\n }\r\n \r\n public componentDidMount() {\r\n let secondsSinceLastFetch = (new Date().getTime() - this.props.imageLibrary.lastFetched!) / 1000;\r\n if (this.props.imageLibrary.shouldFetch || secondsSinceLastFetch > 15 * 60) {\r\n this.props.fetchImages(true);\r\n }\r\n }\r\n\r\n public componentWillUpdate(nextProps) {\r\n if (!this.props.previewImage && nextProps.previewImage){\r\n document.querySelector(\"body\")!.setAttribute(\"style\", \"overflow: hidden\")\r\n }\r\n }\r\n\r\n public render() {\r\n let imageList = (\r\n this.props.imageLibrary && this.props.imageLibrary.images && this.props.imageLibrary.images.length > 0\r\n ? this.props.imageLibrary.images.map(image => {\r\n let className = ((this.props.selectedImageIds || []).indexOf(image.id) > -1 ? 'library-image active' : 'library-image');\r\n return (\r\n {\r\n if (this.props.selectedImageIds!.indexOf(image.id) < 0) {\r\n this.props.imageSelected(image)\r\n } else {\r\n this.props.imageDeselected(image)\r\n }\r\n }}\r\n >\r\n {\r\n this.props.showPreviews &&\r\n {\r\n e.stopPropagation(); \r\n this.props.onPreview(image);\r\n }}>pageview\r\n }\r\n
    \r\n \r\n {\r\n image.videoId && this.props.showVideoIcons &&\r\n
    \r\n e.stopPropagation()}>play_circle_outline\r\n
    \r\n }\r\n \r\n
    \r\n );\r\n })\r\n : !this.props.imageLibrary.fetching &&\r\n

    {this.props.intl.formatMessage({id: \"posts.noImagesFound\", defaultMessage: \"No images found.\"})}

    \r\n )\r\n\r\n let loadMoreFallback = (\r\n
    \r\n

    \r\n {\r\n this.props.imageLibrary.fetching ?\r\n {this.props.intl.formatMessage({id: \"common.loading\"})}...\r\n :\r\n \r\n }\r\n

    \r\n
    \r\n );\r\n\r\n let hasMoreImagesToFetch = this.props.imageLibrary.images.length > 0\r\n && this.props.imageLibrary.continuationToken != null;\r\n\r\n return (\r\n
    \r\n }\r\n loadingBlockFallbackRenderer={() => loadMoreFallback}\r\n onThresholdCrossed={() => this.props.fetchImages(true)}\r\n hasNext={hasMoreImagesToFetch} >\r\n
    \r\n { imageList }\r\n
    \r\n \r\n {\r\n this.props.showPreviews && this.props.previewImage &&\r\n
    \r\n {\r\n this.props.onPreview(null);\r\n this.setState({\r\n videoId: null,\r\n videoPreviewUrl: null\r\n })\r\n document.querySelector(\"body\")!.setAttribute(\"style\", \"\");\r\n }}>close\r\n {\r\n this.props.previewImage.videoId\r\n ? this.showVideo(this.props.previewImage)\r\n : \"preview\"\r\n }\r\n
    \r\n }\r\n
    \r\n );\r\n }\r\n\r\n private initVideoPlayer() {\r\n if (this.videoRef) {\r\n const videojs = (window as any).videojs;\r\n const self = this;\r\n const player = videojs(this.videoRef, {});\r\n player.ready(() => {\r\n player.src(self.state.videoPreviewUrl);\r\n })\r\n .on('ended', () => {\r\n player.pause().currentTime(0).trigger('loadstart');\r\n })\r\n .on('pause', () => {\r\n player.bigPlayButton.el_.style.display = 'block';\r\n })\r\n .on('play', () => {\r\n player.bigPlayButton.el_.style.display = 'none';\r\n });\r\n }\r\n }\r\n\r\n private showVideo = (previewImage: Image) => {\r\n if(previewImage.videoId && previewImage.videoId !== this.state.videoId){\r\n \r\n mediaApi.GetVideoUrl(previewImage.videoId)\r\n .then(response => {\r\n this.setState({\r\n videoId: previewImage.videoId, \r\n videoPreviewUrl: response\r\n }, this.initVideoPlayer)\r\n })\r\n }\r\n return this.videoRef = e!}\r\n crossOrigin=\"anonymous\"\r\n controls\r\n preload=\"metadata\"\r\n style={{ backgroundColor: \"black\" }}\r\n poster={previewImage.url}\r\n />\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n selectedImageIds?: string[]\r\n imageSelected: (image: any) => void\r\n imageDeselected: (image: any) => void\r\n intl: IntlShape;\r\n showPreviews?: boolean;\r\n previewImage?: Image | null;\r\n onPreview?: any;\r\n showVideoIcons?: boolean;\r\n forGallery?: boolean;\r\n}\r\n\r\ninterface ComponentState {\r\n videoPreviewUrl?: string | null;\r\n videoId?: string | null;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps)=>({\r\n ...ownProps,\r\n imageLibrary: state.posts.imageLibrary,\r\n }), \r\n {\r\n fetchImages: Actions.fetchImages\r\n }\r\n);\r\n type PropsWithRedux = ConnectedProps;\r\n\r\nexport default injectIntl(connector(ImageSelector));\r\n","import React, { useState, useEffect } from \"react\";\r\nimport ToggleSwitch from \"modules/common/components/toggleSwitch\";\r\nimport { ExternalPostSource, ExternalPostSourceTypes } from \"../models\";\r\nimport TextInput from \"modules/common/components/forms/inputs/textInput\";\r\nimport \"./styles/externalPostSourceEditForm.sass\";\r\nimport Select from \"react-select\";\r\nimport TopicsSelect from \"./topicsSelect\";\r\nimport { Tag } from \"modules/tenant/models\";\r\nimport Modal, { ModalButton } from \"modules/common/components/modal\";\r\nimport InlineError from \"modules/common/components/forms/messages/InlineError\";\r\nimport ImageSelector from 'modules/gallery/components/imageSelector';\r\nimport { fetchImage } from \"modules/posts/actionCreator\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport { emailRegex } from \"utils/regexUserValidation\";\r\n\r\ninterface ComponentProps {\r\n editingExternalPostSource: ExternalPostSource;\r\n working: boolean;\r\n onChange: (updatedExternalPostSource: ExternalPostSource) => any;\r\n onClose: () => any;\r\n onDelete: (deletedExternalPostSource: ExternalPostSource) => any;\r\n}\r\ninterface Option {\r\n label: string;\r\n value: string;\r\n}\r\n\r\nconst sourceTypeOptions = [{ value: \"1\", label: \"RSS\" }] as Option[];\r\n\r\nexport default function ExternalPostSourceEditForm(props: ComponentProps) {\r\n const [source, setSource] = useState(null);\r\n const [attemptedToSave, setAttemptedToSave] = useState(false);\r\n const [selectedImage, setSelectedImage] = useState({id: '', url: ''});\r\n const [showingImageSelector, setShowingImageSelector] = useState(false);\r\n const dispatch = useDispatch();\r\n\r\n useEffect(() => {\r\n setSource(props.editingExternalPostSource);\r\n }, [props.editingExternalPostSource]);\r\n\r\n useEffect(() => {\r\n if(source?.defaultDraftImage\r\n && !selectedImage.url){\r\n fetchImage(source.defaultDraftImage)(dispatch)\r\n .then(img => {\r\n setSelectedImage(img);\r\n });\r\n }\r\n })\r\n\r\n const closeDialog = () => {\r\n setSource(null);\r\n setAttemptedToSave(false);\r\n\r\n props.onClose();\r\n };\r\n const addOrUpdateExternalPostSource = () => {\r\n setAttemptedToSave(true);\r\n\r\n if (isSourceValid(source)) {\r\n if (source) props.onChange(source);\r\n }\r\n };\r\n const deleteExternalPostSource = async () => {\r\n if (await window.confirm(\"Are you sure you want to delete this external post source?\")) {\r\n if (source) {\r\n props.onDelete(source);\r\n }\r\n }\r\n };\r\n\r\n const fieldChanged = (fieldName: string, value: any) => {\r\n const updatedSource = {\r\n ...source,\r\n [fieldName]: value,\r\n } as ExternalPostSource;\r\n setSource(updatedSource);\r\n };\r\n\r\n const isSourceValid = (sourceToValidate: ExternalPostSource | null): boolean => {\r\n return (\r\n !!sourceToValidate &&\r\n !!sourceToValidate.name &&\r\n !!sourceToValidate.defaultAuthorName &&\r\n !!sourceToValidate.sourceType &&\r\n !!sourceToValidate.url &&\r\n isValidUrl(sourceToValidate.url) &&\r\n (!sourceToValidate.defaultAuthorEmail ||\r\n (!!sourceToValidate.defaultAuthorEmail && isValidEmail(sourceToValidate.defaultAuthorEmail))) &&\r\n isValidTopics(sourceToValidate.topics as Tag[])\r\n );\r\n };\r\n\r\n const nameChanged = (name: string) => fieldChanged(\"name\", name);\r\n const urlChanged = (url: string) => {\r\n fieldChanged(\"url\", url);\r\n\r\n if (isValidUrl(url) && source?.sourceType) {\r\n checkUrl(url, source?.sourceType);\r\n }\r\n };\r\n const checkUrl = (url: string, type: ExternalPostSourceTypes) => {\r\n if (type === ExternalPostSourceTypes.RSS) {\r\n //TODO:\r\n }\r\n };\r\n const defaultAuthorNameChanged = (defaultAuthorName: string) => fieldChanged(\"defaultAuthorName\", defaultAuthorName);\r\n const defaultAuthorEmailChanged = (defaultAuthorEmail: string) => fieldChanged(\"defaultAuthorEmail\", defaultAuthorEmail);\r\n const enableDisableChanged = (isEnabled: boolean) => fieldChanged(\"enabled\", isEnabled);\r\n const defaultImageChanged = (defaultImageId: string) => fieldChanged(\"defaultDraftImage\", defaultImageId);\r\n const typeChanged = (o: Option) => {\r\n fieldChanged(\"sourceType\", getExternalResourceType(o.value));\r\n };\r\n\r\n const topicsChanged = (topics: { id: string }[]) => {\r\n fieldChanged(\"topics\", topics);\r\n };\r\n\r\n const getExternalResourceType = (type: string | number): ExternalPostSourceTypes | undefined => {\r\n switch (type) {\r\n case 1:\r\n case \"1\":\r\n return ExternalPostSourceTypes.RSS;\r\n }\r\n };\r\n\r\n const isValidUrl = (url: string): boolean => {\r\n var urlRegExpression = /https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)?/gi; // eslint-disable-line\r\n var regex = new RegExp(urlRegExpression);\r\n return regex.test(url);\r\n };\r\n\r\n const isValidEmail = (email: string): boolean => {\r\n return emailRegex.test(email);\r\n };\r\n\r\n const isValidTopics = (topics: Tag[] | null): boolean => {\r\n return !!topics && topics?.length > 0;\r\n };\r\n const isUpdate = !!source?.id;\r\n\r\n const modalButtons = [\r\n {\r\n title: isUpdate ? \"Update\" : \"Add\",\r\n workingTitle: isUpdate ? \"Updating\" : \"Adding\",\r\n isWorking: props.working,\r\n isPrimary: true,\r\n isEnabled: true,\r\n onClick: () => {\r\n addOrUpdateExternalPostSource();\r\n },\r\n },\r\n { title: \"Cancel\", isPrimary: false, isEnabled: true, onClick: closeDialog },\r\n ] as ModalButton[];\r\n\r\n if (isUpdate) {\r\n modalButtons.push({\r\n title: \"Delete\",\r\n workingTitle: \"Deleting\",\r\n isWorking: props.working,\r\n isPrimary: false,\r\n isEnabled: isUpdate,\r\n className: \"delete\",\r\n onClick: () => {\r\n deleteExternalPostSource();\r\n },\r\n } as ModalButton);\r\n }\r\n\r\n return (\r\n
    \r\n \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n l.value === source?.sourceType?.toString())}\r\n onChange={typeChanged}\r\n isClearable={false}\r\n isMulti={false}\r\n placeholder={\"Select...\"}\r\n />\r\n {attemptedToSave && !source?.sourceType && Required}\r\n
    \r\n
    \r\n \r\n {\r\n selectedImage.url &&\r\n
    setShowingImageSelector(true)}>\r\n
    \r\n
    \r\n }\r\n \r\n {\r\n selectedImage.url &&\r\n \r\n }\r\n
    \r\n \r\n \r\n \r\n
    \r\n enableDisableChanged(!source?.enabled)} value={source?.enabled || false} />\r\n \r\n
    \r\n\r\n
    \r\n \r\n {\r\n showingImageSelector &&\r\n setShowingImageSelector(false)}\r\n buttons={[]}>\r\n {\r\n defaultImageChanged(img.id);\r\n setSelectedImage(img);\r\n setShowingImageSelector(false);\r\n }}\r\n imageDeselected={() => setSelectedImage({id: '', url: ''})}\r\n />\r\n \r\n }\r\n
    \r\n );\r\n}\r\n","import React from 'react';\r\nimport '../styles/messagingCenterForm.sass'\r\nimport '../styles/settingsTabWithSidebar.sass'\r\nimport MessagingMainControls from './messagingMainControls';\r\nimport MessagingPostControls from './messagingPostControls';\r\nimport MessagingEventControls from './messagingEventControls';\r\nimport MessagingGeneralControls from './messagingGeneralControls';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\ninterface ComponentProps {}\r\n\r\ninterface ComponentState { \r\n activeTab: MessagingCenterTabs\r\n}\r\n\r\nenum MessagingCenterTabs {\r\n Main,\r\n // SMSConsent,\r\n Post,\r\n Event,\r\n General,\r\n Document,\r\n}\r\nclass MessagingCenterForm extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n activeTab: MessagingCenterTabs.Main\r\n }\r\n }\r\n public render() {\r\n const tabMapping = [\r\n {id: MessagingCenterTabs.Main, title: \"Main Controls\", content: },\r\n // {id: MessagingCenterTabs.SMSConsent, title: \"SMS Consent Messages\", content: },\r\n {id: MessagingCenterTabs.General, title: \"General Notifications\", content: },\r\n {id: MessagingCenterTabs.Post, title: \"Post Notifications/Reminders\", content: },\r\n {id: MessagingCenterTabs.Event, title: \"Events Notifications/Reminders\", content: }\r\n ]\r\n\r\n const tabs = tabMapping.map((tab) => {\r\n const active = tab.id === this.state.activeTab ? '--active' : '';\r\n return (\r\n
    this.setState({...this.state, activeTab: tab.id})}> \r\n {tab.title}\r\n
    \r\n )\r\n })\r\n\r\n const activeTab = tabMapping.find((tab) => tab.id === this.state.activeTab)!\r\n\r\n if(this.props.fetching)\r\n {\r\n return null;\r\n }\r\n else\r\n {\r\n return (\r\n
    \r\n
    \r\n {tabs}\r\n
    \r\n
    \r\n {activeTab.content}\r\n
    \r\n
    \r\n )\r\n }\r\n }\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n fetching: state.settings.fetching\r\n }),\r\n {\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(MessagingCenterForm));","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as actions from \"../actionCreator\";\r\nimport ToggleSwitch from \"modules/common/components/toggleSwitch\";\r\nimport TableView, { DataColumn } from \"modules/common/components/table-view/components/table-view\";\r\nimport { Tag } from \"modules/posts/models\";\r\nimport moment from \"moment\";\r\nimport \"./styles/externalSourcesSettingsForm.sass\";\r\nimport { ExternalPostSource, ExternalPostSourceTypes } from \"modules/settings/models\";\r\nimport ExternalPostSourceEditForm from \"./externalPostSourceEditForm\";\r\n\r\ninterface ComponentState {\r\n editingExternalPostSource: ExternalPostSource | null;\r\n working: boolean;\r\n}\r\n\r\nclass ExternalSourcesSettingsForm extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = { editingExternalPostSource: null, working: false };\r\n }\r\n public render() {\r\n const working = this.props.saving || this.props.fetching;\r\n\r\n const columns = [\r\n {\r\n dataKey: \"name\",\r\n name: \"Name\",\r\n renderer: (rowData: ExternalPostSource, column, selected) => {\r\n return {rowData.name};\r\n },\r\n sortable: false,\r\n },\r\n {\r\n dataKey: \"type\",\r\n name: \"Type\",\r\n renderer: (rowData: ExternalPostSource, column, selected) => {\r\n return {this.getExternalResourceTypeName(rowData.sourceType)};\r\n },\r\n sortable: false,\r\n },\r\n {\r\n dataKey: \"topics\",\r\n name: \"Topics\",\r\n renderer: (rowData: ExternalPostSource, column, selected) => {\r\n return (\r\n \r\n {(rowData.topics || ([] as Tag[]))\r\n .map((currTag) => {\r\n return !!currTag ? this.getTagName(currTag.id) : \"\";\r\n })\r\n .join(\", \")}\r\n \r\n );\r\n },\r\n sortable: false,\r\n },\r\n {\r\n dataKey: \"lastChecked\",\r\n name: \"Last Check\",\r\n renderer: (rowData: ExternalPostSource, column, selected) => {\r\n return (\r\n \r\n {rowData.lastChecked\r\n ? moment(rowData.lastChecked).format(\"MM/DD/YYYY h:mm A\").toString()\r\n : rowData.enabled\r\n ? \"waiting for first check\"\r\n : \"never\"}\r\n \r\n );\r\n },\r\n sortable: false,\r\n },\r\n {\r\n dataKey: \"enabled\",\r\n name: \"Enabled\",\r\n renderer: (rowData: ExternalPostSource, column, selected) => {\r\n return (\r\n {\r\n this.setExternalSourceEnabled(rowData.id, !rowData.enabled);\r\n }}\r\n disabled={working}\r\n />\r\n );\r\n },\r\n sortable: false,\r\n },\r\n ] as DataColumn[];\r\n\r\n return (\r\n <>\r\n
    \r\n
    \r\n \r\n
    \r\n\r\n \r\n
    \r\n {!!this.state.editingExternalPostSource && (\r\n \r\n )}\r\n \r\n );\r\n }\r\n\r\n private getTagName = (tagId: string): string | undefined => {\r\n return this.props.tenantSettings.tagGroups?.find((g) => g.tags.some((t) => t.id === tagId))?.tags.find((t) => t.id === tagId)?.name;\r\n };\r\n private addNewSource = () => {\r\n this.setState((state) => ({\r\n ...state,\r\n editingExternalPostSource: {} as ExternalPostSource,\r\n }));\r\n };\r\n\r\n private onCloseDialog = () => {\r\n this.setState((state) => ({\r\n ...state,\r\n editingExternalPostSource: null,\r\n }));\r\n };\r\n\r\n private onRowClicked = (selectedKey: string) => {\r\n let selectedSource = this.props.tenantSettings.externalPostSources?.[selectedKey];\r\n\r\n this.setState((state) => ({\r\n ...state,\r\n editingExternalPostSource: selectedSource,\r\n }));\r\n };\r\n\r\n private addOrUpdateExternalPostSource = (updatedExternalPostSource: ExternalPostSource) => {\r\n const call = updatedExternalPostSource.id\r\n ? this.props.updateExternalPostSource(updatedExternalPostSource)\r\n : this.props.addExternalPostSource(updatedExternalPostSource);\r\n this.setState({working: true})\r\n call.then((success) => {\r\n this.setState({working: false});\r\n if (success) {\r\n this.onCloseDialog();\r\n }\r\n });\r\n };\r\n\r\n private deleteExternalPostSource = (deletedExternalPostSource: ExternalPostSource) => {\r\n this.setState({working: true})\r\n this.props.deleteExternalPostSource(deletedExternalPostSource.id).then(() => {\r\n this.setState({working: false})\r\n this.onCloseDialog();\r\n });\r\n };\r\n\r\n private setExternalSourceEnabled = (sourceId: string, enabled: boolean) => {\r\n this.props.setExternalPostSourceEnabled(sourceId, enabled);\r\n };\r\n\r\n private getExternalResourceTypeName = (type: ExternalPostSourceTypes): string => {\r\n switch (type) {\r\n case ExternalPostSourceTypes.RSS:\r\n return \"RSS\";\r\n }\r\n };\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n fetching: state.settings.fetching,\r\n saving: state.settings.saving,\r\n tenantSettings: state.settings.tenantSettings,\r\n tenant: state.tenant.id,\r\n }),\r\n {\r\n addExternalPostSource: actions.addExternalPostSource,\r\n updateExternalPostSource: actions.updateExternalPostSource,\r\n deleteExternalPostSource: actions.deleteExternalPostSource,\r\n setExternalPostSourceEnabled: actions.setExternalPostSourceEnabled,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(ExternalSourcesSettingsForm);\r\n","import React, { useEffect, useState } from 'react';\r\n\r\ninterface ComponentProps {\r\n title: string;\r\n inputType: string;\r\n description?: string;\r\n isDisabled?: boolean;\r\n onChange?: (any) => any;\r\n placeholder?: string;\r\n value?: string;\r\n setTimer?: number;\r\n pristineText?: string;\r\n maxLength?: number;\r\n}\r\nconst InputField: React.FunctionComponent = ( {title, inputType, description, isDisabled, placeholder, onChange, value, setTimer, pristineText, maxLength} ) => {\r\n\r\n const [term, setTerm] = useState(value ?? \"\");\r\n const [debouncedTerm, setDebouncedTerm] = useState(term);\r\n const [onChangeTerm] = useState(() => onChange);\r\n\r\n useEffect(() => {\r\n const timerId = setTimeout(() => {\r\n setDebouncedTerm(term);\r\n }, setTimer ?? 0)\r\n\r\n return () => {\r\n clearTimeout(timerId);\r\n }\r\n }, [setTimer, term])\r\n\r\n useEffect(() => {\r\n if (debouncedTerm) {\r\n onChangeTerm!(debouncedTerm)\r\n }\r\n }, [debouncedTerm, onChangeTerm])\r\n\r\n useEffect(() => {\r\n if(value === pristineText) {\r\n setTerm(pristineText ?? \"\");\r\n }\r\n }, [pristineText, value])\r\n\r\n return (\r\n
    \r\n \r\n
    \r\n setTerm(e.target.value)}\r\n maxLength={maxLength ?? 1000}\r\n />\r\n

    {description}

    \r\n
    \r\n
    \r\n )\r\n}\r\n\r\nexport default InputField;","import React from 'react';\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport ToggleSwitch from 'modules/common/components/toggleSwitch';\r\nimport { actions } from '../..';\r\n\r\ninterface ComponentProps {\r\n title: string; \r\n emailEvent: string;\r\n smsEvent?: string;\r\n description?: string;\r\n value?: any;\r\n textVisible?: boolean;\r\n smaller?: boolean;\r\n}\r\n\r\nconst SettingsToggleOnly: React.FC = ({title, emailEvent, smsEvent, description, value, notificationSettings, textVisible, smaller, toggleEmailChannel}) => {\r\n return (\r\n\r\n
    \r\n {!smaller && \r\n
    \r\n
    {title} \r\n \r\n toggleEmailChannel(emailEvent, !notificationSettings.settings[emailEvent].toggle)} \r\n />\r\n \r\n
    \r\n
    \r\n }\r\n\r\n {smaller &&\r\n
    \r\n
    {title}\r\n \r\n toggleEmailChannel(emailEvent, !notificationSettings.settings[emailEvent].toggle)} \r\n />\r\n \r\n
    \r\n
    \r\n }\r\n\r\n {(textVisible ?? true) &&\r\n
    {description}
    \r\n }\r\n
    \r\n )\r\n}\r\n\r\n\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n }),\r\n {\r\n toggleEmailChannel: actions.EnableSelectedChannel\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(SettingsToggleOnly));","import * as React from 'react';\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { actions } from '../..';\r\nimport 'styles/settings.sass'\r\n\r\ninterface ComponentProps {\r\n descriptor: string;\r\n event: string;\r\n secondEvent?: string;\r\n}\r\n \r\nconst BlackoutToggleEvent: React.FC = ({descriptor, event, secondEvent, eventsWithBlackout, toggleBlackoutPeriod}) => {\r\n const activated = eventsWithBlackout.includes(event);\r\n if(secondEvent === undefined)\r\n secondEvent = \"\";\r\n return ( \r\n
    \r\n toggleBlackoutPeriod(event, secondEvent!, \"\", \"\", !activated)}\r\n checked={activated}>\r\n toggleBlackoutPeriod(event, secondEvent!, \"\", \"\", !activated)}>{descriptor}\r\n
    \r\n );\r\n}\r\n \r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n eventsWithBlackout: state.settings.applyBlackoutPeriodsTo,\r\n }),\r\n {\r\n toggleBlackoutPeriod: actions.ApplyBlackoutPeriod\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(BlackoutToggleEvent));","import React, { useEffect, useState } from 'react';\r\n\r\ninterface ComponentProps {\r\n title: string;\r\n inputType: string;\r\n description?: string;\r\n isDisabled?: boolean;\r\n onChange: (any) => any;\r\n placeholder?: string;\r\n value?: string;\r\n setTimer?: number;\r\n disabledText: string;\r\n pristineText?: string;\r\n maxLength?: number;\r\n filter?: string;\r\n}\r\nconst InputFieldDouble: React.FunctionComponent = ( {title, inputType, description, isDisabled, placeholder, onChange, value, setTimer, disabledText, pristineText, maxLength, filter} ) => {\r\n\r\n const [term, setTerm] = useState(value ?? \"\");\r\n const [debouncedTerm, setDebouncedTerm] = useState(term);\r\n const [onChangeTerm] = useState(() => onChange);\r\n\r\n useEffect(() => {\r\n const timerId = setTimeout(() => {\r\n setDebouncedTerm(term);\r\n }, setTimer ?? 0)\r\n\r\n return () => {\r\n clearTimeout(timerId);\r\n }\r\n }, [setTimer, term])\r\n\r\n useEffect(() => {\r\n if (debouncedTerm) {\r\n onChangeTerm(debouncedTerm)\r\n }\r\n }, [debouncedTerm, onChangeTerm])\r\n\r\n useEffect(() => {\r\n if(value === pristineText) {\r\n setTerm(pristineText ?? \"\");\r\n }\r\n }, [pristineText, value])\r\n\r\n const doubleCheck = (e) => {\r\n if(filter != null) {\r\n if(e.target.value.match(filter) != null)\r\n setTerm(e.target.value);\r\n }\r\n else {\r\n setTerm(e.target.value);\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n \r\n
    \r\n doubleCheck(e)}\r\n maxLength={maxLength ?? 100}\r\n />\r\n
    \r\n \r\n

    {description}

    \r\n
    \r\n
    \r\n )\r\n}\r\n\r\nexport default InputFieldDouble;","\r\nimport { Grid, TextField, Typography, styled } from '@mui/material';\r\nimport React, { useState } from 'react';\r\n\r\ninterface ComponentProps {\r\n isDisabled?: boolean;\r\n placeholder?: string;\r\n maxLength?: number;\r\n label: string;\r\n value: string;\r\n shareEvent: string;\r\n onChange: (shareEvent: string, value: string) => void;\r\n}\r\n\r\nconst SettingsTextField = styled(TextField)({\r\n \"& .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline\": {\r\n borderColor: \"#414141\"\r\n },\r\n \"& .MuiOutlinedInput-root.Mui-error .MuiOutlinedInput-notchedOutline\": {\r\n borderColor: \"#414141\",\r\n borderWidth: 2\r\n },\r\n \"& .MuiFormHelperText-contained\": {\r\n marginLeft: 0,\r\n marginRight: 0,\r\n \"&.Mui-focused\": {\r\n color: \"#414141\"\r\n }\r\n }\r\n });\r\n\r\nconst TextInputField: React.FunctionComponent = ( { value, isDisabled, placeholder, maxLength, label, shareEvent, onChange } ) => {\r\n //Used in order to use a state vs. updating via the action creator as it was super laggy and terrible.\r\n const [currValue, setValue] = useState(value); \r\n return (\r\n \r\n \r\n
    \r\n {label}\r\n
    \r\n
    \r\n \r\n {\r\n setValue(e.target.value);\r\n }}\r\n onBlur={(e)=> {\r\n onChange(shareEvent,e.target.value);\r\n }}\r\n />\r\n \r\n
    \r\n );\r\n}\r\n\r\nexport default TextInputField;","import React from 'react';\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport ToggleSwitch from 'modules/common/components/toggleSwitch';\r\nimport { actions } from '../..';\r\n\r\ninterface ComponentProps {\r\n title: string; \r\n shareToggleEvent: string;\r\n postsShareUrlEvent: string;\r\n eventsShareUrlEvent: string;\r\n handleClick?: (toggleEvent: string, urlShareEvent1: string, urlShareEvent2: string) => void;\r\n onMouseOver?: (toggleEvent: string, urlShareEvent1: string, urlShareEvent2: string) => void;\r\n}\r\n\r\nconst ShareUrlsToggleOnly: React.FC = ({title, shareToggleEvent, postsShareUrlEvent, eventsShareUrlEvent, shareUrlSettings, handleClick, onMouseOver}) => {\r\n return (\r\n
    \r\n
    \r\n
    \r\n \r\n {title}\r\n \r\n \r\n { handleClick && handleClick(shareToggleEvent, postsShareUrlEvent, eventsShareUrlEvent) }}\r\n onMouseOverHandler={() => { onMouseOver && onMouseOver(shareToggleEvent, postsShareUrlEvent, eventsShareUrlEvent) }}\r\n />\r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n shareUrlSettings: state.settings.tenantSettings.shareUrlsConfig,\r\n }),\r\n {\r\n updateShareToggle: actions.SetToggleShareUrl,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(ShareUrlsToggleOnly));","import React, { useRef, useState } from \"react\";\r\n\r\nimport Popover, { PopoverOrigin } from \"@mui/material/Popover\";\r\n\r\n\r\nimport \"../callout.sass\";\r\n\r\n\r\nconst CalloutHover: React.FC = ({\r\n component,\r\n contentStyle,\r\n anchorOrigin,\r\n children,\r\n arrow = false\r\n}) => {\r\n const [showPopover, setShowPopover] = useState(false);\r\n const popoverRef = useRef(null);\r\n\r\n return (\r\n <>\r\n setShowPopover(true)}\r\n onMouseLeave={() => setShowPopover(false)}\r\n className=\"callout-hover-component\"\r\n >\r\n {component}\r\n
    \r\n setShowPopover(true),\r\n onMouseLeave: () => setShowPopover(false),\r\n style: {\r\n backgroundColor: \"transparent\",\r\n boxShadow: \"none\",\r\n maxWidth: 250,\r\n overflow: \"visible\"\r\n }\r\n }}\r\n style={{ pointerEvents: \"none\" }}\r\n onClose={() => setShowPopover(false)}\r\n classes={{\r\n paper: \"help-text-description\"\r\n }}\r\n >\r\n {arrow &&
    }\r\n
    \r\n
    \r\n {children}\r\n
    \r\n
    \r\n \r\n \r\n )\r\n}\r\n\r\ninterface ComponentProps {\r\n component: JSX.Element;\r\n contentStyle?: React.CSSProperties;\r\n arrow?: boolean;\r\n anchorOrigin?: PopoverOrigin;\r\n}\r\n\r\nexport default CalloutHover;\r\n","import InputField from 'modules/users/components/user-field-components/inputField';\r\nimport React from 'react';\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { ValueLabel } from 'modules/common/components/selectFilter';\r\nimport { ShareUrlEvents, TeamsEvents, actions } from '../..';\r\nimport Select from 'react-select';\r\nimport { Tooltip } from '@mui/material';\r\nimport withStyles from '@mui/styles/withStyles';\r\nimport SettingsToggleOnly from '../toggles/settingsToggleOnly';\r\nimport { NotificationEvents } from 'modules/messaging';\r\nimport BlackoutToggleEvent from '../toggles/blackoutToggleEvent';\r\nimport InputFieldDouble from 'modules/users/components/user-field-components/inputFieldDouble';\r\nimport TextInputField from 'modules/users/components/user-field-components/textInputField';\r\nimport ShareUrlsToggleOnly from '../toggles/shareUrlsToggleOnly';\r\nimport ConditionalWrapper from 'modules/common/components/conditionalWrapper';\r\nimport CalloutHover from 'modules/common/components/hovers/calloutHover';\r\n\r\ninterface ComponentProps { }\r\ninterface ComponentState { \r\n blackoutEmailDaysSelected: boolean;\r\n blackoutSMSDaysSelected: boolean;\r\n blackoutTeamsDaysSelected: boolean;\r\n blackoutMobileDaysSelected: boolean;\r\n reminderPostsDaysSelected: boolean;\r\n reminderEventsDaysSelected: boolean;\r\n\r\n linkPreference: string;\r\n postReminderNum: number;\r\n eventReminderNum: number;\r\n\r\n showPopoverTeams: boolean;\r\n showPopoverSP: boolean;\r\n anchorEl: HTMLDivElement | null;\r\n calloutMessage: string;\r\n\r\n nameFromUrl: string;\r\n sender: string;\r\n}\r\n\r\nclass MessagingMainControls extends React.Component {\r\n\r\n constructor(props) {\r\n super(props)\r\n\r\n var startingNumPost;\r\n var startingNumEvent;\r\n var postsDaysSelected;\r\n var eventsDaysSelected;\r\n var numberSavedPost = this.props.notificationSettings.defaultPostReminder ?? 0;\r\n var numberSavedEvent = this.props.notificationSettings.defaultEventReminder ?? 0;\r\n\r\n if(numberSavedPost % 24 === 0)\r\n {\r\n startingNumPost = numberSavedPost / 24\r\n postsDaysSelected = true;\r\n }\r\n else\r\n {\r\n startingNumPost = numberSavedPost;\r\n postsDaysSelected = false;\r\n }\r\n\r\n if(numberSavedEvent % 24 === 0)\r\n {\r\n startingNumEvent = numberSavedEvent / 24\r\n eventsDaysSelected = true;\r\n }\r\n else\r\n {\r\n startingNumEvent = numberSavedEvent;\r\n eventsDaysSelected = false;\r\n }\r\n\r\n this.state = {\r\n blackoutEmailDaysSelected: false,\r\n blackoutSMSDaysSelected: false,\r\n blackoutTeamsDaysSelected: false,\r\n blackoutMobileDaysSelected: false,\r\n reminderEventsDaysSelected: eventsDaysSelected,\r\n reminderPostsDaysSelected: postsDaysSelected, \r\n linkPreference: \"adminPortal\",\r\n postReminderNum: startingNumPost,\r\n eventReminderNum: startingNumEvent,\r\n nameFromUrl: this.props.notificationSettings.fromEmailAddress?.substring(0, this.props.notificationSettings.fromEmailAddress?.indexOf('@')) ?? \"\",\r\n sender: this.props.notificationSettings.fromEmailName ?? \"\",\r\n showPopoverTeams: false,\r\n showPopoverSP: false,\r\n anchorEl: null,\r\n calloutMessage: \"\",\r\n }\r\n }\r\n\r\n componentDidUpdate() {\r\n \r\n let eventNum = this.state.reminderEventsDaysSelected ? this.state.eventReminderNum * 24 : this.state.eventReminderNum;\r\n let postNum = this.state.reminderPostsDaysSelected ? this.state.postReminderNum * 24 : this.state.postReminderNum;\r\n\r\n let propEvent = this.props.notificationSettings.defaultEventReminder!;\r\n let propPost = this.props.notificationSettings.defaultPostReminder!;\r\n\r\n let urlName = this.props.notificationSettings.fromEmailAddress?.substring(0, this.props.notificationSettings.fromEmailAddress?.indexOf('@')) ?? \"\"\r\n\r\n if(eventNum !== this.props.notificationSettings.defaultEventReminder) {\r\n this.setState({eventReminderNum: propEvent % 24 === 0 ? propEvent / 24 : propEvent, \r\n reminderEventsDaysSelected: propEvent % 24 === 0 ? true : false})\r\n }\r\n\r\n if(postNum !== this.props.notificationSettings.defaultPostReminder) {\r\n this.setState({postReminderNum: propPost % 24 === 0 ? propPost / 24 : propPost, \r\n reminderPostsDaysSelected: propPost % 24 === 0 ? true : false})\r\n }\r\n\r\n if(this.state.nameFromUrl !== urlName)\r\n {\r\n this.setState({nameFromUrl: urlName})\r\n }\r\n\r\n if(this.state.sender !== this.props.notificationSettings.fromEmailName)\r\n {\r\n this.setState({sender: this.props.notificationSettings.fromEmailName ?? \"\"})\r\n }\r\n }\r\n\r\n public render() {\r\n const fullEmailAddress = this.props.notificationSettings.fromEmailAddress;\r\n const linkPreferenceCurrent = this.props.notificationSettings.linkPreference ?? \"adminPortal\";\r\n const addressFromUrl = \"@\" + fullEmailAddress?.split(\"@\").pop();\r\n const location: string = window.location.href;\r\n\r\n let segments: string[] = [];\r\n segments = location.split(this.props.tenantId ?? \"\");\r\n\r\n const companyPortalPostsDefaultUrl = `${segments[0]}${this.props.tenantId}/posts/`;\r\n const companyPortalEventsDefaultUrl = `${segments[0]}${this.props.tenantId}/events/`;\r\n\r\n const blackoutTimeframeOptions = [\r\n { value: 'hours', label: 'Hours'},\r\n { value: 'days', label: 'Days'}\r\n ]\r\n\r\n const linkPreferenceOptions = [\r\n {value: 'none', label: 'None'},\r\n {value: 'adminPortal', label: 'Company Portal'},\r\n {value: 'sharePoint', label: 'MS Sharepoint'},\r\n {value: 'teams', label: \"MS Teams\"}\r\n ]\r\n\r\n const LightTooltip = withStyles((theme) => ({\r\n tooltip: {\r\n backgroundColor: '#f5f5f9',\r\n color: 'rgba(0, 0, 0, 0.87)',\r\n boxShadow: theme.shadows[1],\r\n fontSize: \"12px\"\r\n }\r\n }))(Tooltip);\r\n\r\n return (\r\n
    \r\n
    \r\n Sender Details \r\n

    Change the sender details that employees see upon receiving emails or SMS. Contact Sparrow to customize your email address, domain, and mobile number.

    \r\n\r\n this.props.updateEmailName(e)}\r\n pristineText={this.props.pristine?.fromEmailName}\r\n maxLength={500}\r\n />\r\n\r\n this.props.updateEmailSender(e, addressFromUrl)}\r\n disabledText={addressFromUrl}\r\n pristineText={this.props.pristine?.fromEmailAddress?.substring(0, this.props.pristine?.fromEmailAddress?.indexOf('@')) ?? \"\"}\r\n maxLength={100}\r\n filter={\"^[a-zA-Z1-9 .-]*$\"}\r\n />\r\n \r\n \r\n
    \r\n \r\n
    \r\n Blackout periods \r\n

    Avoid Email and SMS flooding by setting blackout periods.\r\n \r\n Learn More.\r\n \r\n

    \r\n\r\n
    \r\n
    Emails
    \r\n this.props.updateEmailBlackout(this.sanitizeInput(e.target.valueAsNumber), this.state.blackoutEmailDaysSelected)}\r\n min={0}\r\n >\r\n \r\n
    \r\n
    \r\n
    SMS
    \r\n\r\n this.props.updateSMSBlackout(this.sanitizeInput(e.target.valueAsNumber), this.state.blackoutSMSDaysSelected)}\r\n min={0}\r\n >\r\n \r\n
    \r\n
    \r\n
    Teams
    \r\n\r\n this.props.updateTeamsBlackout(this.sanitizeInput(e.target.valueAsNumber), this.state.blackoutTeamsDaysSelected)}\r\n min={0}\r\n >\r\n \r\n
    \r\n
    \r\n
    Mobile
    \r\n\r\n this.props.updateMobileBlackout(this.sanitizeInput(e.target.valueAsNumber), this.state.blackoutMobileDaysSelected)}\r\n min={0}\r\n >\r\n \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n Mass Messaging (Blasts)\r\n

    Disabling blasts and/or mass invites will hide and deactivate the mass messaging feature of the respective channel or invitation.

    \r\n
    \r\n
    \r\n \r\n {this.props.notificationSettings.settings.massSMSAttempt?.toggle ? : }\r\n
    \r\n
    \r\n \r\n {this.props.notificationSettings.settings.consentInviteSMSAttempt?.toggle ? : }\r\n
    \r\n\r\n \r\n
    \r\n\r\n
    \r\n Default Reminder periods \r\n

    If reminders are turned on, this will be the default period it will follow. You can change this under each setting under Posts, Documents, or Events Notifications/Reminders.

    \r\n\r\n
    \r\n
    Reminder period for Posts
    \r\n \r\n { this.setState({postReminderNum: this.sanitizeInput(e.target.valueAsNumber)}); \r\n this.props.updatePostsReminders(this.sanitizeInput(e.target.valueAsNumber), this.state.reminderPostsDaysSelected)}}\r\n value = {this.state.postReminderNum}\r\n min = {0}\r\n >\r\n {this.setState({eventReminderNum: this.sanitizeInput(e.target.valueAsNumber)}); \r\n this.props.updateEventsReminders(this.sanitizeInput(e.target.valueAsNumber), this.state.reminderEventsDaysSelected)}}\r\n value={this.state.eventReminderNum}\r\n min = {0}\r\n >\r\n toggleBlackoutPeriod(teamsEvent, mobileEvent, emailEvent, smsEvent, !blackoutApplied)}>\r\n \r\n \r\n
    \r\n \r\n
    \r\n {\r\n enableAllChannels(teamsEvent, mobileEvent, emailEvent, smsEvent)\r\n setSelectedChannelsChecked(true)\r\n }}/>\r\n \r\n
    \r\n\r\n
    \r\n {setSelectedChannelsChecked(false)}}/>\r\n
    \r\n\r\n { (!allSelected || !allChannelsChecked) &&\r\n
    \r\n
    \r\n updateCheckboxes(teamsEvent, \"teams\", !settings[teamsEvent].toggle)}>\r\n \r\n
    \r\n
    \r\n updateCheckboxes(mobileEvent, \"mobile\", !settings[mobileEvent].toggle)}>\r\n \r\n
    \r\n
    \r\n updateCheckboxes(emailEvent, \"email\", !settings[emailEvent].toggle)}>\r\n \r\n
    \r\n
    \r\n updateCheckboxes(smsEvent, \"sms\", !settings[smsEvent].toggle)}>\r\n \r\n
    \r\n
    \r\n }\r\n
    \r\n
    \r\n }\r\n \r\n )\r\n\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n eventsWithBlackout: state.settings.applyBlackoutPeriodsTo,\r\n }),\r\n {\r\n toggleBlackoutPeriod: actions.ApplyBlackoutPeriod,\r\n enableAllChannels: actions.EnableAllChannels,\r\n setSelectedChannel: actions.EnableSelectedChannel,\r\n toggleNotificationEvent: actions.toggleEvent\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(SettingsToggleWithBlackout));","import React from 'react';\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport ToggleSwitch from 'modules/common/components/toggleSwitch';\r\nimport { actions } from '../..';\r\n\r\ninterface ComponentProps {\r\n title: string;\r\n eventOne: string;\r\n eventTwo: string;\r\n description?: string;\r\n value?: any;\r\n handleOnClick?: () => any;\r\n}\r\n\r\nconst SettingsToggleOnlyDouble: React.FC = ({title, eventOne, eventTwo, description, value, notificationSettings, toggleChannel, handleOnClick}) => {\r\n const eitherChecked = notificationSettings.settings[eventOne].toggle || notificationSettings.settings[eventTwo].toggle;\r\n var toggle = eitherChecked;\r\n return (\r\n\r\n
    \r\n
    \r\n
    {title}\r\n \r\n updateBothValues(eventOne, eventTwo)}\r\n />\r\n \r\n
    \r\n
    \r\n\r\n { description && toggle && renderDescription(!!handleOnClick) }\r\n
    \r\n )\r\n\r\n function renderDescription(withHyperLink: boolean) : JSX.Element {\r\n return
    \r\n {description}\r\n {withHyperLink && openMoreHyperlink()}\r\n
    \r\n }\r\n\r\n function openMoreHyperlink() : JSX.Element {\r\n return Open More Notification Settings;\r\n } \r\n\r\n function updateBothValues(eventOne, eventTwo)\r\n {\r\n toggle = !toggle;\r\n if(toggle)\r\n {\r\n toggleChannel(eventOne, true);\r\n toggleChannel(eventTwo, true);\r\n }\r\n else\r\n {\r\n toggleChannel(eventOne, false);\r\n toggleChannel(eventTwo, false);\r\n }\r\n }\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n }),\r\n {\r\n toggleChannel: actions.EnableSelectedChannel\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(SettingsToggleOnlyDouble));\r\n","import React from 'react';\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport {actions} from '../..'\r\nimport SettingsToggleOnlyDouble from './settingsToggleOnlyDouble'\r\n\r\ninterface ComponentProps {\r\n title: string;\r\n eventOne: string;\r\n eventTwo: string;\r\n description?: string;\r\n id?: string;\r\n andPrompt: string;\r\n eventOnePrompt: string;\r\n eventTwoPrompt: string;\r\n handleOnClick?: () => any;\r\n}\r\n\r\nconst SettingsToggleOrAnd: React.FC = ({title, eventOne, eventTwo, description, andPrompt, eventOnePrompt, eventTwoPrompt, toggleNotificationEvent, notificationSettings, toggleBlackoutPeriod, enableAllChannels, setSelectedChannel, eventsWithBlackout, id, handleOnClick}) => {\r\n\r\n const settings = notificationSettings.settings;\r\n const anyChannelChecked = settings[eventOne].toggle || settings[eventTwo].toggle;\r\n const blackoutApplied = eventsWithBlackout.includes(eventOne) || eventsWithBlackout.includes(eventTwo);\r\n const type = (id ?? \"\");\r\n\r\n const bothChecked = settings[eventOne].toggle && settings[eventTwo].toggle;\r\n const topChecked = settings[eventOne].toggle && !settings[eventTwo].toggle;\r\n const botChecked = !settings[eventOne].toggle && settings[eventTwo].toggle;\r\n\r\n return (\r\n
    \r\n \r\n\r\n {anyChannelChecked ?\r\n
    \r\n
    \r\n toggleBlackoutPeriod(eventOne, eventTwo, \"\", \"\", !blackoutApplied)}>\r\n \r\n
    \r\n
    \r\n
    \r\n {setSelectedChannel(eventOne, true); setSelectedChannel(eventTwo, true)}}>\r\n \r\n
    \r\n
    \r\n {setSelectedChannel(eventOne, true); setSelectedChannel(eventTwo, false)}}>\r\n \r\n
    \r\n
    \r\n {setSelectedChannel(eventTwo, true); setSelectedChannel(eventOne, false)}}>\r\n \r\n
    \r\n
    \r\n
    \r\n : }\r\n
    \r\n )\r\n}\r\n\r\n\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n eventsWithBlackout: state.settings.applyBlackoutPeriodsTo,\r\n }),\r\n {\r\n toggleBlackoutPeriod: actions.ApplyBlackoutPeriod,\r\n enableAllChannels: actions.EnableAllChannels,\r\n setSelectedChannel: actions.EnableSelectedChannel,\r\n toggleNotificationEvent: actions.toggleEvent\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(SettingsToggleOrAnd));\r\n","import * as React from 'react';\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport ToggleSwitch from 'modules/common/components/toggleSwitch';\r\nimport {actions} from '..'\r\n\r\ninterface ComponentProps { \r\n onPublishName: string\r\n teamsEvent: string;\r\n mobileEvent: string;\r\n emailEvent: string;\r\n smsEvent: string;\r\n}\r\n\r\ninterface ComponentState {\r\n}\r\n\r\nclass AuthoringSettings extends React.Component {\r\n public render() {\r\n const emailDisabled = this.props.notificationSettings[this.props.onPublishName].emailOnPublish === 'none';\r\n const smsDisabled = this.props.notificationSettings[this.props.onPublishName].smsOnPublish === 'none';\r\n const teamsDisabled = this.props.notificationSettings[this.props.onPublishName].teamsOnPublish === 'none';\r\n const mobileDisabled = this.props.notificationSettings[this.props.onPublishName].mobileOnPublish === 'none';\r\n\r\n const settings = this.props.notificationSettings.settings;\r\n \r\n\r\n return(\r\n
    \r\n
    \r\n

    Edit Authoring Default Settings

    \r\n The following details will be the default notification setting for each time a notification is created and/or published.\r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n Notify Upon Publishing\r\n this.toggleAll(emailDisabled, smsDisabled, teamsDisabled, mobileDisabled)}\r\n value={!(emailDisabled && smsDisabled && teamsDisabled && mobileDisabled)}\r\n />\r\n
    \r\n Upon publishing a notification, employees will be notified through the following channels:\r\n\r\n
    \r\n
    \r\n \r\n MS Teams Chatbot\r\n
    \r\n\r\n
    \r\n \r\n Mobile App\r\n
    \r\n\r\n
    \r\n \r\n Email\r\n
    \r\n
    \r\n
    \r\n this.props.setOnPublish(this.props.onPublishName, \"emailOnPublish\", 'fallback')}\r\n disabled={emailDisabled || !settings[this.props.emailEvent].toggle}\r\n />\r\n Send email only if standard app notifications are not set up for the topic subscriber\r\n
    \r\n
    \r\n this.props.setOnPublish(this.props.onPublishName, \"emailOnPublish\", 'subscribers')}\r\n disabled={emailDisabled || !settings[this.props.emailEvent].toggle}\r\n />\r\n Send to all topic subscribers\r\n
    \r\n
    \r\n\r\n
    \r\n \r\n SMS\r\n
    \r\n
    \r\n
    \r\n this.props.setOnPublish(this.props.onPublishName, \"smsOnPublish\", 'fallback')}\r\n disabled={smsDisabled || !settings[this.props.smsEvent].toggle}\r\n />\r\n Send email only if standard app notifications or email are not set up for the topic subscriber\r\n
    \r\n
    \r\n this.props.setOnPublish(this.props.onPublishName, \"smsOnPublish\", 'subscribers')}\r\n disabled={smsDisabled || !settings[this.props.smsEvent].toggle}\r\n />\r\n Send to all topic subscribers\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private toggleAuthoring = (event) => {\r\n let valueToChange;\r\n if(!event.target.checked) {\r\n valueToChange = 'none'\r\n }\r\n else {\r\n valueToChange = 'subscribers'\r\n }\r\n this.props.setOnPublish(this.props.onPublishName, event.target.name, valueToChange);\r\n }\r\n\r\n private toggleAll = (emailOff:boolean, smsOff:boolean, teamsOff:boolean, mobileOff:boolean) => {\r\n if(emailOff && smsOff && teamsOff && mobileOff)\r\n {\r\n this.props.setAllOnPublish(this.props.onPublishName, 'subscribers')\r\n }\r\n else\r\n {\r\n this.props.setAllOnPublish(this.props.onPublishName, 'none')\r\n }\r\n }\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n }),\r\n {\r\n setOnPublish: actions.SetOnPublish,\r\n setAllOnPublish: actions.SetAllOnPublish\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(AuthoringSettings));\r\n","import React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\n\r\ninterface ComponentProps { \r\n returnTranslatedContent: (content, platform, event) => any;\r\n maxTextLength?: number;\r\n disabled?: boolean;\r\n placeholder?: string;\r\n prompt: string;\r\n toLoad?: any;\r\n event: string;\r\n platform: string;\r\n}\r\n\r\ninterface ComponentState {\r\n defaultLCID: string;\r\n selectedLCID: string;\r\n}\r\n\r\n\r\nclass SingleTextAreaInput extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n defaultLCID: this.props.tenantSettings.defaultLCID,\r\n selectedLCID: this.props.tenantSettings.defaultLCID,\r\n }\r\n }\r\n\r\n public componentDidMount() {\r\n this.selectLanguage(this.props.tenantSettings.defaultLCID);\r\n }\r\n\r\n public componentDidUpdate() {\r\n var toMap;\r\n if(this.props.platform === 'sms')\r\n {\r\n toMap = this.props.notificationSettings.settings[this.props.event].translatedBody;\r\n }\r\n else if(this.props.platform === 'email')\r\n {\r\n toMap = this.props.notificationSettings.settings[this.props.event].translatedSubject;\r\n }\r\n \r\n if(!Object.keys(toMap).includes(this.state.selectedLCID))\r\n {\r\n this.setState({selectedLCID: this.state.defaultLCID})\r\n }\r\n }\r\n\r\n public render() {\r\n const placeholder = this.props.placeholder ?? \"\";\r\n\r\n const lcidToLanguage = {};\r\n Object.keys(this.props.lcidMappings).forEach(k => lcidToLanguage[k] = this.props.lcidMappings[k].language)\r\n\r\n const availableLCID = Object.keys(this.props.lcid);\r\n const lcidButtons = availableLCID.map((lcid) => {\r\n return (\r\n this.selectLanguage(lcid)}\r\n className={`lcid-options-dropdown`}>\r\n {lcidToLanguage[lcid]} ({lcid})\r\n \r\n )\r\n })\r\n\r\n var toMap;\r\n if(this.props.platform === 'sms')\r\n {\r\n toMap = this.props.notificationSettings.settings[this.props.event].translatedBody;\r\n }\r\n else if(this.props.platform === 'email')\r\n {\r\n toMap = this.props.notificationSettings.settings[this.props.event].translatedSubject;\r\n }\r\n\r\n const tabs = Object.keys(toMap).map((lcid) => {\r\n const active = (lcid === this.state.selectedLCID) ? \"active\" : \"\"\r\n return (\r\n this.selectLanguageTab(lcid)}\r\n className={`text-area-lcid-tab ${active}`}>\r\n\r\n {lcidToLanguage[lcid]} ({lcid}) \r\n {lcid !== this.state.defaultLCID ?\r\n {\r\n e.stopPropagation()\r\n this.removeLcid(lcid)}}\r\n >delete\r\n : null\r\n }\r\n \r\n )\r\n })\r\n\r\n return (\r\n\r\n \r\n
    \r\n {tabs}\r\n
    \r\n \r\n
    \r\n {lcidButtons}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {this.props.prompt}\r\n \r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n\r\n private removeLcid = (lcid: string) => {\r\n var newState;\r\n\r\n if(this.props.platform === 'sms')\r\n {\r\n newState = this.props.notificationSettings.settings[this.props.event].translatedBody;\r\n }\r\n else if(this.props.platform === 'email')\r\n {\r\n newState = this.props.notificationSettings.settings[this.props.event].translatedSubject;\r\n }\r\n\r\n delete newState[lcid];\r\n\r\n this.setState({selectedLCID: this.props.tenantSettings.defaultLCID}, () =>\r\n this.props.returnTranslatedContent(newState, this.props.platform, this.props.event))\r\n \r\n }\r\n\r\n private selectLanguageTab = (lcid: string) => {\r\n this.setState({\r\n ...this.state,\r\n selectedLCID: lcid,\r\n })\r\n }\r\n\r\n private selectLanguage = (lcid: string) => {\r\n var newState;\r\n if(this.props.platform === 'sms')\r\n {\r\n newState = this.props.notificationSettings.settings[this.props.event].translatedBody;\r\n }\r\n else if(this.props.platform === 'email')\r\n {\r\n newState = this.props.notificationSettings.settings[this.props.event].translatedSubject;\r\n }\r\n\r\n if (!Object.keys(newState).includes(lcid)) {\r\n newState[lcid] = \"\";\r\n this.props.returnTranslatedContent(newState, this.props.platform, this.props.event);\r\n this.selectLanguageTab(lcid)\r\n } else {\r\n this.selectLanguageTab(lcid)\r\n }\r\n }\r\n\r\n private handleTextArea = (e: React.ChangeEvent) => {\r\n var toReturn\r\n if(this.props.platform === 'sms')\r\n {\r\n toReturn = this.props.notificationSettings.settings[this.props.event].translatedBody;\r\n }\r\n else if(this.props.platform === 'email')\r\n {\r\n toReturn = this.props.notificationSettings.settings[this.props.event].translatedSubject;\r\n }\r\n\r\n toReturn[this.state.selectedLCID] = e.target.value;\r\n this.props.returnTranslatedContent(toReturn, this.props.platform, this.props.event);\r\n }\r\n}\r\n\r\n\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantSettings: state.settings.tenantSettings,\r\n lcidMappings: state.resources.lcidMappings,\r\n lcid: state.settings.tenantSettings.translatedContent,\r\n notificationSettings: state.settings.notificationSettings,\r\n }),\r\n {\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(SingleTextAreaInput));\r\n\r\n","import * as React from 'react';\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n \r\ninterface ComponentProps { \r\n returnTranslatedContent: (any) => any;\r\n maxTextLength?: number;\r\n disabled?: boolean;\r\n placeholderTop?: string;\r\n placeholderBot?: string;\r\n event: string;\r\n}\r\n\r\ninterface ComponentState {\r\n defaultLCID: string;\r\n selectedLCID: string;\r\n}\r\n\r\nclass MobileTextAreaInput extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n defaultLCID: this.props.tenantSettings.defaultLCID,\r\n selectedLCID: this.props.tenantSettings.defaultLCID,\r\n }\r\n }\r\n \r\n public componentDidMount() {\r\n this.selectLanguage(this.props.tenantSettings.defaultLCID);\r\n }\r\n\r\n public componentDidUpdate() {\r\n var toMap = this.props.notificationSettings.settings[this.props.event].translatedContent;\r\n\r\n if(!Object.keys(toMap).includes(this.state.selectedLCID))\r\n {\r\n this.setState({selectedLCID: this.state.defaultLCID})\r\n }\r\n }\r\n \r\n public render() {\r\n const placeholderTop = this.props.placeholderTop ?? \"\";\r\n const placeholderBot = this.props.placeholderBot ?? \"\";\r\n \r\n const lcidToLanguage = {};\r\n Object.keys(this.props.lcidMappings).forEach(k => lcidToLanguage[k] = this.props.lcidMappings[k].language)\r\n\r\n const availableLCID = Object.keys(this.props.lcid);\r\n const lcidButtons = availableLCID.map((lcid) => {\r\n return (\r\n this.selectLanguage(lcid)}\r\n className={`lcid-options-dropdown`}>\r\n {lcidToLanguage[lcid]} ({lcid})\r\n \r\n )\r\n })\r\n\r\n const toMap = this.props.notificationSettings.settings[this.props.event].translatedContent;\r\n\r\n const tabs = Object.keys(toMap).map((lcid) => {\r\n const active = (lcid === this.state.selectedLCID) ? \"active\" : \"\"\r\n return (\r\n this.selectLanguageTab(lcid)}\r\n className={`text-area-lcid-tab ${active}`}>\r\n\r\n {lcidToLanguage[lcid]} ({lcid}) \r\n {lcid !== this.state.defaultLCID ?\r\n {\r\n e.stopPropagation()\r\n this.removeLcid(lcid)}}\r\n >delete\r\n : null\r\n }\r\n \r\n )\r\n })\r\n return (\r\n\r\n \r\n
    \r\n {tabs}\r\n
    \r\n \r\n
    \r\n {lcidButtons}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n Title\r\n this.handleTextArea(e, \"top\")}\r\n maxLength={this.props.maxTextLength}\r\n disabled={this.props.disabled}\r\n placeholder={placeholderTop}>\r\n \r\n
    \r\n
    \r\n Description\r\n this.handleTextArea(e, \"bot\")}\r\n maxLength={this.props.maxTextLength}\r\n disabled={this.props.disabled}\r\n placeholder={placeholderBot}>\r\n \r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n\r\n private removeLcid = (lcid: string) => {\r\n var newState = this.props.notificationSettings.settings[this.props.event].translatedContent;\r\n\r\n delete newState[lcid];\r\n this.setState({selectedLCID: this.props.tenantSettings.defaultLCID})\r\n this.props.returnTranslatedContent(newState)\r\n }\r\n\r\n private selectLanguageTab = (lcid: string) => {\r\n this.setState({\r\n ...this.state,\r\n selectedLCID: lcid,\r\n })\r\n }\r\n\r\n private selectLanguage = (lcid: string) => {\r\n var newState = this.props.notificationSettings.settings[this.props.event].translatedContent;\r\n if (!Object.keys(newState).includes(lcid)){\r\n newState[lcid] = {\r\n m_Item1: \"\",\r\n m_Item2: \"\"\r\n };\r\n this.props.returnTranslatedContent(newState);\r\n this.selectLanguageTab(lcid);\r\n } else {\r\n this.selectLanguageTab(lcid);\r\n }\r\n }\r\n\r\n public handleTextArea = (e: any, location: string) => {\r\n let toEdit;\r\n let otherItem;\r\n switch(location) {\r\n case \"top\":\r\n toEdit = \"m_Item1\"\r\n otherItem = \"m_Item2\"\r\n break;\r\n \r\n case \"bot\":\r\n toEdit = \"m_Item2\"\r\n otherItem = \"m_Item1\"\r\n break;\r\n\r\n default:\r\n console.log(\"Critical error, called function with invalid values. Defaulting to top.\")\r\n toEdit = \"m_Item1\"\r\n otherItem = \"m_Item2\"\r\n break;\r\n }\r\n\r\n const clone = this.props.notificationSettings.settings[this.props.event].translatedContent;\r\n clone[this.state.selectedLCID][toEdit] = e.target.value\r\n clone[this.state.selectedLCID][otherItem] = clone[this.state.selectedLCID][otherItem] ?? \"\"\r\n\r\n this.props.returnTranslatedContent(clone);\r\n }\r\n}\r\n \r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n tenantSettings: state.settings.tenantSettings,\r\n lcidMappings: state.resources.lcidMappings,\r\n lcid: state.settings.tenantSettings.translatedContent,\r\n }),\r\n {\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(MobileTextAreaInput));","import React from 'react';\r\nimport './textBubble.sass';\r\n\r\nexport interface TextBubble {\r\n id: string;\r\n name: string;\r\n}\r\ninterface ComponentProps {\r\n removable?: boolean;\r\n removeFrom?: (any) => void;\r\n list: any[];\r\n}\r\nconst TextBubble: React.FC = ({list, removable, removeFrom}) => {\r\n\r\n const displayList = list.map((item) => {\r\n return (\r\n \r\n {removable ? \r\n {item.name} removeFrom!(item.id)} className=\"material-icons\">clear\r\n :\r\n {item.name}\r\n\r\n }\r\n \r\n )\r\n })\r\n\r\n return (\r\n
    \r\n {displayList} \r\n
    \r\n )\r\n}\r\n\r\nexport default TextBubble;","import * as React from 'react';\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport WarningIcon from '@mui/icons-material/Warning';\r\n\r\ninterface ComponentProps {\r\n platform: string\r\n}\r\n\r\nconst WarningLabel: React.FC = ({platform}) => {\r\n return (\r\n
    \r\n {platform} notifications are disabled. Content will be saved, but notification will not be sent.\r\n
    \r\n )\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n }),\r\n {\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(WarningLabel));","import * as React from 'react';\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { Tooltip } from '@mui/material';\r\nimport withStyles from '@mui/styles/withStyles';\r\nimport SingleTextAreaInput from './singleTextAreaInput'\r\nimport MobileTextAreaInput from './mobileTextAreaInput';\r\nimport TextBubble from 'modules/common/components/textBubble';\r\nimport WarningLabel from './warningLabel'\r\n\r\ninterface TextBubble {\r\n id: string;\r\n name: string;\r\n}\r\n\r\ninterface ComponentProps { \r\n emailSubjectUpdate: (any) => any,\r\n smsBodyUpdate: (any) => any,\r\n pushContentUpdate: (any) => any,\r\n emailBubbles: TextBubble[],\r\n smsBubbles: TextBubble[],\r\n mobileBubbles: TextBubble[],\r\n event: string\r\n}\r\n\r\ninterface ComponentState {\r\n}\r\n\r\nclass TripleNotificationOverride extends React.Component {\r\n public render() {\r\n const maxTextLength = 400;\r\n const subjectToEdit = this.props.event + \"EmailAttempt\"\r\n const bodyToEdit = this.props.event + \"SMSAttempt\"\r\n const contentToEdit = this.props.event + \"MobileAttempt\"\r\n const emailEventName = this.eventUppercase(subjectToEdit).toString()\r\n const smsEventName = this.eventUppercase(bodyToEdit).toString()\r\n const mobileEventName = this.eventUppercase(contentToEdit).toString()\r\n\r\n const LightTooltip = withStyles((theme) => ({\r\n tooltip: {\r\n backgroundColor: '#f5f5f9',\r\n color: 'rgba(0, 0, 0, 0.87)',\r\n boxShadow: theme.shadows[1],\r\n fontSize: \"12px\"\r\n }\r\n }))(Tooltip);\r\n\r\n return (\r\n
    \r\n

    {\"Edit Notification Contents\"}

    \r\n Change the content of your notifications. Use suggestions to personalize your content. \r\n \r\n Learn More.\r\n \r\n\r\n
    \r\n Email Notification: Subject\r\n
    \r\n\r\n {!(this.props.notificationSettings.settings[subjectToEdit].toggle) && \r\n \r\n }\r\n
    \r\n \r\n
    \r\n
    \r\n

    Suggestions:

    \r\n \r\n
    \r\n\r\n
    \r\n Mobile App Notification: Title & Description\r\n
    \r\n\r\n {!(this.props.notificationSettings.settings[contentToEdit].toggle) && \r\n \r\n }\r\n \r\n
    \r\n

    Suggestions:

    \r\n \r\n
    \r\n \r\n
    \r\n SMS Notification: Text Message\r\n
    \r\n\r\n {!(this.props.notificationSettings.settings[bodyToEdit].toggle) && \r\n \r\n }\r\n
    \r\n \r\n
    \r\n
    \r\n

    Suggestions:

    \r\n \r\n
    \r\n\r\n
    \r\n )\r\n }\r\n\r\n private eventUppercase = (eventToFix: string) => {\r\n if(eventToFix !== null && eventToFix.length > 2)\r\n return eventToFix[0].toUpperCase() + eventToFix.slice(1);\r\n else\r\n return \"Invalid string to fix.\"\r\n }\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n emailSubjects: state.resources.emailSubjectsResource,\r\n smsBodies: state.resources.smsBodiesResource,\r\n pushContents: state.resources.pushContentsResource\r\n }),\r\n {\r\n \r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(TripleNotificationOverride));","import * as React from 'react';\r\nimport './styles/notificationPopout.sass';\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { Drawer } from '@mui/material';\r\nimport IconButton from '@mui/material/IconButton';\r\nimport ArrowBack from '@mui/icons-material/ArrowBack';\r\nimport AuthoringSettings from './authoringSettings'\r\nimport TripleNotificationOverride from './tripleNotificationOverride'\r\nimport { actions } from '..';\r\n\r\ninterface TextBubble {\r\n id: string;\r\n name: string;\r\n}\r\n\r\ninterface ComponentProps {\r\n updateToggle: () => any\r\n eventPrompt: string\r\n event: string\r\n emailBubbles: TextBubble[],\r\n smsBubbles: TextBubble[],\r\n mobileBubbles: TextBubble[],\r\n publishName: string\r\n teamsEvent: string;\r\n mobileEvent: string;\r\n emailEvent: string;\r\n smsEvent: string;\r\n}\r\n\r\ninterface ComponentState {\r\n isOpen: boolean;\r\n activeSettingsTab: number;\r\n}\r\n\r\nclass RegularNotificationPopout extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n isOpen: true,\r\n activeSettingsTab: 0,\r\n }\r\n }\r\n\r\n itemDisplay = () => {\r\n enum options {\r\n \"Authoring Default Settings\" = 0,\r\n \"Notification Contents\" = 1,\r\n }\r\n let tabs = [\r\n {\r\n id: 0, name: \"Authoring Default Settings\", content: \r\n },\r\n {\r\n id: 1, name: \"Notification Contents\", content: \r\n },\r\n ];\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n \r\n \r\n {\"More \" + this.props.eventPrompt + \" Settings\"}\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
      \r\n {tabs.map((tab) => {\r\n return (\r\n
    • \r\n this.tabClicked(tab)}\r\n >\r\n {tab.name}\r\n \r\n
    • \r\n );\r\n })}\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n {this.state.activeSettingsTab === 0 && tabs[0].content}\r\n {this.state.activeSettingsTab === 1 && tabs[1].content}\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private toggleDrawer = (open) => (event) => {\r\n if (event.type === 'keydown' && (event.key === 'Tab' || event.key === 'Shift')) {\r\n return;\r\n }\r\n\r\n this.props.updateToggle();\r\n this.setState({ ...this.state, isOpen: open });\r\n }\r\n\r\n private tabClicked = (tab) => {\r\n this.setState({ ...this.state, activeSettingsTab: tab.id })\r\n };\r\n\r\n private updateEmailSubject = (translatedContent: any) => {\r\n const toChange = this.props.event + \"EmailAttempt\"\r\n this.props.setEmailSubject(toChange, translatedContent);\r\n }\r\n\r\n private updateSmsBody = (translatedContent: any) => {\r\n const toChange = this.props.event + \"SMSAttempt\"\r\n this.props.setSmsBody(toChange, translatedContent);\r\n }\r\n\r\n private updatePushContent = (translatedContent: any) => {\r\n const toChange = this.props.event + \"MobileAttempt\"\r\n this.props.setPushContent(toChange, translatedContent);\r\n }\r\n\r\n public render() {\r\n return (\r\n \r\n {this.itemDisplay()}\r\n\r\n \r\n );\r\n }\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n emailSubjects: state.resources.emailSubjectsResource,\r\n smsBodies: state.resources.smsBodiesResource,\r\n pushContents: state.resources.pushContentsResource\r\n }),\r\n {\r\n setEmailSubject: actions.SetEmailSubject,\r\n setSmsBody: actions.SetSMSBody,\r\n setPushContent: actions.SetMobileContent\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(RegularNotificationPopout));","import * as React from 'react';\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { actions } from '..';\r\nimport { Drawer, IconButton } from '@mui/material';\r\nimport withStyles from '@mui/styles/withStyles';\r\nimport ArrowBack from '@mui/icons-material/ArrowBack';\r\nimport MobileTextAreaInput from './mobileTextAreaInput';\r\nimport TextBubble from 'modules/common/components/textBubble';\r\nimport { Tooltip } from '@mui/material';\r\nimport WarningLabel from './warningLabel'\r\n\r\ninterface TextBubble {\r\n id: string;\r\n name: string;\r\n}\r\n\r\ninterface ComponentProps { \r\n updateToggle: () => any\r\n eventPrompt: string\r\n event: string\r\n bubbles: TextBubble[]\r\n}\r\n\r\ninterface ComponentState {\r\n isOpen: boolean;\r\n}\r\n\r\nclass MobileNotificationPopout extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n isOpen: true,\r\n }\r\n }\r\n\r\n itemDisplay = () => {\r\n const LightTooltip = withStyles((theme) => ({\r\n tooltip: {\r\n backgroundColor: '#f5f5f9',\r\n color: 'rgba(0, 0, 0, 0.87)',\r\n boxShadow: theme.shadows[1],\r\n fontSize: \"12px\"\r\n }\r\n }))(Tooltip);\r\n\r\n const eventToCheck = this.props.event + \"MobileAttempt\";\r\n \r\n return (\r\n
    \r\n
    \r\n \r\n \r\n \r\n {\"More \"+this.props.eventPrompt+\" Settings\"} \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n

    {\"Edit Notification Contents\"}

    \r\n Change the content of your notifications. Use suggestions to personalize your content. \r\n \r\n Learn More.\r\n \r\n\r\n
    \r\n Mobile App Notification: Title & Description\r\n
    \r\n\r\n {!(this.props.notificationSettings.settings[eventToCheck].toggle) && \r\n \r\n }\r\n\r\n \r\n\r\n
    \r\n

    Use suggestions to personalize:

    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private toggleDrawer = (open) => (event) => {\r\n if (event.type === 'keydown' && (event.key === 'Tab' || event.key === 'Shift')) {\r\n return;\r\n }\r\n \r\n this.props.updateToggle();\r\n this.setState({...this.state, isOpen: open});\r\n }\r\n\r\n private updatePushContent = (translatedContent: any) => {\r\n const toChange = this.props.event + \"MobileAttempt\"\r\n this.props.setPushContent(toChange, translatedContent);\r\n }\r\n\r\n private eventUppercase = (eventToFix: string) => {\r\n if(eventToFix !== null && eventToFix.length > 2)\r\n return eventToFix[0].toUpperCase() + eventToFix.slice(1);\r\n else\r\n return \"Invalid string to fix.\"\r\n }\r\n\r\n public render() { \r\n return (\r\n \r\n {this.itemDisplay()}\r\n\r\n \r\n );\r\n }\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n pushContents: state.resources.pushContentsResource\r\n }),\r\n {\r\n setPushContent: actions.SetMobileContent\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(MobileNotificationPopout));","import * as React from 'react';\r\nimport './styles/notificationPopout.sass';\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { Drawer } from '@mui/material';\r\nimport IconButton from '@mui/material/IconButton';\r\nimport ArrowBack from '@mui/icons-material/ArrowBack';\r\nimport TripleNotificationOverride from './tripleNotificationOverride'\r\nimport { actions } from '..';\r\nimport ReminderPopout from './reminderPopout'\r\n\r\ninterface TextBubble {\r\n id: string;\r\n name: string;\r\n}\r\n\r\ninterface ComponentProps { \r\n updateToggle: () => any\r\n eventPrompt: string\r\n event: string\r\n emailBubbles: TextBubble[],\r\n smsBubbles: TextBubble[],\r\n mobileBubbles: TextBubble[]\r\n reminderName: string\r\n}\r\n\r\ninterface ComponentState {\r\n isOpen: boolean;\r\n activeSettingsTab: number;\r\n}\r\n\r\nclass ReminderNotificationPopout extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n isOpen: true,\r\n activeSettingsTab: 0,\r\n }\r\n }\r\n\r\n itemDisplay = () => {\r\n enum options {\r\n \"Authoring Default Settings\" = 0,\r\n \"Reminder Contents\" = 1,\r\n }\r\n \r\n let tabs = [\r\n { \r\n id: 0, \r\n name: \"Authoring Default Settings\",\r\n content: \r\n \r\n },\r\n { \r\n id: 1, \r\n name: \"Reminder Contents\", \r\n content: \r\n \r\n },\r\n ];\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n \r\n \r\n {\"More \"+this.props.eventPrompt+\" Settings\"} \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
      \r\n {tabs.map((tab) => {\r\n return (\r\n
    • \r\n this.tabClicked(tab)}\r\n >\r\n {tab.name}\r\n \r\n
    • \r\n );\r\n })}\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n {this.state.activeSettingsTab === 0 && tabs[0].content}\r\n {this.state.activeSettingsTab === 1 && tabs[1].content}\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private toggleDrawer = (open) => (event) => {\r\n if (event.type === 'keydown' && (event.key === 'Tab' || event.key === 'Shift')) {\r\n return;\r\n }\r\n \r\n this.props.updateToggle();\r\n this.setState({...this.state, isOpen: open});\r\n }\r\n\r\n private tabClicked = (tab) => {\r\n this.setState({...this.state, activeSettingsTab: tab.id})\r\n };\r\n\r\n private updateEmailSubject = (translatedContent: any) => {\r\n const toChange = this.props.event + \"EmailAttempt\"\r\n this.props.setEmailSubject(toChange, translatedContent);\r\n }\r\n\r\n private updateSmsBody = (translatedContent: any) => {\r\n const toChange = this.props.event + \"SMSAttempt\"\r\n this.props.setSmsBody(toChange, translatedContent);\r\n }\r\n\r\n private updatePushContent = (translatedContent: any) => {\r\n const toChange = this.props.event + \"MobileAttempt\"\r\n this.props.setPushContent(toChange, translatedContent);\r\n }\r\n\r\n public render() { \r\n return (\r\n \r\n {this.itemDisplay()}\r\n\r\n \r\n );\r\n }\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n emailSubjects: state.resources.emailSubjectsResource,\r\n smsBodies: state.resources.smsBodiesResource,\r\n pushContents: state.resources.pushContentsResource\r\n }),\r\n {\r\n setEmailSubject: actions.SetEmailSubject,\r\n setSmsBody: actions.SetSMSBody,\r\n setPushContent: actions.SetMobileContent\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(ReminderNotificationPopout));","import * as React from 'react';\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { actions } from '..';\r\nimport { Drawer, IconButton } from '@mui/material';\r\nimport withStyles from '@mui/styles/withStyles';\r\nimport ArrowBack from '@mui/icons-material/ArrowBack';\r\nimport TextBubble from 'modules/common/components/textBubble';\r\nimport { Tooltip } from '@mui/material';\r\nimport WarningLabel from './warningLabel'\r\nimport SingleTextAreaInput from './singleTextAreaInput';\r\nimport { NotificationEvents } from 'modules/messaging';\r\n\r\ninterface TextBubble {\r\n id: string;\r\n name: string;\r\n}\r\n\r\ninterface ComponentProps { \r\n updateToggle: () => any\r\n eventPrompt: string\r\n event: string\r\n bubbles: TextBubble[]\r\n}\r\n\r\nconst EmailNotificationPopout: React.FunctionComponent = props => {\r\n const [isOpen, setIsOpen] = React.useState(true);\r\n\r\n const itemDisplay = () => {\r\n const LightTooltip = withStyles((theme) => ({\r\n tooltip: {\r\n backgroundColor: '#f5f5f9',\r\n color: 'rgba(0, 0, 0, 0.87)',\r\n boxShadow: theme.shadows[1],\r\n fontSize: \"12px\"\r\n }\r\n }))(Tooltip);\r\n\r\n const eventToCheck = props.event + \"EmailAttempt\";\r\n \r\n return (\r\n
    \r\n
    \r\n \r\n \r\n \r\n {\"More \"+props.eventPrompt+\" Settings\"} \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n

    {\"Edit Notification Contents\"}

    \r\n Change the content of your notifications. Use suggestions to personalize your content. \r\n \r\n Learn More.\r\n \r\n\r\n
    \r\n Email Notification: Subject\r\n
    \r\n\r\n {!(props.notificationSettings.settings[eventToCheck].toggle) && \r\n \r\n }\r\n\r\n \r\n\r\n
    \r\n

    Use suggestions to personalize:

    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n const toggleDrawer = (open) => (event) => {\r\n if (event.type === 'keydown' && (event.key === 'Tab' || event.key === 'Shift')) {\r\n return;\r\n }\r\n \r\n props.updateToggle();\r\n setIsOpen(open);\r\n }\r\n\r\n const updateSubject = (translatedContent: any) => {\r\n const toChange = props.event + \"EmailAttempt\"\r\n props.setEmailSubject(toChange, translatedContent);\r\n }\r\n\r\n const eventUppercase = (eventToFix: string) => {\r\n if(eventToFix !== null && eventToFix.length > 2)\r\n return eventToFix[0].toUpperCase() + eventToFix.slice(1);\r\n else\r\n return \"Invalid string to fix.\"\r\n }\r\n\r\n return (\r\n \r\n {itemDisplay()}\r\n\r\n \r\n );\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n emailSubjects: state.resources.emailSubjectsResource\r\n }),\r\n {\r\n setEmailSubject: actions.SetEmailSubject\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(EmailNotificationPopout));","/* Logic in the original settingsToggleWithBlackout.tsx was a little too hardwired to include SMS stuff. This way we can have an entirely separate component for when we only have 3 channels. */\r\n\r\nimport React, { useState } from 'react';\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport ToggleSwitch from 'modules/common/components/toggleSwitch';\r\nimport {actions} from '..'\r\n\r\ninterface ComponentProps {\r\n title: string; \r\n teamsEvent: string;\r\n mobileEvent: string;\r\n emailEvent: string;\r\n description?: string;\r\n id?: string;\r\n handleOnClick?: () => void;\r\n}\r\n\r\nconst SettingsToggleWithBlackoutNoSms: React.FC = \r\n ({\r\n title, \r\n teamsEvent, \r\n mobileEvent, \r\n emailEvent, \r\n description, \r\n notificationSettings, \r\n toggleBlackoutPeriod, \r\n enableAllChannels, \r\n setSelectedChannel, \r\n eventsWithBlackout, \r\n id, \r\n handleOnClick\r\n }) => {\r\n \r\n const settings = notificationSettings.settings!;\r\n const anyChannelChecked = settings[emailEvent].toggle || settings[teamsEvent].toggle || settings[mobileEvent].toggle;\r\n const blackoutApplied = eventsWithBlackout.includes(emailEvent) || eventsWithBlackout.includes(teamsEvent) || eventsWithBlackout.includes(mobileEvent);\r\n const allChannelsChecked = settings[emailEvent].toggle && settings[teamsEvent].toggle && settings[mobileEvent].toggle;\r\n const [allSelected, setSelectedChannelsChecked] = useState(allChannelsChecked);\r\n const eventId = (id ?? \"\");\r\n \r\n const updateCheckboxes = (event: string, platform: string, toSet: boolean) => {\r\n let emailStatus = platform === \"email\" ? toSet : settings[emailEvent].toggle;\r\n let teamsStatus = platform === \"teams\" ? toSet : settings[teamsEvent].toggle;\r\n let mobileStatus = platform === \"mobile\" ? toSet : settings[mobileEvent].toggle;\r\n \r\n if(!(emailStatus || teamsStatus || mobileStatus))\r\n {\r\n enableAllChannels(teamsEvent, mobileEvent, emailEvent, \"\")\r\n setSelectedChannelsChecked(true)\r\n }\r\n else\r\n {\r\n setSelectedChannel(event, toSet);\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n
    {title} \r\n \r\n {\r\n if(!anyChannelChecked) {\r\n setSelectedChannel(emailEvent, true);\r\n setSelectedChannel(mobileEvent, true);\r\n setSelectedChannel(teamsEvent, true);\r\n }\r\n else {\r\n setSelectedChannel(emailEvent, false);\r\n setSelectedChannel(mobileEvent, false);\r\n setSelectedChannel(teamsEvent, false);\r\n }\r\n }} \r\n />\r\n \r\n
    \r\n
    \r\n { anyChannelChecked &&\r\n
    \r\n
    {description} Open More Notification Settings
    \r\n \r\n
    \r\n
    \r\n toggleBlackoutPeriod(teamsEvent, mobileEvent, emailEvent, \"\", !blackoutApplied)}>\r\n \r\n \r\n
    \r\n \r\n
    \r\n {\r\n updateCheckboxes(emailEvent, \"email\", true);\r\n updateCheckboxes(mobileEvent, \"mobile\", true);\r\n updateCheckboxes(teamsEvent, \"teams\", true);\r\n\r\n setSelectedChannelsChecked(true);\r\n }}/>\r\n \r\n
    \r\n\r\n
    \r\n {setSelectedChannelsChecked(false)}}/>\r\n
    \r\n\r\n { (!allSelected || !allChannelsChecked) &&\r\n
    \r\n
    \r\n updateCheckboxes(teamsEvent, \"teams\", !settings[teamsEvent].toggle)}>\r\n \r\n
    \r\n
    \r\n updateCheckboxes(mobileEvent, \"mobile\", !settings[mobileEvent].toggle)}>\r\n \r\n
    \r\n
    \r\n updateCheckboxes(emailEvent, \"email\", !settings[emailEvent].toggle)}>\r\n \r\n
    \r\n
    \r\n }\r\n
    \r\n
    \r\n }\r\n
    \r\n )\r\n\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n eventsWithBlackout: state.settings.applyBlackoutPeriodsTo,\r\n }),\r\n {\r\n toggleBlackoutPeriod: actions.ApplyBlackoutPeriod,\r\n enableAllChannels: actions.EnableAllChannels,\r\n setSelectedChannel: actions.EnableSelectedChannel,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(SettingsToggleWithBlackoutNoSms));","import * as React from 'react';\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { actions } from '..';\r\nimport { Drawer, IconButton } from '@mui/material';\r\nimport withStyles from '@mui/styles/withStyles';\r\nimport ArrowBack from '@mui/icons-material/ArrowBack';\r\nimport MobileTextAreaInput from './mobileTextAreaInput';\r\nimport TextBubble from 'modules/common/components/textBubble';\r\nimport { Tooltip } from '@mui/material';\r\nimport WarningLabel from './warningLabel'\r\nimport SingleTextAreaInput from './singleTextAreaInput';\r\nimport { lcidMappings } from 'modules/resources';\r\n\r\ninterface TextBubble {\r\n id: string;\r\n name: string;\r\n}\r\n\r\ninterface ComponentProps { \r\n updateToggle: () => any\r\n eventPrompt: string\r\n event: string\r\n bubbles: TextBubble[]\r\n emailBubbles: TextBubble[]\r\n}\r\n\r\nconst MobileAndEmailNotificationPopout: React.FunctionComponent = (props) => {\r\n const [isOpen, setIsOpen] = React.useState(true);\r\n\r\n const itemDisplay = () => {\r\n const LightTooltip = withStyles((theme) => ({\r\n tooltip: {\r\n backgroundColor: '#f5f5f9',\r\n color: 'rgba(0, 0, 0, 0.87)',\r\n boxShadow: theme.shadows[1],\r\n fontSize: \"12px\"\r\n }\r\n }))(Tooltip);\r\n\r\n const eventToCheck = props.event + \"MobileAttempt\";\r\n const subjectToEdit = props.event + \"EmailAttempt\";\r\n const maxTextLength = 400;\r\n const emailEventName = eventUppercase(subjectToEdit).toString()\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n \r\n \r\n {\"More \"+props.eventPrompt+\" Settings\"} \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n

    {\"Edit Notification Contents\"}

    \r\n Change the content of your notifications. Use suggestions to personalize your content. \r\n \r\n Learn More.\r\n \r\n\r\n
    \r\n Email Notification: Subject\r\n
    \r\n\r\n {!(props.notificationSettings.settings[subjectToEdit].toggle) && \r\n \r\n }\r\n
    \r\n \r\n
    \r\n
    \r\n

    Suggestions:

    \r\n \r\n
    \r\n\r\n
    \r\n Mobile App Notification: Title & Description\r\n
    \r\n\r\n {!(props.notificationSettings.settings[eventToCheck].toggle) && \r\n \r\n }\r\n\r\n \r\n\r\n
    \r\n

    Use suggestions to personalize:

    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n const toggleDrawer = (open) => (event) => {\r\n if (event.type === 'keydown' && (event.key === 'Tab' || event.key === 'Shift')) {\r\n return;\r\n }\r\n \r\n props.updateToggle();\r\n setIsOpen(open);\r\n }\r\n\r\n const updatePushContent = (translatedContent: lcidMappings) => {\r\n const toChange = props.event + \"MobileAttempt\"\r\n props.setPushContent(toChange, translatedContent);\r\n }\r\n\r\n const updateEmailSubject = (translatedContent: lcidMappings) => {\r\n const toChange = props.event + \"EmailAttempt\"\r\n props.setEmailSubject(toChange, translatedContent);\r\n }\r\n\r\n const eventUppercase = (eventToFix: string) => {\r\n if(eventToFix !== null && eventToFix.length > 2)\r\n return eventToFix[0].toUpperCase() + eventToFix.slice(1);\r\n else\r\n return \"Invalid string to fix.\"\r\n }\r\n\r\n return (\r\n \r\n {itemDisplay()}\r\n\r\n \r\n );\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n pushContents: state.resources.pushContentsResource,\r\n emailSubjects: state.resources.emailSubjectsResource\r\n }),\r\n {\r\n setPushContent: actions.SetMobileContent,\r\n setEmailSubject: actions.SetEmailSubject\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(MobileAndEmailNotificationPopout));","import React from 'react';\r\nimport SettingsToggleWithBlackout from '../toggles/settingsToggleWithBlackout';\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { NotificationEvents } from 'modules/messaging';\r\nimport SettingsToggleOrAnd from '../toggles/settingsToggleOrAnd';\r\nimport RegularNotificationPopout from '../regularNotificationPopout';\r\nimport MobileNotificationPopout from '../mobileNotificationPopout';\r\nimport ReminderNotificationPopout from '../reminderNotificationPopout';\r\nimport EmailNotificationPopout from '../emailNotificationPopout';\r\nimport SettingsToggleWithBlackoutNoSms from '../settingsToggleWithBlackoutNoSms';\r\nimport MobileAndEmailNotificationPopout from '../mobileAndEmailNotificationPopout';\r\n\r\ninterface ComponentProps { }\r\ninterface ComponentState {\r\n postNotificationsEditingVisible: boolean;\r\n postCommentEditingVisible: boolean;\r\n postReminderEditingVisible: boolean;\r\n postMentionsEditingVisible: boolean;\r\n postCommentMentionsEditingVisible: boolean;\r\n commentFlaggedEditingVisible: boolean;\r\n}\r\n\r\nclass MessagingPostControls extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n postNotificationsEditingVisible: false,\r\n postCommentEditingVisible: false,\r\n postReminderEditingVisible: false,\r\n postMentionsEditingVisible: false,\r\n postCommentMentionsEditingVisible: false,\r\n commentFlaggedEditingVisible: false\r\n }\r\n }\r\n\r\n public render() {\r\n const postPublishedEmailBubbles = [\r\n {id: \"{{postTitle}}\", name: \"{{postTitle}}\"},\r\n ];\r\n\r\n const postPublishedMobileBubbles = [\r\n {id: \"{{postTitle}}\", name: \"{{postTitle}}\"},\r\n {id: \"{{postDescription}}\", name: \"{{postDescription}}\"},\r\n ];\r\n\r\n const postPublishedSMSBubbles = [\r\n {id: \"{{postTitle}}\", name: \"{{postTitle}}\"},\r\n {id: \"{{postDescription}}\", name: \"{{postDescription}}\"},\r\n {id: \"{{newLine}}\", name: \"{{newLine}}\"},\r\n {id: \"{{supportEmail}}\", name: \"{{supportEmail}}\"},\r\n {id: \"{{tenantName}}\", name: \"{{tenantName}}\"},\r\n ];\r\n\r\n const commentCreatedMobileBubbles = [\r\n {id: \"{{postTitle}}\", name: \"{{postTitle}}\"},\r\n {id: \"{{commentAuthor}}\", name: \"{{commentAuthor}}\"},\r\n {id: \"{{commentBody}}\", name: \"{{commentBody}}\"},\r\n ];\r\n\r\n const postMentionedMobileBubbles = [\r\n {id: \"{{postTitle}}\", name: \"{{postTitle}}\"},\r\n {id: \"{{postAuthor}}\", name: \"{{postAuthor}}\"}\r\n ];\r\n\r\n const postReminderSMSBubbles = [\r\n {id: \"{{postTitle}}\", name: \"{{postTitle}}\"},\r\n {id: \"{{postLink}}\", name: \"{{postLink}}\"},\r\n {id: \"{{newLine}}\", name: \"{{newLine}}\"},\r\n {id: \"{{supportEmail}}\", name: \"{{supportEmail}}\"},\r\n {id: \"{{tenantName}}\", name: \"{{tenantName}}\"},\r\n ];\r\n\r\n const commentFlaggedEmailBubbles = [\r\n {id: \"{{postTitle}}\", name: \"{{postTitle}}\"},\r\n {id: \"{{tenantName}}\", name: \"{{tenantName}}\"},\r\n ];\r\n\r\n return (\r\n \r\n
    \r\n this.toggleWindow(\"postNotificationsEditingVisible\")}\r\n\r\n />\r\n
    \r\n\r\n
    \r\n this.toggleWindow(\"postReminderEditingVisible\")}\r\n />\r\n
    \r\n\r\n
    \r\n \r\n
    \r\n\r\n
    \r\n this.toggleWindow(\"postMentionsEditingVisible\")}\r\n />\r\n
    \r\n\r\n
    \r\n this.toggleWindow(\"postCommentEditingVisible\")}\r\n />\r\n
    \r\n\r\n
    \r\n this.toggleWindow(\"postCommentMentionsEditingVisible\")}\r\n />\r\n
    \r\n\r\n
    \r\n this.toggleWindow(\"commentFlaggedEditingVisible\")}\r\n />\r\n
    \r\n\r\n {this.state.postNotificationsEditingVisible &&\r\n this.toggleWindow(\"postNotificationsEditingVisible\")}\r\n event={\"postPublished\"}\r\n eventPrompt={\"Post Published\"}\r\n emailBubbles={postPublishedEmailBubbles}\r\n smsBubbles={postPublishedSMSBubbles}\r\n mobileBubbles={postPublishedMobileBubbles}\r\n publishName={\"defaultPostSettings\"}\r\n teamsEvent={NotificationEvents.PostPublishedTeams}\r\n mobileEvent={NotificationEvents.PostPublishedMobile}\r\n emailEvent={NotificationEvents.PostPublishedEmail}\r\n smsEvent={NotificationEvents.PostPublishedSMS}\r\n />\r\n }\r\n\r\n {this.state.postCommentEditingVisible &&\r\n this.toggleWindow(\"postCommentEditingVisible\")}\r\n event={\"postCommentCreated\"}\r\n eventPrompt={\"Comment Created\"}\r\n bubbles={commentCreatedMobileBubbles}\r\n />\r\n }\r\n\r\n {this.state.postReminderEditingVisible &&\r\n this.toggleWindow(\"postReminderEditingVisible\")}\r\n event={\"postReminder\"}\r\n eventPrompt={\"Post Reminder\"}\r\n emailBubbles={postPublishedEmailBubbles}\r\n smsBubbles={postReminderSMSBubbles}\r\n mobileBubbles={postPublishedMobileBubbles}\r\n reminderName={\"defaultPost\"}\r\n />\r\n }\r\n\r\n {this.state.postMentionsEditingVisible &&\r\n this.toggleWindow(\"postMentionsEditingVisible\")}\r\n event={\"postMentioned\"}\r\n eventPrompt={\"Post Mentioned\"}\r\n bubbles={postMentionedMobileBubbles}\r\n />\r\n }\r\n\r\n {this.state.postCommentMentionsEditingVisible &&\r\n this.toggleWindow(\"postCommentMentionsEditingVisible\")}\r\n event={\"userMentioned\"}\r\n eventPrompt={\"User Mentioned\"}\r\n bubbles={commentCreatedMobileBubbles}\r\n emailBubbles={commentCreatedMobileBubbles}\r\n />\r\n }\r\n\r\n {this.state.commentFlaggedEditingVisible && \r\n this.toggleWindow(\"commentFlaggedEditingVisible\")}\r\n event={\"commentFlagged\"}\r\n eventPrompt={\"Comment Flagged\"}\r\n bubbles={commentFlaggedEmailBubbles}\r\n />\r\n }\r\n \r\n
    \r\n )\r\n };\r\n\r\n private toggleWindow = (windowName) => {\r\n let flippedVal = !(this.state[windowName])\r\n this.setState({...this.state, [windowName]: flippedVal})\r\n };\r\n}\r\n\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n }),\r\n {\r\n\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(MessagingPostControls));\r\n","import React from 'react';\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport SettingsToggleWithBlackout from '../toggles/settingsToggleWithBlackout';\r\nimport SettingsToggleOnly from '../toggles/settingsToggleOnly'\r\nimport { NotificationEvents } from 'modules/messaging';\r\nimport TextBubble from 'modules/common/components/textBubble';\r\nimport { lcidMappings } from 'modules/resources/models';\r\nimport { actions } from '../..';\r\nimport SingleTextAreaInput from '../singleTextAreaInput';\r\nimport RegularNotificationPopout from '../regularNotificationPopout'\r\nimport ReminderNotificationPopout from '../reminderNotificationPopout';\r\nimport SettingsToggleOrAnd from '../toggles/settingsToggleOrAnd';\r\nimport MobileNotificationPopout from '../mobileNotificationPopout';\r\n\r\ninterface ComponentProps { }\r\ninterface ComponentState { \r\n translatedContent: lcidMappings,\r\n eventNotificationsEditingVisible: boolean\r\n eventRemindersEditingVisible: boolean\r\n eventMentionEditingVisible: boolean\r\n}\r\ninterface TextBubble {\r\n id: string;\r\n name: string;\r\n}\r\n\r\nclass MessagingEventControls extends React.Component {\r\n\r\n constructor(props) {\r\n super(props)\r\n this.state = {\r\n translatedContent: { },\r\n eventNotificationsEditingVisible: false,\r\n eventRemindersEditingVisible: false,\r\n eventMentionEditingVisible: false,\r\n }\r\n }\r\n\r\n public render() {\r\n const maxTextLength = 160;\r\n\r\n const textSuggestions = [\r\n {id: \"{{eventTitle}}\", name: \"{{eventTitle}}\"},\r\n ] as TextBubble[];\r\n\r\n const eventPublishedSMSBubbles = [\r\n {id: \"{{eventTitle}}\", name: \"{{eventTitle}}\"},\r\n {id: \"{{eventDescription}}\", name: \"{{eventDescription}}\"},\r\n {id: \"{{newLine}}\", name: \"{{newLine}}\"},\r\n {id: \"{{supportEmail}}\", name: \"{{supportEmail}}\"},\r\n {id: \"{{tenantName}}\", name: \"{{tenantName}}\"},\r\n ]\r\n\r\n const eventPublishedMobileBubbles = [\r\n {id: \"{{eventTitle}}\", name: \"{{eventTitle}}\"},\r\n {id: \"{{eventDescription}}\", name: \"{{eventDescription}}\"},\r\n {id: \"{{newLine}}\", name: \"{{newLine}}\"},\r\n ]\r\n\r\n const eventReminderSMSBubbles = [\r\n {id: \"{{eventTitle}}\", name: \"{{eventTitle}}\"},\r\n {id: \"{{eventLink}}\", name: \"{{eventLink}}\"},\r\n {id: \"{{newLine}}\", name: \"{{newLine}}\"},\r\n {id: \"{{supportEmail}}\", name: \"{{supportEmail}}\"},\r\n {id: \"{{tenantName}}\", name: \"{{tenantName}}\"},\r\n ]\r\n\r\n const eventMentionMobileBubbles = [\r\n {id: \"{{eventTitle}}\", name: \"{{eventTitle}}\"},\r\n {id: \"{{eventAuthor}}\", name: \"{{eventAuthor}}\"},\r\n ]\r\n\r\n return (\r\n \r\n
    \r\n this.toggleWindow(\"eventNotificationsEditingVisible\")}\r\n /> \r\n
    \r\n\r\n
    \r\n this.toggleWindow(\"eventRemindersEditingVisible\")}\r\n /> \r\n
    \r\n\r\n
    \r\n \r\n
    \r\n\r\n
    \r\n this.toggleWindow(\"eventMentionEditingVisible\")}\r\n />\r\n
    \r\n\r\n
    \r\n \r\n\r\n { this.props.notificationSettings.settings[NotificationEvents.EventRespondedEmail].toggle &&\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n

    Use suggestions to personalize:

    \r\n \r\n
    \r\n
    \r\n }\r\n
    \r\n \r\n
    \r\n \r\n\r\n {this.props.notificationSettings.settings[NotificationEvents.EventUpdatedEmail].toggle &&\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n

    Use suggestions to personalize:

    \r\n \r\n
    \r\n
    }\r\n
    \r\n\r\n
    \r\n \r\n\r\n {this.props.notificationSettings.settings[NotificationEvents.EventCancelledEmail].toggle && \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n

    Use suggestions to personalize:

    \r\n \r\n
    \r\n
    }\r\n
    \r\n\r\n {this.state.eventNotificationsEditingVisible &&\r\n this.toggleWindow(\"eventNotificationsEditingVisible\")}\r\n event={\"eventPublished\"}\r\n eventPrompt={\"Event Published\"}\r\n emailBubbles={textSuggestions}\r\n smsBubbles={eventPublishedSMSBubbles}\r\n mobileBubbles={eventPublishedMobileBubbles}\r\n publishName={\"defaultEventSettings\"}\r\n emailEvent={NotificationEvents.EventPublishedEmail}\r\n smsEvent={NotificationEvents.EventPublishedSMS}\r\n teamsEvent={NotificationEvents.EventPublishedTeams}\r\n mobileEvent={NotificationEvents.EventPublishedMobile}\r\n />\r\n }\r\n\r\n {this.state.eventRemindersEditingVisible &&\r\n this.toggleWindow(\"eventRemindersEditingVisible\")}\r\n event={\"eventReminder\"}\r\n eventPrompt={\"Event Reminder\"}\r\n emailBubbles={textSuggestions}\r\n smsBubbles={eventReminderSMSBubbles}\r\n mobileBubbles={eventPublishedSMSBubbles}\r\n reminderName={\"defaultEvent\"}\r\n />\r\n }\r\n\r\n {this.state.eventMentionEditingVisible && \r\n this.toggleWindow(\"eventMentionEditingVisible\")}\r\n event={\"eventMentioned\"}\r\n eventPrompt={\"Event Mentioned\"}\r\n bubbles={eventMentionMobileBubbles}\r\n />\r\n } \r\n\r\n
    \r\n )\r\n }\r\n\r\n private getTranslatedContent = (translatedContent: any, platform: string, event: NotificationEvents) => {\r\n switch(platform) {\r\n case 'email':\r\n this.props.setEmailSubject(event, translatedContent);\r\n break;\r\n\r\n default:\r\n console.log(\"unknown platform, error.\")\r\n break;\r\n }\r\n }\r\n\r\n private toggleWindow = (windowName) => {\r\n this.setState({...this.state, [windowName]: !this.state[windowName]})\r\n }\r\n\r\n private eventUppercase = (eventToFix: string) => {\r\n if(eventToFix !== null && eventToFix.length > 2)\r\n return eventToFix[0].toUpperCase() + eventToFix.slice(1);\r\n else\r\n return \"Invalid string to fix.\"\r\n }\r\n}\r\n\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n emailSubjects: state.resources.emailSubjectsResource,\r\n }),\r\n {\r\n setEmailSubject: actions.SetEmailSubject\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(MessagingEventControls));","import { NotificationEvents } from 'modules/messaging';\r\nimport React from 'react';\r\nimport SettingsToggleOnly from '../toggles/settingsToggleOnly'\r\nimport BlackoutToggleEvent from '../toggles/blackoutToggleEvent';\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { lcidMappings } from 'modules/resources/models';\r\nimport TextBubble from 'modules/common/components/textBubble';\r\nimport {actions} from '../..';\r\nimport SingleTextAreaInput from '../singleTextAreaInput';\r\n\r\ninterface ComponentProps { }\r\ninterface ComponentState {\r\n confirmationActive: boolean,\r\n profileActive: boolean,\r\n verifySMSActive: boolean,\r\n confirmationContent: lcidMappings,\r\n profileContent: lcidMappings,\r\n verifySMSContent: lcidMappings,\r\n }\r\n interface TextBubble {\r\n id: string;\r\n name: string;\r\n}\r\n\r\nclass MessagingGeneralControls extends React.Component {\r\n\r\n constructor(props) {\r\n super(props)\r\n this.state = {\r\n confirmationActive: false,\r\n profileActive: false,\r\n verifySMSActive: false,\r\n confirmationContent: { },\r\n profileContent: { },\r\n verifySMSContent: { },\r\n }\r\n }\r\n\r\n public render() {\r\n const confirmationActive = this.props.notificationSettings.settings[NotificationEvents.AccessGrantedEmail].toggle;\r\n const profileActive = this.props.notificationSettings.settings[NotificationEvents.UserProfileUpdatedEmail].toggle;\r\n const verifyActive = this.props.notificationSettings.settings[NotificationEvents.VerifySMSPhone].toggle;\r\n const maxTextLength = 400;\r\n\r\n const suggestionsForNonSMS = [\r\n {id: \"{{tenantName}}\", name: \"{{tenantName}}\"},\r\n {id: \"{{tenantApp}}\", name: \"{{tenantApp}}\"},\r\n ] as TextBubble[]\r\n\r\n const smsOptions = [\r\n {id: \"Reply YES to consent\", name: \"Reply YES to consent\"},\r\n {id: \"Reply NO to unsubscribe\", name: \"Reply NO to unsubscribe\"},\r\n {id: \"{{newLine}}\", name: \"{{newLine}}\"},\r\n {id: \"{{userPreferredName}}\", name: \"{{userPreferredName}}\"},\r\n {id: \"{{userFirstName}}\", name: \"{{userFirstName}}\"},\r\n {id: \"{{userLastName}}\", name: \"{{userLastName}}\"},\r\n {id: \"{{supportEmail}}\", name: \"{{supportEmail}}\"},\r\n {id: \"{{tenantName}}\", name: \"{{tenantName}}\"},\r\n ] as TextBubble[]\r\n\r\n return (\r\n \r\n
    \r\n \r\n\r\n {confirmationActive &&\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n

    Use suggestions to personalize:

    \r\n \r\n
    \r\n
    \r\n }\r\n
    \r\n\r\n
    \r\n \r\n\r\n {profileActive &&\r\n
    \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n

    Use suggestions to personalize:

    \r\n \r\n
    \r\n
    \r\n
    \r\n }\r\n
    \r\n\r\n
    \r\n \r\n\r\n {verifyActive &&\r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n

    Use suggestions to personalize:

    \r\n \r\n
    \r\n
    \r\n }\r\n
    \r\n \r\n
    \r\n )\r\n }\r\n\r\n private getTranslatedContent = (translatedContent: any, platform: string, event: NotificationEvents) => {\r\n switch(platform) {\r\n case 'email':\r\n this.props.setEmailSubject(event, translatedContent);\r\n break;\r\n\r\n case 'sms':\r\n this.props.setSMSBody(event, translatedContent);\r\n break;\r\n\r\n default:\r\n console.log(\"unknown platform, error.\")\r\n break;\r\n }\r\n }\r\n\r\n private eventUppercase = (eventToFix: string) => {\r\n if(eventToFix !== null && eventToFix.length > 2)\r\n return eventToFix[0].toUpperCase() + eventToFix.slice(1);\r\n else\r\n return \"Invalid string to fix.\"\r\n }\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n emailSubjects: state.resources.emailSubjectsResource,\r\n smsBodies: state.resources.smsBodiesResource,\r\n pristine: state.settings.pristineNotificationSettingsCopy\r\n }),\r\n {\r\n setEmailSubject: actions.SetEmailSubject,\r\n setSMSBody: actions.SetSMSBody,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(MessagingGeneralControls));\r\n","import { useEffect, useRef } from \"react\";\r\n\r\n/**\r\n * Custom hook to read previous values\r\n */\r\nconst usePrevious = (value: T): T | undefined => {\r\n const ref = useRef();\r\n useEffect(() => {\r\n ref.current = value;\r\n });\r\n\r\n return ref.current;\r\n};\r\n\r\nexport default usePrevious;\r\n","import React from \"react\";\r\n\r\ninterface IInputCounterProps {\r\n count: number;\r\n maxCount: number;\r\n isFocused: boolean;\r\n errorClass?: string;\r\n errorHelpText?: string;\r\n}\r\nexport const InputCounter: React.FunctionComponent = ({ count, maxCount, isFocused, errorHelpText, errorClass }) => {\r\n // only add error class when focused\r\n const getErrorClass = (): string => {\r\n return isFocused && maxCount && count === maxCount ? \"error\" : \"\";\r\n };\r\n\r\n return (\r\n
    \r\n {errorHelpText}\r\n \r\n {count}/{maxCount}\r\n \r\n
    \r\n );\r\n};\r\n","import { SvgIcon } from '@mui/material';\r\nimport * as React from 'react';\r\n\r\ninterface IMagicIconProps {\r\n fill?: string\r\n fontSize?: string\r\n}\r\n\r\nconst MagicIcon: React.FunctionComponent = ({ fill, fontSize }) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\n export default MagicIcon;","import React from \"react\";\r\n\r\nimport { ClickAwayListener, Grow, IconButton, MenuItem, MenuList, Paper, Popper } from \"@mui/material\";\r\nimport { PromptTypeEnum } from \"../models\";\r\nimport MagicIcon from \"../common/magicIcon\";\r\n\r\ninterface ISmartContentDropDownProps {\r\n smartContentButtonDisabled?: boolean;\r\n promptType: PromptTypeEnum;\r\n label: string;\r\n onSmartContentGenerate: (promptTypeForGeneration: PromptTypeEnum, promptTypeForInsert: PromptTypeEnum) => void;\r\n}\r\n\r\nconst SmartContentDropDown: React.FunctionComponent = ({\r\n smartContentButtonDisabled,\r\n promptType,\r\n label,\r\n onSmartContentGenerate,\r\n}) => {\r\n const [open, setOpen] = React.useState(false);\r\n const anchorRef = React.useRef(null);\r\n // return focus to the button when we transitioned from !open -> open\r\n const prevOpen = React.useRef(open);\r\n\r\n const handleToggle = () => {\r\n setOpen((prevOpen) => !prevOpen);\r\n };\r\n\r\n const handleClose = (event: Event | React.SyntheticEvent) => {\r\n if (anchorRef.current && anchorRef.current.contains(event.target as HTMLElement)) {\r\n return;\r\n }\r\n\r\n setOpen(false);\r\n };\r\n\r\n const handleListKeyDown = (event: React.KeyboardEvent) => {\r\n if (event.key === \"Tab\") {\r\n event.preventDefault();\r\n setOpen(false);\r\n } else if (event.key === \"Escape\") {\r\n setOpen(false);\r\n }\r\n }\r\n\r\n React.useEffect(() => {\r\n if (prevOpen.current === true && open === false) {\r\n anchorRef.current!.focus();\r\n }\r\n\r\n prevOpen.current = open;\r\n }, [open]);\r\n\r\n const onSmartContentSelection = (event: React.MouseEvent, selectedPromptType: PromptTypeEnum) => {\r\n onSmartContentGenerate(promptType, selectedPromptType);\r\n handleClose(event);\r\n };\r\n\r\n const menuItems = [\r\n {\r\n label: label.includes(\"Summary\") ? 'Generate alternate summaries' : 'Generate summaries',\r\n type: PromptTypeEnum.Summarize,\r\n isAlternate: label.includes(\"Summary\"),\r\n },\r\n {\r\n label: label.includes(\"Title\") ? 'Generate alternate titles' : 'Generate titles',\r\n type: PromptTypeEnum.Title,\r\n isAlternate: label.includes(\"Title\"),\r\n },\r\n {\r\n label: 'Generate post body',\r\n type: PromptTypeEnum.Body,\r\n isAlternate: false,\r\n },\r\n ];\r\n\r\n //Ensure alternate is at the top.\r\n const sortedMenuItems = menuItems.sort((a, b) => Number(b.isAlternate) - Number(a.isAlternate));\r\n\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n {({ TransitionProps, placement }) => (\r\n \r\n \r\n \r\n \r\n {sortedMenuItems.map((item) => (\r\n onSmartContentSelection(e, item.type)}>\r\n {item.label}\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n
    \r\n );\r\n};\r\n\r\nexport { SmartContentDropDown };\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { IconButton, SvgIcon, TextField, TextFieldProps } from \"@mui/material\";\r\nimport ConditionalWrapper from \"../../conditionalWrapper\";\r\nimport { useUndoableState } from \"modules/common/hooks/useUndoableState\";\r\nimport usePrevious from \"modules/common/hooks/usePrevious\";\r\nimport { InputCounter } from \"./inputCounter\";\r\nimport { SmartContentDropDown } from \"modules/smartContent/buttons/smartContentDropDown\";\r\nimport { PromptTypeEnum } from \"modules/smartContent/models\";\r\n\r\nimport \"../styles/filledInput.sass\";\r\n\r\ntype FilledInputPropsType = TextFieldProps & {\r\n label: string;\r\n value: string;\r\n required?: boolean;\r\n characterCount?: boolean;\r\n maxCount?: number;\r\n showInputErrorOnMaxCount?: boolean;\r\n labelOnly?: boolean;\r\n controlled?: boolean;\r\n promptType?: PromptTypeEnum;\r\n onUndo?: (newValue: string | undefined) => void;\r\n onKeyDown? : (newValue: string) => void;\r\n onSmartContentGenerate?: (promptTypeForGeneration: PromptTypeEnum, promptTypeForInsert: PromptTypeEnum) => void;\r\n setMagicButtonDisabled?: (disable: boolean) => void;\r\n refreshable?: boolean; // flag whether to re-render input on \"value\" prop change\r\n inputContainerStyle?: React.CSSProperties;\r\n inputDivStyle?: React.CSSProperties;\r\n inputLabelStyle?: React.CSSProperties;\r\n errorHelperText?: string;\r\n inputEndAdornmentText?: string;\r\n inputDivContainerStyle?: React.CSSProperties;\r\n showIcons?: boolean;\r\n extraIconButton?: JSX.Element;\r\n inputLabelIconContainerStyle?: React.CSSProperties;\r\n inputRef?: React.RefObject;\r\n iconsDivRef?: React.RefObject;\r\n keepFocusAfterUndo?: boolean;\r\n smartContentButtonDisabled?: boolean;\r\n inputLabelContainerStyle?: React.CSSProperties;\r\n multiline?: boolean;\r\n};\r\n\r\n/**\r\n * A android looking input field with a label\r\n * - use inputProps to overwrite any defaults on the MUI input component\r\n */\r\nconst FilledInput: React.FunctionComponent = ({\r\n label,\r\n required = false,\r\n value = \"\",\r\n characterCount = false,\r\n maxCount,\r\n showInputErrorOnMaxCount = true,\r\n labelOnly = false,\r\n controlled = false,\r\n inputProps = {},\r\n refreshable = false,\r\n smartContentButtonDisabled,\r\n promptType,\r\n onUndo,\r\n onKeyDown,\r\n onSmartContentGenerate,\r\n setMagicButtonDisabled,\r\n inputContainerStyle,\r\n inputDivStyle,\r\n inputLabelStyle,\r\n errorHelperText = \"\",\r\n inputEndAdornmentText,\r\n inputDivContainerStyle,\r\n showIcons = true,\r\n extraIconButton,\r\n inputLabelIconContainerStyle,\r\n inputRef,\r\n iconsDivRef,\r\n keepFocusAfterUndo = false,\r\n style,\r\n variant = \"standard\",\r\n InputProps,\r\n size,\r\n error,\r\n inputLabelContainerStyle,\r\n multiline = true\r\n}) => {\r\n const [isFocused, setIsFocused] = useState(false);\r\n const { value: internalValue, setValue: setInternalValue, undoValue, undoable } = useUndoableState(value);\r\n const prevValue = usePrevious(value);\r\n\r\n /**\r\n * Put any prop updates in state\r\n */\r\n useEffect(() => {\r\n let newValue = value;\r\n if (maxCount && newValue.length > maxCount) {\r\n newValue = newValue.substring(0, maxCount);\r\n }\r\n\r\n // only transfer value if \"value\" prop has changed and it is new\r\n if (prevValue !== newValue && newValue !== internalValue) setInternalValue(newValue);\r\n }, [value, maxCount, setInternalValue, prevValue, internalValue]);\r\n\r\n /**\r\n * Intercept event and apply any max count logic\r\n */\r\n const onChange = (event: React.ChangeEvent) => {\r\n if (controlled) {\r\n if (!inputProps || !inputProps.onChange) throw new Error(\"filledInput requires inputProps.onChange if controlled\");\r\n\r\n inputProps.onChange(event);\r\n\r\n return;\r\n }\r\n \r\n disableOrEnableMagicButton(event);\r\n\r\n let newValue = event.target.value;\r\n let effectiveNewValue =\r\n maxCount && newValue.length > maxCount\r\n ? internalValue // keep value at max count\r\n : newValue;\r\n \r\n setInternalValue(effectiveNewValue);\r\n }\r\n\r\n const disableOrEnableMagicButton = (event: React.ChangeEvent) => {\r\n setMagicButtonDisabled && setMagicButtonDisabled(event.target.value.length <= 0);\r\n }\r\n\r\n const getInputErrorClass = (): string => {\r\n return variant === \"outlined\" && errorHelperText\r\n ? \"error\"\r\n : isFocused && maxCount && showInputErrorOnMaxCount && internalValue?.length === maxCount\r\n ? \"error\"\r\n : \"\";\r\n };\r\n\r\n const onUndoInternal = () => {\r\n // using return value here so that we send correct new value to parent and not the pre-state change one\r\n let newValue = undoValue();\r\n\r\n if (onUndo) onUndo(newValue);\r\n\r\n if (keepFocusAfterUndo && inputRef?.current) inputRef?.current.focus();\r\n };\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n {label}\r\n \r\n {\r\n showIcons && \r\n
    \r\n {onSmartContentGenerate && promptType && (\r\n \r\n )}\r\n { extraIconButton }\r\n {onUndo && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
    \r\n }\r\n
    \r\n {!labelOnly && (\r\n
    {children}
    }>\r\n
    \r\n
    \r\n !!onKeyDown ? onKeyDown(internalValue ?? \"\") : null}\r\n inputProps={{\r\n ...inputProps,\r\n onBlur: (event: React.FocusEvent) => {\r\n setIsFocused(false);\r\n\r\n if (inputProps && inputProps.onBlur) inputProps.onBlur(event);\r\n },\r\n onFocus: (event: React.FocusEvent) => {\r\n setIsFocused(true);\r\n\r\n if (inputProps && inputProps.onFocus) inputProps.onFocus(event);\r\n },\r\n }}\r\n style={style}\r\n InputProps={{\r\n disableUnderline: true,\r\n className: `filled-input ${getInputErrorClass()}`,\r\n inputRef: inputRef,\r\n ...InputProps,\r\n }}\r\n size={size}\r\n error={error}\r\n />\r\n {characterCount && maxCount && (\r\n \r\n )}\r\n
    \r\n {inputEndAdornmentText && {inputEndAdornmentText}}\r\n
    \r\n
    \r\n )}\r\n
    \r\n );\r\n};\r\n\r\nexport default FilledInput;\r\n","import { useMemo, useState } from \"react\";\r\n\r\nexport type UndoableStateReturnType = {\r\n value: T;\r\n setValue: (newValue: T) => void;\r\n undoValue: () => T;\r\n undoable: boolean;\r\n}\r\n\r\ninterface IUseUndoableState {\r\n historyIdx: number;\r\n history: T[];\r\n curr: T;\r\n}\r\n\r\n/**\r\n * Undoable state value\r\n * @param init - default value\r\n * @returns - [value, setValue, undoValue, undoable (enabled)]\r\n * - adadpted from https://github.com/jzcling/react-use-undoable-state\r\n */\r\nfunction useUndoableState(init: T): UndoableStateReturnType {\r\n const [state, setState] = useState>({\r\n historyIdx: 0,\r\n history: [init],\r\n curr: init\r\n });\r\n\r\n const {\r\n history,\r\n historyIdx,\r\n curr\r\n } = state;\r\n\r\n const undoable = useMemo(() => historyIdx !== 0, [historyIdx]);\r\n\r\n /**\r\n * Handle value changes\r\n * - remove all changes after current index\r\n * - add new value to history array\r\n * - set curr index to end of history array\r\n * - set curr value to new value\r\n * @param value - new value\r\n */\r\n const onChangeValue = (value: T) => {\r\n let newHistory = [...history];\r\n\r\n // this cleans the top of the stack by removing all the changes that happened after our current position\r\n newHistory.length = historyIdx + 1;\r\n newHistory.push(value);\r\n\r\n setState({\r\n ...state,\r\n history: newHistory,\r\n historyIdx: newHistory.length - 1,\r\n curr: value\r\n });\r\n }\r\n\r\n /**\r\n * Handle undo changes\r\n * - move index back one\r\n * - set curr to history[newIndex]\r\n * @returns the new curr value\r\n */\r\n const onUndo = (): T => {\r\n const newIndex = Math.max(0, historyIdx - 1);\r\n\r\n setState({\r\n ...state,\r\n historyIdx: newIndex,\r\n curr: history[newIndex]\r\n });\r\n\r\n return history[newIndex];\r\n }\r\n\r\n return { value: curr, setValue: onChangeValue, undoValue: onUndo, undoable };\r\n}\r\n\r\nexport { useUndoableState };\r\n","import { \r\n ChonkyActionUnion, \r\n ChonkyActions, \r\n ChonkyIconName, \r\n CustomVisibilityState, \r\n FileAction, \r\n FileArray, \r\n FileHelper, \r\n FileSelectionTransform, \r\n OptionIds, \r\n defineFileAction, \r\n reduxActions, \r\n selectOptionValue, \r\n selectRawFiles, \r\n selectSelectedFileIds, \r\n thunkRequestFileAction \r\n} from 'chonky';\r\nimport { CustomFileData, FilterGroupName, SortGroupName } from './models';\r\nimport { ChonkyDispatch, RootState } from 'chonky/dist/types/redux.types';\r\n\r\n// chonky file action for an ascending sort button\r\nexport const ascSortAction = (groupName: SortGroupName): FileAction => defineFileAction(\r\n {\r\n id: 'asc_sort_action',\r\n button: {\r\n name: 'A-Z',\r\n toolbar: true,\r\n group: groupName\r\n },\r\n customVisibility: () => groupName === SortGroupName.Az ? CustomVisibilityState.Active : CustomVisibilityState.Default\r\n } as const\r\n);\r\n\r\n// chonky file action for an descending sort button\r\nexport const descSortAction = (groupName: SortGroupName): FileAction => defineFileAction(\r\n {\r\n id: 'desc_sort_action',\r\n button: {\r\n name: 'Z-A',\r\n toolbar: true,\r\n group: groupName\r\n },\r\n customVisibility: () => groupName === SortGroupName.Za ? CustomVisibilityState.Active : CustomVisibilityState.Default\r\n } as const\r\n);\r\n\r\n// chonky file action for sorting by the newest file\r\nexport const newestSortAction = (groupName: SortGroupName): FileAction => defineFileAction(\r\n {\r\n id: 'newest_sort_action',\r\n button: {\r\n name: 'Newest first',\r\n toolbar: true,\r\n group: groupName\r\n },\r\n customVisibility: () => groupName === SortGroupName.Newest ? CustomVisibilityState.Active : CustomVisibilityState.Default\r\n \r\n } as const\r\n);\r\n\r\n// chonky file action for sorting by the oldest file\r\nexport const oldestSortAction = (groupName: SortGroupName): FileAction => defineFileAction(\r\n {\r\n id: 'oldest_sort_action',\r\n button: {\r\n name: 'Oldest first',\r\n toolbar: true,\r\n group: groupName\r\n },\r\n customVisibility: () => groupName === SortGroupName.Oldest ? CustomVisibilityState.Active : CustomVisibilityState.Default\r\n } as const\r\n);\r\n\r\n// chonky file action for displaying folders first\r\nexport const toggleShowFoldersFirst = (groupName: SortGroupName, defaultValue: boolean = true): FileAction => defineFileAction({\r\n id: 'toggle_show_folders_first',\r\n option: {\r\n id: OptionIds.ShowFoldersFirst,\r\n defaultValue: defaultValue,\r\n },\r\n button: {\r\n name: 'Show folders first',\r\n toolbar: true,\r\n group: groupName\r\n },\r\n } as const\r\n);\r\n\r\n// comparison function for either a Date or string type, used for frontend sorting of\r\n// chonky files based on the last modified date (modDate) or by file name\r\nexport const cmp = (a: Date | string, b: Date | string): number => {\r\n if (a > b) return +1;\r\n if (a < b) return -1;\r\n return 0;\r\n}\r\n\r\n// same as above but in descending order\r\nconst cmpDesc = (a: Date | string, b: Date | string): number => {\r\n if (a > b) return -1;\r\n if (a < b) return +1;\r\n return 0;\r\n}\r\n\r\n// function for getting the data of the Chonky file to compare\r\nconst getFieldToCompare = (field: keyof CustomFileData, data: CustomFileData): string | Date => {\r\n return field === \"modDate\" && data.modDate\r\n ? new Date(data.modDate)\r\n : typeof data[field] === 'string' \r\n ? (data[field] as string).toLowerCase() \r\n : data[field];\r\n}\r\n\r\n// a custom sort function for sorting by folders first, and then applying either sorting by modDate or filename afterwards\r\n// on the already ordered array\r\nexport const sortByFoldersThenByField = (a: CustomFileData, b: CustomFileData, sortName: SortGroupName, showFoldersFirst: boolean): number => {\r\n const field = ((sortName === SortGroupName.Az || sortName === SortGroupName.Za) ? \"name\" : \"modDate\") as keyof CustomFileData;\r\n const asc = sortName === SortGroupName.Az || sortName === SortGroupName.Oldest;\r\n\r\n const aToCompare = getFieldToCompare(field, a);\r\n const bToCompare = getFieldToCompare(field, b);\r\n\r\n const fieldCompare = asc \r\n ? cmp(aToCompare, bToCompare) \r\n : cmpDesc(aToCompare, bToCompare);\r\n\r\n if (showFoldersFirst) {\r\n return (a.isDir === b.isDir ? fieldCompare : a.isDir ? -1 : 1);\r\n }\r\n\r\n return fieldCompare;\r\n}\r\n\r\n// a helper function for our custom file actions to apply the frontend sorting and filtering \r\nexport const sortAndFilterAction = (reduxDispatch: ChonkyDispatch, getReduxState: () => RootState, groupName: SortGroupName) => {\r\n const showFoldersFirst = selectOptionValue(OptionIds.ShowFoldersFirst)(getReduxState());\r\n const rawFileArray = [...selectRawFiles(getReduxState()) as FileArray]\r\n .sort((a,b) => a && b ? sortByFoldersThenByField(a, b, groupName, showFoldersFirst) : 0);\r\n\r\n reduxDispatch(reduxActions.setRawFiles(rawFileArray));\r\n}\r\n\r\n// function for returning a list of our custom file actions\r\nexport const getSortFileActions = (groupName: SortGroupName, defaultShowFoldersFirst: boolean = true): FileAction[] => [\r\n ascSortAction(groupName),\r\n descSortAction(groupName),\r\n newestSortAction(groupName),\r\n oldestSortAction(groupName),\r\n toggleShowFoldersFirst(groupName, defaultShowFoldersFirst),\r\n];\r\n\r\n// chonky file action for filtering that shows all files\r\nexport const viewAllImagesAction = (groupName: FilterGroupName): FileAction => defineFileAction(\r\n {\r\n id: 'view_all_action',\r\n button: {\r\n name: 'View all images',\r\n toolbar: true,\r\n group: groupName\r\n },\r\n customVisibility: () => groupName === FilterGroupName.AllImages ? CustomVisibilityState.Active : CustomVisibilityState.Default\r\n } as const\r\n);\r\n\r\n// chonky file action for filtering that shows only the user's files\r\nexport const viewMyImagesAction = (groupName: FilterGroupName, currentUserId: string): FileAction => defineFileAction(\r\n {\r\n id: 'view_my_action',\r\n button: {\r\n name: 'View my images',\r\n toolbar: true,\r\n group: groupName\r\n },\r\n customVisibility: () => groupName === FilterGroupName.MyImages ? CustomVisibilityState.Active : CustomVisibilityState.Default\r\n } as const\r\n);\r\n\r\n// function for getting all our chonky filter file actions\r\nexport const getFilterFileActions = (groupName: FilterGroupName, currentUserId: string): FileAction[] => [\r\n viewAllImagesAction(groupName),\r\n viewMyImagesAction(groupName, currentUserId),\r\n];\r\n\r\n// chonky's open file action in the dropdown menu\r\n// we specify it ourselves here so we can toggle between having the button be active/inactive\r\n// depending on if there is just a single file selected\r\nexport const openFileAction = defineFileAction(\r\n {\r\n id: 'open_selection',\r\n hotkeys: ['enter'],\r\n requiresSelection: true,\r\n fileFilter: FileHelper.isOpenable,\r\n button: {\r\n name: 'Open',\r\n toolbar: true,\r\n contextMenu: true,\r\n group: 'Actions',\r\n },\r\n } as const,\r\n ({ state, reduxDispatch }) => {\r\n reduxDispatch(\r\n thunkRequestFileAction(ChonkyActions.OpenFiles, {\r\n files: state.selectedFilesForAction!,\r\n })\r\n );\r\n return undefined;\r\n }\r\n);\r\n\r\n// a disabled version of the openFileAction to display when we have no files or more than 1 selected for actions\r\nexport const disabledOpenFileAction = defineFileAction({\r\n id: 'open_selection_disabled',\r\n requiresSelection: true,\r\n fileFilter: _ => false,\r\n button: {\r\n name: 'Open',\r\n toolbar: true,\r\n contextMenu: true,\r\n group: 'Actions',\r\n }\r\n} as const);\r\n\r\n// custom file action for renaming a file\r\nexport const renameFileAction = defineFileAction(\r\n {\r\n id: 'rename_selection',\r\n requiresSelection: true,\r\n button: {\r\n name: 'Rename',\r\n toolbar: true,\r\n contextMenu: true,\r\n group: 'Actions',\r\n },\r\n } as const\r\n);\r\n\r\n// the disabled version of the renameFileAction\r\nexport const disabledRenameFileAction = defineFileAction({\r\n id: 'rename_selection_disabled',\r\n requiresSelection: true,\r\n fileFilter: _ => false,\r\n button: {\r\n name: 'Rename',\r\n toolbar: true,\r\n contextMenu: true,\r\n group: 'Actions',\r\n }\r\n} as const);\r\n\r\n// chonky file action for moving files\r\nexport const moveFileAction = defineFileAction(\r\n {\r\n id: 'move_selection',\r\n requiresSelection: true,\r\n button: {\r\n name: 'Move',\r\n toolbar: true,\r\n contextMenu: true,\r\n group: 'Actions',\r\n },\r\n } as const,\r\n ({ reduxDispatch, getReduxState }) => {\r\n const rawFileArray = [...selectRawFiles(getReduxState()) as FileArray];\r\n const selectionMap = selectSelectedFileIds(getReduxState());\r\n const newRawFileArray = rawFileArray.map(f => f && selectionMap.includes(f.id) && f.isDir ? {...f, openable: false, selectable: false} : {...f});\r\n reduxDispatch(reduxActions.setRawFiles(newRawFileArray));\r\n },\r\n);\r\n\r\n// chonky action for selecting all files\r\nexport const selectAllFileAction = defineFileAction({\r\n id: 'select_all',\r\n hotkeys: ['ctrl+a'],\r\n button: {\r\n name: 'Select all',\r\n toolbar: true,\r\n contextMenu: true,\r\n group: 'Actions',\r\n },\r\n selectionTransform: (({ fileIds, hiddenFileIds }) => {\r\n const newSelection = new Set();\r\n fileIds.forEach(fileId => {\r\n if (!hiddenFileIds.has(fileId)) newSelection.add(fileId);\r\n });\r\n return newSelection;\r\n }) as FileSelectionTransform,\r\n} as const);\r\n\r\n// chonky file action for clearing file selection\r\nexport const clearSelectionFileAction = defineFileAction({\r\n id: 'clear_selection',\r\n requiresSelection: true,\r\n hotkeys: ['escape'],\r\n button: {\r\n name: 'Clear selection',\r\n toolbar: true,\r\n contextMenu: true,\r\n group: 'Actions',\r\n },\r\n selectionTransform: (({ prevSelection }) => {\r\n if (prevSelection.size === 0) return null;\r\n return new Set();\r\n }) as FileSelectionTransform,\r\n} as const);\r\n\r\n// chonky file action for deleting files\r\nexport const deleteSelectionAction = defineFileAction(\r\n {\r\n id: 'delete_selection',\r\n requiresSelection: true,\r\n hotkeys: ['delete'],\r\n button: {\r\n name: 'Delete',\r\n toolbar: true,\r\n contextMenu: true,\r\n group: 'Actions',\r\n }\r\n } as const\r\n);\r\n\r\n// a \"hidden\" chonky file action for our move files app bar\r\nexport const resetMoveFileStateAction = defineFileAction(\r\n {\r\n id: 'reset_move_file_state'\r\n } as const,\r\n ({ reduxDispatch, getReduxState }) => {\r\n const rawFileArray = [...selectRawFiles(getReduxState()) as FileArray];\r\n reduxDispatch(reduxActions.setRawFiles(rawFileArray.map(f => f && !f.openable && !f.selectable && f.isDir ? {...f, selctable: true, openable: true} : {...f})));\r\n },\r\n);\r\n\r\nexport const disabledCreateFolder = defineFileAction(\r\n {\r\n id: \"dsiabled_create_folder\",\r\n button: {\r\n name: \"Create folder\",\r\n toolbar: true,\r\n tooltip: \"Create a folder\",\r\n icon: ChonkyIconName.folderCreate\r\n },\r\n customVisibility: () => CustomVisibilityState.Disabled\r\n }\r\n);\r\n\r\n// type definitions so we can use them in the file action handler\r\ntype CustomActions = typeof renameFileAction | typeof openFileAction | typeof moveFileAction | typeof deleteSelectionAction | typeof resetMoveFileStateAction;\r\ntype CustomSortActions = typeof ascSortAction | typeof descSortAction | typeof newestSortAction | typeof oldestSortAction | typeof viewAllImagesAction | typeof viewMyImagesAction;\r\nexport type CustomActionUnion = CustomActions | ChonkyActionUnion | CustomSortActions;\r\n\r\n// chonky's default file actions\r\nexport const defaultFileActions = [\r\n ChonkyActions.EnableGridView, \r\n ChonkyActions.EnableListView,\r\n];\r\n\r\n// our custom file actions\r\nexport const customFileActions = [\r\n moveFileAction, \r\n selectAllFileAction, \r\n clearSelectionFileAction, \r\n deleteSelectionAction,\r\n resetMoveFileStateAction,\r\n];","import * as React from 'react';\r\n\r\ninterface componentProps {\r\n color?: string\r\n width?: string\r\n height?: string\r\n}\r\n\r\nexport default class UploadIcon extends React.Component {\r\n public render() {\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}","import * as Actions from './actions';\r\nimport { SupportItem, AssociatedLink, SupportTab, SupportItemTypes } from './models';\r\nimport { supportApi } from 'api/instances';\r\nimport API from 'api';\r\nimport { AppThunkResult } from 'typedActions';\r\nimport { push } from 'react-router-redux';\r\nimport XhrUpload from 'utils/xhrUpload';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport MsalAuthModule from 'authentication/msalAuthModule';\r\n\r\nexport const createSupportItem = (itemType: string): AppThunkResult => (dispatch, getState) => {\r\n dispatch(Actions.CreateNewSupportItem({}));\r\n\r\n return supportApi.CreateNewItem(itemType)\r\n .then(result => {\r\n dispatch(Actions.CreateNewItemComplete({ itemId: result, succeeded: true }));\r\n return result;\r\n })\r\n\r\n}\r\n\r\nexport const fetchSupportItem = (itemId: string): AppThunkResult => (dispatch, getState) => {\r\n dispatch(Actions.FetchSupportItem({}));\r\n\r\n supportApi.FetchSupportItem(itemId)\r\n .then(result => {\r\n dispatch(Actions.FetchSupportItemComplete({ item: result, succeeded: true }));\r\n return result;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.FetchSupportItemComplete({ item: null, succeeded: false }));\r\n })\r\n\r\n}\r\n\r\nexport const saveSupportItem = (item: SupportItem): AppThunkResult => (dispatch, getState) => {\r\n dispatch(Actions.SaveSupportItem({}));\r\n\r\n return supportApi.SaveSupportItem(item)\r\n .then(result => {\r\n dispatch(Actions.SaveSupportItemComplete({ succeeded: true }));\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SaveSupportItemComplete({ succeeded: false }));\r\n })\r\n}\r\n\r\nexport const deleteSupportItems = (ids: string[]): AppThunkResult => (dispatch, getState) => {\r\n dispatch(Actions.DeleteSupportItem({}));\r\n\r\n return Promise.all(ids.map(id => supportApi.DeleteSupportItem(id)))\r\n .then(result => {\r\n dispatch(Actions.DeleteSupportItemComplete({ succeeded: true }))\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DeleteSupportItemComplete({ succeeded: false }))\r\n })\r\n}\r\n\r\nexport const publishSupportItem = (item: SupportItem): AppThunkResult => (dispatch, getState) => {\r\n var returnUrl;\r\n if (item.itemType === SupportItemTypes.training) {\r\n returnUrl = `/${getState().tenant.id}/training`;\r\n } else {\r\n returnUrl = `/${getState().tenant.id}/support`;\r\n }\r\n\r\n dispatch(Actions.PublishSupportItem({}));\r\n\r\n let defaultLang = getState().settings.tenantSettings.defaultLCID;\r\n\r\n return supportApi.PublishSupportItem(item)\r\n .then(result => {\r\n dispatch(Actions.PublishSupportItemComplete({ succeeded: true }))\r\n })\r\n .then(() => {\r\n dispatch(push(returnUrl));\r\n dispatch(Actions.PublishSucess({}));\r\n })\r\n .catch(error => {\r\n let validationResult = { id: item.id, itemTitle: getTranslatedContentField(\"title\", item.translatedContent, defaultLang) };\r\n if (error) {\r\n dispatch(Actions.PublishSupportItemComplete({ succeeded: false, validationResult: { ...validationResult, errors: error.response.data?.ModelState } }))\r\n }\r\n })\r\n}\r\n\r\nexport const updateField = (field: F) => (value: SupportItem[F]) => (dispatch, getState) => {\r\n return dispatch(Actions.FieldUpdate({ field, value }));\r\n}\r\n\r\nconst getTranslatedContentField = (field: string, tc: {[lang: string]: any}, lang: string): string => {\r\n const langs = Object.keys(tc || {}).sort();\r\n if(!tc || langs.length === 0) return \"\";\r\n return tc[lang] ? tc[lang][field] : tc[langs[0]][field];\r\n}\r\n\r\nexport const uploadSupportingDocuments = (file: File, type: string, onProgress: (percentCompleted: number) => void, onLoad?: (e) => void, onError?: (e) => void, onAbort?: (e) => void) => async (dispatch, getState) => {\r\n\r\n dispatch(Actions.UploadFiles({}));\r\n\r\n return MsalAuthModule.getInstance().getAccessToken().then(accessToken => {\r\n const requestDetails = API.mediaLibrary.UploadSupportingDocument(file, type);\r\n const url = getState().config.SparrowClientApiUrl + requestDetails.url\r\n .replace(\"{tenant}\", getState().tenant.id);\r\n\r\n const handlers = { onLoad, onAbort, onError, onProgress };\r\n\r\n return new XhrUpload(url, requestDetails, handlers)\r\n .authenticateWith(accessToken)\r\n .upload();\r\n })\r\n .then((response: string) => {\r\n let document = JSON.parse(response) as { docId: string, fileName: string }\r\n dispatch(Actions.UploadFilesComplete({ succeeded: true, id: document.docId, fileName: document.fileName }))\r\n return { id: document.docId, fileName: document.fileName }\r\n });\r\n}\r\n\r\nexport const uploadDocuments = (file: File, onProgress: (percentCompleted: number) => void, onLoad?: (e) => void, onError?: (e) => void, onAbort?: (e) => void) => async (dispatch, getState: () => GlobalApplicationState) : Promise => {\r\n if(!( ((((((((((((((((((((((((((((((((((((((((/^application\\/(vnd.openxmlformats-officedocument.wordprocessingml.document|msword|pdf|zip|x-zip-compressed)/))))))))))))))))))))))))))))))))))))))))).test(file.type)){\r\n Actions.UploadDocumentComplete({ succeeded: false, id: null })\r\n return Promise.resolve(null);\r\n }\r\n\r\n dispatch(Actions.UploadDocument({}));\r\n\r\n\r\n return MsalAuthModule.getInstance().getAccessToken().then(accessToken=>{\r\n const requestDetails = API.mediaLibrary.UploadDocument(file);\r\n const url = getState().config.SparrowClientApiUrl + requestDetails.url\r\n .replace(\"{tenant}\", getState().tenant.id);\r\n\r\n const handlers = { onLoad, onAbort, onError, onProgress };\r\n \r\n return new XhrUpload(url, requestDetails, handlers)\r\n .authenticateWith(accessToken)\r\n .upload();\r\n })\r\n .then((response: string) => {\r\n let document = JSON.parse(response) as { docId: string, fileName: string }\r\n dispatch(Actions.UploadDocumentComplete({ succeeded: true, id: document.docId, fileName: document.fileName }))\r\n return { id: document.docId, fileName: document.fileName }\r\n });\r\n}\r\n\r\nexport const setUploadingDoc = (uploading: boolean) => (dispatch, getState) => {\r\n dispatch(Actions.SetUploadingDoc({uploading}))\r\n}\r\n\r\nexport const uploadDocument = (file: File, onProgress: (percentCompleted: number) => void, onLoad?: (e) => void, onError?: (e) => void, onAbort?: (e) => void) => async (dispatch, getState) => {\r\n\r\n dispatch(Actions.UploadDocument({}));\r\n\r\n return MsalAuthModule.getInstance().getAccessToken().then(accessToken => {\r\n const requestDetails = API.mediaLibrary.UploadDocument(file);\r\n const url = getState().config.SparrowClientApiUrl + requestDetails.url\r\n .replace(\"{tenant}\", getState().tenant.id);\r\n\r\n const handlers = { onLoad, onAbort, onError, onProgress };\r\n\r\n return new XhrUpload(url, requestDetails, handlers)\r\n .authenticateWith(accessToken)\r\n .upload();\r\n })\r\n .then((response: string) => {\r\n let document = JSON.parse(response) as { docId: string, fileName: string }\r\n dispatch(Actions.UploadDocumentComplete({ succeeded: true, id: document.docId, fileName: document.fileName }))\r\n return { id: document.docId, fileName: document.fileName }\r\n });\r\n}\r\n\r\nexport const updateAssociatedLinks = (docId: string, fileName: string, url: string) => (dispatch, getState) => {\r\n let associatedLink = {\r\n blobId: docId,\r\n fileName,\r\n url\r\n } as AssociatedLink; \r\n\r\n return dispatch(Actions.SupportAssociatedLinksUpdate({ associatedLink }));\r\n}\r\n\r\nexport const removeAssociatedLink = (id: string) => (dispatch, getState) => {\r\n return dispatch(Actions.RemoveAssociatedLink({ id }));\r\n}\r\n\r\nexport const setActiveTab = (activeTab: SupportTab) => (dispatch, getState) => {\r\n dispatch(Actions.SetActiveSupportTab({activeTab}));\r\n}\r\n\r\nexport const clearValidationErrors = () => (dispatch, getState) => {\r\n dispatch(Actions.ClearValidationErrors({}));\r\n}","import * as React from \"react\";\r\nimport UploadIcon from \"./uploadIconSvg\";\r\nimport { injectIntl, IntlShape } from \"react-intl\";\r\nimport { errorAlert } from \"utils/notyPopups\";\r\nimport { SupportItemTypes } from \"modules/support\";\r\nimport \"./uploader.sass\";\r\n\r\ninterface componentProps {\r\n message?: string | JSX.Element;\r\n upload: (file: File, onProgress, onLoad, onError, onAbort) => Promise;\r\n uploading: boolean;\r\n maxUploadable: number;\r\n setUploading: (uploading: boolean) => void;\r\n completed?: (imageId: string) => void;\r\n imageSelected?: (image: { id: string; url: string }) => void;\r\n intl: IntlShape;\r\n onAllComplete?: () => void;\r\n documentType?: string;\r\n uploadDocuments?: any;\r\n onDocumentComplete?: (docId: string, fileName: string, checkSum?: string, file?: File) => void;\r\n attachmentType: \"files\" | \"media\";\r\n onSupportDocumentComplete?: (docId: string, fileName: string) => void\r\n acceptedFiles?: string;\r\n uploaderMessage?: string;\r\n}\r\n\r\nexport interface UploadStatus {\r\n fileProgress: Record;\r\n error: string | null;\r\n aborted: boolean;\r\n}\r\n\r\ninterface componentState {\r\n errors: string[];\r\n dragging: boolean;\r\n uploadStatus: UploadStatus;\r\n totalToUpload: number;\r\n totalUploaded: number;\r\n}\r\n\r\nclass Uploader extends React.Component {\r\n private maxUploads = 20;\r\n\r\n private errorDisplayTimeout: any;\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n errors: [],\r\n dragging: false,\r\n totalToUpload: 0,\r\n totalUploaded: 0,\r\n uploadStatus: {\r\n aborted: false,\r\n error: null,\r\n fileProgress: {},\r\n },\r\n };\r\n }\r\n\r\n public render() {\r\n let status = this.state.uploadStatus;\r\n\r\n if (status.aborted) return this.renderUploadingAborted();\r\n else if (status.error) return this.renderUploadingError();\r\n else if (this.props.uploading) return this.renderUploadingProgress();\r\n else return this.renderUploadForm();\r\n }\r\n\r\n private renderUploadForm() {\r\n const { maxUploadable } = this.props;\r\n\r\n let draggingProps = {\r\n onDrag: this.dragging(true),\r\n onDragStart: this.dragging(true),\r\n onDragEnd: this.dragging(false),\r\n onDragOver: this.dragging(true),\r\n onDragEnter: this.dragging(true),\r\n onDragLeave: this.dragging(false),\r\n onDrop: this.onFileDropped,\r\n };\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n {!!this.props.message\r\n ? \r\n : \r\n \r\n \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private renderUploadingProgress() {\r\n return (\r\n
    \r\n
    \r\n
    \r\n

    {this.props.intl.formatMessage({ id: \"posts.uploading\", defaultMessage: \"Uploading\" })}...

    \r\n {Object.keys(this.state.uploadStatus.fileProgress).map((k) => {\r\n return (\r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n })}\r\n

    \r\n {this.state.totalUploaded}/{this.state.totalToUpload} Uploaded\r\n

    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private renderUploadingError() {\r\n return (\r\n
    \r\n
    \r\n
    \r\n

    {this.props.intl.formatMessage({ id: \"posts.failedUpload\" })}

    \r\n

    \r\n \r\n

    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private renderUploadingAborted() {\r\n return (\r\n
    \r\n
    \r\n
    \r\n

    {this.props.intl.formatMessage({ id: \"posts.uploadCancelled\" })}

    \r\n

    \r\n \r\n

    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private dragging = (isDragging: boolean, callback?: () => void) => (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n if (typeof callback !== \"function\") callback = () => {};\r\n\r\n this.setState(\r\n {\r\n ...this.state,\r\n dragging: isDragging,\r\n },\r\n callback\r\n );\r\n return false;\r\n };\r\n\r\n private onFileDropped = (e: React.DragEvent) => {\r\n const files = e.dataTransfer.files;\r\n this.dragging(false, () => {\r\n this.uploadFiles(files);\r\n })(e);\r\n };\r\n\r\n private onFileInputChanged = (e: React.FormEvent) => {\r\n const files = (e.target as HTMLInputElement).files;\r\n this.dragging(false, () => {\r\n this.uploadFiles(files!);\r\n })(e);\r\n };\r\n\r\n private uploadFiles = async (files: FileList) => {\r\n if (files.length < 1) {\r\n this.SetError(this.props.intl.formatMessage({ id: \"posts.noFilesFound\" }));\r\n } else if (files.length > this.maxUploads || files.length > this.props.maxUploadable) {\r\n let max = Math.min(this.maxUploads, this.props.maxUploadable || this.maxUploads);\r\n this.SetError(`No more than ${max} file(s) can be uploaded`);\r\n } else {\r\n this.props.setUploading(true);\r\n this.setState(\r\n (prev) => ({\r\n ...prev,\r\n totalToUpload: files.length,\r\n totalUploaded: 0,\r\n uploadStatus: {\r\n ...prev.uploadStatus,\r\n fileProgress: Array.from(files).reduce((acc, val) => ({ [val.name]: 0 }), {}),\r\n },\r\n }),\r\n () => {\r\n let promises = [] as Promise[];\r\n this.resetUploadStatus();\r\n for (let i = 0; i < files.length; i++) {\r\n let file = files[i];\r\n\r\n /* https://stackoverflow.com/a/12900504 for the black magic below */\r\n let ext = file.name.slice((file.name.lastIndexOf(\".\") - 1 >>> 0) + 2) || \"No file extension found\";\r\n\r\n if (filenameContainsInvalidCharacters(file.name)) {\r\n this.SetError(`File name must not contain any special characters. Please reupload without the following characters: # / ? % * : | \" < >`)\r\n break;\r\n }\r\n\r\n if (this.props.documentType === SupportItemTypes.faq ||\r\n this.props.documentType === SupportItemTypes.knownIssue ||\r\n this.props.documentType === SupportItemTypes.releaseNote ||\r\n this.props.documentType === SupportItemTypes.releasePackage ||\r\n this.props.documentType === SupportItemTypes.training) {\r\n\r\n if (!fileUnderAllowedFileSize(file, 20)) {\r\n this.SetError(this.props.intl.formatMessage({id: \"posts.documentSizeLimit\"}, {size: '20MB'}));\r\n break;\r\n }\r\n\r\n if (isDocumentFileType(file)) {\r\n promises.push(this.uploadDocumentViaSupport(file));\r\n } else {\r\n this.SetError(\r\n this.props.intl.formatMessage(\r\n { id: \"unrecognizedFileType\", defaultMessage: \"File type not recognized: {fileType}\" },\r\n { fileType: ext }\r\n )\r\n );\r\n }\r\n }\r\n /* Deals with all other cases, such as posts */\r\n else {\r\n /* Media specific widget in posts */\r\n if (this.props.attachmentType === \"media\") {\r\n if (!fileUnderAllowedFileSize(file, 6)) {\r\n this.SetError(this.props.intl.formatMessage({ id: \"posts.imageSizeLimit\" }, { size: \"6MB\" }));\r\n break;\r\n }\r\n if (isImageType(file)) {\r\n promises.push(this.uploadImageViaPost(file)!);\r\n }\r\n else {\r\n this.SetError(\r\n this.props.intl.formatMessage(\r\n { id: \"unrecognizedFileType\", defaultMessage: \"File type not recognized: {fileType}\" },\r\n { fileType: ext }\r\n )\r\n );\r\n }\r\n /* Document specific widget in posts */\r\n } else if (this.props.attachmentType === \"files\") {\r\n if (!fileUnderAllowedFileSize(file, 20)) {\r\n this.SetError(this.props.intl.formatMessage({ id: \"posts.documentSizeLimit\" }, { size: \"20MB\" }));\r\n break;\r\n }\r\n\r\n if (isDocumentFileType(file)) {\r\n promises.push(this.uploadDocumentViaPost(file));\r\n } else {\r\n this.SetError(\r\n this.props.intl.formatMessage(\r\n { id: \"unrecognizedFileType\", defaultMessage: \"File type not recognized: {fileType}\" },\r\n { fileType: ext }\r\n )\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n Promise.all(promises)\r\n .then((results) => this.completedAll())\r\n .catch((error) => this.completedAll());\r\n }\r\n );\r\n }\r\n\r\n return false;\r\n };\r\n\r\n private uploadDocumentViaPost(file: File) {\r\n return this.props\r\n .upload(\r\n file,\r\n (p) => this.onUploadProgress(p, file.name),\r\n this.onUploadComplete,\r\n this.onUploadError,\r\n this.onUploadAborted\r\n )\r\n .then((response) => {\r\n if (!response) {\r\n this.setState((prev) => ({ ...prev, totalToUpload: prev.totalToUpload - 1 }));\r\n } else {\r\n this.setState((prev) => ({ ...prev, totalUploaded: prev.totalUploaded + 1 }));\r\n if (this.props.onDocumentComplete)\r\n this.props.onDocumentComplete(response.id, response.fileName);\r\n }\r\n }).catch(err => {\r\n this.SetError(\r\n this.props.intl.formatMessage(\r\n { defaultMessage: \"Failed to upload file '{file}'\"},\r\n { file: file.name }\r\n )\r\n );\r\n });\r\n }\r\n\r\n private uploadDocumentViaSupport(file: File) {\r\n return this.props\r\n .upload(\r\n file,\r\n (p) => this.onUploadProgress(p, file.name),\r\n this.onUploadComplete,\r\n this.onUploadError,\r\n this.onUploadAborted)\r\n .then(response => {\r\n if(!response){\r\n this.setState(prev => ({...prev, totalToUpload: prev.totalToUpload - 1}));\r\n }else{\r\n this.setState(prev => ({...prev, totalUploaded: prev.totalUploaded + 1}));\r\n if (this.props.onSupportDocumentComplete)\r\n this.props.onSupportDocumentComplete(response.id, response.fileName);\r\n }\r\n }).catch(err => {\r\n this.SetError(\r\n this.props.intl.formatMessage(\r\n { defaultMessage: \"Failed to upload file '{file}'\"},\r\n { file: file.name }\r\n )\r\n );\r\n });\r\n }\r\n\r\n private uploadImageViaPost(file: File) {\r\n return this.props\r\n .upload(\r\n file,\r\n (p) => this.onUploadProgress(p, file.name),\r\n this.onUploadComplete,\r\n this.onUploadError,\r\n this.onUploadAborted\r\n )\r\n .then((response) => {\r\n if (!response) {\r\n this.setState((prev) => ({ ...prev, totalToUpload: prev.totalToUpload - 1 }));\r\n } else {\r\n this.setState((prev) => ({ ...prev, totalUploaded: prev.totalUploaded + 1 }));\r\n if (this.props.completed)\r\n this.props.completed(response.id);\r\n }\r\n }).catch(err => {\r\n this.SetError(\r\n this.props.intl.formatMessage(\r\n { defaultMessage: \"Failed to upload file '{file}'\"},\r\n { file: file.name }\r\n )\r\n );\r\n });\r\n }\r\n\r\n private SetError(error: string) {\r\n errorAlert(error, 5000);\r\n }\r\n\r\n private completedAll = () => {\r\n this.props.setUploading(false);\r\n this.props.onAllComplete && this.props.onAllComplete();\r\n };\r\n\r\n private resetUploadStatus = () => {\r\n this.setState({\r\n ...this.state,\r\n uploadStatus: {\r\n ...this.state.uploadStatus,\r\n aborted: false,\r\n error: null,\r\n },\r\n });\r\n };\r\n\r\n private onUploadProgress = (percentCompleted: number, fileName: string) => {\r\n this.setState((prev) => ({\r\n ...prev,\r\n uploadStatus: {\r\n ...prev.uploadStatus,\r\n fileProgress: {\r\n ...prev.uploadStatus.fileProgress,\r\n [fileName]: percentCompleted,\r\n },\r\n },\r\n }));\r\n };\r\n\r\n private onUploadComplete = (e) => {};\r\n\r\n private onUploadError = (e) => {\r\n this.setState((prev) => ({\r\n ...prev,\r\n uploadStatus: {\r\n ...prev.uploadStatus,\r\n error: e.responseText,\r\n },\r\n }));\r\n };\r\n\r\n private onUploadAborted = (e) => {\r\n this.setState((prev) => ({\r\n ...prev,\r\n uploadStatus: {\r\n ...prev.uploadStatus,\r\n aborted: true,\r\n },\r\n }));\r\n };\r\n\r\n private acceptedFiles = () => {\r\n return \"image/jpg,image/jpeg,image/png,image/bmp,text/plain,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/msword,application/pdf,application/vnd.openxmlformats-officedocument.presentationml.presentation,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/zip,application/zip,application/x-zip-compressed\";\r\n };\r\n}\r\n\r\nexport const invalidCharactersArray = [\"#\", \"\\\\\", \"?\", \":\", \"|\", \"\\\"\", \"&\", \";\", \"@\", \"+\", \"=\"];\r\n\r\n// this array will match a string that contains any invalid filename characters in invalidCharactersArray\r\nexport const invalidCharactersRegex = new RegExp(`[${invalidCharactersArray.join()}]`);\r\n\r\nexport const filenameContainsInvalidCharacters = (filename: string) => {\r\n return invalidCharactersRegex.test(filename)\r\n}\r\n\r\nexport const isDocumentFileType = (file: File) => {\r\n return /^application\\/(vnd.openxmlformats-officedocument.wordprocessingml.document|vnd.openxmlformats-officedocument.presentationml.presentation|vnd.openxmlformats-officedocument.spreadsheetml.sheet|pdf)/.test(file.type) ||\r\n /^image\\/(jpg|jpeg|png)/.test(file.type) ||\r\n /^text\\/plain/.test(file.type);\r\n};\r\n\r\nexport const isImageType = (file: File) => {\r\n return /^image\\/(jpg|jpeg|png)/.test(file.type);\r\n};\r\n\r\nexport const isVideoType = (file: File) => {\r\n return /^video\\//.test(file.type);\r\n};\r\n\r\nexport const fileUnderAllowedFileSize = (file: File, mbSize: number = 6) => {\r\n return file.size < 1024 * mbSize * 1024;\r\n}\r\n\r\nexport default injectIntl(Uploader);\r\n","import * as actionCreator from \"./actionCreator\";\r\nimport * as reducer from \"./reducer.supportEditor\";\r\n\r\nexport const actions = {\r\n ...actionCreator\r\n}\r\n\r\nexport const reducers = {\r\n posts: reducer.reducer\r\n}\r\n\r\nexport * from \"./actions\"\r\nexport * from \"./models\"\r\n","export function assertFullfilled(item: PromiseSettledResult): item is PromiseFulfilledResult {\r\n return item.status === \"fulfilled\";\r\n}\r\n\r\nexport function assertObjectNotNullOrVoid(item: T | void | null | undefined): item is T {\r\n return typeof item === 'object' && item !== null && item !== undefined;\r\n}","import { useEffect, useState } from \"react\";\r\n\r\nexport interface DebounceState {\r\n debVal: T;\r\n setDebVal: React.Dispatch>;\r\n callbackIsRun: boolean;\r\n}\r\n\r\n// This function allows a callback function to debounce/delay the callback until the value has\r\n// stopped changing for a set amount of time set by timeoutInMs.\r\nexport function useDebounceValue(\r\n debounceValue: T, \r\n callbackFn: () => Promise, \r\n runFnFirst?: () => void,\r\n timeoutInMs: number = 750,\r\n runCallbackOnEmptyString: boolean = false\r\n): DebounceState {\r\n const [debVal, setDebVal] = useState(debounceValue);\r\n const [isFirstRun, setIsFirstRun] = useState(true);\r\n const [callbackIsRun, setCallbackIsRun] = useState(false);\r\n \r\n useEffect(() => {\r\n setCallbackIsRun(false);\r\n if (runFnFirst) runFnFirst();\r\n\r\n if (debVal !== undefined && debVal !== null && (runCallbackOnEmptyString || debVal !== \"\") && !isFirstRun) {\r\n const timeoutId = setTimeout(async () => {\r\n await callbackFn();\r\n setCallbackIsRun(true);\r\n }, timeoutInMs);\r\n\r\n return () => clearTimeout(timeoutId);\r\n }\r\n\r\n if (isFirstRun) setIsFirstRun(false);\r\n }, [debVal]);\r\n\r\n return {debVal, setDebVal, callbackIsRun};\r\n}","import { useState, useRef, useEffect, useCallback, useMemo } from \"react\";\r\nimport { ConsolidatedDuplicateFiles, CustomFileData, DuplicateFiles, FileUploadAction, MediaFile, MoveFiles, MoveFilesWithSrc, VerifiedFile, Image, VerifiedMoveFiles, DuplicateFileData, ImageUploadReturn, VerifiedFileData, FilterGroupName, SortGroupName } from \"./models\";\r\nimport { ChonkyActions, FileAction, FileArray, MapFileActionsToData } from \"chonky\";\r\nimport { CurrentUserSettings } from \"modules/settings\";\r\nimport { CustomActionUnion, ascSortAction, customFileActions, defaultFileActions, deleteSelectionAction, descSortAction, disabledCreateFolder, disabledOpenFileAction, disabledRenameFileAction, getFilterFileActions, getSortFileActions, moveFileAction, newestSortAction, oldestSortAction, openFileAction, renameFileAction, toggleShowFoldersFirst, viewAllImagesAction, viewMyImagesAction } from \"./customChonkyFileActions\";\r\nimport { ROOT_FOLDER_ID, imageExtFromMimeType } from \"./chonkyFileAdapter\";\r\nimport { UploadStatus, fileUnderAllowedFileSize, filenameContainsInvalidCharacters, invalidCharactersArray, invalidCharactersRegex, isImageType } from \"modules/common/components/authoring/uploader/uploader\";\r\nimport { assertFullfilled, assertObjectNotNullOrVoid } from \"utils/assertHelpers\";\r\nimport { DebounceState, useDebounceValue } from \"utils/debounceHook\";\r\n\r\nexport const useCustomFileMap = (rootFolderid: string) => {\r\n const [currentFolderId, setCurrentFolderId] = useState(rootFolderid);\r\n\r\n const currentFolderIdRef = useRef(currentFolderId);\r\n useEffect(() => {\r\n currentFolderIdRef.current = currentFolderId;\r\n }, [currentFolderId]);\r\n\r\n return {\r\n currentFolderId,\r\n setCurrentFolderId,\r\n };\r\n};\r\n\r\nexport const useFiles = (\r\n fileMap: Record,\r\n currentFolderId: string\r\n): FileArray => {\r\n return useMemo(() => {\r\n let fileMapKeys = Object.keys(fileMap);\r\n\r\n if (fileMapKeys.length) {\r\n const currentFolder = fileMap[currentFolderId];\r\n\r\n if (currentFolder) {\r\n const childrenIds = currentFolder.childrenIds ?? [];\r\n const files = childrenIds\r\n .filter((fileId: string) => fileMapKeys.includes(fileId))\r\n .map((fileId: string) => {\r\n let file = fileMap[fileId];\r\n\r\n if (!file.isDir && file.color === undefined)\r\n file.color = '#dde1e5';\r\n\r\n if (file.isDir && file.thumbnailUrl !== undefined)\r\n file.thumbnailUrl = undefined;\r\n\r\n return file;\r\n });\r\n \r\n return files;\r\n }\r\n }\r\n \r\n return [];\r\n }, [fileMap, currentFolderId]);\r\n};\r\n\r\nexport const useFolderChain = (\r\n fileMap: Record,\r\n customFolderChain: CustomFileData[],\r\n): FileArray => {\r\n const useFolderChainMemo = useMemo(() => {\r\n const folderChain: CustomFileData[] = [fileMap[ROOT_FOLDER_ID], ...customFolderChain];\r\n\r\n return folderChain;\r\n }, [customFolderChain, fileMap]);\r\n\r\n return useFolderChainMemo;\r\n};\r\n\r\nexport const useFileActionHandler = (\r\n onSingleSelect: (mediaFile: CustomFileData) => void,\r\n onMultiSelect: (mediaFiles: CustomFileData[]) => void,\r\n setIsGridView: React.Dispatch>,\r\n setSelectedFiles: React.Dispatch>>,\r\n onFilterChange: (sortType?: SortGroupName, filterType?: FilterGroupName, showFoldersFirst?: boolean) => void,\r\n setOpenCreateFolderDialog: React.Dispatch>,\r\n showFoldersFirstToggle: boolean,\r\n imagesGalleryMap: Record,\r\n currentUser: CurrentUserSettings,\r\n onCurrentFolderChange: (folderId: string) => void,\r\n setOpenRenameDialog: React.Dispatch>,\r\n setFileToRename: React.Dispatch>,\r\n setFilesToDelete: React.Dispatch>,\r\n verifyMediaForMove: (mediaFiles: MoveFiles) => Promise,\r\n setIsInnerDragNDrop: React.Dispatch>,\r\n setShowMoveFilesAppBar: React.Dispatch>,\r\n attachDeleteClassNamesOnNextFrame: () => void,\r\n currDir?: MediaFile,\r\n singleClickFileSelect?: boolean,\r\n onSingleClickSelect?: (mediaFile: CustomFileData) => void,\r\n) => {\r\n return useCallback(\r\n (data: MapFileActionsToData) => {\r\n switch(data.id) {\r\n case ChonkyActions.OpenFiles.id:\r\n const { targetFile, files } = data.payload;\r\n\r\n if (files.length === 1) {\r\n let fileToOpen = targetFile ?? files[0];\r\n \r\n if (fileToOpen.isDir) {\r\n onCurrentFolderChange(fileToOpen.id);\r\n }\r\n else if (fileToOpen.id in imagesGalleryMap) {\r\n onSingleSelect(imagesGalleryMap[fileToOpen.id]);\r\n }\r\n }\r\n else if (files.length > 1) {\r\n let existingFiles = files.map((x) => imagesGalleryMap[x.id]);\r\n onMultiSelect(existingFiles);\r\n }\r\n break;\r\n case ChonkyActions.MoveFiles.id:\r\n verifyMediaForMove({filesToMove: data.payload.files, moveDest: data.payload.destination, moveSrc: data.payload.source});\r\n break;\r\n case ChonkyActions.CreateFolder.id:\r\n setOpenCreateFolderDialog(true);\r\n break;\r\n case ChonkyActions.EnableListView.id:\r\n setIsGridView(false);\r\n break;\r\n case ChonkyActions.EnableGridView.id:\r\n setIsGridView(true);\r\n break;\r\n case ChonkyActions.ChangeSelection.id:\r\n setSelectedFiles(data.payload.selection);\r\n break;\r\n case ascSortAction(SortGroupName.Az).id:\r\n onFilterChange(SortGroupName.Az);\r\n break;\r\n case descSortAction(SortGroupName.Az).id:\r\n onFilterChange(SortGroupName.Za);\r\n break;\r\n case newestSortAction(SortGroupName.Az).id:\r\n onFilterChange(SortGroupName.Newest);\r\n break;\r\n case oldestSortAction(SortGroupName.Az).id:\r\n onFilterChange(SortGroupName.Oldest);\r\n break;\r\n case toggleShowFoldersFirst(SortGroupName.Az).id:\r\n onFilterChange(undefined, undefined, !showFoldersFirstToggle);\r\n break;\r\n case viewMyImagesAction(FilterGroupName.AllImages, currentUser.userId).id:\r\n onFilterChange(undefined, FilterGroupName.MyImages);\r\n break;\r\n case viewAllImagesAction(FilterGroupName.AllImages).id:\r\n onFilterChange(undefined, FilterGroupName.AllImages);\r\n break;\r\n case renameFileAction.id:\r\n setFileToRename(data.state.selectedFilesForAction[0]);\r\n setOpenRenameDialog(true);\r\n break;\r\n case deleteSelectionAction.id:\r\n setFilesToDelete(data.state.selectedFilesForAction!);\r\n break;\r\n case moveFileAction.id:\r\n setShowMoveFilesAppBar({ filesToMove: data.state.selectedFilesForAction!, moveSrc: currDir ?? null});\r\n break;\r\n case ChonkyActions.StartDragNDrop.id:\r\n setIsInnerDragNDrop(true);\r\n break;\r\n case ChonkyActions.EndDragNDrop.id:\r\n setIsInnerDragNDrop(false);\r\n break;\r\n case ChonkyActions.MouseClickFile.id:\r\n if (\r\n data.payload.clickType === \"single\" && \r\n singleClickFileSelect && \r\n onSingleClickSelect &&\r\n !data.payload.file.isDir\r\n ) {\r\n onSingleClickSelect(data.payload.file);\r\n }\r\n break;\r\n case ChonkyActions.OpenFileContextMenu.id:\r\n attachDeleteClassNamesOnNextFrame();\r\n }\r\n },\r\n [\r\n onSingleSelect,\r\n onMultiSelect,\r\n setIsGridView,\r\n setSelectedFiles,\r\n onFilterChange,\r\n setOpenCreateFolderDialog,\r\n showFoldersFirstToggle,\r\n imagesGalleryMap,\r\n currentUser,\r\n onCurrentFolderChange,\r\n setOpenRenameDialog,\r\n setFileToRename,\r\n setFilesToDelete,\r\n verifyMediaForMove,\r\n setIsInnerDragNDrop,\r\n setShowMoveFilesAppBar,\r\n attachDeleteClassNamesOnNextFrame,\r\n currDir,\r\n singleClickFileSelect,\r\n onSingleClickSelect,\r\n ]\r\n );\r\n};\r\n\r\nexport const useFileActions = (\r\n selectedFiles: Set,\r\n currSortGroupName: SortGroupName,\r\n currFilterGroupName: FilterGroupName,\r\n userId: string,\r\n toggleShowFoldersFirst: boolean,\r\n searchValue: string,\r\n disableActions?: boolean,\r\n): FileAction[] => {\r\n return useMemo(() => {\r\n return [\r\n ...disableActions ? [] : !!searchValue ? [disabledCreateFolder] : [ChonkyActions.CreateFolder],\r\n ...defaultFileActions,\r\n ...disableActions ? [] : [\r\n selectedFiles.size === 1 ? openFileAction : disabledOpenFileAction,\r\n selectedFiles.size === 1 ? renameFileAction : disabledRenameFileAction,\r\n ],\r\n ...getSortFileActions(currSortGroupName, toggleShowFoldersFirst),\r\n ...getFilterFileActions(currFilterGroupName, userId),\r\n ...disableActions ? [] : customFileActions,\r\n ]\r\n },\r\n [\r\n disableActions,\r\n selectedFiles,\r\n currSortGroupName,\r\n toggleShowFoldersFirst,\r\n currFilterGroupName,\r\n userId,\r\n searchValue\r\n ]\r\n );\r\n}\r\n\r\nexport const useNewFolderDebounceValue = (\r\n setFolderNameChecked: (value: React.SetStateAction) => void,\r\n setFolderError: (value: React.SetStateAction) => void,\r\n fetchFolderByName: (fileName: string, parentId?: string | undefined) => Promise,\r\n currDirId?: string,\r\n): DebounceState => {\r\n const newFolderValueDebounce = useDebounceValue(\r\n \"\",\r\n async () => {\r\n try {\r\n if (filenameContainsInvalidCharacters(newFolderValueDebounce.debVal)) {\r\n setFolderError(`Invalid characters (${invalidCharactersArray.join(\", \")})`);\r\n }\r\n else {\r\n const existingFolder = await fetchFolderByName(newFolderValueDebounce.debVal, currDirId);\r\n setFolderError(existingFolder !== undefined ? \"Folder name already exists\" : \"\");\r\n }\r\n }\r\n catch {\r\n setFolderError(\"Invalid folder name.\");\r\n }\r\n finally {\r\n setFolderNameChecked(true);\r\n }\r\n },\r\n () => {\r\n setFolderNameChecked(false);\r\n setFolderError(\"\");\r\n }\r\n );\r\n\r\n return newFolderValueDebounce;\r\n}\r\n\r\nexport const useRenameDebounceValue = (\r\n fileToRename: CustomFileData | null,\r\n fetchFolderByName: (fileName: string, parentId?: string | undefined) => Promise,\r\n fetchImageByName: (filename: string, type: string, parentId?: string | undefined) => Promise,\r\n setRenameError: (value: React.SetStateAction) => void,\r\n setRenameChecked: (value: React.SetStateAction) => void,\r\n currDirId?: string,\r\n): DebounceState => {\r\n const renameValueDebounce = useDebounceValue(\r\n \"\",\r\n async () => {\r\n if (renameValueDebounce.debVal && fileToRename) {\r\n try {\r\n const existingFile = fileToRename.isDir \r\n ? await fetchFolderByName(renameValueDebounce.debVal, currDirId)\r\n : await fetchImageByName(`${renameValueDebounce.debVal}${imageExtFromMimeType(fileToRename.mimeType)}`, fileToRename.mimeType ?? \"image/*\", currDirId);\r\n \r\n setRenameError(existingFile !== undefined);\r\n }\r\n catch {\r\n setRenameError(true);\r\n }\r\n finally {\r\n setRenameChecked(true);\r\n } \r\n }\r\n },\r\n () => { setRenameError(false); setRenameChecked(false); }\r\n );\r\n\r\n return renameValueDebounce;\r\n}\r\n\r\nexport const useDragEventDebounce = (\r\n isInnerDragNDrop: boolean,\r\n showDragDropOverlay: boolean,\r\n setShowDragDropOverlay: React.Dispatch>\r\n): DebounceState | null> => {\r\n const dragEventDebounce = useDebounceValue(\r\n null as React.DragEvent | null,\r\n async () => {\r\n if (dragEventDebounce.debVal && !isInnerDragNDrop) {\r\n dragEventDebounce.debVal.preventDefault();\r\n if (!showDragDropOverlay) setShowDragDropOverlay(true);\r\n }\r\n else {\r\n setShowDragDropOverlay(false);\r\n }\r\n },\r\n undefined,\r\n 500\r\n );\r\n\r\n return dragEventDebounce;\r\n}\r\n\r\nexport const useGridViewDebounce = (\r\n showMediaGalleryGridView: boolean,\r\n saveUserSettings: (userSettings: Partial, shouldDispatchUpdates?: boolean) => Promise,\r\n currentUser: CurrentUserSettings\r\n): DebounceState => {\r\n const isGridViewDebounce = useDebounceValue(\r\n showMediaGalleryGridView,\r\n async () => {\r\n if (isGridViewDebounce.debVal !== currentUser.showMediaGalleryGridView)\r\n await saveUserSettings({...currentUser, showMediaGalleryGridView: isGridViewDebounce.debVal});\r\n }\r\n )\r\n\r\n return isGridViewDebounce;\r\n}\r\n\r\nexport const useSearchValueDebounce = (\r\n searchValue: string,\r\n runCallbackOnEmptyString: boolean,\r\n setCurrentFolderId: React.Dispatch>,\r\n fetchImages: (newPageAmount?: number, newPageNumber?: number, parentId?: string, searchString?: string) => Promise,\r\n): DebounceState => {\r\n const searchValueDebounce = useDebounceValue(\r\n searchValue,\r\n async () => fetchImages(undefined, undefined, undefined, searchValueDebounce.debVal),\r\n () => setCurrentFolderId(ROOT_FOLDER_ID),\r\n undefined,\r\n runCallbackOnEmptyString\r\n )\r\n\r\n return searchValueDebounce;\r\n}\r\n\r\nexport const useFileUploadFunctions = (\r\n maxNumUploads: number,\r\n maxUploadMbSize: number,\r\n onErrorMessage: (errorMsg: string) => void,\r\n onSuccessMessage: (errorMsg: string) => void,\r\n fetchImageByName: (filename: string, type: string, parentId?: string | undefined) => Promise,\r\n fetchImageByNameAsFileData: (filename: string, type: string, parentId?: string | undefined, asChonkyFileData?: boolean | undefined) => Promise,\r\n fetchFolderByNameAsFileData: (fileName: string, parentId?: string | undefined, asChonkyFileData?: boolean | undefined) => Promise,\r\n deleteFolderByName: (folderName: string, parentId?: string | undefined) => Promise,\r\n deleteImagesFromLibrary: (imageIds: string[]) => Promise,\r\n getUniqueFolderName: (folderName: string, parentId?: string | undefined) => Promise,\r\n getUniqueFileName: (filename: string, type: string, parentId?: string | undefined, abortSignal?: AbortSignal | undefined) => Promise,\r\n renameFolder: (id: string, newFolderName: string) => Promise,\r\n renameImage: (id: string, newFileName: string) => Promise,\r\n moveMedia: (movePayload: MoveFiles) => Promise,\r\n fetchImages: (newPageAmount?: number, newPageNumber?: number, parentId?: string, searchString?: string) => Promise,\r\n deleteImageByName: (filename: string, type: string, parentId?: string | undefined, abortSignal?: AbortSignal | undefined) => Promise,\r\n uploadImage: (\r\n file: File, \r\n onProgress: (percentCompleted: number) => void, \r\n onLoad?: ((e: ProgressEvent, xhr: XMLHttpRequest) => void) | undefined, \r\n onError?: ((e: ProgressEvent, xhr: XMLHttpRequest) => void) | undefined, \r\n onAbort?: ((e: ProgressEvent, xhr: XMLHttpRequest) => void) | undefined, parentId?: string, abortSignal?: AbortSignal\r\n ) => Promise | null>,\r\n setUploading: (uploading: boolean) => void,\r\n currDir?: MediaFile,\r\n onUploadedImages?: (mediaFiles: CustomFileData[]) => void,\r\n clearExternalFilesToUpload?: () => void,\r\n) => {\r\n const [invalidFiles, setInvalidFiles] = useState([]);\r\n const [showInvalidFilesConfirmDialog, setShowInvalidFilesConfirmDialog] = useState(false);\r\n const [verifiedFileData, setVerifiedFileData] = useState({ filesToMove: [], moveDest: null, moveSrc: null });\r\n const [duplicateFileData, setDuplicateFileData] = useState([]);\r\n const [totalToUpload, setTotalToUpload] = useState(0);\r\n const [totalUploaded, setTotalUploaded] = useState(0);\r\n const abortController = useRef(new AbortController());\r\n const [uploadStatus, setUploadStatus] = useState({ aborted: false, error: null, fileProgress: {} });\r\n const uploadedImageIds = useRef>(new Set());\r\n const [duplicateFilesDirName, setDuplicateFilesDirName] = useState(\"\");\r\n const [verifiedFiles, setVerifiedFiles] = useState([]);\r\n const [duplicateFiles, setDuplicateFiles] = useState([]);\r\n const [consolidatedDuplicateFiles, setConsolidatedDuplicateFiles] = useState([]);\r\n const [shouldUploadFiles, setShouldUploadFiles] = useState(false);\r\n const [onInvalidFilesDialogConfirm, setOnInvalidFilesDialogConfirm] = useState<() => void>(() => () => {});\r\n const [showDuplicateFilesConfirmDialog, setShowDuplicateFilesConfirmDialog] = useState(false);\r\n const [applyActionToAllDuplicates, setApplyActionToAllDuplicates] = useState(false);\r\n\r\n const verifyUploadFiles = async (fileList: FileList) => {\r\n const files = Array.from(fileList).slice(0, maxNumUploads);\r\n let verifiedFilesList: VerifiedFile[] = [];\r\n let invalidFilesList: File[] = fileList.length <= maxNumUploads \r\n ? []\r\n : Array.from(fileList).slice(maxNumUploads, fileList.length);\r\n let duplicateFilesList: DuplicateFiles[] = [];\r\n\r\n if (files.length < 1) {\r\n onErrorMessage(\"No files to upload.\");\r\n return;\r\n }\r\n\r\n setDuplicateFilesDirName(currDir?.name ?? \"Media Library\");\r\n\r\n await Promise.allSettled(\r\n files.map(async afile => {\r\n let file = afile;\r\n if (!fileUnderAllowedFileSize(file, maxUploadMbSize)) {\r\n invalidFilesList.push(file);\r\n return;\r\n }\r\n\r\n if (!isImageType(file)) {\r\n invalidFilesList.push(file);\r\n return;\r\n }\r\n \r\n if (filenameContainsInvalidCharacters(file.name)) {\r\n let renamedFile = new File([file], file.name.replace(invalidCharactersRegex, \"\"), {type: file.type});\r\n file = renamedFile;\r\n }\r\n\r\n let existingImage = await fetchImageByName(file.name, file.type, currDir?.id);\r\n if (existingImage) {\r\n duplicateFilesList.push({\r\n newFile: file,\r\n duplicateImage: existingImage,\r\n });\r\n }\r\n else {\r\n verifiedFilesList.push({\r\n file,\r\n action: FileUploadAction.New\r\n });\r\n }\r\n })\r\n );\r\n\r\n const consolidatedDuplicateFilesList: ConsolidatedDuplicateFiles[] = duplicateFilesList.map(x => {\r\n return {\r\n newFile: { name: x.newFile.name, id: x.newFile.name, url: window.URL.createObjectURL(x.newFile) },\r\n duplicateFile: { name: x.duplicateImage.name, id: x.duplicateImage.id, url: x.duplicateImage.url}\r\n } as ConsolidatedDuplicateFiles\r\n });\r\n\r\n setInvalidFiles(invalidFilesList);\r\n setVerifiedFiles(verifiedFilesList);\r\n setDuplicateFiles(duplicateFilesList);\r\n setConsolidatedDuplicateFiles(consolidatedDuplicateFilesList);\r\n setShouldUploadFiles(true);\r\n\r\n if (invalidFilesList.length > 0 && duplicateFilesList.length > 0) {\r\n // first show invalid files modal and then duplicate files modal\r\n setShowInvalidFilesConfirmDialog(true);\r\n setOnInvalidFilesDialogConfirm(() => () => {\r\n setShowInvalidFilesConfirmDialog(false);\r\n setInvalidFiles([]);\r\n setOnInvalidFilesDialogConfirm(() => () => {});\r\n setShowDuplicateFilesConfirmDialog(true);\r\n });\r\n }\r\n else if (invalidFilesList.length > 0) {\r\n setShowInvalidFilesConfirmDialog(true);\r\n setOnInvalidFilesDialogConfirm(() => () => {\r\n setShowInvalidFilesConfirmDialog(false);\r\n uploadFiles(verifiedFilesList);\r\n })\r\n }\r\n else if (duplicateFilesList.length > 0) {\r\n setShowDuplicateFilesConfirmDialog(true);\r\n }\r\n else {\r\n await uploadFiles(verifiedFilesList);\r\n }\r\n };\r\n\r\n const verifyMediaForMove = async (mediaFiles: MoveFiles) => {\r\n let verifiedFileDataObj: VerifiedMoveFiles = {\r\n filesToMove: [],\r\n moveSrc: mediaFiles.moveSrc,\r\n moveDest: mediaFiles.moveDest,\r\n }\r\n let duplicateFileDataList: DuplicateFileData[] = [];\r\n\r\n if (mediaFiles.filesToMove.length < 1) {\r\n onErrorMessage(\"No files to upload.\");\r\n return;\r\n }\r\n\r\n setDuplicateFilesDirName(currDir?.name ?? \"Media Library\");\r\n\r\n await Promise.allSettled(\r\n mediaFiles.filesToMove.map(async media => {\r\n let existingFileData = media.isDir \r\n ? await fetchFolderByNameAsFileData(media.name, mediaFiles.moveDest?.id)\r\n : await fetchImageByNameAsFileData(media.name, media.mimeType ?? \"image/*\", mediaFiles.moveDest?.id);\r\n\r\n if (existingFileData) {\r\n duplicateFileDataList.push({\r\n fileDataToMove: media,\r\n duplicateFileData: existingFileData,\r\n });\r\n }\r\n else {\r\n verifiedFileDataObj.filesToMove.push({file: media, action: FileUploadAction.Move});\r\n }\r\n })\r\n );\r\n\r\n const consolidatedDuplicateFilesList: ConsolidatedDuplicateFiles[] = duplicateFileDataList.map(x => {\r\n return {\r\n newFile: { name: x.fileDataToMove.name, id: x.fileDataToMove.id, url: x.fileDataToMove.thumbnailUrl },\r\n duplicateFile: { name: x.duplicateFileData.name, id: x.duplicateFileData.id, url: x.duplicateFileData.thumbnailUrl},\r\n isDir: x.fileDataToMove.isDir\r\n } as ConsolidatedDuplicateFiles\r\n });\r\n\r\n setVerifiedFileData(verifiedFileDataObj);\r\n setDuplicateFileData(duplicateFileDataList);\r\n setConsolidatedDuplicateFiles(consolidatedDuplicateFilesList);\r\n setShouldUploadFiles(true);\r\n\r\n if (duplicateFileDataList.length > 0) {\r\n setShowDuplicateFilesConfirmDialog(true);\r\n }\r\n else {\r\n moveFiles(verifiedFileDataObj);\r\n }\r\n }\r\n\r\n const moveFiles = async (allVerifiedFileData: VerifiedMoveFiles) => {\r\n setShouldUploadFiles(false);\r\n if (allVerifiedFileData.filesToMove.length > 0) {\r\n await Promise.allSettled(\r\n [\r\n ...allVerifiedFileData.filesToMove.map(async fileData => {\r\n if (fileData.action === FileUploadAction.Replace) {\r\n fileData.file.isDir \r\n ? await deleteFolderByName(fileData.file.name, allVerifiedFileData.moveDest?.id)\r\n : await deleteImagesFromLibrary([fileData.file.id]);\r\n }\r\n else if (fileData.action === FileUploadAction.Rename) {\r\n let newFileName = fileData.file.isDir \r\n ? await getUniqueFolderName(fileData.file.name, allVerifiedFileData.moveDest?.id)\r\n : await getUniqueFileName(fileData.file.name, fileData.file.mimeType ?? \"image/*\", allVerifiedFileData.moveDest?.id);\r\n\r\n fileData.file.isDir \r\n ? await renameFolder(fileData.file.id, newFileName)\r\n : await renameImage(fileData.file.id, newFileName);\r\n }\r\n })\r\n ]\r\n );\r\n\r\n await moveMedia({\r\n filesToMove: allVerifiedFileData.filesToMove.map(fileData => fileData.file),\r\n moveDest: allVerifiedFileData.moveDest,\r\n moveSrc: allVerifiedFileData.moveSrc\r\n });\r\n\r\n resetAllFilesUploadState();\r\n fetchImages();\r\n }\r\n }\r\n\r\n const uploadFile = async (file: File): Promise | null> => {\r\n return uploadImage(\r\n file,\r\n (p) => onXhrUploadProgress(p, file.name),\r\n (e, xhr) => onXhrUploadComplete(e, xhr, file.name),\r\n (e, xhr) => onXhrUploadError(e, xhr, file.name),\r\n (e, xhr) => onXhrUploadAborted(e, xhr, file.name),\r\n currDir?.id,\r\n abortController.current.signal\r\n )\r\n .then((response) => {\r\n if (!response) {\r\n setTotalToUpload(prev => prev - 1);\r\n } else {\r\n setTotalUploaded(prev => prev + 1);\r\n }\r\n\r\n return response;\r\n })\r\n .catch(_ => onErrorMessage(`Failed to upload file '${file.name}'`));\r\n }\r\n\r\n const onXhrUploadProgress = (percentCompleted: number, fileName: string) => {};\r\n\r\n const onXhrUploadComplete = (e: ProgressEvent, xhr: XMLHttpRequest, fileName: string) => { };\r\n\r\n const onXhrUploadError = (e: ProgressEvent, xhr: XMLHttpRequest, fileName: string) => {\r\n setUploadStatus({...uploadStatus, error: xhr.responseText});\r\n onErrorMessage(`File ${fileName} could not be uploaded`);\r\n };\r\n\r\n const onXhrUploadAborted = (e: ProgressEvent, xhr: XMLHttpRequest, fileName: string) => {\r\n setUploadStatus({...uploadStatus, aborted: true, error: xhr.responseText});\r\n onErrorMessage(`File upload for ${fileName} was aborted`);\r\n };\r\n\r\n const uploadVerifiedFile = async (verifiedFile: VerifiedFile) => {\r\n let fileToUpload: File = verifiedFile.file;\r\n if (verifiedFile.action === FileUploadAction.Replace) {\r\n await deleteImageByName(verifiedFile.file.name, verifiedFile.file.type, currDir?.id, abortController.current.signal);\r\n }\r\n else if (verifiedFile.action === FileUploadAction.Rename) {\r\n let newFileName = await getUniqueFileName(verifiedFile.file.name, verifiedFile.file.type,currDir?.id, abortController.current.signal)\r\n let renamedFile = new File([verifiedFile.file], newFileName, {type: verifiedFile.file.type});\r\n fileToUpload = renamedFile;\r\n }\r\n return await uploadFile(fileToUpload);\r\n }\r\n\r\n const uploadFiles = async (verifiedFilesList: VerifiedFile[]) => {\r\n setShouldUploadFiles(false);\r\n if (verifiedFilesList.length > 0) {\r\n setTotalToUpload(verifiedFilesList.length);\r\n setTotalUploaded(0);\r\n setUploadStatus({...uploadStatus, fileProgress: Array.from(verifiedFilesList).reduce((acc, val) => ({ [val.file.name]: 0 }), {})});\r\n\r\n await Promise\r\n .allSettled(verifiedFilesList.flatMap(file => uploadVerifiedFile(file)!))\r\n .then(results => completedUpload(true, results))\r\n .catch((error) => completedUpload(false));\r\n }\r\n };\r\n\r\n const completedUpload = async (successful: boolean, uploadedImages?: PromiseSettledResult | null>[]) => {\r\n setUploading(false);\r\n\r\n await fetchImages();\r\n\r\n if (onUploadedImages && uploadedImages) {\r\n uploadedImageIds.current = new Set(\r\n uploadedImages\r\n .filter(assertFullfilled)\r\n .map(i => i.value?.id)\r\n .filter(assertObjectNotNullOrVoid)\r\n );\r\n }\r\n\r\n if (successful) {\r\n onSuccessMessage(\"Successfully added new images.\");\r\n }\r\n else if (!abortController.current.signal.aborted) {\r\n onErrorMessage(\"Images were not able to be uploaded. Please try again later.\");\r\n }\r\n \r\n resetAllFilesUploadState();\r\n };\r\n\r\n const popLastDuplicateFile = (): void => {\r\n if (duplicateFiles.length > 0) {\r\n let remainingDupFiles = [...duplicateFiles].slice(1);\r\n setDuplicateFiles(remainingDupFiles);\r\n setConsolidatedDuplicateFiles([...consolidatedDuplicateFiles].slice(1));\r\n }\r\n else if (duplicateFileData.length > 0) {\r\n let remainingDupFileData = [...duplicateFileData].slice(1);\r\n setDuplicateFileData(remainingDupFileData);\r\n setConsolidatedDuplicateFiles([...consolidatedDuplicateFiles].slice(1));\r\n }\r\n }\r\n\r\n const hideDuplicateDialogAndUploadFiles = () => {\r\n setShowDuplicateFilesConfirmDialog(false);\r\n if (verifiedFiles.length > 0 && verifiedFileData.filesToMove.length === 0) {\r\n uploadFiles(verifiedFiles);\r\n }\r\n else if (verifiedFileData.filesToMove.length > 0) {\r\n moveFiles(verifiedFileData);\r\n }\r\n }\r\n\r\n const onDuplicateDialogAction = (action: FileUploadAction) => {\r\n if (applyActionToAllDuplicates) {\r\n if (duplicateFiles.length > 0) {\r\n let newVerifiedFiles: VerifiedFile[] = [];\r\n duplicateFiles.forEach(dupFile => newVerifiedFiles.push({file: dupFile.newFile, action}));\r\n let allVerifiedFiles = [...verifiedFiles, ...newVerifiedFiles];\r\n setVerifiedFiles([...verifiedFiles, ...newVerifiedFiles]);\r\n setShowDuplicateFilesConfirmDialog(false);\r\n setDuplicateFiles([]);\r\n setConsolidatedDuplicateFiles([]);\r\n uploadFiles(allVerifiedFiles);\r\n }\r\n else if (duplicateFileData.length > 0) {\r\n let newVerifiedFileData: VerifiedFileData[] = [];\r\n duplicateFileData.forEach(dupFileData => newVerifiedFileData.push({file: dupFileData.fileDataToMove, action}));\r\n let allVerifiedFileData = {...verifiedFileData, filesToMove: [...verifiedFileData.filesToMove, ...newVerifiedFileData]};\r\n setVerifiedFileData(allVerifiedFileData);\r\n setShowDuplicateFilesConfirmDialog(false);\r\n setDuplicateFileData([]);\r\n setConsolidatedDuplicateFiles([]);\r\n moveFiles(allVerifiedFileData);\r\n }\r\n setApplyActionToAllDuplicates(false);\r\n }\r\n else {\r\n if (duplicateFiles.length > 0) {\r\n const fileToReplace = duplicateFiles[0].newFile;\r\n const newVerifiedFiles = [...verifiedFiles, {file: fileToReplace, action}];\r\n setVerifiedFiles(newVerifiedFiles);\r\n popLastDuplicateFile();\r\n }\r\n else if (duplicateFileData.length > 0) {\r\n const fileDataToReplace = duplicateFileData[0].fileDataToMove;\r\n setVerifiedFileData({...verifiedFileData, filesToMove: [...verifiedFileData.filesToMove, {file: fileDataToReplace, action}]});\r\n popLastDuplicateFile();\r\n }\r\n }\r\n }\r\n\r\n const resetAllFilesUploadState = () => {\r\n setShouldUploadFiles(false);\r\n setVerifiedFiles([]);\r\n setVerifiedFileData({ filesToMove: [], moveDest: null, moveSrc: null });\r\n\r\n setShowInvalidFilesConfirmDialog(false);\r\n setShowDuplicateFilesConfirmDialog(false);\r\n setInvalidFiles([]);\r\n setDuplicateFileData([]);\r\n setOnInvalidFilesDialogConfirm(() => () => {});\r\n setConsolidatedDuplicateFiles([]);\r\n setDuplicateFilesDirName(\"\");\r\n setTotalToUpload(0);\r\n setTotalUploaded(0);\r\n if (clearExternalFilesToUpload) clearExternalFilesToUpload();\r\n abortController.current = new AbortController();\r\n }\r\n\r\n useEffect(() => {\r\n if (\r\n shouldUploadFiles && \r\n (\r\n (duplicateFiles.length === 0 && verifiedFiles.length > 0 ) ||\r\n (duplicateFileData.length === 0 && verifiedFileData.filesToMove.length > 0)\r\n )\r\n ) {\r\n hideDuplicateDialogAndUploadFiles();\r\n }\r\n }, [duplicateFiles.length, duplicateFileData.length]);\r\n\r\n return {\r\n invalidFiles,\r\n duplicateFilesDirName,\r\n verifiedFiles,\r\n duplicateFiles,\r\n consolidatedDuplicateFiles,\r\n showDuplicateFilesConfirmDialog,\r\n showInvalidFilesConfirmDialog,\r\n totalToUpload,\r\n totalUploaded,\r\n applyActionToAllDuplicates,\r\n setApplyActionToAllDuplicates,\r\n hideDuplicateDialogAndUploadFiles,\r\n verifyUploadFiles,\r\n verifyMediaForMove,\r\n resetAllFilesUploadState,\r\n popLastDuplicateFile,\r\n onInvalidFilesDialogConfirm,\r\n onDuplicateDialogAction\r\n }\r\n}","import * as React from \"react\";\r\nimport { Button, Dialog, DialogActions, DialogContent, Slide } from \"@mui/material\";\r\nimport { TransitionProps } from \"@mui/material/transitions\";\r\n\r\nimport \"../styles/guidelineHint.sass\"\r\n\r\ninterface IGuidelineHintProps {\r\n open: boolean;\r\n onClose: () => void;\r\n hintType: HintType;\r\n}\r\n\r\nexport enum HintType {\r\n Post = \"post\",\r\n Event = \"event\"\r\n}\r\n\r\nconst HINT_HEADER = \"Revisit the guidelines here!\";\r\nconst HINT_DESCRIPTION = \"Click the book icon in the top-right corner of the editor to access your content guidelines.\";\r\nconst HINT_OK = \"OK, GOT IT!\";\r\n\r\nconst Transition = React.forwardRef(function Transition(\r\n props: TransitionProps & {\r\n children: React.ReactElement;\r\n },\r\n ref: React.Ref,\r\n) {\r\n return ;\r\n});\r\n\r\nexport const GuidelineHint: React.FunctionComponent = (props) => {\r\n return (\r\n \r\n \r\n \"Find\r\n\r\n

    {HINT_HEADER}

    \r\n

    {HINT_DESCRIPTION}

    \r\n
    \r\n\r\n \r\n \r\n \r\n \r\n );\r\n};","import * as React from 'react';\r\nimport { AppBar, Box, Button, Container, IconButton, Toolbar, Typography } from '@mui/material';\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport { MoveFilesWithSrc } from '../models';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport { ConnectedProps, connect } from 'react-redux';\r\n\r\ninterface IMoveFilesAppBar {\r\n onClose: () => void;\r\n onMove: (moveFiles: MoveFilesWithSrc) => void;\r\n moveFiles: MoveFilesWithSrc;\r\n}\r\n\r\nconst MoveFilesAppBar: React.FunctionComponent = (props) => {\r\n const show = props.moveFiles.filesToMove.length > 0;\r\n\r\n const onMoveFilesForAppBarClick = () => {\r\n const filesToMove = {...props.moveFiles, moveDest: props.imageLibrary.currDir ?? null};\r\n\r\n props.onClose();\r\n \r\n if (props.moveFiles.moveSrc?.id !== props.imageLibrary.currDir?.id)\r\n props.onMove(filesToMove);\r\n }\r\n\r\n return \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Move {props.moveFiles.filesToMove.length} item{props.moveFiles.filesToMove.length > 1 ? 's' : ''}\r\n \r\n \r\n \r\n \r\n \r\n ;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IMoveFilesAppBar)=>({\r\n ...ownProps,\r\n imageLibrary: state.posts.imageLibrary,\r\n }), \r\n {}\r\n)\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(MoveFilesAppBar);\r\n","import React from \"react\";\r\n\r\nimport {\r\n Box,\r\n Breakpoint,\r\n Button,\r\n ButtonProps,\r\n Checkbox,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n IconButton,\r\n Stack,\r\n FormControlLabel,\r\n} from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\ninterface IConfirmDialogProps {\r\n title: string;\r\n open: boolean;\r\n confirmLabel?: string;\r\n denyLabel?: string;\r\n optionLabel?: string;\r\n checkboxLabel?: string;\r\n confirmButtonProps?: ButtonProps;\r\n denyButtonProps?: ButtonProps;\r\n optionButtonProps?: ButtonProps;\r\n headerStyle?: React.CSSProperties;\r\n dialogMaxWidth?: false | Breakpoint;\r\n dialogButtonPadding?: boolean;\r\n onDeny?: () => void;\r\n onConfirm?: () => void;\r\n onClose: () => void;\r\n onOption?: () => void;\r\n onCheckboxChange?: (event: React.ChangeEvent, checked: boolean) => void;\r\n}\r\n\r\nconst ConfirmDialog: React.FunctionComponent = ({\r\n title,\r\n open,\r\n confirmLabel,\r\n denyLabel,\r\n optionLabel,\r\n checkboxLabel,\r\n children,\r\n confirmButtonProps,\r\n optionButtonProps,\r\n headerStyle,\r\n denyButtonProps,\r\n dialogMaxWidth,\r\n onClose,\r\n onConfirm,\r\n onDeny,\r\n onOption,\r\n onCheckboxChange,\r\n}) => {\r\n return (\r\n \r\n
    \r\n {title}\r\n \r\n \r\n \r\n
    \r\n {children}\r\n \r\n \r\n \r\n {checkboxLabel && onCheckboxChange && (\r\n } label={checkboxLabel} />\r\n )}\r\n \r\n \r\n {onDeny && (\r\n \r\n )}\r\n {optionLabel && (\r\n \r\n )}\r\n {confirmLabel && (\r\n \r\n )}\r\n \r\n \r\n \r\n
    \r\n );\r\n};\r\n\r\nexport default ConfirmDialog;\r\n","import ConfirmDialog from 'modules/common/components/dialogs/confirmDialog';\r\nimport * as React from 'react';\r\n\r\ninterface IInvalidFilesDialogProps {\r\n invalidFiles: File[];\r\n open: boolean;\r\n onClose: () => void;\r\n onDeny: () => void;\r\n onConfirm: () => void;\r\n maxUploadMbSize: number;\r\n maxUploadNumber: number;\r\n hasValidFilesToUpload: boolean;\r\n}\r\n\r\nexport const InvalidFilesDialog: React.FunctionComponent = ({\r\n invalidFiles,\r\n open,\r\n onClose,\r\n onDeny,\r\n onConfirm,\r\n children,\r\n maxUploadMbSize,\r\n maxUploadNumber,\r\n hasValidFilesToUpload,\r\n}) => {\r\n\r\n // will give a shortened and formatted filesize converting it's byte unit when necessary and keeping 2 decimal places of precision.\r\n // ex. a file with a size of 1025 B will show 1.00 KB, 1250000 B will show 1.19 MB and etc\r\n const formatFileWithFileSize = (file: File): JSX.Element => {\r\n // range of units ranging from B to TB\r\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\r\n\r\n let fileSize = file.size;\r\n let unitIndex = 0;\r\n \r\n // if the filesize is currently over 1024, we can convert it's unit to the next biggest unit up to TBs\r\n while (fileSize >= 1024 && unitIndex < units.length - 1) {\r\n fileSize /= 1024;\r\n unitIndex++;\r\n }\r\n\r\n return {file.name} {unitIndex === 0 ? fileSize : fileSize.toFixed(2)} {units[unitIndex]};\r\n }\r\n\r\n const getInvalidFilesErrorList = (): React.ReactElement => {\r\n return <>\r\n
    \r\n {\r\n invalidFiles.length === 1 \r\n ? {formatFileWithFileSize(invalidFiles[0])} could not be uploaded. \r\n : !hasValidFilesToUpload ? \r\n `All ${invalidFiles.length} files cannot be uploaded. ` :\r\n `There are ${invalidFiles.length} files that cannot be uploaded. `\r\n }\r\n Only a maxium of {maxUploadNumber} JPG or PNG images with a maximum size of {maxUploadMbSize} MB each are supported.\r\n
    \r\n \r\n {\r\n invalidFiles.length > 1 &&\r\n invalidFiles.flatMap((invalidFile, i) => {\r\n return
  • \r\n {formatFileWithFileSize(invalidFile)}\r\n
  • \r\n })\r\n } \r\n \r\n ;\r\n }\r\n\r\n return 1 ? \"Files not supported\" : \"File not supported\"}\r\n denyLabel=\"CANCEL\"\r\n confirmLabel={hasValidFilesToUpload ? \"CONFIRM\" : undefined}\r\n open={invalidFiles.length > 0 && open}\r\n onClose={onClose}\r\n onDeny={onDeny}\r\n onConfirm={onConfirm}\r\n >\r\n
    \r\n {getInvalidFilesErrorList()}\r\n
    {children}
    \r\n
    \r\n ;\r\n}","import * as React from 'react';\r\nimport ConfirmDialog from 'modules/common/components/dialogs/confirmDialog';\r\nimport { ConsolidatedDuplicateFiles } from '../models';\r\n\r\ninterface IDuplicateFilesDialog {\r\n duplicateFiles: ConsolidatedDuplicateFiles[];\r\n onClose: () => void;\r\n onDeny: () => void;\r\n onOption: () => void;\r\n onConfirm: () => void;\r\n onCheckboxChange: (event: React.ChangeEvent, checked: boolean) => void;\r\n open: boolean;\r\n dirName: string;\r\n}\r\n\r\nexport const DuplicateFilesDialog: React.FC = ({\r\n duplicateFiles,\r\n onClose,\r\n onDeny,\r\n onOption,\r\n onConfirm,\r\n onCheckboxChange,\r\n open,\r\n dirName\r\n}) => {\r\n const getImageDuplicateDiv = (imageTitle: string, imageUrl: string): JSX.Element => {\r\n return \r\n
    {imageTitle}
    \r\n \r\n ;\r\n }\r\n\r\n const dialogTitle = duplicateFiles.length > 1 ? \"Images already exist\" : \"Image already exists\";\r\n \r\n return 1 ? `Apply to all ${duplicateFiles.length} duplicates` : undefined}\r\n open={duplicateFiles.length > 0 && open}\r\n onClose={onClose}\r\n onDeny={onDeny}\r\n onOption={onOption}\r\n onConfirm={onConfirm}\r\n onCheckboxChange={onCheckboxChange}\r\n dialogMaxWidth='md'\r\n >\r\n {\r\n duplicateFiles.length > 0 && \r\n
    \r\n
    \r\n {`'${duplicateFiles[0].newFile.name}'`}\r\n {` already exists in `}\r\n {`${dirName}.`}\r\n {` Select an action you'd like to proceed with.`}\r\n
    \r\n {\r\n !duplicateFiles[0].isDir && \r\n
    \r\n {getImageDuplicateDiv('Existing', duplicateFiles[0].duplicateFile.url)}\r\n {getImageDuplicateDiv('New', duplicateFiles[0].newFile.url)}\r\n
    \r\n }\r\n
    \r\n }\r\n ;\r\n}","import React from \"react\";\r\n\r\nimport Snackbar from \"@mui/material/Snackbar\";\r\n\r\nimport Alert from '@mui/material/Alert';\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\n\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n snackbar: {\r\n position: \"absolute\"\r\n },\r\n successAlert: {\r\n backgroundColor: \"#366531\",\r\n minWidth: 350\r\n }\r\n })\r\n);\r\n\r\n\r\n/**\r\n * A success snackbar\r\n * - if you need more control over the base MUI components use snackbarWrapper.tsx\r\n */\r\nconst SuccessSnackbar: React.FunctionComponent = ({\r\n successMessage,\r\n clearSuccessMessage,\r\n closeOnClickAway = true\r\n}) => {\r\n const classes = useStyles();\r\n\r\n return (\r\n null }}\r\n open={!!successMessage}\r\n anchorOrigin={{ vertical: \"top\", horizontal: \"right\" }}\r\n autoHideDuration={null}\r\n onClose={() => clearSuccessMessage()}\r\n className={classes.snackbar}\r\n >\r\n {successMessage}\r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n closeOnClickAway?: boolean;\r\n successMessage: string;\r\n clearSuccessMessage: () => void;\r\n}\r\n\r\nexport default SuccessSnackbar;\r\n","import { Backdrop } from '@mui/material';\r\nimport { Container } from '@mui/system';\r\nimport * as React from 'react';\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n middleComponent?: JSX.Element;\r\n fullScreen?: boolean;\r\n containerStyle?: React.CSSProperties;\r\n}\r\n\r\nconst BaseComponentOverlay: React.FC = (props) => {\r\n return (\r\n theme.zIndex.drawer + 1\r\n }}\r\n >\r\n \r\n {props.middleComponent}\r\n \r\n \r\n );\r\n}\r\n\r\nexport default BaseComponentOverlay;","import * as React from 'react';\r\nimport BaseComponentOverlay from './baseComponentOverlay';\r\nimport { Typography } from '@mui/material';\r\nimport FileUploadOutlinedIcon from '@mui/icons-material/FileUploadOutlined';\r\n\r\nimport './dragDropOverlay.sass';\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n maxNumUploads: number;\r\n maxUploadMbSize: number;\r\n onDrop: (e: React.DragEvent) => void;\r\n onDragEnd: (e: React.DragEvent) => void;\r\n fullScreen?: boolean;\r\n onClose?: () => void;\r\n}\r\n\r\nconst DragDropOverlay: React.FC = (props) => {\r\n return (\r\n \r\n \r\n \r\n Drag and drop your images here\r\n \r\n \r\n Maximum of {props.maxNumUploads} ({props.maxUploadMbSize} MB per file)\r\n \r\n e.key === \"Escape\" && props.onClose ? props.onClose() : undefined}\r\n className='drag-drop-div'\r\n onDrop={props.onDrop}\r\n onDragOver={(e) => e.preventDefault()} // enable drop\r\n onDragEnd={props.onDragEnd}\r\n onDragLeave={props.onDragEnd}\r\n />\r\n \r\n }\r\n />\r\n );\r\n}\r\n\r\nexport default DragDropOverlay;","import { Button, Typography } from '@mui/material';\r\nimport LoadingCircle from 'modules/common/components/loadingCircle';\r\nimport * as React from 'react';\r\nimport BaseComponentOverlay from './baseComponentOverlay';\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n totalNumToUpload: number;\r\n numCurrentlyUploaded: number;\r\n allowCancel?: boolean;\r\n onUploadCancel?: () => void;\r\n}\r\n\r\nconst UploadingOverlay: React.FC = (props) => {\r\n const [aborting, setAborting] = React.useState(false);\r\n\r\n const onClick = () => {\r\n setAborting(true);\r\n\r\n if (props.allowCancel && props.onUploadCancel) props.onUploadCancel();\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n { aborting ? 'Aborting...': `Uploading ${props.numCurrentlyUploaded} of ${props.totalNumToUpload} images...` }\r\n \r\n {\r\n !aborting && \r\n \r\n Stay on this page until upload is completed\r\n \r\n }\r\n {\r\n props.allowCancel && props.onUploadCancel && !aborting && \r\n \r\n }\r\n \r\n }\r\n fullScreen\r\n />\r\n )\r\n};\r\n\r\nexport default UploadingOverlay;","import LoadingOverlay from 'modules/common/components/loadingOverlay';\r\nimport React from 'react';\r\nimport DragDropOverlay from './dragDropOverlay';\r\nimport UploadingOverlay from './uploadingOverlay';\r\nimport { ConnectedProps, connect } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\n\r\ninterface IGalleryVFSOverlayProps {\r\n showLoadingOverlay: boolean;\r\n showDragDropOverlay: boolean;\r\n maxNumUploads: number;\r\n maxUploadMbSize: number;\r\n onDrop: (e: React.DragEvent) => void;\r\n onDragEnd: (e: React.DragEvent) => void;\r\n fullScreenDragNDrop?: boolean;\r\n allowUploadCancel?: boolean;\r\n onUploadCancel?: () => void;\r\n totalToUpload: number;\r\n totalUploaded: number;\r\n}\r\n\r\nconst GalleryVFSOverlay: React.FC = (props) => {\r\n return <>\r\n \r\n \r\n \r\n \r\n}\r\n\r\nconst connector = connect((state: GlobalApplicationState, ownProps: IGalleryVFSOverlayProps)=>({ ...ownProps, imageLibrary: state.posts.imageLibrary, }), {});\r\n\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(GalleryVFSOverlay);","import ConfirmDialog from 'modules/common/components/dialogs/confirmDialog';\r\nimport FilledInput from 'modules/common/components/forms/inputs/filledInput';\r\nimport * as React from 'react';\r\n\r\ninterface ICreateNewFolderDialogProps {\r\n disableFolderCreation: boolean;\r\n onClose: () => void;\r\n onConfirm: () => void;\r\n onDeny: () => void;\r\n open: boolean;\r\n value: string;\r\n onFolderNameChange: (e: React.ChangeEvent) => void;\r\n errorMsg: string;\r\n maxInputCount?: number;\r\n}\r\n\r\nexport const CreateNewFolderDialog: React.FC = ({\r\n disableFolderCreation,\r\n onClose,\r\n onConfirm,\r\n onDeny,\r\n open,\r\n value,\r\n onFolderNameChange,\r\n errorMsg,\r\n maxInputCount\r\n}) => {\r\n return \r\n \r\n \r\n}","import ConfirmDialog from 'modules/common/components/dialogs/confirmDialog';\r\nimport * as React from 'react';\r\nimport { CustomFileData } from '../models';\r\nimport FilledInput from 'modules/common/components/forms/inputs/filledInput';\r\nimport { imageExtFromMimeType } from '../chonkyFileAdapter';\r\n\r\ninterface IRenameMediaDialog {\r\n disableRename: boolean;\r\n onClose: () => void,\r\n onConfirm: () => void,\r\n onDeny: () => void,\r\n openRenameDialog: boolean;\r\n fileToRename: CustomFileData | null;\r\n renameValue: string;\r\n onRenameChange: (e: React.ChangeEvent) => void;\r\n showRenameError: boolean;\r\n maxInputCount?: number;\r\n}\r\n\r\nexport const RenameMediaDialog: React.FunctionComponent = ({\r\n disableRename,\r\n onClose,\r\n onConfirm,\r\n onDeny,\r\n openRenameDialog,\r\n fileToRename,\r\n renameValue,\r\n onRenameChange,\r\n showRenameError,\r\n maxInputCount\r\n}) => {\r\n return \r\n
    \r\n Rename {fileToRename?.isDir ? \"folder\" : \"image\"}\r\n {fileToRename?.name}\r\n
    \r\n \r\n ;\r\n}","import ConfirmDialog from 'modules/common/components/dialogs/confirmDialog';\r\nimport * as React from 'react';\r\nimport { CustomFileData } from '../models';\r\n\r\ninterface IDeleteMediaDialog {\r\n onClose: () => void,\r\n onConfirm: () => void,\r\n onDeny: () => void,\r\n showDeleteFilesDialog: boolean;\r\n filesToDelete: CustomFileData[];\r\n numImagesToDelete: number,\r\n numFoldersToDelete: number,\r\n}\r\n\r\nexport const DeleteMediaDialog: React.FunctionComponent = ({\r\n onClose,\r\n onConfirm,\r\n onDeny,\r\n showDeleteFilesDialog,\r\n filesToDelete,\r\n numImagesToDelete,\r\n numFoldersToDelete\r\n}) => {\r\n const getDeleteDialogText = (): string => {\r\n let text = \"\";\r\n\r\n if (numImagesToDelete === 1 && numFoldersToDelete === 0) {\r\n text = `You're about to delete this image.`;\r\n }\r\n else if (numFoldersToDelete > 0) {\r\n text = `You're about to delete ${numFoldersToDelete} folder${numFoldersToDelete > 1 ? \"s\" : \"\"} and ${numImagesToDelete} image${numImagesToDelete > 1 ? \"s\" : \"\"}.`;\r\n }\r\n else if (numFoldersToDelete === 0) {\r\n text = `You're about to delete ${numImagesToDelete} images.`;\r\n }\r\n\r\n return text + \" This action cannot be undone. Are you sure?\";\r\n }\r\n\r\n return 0}\r\n >\r\n {getDeleteDialogText()}\r\n ;\r\n}","import React, { useCallback, useEffect, useState } from 'react';\r\nimport { CreateNewFolderDialog } from './createNewFolderDialog';\r\nimport { useNewFolderDebounceValue, useRenameDebounceValue } from '../galleryVfsHooks';\r\nimport { ConnectedProps, connect } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport * as PostActions from 'modules/posts/actionCreator';\r\nimport { RenameMediaDialog } from './renameMediaDialog';\r\nimport { CustomFileData } from '../models';\r\nimport { ROOT_FOLDER_ID, imageExtFromMimeType } from '../chonkyFileAdapter';\r\nimport { DeleteMediaDialog } from './deleteMediaDialog';\r\n\r\nconst MAX_FILE_LEN = 250;\r\n\r\ninterface IGalleryVFSFileActionDialogsProps {\r\n openCreateFolderDialog: boolean;\r\n onCreateFolderDialogClose: () => void;\r\n fetchImages: () => void;\r\n clearExternalFileToRename?: () => void;\r\n openRenameDialog: boolean;\r\n fileToRename: CustomFileData | null;\r\n onRenameDialogClose: () => void;\r\n filesToDelete: CustomFileData[];\r\n setSuccessMessage: (message: string) => void;\r\n onCurrentFolderChange: (parentId: string) => void;\r\n onDeleteDialogClose: () => void;\r\n onDeleteStarted: () => void;\r\n onDeleteFinished: () => void;\r\n};\r\n\r\nconst GalleryVFSFileActionDialogs: React.FC = props => {\r\n const [showFolderError, setFolderError] = React.useState(\"\");\r\n const [folderNameChecked, setFolderNameChecked] = useState(false);\r\n const newFolderValueDebounce = useNewFolderDebounceValue(setFolderNameChecked, setFolderError, props.fetchFolderByName, props.imageLibrary.currDir?.id);\r\n const disableFolderCreation = !folderNameChecked || showFolderError !== \"\";\r\n\r\n const [showRenameError, setRenameError] = useState(false);\r\n const [renameChecked, setRenameChecked] = useState(false);\r\n const renameValueDebounce = useRenameDebounceValue(props.fileToRename, props.fetchFolderByName, props.fetchImageByName, setRenameError, setRenameChecked, props.imageLibrary.currDir?.id);\r\n const disableRename = !renameChecked || showRenameError;\r\n\r\n const [showDeleteFilesDialog, setShowDeleteFilesDialog] = useState(false);\r\n const [numImagesToDelete, setNumImagesToDelete] = useState(0);\r\n const [numFoldersToDelete, setNumFoldersToDelete] = useState(0);\r\n\r\n const resetFolderCreationStates = () => {\r\n newFolderValueDebounce.setDebVal(\"\");\r\n setFolderError(\"\");\r\n setFolderNameChecked(false);\r\n props.onCreateFolderDialogClose();\r\n }\r\n\r\n const createFolder = async () => {\r\n if (!disableFolderCreation) {\r\n await props.uploadFolder(newFolderValueDebounce.debVal, props.imageLibrary.currDir?.id);\r\n resetFolderCreationStates();\r\n props.fetchImages();\r\n }\r\n }\r\n \r\n const limitFileNameLen = (originalFileName: string, newFileName: string): string => {\r\n return newFileName.length > MAX_FILE_LEN \r\n ? originalFileName\r\n : newFileName;\r\n }\r\n\r\n const onFolderNameChange = (e: React.ChangeEvent) => {\r\n const newValue = limitFileNameLen(newFolderValueDebounce.debVal, e.target.value);\r\n newFolderValueDebounce.setDebVal(newValue);\r\n }\r\n\r\n const onRenameChange = (e: React.ChangeEvent) => {\r\n const newValue = limitFileNameLen(renameValueDebounce.debVal, e.target.value);\r\n renameValueDebounce.setDebVal(newValue);\r\n }\r\n\r\n const resetRenameStates = () => {\r\n renameValueDebounce.setDebVal(\"\");\r\n setRenameError(false);\r\n setRenameChecked(false);\r\n if (props.clearExternalFileToRename) props.clearExternalFileToRename();\r\n props.onRenameDialogClose();\r\n }\r\n\r\n const renameFile = async () => {\r\n if (!disableRename && props.fileToRename) {\r\n props.fileToRename?.isDir \r\n ? await props.renameFolder(props.fileToRename.id, renameValueDebounce.debVal)\r\n : await props.renameImage(props.fileToRename.id, `${renameValueDebounce.debVal}${imageExtFromMimeType(props.fileToRename.mimeType)}`);\r\n\r\n resetRenameStates();\r\n props.fetchImages();\r\n }\r\n }\r\n\r\n const resetDeleteFilesStates = () => {\r\n setShowDeleteFilesDialog(false);\r\n setNumImagesToDelete(0);\r\n setNumFoldersToDelete(0);\r\n props.onDeleteFinished();\r\n props.onDeleteDialogClose();\r\n }\r\n\r\n const deleteSelection = async () => {\r\n if (props.filesToDelete) {\r\n setShowDeleteFilesDialog(false);\r\n let deleteFolders = props.deleteBulkFolders(props.filesToDelete.filter(x => x.isDir).map(x => x.id));\r\n let deleteImages = props.deleteImages(props.filesToDelete.filter(x => !x.isDir).map(x => x.id));\r\n await Promise.allSettled([deleteFolders, deleteImages]);\r\n }\r\n\r\n resetDeleteFilesStates();\r\n props.onDeleteFinished();\r\n props.setSuccessMessage(\"Successfully deleted.\");\r\n\r\n props.onCurrentFolderChange(props.imageLibrary.currDir?.id ?? ROOT_FOLDER_ID);\r\n }\r\n\r\n useEffect(() => {\r\n const getAndSetFolderAndImageCount = async () => {\r\n const files = props.filesToDelete;\r\n if (files.length === 0) return;\r\n\r\n props.onDeleteStarted();\r\n\r\n let folders = files.filter(x => x.isDir);\r\n let images = files.filter(x => !x.isDir);\r\n\r\n setNumImagesToDelete(images.length);\r\n setNumFoldersToDelete(folders.length);\r\n\r\n if (folders.length > 0) {\r\n let folderAndImageCounts = await props.getBulkFolderAndImageCount(folders.map(x => x.id));\r\n\r\n setNumImagesToDelete(images.length + folderAndImageCounts.imageCount);\r\n }\r\n\r\n setShowDeleteFilesDialog(true);\r\n };\r\n\r\n getAndSetFolderAndImageCount();\r\n }, [props.filesToDelete]);\r\n\r\n return <>\r\n resetFolderCreationStates()}\r\n onConfirm={() => createFolder()}\r\n onDeny={() => resetFolderCreationStates()}\r\n open={props.openCreateFolderDialog}\r\n value={newFolderValueDebounce.debVal}\r\n onFolderNameChange={onFolderNameChange}\r\n errorMsg={showFolderError}\r\n maxInputCount={MAX_FILE_LEN}\r\n />\r\n resetRenameStates()}\r\n onConfirm={() => renameFile()}\r\n onDeny={() => resetRenameStates()}\r\n openRenameDialog={props.openRenameDialog}\r\n fileToRename={props.fileToRename}\r\n renameValue={renameValueDebounce.debVal}\r\n onRenameChange={(e) => onRenameChange(e)}\r\n showRenameError={showRenameError}\r\n maxInputCount={MAX_FILE_LEN}\r\n />\r\n resetDeleteFilesStates()}\r\n onConfirm={() => deleteSelection()}\r\n onDeny={() => resetDeleteFilesStates()}\r\n showDeleteFilesDialog={showDeleteFilesDialog}\r\n filesToDelete={props.filesToDelete}\r\n numImagesToDelete={numImagesToDelete}\r\n numFoldersToDelete={numFoldersToDelete}\r\n />\r\n \r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IGalleryVFSFileActionDialogsProps)=>({\r\n ...ownProps,\r\n imageLibrary: state.posts.imageLibrary,\r\n }), \r\n {\r\n fetchFolderByName: PostActions.fetchFolderByName,\r\n uploadFolder: PostActions.uploadFolder,\r\n fetchImageByName: PostActions.fetchImageByName,\r\n renameFolder: PostActions.renameFolder,\r\n renameImage: PostActions.renameImage,\r\n deleteImages: PostActions.deleteImagesFromLibrary,\r\n deleteBulkFolders: PostActions.deleteBulkFolders,\r\n getBulkFolderAndImageCount: PostActions.getBulkFolderAndImageCount,\r\n }\r\n)\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(GalleryVFSFileActionDialogs);","// helper method for making sure the rendering is drawn before calling our custom CSS styling afterwards\r\n// https://stackoverflow.com/a/34999925/23716571\r\nexport const onNextFrame = (callback: () => void) => {\r\n setTimeout(() => {\r\n window.requestAnimationFrame(callback);\r\n });\r\n}","import * as React from 'react';\r\n\r\nimport './listHeaderDiv.sass';\r\nimport { Typography } from '@mui/material';\r\nimport { onNextFrame } from 'utils/onNextFrame';\r\n\r\ninterface IListTitleDivProps {\r\n show: boolean;\r\n showKeywordsHeader: boolean;\r\n runFn: () => void;\r\n}\r\n\r\nexport const ListHeaderDiv: React.FunctionComponent = ({\r\n show,\r\n showKeywordsHeader,\r\n runFn\r\n}) => {\r\n React.useEffect(() => {\r\n if (runFn) onNextFrame(() => runFn());\r\n }, []);\r\n\r\n return
    \r\n
    \r\n Name\r\n
    \r\n
    \r\n Modified On\r\n
    \r\n
    \r\n Size\r\n
    \r\n
    \r\n Keywords\r\n
    \r\n
    \r\n}","import { CustomFileData } from \"../models\";\r\n\r\nconst chonkyFileIdAttributeName = 'data-chonky-file-id';\r\n\r\n// for finding, attaching the delete style classname and thus applying our custom styling on the 'Delete' button on the context menu and action menu dropdown\r\nexport const attachDeleteClassNames = () => {\r\n const deleteStyleClassName = 'delete-text-styling';\r\n\r\n try {\r\n const liButtonTextSpan = document.querySelectorAll('li.chonky-baseButton > div.chonky-MuiListItemText-root > span.chonky-text') as NodeListOf;\r\n\r\n liButtonTextSpan.forEach(ele => {\r\n let grandParentElement = ele.parentElement && ele.parentElement.parentElement\r\n ? ele.parentElement.parentElement\r\n : undefined;\r\n\r\n if (ele.textContent === \"Delete\" && grandParentElement && !grandParentElement.classList.contains(deleteStyleClassName)) {\r\n grandParentElement.classList.add(deleteStyleClassName);\r\n }\r\n });\r\n }\r\n catch {}\r\n};\r\n\r\n// for helping with styling the inner Chonky components styling for search matches where we want to highlight/bold\r\n// matched filenames and surface the file tags if there are any matching\r\nexport const attachSearchMatchClassNames = (searchTerm: string, fileData: CustomFileData[], isGridView: boolean) => {\r\n if (searchTerm === \"\") return;\r\n const icoTag = \"/images/icons/tag.svg\";\r\n const searchTextTagDivClassName = 'search-text-tag-div';\r\n\r\n // Function to recursively search for text nodes and highlight matching text\r\n const insertHighlightClassToMatchingNodeText = (node: Node, searchText: string) => {\r\n // search for the span with text\r\n if (node.nodeType === Node.TEXT_NODE) {\r\n const text = node.textContent || '';\r\n\r\n // find the index of the matching, case insenstive text search\r\n const index = text.toLowerCase().indexOf(searchText.toLowerCase());\r\n if (index !== -1) {\r\n\r\n // preserve the node structure from before insertion, before and after the matching substring of text\r\n const before = document.createTextNode(text.substring(0, index));\r\n const after = document.createTextNode(text.substring(index + searchText.length));\r\n\r\n // create our span for attaching the highlighting class to the matching substring\r\n const span = document.createElement('span');\r\n span.textContent = text.substring(index, index + searchText.length);\r\n span.classList.add('highlight-search-text'); // Add a CSS class for highlighting\r\n\r\n // attach to the parent node\r\n if (node.parentNode) {\r\n node.parentNode.insertBefore(before, node);\r\n node.parentNode.insertBefore(span, node);\r\n node.parentNode.insertBefore(after, node);\r\n node.parentNode.removeChild(node);\r\n }\r\n }\r\n } else if (node.nodeType === Node.ELEMENT_NODE) {\r\n // recurse into all children of an element node\r\n for (const childNode of Array.from(node.childNodes)) {\r\n insertHighlightClassToMatchingNodeText(childNode, searchText);\r\n }\r\n }\r\n }\r\n\r\n // will build a div with the matching keywords/tags of an image with a tags icon\r\n const buildSearchTagDiv = (matchingWords: string[], searchTagDivCustomClassName?: string): HTMLDivElement => {\r\n let newDivElement = document.createElement('div');\r\n newDivElement.className = `${searchTextTagDivClassName} ${searchTagDivCustomClassName ?? \"\"}`;\r\n\r\n if (matchingWords.length > 0) {\r\n let imgIconElement = document.createElement('img');\r\n imgIconElement.src = icoTag;\r\n imgIconElement.alt = 'Tag icon';\r\n imgIconElement.className = 'search-text-icon';\r\n\r\n newDivElement.appendChild(imgIconElement);\r\n }\r\n\r\n let tagsSpanElement = document.createElement('span');\r\n tagsSpanElement.innerText = matchingWords.length === 0 ? ' ' : `${matchingWords[0]}${matchingWords.length > 1 ? ', +1' : ''}`;\r\n newDivElement.appendChild(tagsSpanElement);\r\n\r\n return newDivElement;\r\n }\r\n\r\n try {\r\n // depending on the gridview or listview state of Chonky, the display components classnames will differ so we need to account for 2 cases\r\n if (isGridView) {\r\n // find the divs that the images are in\r\n const imageElementGridDivs = document.querySelectorAll('div[class^=\"gridFileEntryNameContainer\"]') as NodeListOf;\r\n // go through all the image grid divs and add in the keywords list if there are matches, and highlight the matching searchTerm substrings\r\n // to the image title/name and keywords\r\n imageElementGridDivs.forEach(ele => {\r\n // encapsulate the former component in a div for styling\r\n ele.innerHTML = `
    ` + ele.innerHTML + '
    ';\r\n\r\n // next we'll need to figure out if there are any matching keywords to the images that are displayed or not\r\n // image names will show in a span with a title prop within the element grid div\r\n const imageElementWithTitle = ele.querySelector(`span[title]:not([title=\"\"])`) as HTMLElement;\r\n if (imageElementWithTitle) {\r\n // from our own file data, find the matching image and keywords if there are any\r\n const matchingKeywordItem = fileData\r\n .filter(item => \r\n item.name === imageElementWithTitle.title && \r\n item.keywords?.filter(keyword => keyword.toLowerCase().includes(searchTerm.toLowerCase()))\r\n );\r\n \r\n // check if this image has any matching keywords with the searchTerm\r\n if (matchingKeywordItem.length > 0) {\r\n // if there are matching keywords, find the the keywords\r\n const matchingKeywords = matchingKeywordItem[0].keywords?.filter(keyword => keyword.toLowerCase().includes(searchTerm.toLowerCase())) ?? [];\r\n\r\n // attach the keywords to the element\r\n if (matchingKeywords && matchingKeywords.length > 0 && document.getElementsByClassName(searchTextTagDivClassName).length === 0)\r\n ele.appendChild(buildSearchTagDiv(matchingKeywords));\r\n }\r\n }\r\n\r\n // go through the image grid element and highlight matching text (should only contain the image name, image extension, and matching keywords)\r\n insertHighlightClassToMatchingNodeText(ele, searchTerm);\r\n })\r\n }\r\n else {\r\n const anyKeywordMatches = fileData\r\n .filter(file => file.keywords?.find(keyword => keyword.toLowerCase().includes(searchTerm.toLowerCase()))).length > 0;\r\n\r\n // list view differs in classnames and how the name and data are laid out\r\n fileData.forEach(file => {\r\n // for list view, the title is inside of a div with a title prop -- we find and highlight the matching subtext\r\n let imageElementListTitleDiv = document.querySelector(`div[title=\"${file.name}\"]`) as HTMLElement;\r\n insertHighlightClassToMatchingNodeText(imageElementListTitleDiv, searchTerm);\r\n\r\n let imageElementListTagDiv = document.querySelector(`div[${chonkyFileIdAttributeName}=\"${file.id}\"]`) as HTMLElement;\r\n // if there are matching keywords, we will find the parent div that contains all the column data and append the keywords div\r\n if (anyKeywordMatches && imageElementListTagDiv.getElementsByClassName(searchTextTagDivClassName).length === 0) {\r\n // next we need to build the keywords div for list view\r\n const matchingKeywords = file.keywords?.filter(keyword => keyword.toLowerCase().includes(searchTerm.toLowerCase())) ?? [];\r\n\r\n // listFileEntryProperty is needed to keep the styling consistent inside of Chonky for the new column we're adding\r\n let newDiv = document.createElement('div');\r\n newDiv.className = \"listFileEntryProperty\";\r\n\r\n newDiv.appendChild(buildSearchTagDiv(matchingKeywords, 'listview'));\r\n imageElementListTagDiv.appendChild(newDiv);\r\n\r\n // highlight the keywords\r\n insertHighlightClassToMatchingNodeText(imageElementListTagDiv, searchTerm);\r\n }\r\n });\r\n }\r\n }\r\n catch {}\r\n};\r\n\r\n// for overriding the default toggle icon Chonky provides OOTB into a checkmark\r\nexport const changeChonkyCheckboxIcon = (toggleOn: boolean) => {\r\n const checkmarkIcon: string = \"/images/icons/checkmark.svg\";\r\n const checkmarkActiveIconClassName = \"checkmark-icon-active\";\r\n const checkmarkInactiveIconClassName = \"checkmark-icon-inactive\";\r\n\r\n try {\r\n // depending on if the toggle is on/off, the data-icon prop will be set accordingly\r\n let toggleOnElement = document.querySelector(`svg[data-icon=\"toggle-on\"],.${checkmarkActiveIconClassName}`) as HTMLElement;\r\n let toggleOffElement = document.querySelector(`svg[data-icon=\"toggle-off\"],.${checkmarkInactiveIconClassName}`) as HTMLElement;\r\n\r\n if (!toggleOnElement && !toggleOffElement) return;\r\n\r\n // have to get the grandparent div so we can insert our checkmark icon\r\n let toggleParentDiv = toggleOnElement?.parentElement ?? toggleOffElement?.parentElement as HTMLDivElement;\r\n let toggleGrandParentDiv = toggleParentDiv?.parentElement as HTMLDivElement;\r\n\r\n if (!toggleParentDiv && !toggleGrandParentDiv) return;\r\n\r\n // remove the OOTB toggle button div\r\n toggleGrandParentDiv.removeChild(toggleParentDiv);\r\n\r\n // make our checkmark div\r\n let imgDivElement = document.createElement('div');\r\n imgDivElement.className = 'checkmark-icon-div';\r\n\r\n let imgIconElement = document.createElement('img');\r\n imgIconElement.src = checkmarkIcon;\r\n imgIconElement.alt = 'Checkmark icon';\r\n imgIconElement.className = toggleOn ? checkmarkActiveIconClassName : checkmarkInactiveIconClassName;\r\n\r\n imgDivElement.appendChild(imgIconElement);\r\n\r\n // insert the checkmark div\r\n toggleGrandParentDiv.appendChild(imgDivElement);\r\n }\r\n catch {}\r\n}\r\n\r\n// for adding custom styling ontop of the Chonky VFS to handle how selected files look\r\n// when we select multiple for inline post and event creation or banner selection\r\nexport const addCustomSelectedFilesStylingDivs = (fileIds: string[]) => {\r\n const itemNumberSelectedClassName = 'item-selected-number';\r\n const itemSelectedClassName = 'item-selected';\r\n\r\n try {\r\n // if we have existing file styling, we remove them for our new fileIds\r\n let existingItemNumberSelectDivs = document.querySelectorAll(`div.${itemNumberSelectedClassName}`) as NodeListOf;\r\n existingItemNumberSelectDivs.forEach(div => div.parentElement?.removeChild(div));\r\n\r\n let existingItemSelectDivs = document.querySelectorAll(`div.${itemSelectedClassName}`) as NodeListOf;\r\n existingItemSelectDivs.forEach(div => div.classList.remove(itemSelectedClassName));\r\n\r\n // chonky will have a prop for matching fileIds on their display divs so we can use querySelector to find them\r\n fileIds.forEach((fileId, ind) => {\r\n // query select for the fileId in both grid and list view that doesn't have our custom selected file styling\r\n let gridImageDiv = document.querySelector(`div[class^=\"gridFileEntry\"][${chonkyFileIdAttributeName}=\"${fileId}\"]:not(:has(div.${itemNumberSelectedClassName}))`);\r\n let listImageDiv = document.querySelector(`div[class^=\"listFileEntry\"][${chonkyFileIdAttributeName}=\"${fileId}\"]:not(:has(div.${itemNumberSelectedClassName}))`);\r\n\r\n // create the div that holds the index number to display\r\n let fileSelectedDiv = document.createElement('div');\r\n fileSelectedDiv.className = itemNumberSelectedClassName;\r\n fileSelectedDiv.textContent = `${ind + 1}`;\r\n\r\n // append the number to the file depending onn the view\r\n if (gridImageDiv) {\r\n gridImageDiv.appendChild(fileSelectedDiv);\r\n gridImageDiv.classList.add(itemSelectedClassName);\r\n }\r\n else if (listImageDiv) {\r\n listImageDiv.appendChild(fileSelectedDiv);\r\n listImageDiv.classList.add(itemSelectedClassName);\r\n }\r\n });\r\n }\r\n catch {}\r\n}\r\n","import { Pagination } from '@mui/material';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport Paging from 'modules/common/components/paging';\r\nimport React from 'react';\r\nimport { ConnectedProps, connect } from 'react-redux';\r\nimport { DEFAULT_MEDIA_GALLERY_ROWS_PER_PAGE, ROWS_PER_PAGE_COOKIE_NAMES } from 'utils/cookie';\r\n\r\ninterface IGalleryVFSPagingProps {\r\n maxNumItemsPerPage?: number;\r\n pageNumber: number;\r\n onPaginationPageChange: (event: React.ChangeEvent, page: number) => void;\r\n isGridView: boolean;\r\n onChangePage: (page: number, rowsPerPage: number) => void;\r\n items: any[];\r\n}\r\n\r\nconst GalleryVFSPaging: React.FC = props => {\r\n\r\n const onChangePage = (page: number, rowsPerPage: number) => {\r\n let newPageNumber = page + 1;\r\n\r\n props.onChangePage(newPageNumber, rowsPerPage);\r\n }\r\n\r\n return <>\r\n {\r\n props.maxNumItemsPerPage \r\n ? \r\n : \r\n }\r\n \r\n}\r\n\r\nconst connector = connect((state: GlobalApplicationState, ownProps: IGalleryVFSPagingProps)=>({ ...ownProps, imageLibrary: state.posts.imageLibrary }), {});\r\n\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(GalleryVFSPaging);","import { Container, IconButton, TextField } from '@mui/material';\r\nimport * as React from 'react';\r\nimport SearchIcon from '@mui/icons-material/Search';\r\nimport ClearIcon from '@mui/icons-material/Clear';\r\nimport InputAdornment from '@mui/material/InputAdornment';\r\n\r\ninterface ISearchAppBarProps {\r\n show: boolean;\r\n onTextValueChange: (val: string) => void;\r\n textValue: string;\r\n onClearSearchText: () => void;\r\n}\r\n\r\nexport const SearchTextField: React.FunctionComponent = ({\r\n show,\r\n onTextValueChange,\r\n textValue,\r\n onClearSearchText\r\n}) => {\r\n return \r\n \r\n \r\n \r\n ),\r\n endAdornment: (\r\n textValue &&\r\n \r\n \r\n \r\n \r\n \r\n ),\r\n sx: {\r\n width: '300px',\r\n height: '30px',\r\n fontSize: '15px !important',\r\n paddingLeft: '5px',\r\n paddingRight: '5px'\r\n }\r\n }}\r\n variant=\"outlined\"\r\n hiddenLabel\r\n size=\"small\"\r\n margin=\"dense\"\r\n value={textValue}\r\n onChange={(e) => onTextValueChange(e.target.value)}\r\n placeholder=\"Search\"\r\n />\r\n \r\n}","import { ChonkyActions, FileBrowser, FileBrowserHandle, FileContextMenu, FileList, FileNavbar, FileToolbar } from 'chonky';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { ConnectedProps, connect } from 'react-redux';\r\nimport { ListHeaderDiv } from './listHeaderDiv';\r\nimport { attachDeleteClassNames, attachSearchMatchClassNames, changeChonkyCheckboxIcon } from './customStylingFunctions';\r\nimport { useFileActionHandler, useFiles, useFolderChain, useFileActions, useGridViewDebounce } from '../galleryVfsHooks';\r\nimport { CustomFileData, MoveFiles, MoveFilesWithSrc, SortGroupName, FilterGroupName } from '../models';\r\nimport { onNextFrame } from 'utils/onNextFrame';\r\nimport { ChonkyIconFA } from 'chonky-icon-fontawesome';\r\nimport GalleryVFSPaging from './galleryVFSPaging';\r\nimport { SearchTextField } from './searchTextField';\r\nimport * as ProfileActions from 'modules/profile/actionCreator';\r\nimport { DebounceState } from \"utils/debounceHook\";\r\n\r\ninterface IGalleryVFSProps {\r\n currentFolderId: string;\r\n onSingleSelect: (mediaFile: CustomFileData) => void;\r\n onMultiSelect: (mediaFiles: CustomFileData[]) => void;\r\n setOpenCreateFolderDialog: React.Dispatch>;\r\n onCurrentFolderChange: (parentId: string) => void;\r\n setOpenRenameDialog: React.Dispatch>;\r\n setFileToRename: React.Dispatch>;\r\n setFilesToDelete: (value: React.SetStateAction) => void;\r\n verifyMediaForMove: (mediaFiles: MoveFiles) => Promise;\r\n setIsInnerDragNDrop: React.Dispatch>;\r\n setMoveFilesForAppBar: React.Dispatch>;\r\n fileBrowserRef: React.RefObject;\r\n searchValueDebounce: DebounceState;\r\n showSearchTextField: boolean;\r\n showLoading: boolean;\r\n pageNumber: number;\r\n pageAmount: number;\r\n onChangePage: (page: number, rowsPerPage: number) => void;\r\n singleClickFileSelect?: boolean;\r\n onSingleClickSelect?: ((mediaFile: CustomFileData) => void);\r\n disableActions?: boolean;\r\n maxNumItemsPerPage?: number;\r\n currSortGroupName: SortGroupName,\r\n currFilterGroupName: FilterGroupName,\r\n toggleShowFoldersFirst: boolean,\r\n onFilterChange: (sortType?: SortGroupName, filterType?: FilterGroupName, showFoldersFirst?: boolean) => void;\r\n onClearSearchText: () => void,\r\n setPageNumber: React.Dispatch>,\r\n}\r\n\r\nconst GalleryVFS: React.FC = (props) => {\r\n const [selectedFiles, setSelectedFiles] = useState(new Set());\r\n const isGridViewValueDebounce = useGridViewDebounce(props.currentUser.showMediaGalleryGridView, props.saveUserSettings, props.currentUser);\r\n const searchResultsFetched = props.searchValueDebounce.debVal !== undefined && \r\n props.searchValueDebounce.debVal !== \"\" && \r\n props.searchValueDebounce.callbackIsRun && \r\n !props.imageLibrary.fetching;\r\n\r\n const files = useFiles(\r\n props.imageLibrary.imagesGalleryMap, \r\n props.currentFolderId\r\n );\r\n\r\n const folderChain = useFolderChain(props.imageLibrary.imagesGalleryMap, props.imageLibrary.folderChain);\r\n\r\n const attachDeleteClassNamesOnNextFrame = () => onNextFrame(() => attachDeleteClassNames());\r\n \r\n const handleFileAction = useFileActionHandler(\r\n props.onSingleSelect,\r\n props.onMultiSelect,\r\n isGridViewValueDebounce.setDebVal,\r\n setSelectedFiles,\r\n props.onFilterChange,\r\n props.setOpenCreateFolderDialog,\r\n props.toggleShowFoldersFirst,\r\n props.imageLibrary.imagesGalleryMap,\r\n props.currentUser,\r\n props.onCurrentFolderChange,\r\n props.setOpenRenameDialog,\r\n props.setFileToRename,\r\n props.setFilesToDelete,\r\n props.verifyMediaForMove,\r\n props.setIsInnerDragNDrop,\r\n props.setMoveFilesForAppBar,\r\n attachDeleteClassNamesOnNextFrame,\r\n props.imageLibrary.currDir,\r\n props.singleClickFileSelect,\r\n props.onSingleClickSelect,\r\n );\r\n\r\n const fileActions = useFileActions(\r\n selectedFiles, \r\n props.currSortGroupName,\r\n props.currFilterGroupName,\r\n props.currentUser.userId,\r\n props.toggleShowFoldersFirst,\r\n props.searchValueDebounce.debVal,\r\n props.disableActions,\r\n );\r\n\r\n useEffect(() => {\r\n attachDeleteClassNamesOnNextFrame();\r\n }, [fileActions]);\r\n\r\n useEffect(() => {\r\n onNextFrame(() => changeChonkyCheckboxIcon(props.toggleShowFoldersFirst));\r\n }, [props.currSortGroupName, props.toggleShowFoldersFirst]);\r\n\r\n useEffect(() => {\r\n if (searchResultsFetched) {\r\n onNextFrame(() => attachSearchMatchClassNames(props.searchValueDebounce.debVal, props.imageLibrary.chonkyFileData, isGridViewValueDebounce.debVal));\r\n }\r\n }, [props.searchValueDebounce.callbackIsRun, isGridViewValueDebounce.debVal, searchResultsFetched, props.imageLibrary.chonkyFileData]);\r\n\r\n return <>\r\n \r\n \r\n \r\n {\r\n if (!isGridViewValueDebounce.debVal && searchResultsFetched){\r\n attachSearchMatchClassNames(props.searchValueDebounce.debVal, props.imageLibrary.chonkyFileData, isGridViewValueDebounce.debVal);}\r\n }}\r\n showKeywordsHeader={\r\n searchResultsFetched && \r\n props.imageLibrary.chonkyFileData\r\n .filter(file => \r\n file.keywords?.find(keyword => keyword.toLowerCase().includes(props.searchValueDebounce.debVal.toLowerCase()))\r\n ).length > 0\r\n }\r\n />\r\n \r\n \r\n \r\n {\r\n if (!props.showLoading) {\r\n // upon first search, reset the page number to 1\r\n if (props.searchValueDebounce.debVal === \"\" && val !== \"\")\r\n props.setPageNumber(1);\r\n\r\n props.searchValueDebounce.setDebVal(val);\r\n }\r\n }}\r\n onClearSearchText={props.onClearSearchText}\r\n textValue={props.searchValueDebounce.debVal}\r\n />\r\n props.onChangePage(page, props.pageAmount)}\r\n items={files}\r\n onChangePage={props.onChangePage}\r\n isGridView={isGridViewValueDebounce.debVal}\r\n />\r\n \r\n};\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IGalleryVFSProps)=>({\r\n ...ownProps,\r\n imageLibrary: state.posts.imageLibrary,\r\n currentUser: state.settings.currentUser,\r\n }), \r\n {\r\n saveUserSettings: ProfileActions.saveUserSettings,\r\n }\r\n)\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(GalleryVFS);","import { FileBrowserHandle, FileBrowserProps, } from 'chonky';\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { StylesProvider, createGenerateClassName } from '@material-ui/core/styles';\r\nimport * as PostActions from 'modules/posts/actionCreator';\r\nimport { CustomFileData, FileUploadAction, FilterGroupName, MoveFilesWithSrc, SortGroupName } from '../models';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport { ROOT_FOLDER_ID } from '../chonkyFileAdapter';\r\nimport cookie, { DEFAULT_MEDIA_GALLERY_ROWS_PER_PAGE, ROWS_PER_PAGE_COOKIE_NAMES } from 'utils/cookie';\r\nimport { resetMoveFileStateAction } from '../customChonkyFileActions';\r\nimport { useDragEventDebounce, useFileUploadFunctions, useSearchValueDebounce } from '../galleryVfsHooks';\r\nimport './galleryVFSBrowser.sass';\r\nimport MoveFilesAppBar from './moveFilesAppBar';\r\nimport { InvalidFilesDialog } from './invalidFilesDialog';\r\nimport { DuplicateFilesDialog } from './duplicateFilesDialog';\r\nimport SuccessSnackbar from 'modules/common/components/snackbars/successSnackbar';\r\nimport ErrorSnackbar from 'modules/common/components/snackbars/errorSnackbar';\r\nimport GalleryVFSOverlays from './galleryVFSOverlays';\r\nimport GalleryVFSFileActionDialogs from './galleryVFSFileActionDialogs';\r\nimport GalleryVFS from './galleryVFS';\r\n\r\nconst muiJSSClassNameGenerator = createGenerateClassName({\r\n // Seed property is used to add a prefix classes generated by MUI by chonky to separate our own MUI themes.\r\n seed: 'chonky'\r\n});\r\n\r\ninterface GalleryVFSBrowserProps {\r\n externalFilesToUpload: FileList | null;\r\n clearExternalFilesToUpload? : () => void;\r\n onSingleSelect: (mediaFile: CustomFileData) => void;\r\n onMultiSelect: (mediaFiles: CustomFileData[]) => void;\r\n externalFileToRename?: CustomFileData;\r\n clearExternalFileToRename?: () => void;\r\n maxNumItemsPerPage?: number;\r\n singleClickFileSelect?: boolean;\r\n onSingleClickSelect?: (mediaFile: CustomFileData) => void;\r\n skipFetchOnRender?: boolean;\r\n disableActions?: boolean;\r\n fullScreenDragNDrop?: boolean;\r\n allowUploadCancel?: boolean;\r\n onUploadedImages?: (mediaFiles: CustomFileData[]) => void;\r\n maxNumUploads?: number;\r\n}\r\n\r\ntype VFSProps = Partial & GalleryVFSBrowserProps;\r\n\r\nconst GalleryVFSBrowser: React.FC = React.memo(props => {\r\n const maxNumUploads = props.maxNumUploads && props.maxNumUploads > 0 ? props.maxNumUploads : 50;\r\n const maxUploadMbSize = 25;\r\n\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const [successMessage, setSuccessMessage] = useState(\"\");\r\n\r\n const [pageNumber, setPageNumber] = useState(1);\r\n const [pageAmount, setPageAmount] = useState(props.maxNumItemsPerPage ?? cookie.getRowsPerPage(ROWS_PER_PAGE_COOKIE_NAMES.GALLERY, DEFAULT_MEDIA_GALLERY_ROWS_PER_PAGE));\r\n\r\n const [runFetchOnEmptySearch, setRunFetchOnEmptySearch] = useState(true);\r\n const uploadedImageIds = useRef>(new Set());\r\n\r\n const [showDragDropOverlay, setShowDragDropOverlay] = useState(false);\r\n const [openCreateFolderDialog, setOpenCreateFolderDialog] = useState(false);\r\n const [fileToRename, setFileToRename] = useState(null);\r\n const [openRenameDialog, setOpenRenameDialog] = useState(false);\r\n const [filesToDelete, setFilesToDelete] = useState([]);\r\n const [deleting, setDeleting] = useState(false);\r\n const [isInnerDragNDrop, setIsInnerDragNDrop] = useState(false);\r\n const dragEventValueDebounce = useDragEventDebounce(isInnerDragNDrop, showDragDropOverlay, setShowDragDropOverlay);\r\n\r\n const [moveFilesForAppBar, setMoveFilesForAppBar] = useState({ filesToMove: [], moveSrc: null });\r\n const fileBrowserRef = React.useRef(null);\r\n const [currentFolderId, setCurrentFolderId] = useState(props.imageLibrary.currDir?.id ?? ROOT_FOLDER_ID);\r\n const [currSortGroupName, setCurrSortGroupName] = useState(SortGroupName.Newest);\r\n const [currFilterGroupName, setCurrFilterGroupName] = useState(FilterGroupName.AllImages);\r\n const [toggleShowFoldersFirst, setToggleShowFoldersFirst] = useState(true);\r\n\r\n const fetchImages = async (\r\n newPageAmount?: number, \r\n newPageNumber?: number,\r\n parentId?: string,\r\n searchText?: string,\r\n sortType?: SortGroupName,\r\n filterType?: FilterGroupName,\r\n showFoldersFirst?: boolean,\r\n ) => {\r\n \r\n await props.fetchImages(\r\n true, \r\n newPageAmount ?? pageAmount, \r\n newPageNumber ?? pageNumber,\r\n moveFilesForAppBar,\r\n {\r\n parentId: parentId === ROOT_FOLDER_ID ? undefined : parentId ?? props.imageLibrary.currDir?.id,\r\n searchText,\r\n sortType: sortType ?? currSortGroupName,\r\n filterType: filterType ?? currFilterGroupName,\r\n showFoldersFirst: showFoldersFirst ?? toggleShowFoldersFirst,\r\n }\r\n );\r\n\r\n setRunFetchOnEmptySearch(true);\r\n }\r\n\r\n const {\r\n totalToUpload,\r\n totalUploaded,\r\n invalidFiles,\r\n showInvalidFilesConfirmDialog,\r\n onInvalidFilesDialogConfirm,\r\n verifiedFiles,\r\n duplicateFiles,\r\n consolidatedDuplicateFiles,\r\n showDuplicateFilesConfirmDialog,\r\n duplicateFilesDirName,\r\n applyActionToAllDuplicates,\r\n setApplyActionToAllDuplicates,\r\n verifyUploadFiles,\r\n verifyMediaForMove,\r\n resetAllFilesUploadState,\r\n popLastDuplicateFile,\r\n hideDuplicateDialogAndUploadFiles,\r\n onDuplicateDialogAction\r\n } = useFileUploadFunctions(\r\n maxNumUploads,\r\n maxUploadMbSize,\r\n setErrorMessage,\r\n setSuccessMessage,\r\n props.fetchImageByName,\r\n props.fetchImageByNameAsFileData,\r\n props.fetchFolderByNameAsFileData,\r\n props.deleteFolderByName,\r\n props.deleteImagesFromLibrary,\r\n props.getUniqueFolderName,\r\n props.getUniqueFileName,\r\n props.renameFolder,\r\n props.renameImage,\r\n props.moveMedia,\r\n fetchImages,\r\n props.deleteImageByName,\r\n props.upload,\r\n props.setUploading,\r\n props.imageLibrary.currDir,\r\n props.onUploadedImages,\r\n props.clearExternalFilesToUpload\r\n );\r\n\r\n const searchValueDebounce = useSearchValueDebounce(\"\", runFetchOnEmptySearch, setCurrentFolderId, fetchImages);\r\n const showLoading = props.imageLibrary.deleting ||\r\n props.imageLibrary.fetching ||\r\n deleting;\r\n const abortController = React.useRef(new AbortController());\r\n\r\n useEffect(() => {\r\n if (props.skipFetchOnRender && !props.imageLibrary.shouldFetch) return;\r\n \r\n fetchImages();\r\n }, []);\r\n\r\n const onChangePage = (page: number, rowsPerPage: number) => {\r\n setPageNumber(page);\r\n setPageAmount(rowsPerPage);\r\n\r\n fetchImages(rowsPerPage, page, undefined, searchValueDebounce.debVal);\r\n }\r\n\r\n const onFilterChange = (sortType?: SortGroupName, filterType?: FilterGroupName, showFoldersFirst?: boolean) => {\r\n if (sortType !== undefined) setCurrSortGroupName(sortType);\r\n if (filterType !== undefined) setCurrFilterGroupName(filterType);\r\n if (showFoldersFirst !== undefined) setToggleShowFoldersFirst(showFoldersFirst);\r\n\r\n fetchImages(undefined, undefined, undefined, searchValueDebounce.debVal, sortType, filterType, showFoldersFirst);\r\n }\r\n\r\n const onCurrentFolderChange = (parentId: string) => {\r\n setRunFetchOnEmptySearch(false);\r\n searchValueDebounce.setDebVal(\"\");\r\n setCurrentFolderId(parentId);\r\n setPageNumber(1);\r\n fetchImages(undefined, 1, parentId);\r\n setRunFetchOnEmptySearch(true);\r\n }\r\n\r\n const onClearSearchText = () => {\r\n setRunFetchOnEmptySearch(false);\r\n searchValueDebounce.setDebVal(\"\");\r\n setPageNumber(1);\r\n fetchImages(undefined, 1, undefined, searchValueDebounce.debVal);\r\n setRunFetchOnEmptySearch(true);\r\n }\r\n\r\n const onDrop = (e: React.DragEvent) => {\r\n onDragEnd(e);\r\n\r\n verifyUploadFiles(e.dataTransfer.files);\r\n }\r\n\r\n const onDragStartDelay = (e: React.DragEvent) => {\r\n e.persist();\r\n dragEventValueDebounce.setDebVal(e);\r\n }\r\n\r\n const onDivDragEnd = (e: React.DragEvent) => {\r\n if (isInnerDragNDrop) {\r\n e.preventDefault();\r\n setIsInnerDragNDrop(false);\r\n }\r\n\r\n setShowDragDropOverlay(false);\r\n }\r\n\r\n const onDragEnd = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n if (showDragDropOverlay) setShowDragDropOverlay(false);\r\n }\r\n\r\n const onCloseMoveFiles = () => {\r\n setMoveFilesForAppBar({ filesToMove: [], moveSrc: null });\r\n\r\n if (fileBrowserRef.current)\r\n fileBrowserRef.current.requestFileAction(resetMoveFileStateAction, undefined);\r\n }\r\n\r\n useEffect(() => {\r\n if (props.externalFilesToUpload && props.externalFilesToUpload.length > 0) {\r\n verifyUploadFiles(props.externalFilesToUpload);\r\n }\r\n }, [props.externalFilesToUpload]);\r\n\r\n useEffect(() => {\r\n if (props.externalFileToRename && props.clearExternalFileToRename) {\r\n setFileToRename(props.externalFileToRename);\r\n setOpenRenameDialog(true);\r\n }\r\n }, [props.externalFileToRename]);\r\n\r\n useEffect(() => {\r\n if (uploadedImageIds.current.size > 0 && props.onUploadedImages) {\r\n const uploadedImages = props.imageLibrary.chonkyFileData.filter(file => uploadedImageIds.current.has(file.id));\r\n if (uploadedImages) {\r\n props.onUploadedImages(uploadedImages);\r\n uploadedImageIds.current = new Set();\r\n }\r\n }\r\n }, [props.imageLibrary.chonkyFileData, uploadedImageIds]);\r\n\r\n return (\r\n \r\n \r\n \r\n abortController.current.abort()}\r\n />\r\n setOpenCreateFolderDialog(false)}\r\n fetchImages={() => fetchImages(undefined, undefined, undefined, searchValueDebounce.debVal)}\r\n clearExternalFileToRename={props.clearExternalFileToRename}\r\n openRenameDialog={openRenameDialog}\r\n fileToRename={fileToRename}\r\n onRenameDialogClose={() => setOpenRenameDialog(false)}\r\n filesToDelete={filesToDelete}\r\n setSuccessMessage={(message: string) => setSuccessMessage(message)}\r\n onCurrentFolderChange={onCurrentFolderChange}\r\n onDeleteDialogClose={() => setFilesToDelete([])}\r\n onDeleteStarted={() => setDeleting(true)}\r\n onDeleteFinished={() => setDeleting(false)}\r\n />\r\n \r\n resetAllFilesUploadState()}\r\n onDeny={() => resetAllFilesUploadState()}\r\n onConfirm={() => onInvalidFilesDialogConfirm()}\r\n maxUploadMbSize={maxUploadMbSize}\r\n maxUploadNumber={maxNumUploads}\r\n hasValidFilesToUpload={verifiedFiles.length > 0 || duplicateFiles.length > 0}\r\n >\r\n {\r\n verifiedFiles.length > 0 && \r\n `Only ${verifiedFiles.length + duplicateFiles.length} will be uploaded. Would you like to continue?`\r\n }\r\n \r\n resetAllFilesUploadState()}\r\n onDeny={() => applyActionToAllDuplicates ? hideDuplicateDialogAndUploadFiles() : popLastDuplicateFile()}\r\n onOption={() => onDuplicateDialogAction(FileUploadAction.Replace)}\r\n onConfirm={() => onDuplicateDialogAction(FileUploadAction.Rename)}\r\n onCheckboxChange={(_, checked) => setApplyActionToAllDuplicates(checked)}\r\n dirName={duplicateFilesDirName}\r\n />\r\n setSuccessMessage(\"\")}\r\n />\r\n setErrorMessage(\"\")}\r\n />\r\n \r\n \r\n );\r\n});\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: VFSProps)=>({\r\n ...ownProps,\r\n imageLibrary: state.posts.imageLibrary,\r\n currentUser: state.settings.currentUser,\r\n }), \r\n {\r\n fetchImages: PostActions.fetchImages,\r\n fetchFolderByName: PostActions.fetchFolderByName,\r\n fetchImageByName: PostActions.fetchImageByName,\r\n fetchFolderByNameAsFileData: PostActions.fetchFolderByNameAsFileData,\r\n fetchImageByNameAsFileData: PostActions.fetchImageByNameAsFileData,\r\n renameImage: PostActions.renameImage,\r\n renameFolder: PostActions.renameFolder,\r\n deleteFolder: PostActions.deleteFolder,\r\n deleteImages: PostActions.deleteImagesFromLibrary,\r\n deleteImageByName: PostActions.deleteImageByName,\r\n setUploading: PostActions.setUploading,\r\n getUniqueFileName: PostActions.getUniqueFileName,\r\n upload: PostActions.uploadImage,\r\n deleteFolderByName: PostActions.deleteFolderByName,\r\n getUniqueFolderName: PostActions.getUniqueFolderName,\r\n deleteImagesFromLibrary: PostActions.deleteImagesFromLibrary,\r\n moveMedia: PostActions.moveMedia\r\n }\r\n)\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(GalleryVFSBrowser);","import { imageExtFromMimeType } from \"modules/gallery/chonkyFileAdapter\";\r\nimport { AttachedFile, CustomFileData } from \"modules/gallery/models\";\r\n\r\nexport const chonkyCustomDataToAttachedFile = (image: CustomFileData): AttachedFile => {\r\n return {\r\n blobId: image.blobId ?? image.id,\r\n fileExtension: imageExtFromMimeType(image.mimeType),\r\n fileName: image.name,\r\n fileType: \"image\",\r\n fileUrl: image.thumbnailUrl,\r\n ospreyId: image.id\r\n } as AttachedFile\r\n}","import * as React from 'react';\r\nimport { Button } from \"@mui/material\";\r\nimport FileUploadIcon from '@mui/icons-material/FileUpload';\r\n\r\ninterface IUploadMediaProps {\r\n onFileUpload(files: FileList): void;\r\n};\r\n\r\nconst UploadMediaButton: React.FunctionComponent = (props) => {\r\n const onFileInputChanged = (e: React.FormEvent): void => {\r\n const files = (e.target as HTMLInputElement).files;\r\n\r\n props.onFileUpload(files!);\r\n };\r\n\r\n return(\r\n <>\r\n }\r\n component=\"label\"\r\n >\r\n Upload\r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport default UploadMediaButton;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { AttachedFile, CustomFileData } from \"modules/gallery/models\";\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport GalleryVFSBrowser from \"modules/gallery/components/galleryVFSBrowser\";\r\nimport { chonkyCustomDataToAttachedFile } from \"utils/chonkyCustomDataToAttachedFile\";\r\nimport UploadMediaButton from \"modules/gallery/components/uploadMediaButton\";\r\nimport { DialogActions, Stack } from \"@mui/material\";\r\nimport LaunchIcon from '@mui/icons-material/Launch';\r\nimport { onNextFrame } from \"utils/onNextFrame\";\r\nimport { addCustomSelectedFilesStylingDivs } from \"modules/gallery/components/customStylingFunctions\";\r\n\r\nimport \"../styles/imageGalleryDialog.sass\";\r\n\r\nclass ImageGalleryDialog extends React.Component {\r\n private MAX_SELECTABLE_IMAGES: number = 20;\r\n\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n imageLink: \"\",\r\n selectableImages: this.getSelectableImages(),\r\n selectedImages: this.getSelectedImages(),\r\n isLinkDialog: false,\r\n filesToUpload: null,\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.show && !prevProps.show)\r\n this.setState({\r\n ...this.state,\r\n selectableImages: this.getSelectableImages(),\r\n selectedImages: this.getSelectedImages(),\r\n isLinkDialog: false,\r\n }, () => this.renderSelectedFilesStyles());\r\n }\r\n\r\n public render() {\r\n return (\r\n \r\n \r\n
    \r\n
    \r\n {this.state.isLinkDialog ? \"Insert Image Using Link\" : \"Select Image\"}\r\n {\r\n this.props.multiSelect &&\r\n (select up to {this.MAX_SELECTABLE_IMAGES})\r\n }\r\n
    \r\n
    \r\n {\r\n !this.state.isLinkDialog &&\r\n this.setState({ filesToUpload: files })} />\r\n }\r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n {\r\n !this.state.isLinkDialog &&\r\n this.onChonkySelectedImages(files)}\r\n onSingleSelect={(file: CustomFileData) => this.onChonkySelectedImages([file])}\r\n externalFilesToUpload={this.state.filesToUpload}\r\n clearExternalFilesToUpload={() => this.setState({filesToUpload: null})}\r\n disableActions\r\n maxNumItemsPerPage={12}\r\n singleClickFileSelect\r\n onSingleClickSelect={(file: CustomFileData) => this.onChonkySelectedImages([file])}\r\n fullScreenDragNDrop\r\n allowUploadCancel\r\n onUploadedImages={(files: CustomFileData[]) =>{this.onChonkySelectedImages(files, true)}}\r\n />\r\n }\r\n {\r\n this.state.isLinkDialog &&\r\n \r\n }\r\n \r\n \r\n
    \r\n {\r\n this.props.allowLink && !this.state.isLinkDialog &&\r\n \r\n }\r\n {\r\n this.state.isLinkDialog &&\r\n \r\n }\r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n { this.renderSelectedFilesStyles() }\r\n
    \r\n );\r\n }\r\n\r\n private onChonkySelectedImages = (images: CustomFileData[], runApplyAfter?: boolean) => {\r\n if (images.length === 0) return;\r\n\r\n if (this.props.multiSelect) {\r\n const existingImageIds = new Set(this.state.selectedImages.map(image => image.ospreyId));\r\n const matchingIds = new Set(images.filter(image => existingImageIds.has(image.id)).map(image => image.id));\r\n\r\n const imagesWithoutAnyMatchingIds = this.state.selectedImages\r\n .filter(image => !matchingIds.has(image.ospreyId))\r\n .concat(images.filter(image => !matchingIds.has(image.id)).map(chonkyCustomDataToAttachedFile));\r\n\r\n this.setState(\r\n { selectedImages: imagesWithoutAnyMatchingIds.splice(0, this.MAX_SELECTABLE_IMAGES) },\r\n () => runApplyAfter \r\n ? this.onApply() \r\n : this.renderSelectedFilesStyles()\r\n );\r\n }\r\n else {\r\n const imageToSelect = images[0];\r\n\r\n this.setState((prev) => ({ \r\n selectedImages: prev.selectedImages[0]?.ospreyId === imageToSelect.id \r\n ? [] \r\n : [chonkyCustomDataToAttachedFile(imageToSelect)]\r\n }), \r\n () => runApplyAfter ? this.onApply() : this.renderSelectedFilesStyles()\r\n );\r\n }\r\n }\r\n\r\n private onUseImageLink = (isLink: boolean) => {\r\n this.setState({ isLinkDialog: isLink });\r\n }\r\n\r\n private getSelectableImages = (): number => {\r\n if (this.props.multiSelect)\r\n return this.MAX_SELECTABLE_IMAGES - (this.props.attachedContent || []).length;\r\n\r\n return !!this.props.selectedImage ? 0 : 1;\r\n }\r\n\r\n private getSelectedImages = (): AttachedFile[] => {\r\n if (this.props.multiSelect)\r\n return this.props.attachedContent || [];\r\n\r\n return !!this.props.selectedImage ? [this.props.selectedImage] : []\r\n }\r\n\r\n private onApply = () => {\r\n if (!this.state.isLinkDialog)\r\n this.props.onApply(this.state.selectedImages);\r\n else\r\n this.props.onApply([{\r\n blobId: \"\",\r\n fileExtension: \"\",\r\n fileName: \"\",\r\n fileType: \"image\",\r\n fileUrl: this.state.imageLink,\r\n ospreyId: \"\"\r\n }]);\r\n \r\n this.onClose();\r\n }\r\n\r\n private onChangeImageLink = (event) => {\r\n this.setState({ ...this.state, imageLink: event.target.value.trim() });\r\n }\r\n\r\n private onClose = () => {\r\n this.props.onClose();\r\n }\r\n\r\n private renderSelectedFilesStyles = () => onNextFrame(() => addCustomSelectedFilesStylingDivs(this.state.selectedImages.map(image => image.ospreyId)));\r\n}\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n allowLink?: boolean;\r\n attachedContent?: AttachedFile[];\r\n includeVideos?: boolean;\r\n multiSelect?: boolean;\r\n selectedImage?: AttachedFile;\r\n onApply: (selectedImages: AttachedFile[]) => void;\r\n onClose: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n imageLink: string;\r\n selectableImages: number;\r\n selectedImages: AttachedFile[];\r\n isLinkDialog: boolean;\r\n filesToUpload: FileList | null;\r\n}\r\n\r\nconst connector = connect((state: GlobalApplicationState, ownProps: ComponentProps) => ( ownProps ));\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(ImageGalleryDialog);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\nimport { ChromePicker } from \"react-color\";\r\n\r\n\r\nclass IntenseEmphasis extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n color: props.tenantSettings.themeSettings ? props.tenantSettings.themeSettings.color! : \"#247ada\"\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.show && !prevProps.show)\r\n this.setState({ ...this.state, color: this.props.tenantSettings.themeSettings ? this.props.tenantSettings.themeSettings.color! : \"#247ada\" });\r\n }\r\n\r\n public render() {\r\n return (\r\n \r\n \r\n
    \r\n Intense Emphasis\r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n\r\n private onApply = () => {\r\n this.props.onApply(this.state.color);\r\n }\r\n\r\n private onChangeColor = (event) => {\r\n this.setState({ ...this.state, color: event.target.value.trim() });\r\n }\r\n\r\n private onClose = () => {\r\n this.props.onClose();\r\n }\r\n\r\n private onSelectColor = (color) => {\r\n this.setState({ ...this.state, color: color.hex });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n onApply: (color: string) => void;\r\n onClose: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n color: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantSettings: state.settings.tenantSettings\r\n }),\r\n {}\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(IntenseEmphasis);","import { useState, useRef } from \"react\";\r\n\r\nimport { AttachedFile } from \"modules/gallery\";\r\n\r\ntype UseTinyMceAuthoringLogicReturnType = {\r\n inlineImageDialogOpen: boolean;\r\n intenseEmphasisDialogOpen: boolean;\r\n editorRef: React.MutableRefObject; // can't get typing for this object\r\n onShowInlineImageDialog: () => void;\r\n onShowIntenseEmphasisDialog: () => void;\r\n onApplyInlineImage: (images: AttachedFile[], maxWidth?: number) => Promise;\r\n onApplyIntenseEmphasis: (color: string) => void;\r\n onHideInlineImageDialog: () => void;\r\n onHideIntenseEmphasisDialog: () => void;\r\n}\r\n\r\n/**\r\n * Encapsulates common logic when using authoringTinyMce\r\n */\r\nconst useTinyMceAuthoringLogic = (getImage: (id: string) => Promise ): UseTinyMceAuthoringLogicReturnType => {\r\n const [inlineImageDialogOpen, setInlineImageDialogOpen] = useState(false);\r\n const [intenseEmphasisDialogOpen, setIntenseEmphasisDialogOpen] = useState(false);\r\n\r\n const editorRef = useRef(null);\r\n\r\n const onHideInlineImageDialog = () => setInlineImageDialogOpen(false);\r\n const onHideIntenseEmphasisDialog = () => setIntenseEmphasisDialogOpen(false);\r\n\r\n const onShowInlineImageDialog = () => setInlineImageDialogOpen(true);\r\n const onShowIntenseEmphasisDialog = () => setIntenseEmphasisDialogOpen(true);\r\n\r\n const onChangeInlineImage = (image: AttachedFile, maxWidth?: number) => {\r\n if (editorRef.current)\r\n editorRef.current.insertContent(``);\r\n }\r\n\r\n const onApplyInlineImage = async (images: AttachedFile[], maxWidth?: number) => {\r\n try {\r\n const img = await getImage(images[0].ospreyId);\r\n onChangeInlineImage(img, maxWidth);\r\n } catch (error) {\r\n onChangeInlineImage(images[0], maxWidth);\r\n } finally {\r\n onHideInlineImageDialog();\r\n }\r\n }\r\n\r\n const onChangeIntenseEmphasis = (color: string) => {\r\n if (editorRef.current)\r\n editorRef.current.formatter.apply(\"intense-emphasis\", { color });\r\n }\r\n\r\n const onApplyIntenseEmphasis = (color: string) => {\r\n onChangeIntenseEmphasis(color);\r\n onHideIntenseEmphasisDialog();\r\n }\r\n\r\n return {\r\n inlineImageDialogOpen,\r\n intenseEmphasisDialogOpen,\r\n editorRef,\r\n onApplyInlineImage,\r\n onShowInlineImageDialog,\r\n onShowIntenseEmphasisDialog,\r\n onApplyIntenseEmphasis,\r\n onHideInlineImageDialog,\r\n onHideIntenseEmphasisDialog,\r\n };\r\n}\r\n\r\nexport { useTinyMceAuthoringLogic };\r\n","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\n\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport FilledInput from \"../forms/inputs/filledInput\";\r\nimport { AuthoringTinyEditor } from \"./authoringTinyMce\";\r\nimport * as actions from 'modules/posts/actionCreator';\r\nimport * as galleryActions from \"modules/gallery/actionCreator\";\r\n\r\nimport ImageGalleryDialog from \"./dialogs/imageGalleryDialog\";\r\nimport IntenseEmphasis from \"./dialogs/intenseEmphasis\";\r\nimport { useTinyMceAuthoringLogic } from \"modules/common/hooks/useTinyMceAuthoringLogic\";\r\nimport { ICustomCssModelv1 } from \"api/files\";\r\nimport { PromptTypeEnum } from \"modules/smartContent/models\";\r\nimport { RawEditorOptions } from \"tinymce\";\r\nimport { IPersonalizationToken } from \"modules/emails/models\";\r\n\r\ninterface IBodyv2Props {\r\n value?: string;\r\n label?: string;\r\n editorOptions?: (RawEditorOptions & { selector?: undefined; target?: undefined; });\r\n activeLcid?: string;\r\n enableSmartContentBodyButton?: boolean;\r\n enableSmartContentTitleButton?: boolean;\r\n enableSmartContentSummarizeButton?: boolean;\r\n fetchingAnalyses?: boolean;\r\n showSCDropdownButton?: boolean;\r\n changedSinceSaved?: boolean;\r\n customCss?: ICustomCssModelv1;\r\n smartContentSuggestion?: string;\r\n onFocus?: () => void;\r\n onFullscreen?: (isFullscreen?: boolean) => void;\r\n onChange: (body: string) => void;\r\n onShowSmartContentInsert?: (highlightedText: string, promptType: PromptTypeEnum) => void;\r\n clearSmartContentSuggestion?: () => void;\r\n generateAndOpenSmartContent?: (promptTypeForGeneration: PromptTypeEnum, promptTypeForInsert: PromptTypeEnum, body?: string) => void;\r\n required?: boolean;\r\n personalizationTokens?: IPersonalizationToken[];\r\n maxWidth?: number;\r\n livePreview?: boolean;\r\n enableEmbeddedMedia?: boolean;\r\n enablePageEmbed?: boolean;\r\n}\r\n\r\nconst Bodyv2: React.FunctionComponent = ({\r\n value,\r\n label = \"Body\",\r\n editorOptions,\r\n defaultLcid,\r\n activeLcid,\r\n fetchingAnalyses = false,\r\n customCss,\r\n smartContentSuggestion,\r\n showSCDropdownButton,\r\n changedSinceSaved,\r\n onFocus,\r\n onFullscreen,\r\n onChange,\r\n grabMentionUsers,\r\n getImage,\r\n onShowSmartContentInsert,\r\n clearSmartContentSuggestion,\r\n generateAndOpenSmartContent,\r\n required = true,\r\n personalizationTokens,\r\n maxWidth,\r\n livePreview,\r\n enableEmbeddedMedia = true,\r\n enablePageEmbed = true\r\n}) => {\r\n const {\r\n editorRef,\r\n intenseEmphasisDialogOpen,\r\n inlineImageDialogOpen,\r\n onShowInlineImageDialog,\r\n onShowIntenseEmphasisDialog,\r\n onApplyInlineImage,\r\n onApplyIntenseEmphasis,\r\n onHideInlineImageDialog,\r\n onHideIntenseEmphasisDialog,\r\n } = useTinyMceAuthoringLogic(getImage);\r\n\r\n return (\r\n <>\r\n \r\n \r\n onApplyInlineImage(selected, maxWidth)} onClose={onHideInlineImageDialog} />\r\n \r\n \r\n );\r\n}\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IBodyv2Props) => ({\r\n ...ownProps,\r\n defaultLcid: state.settings.tenantSettings.defaultLCID,\r\n activeLanguage: state.settings.activeLanguageLCID\r\n }),\r\n {\r\n grabMentionUsers: actions.getMentionsUsers,\r\n getImage: galleryActions.getImage\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\nexport default connector(Bodyv2);\r\n","import { List, Popover, TextField } from '@mui/material';\r\nimport SearchIcon from '@mui/icons-material/Search';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport * as React from 'react';\r\nimport MoreOptionsItem from '../../moreOptionsItem';\r\nimport { SortStyle } from 'utils/managementUtils';\r\n\r\ninterface SortOption {\r\n text: string;\r\n value: SortStyle;\r\n}\r\n\r\nconst DocumentGallerySearch: React.FunctionComponent = props => {\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const [calloutOpen, setCalloutOpen] = React.useState(false);\r\n const [text, setText] = React.useState(props.text);\r\n\r\n const SortOptions: SortOption[] = [\r\n { text: \"Last Modified\", value: SortStyle.modifiedDesc },\r\n { text: \"Newest first\", value: SortStyle.publishDesc },\r\n { text: \"Oldest first\", value: SortStyle.publishAsc },\r\n { text: \"A-Z\", value: SortStyle.titleAsc },\r\n { text: \"Z-A\", value: SortStyle.titleDesc }\r\n ];\r\n\r\n const checkKeyPress = (e) => {\r\n if(e.key === \"Enter\") {\r\n props.onUpdateText(e.target.value);\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n ,\r\n endAdornment: props.text !== \"\" && { props.onUpdateText(\"\"); setText(\"\"); }}/>\r\n }}\r\n onChange={(e) => setText(e.target.value)}\r\n onKeyDown={checkKeyPress}\r\n fullWidth\r\n className=\"text-to-search\"\r\n disabled={props.disabled}\r\n />\r\n
    \r\n
    { setAnchorEl(ev.currentTarget); setCalloutOpen(true); }}>\r\n Sort by\r\n {SortOptions.find((option) => option.value === props.sortStyle)!.text}\r\n
    \r\n setCalloutOpen(false)}\r\n anchorOrigin={{\r\n vertical: \"bottom\",\r\n horizontal: \"left\"\r\n }}\r\n >\r\n \r\n {SortOptions.map((option) =>\r\n {\r\n props.onChangeSort(option.value);\r\n setCalloutOpen(false);\r\n }}\r\n />\r\n )}\r\n \r\n \r\n
    \r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n onChangeSort: (sort: SortStyle) => void;\r\n onUpdateText: (text: string) => void;\r\n sortStyle: SortStyle;\r\n text: string;\r\n disabled: boolean;\r\n}\r\n\r\nexport default DocumentGallerySearch;","import React, { useState } from \"react\";\r\nimport Cookies, { ROWS_PER_PAGE_COOKIE_NAMES } from \"utils/cookie\";\r\nimport numeral from \"numeral\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Popover from \"@mui/material/Popover\";\r\nimport TablePagination from \"@mui/material/TablePagination\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\n/*\r\n Display component designed to showcase a lack of results.\r\n*/\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n paging: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"flex-end\",\r\n position: \"sticky\",\r\n backgroundColor: \"#ffffff\",\r\n bottom: 0,\r\n padding: \"5px 20px 0 20px\"\r\n },\r\n paginationActions: {\r\n flexShrink: 0,\r\n marginLeft: theme.spacing(2.5),\r\n },\r\n caption: {\r\n fontWeight: 500,\r\n margin: 0\r\n },\r\n callout: {\r\n backgroundColor: \"#ffffff\",\r\n boxShadow: \"0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12)\",\r\n right: 24,\r\n borderRadius: 5,\r\n boxSizing: \"border-box\",\r\n padding: \"5px 0\"\r\n },\r\n calloutArrow: {\r\n position: \"relative\",\r\n height: 15,\r\n left: \"calc(50% - 20px)\",\r\n width: 30,\r\n overflow: \"hidden\",\r\n \"&::after\": {\r\n content: `\"\"`,\r\n position: \"absolute\",\r\n width: 15,\r\n height: 15,\r\n backgroundColor: \"#ffffff\",\r\n transform: \"rotate(45deg)\",\r\n bottom: 8,\r\n right: 8,\r\n boxShadow: \"0 0 4px #aaaaaa\"\r\n }\r\n }\r\n })\r\n);\r\n\r\n\r\nconst getRowsPerPage = (): number => {\r\n const rowsPerPage = Cookies.get(ROWS_PER_PAGE_COOKIE_NAMES.DEFAULT);\r\n if (!!rowsPerPage) return +rowsPerPage;\r\n return 10;\r\n}\r\n\r\nconst Paging: React.FunctionComponent = () => {\r\n const [rowsPerPage] = useState(getRowsPerPage());\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n\r\n const classes = useStyles();\r\n \r\n return (\r\n
    \r\n }\r\n onClick={(ev: any) => setAnchorEl(ev.currentTarget)}\r\n disabled\r\n >\r\n Show {rowsPerPage} rows\r\n \r\n setAnchorEl(null)}\r\n onClose={() => setAnchorEl(null)}\r\n >\r\n
    \r\n
    \r\n
    \r\n \r\n `${numeral(from).format(\"0,0\")} - ${numeral(to).format(\"0,0\")} of ${numeral(count).format(\"0,0\")}`}\r\n rowsPerPage={rowsPerPage}\r\n page={0}\r\n onPageChange={() => {}} //Never should be able to click this.\r\n classes={{\r\n selectLabel: classes.caption,\r\n displayedRows: classes.caption\r\n }}\r\n />\r\n
    \r\n );\r\n};\r\n\r\nexport default Paging;","import React from \"react\";\r\nimport { Typography } from \"@mui/material\";\r\nimport PagingEmpty from \"./pagingEmpty\";\r\n\r\nconst ManagementEmptyResults: React.FunctionComponent = props => {\r\n let heightToUse = props.height;\r\n if(!heightToUse)\r\n heightToUse = props.hasFilters ? \"51vh\" : \"68vh\";\r\n\r\n return (\r\n \r\n {props.hasFilters &&\r\n Results\r\n }\r\n
    \r\n \"Magnifying\r\n {props.hasFilters ? `No Matches Found` : `No ${props.searchType} Found`}\r\n {!props.hidePaging \r\n &&
    \r\n \r\n
    \r\n }\r\n
    \r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n searchType: string;\r\n hasFilters: boolean;\r\n height?: string;\r\n hidePaging?: boolean;\r\n}\r\n\r\nexport default ManagementEmptyResults;","import * as React from \"react\";\r\nimport * as galleryActions from \"modules/gallery/actionCreator\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport { Document } from \"modules/documents/models\";\r\nimport { AttachedFile } from \"modules/gallery/models\";\r\nimport Uploader from \"../uploader/uploader\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Tab from \"@mui/material/Tab\";\r\nimport Tabs from \"@mui/material/Tabs\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport Pagination from '@mui/material/Pagination';\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport DocumentGallerySearch from \"./documentGallerySearch\";\r\nimport { SortStyle } from \"utils/managementUtils\";\r\nimport ManagementEmptyResults from \"../../managementEmptyResults\";\r\n\r\nclass DocumentGallery extends React.Component {\r\n private MAX_SELECTABLE_FILES: number = 20;\r\n\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n isUploading: false,\r\n selectableFiles: this.getSelectableFiles(),\r\n selectedFiles: this.getSelectedFiles(),\r\n selectedTab: 0,\r\n sortStyle: SortStyle.titleAsc,\r\n searchText: \"\"\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.show && !prevProps.show) {\r\n this.setState({\r\n ...this.state,\r\n selectableFiles: this.getSelectableFiles(),\r\n selectedFiles: this.getSelectedFiles(),\r\n selectedTab: 0\r\n });\r\n\r\n this.props.getDocumentGallery(1, \"\", this.state.sortStyle);\r\n }\r\n }\r\n\r\n public render() {\r\n const { documentGallery } = this.props;\r\n\r\n return (\r\n \r\n \r\n
    \r\n
    \r\n Select Documents\r\n
    \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n \r\n {this.state.selectedTab === 0 &&\r\n \r\n \r\n {documentGallery.isFetching\r\n ? \r\n :\r\n
    \r\n {documentGallery.totalDocuments !== 0\r\n ?
    \r\n {documentGallery.documents.map((document) => {\r\n const isSelectedIndex: number = this.state.selectedFiles.findIndex((selectedFile) => selectedFile.ospreyId === document.id);\r\n const isSelected: boolean = isSelectedIndex > -1;\r\n return (\r\n
    this.onSelectDocument(document, !isSelected)}>\r\n
    \r\n {document.fileType}\r\n {isSelected &&\r\n
    {isSelectedIndex + 1}
    \r\n }\r\n
    \r\n
    {document.title || `${document.fileName}.${document.fileType}`}
    \r\n
    \r\n );\r\n })}\r\n
    \r\n :
    \r\n \r\n
    \r\n }\r\n \r\n
    \r\n }\r\n
    \r\n }\r\n {this.state.selectedTab === 1 &&\r\n \r\n }\r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n\r\n private getSelectableFiles = (): number => {\r\n return this.MAX_SELECTABLE_FILES - (this.props.fileAttachments || []).length;\r\n }\r\n\r\n private onChangeSort = (sort: SortStyle) => {\r\n this.setState({sortStyle: sort});\r\n this.onGetDocumentGalleryPage(null, 1, this.state.searchText, sort);\r\n }\r\n\r\n private onChangeText = (inputText: string) => {\r\n this.setState({searchText: inputText});\r\n this.onGetDocumentGalleryPage(null, 1, inputText, this.state.sortStyle);\r\n }\r\n\r\n private getSelectedFiles = (): AttachedFile[] => {\r\n return this.props.fileAttachments || [];\r\n }\r\n\r\n private onApply = () => {\r\n this.props.onApply(this.state.selectedFiles);\r\n this.onClose();\r\n }\r\n\r\n private onClose = () => {\r\n this.props.onClose();\r\n }\r\n\r\n private onGetDocumentGalleryPage = (ev, pageNumber: number, text?: string, sort?: SortStyle) => {\r\n let textToUse = text ?? this.state.searchText;\r\n let sortToUse = sort ?? this.state.sortStyle;\r\n\r\n this.props.getDocumentGallery(pageNumber, textToUse, sortToUse);\r\n }\r\n\r\n private onSelectDocument = (document: Document, select: boolean) => {\r\n if (select) {\r\n const selectedFile: AttachedFile = {\r\n blobId: document.id,\r\n fileExtension: document.fileType,\r\n fileName: document.title || `${document.fileName}.${document.fileType}`,\r\n fileType: \"application\",\r\n fileUrl: \"\",\r\n ospreyId: document.id\r\n };\r\n if (this.state.selectableFiles > 0)\r\n this.setState({ selectedFiles: this.state.selectedFiles.concat([selectedFile]) });\r\n } else {\r\n this.setState({ selectedFiles: this.state.selectedFiles.filter((selectedImage) => selectedImage.ospreyId !== document.id) });\r\n }\r\n }\r\n\r\n private onSelectTab = (ev, tabIndex: number) => {\r\n this.setState({ ...this.state, selectedTab: tabIndex });\r\n }\r\n\r\n private onSetUploading = (isUploading: boolean) => {\r\n this.setState({ ...this.state, isUploading });\r\n }\r\n\r\n private onUpload = (file: File, onProgress, onLoad, onError, onAbort): Promise => {\r\n return this.props.uploadDocument(file, onProgress, onLoad, onError, onAbort).then((document) => {\r\n const fileAttachments: AttachedFile[] = this.props.fileAttachments || [];\r\n this.props.onApply(fileAttachments.concat([{\r\n blobId: document.blobId,\r\n fileUrl: \"\",\r\n fileName: document.fileName,\r\n fileType: \"application\",\r\n fileExtension: document.fileType,\r\n ospreyId: document.id\r\n }]));\r\n });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n fileAttachments?: AttachedFile[];\r\n onApply: (fileAttachments: AttachedFile[]) => void;\r\n onClose: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n isUploading: boolean;\r\n selectableFiles: number;\r\n selectedFiles: AttachedFile[];\r\n selectedTab: number;\r\n sortStyle: SortStyle;\r\n searchText: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n documentGallery: state.gallery.documentGallery\r\n }), {\r\n getDocument: galleryActions.getDocument,\r\n getDocumentGallery: galleryActions.getDocumentGallery,\r\n uploadDocument: galleryActions.uploadDocument\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(DocumentGallery);\r\n","import * as React from \"react\";\r\n\r\nimport { AttachedFile } from \"modules/gallery/models\";\r\nimport DocumentGallery from \"./dialogs/documentGallery\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Paper from \"@mui/material/Paper\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport BlockIcon from \"@mui/icons-material/Block\";\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\n\r\nimport \"./fileAttachments.sass\"\r\n\r\nconst DEFAULT_BUTTON_LABEL = \"ADD/EDIT FILES\"\r\nconst DEFAULT_REMOVE_LABEL = \"REMOVE ALL FILES\"\r\nconst DEFAULT_NO_ATTACHMENTS_MSG = \"No attachments found\"\r\n\r\nclass FileAttachments extends React.Component {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n showDocumentGallery: false\r\n };\r\n }\r\n\r\n private getEmptyAttachmentText = () : JSX.Element => {\r\n const { fileAttachments } = this.props;\r\n if (!fileAttachments || fileAttachments.length === 0)\r\n return (\r\n
    {DEFAULT_NO_ATTACHMENTS_MSG}
    );\r\n \r\n return ;\r\n }\r\n\r\n private _getTitle = (): string => {\r\n const { fileAttachments } = this.props;\r\n\r\n let label = \"Attach files\";\r\n if (fileAttachments && fileAttachments.length === 1)\r\n label = \"Attached file (1)\";\r\n else if (fileAttachments && fileAttachments.length > 1)\r\n label = `Attached files (${fileAttachments.length})`;\r\n\r\n return label;\r\n }\r\n\r\n private _getItem = (fileAttachment: AttachedFile) => {\r\n const { itemCloseIcon } = this.props;\r\n return (\r\n \r\n
    \r\n {/* only show 37 characters */}\r\n {fileAttachment.fileName.length > 37\r\n ? \r\n {fileAttachment.fileName}\r\n \r\n : {fileAttachment.fileName}}\r\n
    \r\n
    \r\n this.onRemoveFileAttachment(fileAttachment)}>\r\n {itemCloseIcon || }\r\n \r\n
    \r\n \r\n );\r\n }\r\n\r\n public render() {\r\n const {\r\n fileAttachments,\r\n footNoteStyle,\r\n buttonLabel,\r\n v2 = false,\r\n } = this.props;\r\n\r\n return (\r\n \r\n \r\n
    \r\n
    {this._getTitle()}
    \r\n {v2\r\n ? \r\n : <>\r\n {fileAttachments && fileAttachments.length > 0 &&\r\n
    \r\n \r\n
    }\r\n }\r\n
    \r\n {!!(fileAttachments || []).length && fileAttachments!.map(this._getItem)}\r\n {v2\r\n ? fileAttachments && fileAttachments.length > 1 &&\r\n
    \r\n \r\n
    \r\n :\r\n }\r\n\r\n {this.getEmptyAttachmentText()}\r\n\r\n
    \r\n Attaching large files can affect publishing time\r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private onApplyFileAttachmentChanges = (fileAttachments: AttachedFile[]) => {\r\n this.props.onChange(fileAttachments);\r\n }\r\n\r\n private onHideDocumentGallery = () => {\r\n this.setState({ ...this.state, showDocumentGallery: false });\r\n }\r\n\r\n private onRemoveFileAttachment = (fileAttachment: AttachedFile) => {\r\n this.props.onChange(this.props.fileAttachments!.filter((file) => file.ospreyId !== fileAttachment.ospreyId));\r\n }\r\n\r\n private onShowDocumentGallery = () => {\r\n this.setState({ ...this.state, showDocumentGallery: true });\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n fileAttachments: AttachedFile[] | undefined;\r\n buttonLabel?: string;\r\n itemCloseIcon?: JSX.Element;\r\n removeLabel?: string;\r\n footNoteStyle?: React.CSSProperties;\r\n isGreyPaper?: boolean;\r\n v2?: boolean; //authoring v2 layout\r\n onChange: (fileAttachments: AttachedFile[]) => void;\r\n onRemove: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n showDocumentGallery: boolean;\r\n}\r\n\r\nexport default FileAttachments;\r\n","import React from \"react\";\r\n\r\nimport { Button, Paper } from \"@mui/material\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport { AttachedFile } from \"modules/gallery\";\r\n\r\nimport \"./fileAttachmentDisplay.sass\";\r\nimport { postsApi } from \"api/instances\";\r\n\r\ninterface ComponentProps {\r\n attachments: AttachedFile[];\r\n}\r\n\r\nconst MAX_FILE_NAME_DISPLAY_LEN = 37;\r\n\r\nconst FileAttachmentDisplay: React.FunctionComponent = (props) => {\r\n const getTitle = (): string => {\r\n if (props.attachments.length === 0) return \"Attach files\";\r\n\r\n return props.attachments.length > 1\r\n ? `Attached files (${props.attachments.length})`\r\n : \"Attached file (1)\";\r\n };\r\n\r\n const openDocument = (file: AttachedFile) => {\r\n if (\r\n file.fileUrl &&\r\n (file.fileExtension === \"png\" || file.fileExtension === \"jpg\" || file.fileExtension === \"jpeg\" || file.fileExtension === \"pdf\")\r\n ) {\r\n window.open(file.fileUrl);\r\n }\r\n else if (file.fileUrl) {\r\n postsApi.DownloadFile(file.fileUrl, file.fileName, file.fileExtension);\r\n }\r\n };\r\n\r\n const getFittingName = (file: AttachedFile): JSX.Element => {\r\n const name = file.fileName;\r\n\r\n return name.length > MAX_FILE_NAME_DISPLAY_LEN\r\n ? \r\n \r\n {name}\r\n \r\n : {name};\r\n };\r\n\r\n const getItem = (fileAttachment: AttachedFile) => {\r\n return (\r\n openDocument(fileAttachment)}\r\n >\r\n {getFittingName(fileAttachment)}\r\n \r\n );\r\n };\r\n\r\n return (\r\n \r\n
    \r\n {getTitle()}\r\n
    \r\n {(props.attachments || [])\r\n .map((file: AttachedFile) => getItem(file))}\r\n
    \r\n );\r\n};\r\n\r\nexport default FileAttachmentDisplay;","/**\r\n * Parse html text\r\n * - find any anchors tags that do not open in new tab and have hash character\r\n * - prefix href of thos anchor tags with the current url\r\n */\r\nexport const parseAnchors = (body: string) => {\r\n let updatedHTML = body;\r\n let html: HTMLDivElement = document.createElement(\"div\");\r\n html.innerHTML = body;\r\n\r\n let anchors = html.getElementsByTagName(\"a\");\r\n\r\n for (let i = 0; i < anchors.length; i++) {\r\n const hasAnchor = !!anchors[i].hash && anchors[i].target !== \"_blank\";\r\n if (hasAnchor) {\r\n const anchorIndex = window.location.href.indexOf(\"#\");\r\n const locationHref = anchorIndex !== -1 ? window.location.href.slice(0, anchorIndex) : window.location.href;\r\n updatedHTML = updatedHTML.replace(`href=\"${anchors[i].hash}\"`, `href=\"${locationHref + anchors[i].hash}\"`);\r\n }\r\n }\r\n\r\n return updatedHTML;\r\n};\r\n\r\n\r\n/**\r\n * Calculates the number of lines a given text content will take up\r\n * in a container with a specified width, assuming consistent line height.\r\n *\r\n * @param {number} width - The width of the container in pixels.\r\n * @param {string} text - The text content to be measured.\r\n * @returns {number} - The estimated number of lines the text will occupy.\r\n */\r\nexport const calculateNumberOfLines = (width: number, text: string) => {\r\n // create a dummy element off-screen\r\n const temp = document.createElement('div');\r\n\r\n temp.style.width = width + 'px';\r\n temp.style.position = 'absolute';\r\n temp.style.visibility = 'hidden';\r\n temp.style.whiteSpace = 'pre-wrap'; // Preserve line breaks\r\n temp.innerHTML = text;\r\n\r\n // append the dummy element to the body\r\n document.body.appendChild(temp);\r\n\r\n // measure the height of the dummy element\r\n const numberOfLines = temp.clientHeight / parseInt(getComputedStyle(temp).lineHeight);\r\n\r\n // remove the dummy element from the DOM\r\n document.body.removeChild(temp);\r\n\r\n return numberOfLines;\r\n}\r\n\r\ndeclare global {\r\n interface Navigator {\r\n msSaveBlob: (blobOrBase64: Blob | string, filename: string) => void\r\n }\r\n}\r\n","import * as React from \"react\";\r\nimport { DialogContent, DialogTitle, Divider, IconButton } from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew';\r\n\r\nimport FileAttachmentDisplay from \"../fileAttachmentDisplay\";\r\nimport { parseAnchors } from \"utils/htmlUtils\";\r\nimport { AttachedFile } from \"modules/gallery\";\r\nimport { ospreyApi } from \"api/instances\";\r\n\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { useSelector } from \"react-redux\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport \"./contentGuidelines.sass\";\r\n\r\ninterface IContentGuidelinePreviewBodyProps {\r\n onClose?: () => void;\r\n isAuthoring?: boolean;\r\n}\r\n\r\nconst ContentGuidelinePreviewBody: React.FunctionComponent = (props) => {\r\n const { guidelines } = useSelector((state: GlobalApplicationState) => state.guidelines);\r\n const { id: tenantId } = useSelector((state: GlobalApplicationState) => state.tenant);\r\n \r\n const guidelineAttachments = guidelines?.attachments;\r\n const [attachedFiles, setAttachedFiles] = React.useState(guidelines?.attachments ?? []);\r\n \r\n React.useEffect(() => {\r\n const fetchNewUrls = async (filesWithoutUrls: AttachedFile[]) => {\r\n const updatedFiles = await ospreyApi.getFilesWithUrls(filesWithoutUrls);\r\n const filesWithUrls = guidelineAttachments?.filter(file => file.fileUrl) ?? [];\r\n\r\n setAttachedFiles([...filesWithUrls, ...updatedFiles]);\r\n };\r\n\r\n if (guidelineAttachments) {\r\n const filesMissingUrl = guidelineAttachments.filter(file => !file.fileUrl);\r\n\r\n if (filesMissingUrl.length > 0) {\r\n fetchNewUrls(filesMissingUrl);\r\n }\r\n else {\r\n const validFiles = guidelineAttachments.filter(file => file.fileUrl);\r\n setAttachedFiles(validFiles)\r\n }\r\n };\r\n }, [guidelineAttachments]);\r\n\r\n const openInNew = () => {\r\n window.open(`${tenantId}/admin/guidelines`, '_blank');\r\n };\r\n\r\n if (!guidelines) return ;\r\n \r\n return (\r\n
    \r\n \r\n
    {guidelines.header}
    \r\n\r\n
    \r\n {\r\n props.isAuthoring &&\r\n \r\n \r\n \r\n }\r\n {\r\n props.onClose &&\r\n \r\n \r\n \r\n }\r\n
    \r\n
    \r\n\r\n \r\n \r\n\r\n
    \r\n
    \r\n
    \r\n\r\n { guidelines.description && attachedFiles.length > 0 && }\r\n\r\n {\r\n attachedFiles.length > 0 && \r\n }\r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default ContentGuidelinePreviewBody;","import React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\n\r\nimport { cognitiveServicesApi, settingsApi } from 'api/instances';\r\nimport ContentGuidelines from './guidelines/contentGuidelines';\r\nimport { useReadabilitySettings } from 'modules/common/hooks/data/useReadabilitySettings';\r\nimport { useContentGuidelines } from 'modules/common/hooks/data/useContentGuidelines';\r\nimport { ReadabilitySettingsForm } from './readability/readabilitySettingsForm';\r\nimport { actions, IContentGuidelines, IReadabilitySettings } from 'modules/settings';\r\nimport Loading from 'modules/common/components/loading';\r\nimport '../styles/settingsTabWithSidebar.sass';\r\nimport './contentSettings.sass';\r\n\r\nenum ContentSettingsTabs {\r\n Guidelines,\r\n Readability,\r\n}\r\n\r\nexport const ContentSettingsForm: React.FunctionComponent = (props) => {\r\n const [activeTab, setActiveTab] = React.useState(ContentSettingsTabs.Guidelines);\r\n\r\n const {\r\n options: readabilityOptions,\r\n settings: readabilitySettings,\r\n onChange: onChangeReadabilitySettings,\r\n defaults: defaultReadabilitySettings,\r\n resetToDefault: resetReadabilitySettings,\r\n isPristine: isReadabilityPristine,\r\n } = useReadabilitySettings();\r\n\r\n const {\r\n guidelines: contentGuidelines,\r\n onChange: onChangeContentGuidelines,\r\n resetToDefault: resetContentGuidelines,\r\n isEmpty: isGuidelineEmpty,\r\n isPristine: isGuidelinePristine,\r\n } = useContentGuidelines();\r\n\r\n const { completeResetSettings, completeSaveSettings } = props;\r\n\r\n // saving actions\r\n React.useEffect(() => {\r\n const saveContentSettings = async () => {\r\n try {\r\n if (readabilitySettings && props.isSmartContentEnabled && !isReadabilityPristine) await cognitiveServicesApi.saveReadabilitySettings(readabilitySettings);\r\n if (contentGuidelines && !isGuidelinePristine) await settingsApi.SaveContentSettings(contentGuidelines);\r\n }\r\n catch {\r\n completeSaveSettings();\r\n }\r\n };\r\n\r\n if (props.saving) saveContentSettings();\r\n }, [props.saving, props.isSmartContentEnabled, isGuidelinePristine, isReadabilityPristine, contentGuidelines, readabilitySettings, completeSaveSettings]);\r\n\r\n // resetting actions\r\n React.useEffect(() => {\r\n const resetContentSettings = async () => {\r\n try {\r\n if (readabilitySettings && !isReadabilityPristine && props.isSmartContentEnabled) resetReadabilitySettings();\r\n if (contentGuidelines && !isGuidelinePristine) resetContentGuidelines();\r\n }\r\n finally {\r\n completeResetSettings();\r\n }\r\n };\r\n\r\n if (props.resetting) resetContentSettings();\r\n }, [props.resetting, props.isSmartContentEnabled, isGuidelinePristine, isReadabilityPristine, contentGuidelines, readabilitySettings, completeResetSettings, resetReadabilitySettings, resetContentGuidelines]);\r\n\r\n const getContentGuidelinesTab = (): JSX.Element => {\r\n const onChange = (settings: IContentGuidelines) => {\r\n props.changePristine(false);\r\n onChangeContentGuidelines(settings);\r\n };\r\n\r\n return ;\r\n };\r\n\r\n const getReadabilitySettingsTab = (): JSX.Element => {\r\n const onChange = (settings: IReadabilitySettings) => {\r\n props.changePristine(false);\r\n onChangeReadabilitySettings(settings);\r\n };\r\n\r\n return ;\r\n };\r\n\r\n const tabMapping = [\r\n { id: ContentSettingsTabs.Guidelines, title: \"Content Guidelines\", content: getContentGuidelinesTab() },\r\n { id: ContentSettingsTabs.Readability, title: \"Readability Settings\", content: getReadabilitySettingsTab() }\r\n ];\r\n\r\n const tabs = () => tabMapping.map((tab) => {\r\n const active = tab.id === activeTab ? '--active' : '';\r\n return (\r\n
    setActiveTab(tab.id)}>\r\n {tab.title}\r\n
    \r\n );\r\n });\r\n\r\n const getTabContent = (): JSX.Element | undefined =>\r\n tabMapping.find((tab) => tab.id === activeTab)?.content;\r\n\r\n if (props.fetching) return ;\r\n\r\n return (\r\n \r\n {\r\n props.isSmartContentEnabled\r\n ?
    \r\n
    \r\n {tabs()}\r\n
    \r\n
    \r\n {getTabContent()}\r\n
    \r\n
    \r\n : getContentGuidelinesTab()\r\n }\r\n
    \r\n );\r\n};\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState) => ({\r\n fetching: state.settings.fetching,\r\n saving: state.settings.saving,\r\n resetting: state.settings.resetting,\r\n isSmartContentEnabled: state.settings.tenantSettings.showFeatures.postSmartContentEnabledForTenant,\r\n }),\r\n {\r\n changePristine: actions.changePristineState,\r\n completeSaveSettings: actions.completeSaveSettings,\r\n completeResetSettings: actions.completeResetSettings\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default (connector(ContentSettingsForm));\r\n","import React from \"react\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\n\r\nimport ContentGuidelinePreviewBody from \"./contentGuidelinePreviewBody\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport { Typography } from \"@mui/material\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { actions } from \"modules/profile\";\r\nimport Cookies, { COMMON_COOKIE_KEYS } from \"utils/cookie\";\r\n\r\nimport { GuidelineHint, HintType } from \"modules/common/components/authoring/dialogs/guidelineHint\";\r\nimport \"./contentGuidelines.sass\";\r\n\r\ninterface IContentGuidelinePreviewProps {\r\n showPreview: boolean;\r\n onClose: () => void;\r\n isAuthoring?: boolean;\r\n hintType?: HintType;\r\n}\r\n\r\nconst AUTO_HIDE_GUIDELINES_MESSAGE = \"Don't automatically show this again\";\r\n\r\nconst ContentGuidelinePreview: React.FunctionComponent = (props) => {\r\n const [autoHide, setAutoHide] = React.useState(props.autoHideContentGuidelines ?? false);\r\n const [openGuidelineHint, setOpenGuidelineHint] = React.useState(false);\r\n\r\n const updateUserSettings = async () => {\r\n if (props.autoHideContentGuidelines === autoHide) return;\r\n\r\n await props.saveUserSettings({ ...props.currentUser, hideContentGuidelines: autoHide });\r\n };\r\n\r\n const handleDialogClose = async () => {\r\n await updateUserSettings();\r\n props.onClose();\r\n\r\n if (props.hintType && Cookies.isFirstSet(`${props.hintType.toString()}-${COMMON_COOKIE_KEYS.GUIDELINE_PREVIEWED}`))\r\n setOpenGuidelineHint(true);\r\n };\r\n\r\n const contentGuidelineHint = React.useMemo(() => {\r\n if (!props.hintType) return ;\r\n\r\n return setOpenGuidelineHint(false)}\r\n hintType={props.hintType}>\r\n ;\r\n }, [openGuidelineHint, props.hintType]);\r\n\r\n const autoHideOption = React.useMemo((): JSX.Element =>\r\n setAutoHide(checked)}\r\n />\r\n }\r\n label={{AUTO_HIDE_GUIDELINES_MESSAGE}}\r\n />, [autoHide]);\r\n\r\n return (\r\n <>\r\n \r\n \r\n\r\n {\r\n props.isAuthoring &&\r\n \r\n {autoHideOption}\r\n \r\n }\r\n \r\n {contentGuidelineHint}\r\n \r\n );\r\n};\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IContentGuidelinePreviewProps) => ({\r\n ...ownProps,\r\n autoHideContentGuidelines: state.settings.currentUser.hideContentGuidelines,\r\n currentUser: state.settings.currentUser\r\n }),\r\n {\r\n saveUserSettings: actions.saveUserSettings,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(ContentGuidelinePreview);","import React from \"react\";\r\nimport { Button, Divider, Typography } from \"@mui/material\";\r\n\r\nimport VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined';\r\nimport Bodyv2 from \"modules/common/components/authoring/bodyv2\";\r\nimport FileAttachments from \"modules/common/components/authoring/fileAttachments\";\r\nimport FilledInput from \"modules/common/components/forms/inputs/filledInput\";\r\n\r\nimport { DEFAULT_CONTENT_GUIDELINES, IContentGuidelines } from \"modules/settings\";\r\nimport { AttachedFile } from \"modules/gallery\";\r\n\r\nimport ContentGuidelinePreview from \"./contentGuidelinePreview\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport \"../../../../common/components/authoring/authoring.sass\";\r\nimport \"./contentGuidelines.sass\";\r\n\r\ninterface IContentGuidelinesProps {\r\n isGuidelineEmpty: boolean;\r\n onChange: (newGuidelines: Partial) => void;\r\n}\r\n\r\nconst TAB_HEADER = \"Content Guidelines\";\r\nconst DISCLAIMER_TEXT = \"Provide brand or writing guidelines for employees when creating new content.\";\r\nconst MAX_HEADER_LENGTH = 100;\r\n\r\nconst ContentGuidelines: React.FunctionComponent = (props) => {\r\n const [showPreview, setShowPreview] = React.useState(false);\r\n const { guidelines } = useSelector((state: GlobalApplicationState) => state.guidelines);\r\n\r\n const onChangeBody = (description: string) => props.onChange({ ...guidelines, description });\r\n\r\n const onChangeHeader = (event: React.FocusEvent) => {\r\n let newHeader = event.target.value as string;\r\n\r\n const originalHeader = guidelines?.header ?? DEFAULT_CONTENT_GUIDELINES.header;\r\n if (originalHeader !== newHeader) props.onChange({ ...guidelines, header: newHeader });\r\n };\r\n\r\n const onChangeAttachments = (attachments: AttachedFile[]) => props.onChange({ ...guidelines, attachments });\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n {TAB_HEADER} \r\n\r\n setShowPreview(true)}\r\n startIcon={}>\r\n Preview\r\n \r\n
    \r\n \r\n {DISCLAIMER_TEXT}\r\n\r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n onChangeAttachments([])}\r\n footNoteStyle={{ visibility: \"hidden\" }}\r\n />\r\n {\r\n guidelines &&\r\n setShowPreview(false)}\r\n isAuthoring={false}\r\n />\r\n }\r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default ContentGuidelines;\r\n","import { useRef } from 'react'\r\n\r\n/**\r\n * Hook to determine whether this is the first render\r\n * - i.e. a componentDidMount, sort of, function component version\r\n * - adapted from https://usehooks-ts.com/react-hook/use-is-first-render\r\n */\r\nconst useIsFirstRender= (): boolean => {\r\n const isFirst = useRef(true)\r\n\r\n if (isFirst.current) {\r\n isFirst.current = false\r\n\r\n return true\r\n }\r\n\r\n return isFirst.current\r\n}\r\n\r\nexport default useIsFirstRender\r\n","import { useEffect, useRef, useState } from \"react\";\r\n\r\nimport { IReadabilitySettings, IReadabilitySettingsOptionModel } from \"modules/settings\";\r\nimport useIsMounted from \"../useIsMounted\";\r\nimport { cognitiveServicesApi } from \"api/instances\";\r\nimport useIsFirstRender from \"../useIsFirstRender\";\r\n\r\nexport type UseReadabilitySettingsReturnType = {\r\n options?: IReadabilitySettingsOptionModel;\r\n settings?: IReadabilitySettings;\r\n onChange: (newSettings: IReadabilitySettings) => void;\r\n resetToDefault: () => void;\r\n defaults: IReadabilitySettings | undefined;\r\n isPristine: boolean;\r\n}\r\n\r\n/**\r\n * Hook to use readability settings and options\r\n * returns {options, settings, onChange, resetToDefault, defaults, isPristine};\r\n */\r\nexport const useReadabilitySettings = (): UseReadabilitySettingsReturnType => {\r\n const isMounted = useIsMounted();\r\n const isFirstRender = useIsFirstRender();\r\n\r\n const [options, setOptions] = useState();\r\n const [selections, setSelections] = useState();\r\n const [isPristine, setIsPristine] = useState(true);\r\n\r\n const defaults = useRef();\r\n\r\n useEffect(() => {\r\n const fetch = async () => {\r\n let newOpts: IReadabilitySettingsOptionModel | undefined;\r\n let newSelections: IReadabilitySettings | undefined;\r\n\r\n try {\r\n const OPTS_IDX = 0;\r\n const SETTINGS_IDX = 1;\r\n\r\n let results = await Promise.all([cognitiveServicesApi.getReadabilityOptions(), cognitiveServicesApi.getReadabilitySettings()]);\r\n\r\n newOpts = results[OPTS_IDX];\r\n newSelections = results[SETTINGS_IDX];\r\n\r\n // store defaults in case of reset\r\n if (isFirstRender)\r\n defaults.current = newSelections;\r\n\r\n }\r\n finally {\r\n if (isMounted()) {\r\n setIsPristine(true);\r\n setSelections(newSelections);\r\n setOptions(newOpts);\r\n }\r\n }\r\n }\r\n\r\n if (isFirstRender)\r\n fetch();\r\n }, [isMounted, isFirstRender]);\r\n\r\n const resetToDefault = (): void => {\r\n setSelections(defaults.current);\r\n setIsPristine(true);\r\n }\r\n\r\n const onChange = (newSettings: IReadabilitySettings) => {\r\n setSelections(newSettings);\r\n setIsPristine(false);\r\n }\r\n\r\n return { options, settings: selections, onChange, resetToDefault, defaults: defaults.current, isPristine }\r\n}","import { useEffect, useRef } from \"react\";\r\n\r\nimport { IContentGuidelines } from \"modules/settings\";\r\nimport useIsFirstRender from \"../useIsFirstRender\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { fetchContentGuidelines, guidelinesSlice } from \"modules/settings/components/content/guidelines/reducer\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { ThunkDispatch } from \"@reduxjs/toolkit\";\r\n\r\nexport type UseContentGuidelinesType = {\r\n guidelines?: IContentGuidelines;\r\n original?: IContentGuidelines;\r\n onChange: (newGuidelines: IContentGuidelines) => void;\r\n resetToDefault: () => void;\r\n isEmpty: boolean;\r\n isPristine: boolean;\r\n};\r\n\r\n/**\r\n * Hook to use content guidelines\r\n * returns {guidelines, onChange, resetToDefault, original, isEmpty, isPristine};\r\n */\r\nexport const useContentGuidelines = (): UseContentGuidelinesType => {\r\n const isFirstRender = useIsFirstRender();\r\n\r\n const dispatch = useDispatch>();\r\n const {\r\n guidelines,\r\n isEmpty,\r\n isPristine\r\n } = useSelector((state: GlobalApplicationState) => state.guidelines);\r\n\r\n const original = useRef();\r\n\r\n useEffect(() => {\r\n const fetchGuidelines = async () => {\r\n const result = await dispatch(fetchContentGuidelines()).unwrap();\r\n original.current = result;\r\n }\r\n\r\n if (isFirstRender) fetchGuidelines();\r\n\r\n }, [isFirstRender, dispatch]);\r\n\r\n const resetToDefault = (): void => {\r\n const guidelineState = {\r\n guidelines: original.current,\r\n isPristine: true\r\n }\r\n dispatch({ type: guidelinesSlice.actions.SET_GUIDELINES, payload: guidelineState })\r\n };\r\n\r\n const onChange = (newGuidelines: IContentGuidelines) => {\r\n const guidelineState = {\r\n guidelines: newGuidelines,\r\n isPristine: false\r\n }\r\n dispatch({ type: guidelinesSlice.actions.SET_GUIDELINES, payload: guidelineState })\r\n };\r\n\r\n return { guidelines, onChange, resetToDefault, original: original.current, isEmpty, isPristine };\r\n};\r\n","import React from \"react\";\r\nimport { IReadabilityOptionModel, IReadabilitySettings, IReadabilitySettingsOptionModel } from \"../../../models\";\r\nimport { MenuItem, Select, SelectChangeEvent } from \"@mui/material\";\r\n\r\nimport \"../../styles/readabilitySettings.sass\";\r\n\r\ninterface IReadabilitySettingsProps {\r\n options?: IReadabilitySettingsOptionModel;\r\n selections: IReadabilitySettings;\r\n enableDefaults?: boolean;\r\n enableInternalAverages?: boolean;\r\n internalAverages?: IReadabilitySettings;\r\n defaults: IReadabilitySettings | undefined;\r\n onChange: (newSelections: IReadabilitySettings) => void;\r\n}\r\n\r\n/**\r\n * List of selects for readability settings\r\n */\r\nconst ReadabilitySettings: React.FunctionComponent = ({\r\n selections,\r\n options,\r\n defaults,\r\n internalAverages,\r\n enableDefaults = false,\r\n enableInternalAverages = false,\r\n onChange,\r\n}) => {\r\n const onChangeLocal = (settingKey: string, selection: string) => {\r\n let newSelections = { ...selections };\r\n\r\n newSelections[settingKey] = selection;\r\n\r\n onChange(newSelections);\r\n }\r\n\r\n const isDefault = (settingKey: string, option: IReadabilityOptionModel): boolean => {\r\n if (!enableDefaults) return false;\r\n\r\n // global default\r\n let result: boolean = option.isDefault;\r\n\r\n // check if tenant has a default (this will be the same as global if tenant hasn't saved settings yet)\r\n if (defaults) {\r\n result = defaults[settingKey] === option.name;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n const isInternalAverage = (settingKey: string, option: IReadabilityOptionModel): boolean => {\r\n if (!enableInternalAverages) return false;\r\n\r\n let result: boolean = false;\r\n\r\n if (internalAverages) {\r\n result = internalAverages[settingKey] === option.name;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n const renderSetting = (settingKey: string, label: string, options: IReadabilityOptionModel[], selection: string) => {\r\n return (\r\n
    \r\n \r\n onChangeLocal(settingKey, event.target.value as string)}\r\n classes={{\r\n select: \"readability-select\"\r\n }}\r\n >\r\n {options && options.map((opt: IReadabilityOptionModel) => (\r\n \r\n {opt.name} {isDefault(settingKey, opt) && \"(Default)\"} {isInternalAverage(settingKey, opt) && \"(Internal Average)\"}\r\n ))}\r\n \r\n
    \r\n )\r\n }\r\n\r\n return (\r\n
    \r\n {options?.readability && renderSetting(\"readability\", \"Readability\", options.readability, selections.readability)}\r\n {options?.tone && renderSetting(\"tone\", \"Tone\", options.tone, selections.tone)}\r\n {options?.personalism && renderSetting(\"personalism\", \"Personalism\", options.personalism, selections.personalism)}\r\n {options?.sentiment && renderSetting(\"sentiment\", \"Sentiment\", options.sentiment, selections.sentiment)}\r\n {options?.gender && renderSetting(\"gender\", \"Gender\", options.gender, selections.gender)}\r\n {options?.length && renderSetting(\"length\", \"Length\", options.length, selections.length)}\r\n
    \r\n );\r\n}\r\n\r\nexport { ReadabilitySettings };\r\n","import React from \"react\";\r\n\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\n\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\nimport { ReadabilitySettings } from \"./readabilitySettings\";\r\nimport { IReadabilitySettings, IReadabilitySettingsOptionModel } from \"../../../models\";\r\nimport { useTenantPostAverages } from \"modules/common/hooks/data/useTenantPostAverageScores\";\r\n\r\ninterface IReadabilitySettingsFormProp {\r\n readabilityOptions?: IReadabilitySettingsOptionModel;\r\n readabilitySettings?: IReadabilitySettings;\r\n defaultReadabilitySettings?: IReadabilitySettings;\r\n onChangeReadabilitySettings: (newSettings: IReadabilitySettings) => void;\r\n}\r\n\r\nconst ReadabilitySettingsForm: React.FunctionComponent = ({\r\n readabilityOptions,\r\n readabilitySettings,\r\n defaultReadabilitySettings,\r\n onChangeReadabilitySettings\r\n}) => {\r\n const { postAverages } = useTenantPostAverages();\r\n\r\n const getPostAveragesProps = (): { internalAverages: IReadabilitySettings, enableInternalAverages: boolean} | undefined => {\r\n if (!postAverages) return undefined;\r\n\r\n return {\r\n enableInternalAverages: true,\r\n internalAverages: {\r\n id: \"\",\r\n tone: postAverages.averageToneLabel,\r\n sentiment: postAverages.averageSentimentLabel,\r\n personalism: postAverages.averagePersonalismLabel,\r\n readability: postAverages.averageReadabilityLabel,\r\n gender: \"\",\r\n length: \"\"\r\n }\r\n };\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n

    Default Readability Settings

    \r\n }\r\n text={
    Set the default readability settings used in Smart Content when your employees create new content. Internal average scores listed below are taken from your organization’s most engaging posts.
    }\r\n />\r\n {readabilityOptions && readabilitySettings &&\r\n }\r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport { ReadabilitySettingsForm };\r\n","import { useEffect, useState } from \"react\";\r\n\r\nimport { PostAverages } from \"modules/posts/models\";\r\nimport { postsApi } from \"api/instances\";\r\nimport useIsMounted from \"../useIsMounted\";\r\n\r\nexport type UseTenantPostAveragesReturnType = {\r\n postAverages: PostAverages | undefined;\r\n}\r\n\r\nexport const useTenantPostAverages = (): UseTenantPostAveragesReturnType => {\r\n const [postAverages, setPostAverages] = useState();\r\n const isMounted = useIsMounted();\r\n\r\n useEffect(() => {\r\n const fetch = async () => {\r\n try {\r\n const results = await postsApi.GetTenantPostAverages();\r\n\r\n if (isMounted())\r\n setPostAverages(results);\r\n } catch {}\r\n }\r\n\r\n fetch();\r\n }, [isMounted]);\r\n\r\n return {\r\n postAverages\r\n };\r\n}\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Chips from \"modules/common/components/chips/chips\";\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\n\r\nimport { SaveNewsletterModel, NewsletterDynamicContentWindow, NewsletterTopicOption, SimpleTag, SaveNewsletterModelStateErrors } from \"modules/newsletters/models\";\r\nimport EditTags from \"../../common/editTags\";\r\nimport Grid from \"@mui/material/Grid\";\r\nimport Switch from \"@mui/material/Switch\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport _ from \"lodash\";\r\nimport { FormControl, FormControlLabel, FormHelperText, MenuItem, Radio, RadioGroup, Select, Typography } from \"@mui/material\";\r\n\r\nenum PostSorting {\r\n OldestFirst,\r\n NewestFirst\r\n}\r\n\r\nclass ContentTypeAndTopicsSettings extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n includeUpcomingEvents: false,\r\n includeUnreadPosts: false\r\n };\r\n }\r\n\r\n public render() {\r\n const { newsletter } = this.props;\r\n\r\n const includeUnreadPosts = this.state.includeUnreadPosts || newsletter.maxPostsToInclude > 0;\r\n const includeUpcomingEvents = this.state.includeUpcomingEvents || newsletter.maxEventsToInclude > 0;\r\n const isNewsletterAdhoc = newsletter.recurrenceType === 'Adhoc';\r\n\r\n const postSortingOptions = [\"Oldest first\", \"Newest first\"];\r\n const postSortingCurrentValue = this.props.newsletter.sortPostsAscending ? PostSorting.OldestFirst : PostSorting.NewestFirst;\r\n\r\n return (\r\n
    \r\n

    Content type & topics

    \r\n
    \r\n \r\n \r\n Lock items to specific topics\r\n \r\n \r\n
    \r\n \r\n this.OnTopicsChange(event.target.value as NewsletterTopicOption)}\r\n >\r\n } label=\"Use employee's topic subscriptions\" />\r\n } label=\"Use all topics (ignore employee's topic subscriptions)\" />\r\n } label=\"Custom topics\" />\r\n \r\n {_.first(this.props.modelErrors?.CustomTopics)}\r\n \r\n {\r\n this.props.newsletter.topicOption === \"Custom\" && \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n Include posts section\r\n Upcoming unread posts will be included in the newsletter editions, if any.\r\n
    \r\n
    \r\n \r\n this.onIncludePostsChange(event.target.checked)}\r\n />\r\n \r\n
    \r\n {includeUnreadPosts && \r\n \r\n \r\n \r\n \r\n Include up to\r\n 0 ? this.props.newsletter.maxPostsToInclude : ''}\r\n onChange={this.onChangeMaxPostsToInclude}\r\n inputProps={{\r\n maxLength: 2\r\n }}\r\n />\r\n unread posts \r\n \r\n \r\n }\r\n { includeUnreadPosts && isNewsletterAdhoc &&\r\n \r\n \r\n \r\n \r\n Published\r\n 0 ? this.props.newsletter.postsToIncludeDaysWindow : ''}\r\n onChange={this.onChangePostsToIncludeDays}\r\n inputProps={{\r\n maxLength: 3\r\n }}\r\n />\r\n day(s) prior to issue date. \r\n \r\n \r\n }\r\n { includeUnreadPosts && !isNewsletterAdhoc &&\r\n \r\n \r\n \r\n \r\n
    \r\n Published\r\n
    \r\n
    \r\n event.target.checked && this.OnPostsToInclude('SinceLastIssue')} />} label=\"Since the last issue\" />\r\n
    \r\n
    \r\n event.target.checked && this.OnPostsToInclude('DaysBeforeCurrentIssue')} />} label=\"Day(s) prior to issue date\" style={{float:'left'}} />\r\n {\r\n this.props.newsletter.postsToInclude === \"DaysBeforeCurrentIssue\" && \r\n 0 ? this.props.newsletter.postsToIncludeDaysWindow : ''}\r\n onChange={this.onChangePostsToIncludeDays}\r\n inputProps={{\r\n maxLength: 3\r\n }}\r\n />\r\n }\r\n
    \r\n
    \r\n
    \r\n }\r\n { includeUnreadPosts &&\r\n \r\n \r\n \r\n \r\n Sorted by\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n
    \r\n Include events section\r\n Upcoming events will be included in the newsletter editions, if any.\r\n
    \r\n
    \r\n \r\n this.onIncludeEventsChange(event.target.checked)}\r\n />\r\n \r\n
    \r\n { includeUpcomingEvents && \r\n
    \r\n \r\n \r\n \r\n \r\n Include up to\r\n 0 ? this.props.newsletter.maxEventsToInclude : ''}\r\n onChange={this.onChangeMaxEventsToInclude}\r\n inputProps={{\r\n maxLength: 2\r\n }}\r\n />\r\n upcoming events\r\n \r\n \r\n \r\n \r\n \r\n \r\n In the next\r\n 0 ? this.props.newsletter.eventsToIncludeDaysWindow : ''}\r\n onChange={this.onChangeEventsToIncludeDays}\r\n inputProps={{\r\n maxLength: 3\r\n }}\r\n />\r\n day(s). \r\n \r\n \r\n
    \r\n }\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private onChangeCustomTopics = (customTopics: SimpleTag[]) => {\r\n this.props.onNewsletterChange({ customTopics });\r\n }\r\n\r\n private onChangeEventsToIncludeDays = (event) => {\r\n const regEx = /^[0-9\\b]+$/;\r\n if(event.target.value === '' || regEx.test(event.target.value)) {\r\n this.props.onNewsletterChange({eventsToIncludeDaysWindow: event.target.value});\r\n }\r\n \r\n if(this.props.newsletter.maxEventsToInclude && this.props.newsletter.maxEventsToInclude > 50) {\r\n this.props.onNewsletterChange({maxEventsToInclude: 50});\r\n }\r\n }\r\n\r\n private onChangeMaxEventsToInclude = (event) => {\r\n const regEx = /^[0-9\\b]+$/;\r\n if(event.target.value === '' || regEx.test(event.target.value)) {\r\n this.props.onNewsletterChange({maxEventsToInclude: event.target.value});\r\n }\r\n if(this.props.newsletter.maxEventsToInclude && this.props.newsletter.maxEventsToInclude > 50) {\r\n this.props.onNewsletterChange({maxEventsToInclude: 50});\r\n }\r\n }\r\n\r\n private onChangePostsToIncludeDays = (event) => {\r\n const regEx = /^[0-9\\b]+$/;\r\n if(event.target.value === '' || regEx.test(event.target.value)) {\r\n this.props.onNewsletterChange({postsToIncludeDaysWindow: event.target.value});\r\n }\r\n }\r\n\r\n private onChangeMaxPostsToInclude = (event) => {\r\n const regEx = /^[0-9\\b]+$/;\r\n if(event.target.value === '' || regEx.test(event.target.value)) {\r\n this.props.onNewsletterChange({maxPostsToInclude: event.target.value});\r\n }\r\n }\r\n\r\n private OnTopicsChange = (event: NewsletterTopicOption) => {\r\n this.props.onNewsletterChange({ topicOption: event });\r\n }\r\n\r\n private OnEventsToInclude = (event: NewsletterDynamicContentWindow) => {\r\n this.props.onNewsletterChange({ eventsToInclude: event });\r\n }\r\n\r\n private OnPostsToInclude = (event: NewsletterDynamicContentWindow) => {\r\n this.props.onNewsletterChange({ postsToInclude: event });\r\n }\r\n\r\n private onDeleteCustomTopic = (topicId: string) => {\r\n this.props.onNewsletterChange({ customTopics: this.props.newsletter.customTopics!.filter(topic => topic.id !== topicId) });\r\n }\r\n\r\n private onIncludePostsChange = (value: boolean) => {\r\n this.setState({includeUnreadPosts: value});\r\n if (!value) {\r\n this.props.onNewsletterChange({maxPostsToInclude: 0});\r\n }\r\n }\r\n\r\n private onIncludeEventsChange = (value: boolean) => {\r\n this.props.onNewsletterChange({includeUpcomingEvents: value});\r\n this.setState({includeUpcomingEvents: value});\r\n if (!value) {\r\n this.props.onNewsletterChange({maxEventsToInclude: 0});\r\n }\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n newsletter: SaveNewsletterModel;\r\n modelErrors: SaveNewsletterModelStateErrors | null;\r\n highlight: boolean;\r\n onNewsletterChange: (value: Partial) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n includeUnreadPosts: boolean;\r\n includeUpcomingEvents: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tagSettings: state.settings.tagSettings\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(ContentTypeAndTopicsSettings);","import * as React from \"react\";\r\nimport { withRouter, RouteComponentProps, Prompt } from \"react-router\";\r\nimport { replace } from \"react-router-redux\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as actions from \"../actionCreator\";\r\nimport { SettingsTab } from \"../models\";\r\nimport LoadingSpinner from \"modules/common/components/loadingSpinner\";\r\nimport GeneralSettingsForm from \"./generalSettingsForm\";\r\nimport ThemeSettingsForm from \"./themeSettingsForm\";\r\nimport LanguageSettingsForm from \"./languageSettingsForm\";\r\nimport FeatureControlsSettingsForm from \"./featureControlsSettingsForm\";\r\nimport ExternalSourcesSettingsForm from \"./externalSourcesSettingsForm\";\r\nimport MessagingCenterForm from \"./messaging/messagingCenterForm\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Header from \"pages/common/header\";\r\nimport MainContent from \"pages/common/mainContent\";\r\nimport ContentSettingsForm from \"./content/contentSettingsForm\";\r\n\r\ninterface ITab {\r\n id: string;\r\n name: string;\r\n content: JSX.Element;\r\n tab: SettingsTab;\r\n onSave?: () => Promise;\r\n}\r\n\r\nconst SettingsPageComponent: React.FunctionComponent = ({\r\n tenantSettings,\r\n fetching,\r\n location,\r\n match,\r\n errorMsg,\r\n pristine,\r\n saving: propsSaving,\r\n modifyURL,\r\n saveTenantSettings,\r\n resetTenantSettingsToPristine,\r\n getTenantSettings,\r\n}) => {\r\n const HASH_TAB_MAPPING = {\r\n general: SettingsTab.General,\r\n theme: SettingsTab.Theme,\r\n language: SettingsTab.Language,\r\n featureControls: SettingsTab.Features,\r\n externalSources: SettingsTab.External,\r\n newsletter: SettingsTab.Newsletter,\r\n messaging: SettingsTab.Messaging,\r\n contentSettings: SettingsTab.ContentSettings\r\n };\r\n const [activeSettingsTab, setActiveSettingsTab] = React.useState();\r\n \r\n const setStartingTab = React.useCallback(() => {\r\n let hash = location.hash.substring(1);\r\n setActiveSettingsTab(HASH_TAB_MAPPING[hash] || HASH_TAB_MAPPING.general);\r\n }, [location.hash, HASH_TAB_MAPPING]);\r\n\r\n React.useEffect(() => {\r\n if (!tenantSettings) {\r\n getTenantSettings();\r\n }\r\n\r\n (window as any).scrollTo(0, 0);\r\n setStartingTab();\r\n }, [getTenantSettings, setStartingTab, tenantSettings]);\r\n\r\n let working = fetching || propsSaving; \r\n\r\n let tabs: ITab[] = [\r\n { id: \"General\", name: \"General\", content: , tab: SettingsTab.General, onSave: undefined },\r\n { id: \"Theme\", name: \"Theme\", content: , tab: SettingsTab.Theme },\r\n { id: \"Language\", name: \"Time & Language\", content: , tab: SettingsTab.Language },\r\n { id: \"Features\", name: \"Feature Controls\", content: , tab: SettingsTab.Features },\r\n { id: \"External\", name: \"External Post Sources\", content: , tab: SettingsTab.External },\r\n { id: \"Messaging\", name: \"Notifications & Reminders\", content: , tab: SettingsTab.Messaging },\r\n { id: \"ContentSettings\", name: \"Content Settings\", content: ,tab: SettingsTab.ContentSettings }\r\n ];\r\n\r\n //feature toggle\r\n if (tenantSettings?.showFeatures?.externalPostSources) {\r\n tabs.push({ id: \"ExternalSources\", name: \"External Sources\", content: , tab: SettingsTab.External });\r\n }\r\n\r\n const tabClicked = (tabId) => {\r\n const tabIdAsString = Object.keys(HASH_TAB_MAPPING).find((r) => HASH_TAB_MAPPING[r] === tabId);\r\n const location = window.location.pathname + window.location.search + \"#\" + tabIdAsString;\r\n\r\n modifyURL(location);\r\n setActiveSettingsTab(tabId);\r\n };\r\n\r\n return (\r\n \r\n \r\n location.pathname !== `/${match.params.tenant}/admin/settings` && !pristine\r\n ? \"You have unsaved changes, are you sure you want to leave this page?\"\r\n : true\r\n }\r\n />\r\n \r\n \r\n
    \r\n {!tenantSettings ? (\r\n
    Fetching settings...
    \r\n ) : (\r\n
    \r\n
      \r\n {tabs.map((tab) => {\r\n return (\r\n
    • \r\n tabClicked(SettingsTab[tab.id])}\r\n >\r\n {tab.name}\r\n \r\n
    • \r\n );\r\n })}\r\n
    \r\n\r\n {tabs.map((tab) => {\r\n return (\r\n \r\n {tab.content}\r\n
    \r\n );\r\n })}\r\n {errorMsg &&
    {errorMsg}
    }\r\n
    \r\n await saveTenantSettings()}\r\n disabled={working || pristine}\r\n >\r\n { propsSaving ? \"Saving changes...\" : \"Save Changes\"}\r\n \r\n {true && }\r\n \r\n \r\n resetTenantSettingsToPristine()}\r\n disabled={working || pristine}\r\n >\r\n {fetching ? \"Resetting...\" : \"Reset\"}\r\n \r\n {fetching && }\r\n \r\n \r\n
    \r\n
    \r\n )}\r\n \r\n
    \r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps { }\r\n\r\ninterface RouteParams {\r\n tenant: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n fetching: state.settings.fetching,\r\n saving: state.settings.saving,\r\n resetting: state.settings.resetting,\r\n errorMsg: state.settings.errorMsg,\r\n tenantSettings: state.settings.tenantSettings,\r\n pristine: state.settings.pristine,\r\n }),\r\n {\r\n getTenantSettings: actions.getTenantSettings,\r\n saveTenantSettings: actions.saveTenantSettings,\r\n resetTenantSettingsToPristine: actions.resetTenantSettingsToPristine,\r\n modifyURL: replace,\r\n }\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport const SettingsPage = connector(withRouter(SettingsPageComponent));\r\n","import * as React from \"react\";\r\n\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\n\r\nconst Description: React.FunctionComponent = props => {\r\n return (\r\n
    \r\n
    Description
    \r\n props.onChange(event.target.value)}\r\n />\r\n
    \r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n description: string;\r\n onChange: (description: string) => void;\r\n}\r\n\r\nexport default Description;","import React, { CSSProperties, useState } from \"react\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Popover from \"@mui/material/Popover\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\nimport ArrowDropDownIcon from \"@mui/icons-material/ArrowDropDown\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n optionsWrapper: {\r\n display: \"inline-block\",\r\n position: \"relative\"\r\n },\r\n options: {\r\n position: \"absolute\",\r\n top: 8\r\n }\r\n })\r\n);\r\n\r\nconst MoreOptionsButton: React.FunctionComponent = props => {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n\r\n const classes = useStyles();\r\n\r\n const onClose = (ev) => {\r\n ev.stopPropagation();\r\n setAnchorEl(null);\r\n }\r\n\r\n return (\r\n
    \r\n {\r\n ev.stopPropagation();\r\n setAnchorEl(ev.currentTarget);\r\n }}\r\n className={props.className}\r\n >\r\n {props.text === \"\" ? null : (props.text || \"More Options\")}\r\n \r\n \r\n {\r\n onClose(ev);\r\n }}\r\n anchorOrigin={{\r\n vertical: \"bottom\",\r\n horizontal: \"left\"\r\n }}\r\n transformOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"left\"\r\n }}\r\n onClick={() => setAnchorEl(null)}\r\n >\r\n {props.children}\r\n \r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n text?: string;\r\n onClick?: (ev) => void;\r\n variant?: \"text\" | \"outlined\" | \"contained\" | undefined;\r\n color?: \"inherit\" | \"primary\" | \"secondary\" | \"default\" | undefined;\r\n size?: \"small\" | \"medium\" | \"large\" | undefined;\r\n disabled?: boolean;\r\n className?: string;\r\n divStyle?: CSSProperties;\r\n}\r\n\r\nexport default MoreOptionsButton;","import React from \"react\";\r\n\r\nimport MoreOptionsButton from \"modules/common/components/buttons/moreOptionsButton\";\r\n\r\nimport List from \"@mui/material/List\";\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\n\r\n\r\nconst EditOptions: React.FunctionComponent = props => {\r\n if (!props.id)\r\n return ;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n id?: string;\r\n onDelete: () => void;\r\n onDownloadUserData: () => void;\r\n}\r\n\r\nexport default EditOptions;","import React from \"react\";\r\n\r\nimport Switch from \"@mui/material/Switch\";\r\n\r\n\r\nconst Enabled: React.FunctionComponent = props => {\r\n return (\r\n
    \r\n
    Enabled?
    \r\n props.onChange(checked)}\r\n />\r\n
    \r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n isEnabled: boolean;\r\n onChange: (isEnabled: boolean) => void;\r\n}\r\n\r\nexport default Enabled;","import React from \"react\";\r\n\r\nimport { Rule, RuleApplicability, RuleComparator } from \"../../../models\";\r\nimport { TenantAttribute } from \"modules/settings/models\";\r\n\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Select from \"@mui/material/Select\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\n\r\n\r\nclass SmartRules extends React.Component {\r\n public componentDidMount() {\r\n if (!this.props.rules.length)\r\n this.onAddRule();\r\n }\r\n\r\n public render() {\r\n const { rules } = this.props;\r\n\r\n return (\r\n
    \r\n }\r\n text=\"Smart audiences dynamically add and remove users using the rules you apply. At least 1 rule is required.\"\r\n />\r\n
    \r\n
    Include users only if
    \r\n \r\n this.props.onChangeRuleApplicability(event.target.value as RuleApplicability)}\r\n >\r\n ALL rules are applicable to a user\r\n ANY rule is applicable to a user\r\n \r\n \r\n
    \r\n
    \r\n {rules.map((rule, index) => (\r\n this.getRuleSelection(rule, index + 1)\r\n ))}\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n\r\n private defaultRule = (): Rule => {\r\n return {\r\n key: \"\",\r\n comparator: \"equals\",\r\n value: \"\"\r\n };\r\n }\r\n\r\n private getRuleSelection = (rule: Rule, number: number) => {\r\n const RULE_MAX_CHAR_LIMIT = 10000;\r\n\r\n return (\r\n \r\n
    \r\n {(number !== 1 || this.props.rules.length > 1) &&\r\n this.onRemoveRule(number)} className=\"remove-rule\">\r\n }\r\n
    Rule {number}. Include a user if their user profile has...
    \r\n
    \r\n \r\n this.onChangeRuleKey(number, event.target.value as string)}\r\n >\r\n Select a profile field\r\n {this.props.tenantAttributes.map((tenantAttribute) =>\r\n {tenantAttribute.title}\r\n )}\r\n \r\n \r\n \r\n this.onChangeRuleComparator(number, event.target.value as RuleComparator)}\r\n >\r\n equal to\r\n NOT equal to\r\n contains\r\n does NOT contain\r\n {this.props.equalToAnyRuleEnabled && equal to ANY}\r\n \r\n \r\n this.onChangeRuleValue(number, event.target.value)}\r\n />\r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private onAddRule = () => {\r\n this.props.onChangeRules(this.props.rules.concat({ ...this.defaultRule() }));\r\n }\r\n\r\n private onChangeRule = (number: number, currentRule: Rule) => {\r\n let rules: Rule[] = [];\r\n this.props.rules.map((rule, index) => {\r\n if (index === number - 1)\r\n rules.push(currentRule);\r\n else\r\n rules.push(rule);\r\n return rule;\r\n });\r\n this.props.onChangeRules(rules);\r\n }\r\n\r\n private onChangeRuleComparator = (number: number, comparator: RuleComparator) => {\r\n this.onChangeRule(number, { ...this.props.rules[number - 1], comparator });\r\n }\r\n\r\n private onChangeRuleKey = (number: number, key: string) => {\r\n this.onChangeRule(number, { ...this.props.rules[number - 1], key });\r\n }\r\n\r\n private onChangeRuleValue = (number: number, value: string) => {\r\n this.onChangeRule(number, { ...this.props.rules[number - 1], value });\r\n }\r\n\r\n private onRemoveRule = (number: number) => {\r\n const rules = this.props.rules.filter((_, index) => index !== number - 1);\r\n this.props.onChangeRules(rules);\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n ruleApplicability: RuleApplicability;\r\n rules: Rule[];\r\n tenantAttributes: TenantAttribute[];\r\n equalToAnyRuleEnabled?: boolean;\r\n onChangeRuleApplicability: (ruleApplicability: RuleApplicability) => void;\r\n onChangeRules: (rules: Rule[]) => void;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nexport default SmartRules;","import * as React from \"react\";\r\nimport UploadIcon from \"modules/common/components/authoring/uploader/uploadIconSvg\";\r\n\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\n\r\n\r\ninterface componentProps {\r\n parseCSV: (File) => any;\r\n downloadSample: () => void;\r\n}\r\n\r\ninterface componentState {\r\n dragging: boolean;\r\n errorMessage: string;\r\n}\r\n\r\nclass CSVUploader extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n dragging: false,\r\n errorMessage: \"\"\r\n };\r\n }\r\n\r\n public render() {\r\n return this.renderUploadForm();\r\n }\r\n\r\n private renderUploadForm() {\r\n let draggingProps = {\r\n onDrag: this.dragging(true),\r\n onDragStart: this.dragging(true),\r\n onDragEnd: this.dragging(false),\r\n onDragOver: this.dragging(true),\r\n onDragEnter: this.dragging(true),\r\n onDragLeave: this.dragging(false),\r\n onDrop: this.onFileDropped,\r\n };\r\n\r\n return (\r\n \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n or drag file here.\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n );\r\n }\r\n\r\n private onFileInputChanged = (e: React.FormEvent) => {\r\n const files = (e.target as HTMLInputElement).files;\r\n if (!this.acceptedFiles().includes(files![0].type)) {\r\n this.setState({ errorMessage: \"Incorrect file format, please upload a CSV file\" });\r\n return;\r\n }\r\n this.dragging(false, () => {\r\n this.props.parseCSV(files![0]); // only take in one file\r\n })(e);\r\n };\r\n\r\n private acceptedFiles = () => {\r\n return \".csv,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,text/csv\";\r\n };\r\n private onFileDropped = (e: React.DragEvent) => {\r\n const files = e.dataTransfer.files;\r\n if (!this.acceptedFiles().includes(files![0].type)) {\r\n this.setState({ errorMessage: \"Incorrect file format, please upload a CSV file\" });\r\n return;\r\n }\r\n this.dragging(false, () => {\r\n this.props.parseCSV(files[0]); // only take in one file\r\n })(e);\r\n };\r\n\r\n private dragging = (isDragging: boolean, callback?: () => void) => (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n if (typeof callback !== \"function\") callback = () => {};\r\n\r\n this.setState(\r\n {\r\n ...this.state,\r\n dragging: isDragging,\r\n },\r\n callback\r\n );\r\n return false;\r\n };\r\n \r\n private clearErrorMessage = () => {\r\n this.setState({ errorMessage: \"\" });\r\n }\r\n}\r\n\r\nexport default CSVUploader;\r\n","import React from \"react\";\r\n\r\n\r\nconst NumberStat: React.FunctionComponent = props => {\r\n return (\r\n
    \r\n
    \r\n {props.number}\r\n
    \r\n \r\n {props.title}\r\n \r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n number: number;\r\n title: string;\r\n}\r\n\r\nexport default NumberStat;","import React from \"react\";\r\n\r\nimport { EmailValidation } from \"../../../models\";\r\n\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\nimport NumberStat from \"modules/common/components/numberStat\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\n\r\nimport CheckCircleOutlineIcon from \"@mui/icons-material/CheckCircleOutline\";\r\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\r\n\r\n\r\nconst CSVValidation: React.FunctionComponent = props => {\r\n return (\r\n
    \r\n }\r\n text={\r\n \r\n CSV successfully scanned! \r\n Only emails in the CSV that exist in your directory and match a user profile or a user invite will be added to this audience. \r\n Download scan results here.\r\n \r\n }\r\n />\r\n
    \r\n \r\n \r\n
    \r\n \r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n validationResults: EmailValidation;\r\n onReplaceCSVFile: () => void;\r\n downloadBulkReport: () => void;\r\n}\r\n\r\nexport default CSVValidation;","import React from \"react\";\r\n\r\nimport { AudienceGroup } from \"../../../models\";\r\n\r\nimport IconButton from \"@mui/material/IconButton\";\r\n\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\n\r\n\r\nconst GroupList: React.FunctionComponent = props => {\r\n if (!props.includedGroups.length)\r\n return
    No {props.syncType} group has been added
    ;\r\n\r\n return (\r\n
    \r\n {props.includedGroups.map((group) => (\r\n
    \r\n
    \r\n
    {group.name}
    \r\n
    \r\n
    \r\n props.onRemoveGroup(group.groupId)} className=\"remove-icon\">\r\n
    \r\n
    \r\n ))}\r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n includedGroups: AudienceGroup[];\r\n syncType: string;\r\n onRemoveGroup: (id: string) => void;\r\n}\r\n\r\nexport default GroupList;","import React, { useState } from \"react\";\r\n\r\nimport Callout from \"modules/common/components/callout\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport { AudienceGroup, GroupSuggestions } from \"../../../models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\n\r\n\r\nconst SearchUserGroups: React.FunctionComponent = props => {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const [isSearching, setIsSearching] = useState(false);\r\n const [results, setResults] = useState([] as GroupSuggestions[]);\r\n const [searchText, setSearchText] = useState(\"\");\r\n const [showCallout, setShowCallout] = useState(false);\r\n\r\n return (\r\n
    \r\n \r\n }}\r\n onChange={(ev: any) => {\r\n setSearchText(ev.target.value);\r\n setAnchorEl(ev.currentTarget);\r\n }}\r\n onKeyUp={(key) => {\r\n if (key.keyCode === 13 && !!searchText) {\r\n setIsSearching(true);\r\n setResults([]);\r\n setShowCallout(true);\r\n props.onSearch(searchText).then((userSuggestions) => {\r\n setResults(userSuggestions);\r\n setIsSearching(false);\r\n });\r\n }\r\n }}\r\n />\r\n \r\n
    \r\n {isSearching\r\n ? \r\n :
    \r\n {!results.length\r\n ?
    No {props.syncType} groups were found
    \r\n :
    \r\n {results.map((result) =>\r\n
    \r\n
    \r\n
    {result.name}
    \r\n
    \r\n
    \r\n {result.isIncluded || props.includedGroups.findIndex(group => group.groupId === result.id) !== -1\r\n ? {\r\n props.onRemoveGroup(result.id);\r\n }}\r\n className=\"remove-icon\"\r\n >\r\n \r\n \r\n : {\r\n props.onAddGroup(result);\r\n }}\r\n className=\"add-button\"\r\n >\r\n Add\r\n \r\n }\r\n
    \r\n
    \r\n )}\r\n
    \r\n }\r\n
    \r\n }\r\n
    \r\n \r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n amountFetched: number;\r\n includedGroups: AudienceGroup[];\r\n onAddGroup: (group: GroupSuggestions) => void;\r\n onRemoveGroup: (id: string) => void;\r\n onSearch: (searchText: string) => Promise;\r\n syncType: string;\r\n}\r\n\r\nexport default SearchUserGroups;","import React, { useState } from \"react\";\r\n\r\nimport Callout from \"modules/common/components/callout\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport { AudienceUser, AudienceUserSuggestionsV2 } from \"../../../models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\n\r\n\r\nconst SearchUsers: React.FunctionComponent = props => {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const [isSearching, setIsSearching] = useState(false);\r\n const [results, setResults] = useState([] as AudienceUserSuggestionsV2[]);\r\n const [searchText, setSearchText] = useState(\"\");\r\n const [showCallout, setShowCallout] = useState(false);\r\n\r\n return (\r\n
    \r\n \r\n }}\r\n onChange={(ev: any) => {\r\n setSearchText(ev.target.value);\r\n setAnchorEl(ev.currentTarget);\r\n }}\r\n onKeyUp={(key) => {\r\n if (key.keyCode === 13 && !!searchText) {\r\n setIsSearching(true);\r\n setResults([]);\r\n setShowCallout(true);\r\n props.onSearch(searchText).then((userSuggestions) => {\r\n setResults(userSuggestions);\r\n setIsSearching(false);\r\n });\r\n }\r\n }}\r\n />\r\n \r\n
    \r\n {isSearching\r\n ? \r\n :
    \r\n {!results.length\r\n ?
    No users were found
    \r\n :
    \r\n {results.map((result) =>\r\n
    \r\n
    \r\n
    \r\n
    {result.name.charAt(0)}
    \r\n
    \r\n
    \r\n
    {result.name}
    \r\n
    {result.email}
    \r\n
    \r\n
    \r\n
    \r\n {result.isIncluded || props.includedUsers.findIndex(user => user.userId === result.id) !== -1\r\n ? {\r\n props.onRemoveUser(result.id);\r\n }}\r\n className=\"remove-icon\"\r\n >\r\n \r\n \r\n : {\r\n props.onAddUser(result);\r\n }}\r\n className=\"add-button\"\r\n >\r\n Add\r\n \r\n }\r\n
    \r\n
    \r\n )}\r\n
    \r\n }\r\n
    \r\n }\r\n
    \r\n \r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n amountFetched: number;\r\n includedUsers: AudienceUser[];\r\n onAddUser: (user: AudienceUserSuggestionsV2) => void;\r\n onRemoveUser: (id: string) => void;\r\n onSearch: (searchText: string) => Promise;\r\n}\r\n\r\nexport default SearchUsers;","import React from \"react\";\r\n\r\nimport { AudienceUser } from \"../../../models\";\r\n\r\nimport IconButton from \"@mui/material/IconButton\";\r\n\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\n\r\n\r\nconst UserList: React.FunctionComponent = props => {\r\n if (!props.includedUsers.length)\r\n return
    No unique user has been added
    ;\r\n\r\n return (\r\n
    \r\n {props.includedUsers.map((user) => (\r\n
    \r\n
    \r\n
    \r\n
    {user.name.charAt(0)}
    \r\n
    \r\n
    \r\n
    {user.name}
    \r\n
    {user.email}
    \r\n
    \r\n
    \r\n
    \r\n props.onRemoveUser(user.userId)} className=\"remove-icon\">\r\n
    \r\n
    \r\n ))}\r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n includedUsers: AudienceUser[];\r\n onRemoveUser: (id: string) => void;\r\n}\r\n\r\nexport default UserList;","import React, { useState } from \"react\";\r\n\r\nimport Callout from \"modules/common/components/callout\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport { AudienceInvite, AudienceInviteSuggestions } from \"../../../models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\n\r\n\r\nconst SearchInvites: React.FunctionComponent = props => {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const [isSearching, setIsSearching] = useState(false);\r\n const [results, setResults] = useState([] as AudienceInviteSuggestions[]);\r\n const [searchText, setSearchText] = useState(\"\");\r\n const [showCallout, setShowCallout] = useState(false);\r\n \r\n const onKeyPress = (key) => {\r\n if (key.keyCode === 13 && !!searchText) {\r\n setIsSearching(true);\r\n setResults([]);\r\n setShowCallout(true);\r\n props.onSearch(searchText).then((userSuggestions) => {\r\n setResults(userSuggestions);\r\n setIsSearching(false);\r\n });\r\n }\r\n }\r\n\r\n const loadOptions = (result) => {\r\n if(result.isIncluded || props.includedInvites.findIndex(invite => invite.inviteId === result.id) !== -1)\r\n {\r\n return (
    \r\n {\r\n props.onRemoveUser(result.id);\r\n }}\r\n className=\"remove-icon\"\r\n >\r\n \r\n \r\n
    )\r\n }\r\n else {\r\n return (\r\n
    \r\n {\r\n props.onAddUser(result);\r\n }}\r\n className=\"add-button\"\r\n >\r\n Add\r\n \r\n
    )\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n \r\n }}\r\n onChange={(ev: any) => {\r\n setSearchText(ev.target.value);\r\n setAnchorEl(ev.currentTarget);\r\n }}\r\n onKeyUp={onKeyPress}\r\n />\r\n \r\n
    \r\n {isSearching\r\n ? \r\n :
    \r\n {!results.length\r\n ?
    No invites were found
    \r\n :
    \r\n {results.map((result) =>\r\n
    \r\n
    \r\n
    \r\n
    {result.email}
    \r\n
    \r\n
    \r\n {loadOptions(result)}\r\n
    \r\n )}\r\n
    \r\n }\r\n
    \r\n }\r\n
    \r\n \r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n amountFetched: number;\r\n includedInvites: AudienceInvite[];\r\n onAddUser: (user: AudienceInviteSuggestions) => void;\r\n onRemoveUser: (id: string) => void;\r\n onSearch: (searchText: string) => Promise;\r\n}\r\n\r\nexport default SearchInvites;","import React from \"react\";\r\n\r\nimport { AudienceInvite } from \"../../../models\";\r\n\r\nimport IconButton from \"@mui/material/IconButton\";\r\n\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\n\r\n\r\nconst InviteList: React.FunctionComponent = props => {\r\n if (!props.includedInvites)\r\n return
    No unique invite has been added
    ;\r\n\r\n return (\r\n
    \r\n {props.includedInvites.map((user) => (\r\n
    \r\n
    \r\n
    \r\n
    {user.email}
    \r\n
    \r\n
    \r\n
    \r\n props.onRemoveUser(user.inviteId)} className=\"remove-icon\">\r\n
    \r\n
    \r\n ))}\r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n includedInvites: AudienceInvite[];\r\n onRemoveUser: (id: string) => void;\r\n}\r\n\r\nexport default InviteList;","import React from \"react\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport { audiencesApi } from \"api/instances\";\r\n\r\nimport { AudienceGroup, AudienceUser, EmailValidation, GroupSuggestions, AudienceUserSuggestionsV2, AudienceInviteSuggestions, AudienceInvite } from \"../../../models\";\r\n\r\nimport CSVUploader from \"../../csvUploader\";\r\nimport CSVValidation from \"./csvValidation\";\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport GroupList from \"./groupList\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport SearchUserGroups from \"./searchUserGroups\";\r\nimport SearchUsers from \"./searchUsers\";\r\nimport UserList from \"./userList\";\r\n\r\nimport Tab from \"@mui/material/Tab\";\r\nimport Tabs from \"@mui/material/Tabs\";\r\n\r\nimport Link from \"@mui/material/Link\";\r\n\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport SearchInvites from \"./searchInvites\";\r\nimport InviteList from \"./inviteList\";\r\nimport { actions } from \"modules/users\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\n\r\nconst FETCH_AMOUNT = 20;\r\n\r\nclass StandardRules extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n errorMessage: '',\r\n activeTab: \"users\",\r\n isValidatingEmails: false,\r\n totalIndividualUsers: props.totalIndividualUsers,\r\n totalIndividualInvites: props.totalIndividualInvites,\r\n userAmountFetched: 0,\r\n validationResults: undefined\r\n };\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n
    \r\n this.onChangeTab(value)}>\r\n \r\n {this.props.userGroupsEnabled && }\r\n \r\n \r\n \r\n
    \r\n {this.state.activeTab === \"users\" &&\r\n
    \r\n }\r\n text={`Search, add or remove unique users from your Sparrow Directory. Users added through ${this.props.syncType} Groups will remain in the Audience unless the Group is removed or the user is removed from the Group.`}\r\n />\r\n \r\n \r\n
    \r\n }\r\n {this.state.activeTab === \"invites\" &&\r\n
    \r\n }\r\n text={
    \r\n Invited users are social users accounts that have not been activated yet.\r\n To activate their accounts, the invite sent to their emails need to be accepted.\r\n Manage your user invites in Users & Preferences.\r\n
    }\r\n />\r\n \r\n \r\n
    \r\n }\r\n {this.state.activeTab === \"groups\" &&\r\n
    \r\n }\r\n text={\r\n \r\n Add or remove users using {this.props.syncType} Groups. Can’t find the group you’re looking for?\r\n Visit our Sync {this.props.syncType} Groups tool to check if the group is synced to your Sparrow Directory.\r\n \r\n }\r\n />\r\n \r\n \r\n
    \r\n }\r\n {this.state.activeTab === \"importEmails\" &&\r\n (!this.state.validationResults\r\n ? \r\n : \r\n )\r\n }\r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n\r\n private clearErrorMessage = () => {\r\n this.setState({ errorMessage: \"\" });\r\n }\r\n\r\n private goToSyncedGroups = () => {\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/audiences/everyone\");\r\n }\r\n\r\n private goToUsersAndPreferences = () => {\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/users\");\r\n }\r\n\r\n\r\n private onChangeTab = (value: string) => {\r\n this.setState({ activeTab: value });\r\n }\r\n\r\n\r\n private onAddGroup = (group: GroupSuggestions) => {\r\n if(this.props.audienceId){\r\n audiencesApi.addGroupToAudience(this.props.audienceId, group.id).then((response) => {\r\n if (response === 'Success')\r\n this.props.onChangeGroups(this.props.includedGroups.concat([{ groupId: group.id, name: group.name }]));\r\n }).catch(() => {\r\n this.setState({ errorMessage: `Unable to add group ${group.name}` });\r\n });\r\n } else {\r\n this.props.onChangeGroups(this.props.includedGroups.concat([{ groupId: group.id, name: group.name }]));\r\n }\r\n }\r\n\r\n private onAddUser = (user: AudienceUserSuggestionsV2) => {\r\n if (this.props.audienceId) {\r\n // When Editing Audience\r\n audiencesApi.addUserToAudience(this.props.audienceId, user.id).then((response) => {\r\n if (response === 'Success') {\r\n this.props.onChangeUsers(this.props.includedUsers.concat([{ userId: user.id, email: user.email, name: user.name }]));\r\n this.setState({ totalIndividualUsers: this.state.totalIndividualUsers + 1 });\r\n }\r\n }).catch(() => {\r\n this.setState({ errorMessage: `Unable to add user ${user.email}` });\r\n });\r\n }else {\r\n // When creating new Audience\r\n this.props.onChangeUsers(this.props.includedUsers.concat([{ userId: user.id, email: user.email, name: user.name }]));\r\n this.setState({ totalIndividualUsers: this.state.totalIndividualUsers + 1 });\r\n }\r\n }\r\n\r\n private onAddInvite = (invite: AudienceInviteSuggestions) => {\r\n if (this.props.audienceId) {\r\n // When Editing Audience\r\n audiencesApi.addInviteToAudience(this.props.audienceId, invite.id).then((response) => {\r\n if (response === 'Success') {\r\n this.props.onChangeInvites(this.props.includedInvites.concat([{ inviteId: invite.id, email: invite.email }]));\r\n this.setState({ totalIndividualInvites: this.state.totalIndividualInvites + 1 });\r\n }\r\n }).catch(() => {\r\n this.setState({ errorMessage: `Unable to add invite ${invite.email}` });\r\n });\r\n }else {\r\n // When creating new Audience\r\n this.props.onChangeInvites(this.props.includedInvites.concat([{ inviteId: invite.id, email: invite.email }]));\r\n this.setState({ totalIndividualInvites: this.state.totalIndividualInvites + 1 });\r\n }\r\n }\r\n\r\n private onDownloadSample = () => {\r\n let rows = [\r\n [\"email\"],\r\n [\"sample1@email.com\"],\r\n [\"sample2@email.com\"]\r\n ];\r\n\r\n const file = {\r\n name: \"sampleBulkAdd.csv\",\r\n type: \"data:text/csv;charset=utf-8,%EF%BB%BF\"\r\n };\r\n new FileDownloader(file).downloadSampleCSV(rows);\r\n }\r\n\r\n private onParseCSV = async (file: File) => {\r\n this.setState({ isValidatingEmails: true });\r\n\r\n let emails: string[] = [];\r\n await new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (event) => {\r\n const contents = reader.result!.toString().trim();\r\n const rows = contents.split(\"\\n\");\r\n for (let row of rows) {\r\n const email = row.split(\",\")[0].toLowerCase().trim();\r\n if (email === \"emails\" || email === \"email\") { // skip header, they might format it as emails or email\r\n continue;\r\n }\r\n if (this.validateRow(email, emails)) {\r\n emails.push(email);\r\n } else {\r\n console.log(`Skipped adding ${email}. This could be because the email has an invalid format or is a duplicate`);\r\n }\r\n }\r\n resolve();\r\n };\r\n reader.readAsText(file);\r\n });\r\n\r\n this.props.onChangeEmails(emails);\r\n\r\n this.onValidateEmails(emails);\r\n\r\n return emails;\r\n }\r\n\r\n private onRemoveGroup = (id: string) => {\r\n if (this.props.audienceId) {\r\n audiencesApi.removeGroupToAudience(this.props.audienceId, id).then((response)=> {\r\n if (response === 'Success')\r\n this.props.onChangeGroups(this.props.includedGroups.filter(group => group.groupId !== id));\r\n }).catch(() => {\r\n this.setState({ errorMessage: `Unable to remove group`});\r\n });\r\n }\r\n else {\r\n this.props.onChangeGroups(this.props.includedGroups.filter(group => group.groupId !== id));\r\n }\r\n }\r\n\r\n private onRemoveUser = (id: string) => {\r\n if (this.props.audienceId){\r\n audiencesApi.removeUserToAudience(this.props.audienceId, id).then((response)=> {\r\n if (response === 'Success'){\r\n this.props.onChangeUsers(this.props.includedUsers.filter(user => user.userId !== id));\r\n this.setState({ totalIndividualUsers: this.state.totalIndividualUsers - 1 });\r\n }\r\n }).catch(() => {\r\n this.setState({ errorMessage: `Unable to remove user`});\r\n });\r\n }else {\r\n this.props.onChangeUsers(this.props.includedUsers.filter(user => user.userId !== id));\r\n this.setState({ totalIndividualUsers: this.state.totalIndividualUsers - 1 });\r\n }\r\n }\r\n\r\n private onRemoveInvite = (id: string) => {\r\n if (this.props.audienceId){\r\n audiencesApi.removeInviteFromAudience(this.props.audienceId, id).then((response)=> {\r\n if (response === 'Success'){\r\n this.props.onChangeInvites(this.props.includedInvites.filter(invite => invite.inviteId !== id));\r\n this.setState({ totalIndividualInvites: this.state.totalIndividualInvites - 1 });\r\n }\r\n }).catch(() => {\r\n this.setState({ errorMessage: `Unable to remove invite`});\r\n });\r\n }else {\r\n this.props.onChangeInvites(this.props.includedInvites.filter(invite => invite.inviteId !== id));\r\n this.setState({ totalIndividualInvites: this.state.totalIndividualInvites - 1 });\r\n }\r\n }\r\n\r\n private onReplaceCSVFile = () => {\r\n this.props.onChangeEmails([]);\r\n this.setState({ validationResults: undefined });\r\n }\r\n\r\n private onSearchGroups = (searchText: string): Promise => {\r\n var cleanedInput = searchText.trim();\r\n return audiencesApi\r\n .getAudienceUserGroupSuggestion(this.props.audienceId, { maxResults: FETCH_AMOUNT, textToSearch: cleanedInput})\r\n .then((response) => {\r\n return response;\r\n });\r\n }\r\n\r\n private onSearchUsers = (searchText: string): Promise => {\r\n var cleanedInput = searchText.trim();\r\n return audiencesApi\r\n .getAudienceUserSuggestion(this.props.audienceId, { maxResults: FETCH_AMOUNT, textToSearch: cleanedInput})\r\n .then((response) => {\r\n return response;\r\n });\r\n }\r\n\r\n private onSearchInvites = (searchText: string): Promise => {\r\n var cleanedInput = searchText.trim();\r\n return audiencesApi\r\n .getAudienceInviteSuggestion(this.props.audienceId, { maxResults: FETCH_AMOUNT, textToSearch: cleanedInput})\r\n .then((response) => {\r\n return response;\r\n });\r\n }\r\n\r\n private onValidateEmails = (emails: string[]) => {\r\n return audiencesApi.validateEmails(emails).then((response) => {\r\n this.setState({\r\n isValidatingEmails: false,\r\n validationResults: response\r\n });\r\n });\r\n }\r\n\r\n // https://stackoverflow.com/questions/46155/how-to-validate-an-email-address-in-javascript\r\n private validateEmail = (email: string) => {\r\n const re = /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n return re.test(String(email).toLowerCase());\r\n };\r\n\r\n private validateRow = (value: string, values: string[]) => {\r\n return !values.includes(value) && this.validateEmail(value);\r\n }\r\n\r\n private downloadResults = () => {\r\n const file = {\r\n name: `${\"bulk-upload-audience-users\"}-${new Date().toISOString()}.csv`\r\n };\r\n this.props.downloadSocialBulkCSV(this.props.emails)\r\n .then(data => new FileDownloader(file).downloadBlob(data));\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n audienceId: string;\r\n emails: string[];\r\n includedGroups: AudienceGroup[];\r\n includedUsers: AudienceUser[];\r\n includedInvites: AudienceInvite[];\r\n totalIndividualUsers: number;\r\n totalIndividualInvites: number;\r\n syncType: string;\r\n onChangeGroups: (includedGroups: AudienceGroup[]) => void;\r\n onChangeEmails: (emails: string[]) => void;\r\n onChangeUsers: (includedUsers: AudienceUser[]) => void;\r\n onChangeInvites: (includedInvites: AudienceInvite[]) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n errorMessage: string;\r\n activeTab: string;\r\n isValidatingEmails: boolean;\r\n totalIndividualUsers: number;\r\n totalIndividualInvites: number;\r\n userAmountFetched: number;\r\n validationResults?: EmailValidation;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenant: state.tenant.id,\r\n userGroupsEnabled: state.settings.tenantSettings.ADGroupSyncEnabled || state.settings.tenantSettings.showFeatures.everyoneAudienceEnabled,\r\n syncType: state.settings.tenantSettings.syncConfig.syncType\r\n }),\r\n {\r\n redirectTo: push,\r\n downloadSocialBulkCSV: actions.getBulkImportResults\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(StandardRules);","import React from \"react\";\r\n\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\n\r\nconst Title: React.FunctionComponent = props => {\r\n return (\r\n
    \r\n
    Audience title
    \r\n props.onChange(event.target.value)}\r\n />\r\n
    \r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n title: string;\r\n onChange: (title: string) => void;\r\n}\r\n\r\nexport default Title;","import * as React from \"react\";\r\n\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\n\r\n\r\nconst TotalUsers: React.FunctionComponent = props => {\r\n if (!props.id)\r\n return ;\r\n\r\n return (\r\n
    \r\n
    \r\n Total users\r\n Includes all existing accounts added from your Sparrow Directory, {props.syncType} Groups and the invites sent while importing emails.\r\n
    \r\n
    {props.totalUsers}
    \r\n
    \r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n id?: string;\r\n totalUsers: number;\r\n syncType: string;\r\n}\r\n\r\nexport default TotalUsers;","import * as React from \"react\";\r\n\r\nimport { AudienceType } from \"../../../models\";\r\nimport { TenantAttribute } from \"modules/settings/models\";\r\n\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Select from \"@mui/material/Select\";\r\n\r\n\r\ninterface MenuItem {\r\n value: string;\r\n text: string;\r\n}\r\n\r\nconst Type: React.FunctionComponent = props => {\r\n return (\r\n
    \r\n
    Type
    \r\n \r\n props.onChange(event.target.value as AudienceType)}\r\n >\r\n Standard audience\r\n {!!props.tenantAttributes.length &&\r\n Smart audience\r\n }\r\n \r\n {!!props.tenantAttributes.length &&\r\n
    You cannot modify the audience type once an audience is created.
    \r\n }\r\n
    \r\n
    \r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n audienceType: AudienceType;\r\n id?: string;\r\n tenantAttributes: TenantAttribute[];\r\n onChange: (audienceType: AudienceType) => void;\r\n}\r\n\r\nexport default Type;","import React from \"react\";\r\n\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport { AudienceDetails, AudienceGroup, AudienceType, AudienceUser, DraftAudience, RuleApplicability, Rule, AudienceInvite, RuleComparatorOptions } from \"../../models\";\r\nimport { TenantAttribute } from \"modules/settings/models\";\r\n\r\nimport Description from \"./components/description\";\r\nimport EditOptions from \"./components/editOptions\";\r\nimport Enabled from \"./components/enabled\";\r\nimport SmartRules from \"./components/smartRules\";\r\nimport StandardRules from \"./components/standardRules\";\r\nimport Title from \"./components/title\";\r\nimport TotalUsers from \"./components/totalUsers\";\r\nimport Type from \"./components/type\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\n\r\nimport \"../../styles/audienceCreation.sass\";\r\n\r\n\r\nclass AudienceCreation extends React.Component {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n draftAudience: !!props.audienceDetails ? this.setAudience(props.audienceDetails) : { ...this.getDefaultAudience() },\r\n errorMessage: \"\",\r\n isUpdating: false\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: ComponentProps) {\r\n if (this.props.show && !prevProps.show)\r\n this.setState({\r\n draftAudience: !!this.props.audienceDetails ? this.setAudience(this.props.audienceDetails) : { ...this.getDefaultAudience() },\r\n errorMessage: \"\",\r\n isUpdating: false\r\n });\r\n }\r\n\r\n public render() {\r\n const { draftAudience } = this.state;\r\n const id: string = !!this.props.audienceDetails ? this.props.audienceDetails.id : \"\";\r\n\r\n return (\r\n \r\n \r\n
    \r\n {!!id\r\n ? Edit audience\r\n : Add new audience\r\n }\r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n <Description description={draftAudience.description} onChange={this.onChangeDescription} />\r\n <TotalUsers id={id} totalUsers={!!this.props.audienceDetails ? this.props.audienceDetails.totalUsers : 0} syncType={this.props.syncType}/>\r\n <Enabled isEnabled={draftAudience.isEnabled} onChange={this.onChangeEnabled} />\r\n <Type id={id} audienceType={draftAudience.audienceType} tenantAttributes={this.props.tenantAttributes} onChange={this.onChangeType} />\r\n </div>\r\n <Divider light />\r\n {draftAudience.audienceType === \"standard\" &&\r\n <StandardRules\r\n audienceId={!!this.props.audienceDetails ? this.props.audienceDetails.id : \"\"}\r\n emails={draftAudience.emails}\r\n includedGroups={draftAudience.groups}\r\n includedUsers={draftAudience.users}\r\n includedInvites={draftAudience.invites}\r\n totalIndividualUsers={!!this.props.audienceDetails ? this.props.audienceDetails.totalIndividualUsers : draftAudience.users.length}\r\n totalIndividualInvites={!!this.props.audienceDetails ? this.props.audienceDetails.totalInvites: draftAudience.invites.length}\r\n onChangeGroups={this.onChangeGroups}\r\n onChangeEmails={this.onChangeEmails}\r\n onChangeUsers={this.onChangeUsers}\r\n onChangeInvites={this.onChangeInvites}\r\n syncType={this.props.syncType}\r\n />\r\n }\r\n {draftAudience.audienceType === \"smart\" &&\r\n <SmartRules\r\n ruleApplicability={draftAudience.ruleApplicability}\r\n equalToAnyRuleEnabled={this.props.equalToAnyRuleEnabled}\r\n rules={draftAudience.rules}\r\n tenantAttributes={this.props.tenantAttributes}\r\n onChangeRuleApplicability={this.onChangeRuleApplicability}\r\n onChangeRules={this.onChangeRules}\r\n />\r\n }\r\n </DialogContent>\r\n <DialogActions className=\"audience-dialog-footer\">\r\n <Button variant=\"text\" onClick={this.onClose}>Cancel</Button>\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n disabled={\r\n !draftAudience.title ||\r\n (draftAudience.audienceType === \"smart\" && (!draftAudience.rules.length || !draftAudience.rules[0].key || !draftAudience.rules[0].value))\r\n }\r\n onClick={this.onSave}\r\n >\r\n {!!this.props.audienceDetails && !!this.props.audienceDetails.id\r\n ? \"Save changes\"\r\n : \"Finish\"\r\n }\r\n </Button>\r\n </DialogActions>\r\n <LoadingOverlay show={this.state.isUpdating} absolute={true} />\r\n <ErrorSnackbar errorMessage={this.state.errorMessage} clearErrorMessage={this.clearErrorMessage} />\r\n </Dialog>\r\n );\r\n }\r\n\r\n private clearErrorMessage = () => {\r\n this.setState({ errorMessage: \"\" });\r\n }\r\n\r\n private getDefaultAudience = (): DraftAudience => {\r\n return {\r\n audienceType: \"standard\",\r\n description: \"\",\r\n emails: [],\r\n groups: [],\r\n isEnabled: true,\r\n ruleApplicability: \"all\",\r\n rules: [],\r\n title: \"\",\r\n users: [],\r\n invites: []\r\n };\r\n }\r\n\r\n private setAudience = (audienceDetails: AudienceDetails): DraftAudience => {\r\n return {\r\n audienceType: audienceDetails.audienceType,\r\n description: audienceDetails.description,\r\n emails: [],\r\n groups: audienceDetails.includedGroups,\r\n isEnabled: audienceDetails.isEnabled,\r\n ruleApplicability: audienceDetails.ruleApplicability,\r\n rules: audienceDetails.rules,\r\n title: audienceDetails.title,\r\n users: audienceDetails.includedUsers,\r\n invites: audienceDetails.includedInvites\r\n };\r\n }\r\n\r\n private onClose = () => {\r\n this.setState({ isUpdating: false });\r\n this.props.onClose();\r\n }\r\n\r\n private onChangeDescription = (description: string) => {\r\n this.setState({ draftAudience: { ...this.state.draftAudience, description }});\r\n }\r\n\r\n private onChangeEmails = (emails: string[]) => {\r\n this.setState({ draftAudience: { ...this.state.draftAudience, emails }});\r\n }\r\n\r\n private onChangeEnabled = (isEnabled: boolean) => {\r\n this.setState({ draftAudience: { ...this.state.draftAudience, isEnabled }});\r\n }\r\n\r\n private onChangeGroups = (groups: AudienceGroup[]) => {\r\n this.setState({ draftAudience: { ...this.state.draftAudience, groups }});\r\n }\r\n\r\n private onChangeRuleApplicability = (ruleApplicability: RuleApplicability) => {\r\n this.setState({ draftAudience: { ...this.state.draftAudience, ruleApplicability }});\r\n }\r\n\r\n private onChangeRules = (rules: Rule[]) => {\r\n this.setState({ draftAudience: { ...this.state.draftAudience, rules }});\r\n }\r\n\r\n private onChangeTitle = (title: string) => {\r\n this.setState({ draftAudience: { ...this.state.draftAudience, title }});\r\n }\r\n\r\n private onChangeType = (audienceType: AudienceType) => {\r\n this.setState({ draftAudience: { ...this.state.draftAudience, audienceType }});\r\n }\r\n\r\n private onChangeUsers = (users: AudienceUser[]) => {\r\n this.setState({ draftAudience: { ...this.state.draftAudience, users }});\r\n }\r\n\r\n private onChangeInvites = (invites: AudienceInvite[]) => {\r\n this.setState({ draftAudience: { ...this.state.draftAudience, invites}})\r\n }\r\n\r\n private onDelete = () => {\r\n this.setState({ isUpdating: true });\r\n this.props.onDeleteAudience(this.props.audienceDetails!.id).then((succeeded) => {\r\n if (succeeded)\r\n this.onClose();\r\n else\r\n this.setState({ isUpdating: false });\r\n });\r\n }\r\n\r\n private onDownloadUserData = () => {\r\n this.setState({ isUpdating: true });\r\n this.props.onDownloadUserData(this.props.audienceDetails!.id, this.props.audienceDetails!.title).then(() => {\r\n this.setState({ isUpdating: false });\r\n });\r\n }\r\n\r\n private onSave = () => {\r\n this.setState({ isUpdating: true });\r\n\r\n this.checkAndUpdateRules();\r\n\r\n if (!!this.props.audienceDetails && !!this.props.audienceDetails.id)\r\n this.props.onSaveAudience(this.props.audienceDetails.id, this.state.draftAudience).then((response) => {\r\n if (!!response)\r\n this.onClose();\r\n });\r\n else\r\n this.props.onCreateAudience(this.state.draftAudience).then((response) => {\r\n if (!!response)\r\n this.onClose();\r\n });\r\n }\r\n\r\n //Doesn't delete the value on equalToAny, just adds a proper one on the end.\r\n private checkAndUpdateRules = () => {\r\n var audienceCopy = this.state.draftAudience;\r\n\r\n audienceCopy.rules.forEach(rule => {\r\n if(rule.comparator === RuleComparatorOptions.equalToAny) {\r\n var splitValues = rule.value.split(\"|\").map(s => s.trim()).filter(s => s !== \"\");\r\n rule.valueCollection = splitValues;\r\n }\r\n });\r\n\r\n this.setState({draftAudience: audienceCopy});\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n audienceDetails?: AudienceDetails;\r\n tenant: string;\r\n tenantAttributes: TenantAttribute[];\r\n syncType: string;\r\n equalToAnyRuleEnabled?: boolean;\r\n onCreateAudience: (audience: DraftAudience) => Promise<boolean>;\r\n onDeleteAudience: (id: string) => Promise<boolean>;\r\n onDownloadUserData: (id: string, title: string) => Promise<void>;\r\n onSaveAudience: (id: string, audience: DraftAudience) => Promise<boolean>;\r\n onClose: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n draftAudience: DraftAudience;\r\n errorMessage: string;\r\n isUpdating: boolean;\r\n}\r\n\r\nexport default AudienceCreation;\r\n","import React from \"react\";\r\n\r\nimport { AudienceItem } from \"../../models\";\r\n\r\nimport MoreOptionsIconButton from \"modules/common/components/buttons/moreOptionsIconButton\";\r\n\r\nimport Divider from \"@mui/material/Divider\";\r\nimport List from \"@mui/material/List\";\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\n\r\nconst MoreAudienceOptions: React.FunctionComponent<ComponentProps> = props => {\r\n const { audience } = props;\r\n\r\n return (\r\n <MoreOptionsIconButton>\r\n <List disablePadding>\r\n <MoreOptionsItem\r\n text=\"Edit audience details\"\r\n onClick={() => {\r\n props.onEditAudience(audience.id);\r\n props.onSelection();\r\n }}\r\n />\r\n <Divider light />\r\n {audience.state === \"enabled\" &&\r\n <MoreOptionsItem\r\n text=\"Disable\"\r\n onClick={() => {\r\n props.onDisableAudience(audience.id);\r\n props.onSelection();\r\n }}\r\n />\r\n }\r\n {audience.state !== \"enabled\" &&\r\n <MoreOptionsItem\r\n text=\"Enable\"\r\n onClick={() => {\r\n props.onEnableAudience(audience.id);\r\n props.onSelection();\r\n }}\r\n />\r\n }\r\n <MoreOptionsItem\r\n text=\"Delete\"\r\n onClick={() => {\r\n props.onDeleteAudience(audience.id);\r\n props.onSelection();\r\n }}\r\n />\r\n <Divider light />\r\n <MoreOptionsItem\r\n text=\"Download user data\"\r\n onClick={() => {\r\n props.onDownloadUserData(audience.id, audience.title);\r\n }}\r\n />\r\n </List>\r\n </MoreOptionsIconButton>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n audience: AudienceItem;\r\n onDeleteAudience: (id: string) => void;\r\n onDisableAudience: (id: string) => void;\r\n onDownloadUserData: (id: string, title: string) => void;\r\n onEditAudience: (id: string) => void;\r\n onEnableAudience: (id: string) => void;\r\n onSelection: () => void;\r\n}\r\n\r\nexport default MoreAudienceOptions;","import * as React from \"react\";\r\n\r\nimport AuthoringSearch from \"modules/common/components/filters/authoringSearch\";\r\nimport FilterContainer from \"modules/common/components/filters/filterContainer\";\r\nimport FilterDropdown from \"modules/common/components/filters/filterDropdown\";\r\n\r\nimport { AudienceFilterValues, AudienceType } from \"../../models\";\r\nimport { TenantAttribute } from \"modules/settings/models\";\r\n\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Chip from \"@mui/material/Chip\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\n\r\n\r\nimport moment from \"moment\";\r\n\r\n\r\ninterface Option {\r\n id: string;\r\n text: string;\r\n}\r\n\r\nconst AudienceTypes: Option[] = [\r\n { id: \"smart\", text: \"Smart\" },\r\n { id: \"standard\", text: \"Standard\" }\r\n];\r\n\r\nclass AudienceFilters extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n canSearch: !!props.filters.audienceTypes!.length || !!props.filters.textToSearch,\r\n textToSearch: props.filters.textToSearch || \"\"\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public componentDidUpdate(prevProps: ComponentProps) {\r\n if (this.props.filters.textToSearch !== prevProps.filters.textToSearch)\r\n this.setState({ textToSearch: this.props.filters.textToSearch || \"\" });\r\n }\r\n\r\n public render() {\r\n const { filters } = this.props;\r\n\r\n return (\r\n <FilterContainer\r\n filters={\r\n <React.Fragment>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.state.textToSearch}\r\n placeholder=\"Search title or description\"\r\n InputProps={{\r\n startAdornment: <SearchIcon className=\"search-icon\" />\r\n }}\r\n onChange={this.onUpdateTextToSearch}\r\n onKeyUp={this.onKeyUp}\r\n className=\"text-to-search\"\r\n />\r\n <div className=\"filter-options-group\">\r\n {!!this.props.tenantAttributes.length &&\r\n <FilterDropdown text=\"Audience Type\">\r\n <List disablePadding>\r\n {AudienceTypes.map((audienceType) =>\r\n <ListItem key={audienceType.id} dense button onClick={() => this.onChangeAudienceType(audienceType.id as AudienceType)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!filters.audienceTypes!.find((selectedType) => selectedType === audienceType.id)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={audienceType.text} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </FilterDropdown>\r\n }\r\n </div>\r\n </React.Fragment>\r\n }\r\n filterCommands={\r\n <AuthoringSearch\r\n canSearch={this.state.canSearch}\r\n onApplyFilters={this.onChangeTextToSearch}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n }\r\n filterSelection={this.getFilterSelection()}\r\n />\r\n );\r\n }\r\n\r\n private getFilterSelection = (): JSX.Element | undefined => {\r\n const { filters } = this.props;\r\n\r\n if (!filters.textToSearch && !filters.audienceTypes!.length)\r\n return undefined;\r\n\r\n return (\r\n <React.Fragment>\r\n {!!filters.textToSearch &&\r\n <Chip\r\n key=\"search-text\"\r\n label={`\"${filters.textToSearch}\"`}\r\n onDelete={this.onClearTextToSearch}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n }\r\n {filters.audienceTypes!.map((selectedType) =>\r\n <Chip\r\n key={selectedType}\r\n label={AudienceTypes.find((state) => state.id === selectedType)!.text}\r\n onDelete={() => this.onClearAudienceType(selectedType)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n\r\n private onChangeAudienceType = (audienceType: AudienceType) => {\r\n const hasSelectedAudienceType: boolean = !!this.props.filters.audienceTypes!.find((selectedType) => selectedType === audienceType);\r\n if (hasSelectedAudienceType)\r\n this.onChangeFilters({ audienceTypes: this.props.filters.audienceTypes!.filter((selectedType) => selectedType !== audienceType) });\r\n else\r\n this.onChangeFilters({ audienceTypes: this.props.filters.audienceTypes!.concat([audienceType]) });\r\n }\r\n\r\n private onChangeFilters = (value: Partial<AudienceFilterValues>) => {\r\n this.props.onChangeFilters({ ...this.props.filters, textToSearch: this.state.textToSearch, ...value });\r\n this.setCanSearch();\r\n }\r\n \r\n private onChangeTextToSearch = () => {\r\n this.onChangeFilters({ textToSearch: this.state.textToSearch });\r\n }\r\n\r\n private onClearAudienceType = (audienceType: AudienceType) => {\r\n this.onChangeFilters({ audienceTypes: this.props.filters.audienceTypes!.filter((selectedType) => selectedType !== audienceType) });\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.clearCanSearch();\r\n this.props.onClearFilters();\r\n }\r\n\r\n private onClearTextToSearch = () => {\r\n this.onChangeFilters({ textToSearch: \"\" });\r\n }\r\n \r\n private onKeyUp = (key) => {\r\n if (key.keyCode === 13)\r\n this.onChangeTextToSearch();\r\n }\r\n\r\n private onUpdateTextToSearch = (event) => {\r\n this.setState({ textToSearch: event.target.value });\r\n }\r\n\r\n private clearCanSearch = () => {\r\n this.setState({ canSearch: false });\r\n }\r\n\r\n private setCanSearch = () => {\r\n this.setState({ canSearch: true });\r\n }\r\n}\r\n \r\n\r\ninterface ComponentProps {\r\n filters: Partial<AudienceFilterValues>;\r\n tenantAttributes: TenantAttribute[];\r\n syncType: string;\r\n onChangeFilters: (filters: Partial<AudienceFilterValues>) => void;\r\n onClearFilters: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n canSearch: boolean;\r\n textToSearch: string;\r\n}\r\n\r\nexport default AudienceFilters;","import React from \"react\";\r\nimport moment from \"moment\";\r\nimport numeral from \"numeral\";\r\n\r\nimport { AudienceFilterValues, AudienceItem, AudiencePage, AudienceState, AudienceType } from \"../../models\";\r\nimport { TenantAttribute } from \"modules/settings/models\";\r\n\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport MoreAudienceOptions from \"../action-buttons/moreAudienceOptions\";\r\nimport AudienceFilters from \"../audience-filters/audienceFilters\";\r\n\r\nimport TabContent from \"pages/common/tabContent\";\r\nimport TabContentToolbar from \"pages/common/tabContentToolbar\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableContainer from \"@mui/material/TableContainer\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport BlockIcon from \"@mui/icons-material/Block\";\r\nimport CheckCircleOutlineIcon from \"@mui/icons-material/CheckCircleOutline\";\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport EditIcon from \"@mui/icons-material/Edit\";\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport { Link } from \"@mui/material\";\r\nimport Paging from \"modules/common/components/paging\";\r\n\r\n\r\ninterface HeaderCell {\r\n disablePadding: boolean;\r\n id: string;\r\n label: string | JSX.Element;\r\n}\r\n\r\n\r\nclass AudienceList extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n filters: { ...this.getDefaultFilterValues() },\r\n hasFiltersApplied: false,\r\n isDownloading: false,\r\n isPagedLoad: false,\r\n selectedItems: [],\r\n showEditor: false,\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public componentDidUpdate(prevProps: ComponentProps) {\r\n if (this.props.id !== prevProps.id)\r\n this.setState({ selectedItems: [] });\r\n\r\n if (this.props.hasRefreshed && !prevProps.hasRefreshed) {\r\n this.setState({ filters: { ...this.getDefaultFilterValues() }, hasFiltersApplied: false });\r\n }\r\n }\r\n\r\n public render() {\r\n const { page } = this.props;\r\n\r\n if (!this.props.show)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n if (page.isFetching && !this.state.isPagedLoad)\r\n return <Loading />;\r\n \r\n return (\r\n <div>\r\n {this.getToolbar()}\r\n <TabContent>\r\n {this.getFilter()}\r\n {this.props.warningOpen && this.getAudienceWarning()}\r\n {this.getList()}\r\n <LoadingOverlay absolute={true} show={this.state.isDownloading} />\r\n </TabContent>\r\n </div>\r\n );\r\n }\r\n\r\n private formatAudienceType = (audienceType: AudienceType): string => {\r\n if (audienceType === \"smart\")\r\n return \"Smart\";\r\n else\r\n return \"Standard\";\r\n }\r\n\r\n private formatUserCount = (userCount: number): string => {\r\n return numeral(userCount).format(\"0,0\");\r\n }\r\n\r\n private formatState = (state: AudienceState): JSX.Element => {\r\n if (state === \"disabled\")\r\n return <span className=\"audience-state grey\">Disabled</span>;\r\n else\r\n return <span className=\"audience-state green\">Enabled</span>;\r\n }\r\n\r\n\r\n private getDefaultFilterValues = (): Partial<AudienceFilterValues> => {\r\n const filters: Partial<AudienceFilterValues> = {\r\n audienceTypes: [],\r\n textToSearch: \"\"\r\n };\r\n return filters;\r\n }\r\n\r\n\r\n private getFilter = (): JSX.Element => {\r\n return (\r\n <AudienceFilters\r\n filters={this.state.filters}\r\n tenantAttributes={this.props.tenantAttributes}\r\n syncType={this.props.syncType}\r\n onChangeFilters={this.onChangeFilters}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n );\r\n }\r\n\r\n private getAudienceWarning = (): JSX.Element => {\r\n return (\r\n <div style={{marginBottom: \"20px\"}}>\r\n <div className=\"disclaimer-block-text\" style={{backgroundColor: \"#f4f4f1\"}}>\r\n <InfoOutlinedIcon/>\r\n <div style={{position: \"relative\", top: \"3px\"}}>\r\n Your organization has a maximum of {this.props.maxAudiences} audiences. Contact <Link href='mailto:support@sparrowconnected.com'>support@sparrowconnected.com</Link> to upgrade your plan.\r\n </div>\r\n <CloseIcon onClick={this.props.setWarningClosed} style={{color: \"#555555\", display: \"block\", marginLeft: \"auto\", cursor: \"pointer\"}}/>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n private getHeader = (): HeaderCell[] => {\r\n const { id } = this.props;\r\n\r\n let header: HeaderCell[] = [\r\n { id: \"title\", disablePadding: true, label: \"Audience\" },\r\n { id: \"options\", disablePadding: true, label: \"\" }\r\n ];\r\n\r\n if (id === \"all\")\r\n header.push({ id: \"state\", disablePadding: false, label: \"State\" });\r\n\r\n header.push({ id: \"audienceType\", disablePadding: false, label: \"Audience type\" });\r\n header.push({ id: \"totalUsers\", disablePadding: false, label: (\r\n <div className=\"header-view\">\r\n <span>Total users</span>\r\n <InfoHover>Includes all existing accounts added from your Sparrow Directory, {this.props.syncType} Groups and the invites sent while importing emails.</InfoHover>\r\n </div>\r\n )});\r\n header.push({ id: \"workUsers\", disablePadding: false, label: `${this.props.syncType} users` });\r\n header.push({ id: \"socialUsers\", disablePadding: false, label: (\r\n <div className=\"header-view\">\r\n <span>Social users</span>\r\n <InfoHover>Social users are those with accounts that use login using Google, Facebook, LinkedIn, Apple or Microsoft Personal Account.</InfoHover>\r\n </div>\r\n )});\r\n header.push({ id: \"sparrowUsers\", disablePadding: false, label: (\r\n <div className=\"header-view\">\r\n <span>Sparrow users</span>\r\n <InfoHover>Sparrow users are those with accounts that use a custom User ID and Password to login.</InfoHover>\r\n </div>\r\n )});\r\n header.push({ id: \"invitedUsers\", disablePadding: false, label: (\r\n <div className=\"header-view\">\r\n <span>Invited users</span>\r\n <InfoHover>Invited users are social users with open invites that have not yet accepted their invites.</InfoHover>\r\n </div>\r\n )});\r\n \r\n return header;\r\n }\r\n\r\n private getList = (): JSX.Element => {\r\n const { page } = this.props;\r\n const { selectedItems } = this.state;\r\n\r\n const rowCount = page.audiences.length || 10;\r\n\r\n if (page.isFetching)\r\n return <Loading />;\r\n \r\n if (!page.audiences.length)\r\n return (\r\n <React.Fragment>\r\n {this.state.hasFiltersApplied &&\r\n <Typography variant=\"h2\" className=\"audience-results\">Results</Typography>\r\n }\r\n <div>No audiences were found.</div>\r\n </React.Fragment>\r\n );\r\n\r\n return (\r\n <React.Fragment>\r\n {this.state.hasFiltersApplied &&\r\n <Typography variant=\"h2\" className=\"audience-results\">Results</Typography>\r\n }\r\n <TableContainer>\r\n <Table size=\"medium\">\r\n <TableHead>\r\n <TableRow>\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n color=\"primary\"\r\n indeterminate={selectedItems.length > 0 && selectedItems.length < rowCount}\r\n checked={rowCount > 0 && selectedItems.length === rowCount}\r\n onChange={this.onSelectAllAudiences}\r\n inputProps={{ \"aria-label\": \"select all audiences\" }}\r\n />\r\n </TableCell>\r\n {this.getHeader().map((headerCell) => {\r\n if (headerCell.id === \"options\")\r\n return <TableCell key={headerCell.id} padding=\"checkbox\"></TableCell>\r\n\r\n return (\r\n <TableCell\r\n key={headerCell.id}\r\n align={headerCell.disablePadding ? \"left\" : \"center\"}\r\n padding={headerCell.disablePadding ? \"none\" : \"normal\"}\r\n >\r\n {headerCell.label}\r\n </TableCell>\r\n );\r\n })}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {page.audiences\r\n .map((audience, index) => this.getListItem(audience, index))\r\n }\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n <Paging\r\n currentPage={page.currentPage}\r\n items={page.audiences}\r\n totalItems={page.totalAudiences}\r\n totalPages={page.totalPages}\r\n onChangePage={this.onChangePage}\r\n resetSelection={this.resetSelection}\r\n />\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private getListItem = (audience: AudienceItem, index: number): JSX.Element => {\r\n const isAudienceSelected = this.isAudienceSelected(audience);\r\n const labelId = `audience-list-checkbox-${index}`;\r\n \r\n return (\r\n <React.Fragment key={audience.id}>\r\n <TableRow\r\n hover\r\n onClick={() => this.onEditAudience(audience.id)}\r\n role=\"checkbox\"\r\n aria-checked={isAudienceSelected}\r\n tabIndex={-1}\r\n key={audience.id}\r\n selected={isAudienceSelected}\r\n >\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n color=\"primary\"\r\n checked={isAudienceSelected}\r\n inputProps={{ \"aria-labelledby\": labelId }}\r\n onClick={(ev) => this.onSelectAudience(ev, audience)}\r\n />\r\n </TableCell>\r\n <TableCell component=\"th\" id={labelId} scope=\"row\" padding=\"none\">{audience.title || \"unknown\"}</TableCell>\r\n <TableCell padding=\"checkbox\">\r\n <MoreAudienceOptions\r\n audience={audience}\r\n onDeleteAudience={this.onDeleteAudience}\r\n onDisableAudience={this.onDisableAudience}\r\n onDownloadUserData={this.onDownloadUserData}\r\n onEditAudience={this.onEditAudience}\r\n onEnableAudience={this.onEnableAudience}\r\n onSelection={this.onClearAllAudiences}\r\n />\r\n </TableCell>\r\n {this.props.id === \"all\" && <TableCell align=\"center\">{this.formatState(audience.state)}</TableCell>}\r\n <TableCell align=\"center\">{this.formatAudienceType(audience.audienceType)}</TableCell>\r\n <TableCell align=\"center\">{this.formatUserCount(audience.totalUsers)}</TableCell>\r\n <TableCell align=\"center\">{this.formatUserCount(audience.internalUsers)}</TableCell>\r\n <TableCell align=\"center\">{this.formatUserCount(audience.socialUsers)}</TableCell>\r\n <TableCell align=\"center\">{this.formatUserCount(audience.sparrowUsers)}</TableCell>\r\n <TableCell align=\"center\">{this.formatUserCount(audience.invitedUsers)}</TableCell>\r\n </TableRow>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private getToolbar = (): JSX.Element => {\r\n const { selectedItems } = this.state;\r\n\r\n if (!selectedItems.length)\r\n return <React.Fragment></React.Fragment>;\r\n \r\n return (\r\n <TabContentToolbar>\r\n <div>\r\n {this.getToolbarIcon(`${selectedItems.length} selected`, <ClearIcon />, this.onClearAllAudiences)}\r\n </div>\r\n <div>\r\n {selectedItems.length === 1 &&\r\n <React.Fragment>\r\n {this.getToolbarIcon(\"Edit audience details\", <EditIcon />, () => this.onEditAudience(selectedItems[0].id))}\r\n </React.Fragment>\r\n }\r\n {selectedItems.findIndex(selectedItem => selectedItem.state === \"enabled\") === -1 && this.getToolbarIcon(\"Enable\", <CheckCircleOutlineIcon />, () => this.onEnableAudiences(selectedItems))}\r\n {selectedItems.findIndex(selectedItem => selectedItem.state !== \"enabled\") === -1 && this.getToolbarIcon(\"Disable\", <BlockIcon style={{ transform: \"rotate(90deg)\" }} />, () => this.onDisableAudiences(selectedItems))}\r\n {this.getToolbarIcon(\"Delete\", <DeleteIcon />, () => this.onDeleteAudiences(selectedItems))}\r\n </div>\r\n </TabContentToolbar>\r\n );\r\n }\r\n\r\n private getToolbarIcon = (title: string, icon: React.ReactNode, onClick: () => void) => {\r\n return (\r\n <Button aria-label={title.toLowerCase()} color=\"primary\" startIcon={icon} onClick={onClick}>\r\n {title}\r\n </Button>\r\n );\r\n }\r\n\r\n\r\n private isAudienceSelected = (audience: AudienceItem): boolean => {\r\n return this.state.selectedItems.findIndex((selectedItem) => selectedItem.id === audience.id) !== -1;\r\n }\r\n\r\n\r\n private onChangeFilters = (filters: Partial<AudienceFilterValues>) => {\r\n const updatedFilters = { ...this.state.filters, ...filters };\r\n this.setState({ filters: updatedFilters, hasFiltersApplied: true, isPagedLoad: true });\r\n this.props.fetchPage(1, updatedFilters);\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.setState({ hasFiltersApplied: false, filters: { ...this.getDefaultFilterValues() }, isPagedLoad: true });\r\n this.props.fetchPage(1, {});\r\n }\r\n\r\n\r\n private onClearAllAudiences = () => {\r\n this.setState({ selectedItems: [] });\r\n }\r\n\r\n\r\n private onDeleteAudience = (id: string) => {\r\n this.props.onDeleteAudience(id).then((succeeded) => {\r\n if (succeeded)\r\n this.onClearAllAudiences();\r\n });\r\n }\r\n\r\n private onDeleteAudiences = (audiences: AudienceItem[]) => {\r\n if (audiences.length === 1)\r\n this.onDeleteAudience(audiences[0].id);\r\n else\r\n this.props.onDeleteAudiences(audiences.map(audience => audience.id)).then((succeeded) => {\r\n if (succeeded)\r\n this.onClearAllAudiences();\r\n });\r\n }\r\n\r\n private onDisableAudience = (id: string) => {\r\n this.props.onDisableAudience(id).then((succeeded) => {\r\n if (succeeded)\r\n this.onClearAllAudiences();\r\n });\r\n }\r\n\r\n private onDisableAudiences = (audiences: AudienceItem[]) => {\r\n if (audiences.length === 1)\r\n this.onDisableAudience(audiences[0].id);\r\n else\r\n this.props.onDisableAudiences(audiences.map(audience => audience.id)).then((succeeded) => {\r\n if (succeeded)\r\n this.onClearAllAudiences();\r\n });\r\n }\r\n\r\n private onDownloadUserData = (id: string, title: string) => {\r\n this.props.onDownloadUserData(id, title);\r\n }\r\n\r\n private onEnableAudience = (id: string) => {\r\n this.props.onEnableAudience(id).then((succeeded) => {\r\n if (succeeded)\r\n this.onClearAllAudiences();\r\n });\r\n }\r\n\r\n private onEnableAudiences = (audiences: AudienceItem[]) => {\r\n if (audiences.length === 1)\r\n this.onEnableAudience(audiences[0].id);\r\n else\r\n this.props.onEnableAudiences(audiences.map(audience => audience.id)).then((succeeded) => {\r\n if (succeeded)\r\n this.onClearAllAudiences();\r\n });\r\n }\r\n\r\n private onEditAudience = (id: string) => {\r\n this.props.onEditAudience(id);\r\n }\r\n\r\n private onSelectAllAudiences = () => {\r\n if (this.state.selectedItems.length === this.props.page.audiences.length)\r\n this.setState({ selectedItems: [] });\r\n else\r\n this.setState({ selectedItems: this.props.page.audiences });\r\n }\r\n\r\n private onSelectAudience = (ev, audience: AudienceItem) => {\r\n ev.stopPropagation();\r\n\r\n let selectedItems = this.state.selectedItems.slice();\r\n\r\n if (selectedItems.findIndex((selectedItem) => selectedItem.id === audience.id) === -1)\r\n selectedItems = selectedItems.concat([audience]);\r\n else\r\n selectedItems = selectedItems.filter(selectedItem => selectedItem.id !== audience.id);\r\n\r\n this.setState({ selectedItems });\r\n }\r\n\r\n private resetSelection = () => {\r\n this.setState({selectedItems: []});\r\n }\r\n\r\n private onChangePage = (page: number) => {\r\n this.props.fetchPage(page + 1, this.state.filters);\r\n }\r\n}\r\n \r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n id: string;\r\n page: AudiencePage;\r\n hasRefreshed?: boolean;\r\n tenantAttributes: TenantAttribute[];\r\n syncType: string;\r\n maxAudiences: number;\r\n warningOpen: boolean;\r\n fetchPage: (pageNumber: number, filters: Partial<AudienceFilterValues>) => void;\r\n onDeleteAudience: (id: string) => Promise<boolean>;\r\n onDeleteAudiences: (ids: string[]) => Promise<boolean>;\r\n onDisableAudience: (id: string) => Promise<boolean>;\r\n onDisableAudiences: (ids: string[]) => Promise<boolean>;\r\n onDownloadUserData: (id: string, title: string) => void;\r\n onEditAudience: (id: string) => void;\r\n onEnableAudience: (id: string) => Promise<boolean>;\r\n onEnableAudiences: (ids: string[]) => Promise<boolean>;\r\n setWarningClosed: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n filters: Partial<AudienceFilterValues>;\r\n hasFiltersApplied: boolean;\r\n isDownloading: boolean;\r\n isPagedLoad: boolean;\r\n selectedItems: AudienceItem[];\r\n showEditor: boolean;\r\n}\r\n\r\nexport default AudienceList;","import React from \"react\";\r\n\r\nimport CalloutHover from \"modules/common/components/hovers/calloutHover\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\n\r\n\r\nconst NewAudience: React.FunctionComponent<ComponentProps> = props => {\r\n if (!props.disabled)\r\n return (\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n startIcon={<AddIcon />}\r\n onClick={props.onClick}\r\n disabled={props.loadingChecks}\r\n >\r\n New Audience\r\n </Button>\r\n );\r\n\r\n return (\r\n <CalloutHover\r\n arrow\r\n component={\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n startIcon={<AddIcon />}\r\n disabled={props.disabled}\r\n >\r\n New Audience\r\n </Button>\r\n }\r\n >\r\n <div className=\"disabled-button-message\">\r\n You have reached the limit for creating new audiences. Contact support to upgrade your plan.\r\n </div>\r\n </CalloutHover>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n disabled: boolean;\r\n loadingChecks: boolean;\r\n onClick: () => void;\r\n}\r\n\r\nexport default NewAudience;\r\n","import * as React from \"react\";\r\nimport { push } from 'react-router-redux';\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { audiencesApi } from \"api/instances\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport * as settingsActions from \"modules/settings/actionCreator\";\r\n\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport RequireRole from \"modules/common/components/requireRole\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport { AudienceDetails, AudienceFilterValues, AudiencePage, DraftAudience } from \"../../models\";\r\nimport AudienceCreation from \"../audience-creation/audienceCreation\";\r\nimport AudienceList from \"./audienceList\";\r\nimport NewAudience from \"../action-buttons/newAudience\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Header from \"pages/common/header\";\r\nimport MainContent from \"pages/common/mainContent\";\r\nimport Tabs from \"pages/common/tabs\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\n\r\n\r\nconst allTab: number = 0;\r\nconst enabledTab: number = 1;\r\nconst disabledTab: number = 2;\r\n\r\n\r\nclass AudienceListing extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n isFetching: false,\r\n isLoadingAudience: false,\r\n selectedAudience: undefined,\r\n selectedTab: allTab,\r\n showAudienceCreation: false,\r\n totalAudiences: 0,\r\n hasDeleted: false,\r\n warningOpen: true\r\n }\r\n };\r\n\r\n public componentDidMount() {\r\n this.fetchLists();\r\n this.fetchTenantAttributes();\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.shouldFetch && !prevProps.shouldFetch) {\r\n this.fetchLists();\r\n this.fetchTenantAttributes();\r\n if (!!this.props.audiences.length)\r\n this.props.getAudiences();\r\n }\r\n\r\n if (this.props.all.totalAudiences !== prevProps.all.totalAudiences && (this.props.all.totalAudiences > this.state.totalAudiences || this.state.hasDeleted)) {\r\n this.setState({ totalAudiences: this.props.all.totalAudiences, hasDeleted: false });\r\n }\r\n }\r\n\r\n public render() {\r\n const { all } = this.props;\r\n const { selectedTab, totalAudiences } = this.state;\r\n\r\n const newAudienceDisabled = (totalAudiences >= this.props.maxAllowedAudiences)\r\n\r\n return (\r\n <BasePage fullWidth>\r\n <Header\r\n title=\"Manage Audiences\"\r\n rightComponent={\r\n <div>\r\n {this.props.everyoneAudienceEnabled &&\r\n <RequireRole roleName={UserRoleStrings.OWNER}>\r\n <Button\r\n variant=\"outlined\"\r\n color=\"primary\"\r\n onClick={this.goToSyncedGroups}\r\n >\r\n Sync {this.props.syncType} Groups\r\n </Button>\r\n </RequireRole>\r\n }\r\n {this.props.canEdit &&\r\n <NewAudience\r\n disabled={!all || !all.audiences || newAudienceDisabled}\r\n loadingChecks={(this.props.all.isFetching ?? false) || (this.props.enabled.isFetching ?? false) || (this.props.disabled.isFetching ?? false)}\r\n onClick={this.createNewAudience}\r\n />\r\n }\r\n </div>\r\n }\r\n />\r\n <MainContent>\r\n <div className=\"audience-listing\">\r\n <Tabs\r\n tabs={[\r\n { label: this.getTabLabel(\"All\", this.props.all), id: \"all-audiences-tab\" },\r\n { label: this.getTabLabel(\"Enabled\", this.props.enabled), dotColor: \"green\", id: \"enabled-audiences-tab\" },\r\n { label: this.getTabLabel(\"Disabled\", this.props.disabled), dotColor: \"grey\", id: \"disabled-audiences-tab\" }\r\n ]}\r\n selectedTab={selectedTab}\r\n onSelectTab={this.onSelectTab}\r\n />\r\n <AudienceList\r\n id=\"all\"\r\n show={selectedTab === allTab}\r\n page={this.props.all}\r\n fetchPage={this.fetchAll}\r\n tenantAttributes={this.props.tenantAttributes}\r\n syncType={this.props.syncType}\r\n onDeleteAudience={this.deleteAudience}\r\n onDeleteAudiences={this.deleteAudiences}\r\n onDisableAudience={this.disableAudience}\r\n onDisableAudiences={this.disableAudiences}\r\n onDownloadUserData={this.onDownloadUserData}\r\n onEditAudience={this.editAudience}\r\n onEnableAudience={this.enableAudience}\r\n onEnableAudiences={this.enableAudiences}\r\n maxAudiences={this.props.maxAudiences}\r\n warningOpen={this.state.warningOpen}\r\n setWarningClosed={this.setWarningClosed}\r\n />\r\n <AudienceList\r\n id=\"disabled\"\r\n show={selectedTab === disabledTab}\r\n page={this.props.disabled}\r\n fetchPage={this.fetchDisabled}\r\n tenantAttributes={this.props.tenantAttributes}\r\n syncType={this.props.syncType}\r\n onDeleteAudience={this.deleteAudience}\r\n onDeleteAudiences={this.deleteAudiences}\r\n onDisableAudience={this.disableAudience}\r\n onDisableAudiences={this.disableAudiences}\r\n onDownloadUserData={this.onDownloadUserData}\r\n onEditAudience={this.editAudience}\r\n onEnableAudience={this.enableAudience}\r\n onEnableAudiences={this.enableAudiences}\r\n maxAudiences={this.props.maxAudiences}\r\n warningOpen={this.state.warningOpen}\r\n setWarningClosed={this.setWarningClosed}\r\n />\r\n <AudienceList\r\n id=\"enabled\"\r\n show={selectedTab === enabledTab}\r\n page={this.props.enabled}\r\n fetchPage={this.fetchEnabled}\r\n tenantAttributes={this.props.tenantAttributes}\r\n syncType={this.props.syncType}\r\n onDeleteAudience={this.deleteAudience}\r\n onDeleteAudiences={this.deleteAudiences}\r\n onDisableAudience={this.disableAudience}\r\n onDisableAudiences={this.disableAudiences}\r\n onDownloadUserData={this.onDownloadUserData}\r\n onEditAudience={this.editAudience}\r\n onEnableAudience={this.enableAudience}\r\n onEnableAudiences={this.enableAudiences}\r\n maxAudiences={this.props.maxAudiences}\r\n warningOpen={this.state.warningOpen}\r\n setWarningClosed={this.setWarningClosed}\r\n />\r\n </div>\r\n <AudienceCreation\r\n show={this.state.showAudienceCreation}\r\n audienceDetails={this.state.selectedAudience}\r\n tenant={this.props.tenant}\r\n tenantAttributes={this.props.tenantAttributes}\r\n equalToAnyRuleEnabled={this.props.equalToAnyRuleEnabled}\r\n onCreateAudience={this.createAudience}\r\n onDeleteAudience={this.deleteAudience}\r\n onDownloadUserData={this.onDownloadUserData}\r\n onSaveAudience={this.saveAudience}\r\n onClose={this.onCloseAudienceCreation}\r\n syncType={this.props.syncType}\r\n />\r\n <LoadingOverlay show={this.state.isFetching || this.state.isLoadingAudience || this.props.isDeleting || this.props.isFetching || this.props.isSaving } absolute={true} styles={{ paddingTop: 150 }} />\r\n <ErrorSnackbar errorMessage={this.props.errorMessage} clearErrorMessage={this.props.clearErrorMessage} />\r\n </MainContent>\r\n </BasePage>\r\n );\r\n }\r\n\r\n private setWarningClosed = () => {\r\n this.setState({warningOpen: false});\r\n }\r\n\r\n private associatedCategoryTags = (associatedCategoryTags): JSX.Element => {\r\n return (\r\n <React.Fragment>\r\n {associatedCategoryTags.map((categoryTag) => {\r\n const text: string = `${categoryTag.title} (Category tag)`;\r\n return (\r\n <li key={categoryTag.id}>\r\n <span>\r\n {text}\r\n </span>\r\n </li>\r\n );\r\n })}\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private associatedDocuments = (associatedDocuments): JSX.Element => {\r\n return (\r\n <React.Fragment>\r\n {associatedDocuments.map((document) => {\r\n const text: string = `${document.title || document.name} (Document)`;\r\n return (\r\n <li key={document.id}>\r\n <span>\r\n {text}\r\n </span>\r\n </li>\r\n );\r\n })}\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private associatedNewsletters = (associatedNewsletters): JSX.Element => {\r\n return (\r\n <React.Fragment>\r\n {associatedNewsletters.map((newsletter) => {\r\n const text: string = `${newsletter.title} (Newsletter)`;\r\n return (\r\n <li key={newsletter.id}>\r\n <span\r\n onClick={() => {\r\n const location: string = window.location.href;\r\n const segments: string[] = location.split(this.props.tenant);\r\n window.open(`${segments[0]}${this.props.tenant}/admin/newsletters/${newsletter.id}/dashboard`);\r\n }}\r\n className=\"audience-associated-item\"\r\n >\r\n {text}\r\n </span>\r\n </li>\r\n );\r\n })}\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private associatedTopics = (associatedTopics): JSX.Element => {\r\n return (\r\n <React.Fragment>\r\n {associatedTopics.map((topic) => {\r\n const text: string = `${topic.title} (Topic)`;\r\n return (\r\n <li key={topic.id}>\r\n <span\r\n onClick={() => {\r\n const location: string = window.location.href;\r\n const segments: string[] = location.split(this.props.tenant);\r\n window.open(`${segments[0]}${this.props.tenant}/admin/topics/${topic.groupId}/${topic.id}`);\r\n }}\r\n className=\"audience-associated-item\"\r\n >\r\n {text}\r\n </span>\r\n </li>\r\n );\r\n })}\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private associatedInvites = (associatedInvites): JSX.Element => {\r\n return (\r\n <React.Fragment>\r\n {associatedInvites.map((invite) => {\r\n const text: string = `${invite.email} (Invite)`;\r\n\r\n return (\r\n <li key={invite.inviteId}>\r\n <span\r\n onClick={() => {\r\n const location: string = window.location.href;\r\n const segments: string[] = location.split(this.props.tenant);\r\n window.open(`${segments[0]}${this.props.tenant}/admin/users`);\r\n }}\r\n className=\"audience-associated-item\"\r\n >\r\n {text}\r\n </span>\r\n </li>\r\n );\r\n })}\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private createNewAudience = () => {\r\n this.setState({ selectedAudience: undefined, showAudienceCreation: true });\r\n }\r\n\r\n private createAudience = (audience: DraftAudience): Promise<boolean> => {\r\n return this.props.createAudience(audience);\r\n }\r\n\r\n private deleteAudience = async (id: string): Promise<boolean> => {\r\n this.setState({ isFetching: true });\r\n\r\n const associations = await Promise.all([\r\n audiencesApi.getAssociatedCategoryTags(id),\r\n audiencesApi.getAssociatedDocuments(id),\r\n audiencesApi.getAssociatedNewsletters(id),\r\n audiencesApi.getAssociatedTopics(id),\r\n audiencesApi.getAssociatedInvites(id)\r\n ]);\r\n\r\n const associatedCategoryTags = associations[0];\r\n const associatedDocuments = associations[1];\r\n const associatedNewsletters = associations[2];\r\n const associatedTopics = associations[3];\r\n const associatedInvites = associations[4];\r\n\r\n this.setState({ isFetching: false });\r\n\r\n return new Promise(async (resolve) => {\r\n const totalAssociations: number = associatedCategoryTags.length + associatedDocuments.length + associatedNewsletters.length + associatedTopics.length + associatedInvites.length;\r\n\r\n if (!!totalAssociations) {\r\n await confirm.show({\r\n title: \"Audience in use\",\r\n text: (\r\n <div>\r\n <div>This audience cannot be deleted because it is used in {totalAssociations} item(s):</div>\r\n <ul>\r\n {this.associatedCategoryTags(associatedCategoryTags)}\r\n {this.associatedDocuments(associatedDocuments)}\r\n {this.associatedNewsletters(associatedNewsletters)}\r\n {this.associatedTopics(associatedTopics)}\r\n {this.associatedInvites(associatedInvites)}\r\n </ul>\r\n </div>\r\n ),\r\n yesText: \"Ok\",\r\n yesColor: \"#3b78ab\",\r\n hideNo: true\r\n });\r\n resolve(false);\r\n } else if (await confirm.show({\r\n title: \"Delete audience\",\r\n text: \"Are you sure you want to delete this audience?\",\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\",\r\n noColor: \"#888888\"\r\n })) {\r\n this.props.deleteAudience(id).then(async (succeeded) => {\r\n await confirm.show({\r\n title: \"Deleted!\",\r\n text: (\r\n <div className=\"success-checkmark-pop-dialog\">\r\n <div className=\"success-checkmark-pop-wrapper\">\r\n <div className=\"success-checkmark-pop-bg\">\r\n <div className=\"success-checkmark-pop-checkmark\"></div>\r\n </div>\r\n </div>\r\n <div>This audience has been successfully deleted.</div>\r\n </div>\r\n ),\r\n yesText: \"Ok\",\r\n hideNo: true\r\n });\r\n this.setState({hasDeleted: true})\r\n resolve(succeeded);\r\n });\r\n } else {\r\n resolve(false);\r\n }\r\n });\r\n }\r\n\r\n private deleteAudiences = async (ids: string[]): Promise<boolean> => {\r\n this.setState({ isFetching: true });\r\n\r\n const associations = await Promise.all([\r\n Promise.all(ids.map(id => audiencesApi.getAssociatedCategoryTags(id))),\r\n Promise.all(ids.map(id => audiencesApi.getAssociatedDocuments(id))),\r\n Promise.all(ids.map(id => audiencesApi.getAssociatedNewsletters(id))),\r\n Promise.all(ids.map(id => audiencesApi.getAssociatedTopics(id)))\r\n ]);\r\n\r\n const associatedCategoryTags = associations[0].reduce((acc, associations) => acc.concat(associations), []);\r\n const associatedDocuments = associations[1].reduce((acc, associations) => acc.concat(associations), []);\r\n const associatedNewsletters = associations[2].reduce((acc, associations) => acc.concat(associations), []);\r\n const associatedTopics = associations[3].reduce((acc, associations) => acc.concat(associations), []);\r\n\r\n const blockingAudiences = ids.filter((id, index) => associations[0][index].length !== 0 || associations[1][index].length !== 0 || associations[2][index].length !== 0 || associations[3][index].length !== 0);\r\n\r\n let blockingAudienceDetails = await audiencesApi.getAudienceDetails(blockingAudiences);\r\n\r\n let blockingAudienceNames = blockingAudienceDetails.map(audience => audience.displayName);\r\n let blockingNamesDisclaimer = this.getAudienceNameString(blockingAudienceNames);\r\n\r\n this.setState({ isFetching: false });\r\n\r\n return new Promise(async (resolve) => {\r\n if (!!blockingAudiences && blockingAudiences.length > 0) {\r\n await confirm.show({\r\n title: \"Audience(s) in Use\",\r\n text: (\r\n <div>\r\n <div>\r\n {blockingNamesDisclaimer} This prevents the {ids.length} selected audiences from getting deleted.\r\n <br/>\r\n {blockingAudiences.length === 1 ? \"This audience\" : \"These audiences\"} are used in:</div>\r\n <ul>\r\n {this.associatedCategoryTags(associatedCategoryTags.filter((categoryTag, index) => associatedCategoryTags.findIndex(searchCategoryTag => searchCategoryTag.id === categoryTag.id) === index))}\r\n {this.associatedDocuments(associatedDocuments.filter((document, index) => associatedDocuments.findIndex(searchDocument => searchDocument.id === document.id) === index))}\r\n {this.associatedNewsletters(associatedNewsletters.filter((newsletter, index) => associatedNewsletters.findIndex(searchNewsletter => searchNewsletter.id === newsletter.id) === index))}\r\n {this.associatedTopics(associatedTopics.filter((topic, index) => associatedTopics.findIndex(searchTopic => searchTopic.id === topic.id) === index))}\r\n </ul>\r\n </div>\r\n ),\r\n yesText: \"Ok\",\r\n hideNo: true\r\n });\r\n resolve(false);\r\n } else if (await confirm.show({\r\n title: \"Delete audiences\",\r\n text: \"Are you sure you want to delete these audiences?\",\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\"\r\n })) {\r\n this.props.deleteAudiences(ids).then(async (succeeded) => {\r\n await confirm.show({\r\n title: \"Deleted!\",\r\n text: (\r\n <div className=\"success-checkmark-pop-dialog\">\r\n <div className=\"success-checkmark-pop-wrapper\">\r\n <div className=\"success-checkmark-pop-bg\">\r\n <div className=\"success-checkmark-pop-checkmark\"></div>\r\n </div>\r\n </div>\r\n <div>These audiences were successfully deleted.</div>\r\n </div>\r\n ),\r\n yesText: \"Ok\",\r\n hideNo: true\r\n });\r\n this.setState({hasDeleted: true})\r\n resolve(succeeded);\r\n });\r\n } else {\r\n resolve(false);\r\n }\r\n });\r\n }\r\n\r\n private getAudienceNameString = (names: string[]) => {\r\n if(names.length === 1) {\r\n return (\r\n <React.Fragment>\r\n <b>{names[0]}</b> is in use.\r\n </React.Fragment>\r\n );\r\n }\r\n else if(names.length > 1) {\r\n let lastName = names.pop();\r\n\r\n return (\r\n <React.Fragment>\r\n <b>{names.join(\", \")},</b> and <b>{lastName}</b> are in use.\r\n </React.Fragment>\r\n );\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n private disableAudience = (id: string): Promise<boolean> => {\r\n return this.props.disableAudience(id);\r\n }\r\n\r\n private disableAudiences = (ids: string[]): Promise<boolean> => {\r\n return this.props.disableAudiences(ids);\r\n }\r\n\r\n private onDownloadUserData = (id: string, title: string): Promise<void> => {\r\n const file = {name: `${title}-user-data.csv`};\r\n return this.props.downloadUserData(id)\r\n .then((userData) => {\r\n if (!!userData) new FileDownloader(file).downloadBlob(userData)\r\n });\r\n }\r\n\r\n private editAudience = (id: string) => {\r\n this.setState({ isLoadingAudience: true });\r\n\r\n this.props.getAudienceDetails(id).then((audience) => {\r\n this.setState({ isLoadingAudience: false, selectedAudience: audience, showAudienceCreation: true });\r\n });\r\n }\r\n\r\n private enableAudience = (id: string): Promise<boolean> => {\r\n return this.props.enableAudience(id);\r\n }\r\n\r\n private enableAudiences = (ids: string[]): Promise<boolean> => {\r\n return this.props.enableAudiences(ids);\r\n }\r\n\r\n private fetchLists = () => {\r\n this.fetchAll(1, {});\r\n this.fetchDisabled(1, {});\r\n this.fetchEnabled(1, {});\r\n this.props.clearShouldFetch();\r\n }\r\n\r\n private fetchAll = (pageNumber: number, filters: Partial<AudienceFilterValues>, pageAmount?: number) => {\r\n !this.props.all.isFetching &&\r\n this.props.getAllAudiences(pageNumber, filters);\r\n }\r\n\r\n private fetchDisabled = (pageNumber: number, filters: Partial<AudienceFilterValues>, pageAmount?: number) => {\r\n !this.props.disabled.isFetching &&\r\n this.props.getDisabledAudiences(pageNumber, filters);\r\n }\r\n\r\n private fetchEnabled = (pageNumber: number, filters: Partial<AudienceFilterValues>, pageAmount?: number) => {\r\n !this.props.enabled.isFetching &&\r\n this.props.getEnabledAudiences(pageNumber, filters);\r\n }\r\n\r\n private fetchTenantAttributes = () => {\r\n !this.props.tenantAttributes.length &&\r\n this.props.getTenantAttributes();\r\n }\r\n\r\n private getTabLabel = (label: string, page: AudiencePage): string => {\r\n if (!!page.currentPage)\r\n return `${label} (${page.totalAudiences})`;\r\n return label;\r\n }\r\n\r\n private goToSyncedGroups = () => {\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/audiences/everyone\");\r\n }\r\n\r\n private saveAudience = (id: string, audience: DraftAudience): Promise<boolean> => {\r\n return this.props.saveAudience(id, audience);\r\n }\r\n\r\n private onCloseAudienceCreation = () => {\r\n this.setState({ showAudienceCreation: false });\r\n }\r\n\r\n private onSelectTab = (tabIndex: number) => {\r\n this.setState({ selectedTab: tabIndex });\r\n }\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\ninterface ComponentState {\r\n isFetching: boolean;\r\n isLoadingAudience: boolean;\r\n selectedAudience: AudienceDetails | undefined;\r\n selectedTab: number;\r\n showAudienceCreation: boolean;\r\n totalAudiences: number;\r\n hasDeleted: boolean;\r\n warningOpen: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences,\r\n all: state.audiences.all,\r\n disabled: state.audiences.disabled,\r\n enabled: state.audiences.enabled,\r\n errorMessage: state.audiences.errorMessage,\r\n everyoneAudienceEnabled: state.settings.tenantSettings.showFeatures.everyoneAudienceEnabled,\r\n isDeleting: state.audiences.isDeleting,\r\n isFetching: state.audiences.isFetching,\r\n isSaving: state.audiences.isSaving,\r\n maxAllowedAudiences: state.settings.tenantSettings.maxAllowedAudiences,\r\n shouldFetch: state.audiences.shouldFetch,\r\n tenant: state.tenant.id,\r\n equalToAnyRuleEnabled: state.settings.tenantSettings.showFeatures.equalToAnySmartAudienceRuleEnabled,\r\n maxAudiences: state.settings.tenantSettings.maxAllowedAudiences,\r\n tenantAttributes: state.settings.tenantAttributes,\r\n canEdit: state.settings.tenantSettings.manageTopicsAudiencesInAdmin,\r\n syncType: state.settings.tenantSettings.syncConfig.syncType\r\n }),\r\n {\r\n clearErrorMessage: actions.clearErrorMessage,\r\n clearShouldFetch: actions.clearShouldFetch,\r\n createAudience: actions.createAudience,\r\n deleteAudience: actions.deleteAudience,\r\n deleteAudiences: actions.deleteAudiences,\r\n disableAudience: actions.disableAudience,\r\n disableAudiences: actions.disableAudiences,\r\n downloadUserData: actions.downloadUserData,\r\n enableAudience: actions.enableAudience,\r\n enableAudiences: actions.enableAudiences,\r\n getAudiences: actions.getAudiences,\r\n getAudienceDetails: actions.getAudienceDetails,\r\n getAllAudiences: actions.getAllAudiences,\r\n getDisabledAudiences: actions.getDisabledAudiences,\r\n getEnabledAudiences: actions.getEnabledAudiences,\r\n getTenantAttributes: settingsActions.getTenantAttributes,\r\n saveAudience: actions.saveAudience,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(AudienceListing);\r\n","import * as React from \"react\";\r\nimport Modal from \"modules/common/components/modal\";\r\nimport './audiences.sass'\r\n\r\ninterface ComponentProps {\r\n show: boolean\r\n group: { name: string, users: any[] }\r\n closeModal: () => void\r\n}\r\n\r\nexport default class UserGroupPreivewModal extends React.PureComponent<ComponentProps, {}> {\r\n\r\n public render() {\r\n\r\n return (<Modal active={this.props.show}\r\n title={this.props.group.name}\r\n showControls={false}\r\n onCloseClick={this.handleModalCloseClick}\r\n >\r\n <div>\r\n <label className=\"audience-title\">Users in Group</label>\r\n <div className=\"results\" style={{backgroundColor: \"#fcfcfc\", height: \"400px\", overflowY: \"auto\" }}>\r\n {\r\n this.props.group.users.map(user => {\r\n return <div key={user.id} className=\"item\">\r\n {`${user.firstName} ${user.lastName} - ${user.email}`}\r\n </div>\r\n })\r\n }\r\n </div>\r\n </div>\r\n \r\n </Modal>);\r\n }\r\n\r\n private handleModalCloseClick = () => {\r\n this.props.closeModal()\r\n }\r\n}\r\n","import * as React from \"react\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport \"./audiences.sass\";\r\nimport { syncFunctionsApi } from \"api/instances\";\r\nimport {\r\n UserSuggestions,\r\n AudienceSuggestions,\r\n AdGroupSuggestions,\r\n UpdateEveryoneAudience,\r\n GroupGraphSuggestions,\r\n SyncType\r\n} from \"../models\";\r\nimport { injectIntl, FormattedMessage, IntlShape } from \"react-intl\";\r\nimport UserGroupPreviewModal from \"./userGroupPreviewModal\";\r\nimport { TenantSettings } from \"modules/settings\";\r\nimport { errorAlert } from \"utils/notyPopups\";\r\n\r\nconst FETCH_AMOUNT = 10;\r\n\r\nclass EveryoneSuggestionsManager extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n fetching: false,\r\n userSuggestions: [],\r\n groupSuggestions: [],\r\n cachedGroupSuggestions: {},\r\n audienceSuggestions: [],\r\n amountFetched: 0,\r\n groupAmountFetched: 0,\r\n userSearchText: \"\",\r\n prevUserSearchText: \"\",\r\n groupSearchText: \"\",\r\n prevGroupSearchText: \"\",\r\n activeTab: \"groups\",\r\n showGroupPreview: false,\r\n currentGroup: { name: \"\", users: [] },\r\n skipToken: \"\",\r\n currentPage: 0,\r\n lastPage: 0\r\n };\r\n }\r\n\r\n public render() {\r\n let currentAudience: null | UpdateEveryoneAudience = null;\r\n let syncType = this.props.tenantSettings.syncConfig.syncType;\r\n\r\n if (this.props.currentAudience) {\r\n currentAudience = {\r\n ...this.props.currentAudience,\r\n // includedUsers: this.props.currentAudience?.includedUsers.map(user => { return { Id: user.Id, Details: user.Details }}),\r\n includedGroups: this.props.currentAudience?.includedGroups.map((group) => {\r\n return { id: group.id, displayName: group.displayName, referenceId: group.referenceId, syncStatus: group.syncStatus };\r\n }),\r\n };\r\n }\r\n\r\n let showBackButton = this.state.currentPage > 0;\r\n let showNextButton = this.state.skipToken !== \"\" && this.state.skipToken !== null;\r\n \r\n\r\n return (\r\n <div className={`details list ${!this.props.currentAudience ? \"subscription\" : \"\"}`}>\r\n <div className=\"tabs\" style={{ borderBottom: \"1px solid #ddd\" }}>\r\n <ul className=\"tab-btns\">\r\n <li>\r\n <span\r\n onClick={() => {\r\n this.setState({ ...this.state, activeTab: \"groups\" });\r\n }}\r\n className={\"tab-btn\" + (this.state.activeTab === \"groups\" ? \" active\" : \"\")}\r\n title={`${syncType} Groups`}\r\n >\r\n <FormattedMessage id=\"users.syncedGroups\" defaultMessage={`${syncType} Groups`} values= {{ syncType: syncType}} />\r\n </span>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div style={{ marginTop: \"15px\" }}>\r\n {!this.props.currentAudience ? (\r\n <label style={{ width: \"155px\", marginLeft: \"25px\" }}>Search Groups (starts with)</label>\r\n ) : null}\r\n <div className={`input-wrapper ${this.props.currentAudience ? \"\" : \" subscription\"}`}>\r\n {this.props.currentAudience ? <label style={{ width: \"155px\" }}>Search Groups (starts with)</label> : null}\r\n <input\r\n className=\"form-control\"\r\n autoComplete=\"off\"\r\n value={this.state.groupSearchText}\r\n onChange={(e) => this.setState({ ...this.setState, groupSearchText: e.target.value })}\r\n onKeyDown={(e) =>\r\n this.state.groupSearchText !== this.state.prevGroupSearchText &&\r\n this.state.groupSearchText !== \"\" &&\r\n e.key === \"Enter\" &&\r\n this.handleSearchAction()\r\n }\r\n />\r\n <button\r\n className=\"search-btn btn-primary\"\r\n disabled={\r\n this.state.fetching ||\r\n this.props.working ||\r\n this.state.groupSearchText === this.state.prevGroupSearchText ||\r\n this.state.groupSearchText === \"\" ||\r\n !this.props.tenantSettings.canManageEveryoneAudience\r\n }\r\n onClick={() => this.handleSearchAction()}\r\n >\r\n Search\r\n </button>\r\n </div>\r\n <div className=\"results\">\r\n {this.state.fetching ? (\r\n <Loading padding={12} />\r\n ) : this.state.cachedGroupSuggestions[this.state.currentPage] !== undefined ? (\r\n this.state.cachedGroupSuggestions[this.state.currentPage].map((suggestions) => {\r\n return (\r\n <div key={suggestions.group.id} className=\"item\">\r\n {suggestions.group.displayName} ({suggestions.group.memberCount} users)\r\n <div style={{ display: \"inline\", float: \"right\" }}>\r\n <span\r\n className=\"add-btn\"\r\n onClick={() => this.addToupdatedAudience(\"includedGroups\", \"list\", suggestions.group)}\r\n >\r\n {this.props.canEdit ? (\r\n this.props.currentAudience ? (\r\n currentAudience?.includedGroups.find(group => group.id === suggestions.group.id || \r\n group.referenceId === suggestions.group.id ) ? (\r\n null\r\n ) : <i className=\"material-icons\">add</i>\r\n ) : (\r\n <input\r\n type=\"checkbox\"\r\n readOnly\r\n id={suggestions.group.id}\r\n checked={\r\n this.props.currentList?.findIndex(\r\n (ul) => ul.id === suggestions.group.id\r\n ) !== -1\r\n }\r\n onClick={() =>\r\n this.addToCurrentGroup(suggestions.group.id, suggestions.group.displayName)\r\n }\r\n />\r\n )\r\n ) : null}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n })\r\n ) : (\r\n <div style={{ textAlign: \"center\", color: \"#666\" }}>No results</div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n <div className=\"page-controls\">\r\n {showBackButton ? (\r\n <button\r\n className=\"page-btn\"\r\n disabled={this.state.fetching || this.props.working}\r\n onClick={() =>\r\n this.setState({\r\n ...this.state,\r\n currentPage: this.state.currentPage - 1,\r\n })\r\n }\r\n >\r\n <i className=\"material-icons\" style={{ fontSize: \"28px\" }}>\r\n navigate_before\r\n </i>\r\n </button>\r\n ) : null}\r\n {showNextButton || this.state.currentPage !== this.state.lastPage ? (\r\n <button\r\n className=\"page-btn next\"\r\n disabled={this.state.fetching || this.props.working}\r\n onClick={() => this.handleNextPage()}\r\n >\r\n <i className=\"material-icons\" style={{ fontSize: \"28px\" }}>\r\n navigate_next\r\n </i>\r\n </button>\r\n ) : null}\r\n </div>\r\n <UserGroupPreviewModal show={this.state.showGroupPreview} group={this.state.currentGroup} closeModal={this.closeModal} />\r\n </div>\r\n );\r\n }\r\n\r\n private handleSearchAction() {\r\n this.clearDictionary();\r\n this.setState(\r\n {\r\n ...this.state,\r\n currentPage: 0,\r\n skipToken: \"\",\r\n lastPage: 0,\r\n }, this.fetchGroupSuggestions\r\n );\r\n \r\n }\r\n\r\n private handleNextPage() {\r\n if (this.state.cachedGroupSuggestions[this.state.currentPage + 1] !== undefined) {\r\n this.setState({\r\n ...this.state,\r\n currentPage: this.state.currentPage + 1,\r\n });\r\n } else {\r\n this.fetchGroupSuggestions(true);\r\n }\r\n }\r\n\r\n private addToCurrentGroup(groupId: string, groupType: string) {\r\n if (this.props.currentList?.some((values) => values.id === groupId)) {\r\n return;\r\n }\r\n this.props.currentList?.push({ id: groupId, type: groupType });\r\n }\r\n\r\n private addToupdatedAudience(includedGroups: string, list: string, groupToUpdate: AdGroupSuggestions) {\r\n if (\r\n this.props.currentAudience?.includedGroups.some(\r\n (group) => group.id === groupToUpdate.id || group.referenceId === groupToUpdate.id\r\n )\r\n ) {\r\n return;\r\n }\r\n this.props.updateAudience(includedGroups, list, groupToUpdate);\r\n }\r\n\r\n private fetchGroupSuggestions = (next?: boolean) => {\r\n let currentPage = this.state.currentPage;\r\n if (next) {\r\n currentPage++;\r\n }\r\n\r\n this.setState(\r\n {\r\n ...this.state,\r\n fetching: true,\r\n },\r\n () => {\r\n if (this.state.groupSearchText !== \"\") {\r\n let syncType = this.props.tenantSettings.syncConfig.syncType;\r\n if(syncType === SyncType.MicrosoftAD){\r\n syncFunctionsApi\r\n .getUserGroupSuggestions(\r\n this.state.groupSearchText,\r\n FETCH_AMOUNT,\r\n this.state.skipToken\r\n )\r\n .then((response) => {\r\n if (response.skipToken === null) {\r\n this.setState({\r\n ...this.state,\r\n lastPage: currentPage,\r\n });\r\n }\r\n this.setState({\r\n ...this.state,\r\n cachedGroupSuggestions: {\r\n ...this.state.cachedGroupSuggestions,\r\n [currentPage]: response.groups,\r\n },\r\n currentPage,\r\n groupSuggestions: response.groups,\r\n skipToken: response.skipToken,\r\n fetching: false,\r\n prevGroupSearchText: this.state.groupSearchText,\r\n groupAmountFetched: this.state.groupAmountFetched + response.length,\r\n });\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n }\r\n else if(syncType === SyncType.Okta){\r\n syncFunctionsApi\r\n .getOktaUserGroupSuggestions(\r\n this.state.groupSearchText,\r\n FETCH_AMOUNT,\r\n this.state.skipToken\r\n )\r\n .then((response) => {\r\n if (response.skipToken === null) {\r\n this.setState({\r\n ...this.state,\r\n lastPage: currentPage,\r\n });\r\n }\r\n this.setState({\r\n ...this.state,\r\n cachedGroupSuggestions: {\r\n ...this.state.cachedGroupSuggestions,\r\n [currentPage]: response.groups,\r\n },\r\n currentPage,\r\n groupSuggestions: response.groups,\r\n skipToken: response.skipToken,\r\n fetching: false,\r\n prevGroupSearchText: this.state.groupSearchText,\r\n groupAmountFetched: this.state.groupAmountFetched + response.length,\r\n });\r\n })\r\n .catch((error) => {\r\n errorAlert(`An error has occured while trying to query your Groups.`);\r\n });\r\n }\r\n }\r\n }\r\n );\r\n };\r\n\r\n private clearDictionary = () => {\r\n var i = 0;\r\n while (this.state.cachedGroupSuggestions[i] !== undefined) {\r\n delete this.state.cachedGroupSuggestions[i];\r\n i++;\r\n }\r\n };\r\n\r\n private closeModal = () => {\r\n this.setState({ ...this.state, showGroupPreview: false });\r\n };\r\n}\r\n\r\ninterface ComponentProps {\r\n intl: IntlShape;\r\n working: boolean;\r\n updateAudience: (field: string, type: string, value: any) => void;\r\n currentAudience?: UpdateEveryoneAudience;\r\n currentList?: { id: string; type: string }[];\r\n updateList?: (id: string, type: string, add: boolean) => void;\r\n ADGroupSyncEnabled: boolean;\r\n canEdit: boolean;\r\n tenantSettings: TenantSettings;\r\n}\r\n\r\ninterface ComponentState {\r\n userSearchText: string;\r\n prevUserSearchText: string;\r\n groupSearchText: string;\r\n prevGroupSearchText: string;\r\n fetching: boolean;\r\n userSuggestions: UserSuggestions[];\r\n groupSuggestions: GroupGraphSuggestions[];\r\n cachedGroupSuggestions: {\r\n [pageNumber: number]: GroupGraphSuggestions[];\r\n };\r\n audienceSuggestions: AudienceSuggestions[];\r\n amountFetched: number;\r\n groupAmountFetched: number;\r\n activeTab: string;\r\n showGroupPreview: boolean;\r\n currentGroup: {\r\n name: string;\r\n users: any[];\r\n };\r\n skipToken: string;\r\n currentPage: number;\r\n lastPage: number;\r\n}\r\n\r\nexport default injectIntl(EveryoneSuggestionsManager);\r\n","import * as React from \"react\";\r\nimport Modal from \"modules/common/components/modal\";\r\nimport './audiences.sass'\r\nimport { Audience } from \"../models\";\r\n\r\ninterface ComponentProps {\r\n show: boolean\r\n deletingAudience: { id: string, name: string }\r\n audienceList: Audience[]\r\n closeModal: () => void\r\n deleting: boolean\r\n deleteAndReplace: (deleteId: string, replaceId: string) => void\r\n}\r\n\r\ninterface ComponentState {\r\n replaceSelection: { id: string, name: string }\r\n}\r\n\r\nexport default class DeleteReplaceModal extends React.PureComponent<ComponentProps, ComponentState> {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = { \r\n replaceSelection: { id: \"\", name: \"\" }\r\n }\r\n }\r\n\r\n public render() {\r\n \r\n let audienceList = this.props.audienceList.filter(a => a.id !== this.props.deletingAudience.id)\r\n \r\n return (<Modal active={this.props.show}\r\n isWorking={this.props.deleting}\r\n title={\"Delete and Replace Audience\"}\r\n showControls={true}\r\n onCloseClick={this.handleModalCloseClick}\r\n buttons={[\r\n { title: \"Replace\", workingTitle: \"processing...\", isWorking: this.props.deleting, isPrimary: true, isEnabled: !this.props.deleting && this.state.replaceSelection.id !== \"\", \r\n onClick: () => { this.props.deleteAndReplace(this.props.deletingAudience.id, this.state.replaceSelection.id) } \r\n },\r\n ]}>\r\n <div>\r\n <p>The audience you are trying to delete is currently in use by an existing topic.</p>\r\n <p>Please pick from these enabled audiences to replace the one you wish to delete </p>\r\n <div style={{display: \"flex\", marginTop: \"40px\"}}>\r\n <label className=\"audience-title\" style={{marginBottom: \"0px\", marginRight: \"10px\"}}>Audience being deleted:</label>\r\n <input className=\"form-control\"\r\n autoComplete=\"off\" \r\n value={this.props.deletingAudience.name}\r\n style={{width: \"200px\"}}\r\n readOnly \r\n />\r\n </div>\r\n <div style={{display: \"flex\", marginTop: \"10px\"}}>\r\n <label className=\"audience-title\" style={{marginBottom: \"0px\", marginRight: \"10px\"}}>Replace with:</label>\r\n <input className=\"form-control\"\r\n autoComplete=\"off\" \r\n value={this.state.replaceSelection.name}\r\n style={{width: \"200px\"}}\r\n readOnly \r\n />\r\n </div>\r\n <div className=\"results delete\" style={{height: \"400px\", overflowY: \"auto\"}}>\r\n {\r\n audienceList.map(a => {\r\n return <div key={a.id} className=\"item\">\r\n {a.displayName}\r\n <span className=\"add-btn\" onClick={() => this.handleInputChange(a)}>\r\n <i className=\"material-icons\">add</i>\r\n </span> \r\n </div> \r\n })\r\n }\r\n </div>\r\n \r\n </div>\r\n \r\n </Modal>);\r\n }\r\n\r\n private handleModalCloseClick = () => {\r\n this.props.closeModal()\r\n }\r\n\r\n private handleInputChange = (a: Audience) => {\r\n this.setState({\r\n ...this.state,\r\n replaceSelection: { id: a.id, name: a.displayName }\r\n })\r\n }\r\n}\r\n","import * as React from \"react\";\r\nimport LoadingSpinner from '../loadingSpinner';\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\n\r\ninterface IProps {\r\n styles?: React.CSSProperties\r\n onClick: () => any\r\n text: string\r\n /** Download type. Default is 'text/csv;charset=utf-8;' */\r\n type?: string\r\n downloadName: string\r\n disabled?: boolean\r\n usingNewReports?: boolean;\r\n waitingOnRequest?: boolean;\r\n}\r\n\r\ninterface IState {\r\n isLoading: boolean\r\n}\r\n\r\nexport default class DownloadButton extends React.Component<IProps, IState> {\r\n \r\n private defaultStyles: React.CSSProperties = {\r\n backgroundColor: '#2f4050',\r\n color: \"#ffffff\",\r\n border: 'none', \r\n outline: 'none',\r\n padding: '8px',\r\n cursor: \"pointer\",\r\n display: \"inline-block\",\r\n fontSize: \"15px\",\r\n borderRadius: '3px'\r\n }\r\n\r\n private element: any;\r\n\r\n constructor(props){\r\n super(props);\r\n this.state = {\r\n isLoading: false\r\n };\r\n }\r\n \r\n componentDidMount(){\r\n this.defaultStyles = {\r\n ...this.defaultStyles,\r\n minWidth: `${this.element.offsetWidth}px`,\r\n minHeight: `${this.element.offsetHeight}px`\r\n }\r\n }\r\n\r\n public render(){\r\n let styles = {...this.defaultStyles, ...this.props.styles};\r\n return (\r\n <button ref={(ref) => this.element = ref} \r\n disabled={this.state.isLoading || (this.props.disabled ?? false)} \r\n style={styles} \r\n onClick={this.onClick}\r\n >\r\n {\r\n this.state.isLoading ? \r\n <LoadingSpinner \r\n size={`${styles.fontSize}`}\r\n style={{\r\n height:`${styles.fontSize}`\r\n }}\r\n /> : \r\n <span>\r\n <i className=\"material-icons\" style={{verticalAlign: \"middle\", fontSize: styles.fontSize}}>save_alt</i> \r\n {this.props.text}\r\n </span>\r\n }\r\n </button>)\r\n }\r\n\r\n private onClick = (e) => {\r\n e.stopPropagation();\r\n\r\n this.setState({ isLoading: true }, () => {\r\n if (this.props.usingNewReports && this.props.waitingOnRequest !== undefined) {\r\n this.props.onClick();\r\n this.setState({ isLoading: this.props.waitingOnRequest });\r\n } else {\r\n const file = {\r\n name: `${this.props.downloadName}-${new Date().toISOString()}.csv`,\r\n type: this.props.type,\r\n };\r\n this.props.onClick()\r\n .then((data) => new FileDownloader(file).downloadBlob(data))\r\n .then((_) => this.setState({ isLoading: false }))\r\n .catch((_) => this.setState({ isLoading: false }));\r\n }\r\n });\r\n }\r\n}","import * as React from \"react\";\r\nimport { Audience, UpdateEveryoneAudience, GroupSyncStatus, SyncAction, AdGroupSuggestions, SyncType } from \"../models\";\r\nimport { RouteComponentProps, Prompt } from \"react-router\";\r\nimport \"./audiences.sass\";\r\nimport { audiencesApi, syncFunctionsApi, settingsApi } from \"api/instances\";\r\nimport EveryoneSuggestionsManager from \"./everyoneSuggestionsManager\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { User } from \"modules/users/models\";\r\nimport LoadingSpinner from \"modules/common/components/loadingSpinner\";\r\nimport { injectIntl, IntlShape, FormattedMessage } from \"react-intl\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { errorAlert, warning } from \"utils/notyPopups\";\r\nimport DeleteReplaceModal from \"./deleteReplaceModal\";\r\nimport * as settingsActions from \"modules/settings/actionCreator\";\r\nimport DownloadButton from \"modules/common/components/buttons/downloadButton\";\r\nimport ToggleSwitch from \"modules/common/components/toggleSwitch\";\r\nimport Select from \"react-select\";\r\nimport { ValueLabel } from \"modules/common/components/selectFilter\";\r\nimport Modal from \"modules/common/components/modal\";\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Breadcrumb from \"pages/common/breadcrumb\";\r\nimport MainContent from \"pages/common/mainContent\";\r\nimport CalloutHover from \"modules/common/components/hovers/calloutHover\";\r\nimport ConfirmDialog from \"modules/common/components/dialogs/confirmDialog\";\r\nimport SuccessSnackbar from \"modules/common/components/snackbars/successSnackbar\";\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\n\r\n\r\nclass EveryoneAudienceManager extends React.Component<PropsWithRedux, ComponentState> {\r\n private _isMounted = false;\r\n private _waitingForAdSyncCompletion = false;\r\n private _allAzureADGroupName = \"All Azure AD Users\";\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n updateAudience: {\r\n displayName: \"\",\r\n description: \"\",\r\n enabled: false,\r\n includedGroups: [],\r\n },\r\n pristineAudience: {\r\n displayName: \"\",\r\n description: \"\",\r\n enabled: false,\r\n includedGroups: [],\r\n },\r\n audienceId: \"\",\r\n saving: false,\r\n deleting: false,\r\n fetching: true,\r\n activeTab: \"groups\",\r\n usersPerGroup: {},\r\n syncStatusPerGroup: {},\r\n pristineSync: {},\r\n audienceList: [],\r\n showReplaceDeleteModal: false,\r\n syncStatusesToBeUpdated: [],\r\n edited: false,\r\n defaultEnforcementState: false,\r\n enforcementChanged: false,\r\n mobileSyncChanged: false,\r\n showUserSyncModal: false,\r\n defaultSyncOptions: \"\",\r\n allAdGroupId: \"\",\r\n waitingForAdSyncCompletion: false,\r\n confirmResyncDialogOpen: false,\r\n waitingForResyncCompletion: false,\r\n resyncSnackbarMsg: \"\",\r\n resyncErrorSnackbarMsg: \"\"\r\n };\r\n }\r\n public componentDidMount() {\r\n this._isMounted = true;\r\n\r\n this.fetchSyncedUserGroups();\r\n this.setState({\r\n ...this.state,\r\n defaultEnforcementState: this.props.tenantSettings.everyoneAudienceEnforcementEnabled,\r\n defaultSyncOptions: this.props.tenantSettings.syncConfig.syncLevel\r\n })\r\n }\r\n \r\n public componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n private defaultStyles: React.CSSProperties = {\r\n backgroundColor: '#2f4050',\r\n color: \"#ffffff\",\r\n border: '1px solid #ccc', \r\n outline: 'none',\r\n padding: '8px',\r\n cursor: \"pointer\",\r\n display: \"inline-block\",\r\n fontSize: \"14px\",\r\n borderRadius: '3px',\r\n float: \"right\",\r\n marginRight: '3px'\r\n }\r\n \r\n public render() {\r\n\r\n const selectStyles = {\r\n control: (provided) => ({\r\n ...provided,\r\n width: \"100%\",\r\n marginBottom: 20\r\n }),\r\n menu: (provided) => {\r\n return {\r\n ...provided,\r\n width: \"100%\",\r\n }\r\n } \r\n };\r\n\r\n const options = this.GetMobileFieldOptions(this.props.tenantSettings.syncConfig.syncType);\r\n const preferredMobileField = this.GetPreferredMobileField(this.props.tenantSettings.syncConfig.syncType);\r\n\r\n const essentialsSyncFields = this.GetEssentialsSyncFields(this.props.tenantSettings.syncConfig.syncType);\r\n const basicsSyncFields = this.GetBasicsSyncFields(this.props.tenantSettings.syncConfig.syncType);\r\n\r\n const syncOptions = [\r\n {value: \"essentialsOnly\", label: \"Essentials\"},\r\n {value: \"basic\", label: \"Basic\"},\r\n ]\r\n\r\n let hoverDescription = \r\n <div>\r\n <strong>Essentials:</strong> {essentialsSyncFields} <br />\r\n <strong>Basic:</strong> Everything in Essentials plus: {basicsSyncFields}\r\n </div>\r\n \r\n let resyncBtnDisabled = this.state.waitingForResyncCompletion || this.isNameEmpty() || this.state.updateAudience.includedGroups.length === 0; \r\n let saveBtnDisabled = (\r\n this.state.saving || \r\n this.state.fetching || \r\n this.state.deleting || \r\n !this.props.canEdit || \r\n this.isNameEmpty() || \r\n !this.isEdited() || \r\n !this.state.edited ||\r\n !this.props.tenantSettings.canManageEveryoneAudience\r\n );\r\n let audience = this.state.updateAudience;\r\n let userGroupEdited = this.isUserGroupsEdited();\r\n\r\n let syncOptionsIndex = syncOptions.findIndex(o => o.value === this.props.tenantSettings.syncConfig.syncLevel);\r\n let userAdSyncEnabled = this.props.tenantSettings.syncConfig.syncAllAdUsers;\r\n let syncType = this.props.tenantSettings.syncConfig.syncType;\r\n\r\n let allAdSyncStatus = this.state.syncStatusPerGroup[this.state.allAdGroupId]\r\n if (allAdSyncStatus && allAdSyncStatus.syncStatus.status !== 'Completed') {\r\n this._waitingForAdSyncCompletion = true;\r\n }\r\n return (\r\n <BasePage fullWidth>\r\n <Prompt\r\n when={userGroupEdited}\r\n message=\"You have unsaved changes, are you sure you want to leave this page?\"\r\n />\r\n <Breadcrumb\r\n items={[\r\n {\r\n title: \"Manage Audiences\",\r\n link: \"~/admin/audiences\",\r\n },\r\n { title: `Sync ${syncType} Groups` },\r\n ]}\r\n />\r\n <MainContent>\r\n <div className=\"everyone-audience-manager\">\r\n <div className=\"audience-column\" style={{width:\"50%\"}}>\r\n \r\n <div className=\"audience-title\">Audience Details</div>\r\n {this.props.tenantSettings.canManageEveryoneAudience ? null : <div className=\"audience-warning\">Only {syncType} Accounts from this Organization with the Owner permission can modify settings in Everyone Audience.</div>}\r\n <div className=\"details\">\r\n <div className=\"input-wrapper\">\r\n <label>\r\n <FormattedMessage id=\"common.name\" defaultMessage=\"Name\" />\r\n </label>\r\n <input\r\n className=\"form-control\"\r\n style={{ border: this.isNameEmpty() ? \"1px solid red\" : \"\" }}\r\n autoComplete=\"off\"\r\n disabled={true}\r\n value={audience.displayName ?? \"\"}\r\n onChange={(e) => this.updateAudienceName(e)}\r\n />\r\n </div>\r\n <div className=\"input-wrapper\">\r\n <label>\r\n <FormattedMessage id=\"common.description\" defaultMessage=\"Description\" />\r\n </label>\r\n <input\r\n className=\"form-control\"\r\n autoComplete=\"off\"\r\n disabled={true}\r\n value={audience.description ?? \"\"}\r\n onChange={(e) => this.updateAudienceDescription(e)}\r\n />\r\n </div>\r\n <div className=\"clearfix\" style={{marginBottom: 10}}>\r\n <label>Everyone Audience Enforcement</label>\r\n <span style={{float: \"right\",\r\n marginRight: -38}}>\r\n {!this.state.updateAudience.includedGroups.length ? \r\n (\r\n <CalloutHover\r\n arrow\r\n component= { \r\n <ToggleSwitch value={this.props.tenantSettings.everyoneAudienceEnforcementEnabled}\r\n onClick={() => this.handleEnforcementChange() }\r\n disabled={ true } /> \r\n } \r\n >\r\n <div className=\"disabled-button-message\">\r\n Sync at least 1 {syncType} Group to enable the Everyone Audience Enforcement setting.\r\n </div>\r\n </CalloutHover>\r\n ) : (\r\n <ToggleSwitch value={this.props.tenantSettings.everyoneAudienceEnforcementEnabled}\r\n onClick={() => this.handleEnforcementChange() }\r\n disabled={!this.props.tenantSettings.canManageEveryoneAudience } />\r\n )\r\n }\r\n </span>\r\n </div>\r\n <div style={{margin: \"20px 0px\"}}>\r\n <div>\r\n <div className=\"description-text\" style={{margin: \"10px 0px\", display: \"flex\"}}>Sync options: <InfoHover size=\"small\">{hoverDescription}</InfoHover></div>\r\n <Select \r\n options={syncOptions}\r\n defaultValue={syncOptions[syncOptionsIndex]}\r\n onChange={this.handleSelectSyncLevel}\r\n styles={selectStyles}\r\n isDisabled={!this.props.tenantSettings.canManageEveryoneAudience}/>\r\n </div>\r\n \r\n {this.props.tenantSettings.syncConfig.syncLevel === \"basic\" &&\r\n <div>\r\n <div className=\"description-text\" style={{margin: \"10px 0px\"}}>{syncType} Mobile Field to pull from:</div>\r\n <Select \r\n defaultValue= {options!.find(o => o.value === preferredMobileField)} \r\n options={options}\r\n onChange={this.handleSelectMobileSyncType}\r\n styles={selectStyles}/>\r\n </div>\r\n }\r\n </div> \r\n </div>\r\n \r\n </div>\r\n <div className=\"audience-column\">\r\n <div className=\"manager-controls-everyone\">\r\n <button\r\n style={{ \r\n float: \"right\",\r\n maxHeight: \"34px\",\r\n backgroundColor: saveBtnDisabled ? \"#CCCCCC\" : \"\",\r\n pointerEvents: saveBtnDisabled ? \"none\" : \"all\"\r\n }}\r\n disabled={saveBtnDisabled}\r\n onClick={() => this.setState({\r\n ...this.state,\r\n saving: true,\r\n }, this.saveGroupAndTenantSettings )}\r\n >\r\n {this.state.saving ? (\r\n <LoadingSpinner \r\n size={\"14px\"}\r\n style={{\r\n height:\"14px\"\r\n }}\r\n />\r\n ) : (\r\n <span>\r\n <FormattedMessage id=\"common.save\" defaultMessage=\"Save\" />\r\n </span>\r\n )}\r\n </button>\r\n <DownloadButton\r\n onClick={() => this.downloadEveryoneUserList() }\r\n text={\" Download User Data\"}\r\n downloadName={\"sparrow-user-data\"}\r\n styles={{\r\n ...this.defaultStyles,\r\n maxHeight: \"34px\",\r\n pointerEvents: !this.props.tenantSettings.canManageEveryoneAudience ? \"none\" : \"all\"\r\n }}\r\n disabled={!this.props.tenantSettings.canManageEveryoneAudience}\r\n />\r\n <button\r\n id=\"resyncBtn\"\r\n style={{ \r\n ...this.defaultStyles,\r\n maxHeight: \"34px\",\r\n backgroundColor: resyncBtnDisabled ? \"#CCCCCC\" : \"\",\r\n pointerEvents: resyncBtnDisabled ? \"none\" : \"all\"\r\n }}\r\n onClick={() => this.setState({ ...this.state, confirmResyncDialogOpen: true })}\r\n >\r\n <span\r\n style={{\r\n marginRight: \"4px\",\r\n verticalAlign: \"top\"\r\n }}\r\n >\r\n {\r\n this.state.waitingForResyncCompletion ?\r\n <LoadingSpinner\r\n size={\"14px\"}\r\n style={{\r\n height:\"14px\"\r\n }}\r\n />:\r\n <i className=\"material-icons\" style={{verticalAlign: \"middle\"}}>sync</i>\r\n }\r\n </span>\r\n <span\r\n style={{\r\n verticalAlign: \"top\"\r\n }}\r\n >\r\n {\r\n this.state.waitingForResyncCompletion ? \r\n <FormattedMessage id=\"audience.resyncBtnMsgInProg\" defaultMessage={\"Resync in progress..\"}/> :\r\n <FormattedMessage \r\n id=\"audience.resyncBtnMsg\" \r\n defaultMessage={`Resync All ${syncType} Users`}\r\n values={{syncType: syncType}}\r\n />\r\n }\r\n </span>\r\n </button>\r\n {/* {!this.props.canEdit ? (\r\n <p style={{ marginTop: \"40px\" }} className=\"alert-info wrapped\">\r\n {\" \"}\r\n To edit audiences, managing topics and audiences from the Admin Portal must be enabled. Management can\r\n be enabled  <TenantLink to=\"~/admin/settings#features\">here</TenantLink>.\r\n </p>\r\n ) : null} */}\r\n </div>\r\n </div>\r\n </div>\r\n <div style={{display:\"flex\"}} className=\"everyone-audience-manager-groups\">\r\n <div style={{padding:\"0px 50px\"}}>\r\n <div className=\"audience-title\">\r\n <FormattedMessage id=\"audience.groupsInEveryoneAudience\" defaultMessage=\"Synced Groups in Everyone Audience\" />\r\n </div>\r\n <div className=\"details list\">\r\n <div className=\"tabs\" style={{ borderBottom: \"1px solid #ddd\" }}>\r\n <ul className=\"tab-btns\">\r\n <li>\r\n <span\r\n onClick={() => {\r\n this.setState({\r\n ...this.state,\r\n activeTab: \"groups\",\r\n });\r\n }}\r\n className={\"tab-btn\" + (this.state.activeTab === \"groups\" ? \" active\" : \"\")}\r\n title={this.props.syncType + \" Groups\"}\r\n >\r\n <FormattedMessage id=\"users.groups\" defaultMessage={this.props.syncType + \" Groups\"} />\r\n </span>\r\n <button \r\n disabled={!this.props.tenantSettings.canManageEveryoneAudience}\r\n style={{float: 'right'}}\r\n className=\"search-btn btn-primary\"\r\n onClick={() => \r\n this.setState({\r\n ...this.state,\r\n fetching: true,\r\n }, this.fetchEveryoneAudienceGroups)}\r\n >\r\n {this.state.fetching ? (\r\n <LoadingSpinner size={\"14px\"} />\r\n ) : (\r\n <span>\r\n <FormattedMessage id=\"common.refresh\" defaultMessage=\"Refresh\" />\r\n </span>\r\n )}\r\n </button>\r\n \r\n </li>\r\n </ul>\r\n </div>\r\n <div style={{ marginTop: \"30px\" }}>\r\n <div className=\"results\" style={{ height: \"465px\", overflowY: \"auto\" }}>\r\n {this.state.fetching ? (\r\n <Loading padding={12} />\r\n ) : this.state.updateAudience.includedGroups.length !== 0 ? (\r\n this.state.updateAudience.includedGroups.map((group) => {\r\n \r\n return (\r\n <div key={group.id} className=\"item\">\r\n {group.displayName}\r\n {this.props.canEdit && group.displayName !== this._allAzureADGroupName ?\r\n (this.checkIfGroupToBeRemoved(group) ?\r\n (\r\n <span\r\n className=\"add-btn\"\r\n onClick={() => this.addToAudience(group)}\r\n >\r\n <i className=\"material-icons\">add</i>\r\n </span>\r\n ) \r\n :\r\n (\r\n <span\r\n className=\"remove-btn\"\r\n onClick={() => this.removeFromAudience(group)}\r\n >\r\n <i className=\"material-icons\">clear</i>\r\n </span>\r\n ) \r\n )\r\n : null}\r\n {this.state.syncStatusPerGroup[group.referenceId]?.syncStatus ||\r\n this.state.syncStatusPerGroup[group.id]?.syncStatus ? \r\n (\r\n <div\r\n key={group.referenceId}\r\n className=\"group-user\"\r\n style={{ marginTop: \"5px\" }}\r\n >\r\n <p>{`Sync Status: ${\r\n this.getSyncStatus(group)}` \r\n }</p>\r\n <p>{`Last Synced: ${this.state.syncStatusPerGroup[group.referenceId]?.syncStatus?.lastSyncCompletedTime ? \r\n new Date(this.state.syncStatusPerGroup[group.referenceId].syncStatus.lastSyncCompletedTime)\r\n : 'Waiting For Sync'}`}</p>\r\n </div>\r\n ) : null}\r\n\r\n </div>\r\n );\r\n })\r\n ) : (\r\n <div style={{ textAlign: \"center\", color: \"#666\" }}>\r\n <FormattedMessage id=\"audience.noItems\" defaultMessage=\"No items in audience yet\" />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div>\r\n <div className=\"audience-title\">\r\n <FormattedMessage id=\"audience.addGroupsToEveryoneAudience\" defaultMessage=\"Add {syncType} Groups to Audience (sync)\" values= {{ syncType: syncType}} />\r\n </div>\r\n <EveryoneSuggestionsManager\r\n working={this.state.saving || this.state.deleting}\r\n updateAudience={this.updateAudience}\r\n currentAudience={this.state.updateAudience}\r\n // ADGroupSyncEnabled={this.props.ADGroupSyncEnabled}\r\n canEdit={this.props.canEdit}\r\n tenantSettings={this.props.tenantSettings}\r\n />\r\n </div>\r\n </div>\r\n <DeleteReplaceModal\r\n show={this.state.showReplaceDeleteModal}\r\n deleting={this.state.deleting}\r\n closeModal={this.closeModal}\r\n audienceList={this.state.audienceList.filter((a) => a.enabled)}\r\n deleteAndReplace={this.deleteAndReplace}\r\n deletingAudience={{ id: this.state.audienceId, name: this.state.updateAudience.displayName }}\r\n />\r\n <Modal \r\n active={this.state.showUserSyncModal}\r\n title={userAdSyncEnabled ? \"Sync All AD Users\" : \"UnSync All AD Users\"}\r\n onCloseClick={() => this.closeSyncUserModal}\r\n showControls={true}\r\n buttons={[\r\n { title: \"Ok\", workingTitle: \"Ok\", isWorking: this.state.saving, isPrimary: true, isEnabled: !this.state.saving, onClick: () => { this.handleSyncUsers() } },\r\n { title: \"Cancel\", isPrimary: false, isEnabled: true, onClick: this.closeSyncUserModal }\r\n ]}\r\n children={<>Are you sure you want to {userAdSyncEnabled ? \"sync\" : \"unsync\"} all Users from AD?</>}\r\n\r\n />\r\n <SuccessSnackbar\r\n successMessage={ this.state.resyncSnackbarMsg || \"\" }\r\n clearSuccessMessage={() => this.setState({ ...this.state, resyncSnackbarMsg: \"\" })}\r\n />\r\n <ErrorSnackbar\r\n errorMessage={ this.state.resyncErrorSnackbarMsg || \"\" }\r\n clearErrorMessage={ () => this.setState({ ...this.state, resyncErrorSnackbarMsg: \"\" }) }\r\n />\r\n {this.getResyncConfirm()}\r\n </MainContent>\r\n </BasePage>\r\n );\r\n }\r\n\r\n private GetMobileFieldOptions(syncType: string) {\r\n if(syncType === SyncType.MicrosoftAD){\r\n return [\r\n {value: \"mobilePhone\", label: \"Mobile Phone\"},\r\n {value: \"businessPhones\", label: \"Business Phone\"}\r\n ];\r\n }\r\n else if(syncType === SyncType.Okta){\r\n return [\r\n {value: \"mobilePhone\", label: \"Mobile Phone\"},\r\n {value: \"primaryPhone\", label: \"Primary Phone\"}\r\n ];\r\n }\r\n }\r\n\r\n private GetPreferredMobileField(syncType: string) {\r\n if(syncType === SyncType.MicrosoftAD){\r\n return this.props.tenantSettings.syncConfig.mobileSyncConfig.graphMobileFieldSource;\r\n }\r\n else if(syncType === SyncType.Okta){\r\n return this.props.tenantSettings.syncConfig.mobileSyncConfig.oktaMobileFieldSource;\r\n }\r\n }\r\n\r\n private GetEssentialsSyncFields(syncType: string) {\r\n if(syncType === SyncType.MicrosoftAD){\r\n return 'First Name, Last Name, Email, Title, Account Enabled';\r\n }\r\n else if(syncType === SyncType.Okta){\r\n return 'First Name, Last Name, Email, Title, Account Enabled';\r\n }\r\n }\r\n\r\n private GetBasicsSyncFields(syncType: string) {\r\n if(syncType === SyncType.MicrosoftAD){\r\n return 'Preferred SMS Phone, Country, Department, Manager, Office Location';\r\n }\r\n else if(syncType === SyncType.Okta){\r\n return 'Preferred SMS Phone, Country, Department, Manager';\r\n }\r\n }\r\n \r\n private closeSyncUserModal = () => {\r\n this.props.setSyncAllAdUsers(!this.props.tenantSettings.syncConfig.syncAllAdUsers);\r\n this.setState({\r\n ...this.state,\r\n showUserSyncModal: false,\r\n mobileSyncChanged: !this.state.mobileSyncChanged,\r\n })\r\n }\r\n\r\n private openSyncUserModal = () => {\r\n this.props.setSyncAllAdUsers(!this.props.tenantSettings.syncConfig.syncAllAdUsers);\r\n this.setState({ \r\n ...this.state, \r\n showUserSyncModal: true,\r\n mobileSyncChanged: !this.state.mobileSyncChanged,\r\n });\r\n }\r\n\r\n private handleSyncUsers = () => {\r\n // Make my api call\r\n this.setState({\r\n ...this.state,\r\n saving: true,\r\n mobileSyncChanged: true\r\n })\r\n let action = this.props.tenantSettings.syncConfig.syncAllAdUsers ? \"SyncRequested\" : \"DeleteRequested\";\r\n syncFunctionsApi.manageAdUserSync(action)\r\n .then(() => {\r\n this.saveTenantSettings();\r\n })\r\n }\r\n private getSyncStatus(group: AdGroupSuggestions) {\r\n\r\n /* The reason why we're checking for if the referenceId is undefined is because when a suggestion \r\n gets added in from the right side, the api call doesn't return a referenceid yet. Instead, it returns\r\n an ID which is actually what the reference ID is for groups that have already been synced */\r\n let status;\r\n if (group.referenceId === undefined) {\r\n status = this.state.syncStatusPerGroup[group.id].syncStatus.status\r\n } else {\r\n status = this.state.syncStatusPerGroup[group.referenceId].syncStatus.status\r\n };\r\n\r\n switch (status){\r\n case \"NotSyncedYet\":\r\n return \"Not Synced Yet\";\r\n case \"SyncRequested\":\r\n return \"Sync Requested\";\r\n case \"DeleteRequested\":\r\n return \"Delete Requested\";\r\n case \"Syncing\":\r\n return \"Syncing\";\r\n case \"Completed\":\r\n return \"Completed\";\r\n case \"Error\":\r\n return \"Error\";\r\n case \"WaitingForSave\":\r\n return \"Waiting For Save Request\";\r\n default:\r\n return \"\";\r\n }\r\n }\r\n\r\n private handleEnforcementChange = () => {\r\n if(this.state.updateAudience.includedGroups.length !== 0) {\r\n this.setState({\r\n ...this.state,\r\n enforcementChanged: !this.state.enforcementChanged,\r\n edited: true\r\n })\r\n this.props.setEveryoneAudienceEnforcementEnabled(!this.props.tenantSettings.everyoneAudienceEnforcementEnabled); \r\n } \r\n }\r\n\r\n private handleSelectMobileSyncType = (o: ValueLabel ) => {\r\n this.setState({\r\n ...this.state,\r\n mobileSyncChanged: true,\r\n edited: true\r\n })\r\n this.props.setMobileSyncNumberSelected(o.value);\r\n }\r\n\r\n private handleSelectSyncLevel = (o: ValueLabel ) => {\r\n this.setState({\r\n ...this.state,\r\n mobileSyncChanged: true,\r\n edited: true\r\n })\r\n this.props.setSyncLevel(o.value);\r\n }\r\n private handleMobileSyncChange = () => {\r\n this.setState({\r\n ...this.state,\r\n mobileSyncChanged: true,\r\n edited: true\r\n })\r\n this.props.setMobileSyncEnabled(!this.props.tenantSettings.syncConfig.mobileSyncConfig.mobileSyncEnabled);\r\n }\r\n private checkIfGroupToBeRemoved(groupToBeRemoved: any) {\r\n return this.state.syncStatusesToBeUpdated.some(group => \r\n group.action === \"DeleteRequested\" && groupToBeRemoved.referenceId === group.id\r\n ) \r\n }\r\n\r\n private updateAudienceName = (e: React.ChangeEvent<HTMLInputElement>) => this.updateAudience(\"displayName\", \"input\", e.target.value);\r\n\r\n private updateAudienceDescription = (e: React.ChangeEvent<HTMLInputElement>) =>\r\n this.updateAudience(\"description\", \"input\", e.target.value);\r\n\r\n private updateAudience = (field: string, type: string, groupToAdd: any) => {\r\n let setValue;\r\n if (type === \"input\") {\r\n setValue = groupToAdd;\r\n } else {\r\n setValue = this.state.updateAudience[field].concat(groupToAdd);\r\n }\r\n\r\n this.setState(\r\n {\r\n ...this.state,\r\n edited: true,\r\n updateAudience: {\r\n ...this.state.updateAudience,\r\n [field]: setValue,\r\n },\r\n syncStatusPerGroup: {\r\n ...this.state.syncStatusPerGroup,\r\n [groupToAdd.id]: {\r\n syncStatus: {status: \"WaitingForSave\", lastSyncCompletedTime: \"Waiting For Sync\"} as GroupSyncStatus,\r\n }\r\n },\r\n syncStatusesToBeUpdated: [...this.state.syncStatusesToBeUpdated, ({id: groupToAdd.id, action: \"WaitingForSave\"} as SyncAction)],\r\n }\r\n );\r\n };\r\n\r\n private addToAudience = (groupToAdd: any) => {\r\n /* the only state that can exist is to return an audience that previosly existed\r\n from delete requested back to the previous state, so 2 things need to happen here\r\n 1: need to remove the delete request from the sync queue that will be sent \r\n 2: need to restore to the pristine sync status */ \r\n var indexToRemove = this.state.syncStatusesToBeUpdated.findIndex((group => group.id === groupToAdd.referenceId));\r\n var modifiedSyncStatusesToBeUpdated = this.state.syncStatusesToBeUpdated;\r\n modifiedSyncStatusesToBeUpdated.splice(indexToRemove, 1);\r\n\r\n var newSyncStatusPerGroup = this.state.syncStatusPerGroup;\r\n var previousSyncStatus = this.state.pristineSync[groupToAdd.referenceId].sync;\r\n newSyncStatusPerGroup[groupToAdd.referenceId].syncStatus.status = previousSyncStatus;\r\n \r\n this.setState({\r\n ...this.state,\r\n edited: true,\r\n syncStatusesToBeUpdated: modifiedSyncStatusesToBeUpdated,\r\n syncStatusPerGroup: newSyncStatusPerGroup,\r\n })\r\n\r\n }\r\n\r\n private isUserGroupsEdited = () => {\r\n /* Two things to check, if the size of the sync status in syncStatusPerGroup is different from pristineSync */\r\n if (Object.keys(this.state.syncStatusPerGroup).length !== Object.keys(this.state.pristineSync).length) {\r\n return true;\r\n }\r\n \r\n /* If the status has been changed OR there was an error, we can resave */\r\n for ( var key in this.state.pristineSync) {\r\n if ((this.state.pristineSync[key].sync !== this.state.syncStatusPerGroup[key].syncStatus.status) || this.state.pristineSync[key].sync === 'Error') {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n \r\n private isEdited = () => {\r\n /* Two things to check, if the size of the sync status in syncStatusPerGroup is different from pristineSync */\r\n if (Object.keys(this.state.syncStatusPerGroup).length !== Object.keys(this.state.pristineSync).length || this.state.enforcementChanged || this.state.mobileSyncChanged) {\r\n return true;\r\n }\r\n \r\n /* If the status has been changed OR there was an error, we can resave */\r\n for ( var key in this.state.pristineSync) {\r\n if ((this.state.pristineSync[key].sync !== this.state.syncStatusPerGroup[key].syncStatus.status) || this.state.pristineSync[key].sync === 'Error') {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private removeFromAudience = (groupToRemove: any) => {\r\n const checkForId = group => group.id === groupToRemove.referenceId || group.id === groupToRemove.id;\r\n const everyoneEnforcementWarningMsg = \"After clicking Save to confirm, any Users that are not in another Synced group than the ones that are deleted will be disabled.\";\r\n\r\n /* First we want to check to see if there is already an action for that specific id in the queue,\r\n so we are only modifying the action per id */\r\n if (this.state.syncStatusesToBeUpdated.some(checkForId)) {\r\n let updatedSyncStatus = this.state.syncStatusPerGroup;\r\n let updatedArray = this.state.syncStatusesToBeUpdated;\r\n var groupIndex = this.state.syncStatusesToBeUpdated.findIndex((group => group.id === groupToRemove.referenceId));\r\n\r\n /* We also want to check to see if this was an action on a current group or a newly added action\r\n There is no use sending a delete requested if it was never synced. */\r\n if (this.state.pristineAudience.includedGroups.some(group => (group.id === groupToRemove.referenceId) || (group.id === groupToRemove.id) )) {\r\n updatedArray[groupIndex].action = \"DeleteRequested\";\r\n this.setState({\r\n ...this.state,\r\n edited: true,\r\n syncStatusesToBeUpdated: updatedArray,\r\n syncStatusPerGroup: updatedSyncStatus,\r\n })\r\n if (this.props.tenantSettings.everyoneAudienceEnforcementEnabled){\r\n warning(everyoneEnforcementWarningMsg);\r\n }\r\n } else {\r\n /* Need to remove from 2 places, need to remove from the updated audience list as well as remove from sync requested list */\r\n updatedArray.splice(groupIndex, 1); \r\n var updatedAudienceList = updatedAudienceList = this.state.updateAudience[\"includedGroups\"];\r\n var indexToRemove = this.state.updateAudience[\"includedGroups\"].findIndex(function(item, i) {\r\n return item.id === groupToRemove.referenceId;\r\n });\r\n updatedAudienceList.splice(indexToRemove, 1);\r\n this.setState({\r\n ...this.state,\r\n edited: true,\r\n syncStatusesToBeUpdated: updatedArray,\r\n updateAudience: {\r\n ...this.state.updateAudience,\r\n includedGroups: updatedAudienceList,\r\n },\r\n })\r\n }\r\n\r\n } else {\r\n let updatedSyncStatus = this.state.syncStatusPerGroup;\r\n updatedSyncStatus[groupToRemove.referenceId].syncStatus.status = \"DeleteRequested\";\r\n this.setState({\r\n ...this.state,\r\n edited: true,\r\n syncStatusesToBeUpdated: [...this.state.syncStatusesToBeUpdated, ({id: groupToRemove.referenceId, action: \"DeleteRequested\"} as SyncAction)],\r\n syncStatusPerGroup: updatedSyncStatus,\r\n })\r\n if (this.props.tenantSettings.everyoneAudienceEnforcementEnabled){\r\n warning(everyoneEnforcementWarningMsg);\r\n }\r\n }\r\n };\r\n\r\n private isNameEmpty = (): boolean => {\r\n let audience = this.state.updateAudience;\r\n return audience.displayName === \"\" || !audience.displayName;\r\n };\r\n\r\n private fetchUsersInGroups = () => {\r\n this.setState({ ...this.state, fetching: true });\r\n this.state.updateAudience.includedGroups.forEach((group) => {\r\n audiencesApi.getUsersInGroup(group.referenceId).then((response) => {\r\n if (this._isMounted) {\r\n this.setState({\r\n ...this.state,\r\n usersPerGroup: {\r\n ...this.state.usersPerGroup,\r\n [group.referenceId]: {\r\n users: response,\r\n },\r\n },\r\n fetching: false,\r\n });\r\n }\r\n });\r\n });\r\n };\r\n\r\n private fetchSyncedUserGroups = () => {\r\n audiencesApi.getEveryoneAudience().then((response) => {\r\n if (this._isMounted) {\r\n this.setState({\r\n ...this.state,\r\n edited: false,\r\n audienceId: response.id,\r\n updateAudience: {\r\n ...this.state.updateAudience,\r\n ...response,\r\n },\r\n pristineAudience: {\r\n ...this.state.pristineAudience,\r\n ...response,\r\n }\r\n });\r\n }\r\n }).then( () => {\r\n audiencesApi.getIncludedEveryoneGroups(this.state.audienceId).then((response) => {\r\n let groupList: AdGroupSuggestions[] = response.map((group) => {\r\n return { id: group.Id, displayName: group.Name, referenceId: group.ReferenceId };\r\n });\r\n const allAdGroupId = response.find(g => g.Name === this._allAzureADGroupName);\r\n if (allAdGroupId) {\r\n this.setState({\r\n ...this.state,\r\n allAdGroupId: allAdGroupId.ReferenceId\r\n })\r\n }\r\n if (this._isMounted) {\r\n this.setState(\r\n {\r\n ...this.state,\r\n updateAudience: {\r\n ...this.state.updateAudience,\r\n includedGroups: groupList,\r\n },\r\n pristineAudience: {\r\n ...this.state.pristineAudience,\r\n includedGroups: groupList\r\n },\r\n fetching: false,\r\n },\r\n () => {\r\n this.setState({ ...this.state, pristineAudience: this.state.updateAudience }, () => {\r\n if (this.state.updateAudience.includedGroups.length !== 0) {\r\n this.fetchSyncStatusForGroups(true);\r\n }\r\n\r\n });\r\n }\r\n );\r\n }\r\n });\r\n });\r\n }\r\n\r\n private fetchEveryoneAudienceGroups= () => {\r\n audiencesApi.getEveryoneAudienceGroups().then((response) => {\r\n let groupList: AdGroupSuggestions[] = response.map((group) => {\r\n return { id: group.Id, displayName: group.Name, referenceId: group.ReferenceId };\r\n });\r\n\r\n \r\n this.setState(\r\n {\r\n ...this.state,\r\n updateAudience: {\r\n ...this.state.updateAudience,\r\n includedGroups: groupList,\r\n },\r\n fetching: false,\r\n },\r\n () => {\r\n this.setState({ ...this.state, pristineAudience: this.state.updateAudience }, () => {\r\n if (this.state.updateAudience.includedGroups.length !== 0) {\r\n this.fetchSyncStatusForGroups(true);\r\n }\r\n\r\n });\r\n }\r\n );\r\n })\r\n }\r\n private fetchSyncStatusForGroups = (onFirstMount?: boolean) => {\r\n this.setState({ ...this.state, fetching: true });\r\n this.state.updateAudience.includedGroups.forEach((group) => {\r\n audiencesApi.getGroupSyncStatus(group.id).then((response) => {\r\n if (this._isMounted) {\r\n this.setState({\r\n ...this.state,\r\n syncStatusPerGroup: {\r\n ...this.state.syncStatusPerGroup,\r\n [group.referenceId]: {\r\n syncStatus: response,\r\n },\r\n },\r\n fetching: false,\r\n saving: false,\r\n });\r\n if (onFirstMount) {\r\n this.setState({\r\n ...this.state,\r\n pristineSync: {\r\n ...this.state.pristineSync,\r\n [group.referenceId]: {\r\n sync: response.status,\r\n },\r\n },\r\n })\r\n }\r\n }\r\n });\r\n });\r\n };\r\n\r\n private saveAudience = () => {\r\n let groups = this.state.updateAudience.includedGroups;\r\n let syncStatuses = this.state.syncStatusPerGroup; \r\n let newSyncStatusPerGroup = this.state.syncStatusPerGroup;\r\n let statusesToUpdate: SyncAction[] = [];\r\n\r\n if (this._waitingForAdSyncCompletion) {\r\n errorAlert(`You must wait for ${this._allAzureADGroupName} to finish Syncing before you try to sync another group. Please try again later`, 5000);\r\n this.setState({\r\n ...this.state,\r\n saving: false,\r\n edited: false\r\n })\r\n return;\r\n }\r\n groups.forEach((group) => {\r\n /* Want to see if\r\n 1: it is not synced yet, and not already added to sync list\r\n 2: there was an error syncing, then we add again to the sync list */\r\n if ((syncStatuses[group.referenceId]?.syncStatus?.status === 'NotSyncedYet' && !this.state.syncStatusesToBeUpdated.some(g => g.id === group.referenceId))\r\n || syncStatuses[group.referenceId]?.syncStatus.status === 'Error' || syncStatuses[group.id]?.syncStatus.status === 'WaitingForSave') {\r\n \r\n if (group.referenceId) {\r\n newSyncStatusPerGroup[group.referenceId].syncStatus.status = \"SyncRequested\";\r\n statusesToUpdate.push({id: group.referenceId, action: \"SyncRequested\"} as SyncAction) \r\n } else {\r\n newSyncStatusPerGroup[group.id].syncStatus.status = \"SyncRequested\";\r\n statusesToUpdate.push({id: group.id, action: \"SyncRequested\"} as SyncAction) \r\n }\r\n }\r\n if (group.referenceId === null) {\r\n statusesToUpdate.push({id: group.referenceId, action: \"SyncRequested\"} as SyncAction)\r\n }\r\n if (syncStatuses[group.referenceId]?.syncStatus?.status === \"DeleteRequested\") {\r\n newSyncStatusPerGroup[group.referenceId].syncStatus.status = \"DeleteRequested\";\r\n }\r\n });\r\n this.setState({\r\n ...this.state,\r\n syncStatusesToBeUpdated: [\r\n ...this.state.syncStatusesToBeUpdated, ...statusesToUpdate]\r\n }, () => {\r\n\r\n if ((this.state.enforcementChanged || this.state.mobileSyncChanged) && this.state.syncStatusesToBeUpdated.length > 0) {\r\n this.setState({\r\n ...this.state,\r\n saving: true,\r\n edited: true\r\n })\r\n //Begin sync\r\n syncFunctionsApi.startGroupSync(this.state.syncStatusesToBeUpdated, this.props.tenantSettings.syncConfig.syncType)\r\n .then(() => {\r\n //Save tenant settings\r\n settingsApi.UpdateTenantSettings(this.props.tenantSettings)\r\n .then(() => {\r\n this.setState({\r\n ...this.state,\r\n syncStatusesToBeUpdated: [],\r\n syncStatusPerGroup: newSyncStatusPerGroup,\r\n saving: false,\r\n edited: false,\r\n enforcementChanged: false,\r\n mobileSyncChanged: false,\r\n }, \r\n this.fetchSyncedUserGroups\r\n );\r\n })\r\n .catch((error) => {\r\n if (error.response.status === 500) {\r\n errorAlert(this.props.intl.formatMessage({id: \"audiences.internalServerError\", defaultMessage: \"There was an error processing your request, please contact support.\"}));\r\n this.fetchSyncedUserGroups();\r\n } else if (error.response.status === 400) {\r\n errorAlert(this.props.intl.formatMessage({id: \"audiences.badRequestError\", defaultMessage: \"There was an error sending your request.\"}));\r\n this.fetchSyncedUserGroups();\r\n } \r\n });\r\n })\r\n }\r\n else if (this.state.syncStatusesToBeUpdated.length > 0) {\r\n this.syncGroups(newSyncStatusPerGroup)\r\n }\r\n else if (this.state.enforcementChanged || this.state.mobileSyncChanged) {\r\n this.saveTenantSettings()\r\n }\r\n else {\r\n this.setState({\r\n ...this.state,\r\n saving: false\r\n })\r\n }\r\n });\r\n };\r\n\r\n private syncGroups = (newSyncStatusPerGroup: any) => {\r\n this.setState({\r\n ...this.state,\r\n saving: true,\r\n edited: true\r\n })\r\n syncFunctionsApi.startGroupSync(this.state.syncStatusesToBeUpdated, this.props.tenantSettings.syncConfig.syncType)\r\n .then(() => {\r\n this.setState({\r\n ...this.state,\r\n syncStatusesToBeUpdated: [],\r\n syncStatusPerGroup: newSyncStatusPerGroup,\r\n saving: false,\r\n edited: false,\r\n enforcementChanged: false,\r\n mobileSyncChanged: false,\r\n }, \r\n this.fetchSyncedUserGroups\r\n );\r\n })\r\n .catch((error) => {\r\n if (error.response.status === 500) {\r\n errorAlert(this.props.intl.formatMessage({id: \"audiences.internalServerError\", defaultMessage: \"There was an error processing your request, please contact support.\"}));\r\n this.fetchSyncedUserGroups();\r\n } else if (error.response.status === 400) {\r\n errorAlert(this.props.intl.formatMessage({id: \"audiences.badRequestError\", defaultMessage: \"There was an error sending your request.\"}));\r\n this.fetchSyncedUserGroups();\r\n } \r\n });\r\n }\r\n private saveGroupAndTenantSettings = () => {\r\n /* Only need to make a call to tenant settings if the enforcement was changed */\r\n if (this.isEdited()) {\r\n this.saveAudience();\r\n }\r\n }\r\n\r\n private saveTenantSettings = () => {\r\n if (this.state.enforcementChanged || this.state.mobileSyncChanged) {\r\n this.setState({\r\n ...this.state,\r\n saving: true,\r\n edited: true\r\n }, () => {\r\n settingsApi.UpdateTenantSettings(this.props.tenantSettings)\r\n .then(() => {\r\n this.setState({\r\n ...this.state,\r\n saving: false,\r\n edited: false,\r\n enforcementChanged: false,\r\n mobileSyncChanged: false,\r\n showUserSyncModal: false,\r\n })\r\n this.fetchEveryoneAudienceGroups()\r\n })\r\n })\r\n }\r\n }\r\n\r\n private deleteAndReplace = (deleteId: string, replaceId: string) => {\r\n this.setState({ ...this.state, deleting: true });\r\n audiencesApi.deleteAndReplaceAudience(deleteId, replaceId).then((response) => {\r\n this.setState({\r\n ...this.state,\r\n deleting: false,\r\n });\r\n this.props.getTenantConfig(); //update tags in tenant settings store\r\n this.closeModal();\r\n this.props.redirectTo(\"/\" + this.props.match.params.tenant + \"/admin/audiences\");\r\n });\r\n };\r\n\r\n private closeModal = () => {\r\n this.setState({ ...this.state, showReplaceDeleteModal: false });\r\n };\r\n\r\n private downloadEveryoneUserList = () => audiencesApi.getEveryoneGroupUsersCsv();\r\n\r\n private resync = async () => {\r\n this.setState({ \r\n ...this.state, \r\n confirmResyncDialogOpen: false,\r\n waitingForResyncCompletion: true\r\n })\r\n\r\n try {\r\n await audiencesApi.startAllResync();\r\n\r\n this.setState({ \r\n ...this.state,\r\n resyncSnackbarMsg: \"Sync is in progress and may take some time to complete. Please check back later.\",\r\n });\r\n }\r\n catch {\r\n this.setState({\r\n ...this.state,\r\n resyncErrorSnackbarMsg: \"There was a problem with the sync. Please try again later.\",\r\n });\r\n }\r\n\r\n this.setState({\r\n ...this.state,\r\n waitingForResyncCompletion: false\r\n })\r\n }\r\n\r\n private getResyncConfirm = (): JSX.Element => (\r\n <ConfirmDialog\r\n title={`Resync all ${this.props.syncType} users`}\r\n confirmLabel=\"Resync\"\r\n denyLabel=\"Cancel\"\r\n open={this.state.confirmResyncDialogOpen}\r\n onClose={() => this.setState({ ...this.state, confirmResyncDialogOpen: false })}\r\n onConfirm={this.resync}\r\n onDeny={() => this.setState({ ...this.state, confirmResyncDialogOpen: false })}\r\n >\r\n <>\r\n Resyncing will update and match user details of all your current {this.props.syncType} accounts into Sparrow.\r\n Deleted users from your {this.props.syncType} will also be removed from Sparrow.\r\n <br />\r\n <br />\r\n Do you want to continue?\r\n <br />\r\n <br />\r\n </>\r\n </ConfirmDialog>\r\n );\r\n\r\n}\r\n\r\ninterface ComponentState {\r\n audienceId: string;\r\n updateAudience: UpdateEveryoneAudience;\r\n pristineAudience: UpdateEveryoneAudience;\r\n saving: boolean;\r\n deleting: boolean;\r\n fetching: boolean;\r\n activeTab: string;\r\n usersPerGroup: {\r\n [Id: string]: {\r\n users: User[];\r\n };\r\n };\r\n syncStatusPerGroup: {\r\n [referenceId: string]: {\r\n syncStatus: GroupSyncStatus;\r\n };\r\n };\r\n pristineSync: {\r\n [referenceId: string]: {\r\n sync: string;\r\n };\r\n };\r\n showReplaceDeleteModal: boolean;\r\n audienceList: Audience[];\r\n syncStatusesToBeUpdated: SyncAction[];\r\n edited: boolean;\r\n defaultEnforcementState: boolean;\r\n enforcementChanged: boolean;\r\n mobileSyncChanged: boolean;\r\n showUserSyncModal: boolean;\r\n defaultSyncOptions: string;\r\n allAdGroupId: string;\r\n waitingForAdSyncCompletion: boolean;\r\n confirmResyncDialogOpen: boolean;\r\n waitingForResyncCompletion: boolean;\r\n resyncSnackbarMsg: string;\r\n resyncErrorSnackbarMsg: string;\r\n}\r\n\r\ninterface RouteParams {\r\n tenant: string;\r\n // audienceId: string;\r\n}\r\n\r\ninterface ComponentProps {\r\n intl: IntlShape;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps<RouteParams>) => ({\r\n ...ownProps,\r\n // TODO: Change canEdit in the future once we figure out how the message should work\r\n canEdit: true,\r\n tenantSettings: state.settings.tenantSettings,\r\n syncType: state.settings.tenantSettings.syncConfig.syncType\r\n }),\r\n {\r\n redirectTo: push,\r\n getTenantConfig: settingsActions.getTenantSettings,\r\n getClientConfig: settingsActions.getClientSettings,\r\n saveTenantSettings: settingsActions.saveTenantSettings,\r\n setEveryoneAudienceEnforcementEnabled: settingsActions.setEveryoneAudienceEnforcementEnabled,\r\n setMobileSyncEnabled: settingsActions.setMobileSyncEnabled,\r\n setMobileSyncNumberSelected: settingsActions.setMobileSyncNumberSelected,\r\n setSyncLevel: settingsActions.setSyncLevel,\r\n setSyncAllAdUsers: settingsActions.setSyncAllAdUsersEnabled\r\n }\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default injectIntl(connector(EveryoneAudienceManager));\r\n","import { Action } from \"redux\";\r\nimport { CompleteAction, ActionCreator } from \"typedActions\";\r\n\r\n\r\nexport const GET_ACTIVITY_LOG = \"GET_ACTIVITY_LOG\";\r\nexport interface GetActivityLog extends Action {};\r\nexport const GetActivityLog = ActionCreator<GetActivityLog>(GET_ACTIVITY_LOG);\r\n\r\nexport const GET_ACTIVITY_LOG_COMPLETE = \"GET_ACTIVITY_LOG_COMPLETE\";\r\nexport interface GetActivityLogComplete extends CompleteAction {};\r\nexport const GetActivityLogComplete = ActionCreator<GetActivityLogComplete>(GET_ACTIVITY_LOG_COMPLETE);\r\n\r\nexport const GET_ACTIVITY_LOG_CSV = \"GET_ACTIVITY_LOG_CSV\";\r\nexport interface GetActivityLogCSV extends Action {};\r\nexport const GetActivityLogCSV = ActionCreator<GetActivityLogCSV>(GET_ACTIVITY_LOG_CSV);\r\n\r\nexport const GET_ACTIVITY_LOG_CSV_COMPLETE = \"GET_ACTIVITY_LOG_CSV_COMPLETE\";\r\nexport interface GetActivityLogCSVComplete extends CompleteAction {};\r\nexport const GetActivityLogCSVComplete = ActionCreator<GetActivityLogCSVComplete>(GET_ACTIVITY_LOG_CSV_COMPLETE);\r\n\r\nexport const GET_RECIPIENTS_CSV = \"GET_RECIPIENTS_CSV\";\r\nexport interface GetRecipientsCSV extends Action {};\r\nexport const GetRecipientsCSV = ActionCreator<GetRecipientsCSV>(GET_RECIPIENTS_CSV);\r\n\r\nexport const GET_RECIPIENTS_CSV_COMPLETE = \"GET_RECIPIENTS_CSV_COMPLETE\";\r\nexport interface GetRecipientsCSVComplete extends CompleteAction {};\r\nexport const GetRecipientsCSVComplete = ActionCreator<GetRecipientsCSVComplete>(GET_RECIPIENTS_CSV_COMPLETE);\r\n\r\nexport const GET_CONFIG = \"GET_CONFIG\";\r\nexport interface GetConfig extends Action {};\r\nexport const GetConfig = ActionCreator<GetConfig>(GET_CONFIG);\r\n\r\nexport const GET_CONFIG_COMPLETE = \"GET_CONFIG_COMPLETE\";\r\nexport interface GetConfigComplete extends CompleteAction {};\r\nexport const GetConfigComplete = ActionCreator<GetConfigComplete>(GET_CONFIG_COMPLETE);\r\n\r\nexport const GET_EVENT = \"GET_EVENT\";\r\nexport interface GetEvent extends Action {};\r\nexport const GetEvent = ActionCreator<GetEvent>(GET_EVENT);\r\n\r\nexport const GET_EVENT_COMPLETE = \"GET_EVENT_COMPLETE\";\r\nexport interface GetEventComplete extends CompleteAction {};\r\nexport const GetEventComplete = ActionCreator<GetEventComplete>(GET_EVENT_COMPLETE);\r\n\r\nexport const GET_INSIGHTS_DAILY = \"GET_INSIGHTS_DAILY\";\r\nexport interface GetDailyNewsletterInsights extends Action {};\r\nexport const GetDailyNewsletterInsights = ActionCreator<GetDailyNewsletterInsights>(GET_INSIGHTS_DAILY);\r\n\r\nexport const GET_INSIGHTS_DAILY_COMPLETE = \"GET_INSIGHTS_DAILY_COMPLETE\";\r\nexport interface GetDailyNewsletterInsightsComplete extends CompleteAction {};\r\nexport const GetDailyNewsletterInsightsComplete = ActionCreator<GetDailyNewsletterInsightsComplete>(GET_INSIGHTS_DAILY_COMPLETE);\r\n\r\nexport const GET_TOTAL_NEWSLETTER_INSIGHTS = \"GET_TOTAL_NEWSLETTER_INSIGHTS\";\r\nexport interface GetTotalNewsletterInsights extends Action {};\r\nexport const GetTotalNewsletterInsights = ActionCreator<GetTotalNewsletterInsights>(GET_TOTAL_NEWSLETTER_INSIGHTS);\r\n\r\nexport const GET_TOTAL_NEWSLETTER_INSIGHTS_COMPLETE = \"GET_TOTAL_NEWSLETTER_INSIGHTS_COMPLETE\";\r\nexport interface GetTotalNewsletterInsightsComplete extends CompleteAction {};\r\nexport const GetTotalNewsletterInsightsComplete = ActionCreator<GetTotalNewsletterInsightsComplete>(GET_TOTAL_NEWSLETTER_INSIGHTS_COMPLETE);\r\n\r\nexport const GET_INSIGHTS_WEEKLY = \"GET_INSIGHTS_WEEKLY\";\r\nexport interface GetWeeklyNewsletterInsights extends Action {};\r\nexport const GetWeeklyNewsletterInsights = ActionCreator<GetWeeklyNewsletterInsights>(GET_INSIGHTS_WEEKLY);\r\n\r\nexport const GET_INSIGHTS_WEEKLY_COMPLETE = \"GET_INSIGHTS_WEEKLY_COMPLETE\";\r\nexport interface GetWeeklyNewsletterInsightsComplete extends CompleteAction {};\r\nexport const GetWeeklyNewsletterInsightsComplete = ActionCreator<GetWeeklyNewsletterInsightsComplete>(GET_INSIGHTS_WEEKLY_COMPLETE);\r\n\r\nexport const GET_NEWSLETTER = \"GET_NEWSLETTER\";\r\nexport interface GetNewsletter extends Action {};\r\nexport const GetNewsletter = ActionCreator<GetNewsletter>(GET_NEWSLETTER);\r\n\r\nexport const GET_NEWSLETTER_COMPLETE = \"GET_NEWSLETTER_COMPLETE\";\r\nexport interface GetNewsletterComplete extends CompleteAction {};\r\nexport const GetNewsletterComplete = ActionCreator<GetNewsletterComplete>(GET_NEWSLETTER_COMPLETE);\r\n\r\nexport const GET_NEWSLETTER_DETAILS = \"GET_NEWSLETTER_DETAILS\";\r\nexport interface GetNewsletterDetails extends Action {};\r\nexport const GetNewsletterDetails = ActionCreator<GetNewsletterDetails>(GET_NEWSLETTER_DETAILS);\r\n\r\nexport const GET_NEWSLETTER_DETAILS_COMPLETE = \"GET_NEWSLETTER_DETAILS_COMPLETE\";\r\nexport interface GetNewsletterDetailsComplete extends CompleteAction {};\r\nexport const GetNewsletterDetailsComplete = ActionCreator<GetNewsletterDetailsComplete>(GET_NEWSLETTER_DETAILS_COMPLETE);\r\n\r\nexport const GET_NEWSLETTER_TAGS = \"GET_NEWSLETTER_TAGS\";\r\nexport interface GetNewsletterTags extends Action {};\r\nexport const GetNewsletterTags = ActionCreator<GetNewsletterTags>(GET_NEWSLETTER_TAGS);\r\n\r\nexport const GET_NEWSLETTER_TAGS_COMPLETE = \"GET_NEWSLETTER_TAGS_COMPLETE\";\r\nexport interface GetNewsletterTagsComplete extends CompleteAction { };\r\nexport const GetNewsletterTagsComplete = ActionCreator<GetNewsletterTagsComplete>(GET_NEWSLETTER_TAGS_COMPLETE);\r\n\r\nexport const GET_NEWSLETTERS = \"GET_NEWSLETTERS\";\r\nexport interface GetNewsletters extends Action {};\r\nexport const GetNewsletters = ActionCreator<GetNewsletters>(GET_NEWSLETTERS);\r\n\r\nexport const GET_NEWSLETTERS_COMPLETE = \"GET_NEWSLETTERS_COMPLETE\";\r\nexport interface GetNewslettersComplete extends CompleteAction { };\r\nexport const GetNewslettersComplete = ActionCreator<GetNewslettersComplete>(GET_NEWSLETTERS_COMPLETE);\r\n\r\nexport const GET_DISABLED_NEWSLETTERS = \"GET_DISABLED_NEWSLETTERS\";\r\nexport interface GetDisabledNewsletters extends Action {};\r\nexport const GetDisabledNewsletters = ActionCreator<GetDisabledNewsletters>(GET_DISABLED_NEWSLETTERS);\r\n\r\nexport const GET_DISABLED_NEWSLETTERS_COMPLETE = \"GET_DISABLED_NEWSLETTERS_COMPLETE\";\r\nexport interface GetDisabledNewslettersComplete extends CompleteAction { };\r\nexport const GetDisabledNewslettersComplete = ActionCreator<GetDisabledNewslettersComplete>(GET_DISABLED_NEWSLETTERS_COMPLETE);\r\n\r\nexport const GET_DRAFT_NEWSLETTERS = \"GET_DRAFT_NEWSLETTERS\";\r\nexport interface GetDraftNewsletters extends Action {};\r\nexport const GetDraftNewsletters = ActionCreator<GetDraftNewsletters>(GET_DRAFT_NEWSLETTERS);\r\n\r\nexport const GET_DRAFT_NEWSLETTERS_COMPLETE = \"GET_DRAFT_NEWSLETTERS_COMPLETE\";\r\nexport interface GetDraftNewslettersComplete extends CompleteAction { };\r\nexport const GetDraftNewslettersComplete = ActionCreator<GetDraftNewslettersComplete>(GET_DRAFT_NEWSLETTERS_COMPLETE);\r\n\r\nexport const GET_TEMPLATES = \"GET_TEMPLATES\";\r\nexport interface GetTemplates extends Action {};\r\nexport const GetTemplates = ActionCreator<GetTemplates>(GET_TEMPLATES);\r\n\r\nexport const GET_TEMPLATES_COMPLETE = \"GET_TEMPLATES_COMPLETE\";\r\nexport interface GetTemplatesComplete extends CompleteAction {};\r\nexport const GetTemplatesComplete = ActionCreator<GetTemplatesComplete>(GET_TEMPLATES_COMPLETE );\r\n\r\nexport const GET_THEMES = \"GET_THEMES\";\r\nexport interface GetThemes extends Action {};\r\nexport const GetThemes = ActionCreator<GetThemes>(GET_THEMES);\r\n\r\nexport const GET_THEMES_COMPLETE = \"GET_THEMES_COMPLETE\";\r\nexport interface GetThemesComplete extends CompleteAction {};\r\nexport const GetThemesComplete = ActionCreator<GetThemesComplete>(GET_THEMES_COMPLETE );\r\n\r\nexport const SET_THEME_DEFAULT = \"SET_THEME_DEFAULT\";\r\nexport interface SetThemeDefault extends Action {};\r\nexport const SetThemeDefault = ActionCreator<SetThemeDefault>(SET_THEME_DEFAULT);\r\n\r\nexport const SET_THEME_DEFAULT_COMPLETE = \"SET_THEME_DEFAULT_COMPLETE\";\r\nexport interface SetThemeDefaultComplete extends CompleteAction {};\r\nexport const SetThemeDefaultComplete = ActionCreator<SetThemeDefaultComplete>(SET_THEME_DEFAULT_COMPLETE);\r\n\r\nexport const DELETE_THEME = \"DELETE_THEME\";\r\nexport interface DeleteTheme extends Action {};\r\nexport const DeleteTheme = ActionCreator<DeleteTheme>(DELETE_THEME);\r\n\r\nexport const DELETE_THEME_COMPLETE = \"DELETE_THEME_COMPLETE\";\r\nexport interface DeleteThemeComplete extends CompleteAction {};\r\nexport const DeleteThemeComplete = ActionCreator<DeleteThemeComplete>(DELETE_THEME_COMPLETE);\r\n\r\nexport const SAVE_THEME = \"SAVE_THEME\";\r\nexport interface SaveTheme extends Action {};\r\nexport const SaveTheme = ActionCreator<SaveTheme>(SAVE_THEME);\r\n\r\nexport const SAVE_THEME_COMPLETE = \"SAVE_THEME_COMPLETE\";\r\nexport interface SaveThemeComplete extends CompleteAction {};\r\nexport const SaveThemeComplete = ActionCreator<SaveThemeComplete>(SAVE_THEME_COMPLETE);\r\n\r\nexport const SAVE_THEME_IMAGES = \"SAVE_THEME_IMAGES\";\r\nexport interface SaveThemeImages extends Action {};\r\nexport const SaveThemeImages = ActionCreator<SaveThemeImages>(SAVE_THEME_IMAGES);\r\n\r\nexport const SAVE_THEME_IMAGES_COMPLETE = \"SAVE_THEME_IMAGES_COMPLETE\";\r\nexport interface SaveThemeImagesComplete extends CompleteAction {};\r\nexport const SaveThemeImagesComplete = ActionCreator<SaveThemeImagesComplete>(SAVE_THEME_IMAGES_COMPLETE);\r\n\r\nexport const GET_THEME_IMAGE = \"GET_THEME_IMAGE\";\r\nexport interface GetThemeImage extends Action {};\r\nexport const GetThemeImage = ActionCreator<GetThemeImage>(GET_THEME_IMAGE);\r\n\r\nexport const GET_THEME_IMAGE_COMPLETE = \"GET_THEME_IMAGE_COMPLETE\";\r\nexport interface GetThemeImageComplete extends CompleteAction {};\r\nexport const GetThemeImageComplete = ActionCreator<GetThemeImageComplete>(GET_THEME_IMAGE_COMPLETE);\r\n\r\nexport const DELETE_THEME_IMAGE = \"DELETE_THEME_IMAGE\";\r\nexport interface DeleteThemeImage extends Action {};\r\nexport const DeleteThemeImage = ActionCreator<DeleteThemeImage>(DELETE_THEME_IMAGE);\r\n\r\nexport const DELETE_THEME_IMAGE_COMPLETE = \"DELETE_THEME_IMAGE_COMPLETE\";\r\nexport interface DeleteThemeImageComplete extends CompleteAction {};\r\nexport const DeleteThemeImageComplete = ActionCreator<DeleteThemeImageComplete>(DELETE_THEME_IMAGE_COMPLETE);\r\n\r\nexport const GET_NEWSLETTER_PREVIEW = \"GET_NEWSLETTER_PREVIEW\";\r\nexport interface GetNewsletterPreview extends Action {};\r\nexport const GetNewsletterPreview = ActionCreator<GetNewsletterPreview>(GET_NEWSLETTER_PREVIEW);\r\n\r\nexport const GET_NEWSLETTER_PREVIEW_COMPLETE = \"GET_NEWSLETTER_PREVIEW_COMPLETE\";\r\nexport interface GetNewsletterPreviewComplete extends CompleteAction {};\r\nexport const GetNewsletterPreviewComplete = ActionCreator<GetNewsletterPreviewComplete>(GET_NEWSLETTER_PREVIEW_COMPLETE);\r\n\r\nexport const GET_TEMPLATE_HTML = \"GET_TEMPLATE_HTML\";\r\nexport interface GetTemplateHtml extends Action {};\r\nexport const GetTemplateHtml = ActionCreator<GetTemplates>(GET_TEMPLATE_HTML);\r\n\r\nexport const GET_TEMPLATE_HTML_COMPLETE = \"GET_TEMPLATE_HTML_COMPLETE\";\r\nexport interface GetTemplateHtmlComplete extends CompleteAction {};\r\nexport const GetTemplateHtmlComplete = ActionCreator<GetTemplateHtmlComplete>(GET_TEMPLATE_HTML_COMPLETE );\r\n\r\nexport const GET_TEMPLATE_IMAGE = \"GET_TEMPLATE_IMAGE\";\r\nexport interface GetTemplateImage extends Action {};\r\nexport const GetTemplateImage = ActionCreator<GetTemplateImage>(GET_TEMPLATE_IMAGE);\r\n\r\nexport const GET_TEMPLATE_IMAGE_COMPLETE = \"GET_TEMPLATE_IMAGE_COMPLETE\";\r\nexport interface GetTemplateImageComplete extends CompleteAction {};\r\nexport const GetTemplateImageComplete = ActionCreator<GetTemplateImageComplete>(GET_TEMPLATE_IMAGE_COMPLETE );\r\n\r\nexport const GET_ENABLED_NEWSLETTERS = \"GET_ENABLED_NEWSLETTERS\";\r\nexport interface GetEnabledNewsletters extends Action {};\r\nexport const GetEnabledNewsletters = ActionCreator<GetEnabledNewsletters>(GET_ENABLED_NEWSLETTERS);\r\n\r\nexport const GET_ENABLED_NEWSLETTERS_COMPLETE = \"GET_ENABLED_NEWSLETTERS_COMPLETE\";\r\nexport interface GetEnabledNewslettersComplete extends CompleteAction {};\r\nexport const GetEnabledNewslettersComplete = ActionCreator<GetEnabledNewslettersComplete>(GET_ENABLED_NEWSLETTERS_COMPLETE);\r\n\r\nexport const GET_PAST_ISSUES = \"GET_PAST_ISSUES\";\r\nexport interface GetPastIssues extends Action {};\r\nexport const GetPastIssues = ActionCreator<GetPastIssues>(GET_PAST_ISSUES);\r\n\r\nexport const GET_PAST_ISSUES_COMPLETE = \"GET_PAST_ISSUES_COMPLETE\";\r\nexport interface GetPastIssuesComplete extends CompleteAction {};\r\nexport const GetPastIssuesComplete = ActionCreator<GetPastIssuesComplete>(GET_PAST_ISSUES_COMPLETE);\r\n\r\nexport const GET_PAST_ISSUE = \"GET_PAST_ISSUE\";\r\nexport interface GetPastIssue extends Action {};\r\nexport const GetPastIssue = ActionCreator<GetPastIssue>(GET_PAST_ISSUE);\r\n\r\nexport const GET_PAST_ISSUE_COMPLETE = \"GET_PAST_ISSUE_COMPLETE\";\r\nexport interface GetPastIssueComplete extends CompleteAction {};\r\nexport const GetPastIssueComplete = ActionCreator<GetPastIssueComplete>(GET_PAST_ISSUE_COMPLETE);\r\n\r\nexport const GET_FUTURE_ISSUE_DETAILS = \"GET_FUTURE_ISSUE_DETAILS\";\r\nexport interface GetFutureIssueDetails extends Action {};\r\nexport const GetFutureIssueDetails = ActionCreator<GetFutureIssueDetails>(GET_FUTURE_ISSUE_DETAILS);\r\n\r\nexport const GET_FUTURE_ISSUE_DETAILS_COMPLETE = \"GET_FUTURE_ISSUE_DETAILS_COMPLETE\";\r\nexport interface GetFutureIssueDetailsComplete extends CompleteAction {};\r\nexport const GetFutureIssueDetailsComplete = ActionCreator<GetFutureIssueDetailsComplete>(GET_FUTURE_ISSUE_DETAILS_COMPLETE);\r\n\r\nexport const GET_POST = \"GET_POST\";\r\nexport interface GetPost extends Action {};\r\nexport const GetPost = ActionCreator<GetPost>(GET_POST);\r\n\r\nexport const GET_POST_COMPLETE = \"GET_POST_COMPLETE\";\r\nexport interface GetPostComplete extends CompleteAction {};\r\nexport const GetPostComplete = ActionCreator<GetPostComplete>(GET_POST_COMPLETE);\r\n\r\nexport const GET_ISSUE_IMAGE = \"GET_ISSUE_IMAGE\";\r\nexport interface GetIssueImage extends Action {};\r\nexport const GetIssueImage = ActionCreator<GetIssueImage>(GET_ISSUE_IMAGE);\r\n\r\nexport const GET_ISSUE_IMAGE_COMPLETE = \"GET_ISSUE_IMAGE_COMPLETE\";\r\nexport interface GetIssueImageComplete extends CompleteAction {};\r\nexport const GetIssueImageComplete = ActionCreator<GetIssueImageComplete>(GET_ISSUE_IMAGE_COMPLETE);\r\n\r\nexport const UPLOAD_ISSUE_IMAGE = \"UPLOAD_ISSUE_IMAGE\";\r\nexport interface UploadIssueImage extends Action {};\r\nexport const UploadIssueImage = ActionCreator<UploadIssueImage>(UPLOAD_ISSUE_IMAGE);\r\n\r\nexport const UPLOAD_ISSUE_IMAGE_COMPLETE = \"UPLOAD_ISSUE_IMAGE_COMPLETE\";\r\nexport interface UploadIssueImageComplete extends CompleteAction {};\r\nexport const UploadIssueImageComplete = ActionCreator<UploadIssueImageComplete>(UPLOAD_ISSUE_IMAGE_COMPLETE);\r\n\r\nexport const UPLOAD_HEADER_FOOTER_ISSUE_IMAGE = \"UPLOAD_HEADER_FOOTER_ISSUE_IMAGE\";\r\nexport interface UploadHeaderFooterIssueImage extends Action {};\r\nexport const UploadHeaderFooterIssueImage = ActionCreator<UploadHeaderFooterIssueImage>(UPLOAD_HEADER_FOOTER_ISSUE_IMAGE);\r\n\r\nexport const UPLOAD_HEADER_FOOTER_ISSUE_IMAGE_COMPLETE = \"UPLOAD_HEADER_FOOTER_ISSUE_IMAGE_COMPLETE\";\r\nexport interface UploadHeaderFooterIssueImageComplete extends CompleteAction {};\r\nexport const UploadHeaderFooterIssueImageComplete = ActionCreator<UploadHeaderFooterIssueImageComplete>(UPLOAD_HEADER_FOOTER_ISSUE_IMAGE_COMPLETE);\r\n\r\nexport const DELETE_ISSUE_IMAGE = \"DELETE_ISSUE_IMAGE\";\r\nexport interface DeleteIssueImage extends Action {};\r\nexport const DeleteIssueImage = ActionCreator<DeleteIssueImage>(DELETE_ISSUE_IMAGE);\r\n\r\nexport const DELETE_ISSUE_IMAGE_COMPLETE = \"DELETE_ISSUE_IMAGE_COMPLETE\";\r\nexport interface DeleteIssueImageComplete extends CompleteAction {};\r\nexport const DeleteIssueImageComplete = ActionCreator<DeleteIssueImageComplete>(DELETE_ISSUE_IMAGE_COMPLETE);\r\n\r\nexport const SAVE_NEWSLETTER = \"SAVE_NEWSLETTER\";\r\nexport interface SaveNewsletter extends Action {};\r\nexport const SaveNewsletter = ActionCreator<SaveNewsletter>(SAVE_NEWSLETTER);\r\n\r\nexport const SAVE_NEWSLETTER_COMPLETE = \"SAVE_NEWSLETTER_COMPLETE\";\r\nexport interface SaveNewsletterComplete extends CompleteAction {};\r\nexport const SaveNewsletterComplete = ActionCreator<SaveNewsletterComplete>(SAVE_NEWSLETTER_COMPLETE);\r\n\r\nexport const GET_NEWSLETTER_IMAGE = \"GET_NEWSLETTER_IMAGE\";\r\nexport interface GetNewsletterImage extends Action {};\r\nexport const GetNewsletterImage = ActionCreator<GetNewsletterImage>(GET_NEWSLETTER_IMAGE);\r\n\r\nexport const GET_NEWSLETTER_IMAGE_COMPLETE = \"GET_NEWSLETTER_IMAGE_COMPLETE\";\r\nexport interface GetNewsletterImageComplete extends CompleteAction {};\r\nexport const GetNewsletterImageComplete = ActionCreator<GetNewsletterImageComplete>(GET_NEWSLETTER_IMAGE_COMPLETE);\r\n\r\nexport const UPLOAD_NEWSLETTER_IMAGE = \"UPLOAD_NEWSLETTER_IMAGE\";\r\nexport interface UploadNewsletterImage extends Action {};\r\nexport const UploadNewsletterImage = ActionCreator<UploadNewsletterImage>(UPLOAD_NEWSLETTER_IMAGE);\r\n\r\nexport const UPLOAD_NEWSLETTER_IMAGE_COMPLETE = \"UPLOAD_NEWSLETTER_IMAGE_COMPLETE\";\r\nexport interface UploadNewsletterImageComplete extends CompleteAction {};\r\nexport const UploadNewsletterImageComplete = ActionCreator<UploadNewsletterImageComplete>(UPLOAD_NEWSLETTER_IMAGE_COMPLETE);\r\n\r\nexport const UPLOAD_NEWSLETTER_HEADER_FOOTER_IMAGE = \"UPLOAD_NEWSLETTER_HEADER_FOOTER_IMAGE\";\r\nexport interface UploadNewsletterHeaderFooterImage extends Action {};\r\nexport const UploadNewsletterHeaderFooterImage = ActionCreator<UploadNewsletterHeaderFooterImage>(UPLOAD_NEWSLETTER_HEADER_FOOTER_IMAGE);\r\n\r\n\r\nexport const UPLOAD_NEWSLETTER_HEADER_FOOTER_IMAGE_COMPLETE = \"UPLOAD_NEWSLETTER_HEADER_FOOTER_IMAGE_COMPLETE\";\r\nexport interface UploadNewsletterHeaderFooterImageComplete extends Action {};\r\nexport const UploadNewsletterHeaderFooterImageComplete = ActionCreator<UploadNewsletterHeaderFooterImageComplete>(UPLOAD_NEWSLETTER_HEADER_FOOTER_IMAGE_COMPLETE);\r\n\r\nexport const DELETE_NEWSLETTER_IMAGE = \"DELETE_NEWSLETTER_IMAGE\";\r\nexport interface DeleteNewsletterImage extends Action {};\r\nexport const DeleteNewsletterImage = ActionCreator<DeleteNewsletterImage>(DELETE_NEWSLETTER_IMAGE);\r\n\r\nexport const DELETE_NEWSLETTER_IMAGE_COMPLETE = \"DELETE_NEWSLETTER_IMAGE_COMPLETE\";\r\nexport interface DeleteNewsletterImageComplete extends CompleteAction {};\r\nexport const DeleteNewsletterImageComplete = ActionCreator<DeleteNewsletterImageComplete>(DELETE_NEWSLETTER_IMAGE_COMPLETE);\r\n\r\nexport const RESET_ISSUE = \"RESET_ISSUE\";\r\nexport interface ResetIssue extends Action {};\r\nexport const ResetIssue = ActionCreator<ResetIssue>(RESET_ISSUE);\r\n\r\nexport const RESET_ISSUE_COMPLETE = \"RESET_ISSUE_COMPLETE\";\r\nexport interface ResetIssueComplete extends CompleteAction {};\r\nexport const ResetIssueComplete = ActionCreator<ResetIssueComplete>(RESET_ISSUE_COMPLETE);\r\n\r\nexport const RESET_ISSUES = \"RESET_ISSUES\";\r\nexport interface ResetIssues extends Action {};\r\nexport const ResetIssues = ActionCreator<ResetIssues>(RESET_ISSUES);\r\n\r\nexport const RESET_ISSUES_COMPLETE = \"RESET_ISSUES_COMPLETE\";\r\nexport interface ResetIssuesComplete extends CompleteAction {};\r\nexport const ResetIssuesComplete = ActionCreator<ResetIssuesComplete>(RESET_ISSUES_COMPLETE);\r\n\r\nexport const SAVE_CONFIG = \"SAVE_CONFIG\";\r\nexport interface SaveConfig extends Action {};\r\nexport const SaveConfig = ActionCreator<SaveConfig>(SAVE_CONFIG);\r\n\r\nexport const SAVE_CONFIG_COMPLETE = \"SAVE_CONFIG_COMPLETE\";\r\nexport interface SaveConfigComplete extends CompleteAction {};\r\nexport const SaveConfigComplete = ActionCreator<SaveConfigComplete>(SAVE_CONFIG_COMPLETE);\r\n\r\nexport const SAVE_ISSUE = \"SAVE_ISSUE\";\r\nexport interface SaveIssue extends Action {};\r\nexport const SaveIssue = ActionCreator<SaveIssue>(SAVE_ISSUE);\r\n\r\nexport const SAVE_ISSUE_COMPLETE = \"SAVE_ISSUE_COMPLETE\";\r\nexport interface SaveIssueComplete extends CompleteAction {};\r\nexport const SaveIssueComplete = ActionCreator<SaveIssueComplete>(SAVE_ISSUE_COMPLETE);\r\n\r\nexport const SEARCH_EVENTS = \"SEARCH_EVENTS\";\r\nexport interface SearchEvents extends Action {};\r\nexport const SearchEvents = ActionCreator<SearchEvents>(SEARCH_EVENTS);\r\n\r\nexport const SEARCH_EVENTS_COMPLETE = \"SEARCH_EVENTS_COMPLETE\";\r\nexport interface SearchEventsComplete extends CompleteAction {};\r\nexport const SearchEventsComplete = ActionCreator<SearchEventsComplete>(SEARCH_EVENTS_COMPLETE);\r\n\r\nexport const SEARCH_POSTS = \"SEARCH_POSTS\";\r\nexport interface SearchPosts extends Action {};\r\nexport const SearchPosts = ActionCreator<SearchPosts>(SEARCH_POSTS);\r\n\r\nexport const SEARCH_POSTS_COMPLETE = \"SEARCH_POSTS_COMPLETE\";\r\nexport interface SearchPostsComplete extends CompleteAction {};\r\nexport const SearchPostsComplete = ActionCreator<SearchPostsComplete>(SEARCH_POSTS_COMPLETE);\r\n\r\nexport const SEND_TEST_EMAIL = \"SEND_TEST_EMAIL\";\r\nexport interface SendTestEmail extends Action {};\r\nexport const SendTestEmail = ActionCreator<SendTestEmail>(SEND_TEST_EMAIL);\r\n\r\nexport const SEND_TEST_EMAIL_COMPLETE = \"SEND_TEST_EMAIL_COMPLETE\";\r\nexport interface SendTestEmailComplete extends CompleteAction {};\r\nexport const SendTestEmailComplete = ActionCreator<SendTestEmailComplete>(SEND_TEST_EMAIL_COMPLETE);\r\n\r\nexport const SKIP_ISSUE = \"SKIP_ISSUE\";\r\nexport interface SkipIssue extends Action {};\r\nexport const SkipIssue = ActionCreator<SkipIssue>(SKIP_ISSUE);\r\n\r\nexport const SKIP_ISSUE_COMPLETE = \"SKIP_ISSUE_COMPLETE\";\r\nexport interface SkipIssueComplete extends CompleteAction {};\r\nexport const SkipIssueComplete = ActionCreator<SkipIssueComplete>(SKIP_ISSUE_COMPLETE);\r\n\r\nexport const UNSKIP_ISSUE = \"UNSKIP_ISSUE\";\r\nexport interface UnskipIssue extends Action {};\r\nexport const UnskipIssue = ActionCreator<UnskipIssue>(UNSKIP_ISSUE);\r\n\r\nexport const UNSKIP_ISSUE_COMPLETE = \"UNSKIP_ISSUE_COMPLETE\";\r\nexport interface UnskipIssueComplete extends CompleteAction {};\r\nexport const UnskipIssueComplete = ActionCreator<UnskipIssueComplete>(UNSKIP_ISSUE_COMPLETE);\r\n\r\nexport const CLONE_NEWSLETTER = \"CLONE_NEWSLETTER\";\r\nexport interface CloneNewsletter extends Action {};\r\nexport const CloneNewsletter = ActionCreator<CloneNewsletter>(CLONE_NEWSLETTER);\r\n\r\nexport const CLONE_NEWSLETTER_COMPLETE = \"CLONE_NEWSLETTER_COMPLETE\";\r\nexport interface CloneNewsletterComplete extends CompleteAction {};\r\nexport const CloneNewsletterComplete = ActionCreator<CloneNewsletterComplete>(CLONE_NEWSLETTER_COMPLETE);\r\n\r\nexport const DELETE_NEWSLETTER = \"DELETE_NEWSLETTER\";\r\nexport interface DeleteNewsletter extends Action {};\r\nexport const DeleteNewsletter = ActionCreator<DeleteNewsletter>(DELETE_NEWSLETTER);\r\n\r\nexport const DELETE_NEWSLETTER_COMPLETE = \"DELETE_NEWSLETTER_COMPLETE\";\r\nexport interface DeleteNewsletterComplete extends CompleteAction {};\r\nexport const DeleteNewsletterComplete = ActionCreator<DeleteNewsletterComplete>(DELETE_NEWSLETTER_COMPLETE);\r\n\r\nexport const DISABLE_NEWSLETTER = \"DISABLE_NEWSLETTER\";\r\nexport interface DisableNewsletter extends Action {};\r\nexport const DisableNewsletter = ActionCreator<DisableNewsletter>(DISABLE_NEWSLETTER);\r\n\r\nexport const DISABLE_NEWSLETTER_COMPLETE = \"DISABLE_NEWSLETTER_COMPLETE\";\r\nexport interface DisableNewsletterComplete extends CompleteAction {};\r\nexport const DisableNewsletterComplete = ActionCreator<DisableNewsletterComplete>(DISABLE_NEWSLETTER_COMPLETE);\r\n\r\nexport const ENABLE_NEWSLETTER = \"ENABLE_NEWSLETTER\";\r\nexport interface EnableNewsletter extends Action {};\r\nexport const EnableNewsletter = ActionCreator<EnableNewsletter>(ENABLE_NEWSLETTER);\r\n\r\nexport const ENABLE_NEWSLETTER_COMPLETE = \"ENABLE_NEWSLETTER_COMPLETE\";\r\nexport interface EnableNewsletterComplete extends CompleteAction {};\r\nexport const EnableNewsletterComplete = ActionCreator<EnableNewsletterComplete>(ENABLE_NEWSLETTER_COMPLETE);\r\n\r\nexport const GET_ASSOCIATED_NEWSLETTERS = \"GET_ASSOCIATED_NEWSLETTERS\";\r\nexport interface GetAssociatedNewsletters extends Action{};\r\nexport const GetAssociatedNewsletters = ActionCreator<GetAssociatedNewsletters>(GET_ASSOCIATED_NEWSLETTERS);","import { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as Actions from \"./actions\";\r\nimport API from \"api\";\r\n\r\nimport { EventFeedItem, EventView } from \"modules/events/models\";\r\nimport { PostFeedItem, PostView } from \"modules/posts/models\";\r\n\r\nimport { \r\n ActivityLogFilterValues, \r\n ActivityLogPage, \r\n NewsletterConfig, \r\n NewsletterDetails, \r\n NewsletterFilterValues, \r\n NewsletterIssueInput, \r\n NewsletterPastIssuesPage, \r\n NewsletterListingPage, \r\n DailyEmailEventStats, \r\n EmailEventStats, \r\n WeeklyEmailEventStats, \r\n SaveNewsletterModelStateErrors, \r\n NewsletterDigest, \r\n NewsletterFutureIssueDetailModel, \r\n NewsletterPastIssueDigestModel, \r\n SaveNewsletterModel, \r\n NewsletterImageType, \r\n NewsletterTemplate, \r\n NewsletterConfigDigest, \r\n SaveNewsletterConfigModelStateErrors, \r\n SaveNewsletterIssueModelStateErrors, \r\n NewsletterTags, \r\n NewsletterTemplateImageType, \r\n NewsletterTheme, \r\n UploadNewsletterImageModel,\r\n UploadIssueImageModel,\r\n Newsletter} from \"./models\";\r\nimport MsalAuthModule from \"authentication/msalAuthModule\";\r\nimport XhrUpload from \"utils/xhrUpload\";\r\nimport { TranslatableNewsletterContent } from \"modules/common/components/authoring/models\";\r\nimport { IdNamePair } from \"modules/common/models\";\r\n\r\n\r\nexport const getActivityLog = (pageNumber: number, filters: ActivityLogFilterValues) => (dispatch, getState: () => GlobalApplicationState): Promise<ActivityLogPage> => {\r\n dispatch(Actions.GetActivityLog({}));\r\n\r\n return dispatch(API.newsletters.GetActivityLog(pageNumber, filters))\r\n .then(response => response.json())\r\n .then(activityLog => {\r\n dispatch(Actions.GetActivityLogComplete({ succeeded: true }));\r\n return activityLog;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetActivityLogComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getActivityLogCSV = (filters: ActivityLogFilterValues) => (dispatch, getState: () => GlobalApplicationState): Promise<string> => {\r\n dispatch(Actions.GetActivityLogCSV({}));\r\n\r\n return dispatch(API.newsletters.GetActivityLogCSV(filters))\r\n .then(response => {\r\n dispatch(Actions.GetActivityLogCSVComplete({ succeeded: response.status === 200 }));\r\n return response.text();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetActivityLogCSVComplete({ succeeded: false, err }));\r\n return \"\";\r\n });\r\n}\r\n\r\nexport const getRecipientsCSV = (newsletterId: string) => (dispatch, getState: () => GlobalApplicationState): Promise<string> => {\r\n dispatch(Actions.GetRecipientsCSV({}));\r\n\r\n return dispatch(API.newsletters.GetRecipientsCSV(newsletterId))\r\n .then(response => {\r\n dispatch(Actions.GetRecipientsCSVComplete({ succeeded: response.status === 200 }));\r\n return response.text();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetRecipientsCSVComplete({ succeeded: false, err }));\r\n return \"\";\r\n });\r\n}\r\n\r\nexport const getConfig = () => (dispatch, getState: () => GlobalApplicationState): Promise<NewsletterConfigDigest> => {\r\n dispatch(Actions.GetConfig({}));\r\n\r\n return dispatch(API.newsletters.GetConfig())\r\n .then(response => response.json())\r\n .then(config => {\r\n dispatch(Actions.GetConfigComplete({ succeeded: true }));\r\n return config;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetConfigComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getEvent = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise<EventView> => {\r\n dispatch(Actions.GetEvent({}));\r\n\r\n return dispatch(API.events.GetEvent(id))\r\n .then(response => {\r\n dispatch(Actions.GetEventComplete({ succeeded: response.status === 200 }));\r\n return response.json();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetEventComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\n\r\nexport const GetDailyNewsletterInsights = (newsletterId: string) => (dispatch, getState: () => GlobalApplicationState): Promise<DailyEmailEventStats[]> => {\r\n dispatch(Actions.GetDailyNewsletterInsights({}));\r\n\r\n return dispatch(API.newsletters.GetDailyNewsletterInsights(newsletterId))\r\n .then(response => response.json())\r\n .then(insights => {\r\n dispatch(Actions.GetDailyNewsletterInsightsComplete({ succeeded: true }));\r\n return insights;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetDailyNewsletterInsightsComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getTotalNewsletterInsights = (newsletterId: string) => (dispatch, getState: () => GlobalApplicationState): Promise<EmailEventStats> => {\r\n dispatch(Actions.GetTotalNewsletterInsights({}));\r\n\r\n return dispatch(API.newsletters.GetTotalNewsletterInsights(newsletterId))\r\n .then(response => response.json())\r\n .then(insights => {\r\n dispatch(Actions.GetTotalNewsletterInsightsComplete({ succeeded: true }));\r\n return insights;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetTotalNewsletterInsightsComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const GetWeeklyNewsletterInsights = (newsletterId: string) => (dispatch, getState: () => GlobalApplicationState): Promise<WeeklyEmailEventStats[]> => {\r\n dispatch(Actions.GetWeeklyNewsletterInsights({}));\r\n\r\n return dispatch(API.newsletters.GetWeeklyNewsletterInsights(newsletterId))\r\n .then(response => response.json())\r\n .then(insights => {\r\n dispatch(Actions.GetWeeklyNewsletterInsightsComplete({ succeeded: true }));\r\n return insights;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetWeeklyNewsletterInsightsComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\n\r\nexport const getNewsletterDetails = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise<NewsletterDetails | null> => {\r\n dispatch(Actions.GetNewsletterDetails({}));\r\n\r\n return dispatch(API.newsletters.GetNewsletterDetails(id))\r\n .then(response => {\r\n dispatch(Actions.GetNewsletterDetailsComplete({ succeeded: true }));\r\n if(response.status === 404)\r\n return null;\r\n return response.json();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetNewsletterDetailsComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\n\r\nexport const getNewsletterTags = () => (dispatch, getState: () => GlobalApplicationState): Promise<NewsletterTags> => {\r\n dispatch(Actions.GetNewsletterTags({}));\r\n\r\n return dispatch(API.newsletters.GetNewsletterTags())\r\n .then(response => response.json())\r\n .then(page => {\r\n dispatch(Actions.GetNewsletterTagsComplete({ succeeded: true }));\r\n return page;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetNewsletterTagsComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\n\r\nexport const getAllNewsletters = (pageNumber: number, filters: NewsletterFilterValues, pageAmount?: number) => (dispatch, getState: () => GlobalApplicationState): Promise<NewsletterListingPage> => {\r\n dispatch(Actions.GetNewsletters({}));\r\n\r\n return dispatch(API.newsletters.GetNewslettersPaged(pageNumber, filters, pageAmount))\r\n .then(response => response.json())\r\n .then(page => {\r\n dispatch(Actions.GetNewslettersComplete({ succeeded: true }));\r\n return page;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetNewslettersComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getDisabledNewsletters = (pageNumber: number, filters: NewsletterFilterValues, pageAmount?: number) => (dispatch, getState: () => GlobalApplicationState): Promise<NewsletterListingPage> => {\r\n dispatch(Actions.GetDisabledNewsletters({}));\r\n return dispatch(API.newsletters.GetNewslettersPaged(pageNumber, {...filters, status:'Disabled'}, pageAmount))\r\n .then(response => response.json())\r\n .then(page => {\r\n dispatch(Actions.GetDisabledNewslettersComplete({ succeeded: true }));\r\n return page;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetDisabledNewslettersComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getDraftNewsletters = (pageNumber: number, filters: NewsletterFilterValues, pageAmount?: number) => (dispatch, getState: () => GlobalApplicationState): Promise<NewsletterListingPage> => {\r\n dispatch(Actions.GetDraftNewsletters({}));\r\n return dispatch(API.newsletters.GetNewslettersPaged(pageNumber, {...filters, status:'Draft'}, pageAmount))\r\n .then(response => response.json())\r\n .then(page => {\r\n dispatch(Actions.GetDraftNewslettersComplete({ succeeded: true }));\r\n return page;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetDraftNewslettersComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getEnabledNewsletters = (pageNumber: number, filters: NewsletterFilterValues, pageAmount?: number) => (dispatch, getState: () => GlobalApplicationState): Promise<NewsletterListingPage> => {\r\n dispatch(Actions.GetEnabledNewsletters({}));\r\n return dispatch(API.newsletters.GetNewslettersPaged(pageNumber, {...filters, status:'Enabled'}, pageAmount))\r\n .then(response => response.json())\r\n .then(page => {\r\n dispatch(Actions.GetEnabledNewslettersComplete({ succeeded: true }));\r\n return page;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetEnabledNewslettersComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getTemplates = () => (dispatch, getState: () => GlobalApplicationState): Promise<NewsletterTemplate[]> => {\r\n dispatch(Actions.GetTemplates({}));\r\n\r\n return dispatch(API.newsletters.GetTemplates())\r\n .then(response => response.json())\r\n .then(templates => {\r\n dispatch(Actions.GetTemplatesComplete({succeeded: true}));\r\n return templates;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetTemplatesComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getThemes = () => (dispatch, getState: () => GlobalApplicationState): Promise<NewsletterTheme[]> => {\r\n dispatch(Actions.GetThemes({}));\r\n\r\n return dispatch(API.newsletters.GetThemes())\r\n .then(response => response.json())\r\n .then(themes => {\r\n dispatch(Actions.GetThemesComplete({succeeded: true}));\r\n return themes;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetThemesComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const saveTheme = (themeToSave: NewsletterTheme) => (dispatch, getState: () => GlobalApplicationState): Promise<NewsletterTheme> => {\r\n dispatch(Actions.SaveTheme({}));\r\n\r\n return dispatch(API.newsletters.SaveTheme(themeToSave))\r\n .then(response => response.json())\r\n .then(theme => {\r\n dispatch(Actions.SaveThemeComplete({succeeded: true}));\r\n return theme;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SaveThemeComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const saveThemeImages = (themeId: string, headerImage: string, footerImage: string) => (dispatch, getState: () => GlobalApplicationState): Promise<string> => {\r\n dispatch(Actions.SaveThemeImages({}));\r\n\r\n return dispatch(API.newsletters.SaveThemeImages(themeId, headerImage, footerImage))\r\n .then(response => {\r\n dispatch(Actions.SaveThemeImagesComplete({succeeded: true}));\r\n return response;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SaveThemeImagesComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getThemeImage = (imageType: NewsletterImageType, themeId: string) => (dispatch, getState: () => GlobalApplicationState): Promise<File> => {\r\n dispatch(Actions.GetThemeImage({}));\r\n\r\n return dispatch(API.newsletters.GetThemeImage(imageType, themeId))\r\n .then(response => response.blob())\r\n .then(image => {\r\n dispatch(Actions.GetThemeImageComplete({succeeded: true}));\r\n return image;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetThemeImageComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getNewsletterPreview = (templateId: string) => (dispatch, getState: () => GlobalApplicationState): Promise<string> => {\r\n dispatch(Actions.GetNewsletterPreview({}));\r\n\r\n return dispatch(API.newsletters.GetNewsletterPreview(templateId))\r\n .then(image => {\r\n dispatch(Actions.GetNewsletterPreviewComplete({succeeded: true}));\r\n return image.text();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetNewsletterPreviewComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const deleteThemeImage = (imageType: NewsletterImageType, themeId: string) => (dispatch, getState: () => GlobalApplicationState): Promise<string> => {\r\n dispatch(Actions.DeleteThemeImage({}));\r\n\r\n return dispatch(API.newsletters.DeleteThemeImage(imageType, themeId))\r\n .then(response => {\r\n dispatch(Actions.DeleteThemeImageComplete({succeeded: true}));\r\n return response;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DeleteThemeImageComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const setThemeDefault = (themeId: string, isCustom: boolean) => (dispatch, getState: () => GlobalApplicationState): Promise<NewsletterTheme> => {\r\n dispatch(Actions.SetThemeDefault({}));\r\n\r\n return dispatch(API.newsletters.SetThemeDefault(themeId, isCustom))\r\n .then(response => response.json())\r\n .then(theme => {\r\n dispatch(Actions.SetThemeDefaultComplete({succeeded: true}));\r\n return theme;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SetThemeDefaultComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const deleteTheme = (id: string, isCustom: boolean) => (dispatch, getState: () => GlobalApplicationState): Promise<NewsletterTheme[]> => {\r\n dispatch(Actions.DeleteTheme({}));\r\n\r\n return dispatch(API.newsletters.DeleteTheme(id, isCustom))\r\n .then(response => response.json())\r\n .then(themes => {\r\n dispatch(Actions.DeleteThemeComplete({ succeeded: true }));\r\n return themes;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DeleteThemeComplete({ succeeded: false, err }));\r\n return [];\r\n });\r\n}\r\n\r\nexport const getTemplateHtml = (templateId: string) => (dispatch, getState: () => GlobalApplicationState): Promise<string> => {\r\n dispatch(Actions.GetTemplateHtml({}));\r\n\r\n return dispatch(API.newsletters.GetTemplateHtml(templateId))\r\n .then(response => {\r\n dispatch(Actions.GetTemplateHtmlComplete({succeeded: true}));\r\n return response.text();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetTemplateHtmlComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getTemplateImage = (templateId: string, imageType: NewsletterTemplateImageType) => (dispatch, getState: () => GlobalApplicationState): Promise<string> => {\r\n dispatch(Actions.GetTemplateImage({}));\r\n\r\n return dispatch(API.newsletters.GetTemplateImage(templateId, imageType))\r\n .then(response => {\r\n dispatch(Actions.GetTemplateImageComplete({ succeeded: response.status === 200 }));\r\n return response.text();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetTemplateImageComplete({ succeeded: false, err }));\r\n return \"\";\r\n });\r\n}\r\n\r\nexport const getPastIssues = (id: string, pageNumber: number) => (dispatch, getState: () => GlobalApplicationState): Promise<NewsletterPastIssuesPage> => {\r\n dispatch(Actions.GetPastIssues({}));\r\n\r\n return dispatch(API.newsletters.GetPastIssues(id, pageNumber))\r\n .then(response => response.json())\r\n .then(page => {\r\n dispatch(Actions.GetPastIssuesComplete({ succeeded: true }));\r\n return page;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetPastIssuesComplete({ succeeded: false, err }));\r\n return { currentPage: 1, results: [], totalItems: 0, totalPages: 0 };\r\n });\r\n}\r\n\r\nexport const getPastIssue = (newsletterId: string, issueDate: string) => (dispatch, getState: () => GlobalApplicationState): Promise<NewsletterPastIssueDigestModel | null> => {\r\n dispatch(Actions.GetPastIssue({}));\r\n\r\n return dispatch(API.newsletters.GetPastIssue(newsletterId, issueDate))\r\n .then(response => {\r\n dispatch(Actions.GetPastIssueComplete({ succeeded: true}));\r\n if(response.status === 404)\r\n return null;\r\n return response.json();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetPastIssueComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getPost = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise<PostView> => {\r\n dispatch(Actions.GetPost({}));\r\n\r\n return dispatch(API.clientPosts.GetPost(id))\r\n .then(response => {\r\n dispatch(Actions.GetPostComplete({ succeeded: response.status === 200 }));\r\n return response.json();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetPostComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const deleteNewsletter = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise<boolean> => {\r\n dispatch(Actions.DeleteNewsletter({}));\r\n\r\n return dispatch(API.newsletters.UpdateNewsletterStatus(id, 'Deleted'))\r\n .then(response => {\r\n dispatch(Actions.DeleteNewsletterComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DeleteNewsletterComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const deleteNewsletters = (ids: string[]) => (dispatch, getState: () => GlobalApplicationState): Promise<any> => {\r\n dispatch(Actions.DeleteNewsletter({}));\r\n\r\n return Promise.all(ids.map(id => dispatch(API.newsletters.UpdateNewsletterStatus(id, 'Deleted'))\r\n .then(response => {\r\n dispatch(Actions.DeleteNewsletterComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DeleteNewsletterComplete({ succeeded: false, err }));\r\n return false;\r\n })));\r\n}\r\n\r\n\r\nexport const disableNewsletter = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise<boolean> => {\r\n dispatch(Actions.DisableNewsletter({}));\r\n\r\n return dispatch(API.newsletters.UpdateNewsletterStatus(id, 'Disabled'))\r\n .then(response => {\r\n dispatch(Actions.DisableNewsletterComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DisableNewsletterComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const disableNewsletters = (ids: string[]) => (dispatch, getState: () => GlobalApplicationState): Promise<any> => {\r\n dispatch(Actions.DisableNewsletter({}));\r\n\r\n return Promise.all(ids.map(id => dispatch(API.newsletters.UpdateNewsletterStatus(id, 'Disabled'))\r\n .then(response => {\r\n dispatch(Actions.DisableNewsletterComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DisableNewsletterComplete({ succeeded: false, err }));\r\n return false;\r\n })));\r\n}\r\n\r\nexport const enableNewsletter = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise<boolean> => {\r\n dispatch(Actions.EnableNewsletter({}));\r\n\r\n return dispatch(API.newsletters.UpdateNewsletterStatus(id, 'Enabled'))\r\n .then(response => {\r\n dispatch(Actions.EnableNewsletterComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.EnableNewsletterComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const enableNewsletters = (ids: string[]) => (dispatch, getState: () => GlobalApplicationState): Promise<any> => {\r\n dispatch(Actions.EnableNewsletter({}));\r\n\r\n return Promise.all(ids.map(id => dispatch(API.newsletters.UpdateNewsletterStatus(id, 'Enabled'))\r\n .then(response => {\r\n dispatch(Actions.EnableNewsletterComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.EnableNewsletterComplete({ succeeded: false, err }));\r\n return false;\r\n })));\r\n}\r\n\r\nexport interface SaveNewsletterResponse{\r\n success?: NewsletterDigest;\r\n error?: {\r\n ModelState: SaveNewsletterModelStateErrors;\r\n };\r\n}\r\n\r\nexport const saveNewsletter = (newsletter: SaveNewsletterModel) => (dispatch, getState: () => GlobalApplicationState): Promise<SaveNewsletterResponse> => {\r\n dispatch(Actions.SaveNewsletter({}));\r\n return dispatch(API.newsletters.SaveNewsletter(newsletter))\r\n .then(response => {\r\n dispatch(Actions.SaveNewsletterComplete({ succeeded: response.status === 200 }));\r\n if(response.status === 400)\r\n return response.json().then(r=>{return {error:r} as SaveNewsletterResponse;});\r\n return response.json().then(r=>{return {success:r} as SaveNewsletterResponse});\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SaveNewsletterComplete({ succeeded: false, err }));\r\n return err;\r\n });\r\n}\r\n\r\nexport const cloneNewsletter = (newsletterId: string, title: string) => (dispatch, getState: () => GlobalApplicationState): Promise<SaveNewsletterResponse> => {\r\n dispatch(Actions.CloneNewsletter({}));\r\n return dispatch(API.newsletters.CloneNewsletter(newsletterId, title))\r\n .then(response => {\r\n dispatch(Actions.CloneNewsletterComplete({ succeeded: response.status === 200 }));\r\n if(response.status === 400)\r\n return response.json().then(r=>{return {error:r} as SaveNewsletterResponse;});\r\n return response.json().then(r=>{return {success:r} as SaveNewsletterResponse});\r\n })\r\n .catch(err => {\r\n dispatch(Actions.CloneNewsletterComplete({ succeeded: false, err }));\r\n return err;\r\n });\r\n}\r\n\r\nexport const getNewsletterImage = (newsletterId: string, imageType: NewsletterImageType) => (dispatch, getState: () => GlobalApplicationState): Promise<File> => {\r\n dispatch(Actions.GetNewsletterImage({}));\r\n\r\n return dispatch(API.newsletters.GetNewsletterImage(newsletterId, imageType))\r\n .then(response => response.blob())\r\n .then(image => {\r\n dispatch(Actions.GetNewsletterImageComplete({ succeeded: true }));\r\n return image;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetNewsletterImageComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const uploadNewsletterImage = (id: string, imageType: NewsletterImageType, image: File) => (dispatch, getState: () => GlobalApplicationState): Promise<NewsletterDigest> => {\r\n dispatch(Actions.UploadNewsletterImage({}));\r\n\r\n return MsalAuthModule.getInstance().getAccessToken().then(accessToken => {\r\n const requestDetails = API.newsletters.UploadNewsletterImage(id, imageType, image);\r\n const url = getState().config.SparrowClientApiUrl + requestDetails.url\r\n .replace(\"{tenant}\", getState().tenant.id);\r\n return new XhrUpload(url, requestDetails)\r\n .authenticateWith(accessToken)\r\n .upload();\r\n})\r\n.then((response) => {\r\n const responseString = (response as string);\r\n const newsletter = JSON.parse(responseString);\r\n if(newsletter.id) {\r\n dispatch(Actions.UploadNewsletterImageComplete({ succeeded: true}));\r\n }else{\r\n const errResponse = JSON.parse(responseString)\r\n dispatch(Actions.UploadNewsletterImageComplete({ succeeded: false, err: errResponse?.Message ?? 'Unable to upload image.'}));\r\n }\r\n return newsletter;\r\n})\r\n}\r\n\r\nexport const uploadNewsletterHeaderFooterImage = (payload: UploadNewsletterImageModel) => (dispatch, getState: () => GlobalApplicationState): Promise<NewsletterDigest> => {\r\n dispatch(Actions.UploadNewsletterHeaderFooterImage({}));\r\n\r\n return MsalAuthModule.getInstance().getAccessToken().then(accessToken => {\r\n const requestDetails = API.newsletters.UploadNewsletterHeaderFooterImage(payload);\r\n const url = getState().config.SparrowClientApiUrl + requestDetails.url\r\n .replace(\"{tenant}\", getState().tenant.id);\r\n \r\n return new XhrUpload(url, requestDetails)\r\n .authenticateWith(accessToken)\r\n .upload();\r\n})\r\n.then((response) => {\r\n const responseString = (response as string);\r\n const newsletter = JSON.parse(responseString);\r\n if(newsletter.id) {\r\n dispatch(Actions.UploadNewsletterHeaderFooterImageComplete({ succeeded: true}));\r\n }else{\r\n const errResponse = JSON.parse(responseString)\r\n dispatch(Actions.UploadNewsletterHeaderFooterImageComplete({ succeeded: false, err: errResponse?.Message ?? 'Unable to upload image.'}));\r\n }\r\n return newsletter;\r\n});\r\n}\r\n\r\nexport const deleteNewsletterImage = (newsletterId: string, imageType: NewsletterImageType) => (dispatch, getState: () => GlobalApplicationState): Promise<boolean> => {\r\n dispatch(Actions.DeleteNewsletterImage({}));\r\n\r\n return dispatch(API.newsletters.DeleteNewsletterImage(newsletterId, imageType))\r\n .then(response => {\r\n dispatch(Actions.DeleteNewsletterImageComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DeleteNewsletterImageComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const resetIssue = (newsletterId: string, localDateAsString: string) => (dispatch, getState: () => GlobalApplicationState): Promise<boolean> => {\r\n dispatch(Actions.ResetIssue({}));\r\n\r\n return dispatch(API.newsletters.ResetFutureIssue(newsletterId, localDateAsString))\r\n .then(response => {\r\n dispatch(Actions.ResetIssueComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.ResetIssueComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const resetIssues = (newsletterId: string, localDateAsStrings: string[]) => (dispatch, getState: () => GlobalApplicationState): Promise<boolean> => {\r\n dispatch(Actions.ResetIssues({}));\r\n return Promise.all(localDateAsStrings.map(localDateAsString => dispatch(API.newsletters.ResetFutureIssue(newsletterId, localDateAsString))))\r\n .then(() => {\r\n dispatch(Actions.ResetIssuesComplete({ succeeded: true }));\r\n return true;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.ResetIssuesComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport interface SaveNewsletterConfigResponse{\r\n success?: NewsletterConfigDigest;\r\n error?: {\r\n ModelState: SaveNewsletterConfigModelStateErrors;\r\n };\r\n}\r\n\r\nexport const saveConfig = (config: NewsletterConfig) => (dispatch, getState: () => GlobalApplicationState): Promise<SaveNewsletterConfigResponse> => {\r\n dispatch(Actions.SaveConfig({}));\r\n\r\n return dispatch(API.newsletters.SaveConfig(config))\r\n .then(response => {\r\n dispatch(Actions.SaveConfigComplete({ succeeded: true }));\r\n if(response.status === 400)\r\n return response.json().then(r=>{return {error:r} as SaveNewsletterConfigResponse;});\r\n return response.json().then(r=>{return {success:r} as SaveNewsletterConfigResponse;});\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SaveConfigComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport interface SaveNewsletterIssueResponse{\r\n success?: NewsletterFutureIssueDetailModel;\r\n error?: {\r\n ModelState: SaveNewsletterIssueModelStateErrors;\r\n };\r\n}\r\n\r\nexport const saveIssue = (issue: NewsletterIssueInput) => (dispatch, getState: () => GlobalApplicationState): Promise<SaveNewsletterIssueResponse> => {\r\n dispatch(Actions.SaveIssue({}));\r\n\r\n return dispatch(API.newsletters.SaveFutureIssue(issue))\r\n .then(response => {\r\n dispatch(Actions.SaveIssueComplete({ succeeded: response.status === 200 }));\r\n if(response.status === 400)\r\n return response.json().then(r=>{return {error:r} as SaveNewsletterIssueResponse;});\r\n return response.json().then(r=>{return {success:r} as SaveNewsletterIssueResponse});\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SaveIssueComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const searchEvents = (searchText: string, pageNumber: number) => (dispatch, getState: () => GlobalApplicationState): Promise<EventFeedItem[]> => {\r\n dispatch(Actions.SearchEvents({}));\r\n\r\n return dispatch(API.events.GetEventFeed({ textToSearch: searchText }, false, pageNumber))\r\n .then(response => response.json())\r\n .then(feed => {\r\n dispatch(Actions.SearchEventsComplete({ succeeded: true }));\r\n return feed;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SearchEventsComplete({ succeeded: false, err }));\r\n return [];\r\n });\r\n}\r\n\r\nexport const searchPosts = (\r\n searchText: string, \r\n pageNumber: number, \r\n ignoreSubscriptions: boolean = false\r\n) => (\r\n dispatch, \r\n getState: () => GlobalApplicationState\r\n): Promise<PostFeedItem[]> => {\r\n dispatch(Actions.SearchPosts({}));\r\n\r\n return dispatch(API.clientPosts.FetchPostsFeed(\r\n { \r\n textToSearch: searchText, \r\n ignoreSubscriptions \r\n }, \r\n pageNumber\r\n ))\r\n .then(response => response.json())\r\n .then(feed => {\r\n dispatch(Actions.SearchPostsComplete({ succeeded: true }));\r\n return feed;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SearchPostsComplete({ succeeded: false, err }));\r\n return [];\r\n })\r\n}\r\n\r\nexport interface SendTestEmailResponse{\r\n success?: boolean;\r\n error?: {\r\n ModelState: SaveNewsletterModelStateErrors;\r\n };\r\n}\r\n\r\nexport const sendTestEmail = (newsletterId: string, issueDate: string, additionalAddresses: string[]) => (dispatch, getState: () => GlobalApplicationState): Promise<SendTestEmailResponse> => {\r\n dispatch(Actions.SendTestEmail({}));\r\n\r\n return dispatch(API.newsletters.SendTestEmail(newsletterId, issueDate, additionalAddresses))\r\n .then(response => {\r\n dispatch(Actions.SendTestEmailComplete({ succeeded: response.status === 200 }));\r\n if(response.status === 400)\r\n return response.json().then(r=>{return {error:r} as SendTestEmailResponse;});\r\n return {success:response.status === 200} as SendTestEmailResponse;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SendTestEmailComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const getFutureIssueDetails = (newsletterId: string, issueDateLocal: string) => (dispatch, getState: () => GlobalApplicationState): Promise<NewsletterFutureIssueDetailModel> => {\r\n dispatch(Actions.GetFutureIssueDetails({}));\r\n\r\n return dispatch(API.newsletters.GetFutureIssueDetails(newsletterId, issueDateLocal))\r\n .then(response => response.json())\r\n .then(details => {\r\n dispatch(Actions.GetFutureIssueDetailsComplete({ succeeded: true }));\r\n return details;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetFutureIssueDetailsComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const getIssueImage = (newsletterId: string, issueDateLocal: string, imageType: NewsletterImageType) => (dispatch, getState: () => GlobalApplicationState): Promise<File> => {\r\n dispatch(Actions.GetIssueImage({}));\r\n\r\n return dispatch(API.newsletters.GetIssueImage(newsletterId, issueDateLocal, imageType))\r\n .then(response => response.blob())\r\n .then(image => {\r\n dispatch(Actions.GetIssueImageComplete({ succeeded: true }));\r\n return image;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.GetIssueImageComplete({ succeeded: false, err }));\r\n return;\r\n });\r\n}\r\n\r\nexport const uploadIssueImage = (newsletterId: string, issueDate: string, imageType: NewsletterImageType, image: File) => (dispatch, getState: () => GlobalApplicationState): Promise<boolean> => {\r\n dispatch(Actions.UploadIssueImage({}));\r\n\r\n return MsalAuthModule.getInstance().getAccessToken().then(accessToken => {\r\n const requestDetails = API.newsletters.UploadIssueImage(newsletterId, issueDate, imageType, image);\r\n const url = getState().config.SparrowClientApiUrl + requestDetails.url\r\n .replace(\"{tenant}\", getState().tenant.id);\r\n return new XhrUpload(url, requestDetails)\r\n .authenticateWith(accessToken)\r\n .upload();\r\n })\r\n .then(() => {\r\n dispatch(Actions.UploadIssueImageComplete({ succeeded: true }));\r\n return true;\r\n })\r\n .catch((err) => {\r\n dispatch(Actions.UploadIssueImageComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const uploadIssueHeaderFooterImage = (payload: UploadIssueImageModel) => (dispatch, getState: () => GlobalApplicationState): Promise<boolean> => {\r\n dispatch(Actions.UploadHeaderFooterIssueImage({}));\r\n\r\n return MsalAuthModule.getInstance().getAccessToken().then(accessToken => {\r\n const requestDetails = API.newsletters.UploadIssueHeaderFooterImage(payload);\r\n const url = getState().config.SparrowClientApiUrl + requestDetails.url\r\n .replace(\"{tenant}\", getState().tenant.id);\r\n\r\n return new XhrUpload(url, requestDetails)\r\n .authenticateWith(accessToken)\r\n .upload();\r\n })\r\n .then(() => {\r\n dispatch(Actions.UploadHeaderFooterIssueImageComplete({ succeeded: true }));\r\n return true;\r\n })\r\n .catch((err) => {\r\n dispatch(Actions.UploadHeaderFooterIssueImageComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const deleteIssueImage = (newsletterId: string, issueDate: string, imageType: NewsletterImageType) => (dispatch, getState: () => GlobalApplicationState): Promise<boolean> => {\r\n dispatch(Actions.DeleteIssueImage({}));\r\n\r\n return dispatch(API.newsletters.DeleteIssueImage(newsletterId, issueDate, imageType))\r\n .then(response => {\r\n dispatch(Actions.DeleteIssueImageComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.DeleteIssueImageComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const skipIssue = (newsletterId: string, issueDateLocal: string) => (dispatch, getState: () => GlobalApplicationState): Promise<boolean> => {\r\n dispatch(Actions.SkipIssue({}));\r\n\r\n return dispatch(API.newsletters.UpdateFutureIssueStatus(newsletterId, issueDateLocal, 'Skip'))\r\n .then(response => {\r\n dispatch(Actions.SkipIssueComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SkipIssueComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\nexport const unskipIssue = (newsletterId: string, issueDateLocal: string) => (dispatch, getState: () => GlobalApplicationState): Promise<boolean> => {\r\n dispatch(Actions.UnskipIssue({}));\r\n\r\n return dispatch(API.newsletters.UpdateFutureIssueStatus(newsletterId, issueDateLocal, 'Future'))\r\n .then(response => {\r\n dispatch(Actions.UnskipIssueComplete({ succeeded: response.status === 200 }));\r\n return response.status === 200;\r\n })\r\n .catch(err => {\r\n dispatch(Actions.UnskipIssueComplete({ succeeded: false, err }));\r\n return false;\r\n });\r\n}\r\n\r\n//Calls the API to fetch all newsletters associated with a specific alias via sender details.\r\nexport const getAssociatedNewsletters = (senderName: string, senderEmail: string) => (dispatch, getState: () => GlobalApplicationState): Promise<IdNamePair<string, string>[]> => {\r\n return dispatch(API.newsletters.GetNewslettersUsingAlias(senderName, senderEmail))\r\n .then(response => response.json())\r\n .then(response => response.map((n: Newsletter) => ({ id: n.id, name: n.title })))\r\n .catch(err => {\r\n return [];\r\n })\r\n}\r\n\r\nexport const translateNewsletter = (toTranslate: TranslatableNewsletterContent, targetLcid: string, inputLcid: string, newsletterId: string) => (dispatch, getState: () => GlobalApplicationState): Promise<TranslatableNewsletterContent> => {\r\n return dispatch(API.newsletters.GetNewsletterTranslation(toTranslate, targetLcid, inputLcid, newsletterId))\r\n .then(response => response.json())\r\n .then(response => {\r\n return response;\r\n })\r\n .catch(err => {\r\n return [];\r\n })\r\n}","import { TranslatedNewsletterContent } from \"modules/common/components/authoring/models\";\r\nimport { SortStyle } from \"utils/managementUtils\";\r\n\r\nexport type EmailActivityEvent = \"Bounced\" | \"Clicked\" | \"Deferred\" | \"Delivered\" | \"Dropped\" | \"Opened\" | \"Processed\" | \"SpamReported\" | \"Unsubscribed\";\r\nexport const emailActivityEvents: EmailActivityEvent[] = [\"Bounced\", \"Clicked\", \"Deferred\", \"Delivered\", \"Dropped\", \"Opened\", \"Processed\", \"SpamReported\", \"Unsubscribed\"]\r\nexport const toEmailActivityEventName = (event: EmailActivityEvent): string => (event === 'SpamReported') ? \"Spam reported\" : event;\r\nexport type ConfigChannel = \"AdminPortal\" | \"SharePoint\" | \"Teams\";\r\nexport type NewsletterStatus = \"Disabled\" | \"Draft\" | \"Enabled\";\r\nexport type NewsletterIssueStatus = \"Future\" | \"Sent\" | \"Skip\" | \"Skipped\";\r\nexport type NewsletterIssueType = \"Scheduled\" | \"Adhoc\";\r\nexport type NewsletterRecurrence = \"Adhoc\" | \"Daily\" | \"Biweekly\" | \"Monthly\";\r\nexport type DayOfWeek = \"Sunday\" | \"Monday\" | \"Tuesday\" | \"Wednesday\" | \"Thursday\"| \"Friday\" | \"Saturday\";\r\nexport const daysOfWeek : DayOfWeek[] = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\" , \"Friday\", \"Saturday\"];\r\nexport type NewsletterMonthlyRecurrenceWeek = \"First\" | \"Second\" | \"Third\" | \"Last\"\r\nexport const recurrenceWeeks : NewsletterMonthlyRecurrenceWeek[] = [\"First\", \"Second\", \"Third\", \"Last\"]\r\nexport type NewsletterTopicOption = \"Employee\" | \"All\" | \"Custom\"\r\nexport type NewsletterDynamicContentWindow = \"SinceLastIssue\" | \"DaysBeforeCurrentIssue\"\r\nexport type NewsletterImageType = \"Header\" | \"Footer\";\r\nexport type NewsletterTemplateImageType = NewsletterImageType | \"Preview\";\r\n\r\nexport const HEADER: NewsletterImageType = \"Header\";\r\nexport const FOOTER: NewsletterImageType = \"Footer\";\r\n\r\nexport interface NewsletterConfig {\r\n fromEmailAddress: string;\r\n fromEmailName: string;\r\n linkPreference: ConfigChannel;\r\n addresses: Address[];\r\n}\r\n\r\nexport interface SaveNewsletterConfigModelStateErrors {\r\n FromEmailAddress?: string[];\r\n FromEmailName?: string[];\r\n LinkPreference?: string[];\r\n}\r\n\r\nexport interface NewsletterConfigDigest extends NewsletterConfig {\r\n availableLinkPreferences: ConfigChannel[];\r\n}\r\n\r\nexport interface NewsletterFilterValues {\r\n textToSearch?: string;\r\n status?: NewsletterStatus;\r\n sortType?: SortStyle;\r\n tags?: string[];\r\n lastSentFrom?: string;\r\n lastSentTo?: string;\r\n nextQueuedFrom?: string;\r\n nextQueuedTo?: string;\r\n modifiedFrom?: string;\r\n modifiedTo?: string;\r\n}\r\n\r\nexport interface NewsletterListingPage {\r\n currentPage: number;\r\n results: NewsletterDigest[];\r\n totalItems: number;\r\n totalPages: number;\r\n}\r\n\r\nexport interface SimpleTag {\r\n id: string;\r\n name: string;\r\n}\r\n\r\nexport interface NewsletterTags {\r\n draft: SimpleTag[];\r\n enabled: SimpleTag[];\r\n disabled: SimpleTag[];\r\n count: number;\r\n}\r\n\r\nexport interface Address {\r\n fromEmailAddress: string;\r\n fromEmailName: string;\r\n currentlyInUse: boolean;\r\n}\r\n\r\nexport interface Newsletter {\r\n id: string;\r\n tenantId: string;\r\n status: NewsletterStatus;\r\n editedTime: string;\r\n title: string;\r\n description: string;\r\n recurrenceType: NewsletterRecurrence;\r\n dailyRecurrenceOn: DayOfWeek[];\r\n monthlyRecurrenceWeek: NewsletterMonthlyRecurrenceWeek | null;\r\n monthlyRecurrenceDay: DayOfWeek | null;\r\n firstIssueDateTime: string;\r\n emailSubject: string;\r\n emailPreheader: string;\r\n emailTemplateIsCustom: boolean;\r\n emailTemplateId: string;\r\n emailTemplateFooterImageIsCustomized: boolean;\r\n emailTemplateFooterText: string;\r\n emailTemplateHeaderImageIsCustomized: boolean;\r\n emailTemplateHeaderText: string;\r\n bodyText: string;\r\n audiences: SimpleTag[];\r\n allowUnsubscribe: boolean;\r\n topicOption: NewsletterTopicOption;\r\n customTopics: SimpleTag[];\r\n maxEventsToInclude: number;\r\n includeUpcomingEvents: boolean;\r\n eventsToInclude: NewsletterDynamicContentWindow;\r\n eventsToIncludeDaysWindow: number;\r\n maxPostsToInclude: number;\r\n postsToInclude: NewsletterDynamicContentWindow;\r\n postsToIncludeDaysWindow: number;\r\n fromEmailName: string\r\n fromEmailAddress: string\r\n sortPostsAscending: boolean;\r\n numberSubscribed: number;\r\n numberUnsubscribed: number;\r\n translatedContent: TranslatedNewsletterContent;\r\n}\r\n\r\nexport interface NewsletterDigest extends Newsletter {\r\n lastIssueSentOn: string | null;\r\n lastSentIssueDateLocal: string | null;\r\n nextIssueSendOn: string | null;\r\n}\r\n\r\nexport interface NewsletterDetails extends NewsletterDigest {\r\n futureIssues: NewsletterFutureIssueDigestModel[];\r\n emailTemplate?: NewsletterTemplate;\r\n sentIssueTags: SimpleTag[];\r\n \r\n /* colors (subject to change) */\r\n emailBackground: string;\r\n primaryBackground: string;\r\n primaryText: string;\r\n secondaryBackground: string;\r\n secondaryText: string;\r\n linkTexts: string;\r\n\r\n newsletterTheme: NewsletterThemeSimple;\r\n}\r\n\r\nexport interface SaveNewsletterModelStateErrors {\r\n Title?: string[];\r\n Status?: string[];\r\n\r\n EmailTemplateId?: string[];\r\n EmailSubject?: string[];\r\n EmailPreheader?: string[];\r\n EmailTemplateHeaderText?: string[];\r\n\r\n FirstIssueDateTime?: string[];\r\n DailyRecurrenceOn?: string[];\r\n MonthlyRecurrenceDay?: string[];\r\n MonthlyRecurrenceWeek?: string[];\r\n\r\n CustomTopics?: string[];\r\n MaxEventsToInclude?: string[];\r\n EventsToIncludeDaysWindow?: string[];\r\n MaxPostsToInclude?: string[];\r\n PostsToIncludeDaysWindow?: string[];\r\n}\r\n\r\nexport interface SaveNewsletterModel {\r\n /* do not modify - pass back what was fetched */\r\n id?: string;\r\n tenantId?: string;\r\n\r\n /* updateable properties */\r\n status: NewsletterStatus;\r\n title: string;\r\n description: string;\r\n recurrenceType: NewsletterRecurrence;\r\n dailyRecurrenceOn: DayOfWeek[];\r\n monthlyRecurrenceWeek: NewsletterMonthlyRecurrenceWeek | null;\r\n monthlyRecurrenceDay: DayOfWeek | null;\r\n firstIssueDateTime?: string;\r\n emailSubject: string;\r\n emailPreheader: string;\r\n emailTemplateId: string;\r\n emailTemplateFooterText: string;\r\n emailTemplateHeaderText: string;\r\n bodyText: string;\r\n audiences?: SimpleTag[];\r\n allowUnsubscribe: boolean;\r\n topicOption: NewsletterTopicOption;\r\n customTopics: SimpleTag[];\r\n includeUpcomingEvents: boolean\r\n maxEventsToInclude: number;\r\n eventsToInclude: NewsletterDynamicContentWindow;\r\n eventsToIncludeDaysWindow: number;\r\n maxPostsToInclude: number;\r\n postsToInclude: NewsletterDynamicContentWindow;\r\n postsToIncludeDaysWindow: number;\r\n sortPostsAscending: boolean;\r\n fromEmailName: string\r\n fromEmailAddress: string\r\n newsletterTheme: NewsletterThemeSimple;\r\n translatedContent: TranslatedNewsletterContent;\r\n}\r\n\r\nexport interface NewsletterThemeSimple {\r\n themeId: string;\r\n emailBackground: string;\r\n primaryBackground: string;\r\n primaryText: string;\r\n secondaryBackground: string;\r\n secondaryText: string;\r\n linkText: string;\r\n}\r\n\r\nexport interface NewsletterTemplate {\r\n id: string;\r\n name: string;\r\n isCustom: boolean;\r\n hasPreviewImage: boolean;\r\n headerImageHeight: number;\r\n headerImageWidth: number;\r\n footerImageHeight: number;\r\n footerImageWidth: number;\r\n thumbnailImageBase64: string;\r\n}\r\n\r\nexport interface NewsletterTheme {\r\n id: string;\r\n name: string;\r\n isDefault: boolean;\r\n isCustom: boolean;\r\n emailBackground: string;\r\n primaryBackground: string;\r\n primaryText: string;\r\n secondaryBackground: string;\r\n secondaryText: string;\r\n linkText: string;\r\n createdBy: string;\r\n createdByDisplayName: string;\r\n createdOnUTC: Date;\r\n lastModifiedBy: string;\r\n lastModifiedByDisplayName: string;\r\n lastModifiedOnUTC: Date;\r\n headerImage: string;\r\n footerImage: string;\r\n themeHeaderImageIsCustomized: boolean;\r\n themeFooterImageIsCustomized: boolean;\r\n}\r\n \r\nexport interface UploadNewsletterImageModel {\r\n headerImage?: string;\r\n footerImage?: string;\r\n newsletterId: string;\r\n}\r\n\r\nexport interface UploadIssueImageModel extends UploadNewsletterImageModel {\r\n issueDate: string;\r\n}\r\n\r\n//=================================================//\r\n\r\nexport interface Activity {\r\n activity: EmailActivityEvent;\r\n eventTime: string;\r\n userEmail: string;\r\n userFullName: string;\r\n newsletterTitle: string;\r\n issueDate: string;\r\n}\r\n\r\nexport interface ActivityLogFilterValues {\r\n eventNames: EmailActivityEvent[];\r\n newsletterIds: string[];\r\n issueIds: string[];\r\n eventDateFrom: string | null;\r\n eventDateTo:string | null;\r\n}\r\n\r\nexport interface ActivityLogPage {\r\n currentPage: number;\r\n results: Activity[];\r\n totalItems: number;\r\n totalPages: number;\r\n}\r\n\r\nexport interface FeaturedContent {\r\n contentType: \"Event\" | \"Post\";\r\n id: string;\r\n name: string;\r\n}\r\n\r\nexport interface NewsletterIssue extends NewsletterIssueInput {\r\n issueType: NewsletterIssueType;\r\n editedTime?: string;\r\n emailTemplateFooterImageIsCustomized: boolean;\r\n emailTemplateHeaderImageIsCustomized: boolean;\r\n}\r\n\r\nexport interface SaveNewsletterIssueModelStateErrors {\r\n OverriddenIssueDateTime?: string[];\r\n EmailSubject?: string[];\r\n EmailPreheader?: string[];\r\n}\r\n\r\nexport interface NewsletterIssueInput {\r\n /* do not modify - pass back what was fetched */\r\n id?: string;\r\n issueDateLocal: string;\r\n newsletterId: string;\r\n tenantId?: string;\r\n\r\n /* updateable properties */\r\n emailPreheader: string;\r\n emailSubject: string;\r\n emailTemplateHeaderText: string;\r\n bodyText: string;\r\n emailTemplateFooterText: string;\r\n featuredContent: FeaturedContent[];\r\n overriddenIssueDateTime: string;\r\n status: NewsletterIssueStatus;\r\n translatedContent: TranslatedNewsletterContent;\r\n}\r\n\r\nexport interface NewsletterFutureIssueDigestModel extends NewsletterIssue {\r\n isCustomized: boolean;\r\n sendDateTime: string;\r\n}\r\n\r\nexport interface NewsletterFutureIssueDetailModel extends NewsletterFutureIssueDigestModel {\r\n earliestOverrideDateTime?: string;\r\n latestOverrideDateTime?: string;\r\n}\r\n\r\nexport interface NewsletterPastIssueDigestModel extends NewsletterIssue {\r\n issueProcessedOnDateTime?: string;\r\n stats: EmailEventStats;\r\n sentReceipt: NewsletterIssueSentReceipt | null;\r\n}\r\n\r\nexport interface NewsletterIssueSentReceipt {\r\n sentAtUtc: string;\r\n countOfCopiesSent: number;\r\n countOfInvalidEmailAddresses: number;\r\n countOfUnsubscribers: number;\r\n countOfSkippedWithNoContent: number;\r\n}\r\nexport interface NewsletterPastIssuesPage {\r\n currentPage: number;\r\n results: NewsletterPastIssueDigestModel[];\r\n totalItems: number;\r\n totalPages: number;\r\n}\r\n\r\nexport interface NewsletterSummary {\r\n id: string;\r\n name: string;\r\n scheduleDisplay: string;\r\n lastIssue: Date;\r\n nextIssue: Date;\r\n}\r\n\r\nexport interface EmailEventStats {\r\n Bounced: number;\r\n Clicked: number;\r\n Deferred: number;\r\n Delivered: number;\r\n Dropped: number;\r\n Opened: number;\r\n Processed: number;\r\n SpamReported: number;\r\n UniqueBounced: number;\r\n UniqueClicked: number;\r\n UniqueDeferred: number;\r\n UniqueDelivered: number;\r\n UniqueDropped: number;\r\n UniqueOpened: number;\r\n UniqueProcessed: number;\r\n UniqueSpamReported: number;\r\n UniqueUnsubscribed: number;\r\n Unsubscribed: number;\r\n}\r\n\r\nexport const getEmptyEmailEventStats = () => { \r\n return {\r\n Bounced: 0,\r\n Clicked: 0,\r\n Deferred: 0,\r\n Delivered: 0,\r\n Dropped: 0,\r\n Opened: 0,\r\n Processed: 0,\r\n Unsubscribed: 0,\r\n SpamReported: 0,\r\n UniqueBounced: 0,\r\n UniqueClicked: 0,\r\n UniqueDeferred: 0,\r\n UniqueDelivered: 0,\r\n UniqueDropped: 0,\r\n UniqueOpened: 0,\r\n UniqueProcessed: 0,\r\n UniqueSpamReported: 0,\r\n UniqueUnsubscribed: 0} as EmailEventStats\r\n };\r\n\r\nexport interface DailyEmailEventStats extends EmailEventStats {\r\n Day: string;\r\n}\r\n\r\nexport interface WeeklyEmailEventStats extends EmailEventStats {\r\n WeekStarting: string;\r\n}","import * as React from \"react\";\r\n\r\nimport AuthoringSearch from \"modules/common/components/filters/authoringSearch\";\r\nimport FilterContainer from \"modules/common/components/filters/filterContainer\";\r\nimport FilterDropdown from \"modules/common/components/filters/filterDropdown\";\r\n\r\nimport { EmailActivityEvent, ActivityLogFilterValues, emailActivityEvents, toEmailActivityEventName, SimpleTag } from \"../../models\";\r\n\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Chip from \"@mui/material/Chip\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport moment from \"moment\";\r\nimport _ from \"lodash\";\r\n\r\nimport { DatePicker } from \"@mui/x-date-pickers/DatePicker\";\r\nimport { PickerLocalization } from \"modules/common/components/pickerLocalization\";\r\n\r\nclass EmailActivityLogFilters extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n canSearch: false\r\n };\r\n }\r\n\r\n public render() {\r\n const { filters } = this.props;\r\n\r\n return (\r\n <FilterContainer\r\n filters={\r\n <React.Fragment>\r\n <FilterDropdown text=\"Activity\">\r\n <List disablePadding>\r\n {emailActivityEvents.map((emailActivityEvent) =>\r\n <ListItem key={emailActivityEvent} dense button onClick={() => this.onToggleEventName(emailActivityEvent)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={_.some(filters.eventNames,(name) => name === emailActivityEvent)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={toEmailActivityEventName(emailActivityEvent)} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </FilterDropdown>\r\n {!!this.props.newsletterTags && <FilterDropdown text=\"Newsletters\">\r\n <List disablePadding>\r\n {this.props.newsletterTags.map((tag) =>\r\n <ListItem key={tag.id} dense button onClick={() => this.onToggleNewsletter(tag.id)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={_.some(filters.newsletterIds,(id) => id === tag.id)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={tag.name} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </FilterDropdown>}\r\n {!!this.props.issueTags && <FilterDropdown text=\"Issues\">\r\n <List disablePadding>\r\n {this.props.issueTags.map((tag) =>\r\n <ListItem key={tag.id} dense button onClick={() => this.onToggleIssue(tag.id)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={_.some(filters.issueIds,(id) => id === tag.id)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={moment(tag.name).format(\"MMM D, YYYY\")} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </FilterDropdown>}\r\n <FilterDropdown text=\"Event time\">\r\n <PickerLocalization>\r\n <div className=\"event-time\">\r\n <div>\r\n <div>From</div>\r\n <DatePicker\r\n format={\"MMM dd yyyy\"}\r\n value={filters.eventDateFrom ? Date.parse(filters.eventDateFrom) : null}\r\n slotProps={{ \r\n textField: { size: \"small\", placeholder: \"\", inputProps: { readOnly: true }},\r\n openPickerIcon: { color: \"primary\" }\r\n }}\r\n onChange={this.onChangeEventDateFrom}\r\n className=\"date-picker\"\r\n />\r\n </div>\r\n <div>\r\n <div>To</div>\r\n <DatePicker\r\n format={\"MMM dd yyyy\"}\r\n value={filters.eventDateTo ? Date.parse(filters.eventDateTo) : null}\r\n slotProps={{ \r\n textField: { size: \"small\", placeholder: \"\", inputProps: { readOnly: true }},\r\n openPickerIcon: { color: \"primary\" }\r\n }}\r\n onChange={this.onChangeEventDateTo}\r\n className=\"date-picker\"\r\n />\r\n </div>\r\n </div>\r\n </PickerLocalization>\r\n </FilterDropdown>\r\n </React.Fragment>\r\n }\r\n filterCommands={\r\n <AuthoringSearch\r\n canSearch={this.state.canSearch}\r\n onApplyFilters={() => this.onChangeFilters(this.props.filters)}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n }\r\n filterSelection={this.getFilterSelection()}\r\n />\r\n );\r\n }\r\n \r\n private getFilterSelection = () => {\r\n const { filters, newsletterTags, issueTags } = this.props;\r\n\r\n return (\r\n <React.Fragment>\r\n {filters.eventNames.map((selectedEventName) =>\r\n <Chip\r\n key={selectedEventName}\r\n label={selectedEventName}\r\n onDelete={() => this.onClearEventName(selectedEventName)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n {!!newsletterTags && filters.newsletterIds.map((newsletterId) =>\r\n <Chip\r\n key={newsletterId}\r\n label={_.first(_.filter(newsletterTags, tag => tag.id === newsletterId))?.name}\r\n onDelete={() => this.onClearNewsletter(newsletterId)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n {!!issueTags && filters.issueIds.map((issueId) =>\r\n <Chip\r\n key={issueId}\r\n label={moment(_.first(_.filter(issueTags, tag => tag.id === issueId))?.name).format(\"MMM D, YYYY\")}\r\n onDelete={() => this.onClearIssue(issueId)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n {!!filters.eventDateFrom && <Chip\r\n label={`From ${moment(filters.eventDateFrom).format(\"MMM D, YYYY\")}`}\r\n onDelete={this.onClearEventDateFrom}\r\n deleteIcon={<CloseIcon />}\r\n /> }\r\n {!!filters.eventDateTo && <Chip\r\n label={`To ${moment(filters.eventDateTo).format(\"MMM D, YYYY\")}`}\r\n onDelete={this.onClearEventDateTo}\r\n deleteIcon={<CloseIcon />}\r\n /> }\r\n </React.Fragment>\r\n );\r\n }\r\n \r\n private onToggleEventName = (selectedEventName: EmailActivityEvent) => {\r\n const isRemoving = _.some(this.props.filters.eventNames,(e) => e === selectedEventName);\r\n if (isRemoving)\r\n this.onChangeFilters({...this.props.filters, eventNames: _.filter(this.props.filters.eventNames, e => selectedEventName !== e) });\r\n else\r\n this.onChangeFilters({ ...this.props.filters, eventNames: _.concat(this.props.filters.eventNames,[selectedEventName]) });\r\n }\r\n\r\n private onToggleNewsletter = (selectedNewsletterId: string) => {\r\n const isRemoving = _.some(this.props.filters.newsletterIds,(e) => e === selectedNewsletterId);\r\n if (isRemoving)\r\n this.onChangeFilters({...this.props.filters, newsletterIds: _.filter(this.props.filters.newsletterIds, e => selectedNewsletterId !== e) });\r\n else\r\n this.onChangeFilters({ ...this.props.filters, newsletterIds: _.concat(this.props.filters.newsletterIds, [selectedNewsletterId]) });\r\n }\r\n\r\n private onToggleIssue = (selectedIssueId: string) => {\r\n const isRemoving = _.some(this.props.filters.issueIds,(e) => e === selectedIssueId);\r\n if (isRemoving)\r\n this.onChangeFilters({...this.props.filters, issueIds: _.filter(this.props.filters.issueIds, e => selectedIssueId !== e) });\r\n else\r\n this.onChangeFilters({ ...this.props.filters, issueIds: _.concat(this.props.filters.issueIds, [selectedIssueId]) });\r\n }\r\n\r\n private onChangeEventDateFrom = (date) => {\r\n this.onChangeFilters({...this.props.filters, eventDateFrom: !!date ? date : null });\r\n }\r\n\r\n private onChangeEventDateTo = (date) => {\r\n this.onChangeFilters({...this.props.filters, eventDateTo: !!date ? date : null });\r\n }\r\n\r\n private onChangeFilters = (value: ActivityLogFilterValues) => {\r\n this.setState({ canSearch: true });\r\n this.props.onChangeFilters(value);\r\n }\r\n\r\n private onClearEventName = (selectedEventName: EmailActivityEvent) => {\r\n this.props.onChangeFilters({...this.props.filters, eventNames: _.filter(this.props.filters.eventNames, e => selectedEventName !== e) });\r\n }\r\n\r\n private onClearNewsletter = (selectedNewsletterId: string) => {\r\n this.props.onChangeFilters({...this.props.filters, newsletterIds: _.filter(this.props.filters.newsletterIds, e => selectedNewsletterId !== e) });\r\n }\r\n\r\n private onClearIssue = (selectedIssueId: string) => {\r\n this.props.onChangeFilters({...this.props.filters, issueIds: _.filter(this.props.filters.issueIds, e => selectedIssueId !== e) });\r\n }\r\n\r\n private onClearEventDateFrom = () => {\r\n this.props.onChangeFilters({...this.props.filters, eventDateFrom: null });\r\n }\r\n\r\n private onClearEventDateTo = () => {\r\n this.props.onChangeFilters({...this.props.filters, eventDateTo: null });\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.setState({ canSearch: false });\r\n this.props.onClearFilters();\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n filters: ActivityLogFilterValues;\r\n newsletterTags?: SimpleTag[];\r\n issueTags?: SimpleTag[];\r\n onChangeFilters: (filters: ActivityLogFilterValues) => void;\r\n onClearFilters: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n canSearch: boolean;\r\n}\r\n\r\nexport default EmailActivityLogFilters;","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Loading from \"modules/common/components/loading\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport { ActivityLogFilterValues, ActivityLogPage, SimpleTag, toEmailActivityEventName } from \"../../models\";\r\n\r\nimport EmailActivityLogFilters from \"./emailActivityLogFilters\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Drawer from \"@mui/material/Drawer\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableContainer from \"@mui/material/TableContainer\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TablePagination from \"@mui/material/TablePagination\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\n\r\nimport ArrowBackIcon from \"@mui/icons-material/ArrowBack\";\r\nimport SaveAltIcon from \"@mui/icons-material/SaveAlt\";\r\n\r\nimport moment from \"moment\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\n\r\nclass EmailActivityLog extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n activityLog: undefined,\r\n filters: this.getDefaultFilters(props),\r\n isDownloading: false,\r\n isInitialized: false,\r\n isLoading: false\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n this.setState({filters: this.getDefaultFilters(this.props)});\r\n this.getActivityLog(1);\r\n }\r\n \r\n private getDefaultFilters(props: PropsWithRedux): ActivityLogFilterValues {\r\n return {\r\n eventNames: [],\r\n issueIds: !!props.defaultIssueId ? [props.defaultIssueId] : [],\r\n newsletterIds: !!props.selectedNewsletterId ? [props.selectedNewsletterId] : [],\r\n eventDateFrom: null,\r\n eventDateTo: null\r\n } as ActivityLogFilterValues;\r\n }\r\n\r\n public render() {\r\n return (\r\n <Drawer anchor=\"right\" open={true} onClose={this.props.onClose} classes={{ paper: \"newsletter-drawer\" }}>\r\n <Paper square elevation={0} className=\"newsletter-drawer-header\">\r\n <div>\r\n <IconButton onClick={this.props.onClose} size=\"large\">\r\n <ArrowBackIcon />\r\n </IconButton>\r\n <div>{`Employee Activity Log${!!this.props.displayContext ? (' - ' + this.props.displayContext) : ''}`}</div>\r\n </div>\r\n <Button variant=\"outlined\" color=\"primary\" startIcon={<SaveAltIcon />} onClick={this.downloadActivityLog}>Download results</Button>\r\n </Paper>\r\n <div>\r\n {this.getList()}\r\n </div>\r\n <LoadingOverlay show={this.state.isDownloading} styles={{ paddingTop: 150 }} />\r\n </Drawer>\r\n );\r\n }\r\n\r\n private downloadActivityLog = () => {\r\n this.setState({ isDownloading: true });\r\n const file = {\r\n name: `Newsletter Activity Log${!!this.props.displayContext ? (' - ' + this.props.displayContext) : ''}`\r\n };\r\n\r\n this.props.getActivityLogCSV(this.state.filters)\r\n .then((url) => new FileDownloader(file).downloadProvided(url))\r\n .then(_ => this.setState({ isDownloading: false }))\r\n .catch(_ => this.setState({ isDownloading: false }));\r\n }\r\n\r\n private getActivityLog = (pageNumber: number, filters: ActivityLogFilterValues = this.state.filters) => {\r\n this.setState({ isLoading: true });\r\n this.props.getActivityLog(pageNumber, filters).then((activityLog) => {\r\n this.setState({ activityLog, isInitialized: true, isLoading: false });\r\n });\r\n }\r\n\r\n private getList = () => {\r\n const { activityLog } = this.state;\r\n \r\n return (\r\n <div className=\"newsletter-drawer-content\">\r\n <EmailActivityLogFilters\r\n filters={this.state.filters}\r\n newsletterTags={this.props.newsletterTags}\r\n issueTags={this.props.issueTags}\r\n onChangeFilters={this.onChangeFilters}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n {this.state.isLoading || !activityLog\r\n ? <Loading />\r\n : activityLog.totalItems === 0\r\n ? <div>No activities were found.</div>\r\n : <React.Fragment>\r\n <TableContainer>\r\n <Table size=\"medium\">\r\n <TableHead>\r\n <TableRow>\r\n <TableCell align=\"center\">Activity</TableCell>\r\n <TableCell align=\"center\">Event time</TableCell>\r\n <TableCell align=\"center\">Name</TableCell>\r\n <TableCell align=\"center\">Email</TableCell>\r\n {!this.props.selectedNewsletterId && <TableCell align=\"center\">Newsletter</TableCell>}\r\n <TableCell align=\"center\">Issue</TableCell>\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {activityLog.results.map((activity, index) => {\r\n return (\r\n <TableRow key={index}>\r\n <TableCell align=\"left\">{toEmailActivityEventName(activity.activity)}</TableCell>\r\n <TableCell align=\"center\">{moment(activity.eventTime).format(\"MMM D, YYYY, h:mmA\")}</TableCell>\r\n <TableCell align=\"center\">{activity.userFullName}</TableCell>\r\n <TableCell align=\"center\">{activity.userEmail}</TableCell>\r\n {!this.props.selectedNewsletterId && <TableCell align=\"center\">{activity.newsletterTitle}</TableCell>}\r\n <TableCell align=\"center\">{moment(activity.issueDate,\"YYYY-MM-DD\").format(\"MMM D, YYYY\")}</TableCell>\r\n </TableRow>\r\n );\r\n })}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n {activityLog.currentPage > 0 && activityLog.totalPages > 1 &&\r\n <TablePagination\r\n rowsPerPageOptions={[10]}\r\n component=\"div\"\r\n backIconButtonProps={{ color: \"primary\" }}\r\n nextIconButtonProps={{ color: \"primary\" }}\r\n count={activityLog.totalItems}\r\n rowsPerPage={10}\r\n page={activityLog.currentPage - 1}\r\n onPageChange={(ev, pageNumber) => {\r\n this.getActivityLog(pageNumber + 1);\r\n }}\r\n />\r\n }\r\n </React.Fragment>\r\n }\r\n </div>\r\n );\r\n }\r\n\r\n\r\n private onChangeFilters = (filters: ActivityLogFilterValues) => {\r\n this.setState({ filters: filters });\r\n this.getActivityLog(1, filters);\r\n }\r\n \r\n private onClearFilters = () => {\r\n const filters = this.getDefaultFilters(this.props);\r\n this.setState({ filters: filters });\r\n this.getActivityLog(1, filters);\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n selectedNewsletterId?: string;\r\n defaultIssueId?: string | null;\r\n newsletterTags?: SimpleTag[];\r\n issueTags?: SimpleTag[];\r\n displayContext?: string;\r\n onClose: () => any;\r\n}\r\n\r\ninterface ComponentState {\r\n activityLog?: ActivityLogPage;\r\n filters: ActivityLogFilterValues;\r\n isDownloading: boolean;\r\n isLoading: boolean;\r\n isInitialized:boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps\r\n }),\r\n {\r\n getActivityLog: actions.getActivityLog,\r\n getActivityLogCSV: actions.getActivityLogCSV\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(EmailActivityLog);","import React from 'react';\r\nimport { Button, Divider, IconButton, Popover } from '@mui/material';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport LockIcon from '@mui/icons-material/Lock';\r\nimport { Address } from 'modules/newsletters/models';\r\n\r\n/*\r\n This is the component that's used to map the list of senders onto.\r\n It contains a lock or X depending on if the alias is currently in use.\r\n It's displayed in a list on the global newsletter settings dialog.\r\n*/\r\nconst NewsletterSender: React.FC<ComponentProps> = ({addressToDelete, onlyItem, onDelete, onLocked}) => {\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const [showPopover, setShowPopover] = React.useState(false);\r\n const buttonRef = React.useRef(null);\r\n\r\n const truncate = (str: string, n: number) => {\r\n return (str.length > n) ? str.slice(0, n-1) + \"...\" : str;\r\n }\r\n\r\n if(anchorEl === null && buttonRef.current !== null)\r\n setAnchorEl(buttonRef.current)\r\n\r\n return (\r\n <div style={{padding: \"4px\", paddingLeft: \"10px\"}}>\r\n <span style={{fontSize: \"16px\"}}>{truncate(addressToDelete.fromEmailName, 55)}</span>\r\n {onlyItem\r\n ? <React.Fragment>\r\n <div style={{float: \"right\", padding: \"6px\"}} ref={buttonRef} onMouseEnter={() => setShowPopover(true)}>\r\n <CloseIcon htmlColor=\"#AAAAAA\" style={{fontSize: \"20px\"}}></CloseIcon>\r\n </div>\r\n <Popover\r\n open={showPopover}\r\n anchorEl={anchorEl}\r\n anchorOrigin={{\r\n vertical: \"bottom\",\r\n horizontal: \"left\"\r\n }}\r\n transformOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"left\"\r\n }}\r\n PaperProps={{\r\n onMouseEnter: () => setShowPopover(true),\r\n onMouseLeave: () => setShowPopover(false),\r\n style: {\r\n maxWidth: 250,\r\n padding: \"10px\"\r\n }\r\n }}\r\n onClose={() => setShowPopover(false)}\r\n >\r\n <div style={{fontSize: \"12px\"}}>Your organization is required to have at least one (1) sender email.</div>\r\n </Popover>\r\n </React.Fragment>\r\n : !addressToDelete.currentlyInUse \r\n ? <IconButton\r\n onClick={() => onDelete(addressToDelete)}\r\n style={{float: \"right\"}}\r\n size=\"large\"\r\n >\r\n <CloseIcon htmlColor=\"red\" style={{ fontSize: \"20px\" }}></CloseIcon>\r\n </IconButton> \r\n : <IconButton \r\n onClick={() => onLocked(addressToDelete)} \r\n size=\"large\"\r\n style={{ float: \"right\", color: \"#888888\" }}\r\n >\r\n <LockIcon style={{ fontSize: \"20px\" }} htmlColor=\"#888888\"/>\r\n </IconButton> \r\n }\r\n <br/>\r\n <span style={{fontSize: \"13px\"}}>{truncate(addressToDelete.fromEmailAddress, 70)}</span>\r\n <Divider light />\r\n </div>\r\n );\r\n};\r\n\r\ninterface ComponentProps {\r\n addressToDelete: Address\r\n onlyItem: boolean\r\n onDelete: (sender: Address) => void;\r\n onLocked: (sender: Address) => void;\r\n}\r\n\r\nexport default NewsletterSender;","import * as actionCreator from \"./actionCreator\";\r\n\r\nexport const actions = {\r\n ...actionCreator\r\n}\r\n\r\nexport * from \"./actions\";\r\nexport * from \"./models\";","import { Button, TextField } from \"@mui/material\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport React, { KeyboardEvent, useState } from \"react\";\r\nimport NewsletterSender from \"./newsletterSender\";\r\nimport { Address, NewsletterConfigDigest, SaveNewsletterConfigModelStateErrors } from \"modules/newsletters/models\";\r\nimport _ from \"lodash\";\r\n\r\nimport \"../../styles/editEmailSender.sass\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { actions } from \"modules/newsletters\";\r\nimport ConfirmDialog from \"modules/common/components/dialogs/confirmDialog\";\r\n\r\ninterface IEditEmailSenderProps {\r\n modelErrors?: SaveNewsletterConfigModelStateErrors;\r\n config: NewsletterConfigDigest;\r\n onErrorMessage: (errorMessage: string) => void;\r\n onSaveAddresses: (addresses: Address[]) => void;\r\n onCheckAssociatedNewsletters: (address: Address) => void;\r\n listSectionStyles?: React.CSSProperties;\r\n emailSearchStyles?: React.CSSProperties;\r\n}\r\n\r\nconst EditEmailSender: React.FC<PropsWithRedux> = ({\r\n modelErrors,\r\n config,\r\n onErrorMessage,\r\n onSaveAddresses,\r\n onCheckAssociatedNewsletters,\r\n listSectionStyles,\r\n emailSearchStyles\r\n}) => {\r\n const [textToSearch, setTextToSearch] = useState(\"\");\r\n const [addresses, setAddresses] = useState<Address[]>(config.addresses.sort((a, b) => a.fromEmailName.localeCompare(b.fromEmailName)));\r\n const [filteredAddresses, setFilteredAddresses] = useState<Address[]>(config.addresses.sort((a, b) => a.fromEmailName.localeCompare(b.fromEmailName)));\r\n const [newSenderName, setNewSenderName] = useState(\"\");\r\n const [newSenderEmailPrefix, setNewSenderEmailPrefix] = useState(\"\");\r\n const [showDeleteDialog, setShowDeleteDialog] = useState(false);\r\n const [addressToDelete, setAddressToDelete] = useState<Address | undefined>();\r\n\r\n let timeout: NodeJS.Timeout;\r\n\r\n const addressFilterFunc = (a: Address): boolean => a.fromEmailName.toLocaleLowerCase().includes(textToSearch) || \r\n a.fromEmailAddress.toLocaleLowerCase().includes(textToSearch);\r\n\r\n const onKeyUp = (event: KeyboardEvent<HTMLDivElement> | undefined) => {\r\n if (event !== undefined && event?.code === 'Enter') {\r\n let filteredAddrs = addresses.filter(addressFilterFunc);\r\n\r\n setFilteredAddresses(filteredAddrs);\r\n }\r\n else{\r\n clearInterval(timeout);\r\n timeout = setTimeout(() => {\r\n let newAddresses = addresses.filter(addressFilterFunc);\r\n\r\n setFilteredAddresses(newAddresses);\r\n }, 500);\r\n }\r\n }\r\n\r\n const onAddNewSender = () => {\r\n let domain = _.last(config.fromEmailAddress.split(\"@\")) ?? \"\";\r\n let newSender = {\r\n fromEmailAddress: (newSenderEmailPrefix + \"@\" + domain).trim(),\r\n fromEmailName: newSenderName.trim(),\r\n currentlyInUse: false\r\n }\r\n\r\n let result = validateSenderDetails(newSender);\r\n if(!result) return;\r\n \r\n updateAddressesWithNewAddress(newSender);\r\n }\r\n\r\n const validateSenderDetails = (newSender: Address) => {\r\n let domain = _.last(config.fromEmailAddress.split(\"@\")) ?? \"\";\r\n let endCharacter = newSenderEmailPrefix.trim().charAt(newSenderEmailPrefix.length-1);\r\n let advancedCheck = /^[A-Za-z0-9]+([\\.\\_\\-][A-Za-z0-9]+)*$/ //eslint-disable-line\r\n\r\n if(domain === \"\") {\r\n onErrorMessage(\"Cannot process a sender without a domain.\");\r\n return false;\r\n }\r\n\r\n if(newSenderEmailPrefix.trim() === \"\" || newSenderName.trim() === \"\") {\r\n onErrorMessage(\"Cannot process a sender with an empty field.\");\r\n return false;\r\n }\r\n\r\n if( endCharacter === \".\" || endCharacter === \"_\" || endCharacter === \"-\") {\r\n onErrorMessage(\"Cannot process a sender that ends in a special character.\");\r\n return false;\r\n }\r\n\r\n if (!advancedCheck.test(newSenderEmailPrefix)) {\r\n onErrorMessage(\"Formatting error. Make sure no special characters are beside each other.\");\r\n return false;\r\n }\r\n\r\n if(addresses.filter(a => a.fromEmailAddress === newSender.fromEmailAddress && a.fromEmailName === newSender.fromEmailName).length > 0) {\r\n onErrorMessage(\"Sender already exists.\");\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n const updateAddressesWithNewAddress = (newSender: Address) => {\r\n let newAddresses = addresses;\r\n newAddresses = newAddresses.concat(newSender).sort((a, b) => a.fromEmailName.localeCompare(b.fromEmailName));\r\n let newConfig = config;\r\n \r\n if(!!newConfig) newConfig.addresses = newAddresses;\r\n\r\n setAddresses(newAddresses);\r\n setFilteredAddresses(newAddresses);\r\n setTextToSearch(\"\");\r\n\r\n onSaveAddresses(newAddresses);\r\n }\r\n\r\n const onDiscard = () => {\r\n setNewSenderName(\"\");\r\n setNewSenderEmailPrefix(\"\");\r\n }\r\n\r\n const onCloseDeleteDialog = () => {\r\n setShowDeleteDialog(false);\r\n }\r\n\r\n const onDeleteSender = () => {\r\n onCloseDeleteDialog();\r\n\r\n if (\r\n addressToDelete !== undefined &&\r\n !!addresses.find(a => a.fromEmailAddress === addressToDelete.fromEmailAddress && a.fromEmailName === addressToDelete.fromEmailName)\r\n ) {\r\n const addressesWithoutDeleted = addresses.filter(a => !(a.fromEmailAddress === addressToDelete.fromEmailAddress && a.fromEmailName === addressToDelete.fromEmailName));\r\n let newConfig = config;\r\n \r\n if(!!newConfig) newConfig.addresses = addressesWithoutDeleted;\r\n\r\n setAddresses(addressesWithoutDeleted);\r\n setFilteredAddresses(addressesWithoutDeleted);\r\n setTextToSearch(\"\");\r\n \r\n onSaveAddresses(addressesWithoutDeleted);\r\n }\r\n else {\r\n onErrorMessage(\"Cannot delete a sender that doesn't exist.\");\r\n }\r\n }\r\n\r\n const setAndPrepareForDelete = (addressToDelete: Address) => {\r\n setAddressToDelete(addressToDelete);\r\n setShowDeleteDialog(true);\r\n }\r\n\r\n return <div className=\"email-sender-container\">\r\n <div className=\"sender-edit-section\">\r\n <div className=\"edit-sender\">\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={newSenderName}\r\n error={_.some(modelErrors?.FromEmailName)}\r\n helperText={_.first(modelErrors?.FromEmailName)}\r\n fullWidth\r\n autoComplete=\"off\"\r\n onChange={(event) => setNewSenderName(event.target.value)}\r\n placeholder=\"Enter 'From' name (required)\"\r\n />\r\n <div className=\"sender-email\">\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={newSenderEmailPrefix}\r\n error={_.some(modelErrors?.FromEmailAddress)}\r\n helperText={_.first(modelErrors?.FromEmailAddress)}\r\n fullWidth\r\n autoComplete=\"off\"\r\n onChange={(event) => setNewSenderEmailPrefix(event.target.value)}\r\n placeholder=\"Enter email prefix (required)\"\r\n className=\"email-prefix\"\r\n />\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={\"@\"+_.last(config.fromEmailAddress.split(\"@\")) || \"\"}\r\n disabled\r\n className=\"email-suffix\"\r\n />\r\n </div>\r\n <div className=\"sender-email-buttons-container\">\r\n <Button onClick={onAddNewSender} color=\"primary\" className=\"add-button\" disabled={!newSenderEmailPrefix || !newSenderName}>Add</Button>\r\n <Button className=\"discard-button\" onClick={onDiscard} disabled={!newSenderEmailPrefix && !newSenderName}>Discard</Button>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"email-sender-list-section\" style={{...listSectionStyles}}>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={textToSearch}\r\n placeholder=\"Search name or email\"\r\n InputProps={{\r\n startAdornment: <SearchIcon style={{fill: \"#666666\", marginRight: \"5px\"}} />\r\n }}\r\n onChange={(event) => setTextToSearch(event.target.value.toLocaleLowerCase())}\r\n onKeyUp={onKeyUp}\r\n className=\"email-sender-search-bar\"\r\n style={{...emailSearchStyles}}\r\n />\r\n <div className=\"sender-list\">\r\n {\r\n filteredAddresses.map((address, index) =>\r\n <div key={index}>\r\n <NewsletterSender \r\n onlyItem={addresses.length === 1} \r\n addressToDelete={address} \r\n onDelete={() => setAndPrepareForDelete(address)} \r\n onLocked={onCheckAssociatedNewsletters}\r\n />\r\n </div>\r\n )\r\n }\r\n </div>\r\n </div>\r\n <ConfirmDialog\r\n title=\"Delete sender email\"\r\n denyLabel=\"Cancel\"\r\n confirmLabel=\"Delete\"\r\n denyButtonProps={{ sx:{ color: \"#7F7F7F\" }}}\r\n confirmButtonProps={{sx: {backgroundColor: '#dc3838', color: 'white'}}}\r\n onClose={onCloseDeleteDialog}\r\n onConfirm={onDeleteSender}\r\n onDeny={onCloseDeleteDialog}\r\n dialogMaxWidth=\"sm\"\r\n open={showDeleteDialog}\r\n >\r\n You are about to permanently delete this email. This action cannot be undone.\r\n <br/>\r\n <br/>\r\n Are you sure you want to proceed?\r\n </ConfirmDialog>\r\n </div>;\r\n};\r\n \r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IEditEmailSenderProps) => \r\n ({ \r\n ...ownProps,\r\n tenantId: state.tenant.id,\r\n }),\r\n {\r\n getAssociatedNewsletters: actions.getAssociatedNewsletters\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n \r\nexport default connector(EditEmailSender);\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { Address, ConfigChannel, NewsletterConfigDigest, SaveNewsletterConfigModelStateErrors } from \"../../models\";\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { errorAlert } from \"utils/notyPopups\";\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\r\nimport FormHelperText from \"@mui/material/FormHelperText\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Radio from \"@mui/material/Radio\";\r\nimport RadioGroup from \"@mui/material/RadioGroup\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport _ from \"lodash\";\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport EditEmailSender from \"./editEmailSender\";\r\n\r\nimport \"../../styles/dialogs.sass\"\r\n\r\nconst LinkPreferences: { [channel in ConfigChannel]: string } = {\r\n AdminPortal: \"Company Portal / Mobile\",\r\n SharePoint: \"SharePoint\",\r\n Teams: \"MS Teams\"\r\n};\r\n\r\nclass GlobalSettings extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n this.state = {\r\n senderName: \"\",\r\n senderEmail: \"\",\r\n originalName: \"\",\r\n originalEmail: \"\",\r\n errorMessage: \"\"\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n this.props.getConfig().then((currentConfig) => {\r\n var copy = JSON.parse(JSON.stringify(currentConfig)); //Make copy so that we aren't accessing the same object twice.\r\n this.setState({\r\n config: copy, \r\n currentConfig: currentConfig, \r\n originalName: currentConfig.fromEmailName, \r\n originalEmail: currentConfig.fromEmailAddress\r\n });\r\n });\r\n }\r\n\r\n public render() {\r\n return (\r\n <React.Fragment>\r\n <Dialog open={this.props.dialogOpen} maxWidth={false} scroll=\"paper\" onClose={this.props.onClose} classes={{ paper: \"newsletter-dialog\" }}>\r\n <DialogTitle className=\"newsletter-dialog-title\">\r\n <div>Newsletter Global Settings</div>\r\n <div>\r\n <IconButton onClick={this.props.onClose} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent>\r\n {this.getContent()}\r\n </DialogContent>\r\n </Dialog>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private getContent = (): JSX.Element => {\r\n if (!this.state.config)\r\n return <Loading padding={12} />;\r\n\r\n return (\r\n <div style={{paddingTop: \"8px\"}}>\r\n <div style={{display: \"flex\", flexDirection: \"row\"}}>\r\n <div style={{width: \"180px\"}}>\r\n <div>\r\n Sender Emails \r\n <span style={{position: \"relative\", top: \"6px\"}}>\r\n <InfoHover>List of all 'From' names and emails of your newsletters. Edit a newsletter to modify its sender email. You cannot remove emails currently used in newsletter(s).</InfoHover>\r\n </span>\r\n </div>\r\n </div>\r\n <EditEmailSender\r\n config={this.state.config}\r\n onErrorMessage={errorMessage => this.setState({ errorMessage })}\r\n onSaveAddresses={this.onSave}\r\n onCheckAssociatedNewsletters={this.props.onCheckAssociatedNewsletters}\r\n />\r\n </div>\r\n <Divider light />\r\n {this.state.config.availableLinkPreferences.length > 1 && \r\n <div className=\"global-settings-preferred-channel\">\r\n <div>\r\n <span>Preferred channel when opening content</span>\r\n <InfoHover>This setting will redirect the reader to your preferred channel when opening content from the newsletter.</InfoHover>\r\n </div>\r\n <div>\r\n <FormControl error={_.some(this.state.modelErrors?.LinkPreference)}>\r\n <RadioGroup value={this.state.config.linkPreference} onChange={(event) => this.onChangePreferredChannel(event.target.value as ConfigChannel)}>\r\n {this.state.config.availableLinkPreferences.map((linkPreference) =>\r\n <FormControlLabel key={linkPreference} value={linkPreference} control={<Radio color=\"primary\" />} label={LinkPreferences[linkPreference]} />\r\n )}\r\n </RadioGroup>\r\n <FormHelperText>{_.first(this.state.modelErrors?.LinkPreference)}</FormHelperText>\r\n </FormControl>\r\n </div>\r\n </div>\r\n }\r\n <div style={{flex: \"content\", float: \"right\", marginTop: \"10px\", marginBottom: \"5px\"}}>\r\n <Button onClick={this.props.onClose}>Cancel</Button>\r\n <Button variant=\"contained\" color=\"primary\" disabled={_.isEqual(this.state.config.linkPreference, this.state.currentConfig?.linkPreference)} onClick={() => this.onSave()}>Save changes</Button>\r\n </div>\r\n\r\n <ErrorSnackbar errorMessage={this.state.errorMessage} clearErrorMessage={this.clearErrorMessage}/>\r\n </div>\r\n );\r\n }\r\n\r\n private clearErrorMessage = () => {\r\n this.setState({errorMessage: \"\"});\r\n }\r\n\r\n private onChangePreferredChannel = (linkPreference: ConfigChannel) => {\r\n this.setState({ config: {...this.state.config!, linkPreference: linkPreference}});\r\n }\r\n\r\n private onSave = (addresses?: Address[]) => {\r\n this.setState({isSaving: true});\r\n var newConfig = this.state.config!;\r\n if (addresses) {\r\n newConfig.addresses = addresses;\r\n }\r\n else {\r\n newConfig.fromEmailAddress = this.state.originalEmail;\r\n newConfig.fromEmailName = this.state.originalName;\r\n this.setState({senderName: \"\", senderEmail: \"\"});\r\n }\r\n\r\n this.setState({config: newConfig});\r\n\r\n this.props.saveConfig(newConfig).then(result => {\r\n if(!!result.success){\r\n this.setState({config: result.success, currentConfig: result.success, isSaving: false, modelErrors: null});\r\n\r\n if (addresses === undefined) this.props.onClose();\r\n }else if(!!result.error){\r\n errorAlert('Unable to Save', 5000);\r\n this.setState({isSaving: false, modelErrors: result.error.ModelState});\r\n }\r\n });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n onClose: () => any;\r\n dialogOpen: boolean;\r\n confirmOpen: boolean;\r\n closeConfirm: () => void;\r\n openConfirm: () => void;\r\n onCheckAssociatedNewsletters: (address: Address) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n config?: NewsletterConfigDigest;\r\n currentConfig?: NewsletterConfigDigest;\r\n modelErrors?: SaveNewsletterConfigModelStateErrors | null;\r\n isSaving?: boolean;\r\n senderName: string;\r\n senderEmail: string;\r\n originalName: string;\r\n originalEmail: string;\r\n errorMessage: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => \r\n ({ ...ownProps }),\r\n {\r\n getConfig: actions.getConfig,\r\n saveConfig: actions.saveConfig\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(GlobalSettings);","import React from \"react\";\r\nimport MoreOptionsButton from \"modules/common/components/buttons/moreOptionsButton\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport List from \"@mui/material/List\";\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\n\r\n\r\ninterface ComponentProps {\r\n onShowActivityLog: () => any;\r\n onShowGlobalSettings: () => any;\r\n onShowTemplateThemes: () => any;\r\n}\r\n\r\nexport const MoreOptions: React.FunctionComponent<ComponentProps> = props => {\r\n return (\r\n <div>\r\n <MoreOptionsButton>\r\n <List disablePadding>\r\n <MoreOptionsItem\r\n text=\"Employee Activity Log\"\r\n onClick={props.onShowActivityLog}\r\n />\r\n <Divider light />\r\n <MoreOptionsItem\r\n text=\"Newsletter Global Settings\"\r\n onClick={props.onShowGlobalSettings}\r\n />\r\n <MoreOptionsItem\r\n text=\"Themes\"\r\n onClick={props.onShowTemplateThemes}\r\n />\r\n </List>\r\n </MoreOptionsButton>\r\n </div>\r\n );\r\n}","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport MoreOptionsIconButton from \"modules/common/components/buttons/moreOptionsIconButton\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport Divider from \"@mui/material/Divider\";\r\nimport List from \"@mui/material/List\";\r\n\r\nimport { NewsletterDigest } from \"modules/newsletters\";\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\n\r\n\r\nconst MoreNewsletterOptions: React.FunctionComponent<PropsWithRedux> = props => {\r\n const { newsletter } = props;\r\n\r\n return (\r\n <MoreOptionsIconButton>\r\n <List disablePadding>\r\n {(newsletter.status !== \"Draft\") &&\r\n <MoreOptionsItem\r\n text=\"Open dashboard\"\r\n onClick={() => {\r\n props.redirectTo(\"/\" + props.tenantId + \"/admin/newsletters/\" + props.newsletter.id + \"/dashboard\");\r\n }}\r\n />\r\n }\r\n <MoreOptionsItem\r\n text={newsletter.status === \"Draft\" ? \"Continue editing\" : \"Edit\"}\r\n onClick={() => {\r\n props.redirectTo(\"/\" + props.tenantId + \"/admin/newsletters/\" + props.newsletter.id);\r\n }}\r\n />\r\n <MoreOptionsItem\r\n text=\"Duplicate\"\r\n onClick={() => {\r\n props.onCreateCopy();\r\n }}\r\n />\r\n <Divider light />\r\n {newsletter.status === \"Enabled\" &&\r\n <MoreOptionsItem\r\n text=\"Disable\"\r\n onClick={async () => {\r\n if (await confirm.show({\r\n title: \"Disable '\" + newsletter.title +\"'\",\r\n text: \"You're about to disable this newsletter.<br><br>Are you sure?\",\r\n yesText: \"Disable\",\r\n noText: \"Cancel\"\r\n })) {\r\n props.disableNewsletter(newsletter.id).then(() => {props.onNewsletterChanged(\"Newsletter disabled\")});\r\n }\r\n }}\r\n />\r\n }\r\n {newsletter.status === \"Disabled\" &&\r\n <MoreOptionsItem\r\n text=\"Enable\"\r\n onClick={async () => {\r\n if (await confirm.show({\r\n title: \"Enable '\" + newsletter.title +\"'\",\r\n text: \"You're about to enable this newsletter.<br><br>Are you sure?\",\r\n yesText: \"Enable\",\r\n noText: \"Cancel\"\r\n })) {\r\n props.enableNewsletter(newsletter.id).then(() => {props.onNewsletterChanged(\"Newsletter enabled\")});\r\n }\r\n }}\r\n />\r\n }\r\n <MoreOptionsItem\r\n text=\"Delete\"\r\n textStyle={{color: \"#B72026\"}}\r\n onClick={async () => {\r\n if (await confirm.show({\r\n title: \"Delete Newsletter\",\r\n text: (\r\n <div>\r\n <div>You're about to permanently delete '{newsletter.title}'. You'll lose all queued and sent issues, reports, and settings associated with this. You cannot undo this action.</div>\r\n <br />\r\n <div>Are you sure?</div>\r\n </div>\r\n ),\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\"\r\n })) {\r\n props.deleteNewsletter(newsletter.id).then(() => {props.onNewsletterChanged(\"Newsletter deleted\")});\r\n }\r\n }}\r\n />\r\n </List>\r\n </MoreOptionsIconButton>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n newsletter: NewsletterDigest;\r\n onCreateCopy: () => any;\r\n onNewsletterChanged: (successMessage:string) => any;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n deleteNewsletter: actions.deleteNewsletter,\r\n disableNewsletter: actions.disableNewsletter,\r\n enableNewsletter: actions.enableNewsletter,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(MoreNewsletterOptions);","import * as React from \"react\";\r\n\r\nimport AuthoringSearch from \"modules/common/components/filters/authoringSearch\";\r\nimport FilterContainer from \"modules/common/components/filters/filterContainer\";\r\n\r\nimport { NewsletterFilterValues } from \"../../models\";\r\n\r\nimport Chip from \"@mui/material/Chip\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport { NewsletterListComponentTab } from \"./newsletterList\";\r\nimport FilterDropdown from \"modules/common/components/filters/filterDropdown\";\r\n\r\nimport { DatePicker } from \"@mui/x-date-pickers/DatePicker\";\r\nimport { PickerLocalization } from \"modules/common/components/pickerLocalization\";\r\n\r\nimport { Button, Checkbox, Divider, List, ListItem, ListItemIcon, ListItemText } from \"@mui/material\";\r\nimport moment from \"moment\";\r\nimport { Audience } from \"modules/audiences\";\r\nimport { SelectOption } from \"modules/common/models\";\r\n\r\n\r\nclass NewsletterFilters extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n canSearch: !!props.filters.textToSearch,\r\n textToSearch: props.filters.textToSearch || \"\"\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: ComponentProps) {\r\n if (this.props.filters.textToSearch !== prevProps.filters.textToSearch)\r\n this.setState({ textToSearch: this.props.filters.textToSearch || \"\" });\r\n }\r\n\r\n public render() {\r\n const { filters } = this.props;\r\n const tagSelected = (filters.tags?.length ?? [].length) > 0;\r\n\r\n return (\r\n <FilterContainer\r\n filters={\r\n <React.Fragment>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.state.textToSearch}\r\n placeholder=\"Search title or description\"\r\n InputProps={{\r\n startAdornment: <SearchIcon className=\"search-icon\" />\r\n }}\r\n onChange={this.onUpdateTextToSearch}\r\n onKeyUp={this.onKeyUp}\r\n className=\"text-to-search\"\r\n />\r\n {(this.props.currentTab === 'all' || this.props.currentTab === 'enabled' || this.props.currentTab === 'disabled') &&\r\n <FilterDropdown text=\"Last sent between\">\r\n <PickerLocalization>\r\n <div className=\"published-time\">\r\n <div>\r\n <div>From</div>\r\n <DatePicker\r\n format=\"MMM dd yyyy\"\r\n value={filters.lastSentFrom ? Date.parse(filters.lastSentFrom) : null}\r\n slotProps={{ \r\n textField: { size: \"small\", placeholder: \"\", inputProps: { readOnly: true }},\r\n openPickerIcon: { color: \"primary\" }\r\n }}\r\n onChange={this.onChangeSentFrom}\r\n className=\"date-picker\"\r\n />\r\n </div>\r\n <div>\r\n <div>To</div>\r\n <DatePicker\r\n format=\"MMM dd yyyy\"\r\n value={filters.lastSentTo ? Date.parse(filters.lastSentTo) : null}\r\n slotProps={{ \r\n textField: { size: \"small\", placeholder: \"\", inputProps: { readOnly: true }},\r\n openPickerIcon: { color: \"primary\" }\r\n }}\r\n onChange={this.onChangeSentTo}\r\n className=\"date-picker\"\r\n />\r\n </div>\r\n </div>\r\n </PickerLocalization>\r\n </FilterDropdown>\r\n }\r\n {(this.props.currentTab === 'all' || this.props.currentTab === 'enabled' || this.props.currentTab === 'draft') &&\r\n <FilterDropdown text=\"Next queued between\">\r\n <PickerLocalization>\r\n <div className=\"published-time\">\r\n <div>\r\n <div>From</div>\r\n <DatePicker\r\n format=\"MMM dd yyyy\"\r\n value={filters.nextQueuedFrom ? Date.parse(filters.nextQueuedFrom) : null}\r\n slotProps={{ \r\n textField: { size: \"small\", placeholder: \"\", inputProps: { readOnly: true }},\r\n openPickerIcon: { color: \"primary\" }\r\n }}\r\n onChange={this.onChangeQueuedFrom}\r\n className=\"date-picker\"\r\n />\r\n </div>\r\n <div>\r\n <div>To</div>\r\n <DatePicker\r\n format=\"MMM dd yyyy\"\r\n value={filters.nextQueuedTo ? Date.parse(filters.nextQueuedTo) : null}\r\n slotProps={{ \r\n textField: { size: \"small\", placeholder: \"\", inputProps: { readOnly: true }},\r\n openPickerIcon: { color: \"primary\" }\r\n }}\r\n onChange={this.onChangeQueuedTo}\r\n className=\"date-picker\"\r\n />\r\n </div>\r\n </div>\r\n </PickerLocalization>\r\n </FilterDropdown>\r\n }\r\n {(this.props.currentTab === 'all' || this.props.currentTab === 'enabled' || this.props.currentTab === 'disabled') &&\r\n <FilterDropdown text=\"Sent to\">\r\n <div style={{height: \"154px\"}}>\r\n <List disablePadding style={{maxHeight: \"154px\", overflow: \"auto\"}}>\r\n {this.props.audiences.map(audience => {\r\n return (\r\n <React.Fragment key={audience.id}>\r\n <ListItem key={audience.id} dense button onClick={() => this.onChangeTags(audience.id)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!filters.tags!.find((selectedTag) => selectedTag === audience.id)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={audience.displayName} />\r\n </ListItem>\r\n </React.Fragment>\r\n )})}\r\n </List>\r\n </div>\r\n <div>\r\n <Divider/>\r\n <Button color=\"primary\" style={{float: \"right\"}} onClick={() => this.onHandleAllTags(tagSelected)}>\r\n {tagSelected ? \"Unselect\" : \"Select\"} All\r\n </Button>\r\n </div>\r\n </FilterDropdown>\r\n }\r\n {(this.props.currentTab === 'draft' || this.props.currentTab === 'disabled') &&\r\n <FilterDropdown text=\"Last modified between\">\r\n <PickerLocalization>\r\n <div className=\"published-time\">\r\n <div>\r\n <div>From</div>\r\n <DatePicker\r\n format=\"MMM dd yyyy\"\r\n value={filters.modifiedFrom ? Date.parse(filters.modifiedFrom) : null}\r\n slotProps={{ \r\n textField: { size: \"small\", placeholder: \"\", inputProps: { readOnly: true }},\r\n openPickerIcon: { color: \"primary\" }\r\n }}\r\n onChange={this.onChangeModifiedFrom}\r\n className=\"date-picker\"\r\n />\r\n </div>\r\n <div>\r\n <div>To</div>\r\n <DatePicker\r\n format=\"MMM dd yyyy\"\r\n value={filters.modifiedTo ? Date.parse(filters.modifiedTo) : null}\r\n slotProps={{ \r\n textField: { size: \"small\", placeholder: \"\", inputProps: { readOnly: true }},\r\n openPickerIcon: { color: \"primary\" }\r\n }}\r\n onChange={this.onChangeModifiedTo}\r\n className=\"date-picker\"\r\n />\r\n </div>\r\n </div>\r\n </PickerLocalization>\r\n </FilterDropdown>\r\n }\r\n </React.Fragment>\r\n }\r\n filterCommands={\r\n <AuthoringSearch\r\n canSearch={this.state.canSearch}\r\n onApplyFilters={this.onChangeTextToSearch}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n }\r\n filterSelection={this.getFilterSelection()}\r\n />\r\n );\r\n }\r\n\r\n private getFilterSelection = (): JSX.Element | undefined => {\r\n const { filters } = this.props;\r\n\r\n if (this.hasNoCurrentFilters())\r\n return <React.Fragment></React.Fragment>;\r\n\r\n const availableTags: SelectOption[] = this.getAvailableTags();\r\n\r\n return (\r\n <React.Fragment>\r\n {!!filters.textToSearch &&\r\n <Chip\r\n key=\"search-text\"\r\n label={`\"${filters.textToSearch}\"`}\r\n onDelete={this.onClearTextToSearch}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n }\r\n {(!!filters.lastSentFrom || !!filters.lastSentTo) &&\r\n <Chip\r\n key=\"published-time\"\r\n label={`Released${!!filters.lastSentFrom? ` from ${moment(filters.lastSentFrom).format(\"MMM D, YYYY\")}` : \"\"}${!!filters.lastSentTo ? ` up to ${moment(filters.lastSentTo).format(\"MMM D, YYYY\")}` : \"\"}`}\r\n onDelete={this.onClearSentTime}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n }\r\n {(!!filters.nextQueuedFrom || !!filters.nextQueuedFrom) &&\r\n <Chip\r\n key=\"queued-time\"\r\n label={`Next queued${!!filters.nextQueuedFrom? ` from ${moment(filters.nextQueuedFrom).format(\"MMM D, YYYY\")}` : \"\"}${!!filters.nextQueuedTo ? ` up to ${moment(filters.nextQueuedTo).format(\"MMM D, YYYY\")}` : \"\"}`}\r\n onDelete={this.onClearQueuedTime}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n }\r\n {(!!filters.modifiedFrom || !!filters.modifiedFrom) &&\r\n <Chip\r\n key=\"modified-time\"\r\n label={`Modified${!!filters.modifiedFrom? ` from ${moment(filters.modifiedFrom).format(\"MMM D, YYYY\")}` : \"\"}${!!filters.modifiedTo ? ` up to ${moment(filters.modifiedTo).format(\"MMM D, YYYY\")}` : \"\"}`}\r\n onDelete={this.onClearModifiedTime}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n }\r\n {filters.tags!.map((selectedTag) =>\r\n <Chip\r\n key={selectedTag}\r\n label={availableTags.find((tag) => tag.key === selectedTag)!.text}\r\n onDelete={() => this.onClearTag(selectedTag)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private hasNoCurrentFilters = () => {\r\n let filters = this.props.filters;\r\n\r\n return (!filters.tags || filters.tags.length === 0) \r\n && filters.textToSearch === \"\" \r\n && !filters.lastSentFrom && !filters.lastSentTo\r\n && !filters.modifiedFrom && !filters.modifiedTo\r\n && !filters.nextQueuedFrom && !filters.nextQueuedTo\r\n }\r\n\r\n private onChangeFilters = (value: Partial<NewsletterFilterValues>) => {\r\n this.props.onChangeFilters({ ...this.props.filters, textToSearch: this.state.textToSearch, ...value });\r\n this.setCanSearch();\r\n }\r\n \r\n private onChangeTextToSearch = () => {\r\n this.onChangeFilters({ textToSearch: this.state.textToSearch });\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.clearCanSearch();\r\n this.props.onClearFilters();\r\n }\r\n\r\n private onClearTextToSearch = () => {\r\n this.onChangeFilters({ textToSearch: \"\" });\r\n }\r\n \r\n private onKeyUp = (key) => {\r\n if (key.keyCode === 13)\r\n this.onChangeTextToSearch();\r\n }\r\n\r\n private onUpdateTextToSearch = (event) => {\r\n this.setState({ textToSearch: event.target.value });\r\n if(event.target.value && event.target.value !== \"\") {\r\n this.setCanSearch();\r\n }\r\n else if(this.hasNoCurrentFilters()){\r\n this.clearCanSearch();\r\n }\r\n }\r\n\r\n private clearCanSearch = () => {\r\n this.setState({ canSearch: false });\r\n }\r\n\r\n private setCanSearch = () => {\r\n this.setState({ canSearch: true });\r\n }\r\n\r\n private onChangeTags = (currentTag: string) => {\r\n const hasSelectedTag: boolean = !!this.props.filters.tags!.find((selectedTag) => selectedTag === currentTag);\r\n if (hasSelectedTag)\r\n this.onChangeFilters({ tags: this.props.filters.tags!.filter((selectedTag) => selectedTag !== currentTag) });\r\n else\r\n this.onChangeFilters({ tags: this.props.filters.tags!.concat([currentTag]) });\r\n }\r\n\r\n private onHandleAllTags = (tagSelected: boolean) => {\r\n let newFilters = {...this.props.filters};\r\n\r\n if(tagSelected) {\r\n newFilters.tags = [];\r\n }\r\n\r\n else {\r\n let currentTags = this.props.filters.tags ?? [];\r\n let audiences = this.props.audiences;\r\n\r\n audiences.forEach(audience => {\r\n if(!currentTags.includes(audience.id)) {\r\n currentTags.push(audience.id);\r\n }\r\n });\r\n newFilters.tags = currentTags;\r\n }\r\n\r\n this.onChangeFilters(newFilters);\r\n }\r\n\r\n private getAvailableTags = (): SelectOption[] => {\r\n if (!this.props.audiences)\r\n return [];\r\n \r\n let availableTags: SelectOption[] = [];\r\n this.props.audiences.forEach((audience) => {\r\n if(audience.enabled) {\r\n availableTags.push({ key: audience.id, text: audience.displayName, type: \"item\" });\r\n }\r\n });\r\n\r\n return availableTags;\r\n }\r\n\r\n private onClearTag = (tag: string) => {\r\n this.onChangeFilters({ tags: this.props.filters.tags!.filter((selectedTag) => selectedTag !== tag) });\r\n }\r\n\r\n private onClearSentTime = () => {\r\n this.onChangeFilters({ lastSentFrom: \"\", lastSentTo: \"\" });\r\n }\r\n \r\n private onClearModifiedTime = () => {\r\n this.onChangeFilters({ modifiedFrom: \"\", modifiedTo: \"\" });\r\n }\r\n\r\n private onClearQueuedTime = () => {\r\n this.onChangeFilters({ nextQueuedFrom: \"\", nextQueuedTo: \"\" });\r\n }\r\n\r\n private onChangeSentFrom = (date) => {\r\n this.onChangeFilters({ lastSentFrom: moment(date).toISOString() });\r\n }\r\n\r\n private onChangeSentTo = (date) => {\r\n this.onChangeFilters({ lastSentTo: moment(date).toISOString() });\r\n }\r\n\r\n private onChangeQueuedFrom= (date) => {\r\n this.onChangeFilters({ nextQueuedFrom: moment(date).toISOString() });\r\n }\r\n\r\n private onChangeQueuedTo = (date) => {\r\n this.onChangeFilters({ nextQueuedTo: moment(date).toISOString() });\r\n }\r\n\r\n private onChangeModifiedFrom = (date) => {\r\n this.onChangeFilters({ modifiedFrom: moment(date).toISOString() });\r\n }\r\n\r\n private onChangeModifiedTo = (date) => {\r\n this.onChangeFilters({ modifiedTo: moment(date).toISOString() });\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n filters: Partial<NewsletterFilterValues>;\r\n onChangeFilters: (filters: Partial<NewsletterFilterValues>) => void;\r\n onClearFilters: () => void;\r\n currentTab: NewsletterListComponentTab;\r\n audiences: Audience[];\r\n}\r\n\r\ninterface ComponentState {\r\n canSearch: boolean;\r\n textToSearch: string;\r\n}\r\n\r\nexport default NewsletterFilters;","import * as React from \"react\";\r\n\r\nimport Chip from \"@mui/material/Chip\";\r\n\r\n\r\nimport \"./chips.sass\";\r\n\r\n\r\nconst ChipLabels: React.FunctionComponent<ComponentProps> = props => {\r\n if (!props.chips || !props.chips.length)\r\n return (\r\n <div className=\"chip-labels\">\r\n <Chip\r\n label={props.emptyText}\r\n disabled={true}\r\n className=\"empty-chip\"\r\n />\r\n </div>\r\n );\r\n\r\n return (\r\n <div title={props.chips.map((chip) => chip.name).join(\", \")} className=\"chip-labels\">\r\n {props.chips.slice(0,2).map((chip) => (\r\n <Chip\r\n key={chip.id}\r\n label={chip.name}\r\n />\r\n ))}\r\n {props.chips.length > 2 &&\r\n (props.chips.length === 3\r\n ? <Chip\r\n key={props.chips[2].id}\r\n label={props.chips[2].name}\r\n />\r\n : <Chip\r\n key=\"more\"\r\n label={`+${props.chips.length - 2}`}\r\n />\r\n )\r\n }\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n chips: { id: string, name: string }[];\r\n emptyText: string;\r\n}\r\n\r\nexport default ChipLabels;","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport { NewsletterDigest, NewsletterFilterValues, NewsletterListingPage, NewsletterStatus } from \"../../models\";\r\nimport moment from \"moment\";\r\nimport numeral from \"numeral\";\r\n\r\nimport Loading from \"modules/common/components/loading\";\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport MoreNewsletterOptions from \"../../dashboard/components/moreNewsletterOptions\";\r\nimport NewsletterFilters from \"./newsletterFilters\";\r\n\r\nimport TabContent from \"pages/common/tabContent\";\r\n\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableContainer from \"@mui/material/TableContainer\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport ChipLabels from \"modules/common/components/chips/chipLabels\";\r\n\r\nimport NotificationsActiveOutlinedIcon from \"@mui/icons-material/NotificationsActiveOutlined\";\r\nimport NotificationsOffOutlinedIcon from \"@mui/icons-material/NotificationsOffOutlined\";\r\nimport Paging from \"modules/common/components/paging\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport { SortStyle } from \"utils/managementUtils\";\r\nimport Cookies from \"js-cookie\";\r\nimport { ArrowDownward, ArrowUpward } from \"@mui/icons-material\";\r\nimport { Button, Checkbox } from \"@mui/material\";\r\nimport TabContentToolbar from \"pages/common/tabContentToolbar\";\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport BlockIcon from \"@mui/icons-material/Block\";\r\nimport CheckCircleOutlineIcon from \"@mui/icons-material/CheckCircleOutline\";\r\nimport { Audience } from \"modules/audiences\";\r\nimport ManagementEmptyResults from \"modules/common/components/managementEmptyResults\";\r\nimport { ROWS_PER_PAGE_COOKIE_NAMES } from \"utils/cookie\";\r\n\r\n\r\ninterface HeaderCell {\r\n id: string;\r\n label: string | JSX.Element;\r\n ascValue?: SortStyle;\r\n descValue?: SortStyle;\r\n clickable?: boolean;\r\n}\r\n\r\nexport type NewsletterListComponentTab = 'all' | 'enabled' | 'draft' | 'disabled';\r\n\r\nclass NewsletterList extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n filters: { ...this.getDefaultFilterValues() },\r\n hasFiltersApplied: false,\r\n isPagedLoad: false,\r\n selectedItems: [],\r\n sortMethod: SortStyle.titleDesc,\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public render() {\r\n if (!this.props.show)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n if (this.props.isFetching && !this.state.isPagedLoad)\r\n return <Loading />;\r\n \r\n return (\r\n <div className=\"newsletter-list\">\r\n {this.getToolbar()}\r\n <TabContent>\r\n {this.getFilter()}\r\n {this.getList()}\r\n </TabContent>\r\n </div>\r\n );\r\n }\r\n\r\n private formatPublishedTime = (time: string | null): JSX.Element => {\r\n if (!!time) {\r\n return (\r\n <div>\r\n <span>{moment(time).format(\"MMM D, YYYY, h:mmA\")}</span>\r\n </div>\r\n );\r\n }\r\n return <div>-</div>;\r\n }\r\n\r\n private formatState = (state: NewsletterStatus): JSX.Element => {\r\n if (state === \"Disabled\")\r\n return <span className=\"newsletter-state grey\">{state}</span>;\r\n else if (state === \"Draft\")\r\n return <span className=\"newsletter-state yellow\">{state}</span>;\r\n else\r\n return <span className=\"newsletter-state green\">{state}</span>;\r\n }\r\n\r\n private formatTitle = (title: string): JSX.Element => {\r\n return (\r\n <div className=\"newsletter-title\">\r\n <span>{title}</span>\r\n </div>\r\n );\r\n }\r\n \r\n private getDefaultFilterValues = (): Partial<NewsletterFilterValues> => {\r\n const filters: Partial<NewsletterFilterValues> = {\r\n textToSearch: \"\",\r\n sortType: SortStyle.titleDesc,\r\n tags: []\r\n };\r\n return filters;\r\n }\r\n\r\n private getFilter = (): JSX.Element => {\r\n return (\r\n <NewsletterFilters\r\n filters={this.state.filters}\r\n onChangeFilters={this.onChangeFilters}\r\n onClearFilters={this.onClearFilters}\r\n currentTab={this.props.tab}\r\n audiences={this.props.audiences}\r\n />\r\n );\r\n }\r\n\r\n private getHeader = (): HeaderCell[] => {\r\n const { tab } = this.props;\r\n\r\n let header: HeaderCell[] = [\r\n { id: \"title\", label: \"Newsletter title\", descValue: SortStyle.titleDesc, ascValue: SortStyle.titleAsc, clickable: true },\r\n { id: \"options\", label: \"\" },\r\n ];\r\n\r\n if (tab === \"all\")\r\n header.push({ \r\n id: \"status\", \r\n label: \"State\", \r\n descValue: SortStyle.stateDesc, \r\n ascValue: SortStyle.stateAsc,\r\n clickable: true\r\n });\r\n \r\n if (tab === \"all\" || tab === \"enabled\") {\r\n header.push({ \r\n id: \"lastIssueSentOn\", \r\n label: \"Last sent on\", \r\n descValue: SortStyle.publishDesc, \r\n ascValue: SortStyle.publishAsc,\r\n clickable: true\r\n });\r\n header.push({ \r\n id: \"nextIssueSendOn\", \r\n label: \"Next queued for\", \r\n descValue: SortStyle.startDesc, \r\n ascValue: SortStyle.startAsc,\r\n clickable: true\r\n });\r\n }\r\n \r\n if (tab === \"draft\") {\r\n header.push({ \r\n id: \"nextIssueSendOn\", \r\n label: \"Next queued for\", \r\n descValue: SortStyle.startDesc, \r\n ascValue: SortStyle.startAsc,\r\n clickable: true\r\n });\r\n header.push({ \r\n id: \"editedTime\", \r\n label: \"Last modified on\", \r\n descValue: SortStyle.modifiedDesc, \r\n ascValue: SortStyle.modifiedAsc,\r\n clickable: true\r\n });\r\n header.push({ \r\n id: \"audiences\", \r\n label: \"Send to\" });\r\n }\r\n\r\n if (tab === \"disabled\") {\r\n header.push({ \r\n id: \"lastIssueSentOn\", \r\n label: \"Last sent on\", \r\n descValue: SortStyle.publishDesc, \r\n ascValue: SortStyle.publishAsc,\r\n clickable: true\r\n });\r\n header.push({ \r\n id: \"editedTime\", \r\n label: \"Last modified on\", \r\n descValue: SortStyle.modifiedDesc, \r\n ascValue: SortStyle.modifiedAsc,\r\n clickable: true\r\n });\r\n }\r\n\r\n if (tab !== \"draft\") {\r\n header.push({ \r\n id: \"audiences\", \r\n label: \"Sent to\" \r\n });\r\n header.push({ \r\n id: \"activity\", \r\n descValue: SortStyle.viewsDesc, \r\n ascValue: SortStyle.viewsAsc,\r\n clickable: true,\r\n label: (\r\n <div className=\"header-view\">\r\n <HoverText\r\n label=\"Subscribers\"\r\n >\r\n <div>Employees who are subscribed and/or unsubscribed from the newsletter.</div>\r\n </HoverText>\r\n </div>\r\n ), \r\n }); \r\n }\r\n \r\n return header;\r\n }\r\n\r\n private getList = (): JSX.Element => {\r\n const { page } = this.props;\r\n\r\n if (this.props.isFetching || !page)\r\n return <Loading />;\r\n\r\n if (!page.results.length)\r\n return (\r\n <ManagementEmptyResults searchType={\"Newsletters\"} hasFilters={this.state.hasFiltersApplied}/>\r\n );\r\n\r\n const rowCount = page.results.length || 10;\r\n const { selectedItems } = this.state;\r\n\r\n return (\r\n <React.Fragment>\r\n {this.state.hasFiltersApplied &&\r\n <Typography variant=\"h2\" className=\"newsletter-results\">Results</Typography>\r\n }\r\n <TableContainer>\r\n <Table size=\"medium\">\r\n <TableHead>\r\n <TableRow>\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n color=\"primary\"\r\n indeterminate={selectedItems.length > 0 && selectedItems.length < rowCount}\r\n checked={rowCount > 0 && selectedItems.length === rowCount}\r\n onChange={this.onSelectAllNewsletters}\r\n inputProps={{ \"aria-label\": \"select all pages\" }}\r\n />\r\n </TableCell>\r\n {this.getHeader().map((headerCell) => {\r\n if (headerCell.id === \"options\")\r\n return <TableCell key={headerCell.id} padding=\"checkbox\"></TableCell>\r\n\r\n return (\r\n <TableCell\r\n key={headerCell.id}\r\n align={headerCell.id === \"title\" ? \"left\" : \"center\"}\r\n padding={headerCell.id === \"options\" ? \"none\" : \"normal\"}\r\n onClick={() => this.onClickHeader(headerCell.descValue, headerCell.ascValue)}\r\n style={{cursor: headerCell.clickable ? \"pointer\" : \"\"}}\r\n >\r\n {headerCell.label}\r\n {this.state.sortMethod === headerCell.ascValue && <ArrowUpward htmlColor=\"#7A7A7A\" style={{position: \"relative\", top: \"8px\", paddingLeft: \"2px\"}}/>}\r\n {this.state.sortMethod === headerCell.descValue && <ArrowDownward htmlColor=\"#7A7A7A\" style={{position: \"relative\", top: \"8px\", paddingLeft: \"2px\"}}/>}\r\n </TableCell>\r\n );\r\n })}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {page.results\r\n .map((newsletter, index) => this.getListItem(newsletter, index))\r\n }\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n <Paging\r\n currentPage={page.currentPage}\r\n items={page.results}\r\n totalItems={page.totalItems}\r\n totalPages={page.totalPages}\r\n onChangePage={this.onChangePage}\r\n resetSelection={this.resetSelection}\r\n />\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private getListItem = (newsletter: NewsletterDigest, index: number): JSX.Element => {\r\n const labelId = `newsletter-list-checkbox-${index}`;\r\n const isNewsletterSelected = this.isNewsletterSelected(newsletter);\r\n\r\n return (\r\n <React.Fragment key={newsletter.id}>\r\n <TableRow\r\n key={newsletter.id}\r\n hover\r\n onClick={() => this.onSelectNewsletter(newsletter)}\r\n role=\"checkbox\"\r\n tabIndex={-1}\r\n className=\"newsletter-list-item\"\r\n selected={isNewsletterSelected}\r\n aria-checked={isNewsletterSelected}\r\n >\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n color=\"primary\"\r\n checked={isNewsletterSelected}\r\n inputProps={{ \"aria-labelledby\": labelId }}\r\n onClick={(ev) => this.onCheckNewsletter(ev, newsletter)}\r\n />\r\n </TableCell>\r\n <TableCell component=\"th\" id={labelId} scope=\"row\">{this.formatTitle(newsletter.title)}</TableCell>\r\n <TableCell padding=\"checkbox\">\r\n <MoreNewsletterOptions newsletter={newsletter} onCreateCopy={() => this.props.onCreateCopy(newsletter)} onNewsletterChanged={this.props.onNewsletterChanged} />\r\n </TableCell>\r\n {this.props.tab === \"all\" && <TableCell align=\"center\">{this.formatState(newsletter.status)}</TableCell>}\r\n {(this.props.tab === \"all\" || this.props.tab === \"enabled\") &&\r\n <TableCell align=\"center\">{this.formatPublishedTime(newsletter.lastIssueSentOn)}</TableCell>\r\n }\r\n {(this.props.tab === \"all\" || this.props.tab === \"enabled\") &&\r\n <TableCell align=\"center\">{this.formatPublishedTime(newsletter.nextIssueSendOn)}</TableCell>\r\n }\r\n {(this.props.tab === \"draft\") &&\r\n <TableCell align=\"center\">{this.formatPublishedTime(newsletter.nextIssueSendOn)}</TableCell>\r\n }\r\n {(this.props.tab === \"disabled\") &&\r\n <TableCell align=\"center\">{this.formatPublishedTime(newsletter.lastIssueSentOn)}</TableCell>\r\n }\r\n {(this.props.tab === \"disabled\" || this.props.tab === \"draft\") &&\r\n <TableCell align=\"center\">{this.formatPublishedTime(newsletter.editedTime)}</TableCell>\r\n }\r\n <TableCell align=\"center\"><ChipLabels chips={newsletter.audiences || []} emptyText=\"All users\" /></TableCell>\r\n {\r\n this.props.tab !== \"draft\" &&\r\n <TableCell align=\"center\" className=\"newsletter-subscribers\">\r\n {(newsletter.status !== 'Draft' || !!newsletter.numberSubscribed) && <span title=\"Subscribers\" className=\"subscriber-icon\"><NotificationsActiveOutlinedIcon fontSize=\"small\" /><span>{numeral(newsletter.numberSubscribed).format('0,0')}</span></span>}\r\n {!!newsletter.numberUnsubscribed && <span title=\"Unsubscribers\" className=\"subscriber-icon\"><NotificationsOffOutlinedIcon fontSize=\"small\" /><span>{numeral(newsletter.numberUnsubscribed).format('0,0')}</span></span>}\r\n </TableCell>\r\n }\r\n </TableRow>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n\r\n private onChangeFilters = (filters: Partial<NewsletterFilterValues>) => {\r\n const updatedFilters = { ...this.state.filters, ...filters };\r\n this.setState({ filters: updatedFilters, hasFiltersApplied: true, isPagedLoad: true });\r\n this.props.fetchPage(1, updatedFilters);\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.setState({ hasFiltersApplied: false, filters: { ...this.getDefaultFilterValues() }, isPagedLoad: true });\r\n this.props.fetchPage(1, {});\r\n }\r\n\r\n\r\n private onSelectNewsletter = (newsletter: NewsletterDigest) => {\r\n if (newsletter.status === \"Draft\")\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/newsletters/\" + newsletter.id);\r\n else\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/newsletters/\" + newsletter.id + \"/dashboard\");\r\n }\r\n\r\n private onChangePage = (page: number, pageAmount: number) => {\r\n this.props.fetchPage(page + 1, this.state.filters, pageAmount);\r\n }\r\n\r\n //Default to descending, if currently descending make it ascending.\r\n private onClickHeader = (descValue: SortStyle | undefined, ascValue: SortStyle | undefined) => {\r\n const rowsPerPage = Cookies.get(ROWS_PER_PAGE_COOKIE_NAMES.DEFAULT);\r\n \r\n if(descValue === undefined || ascValue === undefined) {\r\n return;\r\n }\r\n\r\n if(this.state.sortMethod === descValue) {\r\n this.setState({sortMethod: ascValue, filters: {...this.state.filters, sortType: ascValue}}, () => {\r\n this.onChangePage(0, Number(rowsPerPage) ?? 10);\r\n });\r\n }\r\n else {\r\n this.setState({sortMethod: descValue, filters: {...this.state.filters, sortType: descValue}}, () => {\r\n this.onChangePage(0, Number(rowsPerPage) ?? 10);\r\n });\r\n }\r\n }\r\n\r\n private onSelectAllNewsletters = () => {\r\n if (this.state.selectedItems.length === (this.props.page?.results.length ?? 100))\r\n this.setState({ selectedItems: [] });\r\n else\r\n this.setState({ selectedItems: this.props.page?.results ?? [] });\r\n }\r\n\r\n private isNewsletterSelected = (newsletter: NewsletterDigest): boolean => {\r\n return this.state.selectedItems.findIndex((selectedItem) => selectedItem.id === newsletter.id) !== -1;\r\n }\r\n\r\n private onCheckNewsletter = (ev, newsletter: NewsletterDigest) => {\r\n ev.stopPropagation();\r\n let selectedItems = this.state.selectedItems.slice();\r\n\r\n if (selectedItems.findIndex((selectedItem) => selectedItem.id === newsletter.id) === -1)\r\n selectedItems = selectedItems.concat([newsletter]);\r\n else\r\n selectedItems = selectedItems.filter(selectedItem => selectedItem.id !== newsletter.id);\r\n\r\n this.setState({ selectedItems });\r\n }\r\n\r\n private getToolbar = (): JSX.Element => {\r\n const { selectedItems } = this.state;\r\n let allEnabled = selectedItems.every(s => s.status === \"Enabled\");\r\n let allDisabled = selectedItems.every(s => s.status === \"Disabled\");\r\n\r\n if (!selectedItems.length)\r\n return <React.Fragment></React.Fragment>;\r\n \r\n return (\r\n <TabContentToolbar>\r\n <div>\r\n {this.getToolbarIcon(`${selectedItems.length} selected`, <ClearIcon />, this.onClearAllNewsletters)}\r\n </div>\r\n <div>\r\n {allEnabled &&\r\n <React.Fragment>\r\n {this.getToolbarIcon(\"Disable\", <BlockIcon style={{ transform: \"rotate(90deg)\" }}/>, this.disableNewsletters)}\r\n </React.Fragment>\r\n }\r\n {allDisabled &&\r\n <React.Fragment>\r\n {this.getToolbarIcon(\"Enable\", <CheckCircleOutlineIcon />, this.enableNewsletters)}\r\n </React.Fragment>\r\n }\r\n {this.getToolbarIcon(\"Delete\", <DeleteIcon />, this.deleteSelectedNewsletters)}\r\n </div>\r\n </TabContentToolbar>\r\n );\r\n }\r\n\r\n private getToolbarIcon = (title: string, icon: React.ReactNode, onClick: () => void) => {\r\n return (\r\n <Button aria-label={title.toLowerCase()} color=\"primary\" startIcon={icon} onClick={onClick}>\r\n {title}\r\n </Button>\r\n );\r\n }\r\n\r\n private onClearAllNewsletters = () => {\r\n this.setState({ selectedItems: [] });\r\n }\r\n\r\n private deleteSelectedNewsletters = async () => {\r\n let idsToDelete = this.state.selectedItems.map(i => i.id);\r\n\r\n if (await confirm.show({\r\n title: `Delete Newsletters`,\r\n text: (\r\n <div>\r\n <div>You're about to permanently delete these newsletters. You'll lose all queued and sent issues, reports, and settings associated with these. You cannot undo this action.</div>\r\n <br />\r\n <div>Are you sure?</div>\r\n </div>\r\n ),\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\"\r\n })){\r\n if(idsToDelete.length > 0) {\r\n let result = await this.props.deleteNewsletters(idsToDelete);\r\n \r\n if(result) {\r\n this.props.onNewsletterChanged(\"Newsletters deleted\");\r\n this.onClearAllNewsletters();\r\n }\r\n }\r\n }\r\n }\r\n\r\n private disableNewsletters = async () => {\r\n let idsToDelete = this.state.selectedItems.map(i => i.id);\r\n\r\n if(await confirm.show({\r\n title: \"Disable Newsletters\",\r\n text: \"You're about to disable these newsletters.<br><br>Are you sure?\",\r\n yesText: \"Disable\",\r\n noText: \"Cancel\"\r\n })) {\r\n let result = await this.props.disableNewsletters(idsToDelete)\r\n \r\n if(result) {\r\n this.props.onNewsletterChanged(\"Newsletters disabled\")\r\n this.onClearAllNewsletters();\r\n }\r\n }\r\n }\r\n\r\n private enableNewsletters = async () => {\r\n let idsToDelete = this.state.selectedItems.map(i => i.id);\r\n\r\n if(await confirm.show({\r\n title: \"Enable Newsletters\",\r\n text: \"You're about to enable these newsletters.<br><br>Are you sure?\",\r\n yesText: \"Enable\",\r\n noText: \"Cancel\"\r\n })) {\r\n let result = await this.props.enableNewsletters(idsToDelete);\r\n \r\n if(result) {\r\n this.props.onNewsletterChanged(\"Newsletters enabled\")\r\n this.onClearAllNewsletters();\r\n }\r\n }\r\n }\r\n\r\n private resetSelection = () => {\r\n this.setState({selectedItems: []});\r\n }\r\n}\r\n\r\ninterface ComponentState {\r\n filters: Partial<NewsletterFilterValues>;\r\n hasFiltersApplied: boolean;\r\n isPagedLoad: boolean;\r\n copyNewsletter?: NewsletterDigest;\r\n selectedItems: NewsletterDigest[];\r\n sortMethod: SortStyle;\r\n}\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n tab: NewsletterListComponentTab;\r\n isFetching: boolean;\r\n page?: NewsletterListingPage;\r\n audiences: Audience[];\r\n onCreateCopy: (newsletter: NewsletterDigest) => any;\r\n fetchPage: (pageNumber: number, filters: Partial<NewsletterFilterValues>, pageAmount?: number) => void;\r\n onNewsletterChanged: (successMessage:string) => any;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenant: state.tenant.id,\r\n tenantSettings: state.settings.tenantSettings,\r\n }),\r\n {\r\n deleteNewsletter: actions.deleteNewsletter,\r\n deleteNewsletters: actions.deleteNewsletters,\r\n disableNewsletter: actions.disableNewsletter,\r\n disableNewsletters: actions.disableNewsletters,\r\n enableNewsletter: actions.enableNewsletter,\r\n enableNewsletters: actions.enableNewsletters,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(NewsletterList);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport { NewsletterDigest, NewsletterFilterValues, NewsletterListingPage, NewsletterTags } from \"../../models\";\r\n\r\nimport NewsletterList, { NewsletterListComponentTab } from \"./newsletterList\";\r\n\r\nimport Tabs from \"pages/common/tabs\";\r\n\r\nimport \"../../styles/newsletterListing.sass\";\r\nimport { SortStyle } from \"utils/managementUtils\";\r\nimport * as audiencesActions from \"modules/audiences/actionCreator\";\r\nimport { Audience } from \"modules/audiences\";\r\n\r\nconst componentTabs : NewsletterListComponentTab[] = ['all', 'enabled', 'draft', 'disabled'];\r\nclass NewsletterListing extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n allIsFetching: false,\r\n disabledIsFetching: false,\r\n draftIsFetching: false,\r\n enabledIsFetching: false,\r\n selectedTab: 'all',\r\n audiences: [],\r\n };\r\n }\r\n\r\n public componentWillMount() {\r\n this.fetchLists();\r\n this.props.getAudiences().then(audiences => this.setState({audiences: audiences.filter(a => a.enabled)})) //Get list of enabled audiences for filtering.\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if(this.props.changeCount > 0 && this.props.changeCount !== prevProps.changeCount)\r\n this.fetchLists();\r\n }\r\n\r\n public render() {\r\n const { selectedTab } = this.state;\r\n\r\n return (\r\n <React.Fragment>\r\n <div className=\"newsletter-listing\">\r\n <Tabs\r\n tabs={[\r\n { label: this.getTabLabel(\"All\", (!!this.props.tags && this.props.tags.count) || 0), id: \"all-newsletters-tab\" },\r\n { label: this.getTabLabel(\"Enabled\", (!!this.props.tags && this.props.tags.enabled.length) || 0), dotColor: \"green\", id: \"enabled-newsletters-tab\" },\r\n { label: this.getTabLabel(\"Drafts\", (!!this.props.tags && this.props.tags.draft.length) || 0), dotColor: \"yellow\", id: \"draft-newsletters-tab\" },\r\n { label: this.getTabLabel(\"Disabled\", (!!this.props.tags && this.props.tags.disabled.length) || 0), dotColor: \"grey\", id: \"disabled-newsletters-tab\" }\r\n ]}\r\n selectedTab={componentTabs.indexOf(this.state.selectedTab)}\r\n onSelectTab={this.onSelectTab}\r\n />\r\n <NewsletterList \r\n show={selectedTab === 'all'} \r\n tab='all' \r\n page={this.state.all} \r\n isFetching={this.state.allIsFetching} \r\n fetchPage={this.fetchAll} \r\n onCreateCopy={this.props.onCreateCopy} \r\n onNewsletterChanged={this.props.onNewsletterChanged} \r\n audiences={this.state.audiences}\r\n />\r\n <NewsletterList \r\n show={selectedTab === 'enabled'} \r\n tab='enabled' page={this.state.enabled} \r\n isFetching={this.state.enabledIsFetching} \r\n fetchPage={this.fetchEnabled} \r\n onCreateCopy={this.props.onCreateCopy} \r\n onNewsletterChanged={this.props.onNewsletterChanged} \r\n audiences={this.state.audiences}\r\n />\r\n <NewsletterList \r\n show={selectedTab === 'draft'} \r\n tab='draft' page={this.state.draft} \r\n isFetching={this.state.draftIsFetching} \r\n fetchPage={this.fetchDrafts} \r\n onCreateCopy={this.props.onCreateCopy} \r\n onNewsletterChanged={this.props.onNewsletterChanged} \r\n audiences={this.state.audiences}\r\n />\r\n <NewsletterList \r\n show={selectedTab === 'disabled'} \r\n tab='disabled' page={this.state.disabled} \r\n isFetching={this.state.disabledIsFetching} \r\n fetchPage={this.fetchDisabled} \r\n onCreateCopy={this.props.onCreateCopy} \r\n onNewsletterChanged={this.props.onNewsletterChanged} \r\n audiences={this.state.audiences}\r\n />\r\n </div>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n /* Re-fetches all lists, first fetching the current tab, then subsequent ones */\r\n private fetchLists = () => {\r\n const fetches = [this.fetchAll, this.fetchEnabled, this.fetchDrafts, this.fetchDisabled]\r\n const firstFetchIndex = componentTabs.indexOf(this.state.selectedTab);\r\n const firstFetch = fetches[firstFetchIndex];\r\n firstFetch(1, {sortType: SortStyle.titleDesc}).then(() => {\r\n fetches.forEach((fetch,index)=> {\r\n if(index !== firstFetchIndex) fetch(1, {sortType: SortStyle.titleDesc});\r\n } )\r\n });\r\n }\r\n\r\n private fetchAll = (pageNumber: number, filters: Partial<NewsletterFilterValues>, pageAmount?: number): Promise<void> => {\r\n this.setState({allIsFetching: true});\r\n return this.props.getAllNewsletters(pageNumber, filters, pageAmount).then(page => {\r\n this.setState({all:page, allIsFetching:false});\r\n });\r\n }\r\n\r\n private fetchEnabled = (pageNumber: number, filters: Partial<NewsletterFilterValues>, pageAmount?: number): Promise<void> => {\r\n this.setState({enabledIsFetching: true});\r\n return this.props.getEnabledNewsletters(pageNumber, filters, pageAmount).then(page => {\r\n this.setState({enabled:page, enabledIsFetching:false});\r\n });\r\n }\r\n\r\n private fetchDrafts = (pageNumber: number, filters: Partial<NewsletterFilterValues>, pageAmount?: number): Promise<void> => {\r\n this.setState({draftIsFetching: true});\r\n return this.props.getDraftNewsletters(pageNumber, filters, pageAmount).then(page => {\r\n this.setState({draft:page, draftIsFetching:false});\r\n });\r\n }\r\n\r\n private fetchDisabled = (pageNumber: number, filters: Partial<NewsletterFilterValues>, pageAmount?: number): Promise<void> => {\r\n this.setState({disabledIsFetching: true});\r\n return this.props.getDisabledNewsletters(pageNumber, filters, pageAmount).then(page => {\r\n this.setState({disabled:page, disabledIsFetching:false});\r\n });\r\n }\r\n\r\n private getTabLabel = (label: string, count?: number): string => {\r\n if (!!count)\r\n return `${label} (${count})`;\r\n return label;\r\n }\r\n\r\n private onSelectTab = (index: number) => {\r\n const selectedTab = componentTabs[index];\r\n this.setState({...this.state, selectedTab: selectedTab});\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n tags: NewsletterTags | null;\r\n changeCount: number;\r\n onCreateCopy: (newsletter: NewsletterDigest) => any;\r\n onNewsletterChanged: (successMessage:string) => any;\r\n}\r\ninterface ComponentState {\r\n audiences: Audience[];\r\n\r\n all?: NewsletterListingPage;\r\n enabled?: NewsletterListingPage;\r\n draft?: NewsletterListingPage;\r\n disabled?: NewsletterListingPage;\r\n\r\n allIsFetching: boolean;\r\n enabledIsFetching: boolean;\r\n draftIsFetching: boolean;\r\n disabledIsFetching: boolean;\r\n\r\n selectedTab: NewsletterListComponentTab;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ownProps,\r\n {\r\n getAllNewsletters: actions.getAllNewsletters,\r\n getDisabledNewsletters: actions.getDisabledNewsletters,\r\n getDraftNewsletters: actions.getDraftNewsletters,\r\n getEnabledNewsletters: actions.getEnabledNewsletters,\r\n getAudiences: audiencesActions.getAudiences,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(NewsletterListing);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as actions from \"../../actionCreator\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogContentText from \"@mui/material/DialogContentText\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\nimport { NewsletterDigest, SaveNewsletterModelStateErrors } from \"modules/newsletters\";\r\n\r\nimport _ from \"lodash\";\r\nimport \"../../styles/dialogs.sass\";\r\n\r\nclass CopyNewsletterDialog extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {newTitle: \"\"};\r\n }\r\n\r\n public render() {\r\n return (\r\n <Dialog open={true} maxWidth={false} scroll=\"paper\" onClose={() => this.props.onClose(null)} classes={{ paper: \"newsletter-dialog\" }}>\r\n <DialogTitle className=\"newsletter-dialog-title\">\r\n <div>Duplicate</div>\r\n <IconButton onClick={() => this.props.onClose(null)} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </DialogTitle>\r\n <DialogContent>\r\n <DialogContentText>\r\n A duplicate of {this.props.copyingNewsletter.title} will be created and saved as a draft.\r\n </DialogContentText>\r\n <TextField\r\n autoFocus\r\n variant=\"outlined\"\r\n margin=\"dense\"\r\n fullWidth\r\n id=\"newTitle\"\r\n value={this.state.newTitle}\r\n error={!!this.state.modelErrors && _.some(_.values(this.state.modelErrors))}\r\n helperText={!!this.state.modelErrors && _.first(_.values(this.state.modelErrors))}\r\n placeholder=\"New title\"\r\n autoComplete=\"off\"\r\n onChange={(event) => this.setState({newTitle: event.target.value})}\r\n />\r\n </DialogContent>\r\n <DialogActions>\r\n <div>\r\n <Button\r\n variant=\"text\"\r\n onClick={() => this.props.onClose(null)}\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n disabled={!this.state.newTitle}\r\n onClick={this.onCopyNewsletter}\r\n >\r\n Duplicate\r\n </Button>\r\n </div>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n }\r\n\r\n private onCopyNewsletter = () => {\r\n this.props.cloneNewsletter(this.props.copyingNewsletter.id, this.state.newTitle)\r\n .then(result => {\r\n if(!!result.success){\r\n this.setState({modelErrors: null});\r\n this.props.onClose(result.success.id);\r\n }else if(!!result.error){\r\n this.setState({modelErrors: result.error.ModelState});\r\n }\r\n })\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n copyingNewsletter: NewsletterDigest;\r\n onClose: (newNewsletterId: string | null) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n newTitle: string;\r\n modelErrors?: SaveNewsletterModelStateErrors | null;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ownProps,\r\n {\r\n cloneNewsletter: actions.cloneNewsletter\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(CopyNewsletterDialog);","//For use inside the templateThemeSearchAndSelect file.\r\n//Intended to be used in an array.for loop.\r\nimport { Divider, List } from '@mui/material';\r\nimport * as React from 'react';\r\nimport KeyboardArrowDownIcon from \"@mui/icons-material/KeyboardArrowDown\";\r\nimport KeyboardArrowUpIcon from \"@mui/icons-material/KeyboardArrowUp\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport '../../styles/themes.sass'\r\nimport { NewsletterTheme } from 'modules/newsletters/models';\r\nimport MoreOptionsIconButton from 'modules/common/components/buttons/moreOptionsIconButton';\r\nimport moment from 'moment';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport { push } from 'react-router-redux';\r\nimport MoreOptionsItem from 'modules/common/components/moreOptionsItem';\r\n\r\ninterface ComponentProps {\r\n theme: NewsletterTheme;\r\n isOpen: boolean;\r\n setOpen: (index: number, toSet: boolean) => void;\r\n index: number;\r\n deleteTheme: (id: string, isCustom: boolean) => void;\r\n defaultTheme: (id: string, isCustom: boolean) => void;\r\n}\r\n\r\nconst ThemeDisplayWithDropdown: React.FunctionComponent<PropsWithRedux> = ( {theme, isOpen, setOpen, index, defaultTheme, deleteTheme, tenantId, redirectTo} ) => {\r\n const [canSeeKebab, setCanSeeKebab] = React.useState(false);\r\n\r\n let dateToDisplay = moment(new Date(theme.lastModifiedOnUTC)).format(\"MMM D, YYYY\");\r\n let nameToDisplay = theme.lastModifiedByDisplayName?.substring(0, 27) + (theme.lastModifiedByDisplayName?.length > 27 ? \"...\" : \"\");\r\n\r\n return (\r\n <div style={{border: \"1px solid #E1E5E8\", borderRadius: \"5px\"}} onMouseEnter={() => setCanSeeKebab(true)} onMouseLeave={() => setCanSeeKebab(false)}>\r\n <div style={{display: \"flex\", flexDirection: \"row\"}}>\r\n <div style={{display: \"flex\", flexDirection: \"row\", cursor: \"pointer\", width: \"100%\"}} onClick={() => setOpen(index, !isOpen)}>\r\n <div style={{display: \"flex\", flexDirection: \"column\", padding: \"8px 0\"}}>\r\n <span style={{fontSize: \"16px\", marginLeft: \"12px\"}}>\r\n {theme.name}\r\n {theme.isDefault && <span style={{backgroundColor: \"#F2F2F2\", fontSize: \"12px\", marginLeft: \"10px\", fontWeight: 500}}>DEFAULT</span>}\r\n </span>\r\n {!theme.isCustom \r\n ? <span style={{fontSize: \"13px\", marginLeft: \"12px\"}}>Standard template theme</span> \r\n : <span style={{fontSize: \"13px\", marginLeft: \"12px\"}}>{theme.lastModifiedOnUTC ? \"Last modified on \" + dateToDisplay + \" by \" + nameToDisplay : \"Custom template theme\"}</span>\r\n }\r\n </div>\r\n <div style={{display: \"flex\", alignItems: \"center\", marginLeft: \"auto\", marginRight: \"20px\"}}>\r\n {canSeeKebab && \r\n <MoreOptionsIconButton className='more-theme-options-kebab' onClick={(e) => e.stopPropagation()}>\r\n <List disablePadding>\r\n <MoreOptionsItem\r\n disabled={!theme.isCustom}\r\n text=\"Edit\"\r\n onClick={() => {\r\n redirectTo(`/${tenantId}/admin/newsletters/theme/${theme.id}`);\r\n }}\r\n />\r\n <MoreOptionsItem\r\n text=\"Delete\"\r\n onClick={async () => {\r\n if (await confirm.show({\r\n title: \"Delete '\" + theme.name + \"'\",\r\n text: (\r\n <div>\r\n <div>You're about to permanently delete this theme. \r\n This will not affect newsletters that used these settings.\r\n You cannot undo this action.</div>\r\n <br />\r\n <div>Are you sure?</div>\r\n </div>\r\n ),\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\"\r\n })) {\r\n deleteTheme(theme.id, theme.isCustom);\r\n }\r\n }}\r\n disabled={!theme.isCustom || theme.isDefault}\r\n />\r\n <Divider/>\r\n <MoreOptionsItem\r\n text=\"Set as default\"\r\n onClick={() => {\r\n defaultTheme(theme.id, theme.isCustom);\r\n }}\r\n disabled={theme.isDefault}\r\n />\r\n </List>\r\n </MoreOptionsIconButton>\r\n }\r\n {isOpen\r\n ? <KeyboardArrowUpIcon style={{fontSize: \"28px\", float: \"right\"}}/> \r\n : <KeyboardArrowDownIcon style={{fontSize: \"28px\", float: \"right\"}}/> \r\n }\r\n </div>\r\n </div>\r\n </div>\r\n {isOpen && \r\n <div className=\"theme-section\">\r\n <div style={{display: \"flex\", flexDirection: \"row\", width: \"100%\", marginTop: \"20px\"}}>\r\n <div className='left-theme-label'>Email background</div>\r\n <div style={{height: \"20px\", width: \"20px\", backgroundColor: theme.emailBackground, borderRadius: \"3px\", border: \"1px solid #DDE1E5\"}}></div>\r\n <div className='right-theme-label'>Secondary background</div>\r\n <div style={{height: \"20px\", width: \"20px\", backgroundColor: theme.secondaryBackground, borderRadius: \"3px\", border: \"1px solid #DDE1E5\"}}></div>\r\n </div>\r\n\r\n <div style={{display: \"flex\", flexDirection: \"row\", width: \"100%\", marginTop: \"10px\"}}>\r\n <div className='left-theme-label'>Primary background</div>\r\n <div style={{height: \"20px\", width: \"20px\", backgroundColor: theme.primaryBackground, borderRadius: \"3px\", border: \"1px solid #DDE1E5\"}}></div>\r\n <div className='right-theme-label'>Secondary text</div>\r\n <div style={{height: \"20px\", width: \"20px\", backgroundColor: theme.secondaryText, borderRadius: \"3px\", border: \"1px solid #DDE1E5\"}}></div>\r\n </div>\r\n\r\n <div style={{display: \"flex\", flexDirection: \"row\", width: \"100%\", marginTop: \"10px\"}}>\r\n <div className='left-theme-label'>Primary text</div>\r\n <div style={{height: \"20px\", width: \"20px\", backgroundColor: theme.primaryText, borderRadius: \"3px\", border: \"1px solid #DDE1E5\"}}></div>\r\n <div className='right-theme-label'>Link text</div>\r\n <div style={{height: \"20px\", width: \"20px\", backgroundColor: theme.linkText, borderRadius: \"3px\", border: \"1px solid #DDE1E5\"}}></div>\r\n </div>\r\n </div>}\r\n </div>\r\n )\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n redirectTo: push\r\n }\r\n );\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(ThemeDisplayWithDropdown);","import { Button, Dialog, DialogContent, DialogTitle, Divider, IconButton, Link, TextField } from '@mui/material';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\n\r\nimport \"../../styles/dialogs.sass\"\r\nimport SearchIcon from '@mui/icons-material/Search';\r\nimport { NewsletterTheme } from 'modules/newsletters/models';\r\nimport { actions } from 'modules/newsletters';\r\nimport Loading from 'modules/common/components/loading';\r\nimport ThemeDisplayWithDropdown from 'modules/newsletters/edit/components/themeDisplayWithDropdown';\r\nimport Disclaimer from 'modules/common/components/disclaimer';\r\nimport InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';\r\nimport ErrorSnackbar from 'modules/common/components/snackbars/errorSnackbar';\r\n\r\ninterface ThemeListItem {\r\n theme: NewsletterTheme;\r\n isOpen: boolean;\r\n}\r\n\r\nclass ThemeModal extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n this.state = {\r\n searchText: \"\",\r\n filteredThemes: [],\r\n themes: [],\r\n errorMessage: \"\"\r\n }\r\n }\r\n\r\n private loadThemes = () => {\r\n this.props.getThemes().then((themes) => {\r\n if(!!themes){\r\n let sortedThemes = themes\r\n .sort((a, b) => a.name.localeCompare(b.name));\r\n\r\n let mappedThemes = sortedThemes\r\n .map(t => ({theme: t, isOpen: false}));\r\n\r\n this.setState({themes: sortedThemes, filteredThemes: mappedThemes});\r\n }\r\n })\r\n }\r\n\r\n public componentDidMount = () => {\r\n this.loadThemes();\r\n }\r\n\r\n //Takes in a list of themes and both sorts and updates the list.\r\n private updateThemes = (themes: NewsletterTheme[], updateNonFiltered: boolean) => {\r\n let sortedThemes = themes\r\n .sort((a, b) => a.name.localeCompare(b.name));\r\n\r\n let mappedThemes = sortedThemes\r\n .map(t => ({theme: t, isOpen: false}));\r\n\r\n if(updateNonFiltered)\r\n this.setState({themes: sortedThemes, filteredThemes: mappedThemes});\r\n else\r\n this.setState({filteredThemes: mappedThemes});\r\n }\r\n\r\n private deleteTheme = async(id: string, isCustom: boolean) => {\r\n let themeToRemove = this.state.themes.find(t => t.id === id);\r\n if(!!themeToRemove) {\r\n if(themeToRemove.isCustom && !themeToRemove.isDefault) {\r\n let newThemes = await this.props.deleteTheme(id, isCustom);\r\n if(newThemes.length > 0) {\r\n this.updateThemes(newThemes, true);\r\n }\r\n }\r\n else {\r\n this.setState({errorMessage: \"Cannot remove this theme, is default or standard.\"});\r\n }\r\n }\r\n else {\r\n this.setState({errorMessage: \"Theme does not exist.\"});\r\n }\r\n }\r\n\r\n private setDefaultTheme = async(id: string, isCustom: boolean) => {\r\n let themeToSet = this.state.themes.find(t => t.id === id);\r\n if(!!themeToSet) {\r\n await this.props.setDefault(id, isCustom);\r\n this.loadThemes();\r\n }\r\n else {\r\n this.setState({errorMessage: \"Theme does not exist.\"});\r\n }\r\n }\r\n \r\n public render() {\r\n const totalOpen = this.state.filteredThemes.filter(f => f.isOpen).length;\r\n\r\n return (\r\n <React.Fragment>\r\n <Dialog maxWidth=\"md\" fullWidth scroll=\"paper\" open={this.props.dialogOpen} onClose={this.props.onClose} classes={{ paper: \"newsletter-dialog\" }}>\r\n <ErrorSnackbar errorMessage={this.state.errorMessage} clearErrorMessage={this.clearErrorMessage} />\r\n <DialogTitle className=\"newsletter-dialog-title\">\r\n <div>Manage Themes</div>\r\n <div>\r\n <IconButton onClick={this.props.onClose} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent style={{height: \"700px\"}}>\r\n {this.state.themes.length === 0 && //can do this because there's always at least 1 theme.\r\n <div>\r\n <Loading />\r\n </div>\r\n }\r\n {this.state.themes.length > 0 &&\r\n <div style={{marginRight: \"4px\", paddingTop: \"8px\"}}>\r\n\r\n <Disclaimer\r\n icon={<InfoOutlinedIcon />}\r\n text={\r\n <React.Fragment>\r\n <span className=\"successfully-scanned\">\r\n Set a theme as default to automatically load its colors and images when new newsletters are created. \r\n Standard themes cannot be edited or deleted. <Link onClick={() => window.open(\"https://support.sparrowconnected.com/en/managing-newsletter-themes\")} underline=\"always\">Learn more</Link>.\r\n </span>\r\n </React.Fragment>\r\n }>\r\n </Disclaimer>\r\n \r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n fullWidth\r\n value={this.state.searchText}\r\n placeholder=\"Search theme or author\"\r\n InputProps={{\r\n startAdornment: <SearchIcon className=\"search-icon\" />,\r\n endAdornment: this.state.filteredThemes.length !== this.state.themes.length \r\n && <CloseIcon htmlColor=\"grey\" style={{cursor: \"pointer\"}} onClick={this.resetSearch}/>\r\n }}\r\n onChange={(e) => this.onUpdateTextToSearch(e.target.value)}\r\n onKeyUp={this.onKeyPress}\r\n style={{marginTop: \"14px\", width: \"82%\"}}\r\n />\r\n \r\n {totalOpen >= 1\r\n && <Button style={{marginTop: \"14px\", float: \"right\"}} onClick={() => this.setFlip(false)}>\r\n Collapse All\r\n </Button>\r\n }\r\n {totalOpen === 0\r\n && <Button style={{marginTop: \"14px\", float: \"right\"}} onClick={() => this.setFlip(true)}>\r\n Expand All\r\n </Button>\r\n }\r\n\r\n <div style={{marginTop: \"15px\", width: \"100%\", maxHeight: \"500px\", overflowY: \"auto\", minHeight: \"500px\"}}>\r\n {this.state.filteredThemes.map((themeData, key) => \r\n <ThemeDisplayWithDropdown \r\n key={key} \r\n theme={themeData.theme} \r\n isOpen={themeData.isOpen} \r\n setOpen={this.setIndexOpen} \r\n index={key}\r\n deleteTheme={this.deleteTheme}\r\n defaultTheme={this.setDefaultTheme}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n }\r\n\r\n <div>\r\n <Divider />\r\n <Button style={{marginTop: \"10px\", float: \"right\"}} onClick={() => this.props.onClose()}>Back to manage newsletters</Button>\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private clearErrorMessage = () => {\r\n this.setState({ errorMessage: \"\" });\r\n }\r\n\r\n private onUpdateTextToSearch = (toSet: string) => {\r\n this.setState({searchText: toSet})\r\n }\r\n\r\n private setIndexOpen = (index: number, toSet: boolean) => {\r\n let newState = this.state.filteredThemes;\r\n if(index < this.state.filteredThemes.length) {\r\n newState[index].isOpen = toSet;\r\n }\r\n this.setState({filteredThemes: newState});\r\n }\r\n\r\n private setFlip = (toSet: boolean) => {\r\n if(toSet) {\r\n let newFiltered = this.state.filteredThemes;\r\n newFiltered = newFiltered.map(theme => {\r\n theme.isOpen = true;\r\n return theme;\r\n });\r\n this.setState({filteredThemes: newFiltered});\r\n }\r\n else\r\n {\r\n let newFiltered = this.state.filteredThemes;\r\n newFiltered = newFiltered.map(theme => {\r\n theme.isOpen = false;\r\n return theme;\r\n });\r\n this.setState({filteredThemes: newFiltered});\r\n }\r\n }\r\n\r\n private onKeyPress = (key) => {\r\n if (key.keyCode === 13 && !!this.state.searchText) {\r\n var newThemes = this.state.themes\r\n .filter(t => t.name.toLowerCase().includes(this.state.searchText.toLowerCase())\r\n || t.lastModifiedByDisplayName?.toLowerCase()\r\n .includes(this.state.searchText.toLowerCase()))\r\n this.updateThemes(newThemes, false);\r\n }\r\n else if(key.keyCode === 13 && !this.state.searchText) {\r\n this.resetSearch();\r\n }\r\n }\r\n\r\n private resetSearch = () => {\r\n this.updateThemes(this.state.themes, false);\r\n this.setState({searchText: \"\"});\r\n }\r\n\r\n}\r\n\r\ninterface ComponentProps {\r\n onClose: () => any;\r\n dialogOpen: boolean;\r\n}\r\n\r\ninterface ComponentState {\r\n searchText: string;\r\n filteredThemes: ThemeListItem[];\r\n themes: NewsletterTheme[];\r\n errorMessage: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => \r\n ({\r\n ...ownProps,\r\n tenant: state.tenant.id,\r\n }),\r\n {\r\n getThemes: actions.getThemes,\r\n deleteTheme: actions.deleteTheme,\r\n setDefault: actions.setThemeDefault\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(ThemeModal);","import { Button, ButtonProps, Dialog, DialogActions, DialogContent, DialogTitle } from \"@mui/material\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { IdNamePair } from \"modules/common/models\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport React from \"react\";\r\nimport { Address } from \"modules/newsletters/models\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport \"../../styles/associatedNewslettersDialog.sass\";\r\n\r\ninterface IAssociatedNewslettersDialogProps {\r\n show: boolean;\r\n onClose: () => void;\r\n associatedNewsletters: IdNamePair<string, string>[];\r\n isLoading: boolean;\r\n senderAddressCheck?: Address;\r\n backButtonLabel: string;\r\n backButtonProps?: ButtonProps;\r\n}\r\n\r\nconst AssociatedNewslettersDialog: React.FC<PropsWithRedux> = ({\r\n show,\r\n onClose,\r\n associatedNewsletters,\r\n isLoading,\r\n senderAddressCheck,\r\n tenantId,\r\n backButtonLabel,\r\n backButtonProps\r\n}) => {\r\n const associatedNewslettersMap = (): JSX.Element[] =>\r\n associatedNewsletters.map(newsletter =>\r\n <li key={newsletter.id}>\r\n <span\r\n onClick={() => {\r\n const location: string = window.location.href;\r\n const segments: string[] = location.split(tenantId);\r\n window.open(`${segments[0]}${tenantId}/admin/newsletters/${newsletter.id}/dashboard`);\r\n }}\r\n className=\"newsletters-item\"\r\n >\r\n {newsletter.name}\r\n </span>\r\n </li>\r\n );\r\n \r\n return <Dialog open={show} className=\"associated-newsletters-dialog\">\r\n <DialogTitle className=\"associated-newsletters-dialog-title\">\r\n <div className=\"sender-title-container\">\r\n Sender Email in Use\r\n <IconButton onClick={onClose} size=\"small\" edge=\"end\">\r\n <CloseIcon/>\r\n </IconButton>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent className=\"associated-newsletters-dialog-content\">\r\n {\r\n isLoading &&\r\n <div className=\"loading-container\">\r\n <Loading padding={12}/>\r\n </div>\r\n }\r\n {\r\n !isLoading && associatedNewsletters.length > 0 &&\r\n <>\r\n <div className=\"sender-description-container\">\r\n <b>{senderAddressCheck?.fromEmailName ?? \"\"}</b>, <b>{senderAddressCheck?.fromEmailAddress ?? \"\"}</b> cannot be deleted. The email is currently used in:\r\n </div>\r\n <ul className=\"newsletters-list\">\r\n {associatedNewslettersMap()}\r\n </ul>\r\n </>\r\n }\r\n </DialogContent>\r\n <DialogActions className=\"associated-newsletters-dialog-actions\">\r\n <Button color=\"primary\" variant=\"contained\" onClick={onClose} {...backButtonProps}>\r\n {backButtonLabel}\r\n </Button>\r\n </DialogActions>\r\n </Dialog>;\r\n};\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IAssociatedNewslettersDialogProps) => \r\n ({ \r\n ...ownProps,\r\n tenantId: state.tenant.id,\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n \r\nexport default connector(AssociatedNewslettersDialog);\r\n","import * as React from \"react\";\r\nimport * as actions from \"../actionCreator\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\n\r\nimport EmailActivityLog from \"../common/dialogs/emailActivityLog\";\r\nimport GlobalSettings from \"./components/globalSettings\";\r\nimport { MoreOptions } from \"./components/moreOptions\";\r\nimport NewsletterListing from \"./components/newsletterListing\";\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Header from \"pages/common/header\";\r\nimport MainContent from \"pages/common/mainContent\";\r\n\r\nimport \"../styles/dialogs.sass\";\r\nimport { Button } from \"@mui/material\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { Address, NewsletterDigest, NewsletterTags } from \"..\";\r\n\r\nimport _ from \"lodash\";\r\nimport CopyNewsletterDialog from \"../common/dialogs/copyNewsletterDialog\";\r\nimport ThemeModal from \"./components/themeModal\";\r\nimport SnackbarWrapper from \"modules/common/components/snackbars/snackbarWrapper\";\r\nimport { IdNamePair } from \"modules/common/models\";\r\nimport AssociatedNewslettersDialog from \"./components/associatedNewslettersDialog\";\r\n\r\ninterface RouteParams {\r\n tenant: string;\r\n}\r\n\r\nconst NewsletterManagementPage : React.FunctionComponent<PropsWithRedux> = (props) => {\r\n const { getNewsletterTags } = props;\r\n const [changeCount, setChangeCount] = useState(0);\r\n const [showActivityLog, setShowActivityLog] = useState(false);\r\n const [showGlobalSettings, setShowGlobalSettings] = useState(false);\r\n const [showThemeModal, setShowThemeModal] = useState(window.location.href.toString().includes(\"managethemes\"));\r\n const [successMessage, setSuccessMessage] = useState(null as string | null);\r\n const [errorMessage, setErrorMessage] = useState(null as string | null);\r\n const [newsletters, setNewsletters] = useState(null as (NewsletterTags | null));\r\n const [copyNewsletter, setCopyNewsletter] = useState(null as (NewsletterDigest | null));\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [showAssociatedNewslettersDialog, setShowAssociateNewslettersDialog] = useState(false);\r\n const [associatedNewsletters, setAssociatedNewsletters] = useState<IdNamePair<string, string>[]>([]);\r\n const [associatedSender, setAssociatedSender] = useState<Address | undefined>(undefined);\r\n\r\n const [dialogOpen, setDialogOpen] = useState(true);\r\n const [confirmOpen, setConfirmOpen] = useState(false);\r\n\r\n useEffect(() => { getNewsletterTags()\r\n .then((tags) => {\r\n setNewsletters(tags);\r\n }); },[changeCount, getNewsletterTags]);\r\n\r\n const newsletterTags = _.orderBy(_.concat((newsletters && newsletters.enabled) || [], (newsletters && newsletters.disabled) || []), t=>t.name);\r\n\r\n const onCloseAssociatedNewslettersDialog = () => {\r\n setShowAssociateNewslettersDialog(false);\r\n setDialogOpen(true);\r\n }\r\n\r\n const closeDelete = () => {\r\n setConfirmOpen(false);\r\n setDialogOpen(true);\r\n }\r\n\r\n const onCheckAssociatedNewsletters = async (senderDetails: Address) => {\r\n setIsLoading(true);\r\n setDialogOpen(false);\r\n setShowAssociateNewslettersDialog(true);\r\n const associatedNewsletters = await props.getAssociatedNewsletters(senderDetails.fromEmailName, senderDetails.fromEmailAddress);\r\n setAssociatedNewsletters(associatedNewsletters);\r\n setAssociatedSender(senderDetails);\r\n setIsLoading(false);\r\n }\r\n\r\n const onConfirmDelete = () => {\r\n setDialogOpen(false);\r\n setConfirmOpen(true);\r\n }\r\n\r\n const handleCloseThemeModal = () => {\r\n setShowThemeModal(false);\r\n\r\n //If we've gotten onto the page via a forced manage theme open, the first time we close it redirect them to the regular page.\r\n if(window.location.href.toString().includes(\"managethemes\")) {\r\n let page = `/${props.tenant}/admin/newsletters`;\r\n props.history.replace(page);\r\n }\r\n }\r\n\r\n return (\r\n <BasePage fullWidth>\r\n <Header\r\n title=\"Manage Newsletters\"\r\n rightComponent={\r\n <React.Fragment>\r\n <MoreOptions\r\n onShowActivityLog={() => setShowActivityLog(true)}\r\n onShowGlobalSettings={() => setShowGlobalSettings(true)}\r\n onShowTemplateThemes={() => setShowThemeModal(true)}\r\n />\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n startIcon={<AddIcon />}\r\n onClick={() => props.redirectTo(\"/\" + props.match.params.tenant + \"/admin/newsletters/new\")}\r\n >\r\n New Newsletter\r\n </Button>\r\n </React.Fragment>\r\n }\r\n />\r\n <MainContent>\r\n <div className=\"authoring-page\">\r\n <NewsletterListing\r\n tags={newsletters}\r\n changeCount={changeCount}\r\n onCreateCopy={(newsletterDigest) => setCopyNewsletter(newsletterDigest)}\r\n onNewsletterChanged={(message) => {setSuccessMessage(message); setChangeCount(changeCount+1);}}\r\n />\r\n </div>\r\n { showActivityLog && <EmailActivityLog newsletterTags={newsletterTags} onClose={() => setShowActivityLog(false)} />}\r\n { showGlobalSettings && \r\n <GlobalSettings \r\n onClose={() => setShowGlobalSettings(false)} \r\n dialogOpen={dialogOpen} \r\n onCheckAssociatedNewsletters={onCheckAssociatedNewsletters} \r\n confirmOpen={confirmOpen} \r\n openConfirm={onConfirmDelete} \r\n closeConfirm={closeDelete} \r\n /> \r\n }\r\n { showThemeModal && <ThemeModal dialogOpen={showThemeModal} onClose={() => handleCloseThemeModal()} />}\r\n {!!copyNewsletter && <CopyNewsletterDialog\r\n copyingNewsletter={copyNewsletter}\r\n onClose={(newNewsletterId) =>\r\n {\r\n setCopyNewsletter(null);\r\n if(!!newNewsletterId){\r\n setSuccessMessage(\"Newsletter copied\");\r\n props.redirectTo(`/${props.match.params.tenant}/admin/newsletters/${newNewsletterId}`);\r\n }\r\n }\r\n } />}\r\n {\r\n associatedNewsletters &&\r\n <AssociatedNewslettersDialog \r\n show={showAssociatedNewslettersDialog} \r\n onClose={onCloseAssociatedNewslettersDialog} \r\n isLoading={isLoading} \r\n associatedNewsletters={associatedNewsletters}\r\n senderAddressCheck={associatedSender}\r\n backButtonLabel=\"Back to global settings\"\r\n />\r\n }\r\n <SnackbarWrapper open={!!successMessage} style={{ top: \"60px\" }} autoHideDuration={8000} onClose={() => setSuccessMessage(null)} severity=\"success\" message={successMessage} />\r\n <SnackbarWrapper open={!!errorMessage} style={{ top: \"60px\" }} autoHideDuration={8000} onClose={() => setErrorMessage(null)} severity=\"error\" message={errorMessage} />\r\n </MainContent>\r\n </BasePage>\r\n );\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: RouteComponentProps<RouteParams>) =>\r\n ({\r\n ...ownProps,\r\n tenant: state.tenant.id\r\n }),\r\n {\r\n redirectTo: push,\r\n getNewsletterTags: actions.getNewsletterTags,\r\n getAssociatedNewsletters: actions.getAssociatedNewsletters\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(NewsletterManagementPage);\r\n","import React from \"react\"\r\n\r\nimport Grid from \"@mui/material/Grid\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\n\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n grid: {\r\n [theme.breakpoints.up(\"lg\")]: {\r\n overflowY: \"hidden\"\r\n }\r\n },\r\n gridItem: {\r\n [theme.breakpoints.up(\"lg\")]: {\r\n height: \"100%\",\r\n \"& > div\": {\r\n maxHeight: \"100%\"\r\n },\r\n \"&:last-child > div\": {\r\n height: \"100%\"\r\n }\r\n }\r\n }\r\n })\r\n);\r\n\r\n\r\nconst Columns: React.FunctionComponent<ComponentProps> = props => {\r\n const classes = useStyles();\r\n\r\n return (\r\n <React.Fragment>\r\n {props.heading &&\r\n <Grid container justifyContent=\"center\" spacing={2}>\r\n <Grid item xs={12}>\r\n {props.heading}\r\n </Grid>\r\n </Grid>\r\n }\r\n <Grid container justifyContent=\"center\" spacing={2} className={classes.grid}>\r\n <Grid item xs={12} lg={4} xl={props.slim ? 3 : 4} className={classes.gridItem}>\r\n {props.leftComponent}\r\n </Grid>\r\n <Grid item xs={12} lg={8} xl={props.slim ? 9 : 8} className={classes.gridItem}>\r\n {props.rightComponent}\r\n </Grid>\r\n </Grid>\r\n </React.Fragment>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n heading?: JSX.Element;\r\n slim?: boolean;\r\n leftComponent: JSX.Element;\r\n rightComponent: JSX.Element;\r\n}\r\n\r\nexport default Columns;","import React from \"react\"\r\n\r\nimport Paper from \"@mui/material/Paper\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\n\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\n\r\nconst useStyles = (footerHeight: number) => makeStyles((theme: Theme) =>\r\n createStyles({\r\n mainContent: {\r\n boxSizing: \"border-box\",\r\n flexShrink: 1,\r\n flexGrow: 0,\r\n maxHeight: `calc(100% - ${footerHeight*2}px)`,\r\n overflowY: \"scroll\",\r\n boxShadow:'0px 2px 1px -1px rgb(0 0 0 / 6%), 0px 1px 1px 0px rgb(0 0 0 / 4%), 0px 1px 3px 0px rgb(0 0 0 / 2%)',\r\n \"&.add-content-padding\": {\r\n padding: 20\r\n },\r\n \"&.add-content-padding-10\": {\r\n padding: 10\r\n },\r\n \"&.add-margin-top\": {\r\n marginTop: 15\r\n }\r\n }\r\n })\r\n);\r\n\r\n\r\nconst MainContentWithFooter: React.FunctionComponent<ComponentProps> = props => {\r\n const classes = useStyles(props.footerHeight)();\r\n\r\n return (\r\n <div>\r\n {!!props.headerContent &&\r\n <div style={{paddingBottom: \"12px\"}}>\r\n {props.headerContent}\r\n </div>\r\n }\r\n <Paper id={props.id} square={true} elevation={0} className={`${classes.mainContent} ${props.addPadding ? \"add-content-padding\" : \"\"} ${props.addPadding10 ? \"add-content-padding-10\" : \"\"} ${props.addMarginTop ? \"add-margin-top\": \"\"}`}>\r\n {props.children}\r\n </Paper>\r\n <Paper id={props.id ? `${props.id}-footer` : ''} square={true} elevation={0} style={{height:`${props.footerHeight}px`, margin:'1px 0 0 0', padding:'0'}}>\r\n {props.footerContent}\r\n </Paper>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n id?: string;\r\n addPadding?: boolean; \r\n addPadding10?: boolean; \r\n addMarginTop?: boolean;\r\n footerHeight: number;\r\n footerContent: React.ReactNode;\r\n headerContent?: React.ReactNode;\r\n}\r\n\r\nexport default MainContentWithFooter;","import * as React from \"react\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport { SaveNewsletterModel } from \"modules/newsletters/models\";\r\nimport { SaveNewsletterModelStateErrors } from \"modules/newsletters\";\r\nimport _ from \"lodash\";\r\n\r\nexport class TitleSection extends React.Component<ComponentProps, {}> {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n public render() {\r\n return (\r\n <div className=\"\">\r\n <div className=\"\">\r\n <div>\r\n <div>Newsletter title<span className=\"required-coloring\">*</span></div>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.props.newsletter.title}\r\n autoComplete=\"off\"\r\n error={this.props.highlightFields || _.some(this.props.modelErrors?.Title)}\r\n helperText={_.first(this.props.modelErrors?.Title)}\r\n placeholder=\"Internal name\"\r\n fullWidth\r\n required\r\n onChange={this.onChangeTitle}\r\n />\r\n </div>\r\n <div className=\"space-top-10\">\r\n <div>Description</div>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.props.newsletter.description}\r\n autoComplete=\"off\"\r\n placeholder=\"Internal description\"\r\n fullWidth\r\n onChange={this.onChangeDescription}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n private onChangeNewsletter = (value: Partial<SaveNewsletterModel>) => {\r\n this.props.onNewsletterChange(value);\r\n }\r\n\r\n private onChangeTitle = (event) => {\r\n this.onChangeNewsletter({title: event.target.value});\r\n }\r\n\r\n private onChangeDescription = (event) => {\r\n this.onChangeNewsletter({description: event.target.value})\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n newsletter: SaveNewsletterModel;\r\n highlightFields: boolean;\r\n modelErrors: SaveNewsletterModelStateErrors | null;\r\n onNewsletterChange: (value: Partial<SaveNewsletterModel>) => void;\r\n}\r\n\r\nexport default TitleSection;","import * as React from \"react\";\r\n\r\nimport Paper from \"@mui/material/Paper\";\r\nimport { Divider } from \"@mui/material\";\r\n\r\nconst ProgressBar: React.FunctionComponent<ComponentProps> = (props) => {\r\n const valid = (props.audienceFrequencySectionIsComplete ? 1 : 0) + (props.templateSectionIsComplete ? 1 : 0) + (props.titleSectionIsComplete ? 1 : 0) + (props.composeSectionIsComplete ? 1 : 0);\r\n const total = 4;\r\n const percentComplete = (valid / total) * 100;\r\n const progressBarText = `${valid} of ${total}`;\r\n \r\n return (\r\n <Paper elevation={0} className=\"section-card\">\r\n <div className=\"validator\">\r\n <div className=\"progress-info\">\r\n <div className=\"progress-bar\">\r\n <div style={{ width: percentComplete + \"%\" }} className=\"progress-bar-fill\"></div>\r\n </div>\r\n <div className=\"progress-bar-text\">{progressBarText}</div>\r\n </div>\r\n </div>\r\n </Paper>\r\n );\r\n};\r\n\r\nconst ProgressList: React.FunctionComponent<ComponentProps> = (props) => {\r\n return (\r\n <div className=\"\">\r\n <div className=\"progress-list\" style={{cursor: 'pointer'}}>\r\n <div className={`progress-list-item${props.templateSectionIsComplete ? \" item-valid\" : \"\"}`} onClick={props.onTemplateSectionClicked}>\r\n <div className=\"item-valid-indicator\">\r\n <div className=\"item-valid-indicator-icon\"></div>\r\n </div>\r\n <div className=\"item-description-header\">\r\n Select a template & theme\r\n </div>\r\n </div>\r\n <Divider></Divider>\r\n <div className={`progress-list-item${props.titleSectionIsComplete ? \" item-valid\" : \"\"}`} onClick={props.onTitleSectionClicked}>\r\n <div className=\"item-valid-indicator\">\r\n <div className=\"item-valid-indicator-icon\"></div>\r\n </div>\r\n <div className=\"item-description-header\">\r\n Set a newsletter title (internal name)\r\n </div>\r\n </div>\r\n <Divider></Divider>\r\n <div className={`progress-list-item${props.composeSectionIsComplete ? \" item-valid\" : \"\"}`} onClick={props.onComposeClicked}>\r\n <div className=\"item-valid-indicator\">\r\n <div className=\"item-valid-indicator-icon\"></div>\r\n </div>\r\n <div className=\"item-description-header\">\r\n Enter the Subject and compose the email\r\n </div>\r\n </div>\r\n <Divider></Divider>\r\n <div className={`progress-list-item${props.audienceFrequencySectionIsComplete ? \" item-valid\" : \"\"}`} onClick={props.onAudienceFrequencySectionClicked}>\r\n <div className=\"item-valid-indicator\">\r\n <div className=\"item-valid-indicator-icon\"></div>\r\n </div>\r\n <div className=\"item-description-header\">\r\n Set the sender name, email & first issue date\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n\r\nexport const ProgressSection: React.FunctionComponent<ComponentProps> = props => {\r\n return (\r\n <div> \r\n <ProgressBar {...props} ></ProgressBar>\r\n <ProgressList {...props} ></ProgressList>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n titleSectionIsComplete: boolean;\r\n audienceFrequencySectionIsComplete: boolean;\r\n templateSectionIsComplete: boolean;\r\n composeSectionIsComplete: boolean;\r\n onTitleSectionClicked: () => void;\r\n onTemplateSectionClicked: () => void;\r\n onAudienceFrequencySectionClicked: () => void;\r\n onComposeClicked: () => void;\r\n}","import { IColorOption } from \"modules/homeScreens/models\";\r\nimport * as React from \"react\";\r\nimport { ChromePicker, ColorResult } from \"react-color\";\r\n\r\nconst ColorOption: React.FunctionComponent<ComponentProps> = props => {\r\n const [colorText, setColorText] = React.useState(props.colorSelected ?? \"\");\r\n const [previousColor, setPreviousColor] = React.useState(\"\");\r\n\r\n function useOutsideAlerter(ref) {\r\n React.useEffect(() => {\r\n function handleClickOutside(event) {\r\n if (!!ref.current && !ref.current.contains(event.target)) {\r\n props.setVisible(false);\r\n }\r\n }\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n };\r\n }, [ref]);\r\n }\r\n\r\n const ref = React.useRef(null);\r\n useOutsideAlerter(ref);\r\n\r\n React.useEffect(() => {\r\n let currentColor = props.colorSelected;\r\n if (props.colorSelected !== previousColor)\r\n setColorText(currentColor);\r\n setPreviousColor(currentColor);\r\n }, [props.colorSelected, previousColor])\r\n\r\n //Only update text if it's a full hex code (#ZZZZZZ)\r\n const updateText = (toSet: string) => {\r\n setColorText(toSet);\r\n\r\n if (toSet.length === 7 && toSet.charAt(0) === '#')\r\n props.changeText(toSet);\r\n }\r\n\r\n let colorSelected = props.colorSelected;\r\n\r\n return (\r\n <div ref={ref}>\r\n <input\r\n onClick={(e) => props.setVisible(!props.isColorPickerVisible)}\r\n onChange={(e) => updateText(e.target.value.toUpperCase())}\r\n value={colorText}\r\n style={{\r\n borderRightWidth: \"35px\",\r\n borderRightColor: colorSelected,\r\n borderLeftColor: \"#DDE1E5\",\r\n borderTopColor: \"#DDE1E5\",\r\n borderBottomColor: \"#DDE1E5\",\r\n borderRadius: \"4px\",\r\n width: \"80%\",\r\n height: \"30px\",\r\n textAlign: \"center\",\r\n borderStyle: \"solid\",\r\n outlineColor: \"#3B78AB\",\r\n textTransform: \"uppercase\",\r\n boxShadow: \"0px 0px 0px 1px #DDE1E5\"\r\n }}\r\n />\r\n {props.isColorPickerVisible &&\r\n <div style={{ zIndex: 1, position: \"relative\", ...props.pickerContainerStyle }}>\r\n <ChromePicker\r\n color={colorSelected}\r\n onChangeComplete={(e: ColorResult) => props.setColor({ hexCode: e.hex.toUpperCase(), rgb: e.rgb })}\r\n >\r\n </ChromePicker>\r\n </div>\r\n }\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n isColorPickerVisible: boolean;\r\n colorSelected: string;\r\n setColor: (color: IColorOption) => void;\r\n setVisible: (toSet: boolean) => void;\r\n changeText: (toSet: string) => void;\r\n pickerContainerStyle?: React.CSSProperties;\r\n}\r\n\r\nexport default ColorOption;\r\n","import * as React from \"react\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport { Button } from \"@mui/material\";\r\n\r\nconst OneColumnNewsletterPreview: React.FunctionComponent<ComponentProps> = props => {\r\n return (\r\n <div style={{height: \"900px\", backgroundColor: props.primaryBackground, display: \"flex\", flexDirection: \"row\", width: \"inherit\"}}>\r\n <svg height=\"900\" width=\"10%\">\r\n <path fill={props.emailBackground} d=\"M0 0 L0 900 L38 900 L38 0 Z\" />\r\n </svg>\r\n <div style={{width: \"80%\"}}>\r\n <img style={{width: \"100%\"}} src={\"/images/newsletterPreviews/secondHeader.png\"} alt=\"header\"></img>\r\n\r\n <div style={{textAlign: \"center\", marginTop: \"4px\"}}>\r\n <span style={{fontSize: \"16px\", color: props.primaryText}}>Have you heard?</span>\r\n </div>\r\n\r\n <div style={{padding: \"4px\", lineHeight: \"0.6\"}}>\r\n <span style={{fontSize: \"9px\", color: props.primaryText}}>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</span>\r\n </div>\r\n\r\n <Divider style={{color: props.secondaryBackground, width: \"90%\", position: \"relative\", left: \"5%\", height: \"2px\", marginTop: \"5px\", marginBottom: \"5px\"}}/>\r\n\r\n <div style={{textAlign: \"center\"}}>\r\n <span style={{fontSize: \"12px\", color: props.primaryText}}>News & Announcements</span>\r\n </div>\r\n\r\n <div style={{display: \"flex\", flexDirection: \"row\", padding: \"10px\", paddingTop: \"15px\"}}>\r\n <img style={{width: \"50%\", height: \"60%\"}} src={\"/images/newsletterPreviews/sampleImageOne.png\"} alt=\"header\"></img>\r\n <div style={{lineHeight: \"0.6\", width: \"45%\", marginLeft: \"6px\"}}>\r\n <span style={{fontSize: \"11px\", color: props.linkTexts}}>Example of a title</span>\r\n <br/><br/>\r\n <span style={{fontSize: \"9px\", paddingTop: \"4px\", color: props.primaryText}}>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec aliquet eleifend mauris, et venenatis risus laoreet ultrices. Phasellus dapibus lectus quam, pharetra cursus dolor volutpat hendrerit. Integer rutrum mollis nulla nec tempus.</span>\r\n </div>\r\n </div>\r\n\r\n <div style={{display: \"flex\", flexDirection: \"row\", padding: \"10px\", paddingTop: \"15px\"}}>\r\n <img style={{width: \"50%\", height: \"60%\"}} src={\"/images/newsletterPreviews/sampleImageTwo.png\"} alt=\"header\"></img>\r\n <div style={{lineHeight: \"0.6\", width: \"45%\", marginLeft: \"6px\"}}>\r\n <span style={{fontSize: \"11px\", color: props.linkTexts}}>Example of a title</span>\r\n <br/><br/>\r\n <span style={{fontSize: \"9px\", paddingTop: \"4px\", color: props.primaryText}}>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec aliquet eleifend mauris, et venenatis risus laoreet ultrices. Phasellus dapibus lectus quam, pharetra cursus dolor volutpat hendrerit. Integer rutrum mollis nulla nec tempus.</span>\r\n </div>\r\n </div>\r\n\r\n\r\n <div style={{display: \"flex\", flexDirection: \"row\", padding: \"10px\", paddingTop: \"15px\"}}>\r\n <img style={{width: \"50%\", height: \"60%\"}} src={\"/images/newsletterPreviews/sampleImageThree.png\"} alt=\"header\"></img>\r\n <div style={{lineHeight: \"0.6\", width: \"45%\", marginLeft: \"6px\"}}>\r\n <span style={{fontSize: \"11px\", color: props.linkTexts}}>Example of a title</span>\r\n <br/><br/>\r\n <span style={{fontSize: \"9px\", paddingTop: \"4px\", color: props.primaryText}}>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec aliquet eleifend mauris, et venenatis risus laoreet ultrices. Phasellus dapibus lectus quam, pharetra cursus dolor volutpat hendrerit. Integer rutrum mollis nulla nec tempus.</span>\r\n </div>\r\n </div>\r\n\r\n <div style={{textAlign: \"center\", paddingTop: \"25px\", paddingBottom: \"35px\"}}>\r\n <Button style={{backgroundColor: props.secondaryBackground, color: props.secondaryText, borderRadius: \"24px\", fontSize: \"9px\"}}>See all news</Button>\r\n </div>\r\n\r\n <img style={{width: \"100%\"}} src={\"/images/newsletterPreviews/secondFooter.png\"} alt=\"header\"></img>\r\n\r\n <div style={{width: \"100%\", height: \"53px\", backgroundColor: props.secondaryBackground, textAlign: \"center\"}}>\r\n <span style={{fontSize: \"9px\", color: props.secondaryText}}>This is the footer. Copyright etc.</span>\r\n <br/>\r\n <span style={{fontSize: \"9px\", color: props.secondaryText}}>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>\r\n </div>\r\n\r\n <div style={{padding: \"4px\", paddingTop: \"10px\", lineHeight: \"0.6\", textAlign: \"center\"}}>\r\n <span style={{fontSize: \"8px\", color: props.primaryText}}>You are receiving this email because you are registered as an employee in {{TenantName}}. Contact your organization's administrators or internal communications team to learn more.</span> \r\n <span style={{fontSize: \"8px\", color: props.linkTexts}}>Click here to unsubscribe.</span>\r\n </div>\r\n\r\n <div style={{paddingTop: \"20px\", textAlign: \"center\"}}>\r\n <Button style={{backgroundColor: props.secondaryBackground, color: props.secondaryText, borderRadius: \"24px\", fontSize: \"9px\"}}>Powered by Sparrow Connected</Button>\r\n </div>\r\n </div>\r\n <svg height=\"900\" width=\"10%\">\r\n <path fill={props.emailBackground} d=\"M0 0 L0 900 L38 900 L38 0 Z\" />\r\n </svg>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n emailBackground: string;\r\n primaryBackground: string;\r\n primaryText: string;\r\n secondaryBackground: string;\r\n secondaryText: string;\r\n linkTexts: string;\r\n}\r\n\r\nexport default OneColumnNewsletterPreview;","import * as React from \"react\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport { Button } from \"@mui/material\";\r\n\r\nconst TwoColumnNewsletterPreview: React.FunctionComponent<ComponentProps> = props => {\r\n\r\n return (\r\n <div style={{height: \"900px\", backgroundColor: props.primaryBackground, display: \"flex\", flexDirection: \"row\", width: \"inherit\"}}>\r\n <svg height=\"900\" width=\"10%\">\r\n <path fill={props.emailBackground} d=\"M0 0 L0 900 L38 900 L38 0 Z\" />\r\n </svg>\r\n <div style={{width: \"80%\"}}>\r\n <img style={{width: \"100%\"}} src={\"/images/newsletterPreviews/secondHeader.png\"} alt=\"header\"></img>\r\n\r\n <div style={{textAlign: \"center\", marginTop: \"4px\"}}>\r\n <span style={{fontSize: \"16px\", color: props.primaryText}}>Have you heard?</span>\r\n </div>\r\n\r\n <div style={{padding: \"4px\", lineHeight: \"0.6\"}}>\r\n <span style={{fontSize: \"9px\", color: props.primaryText}}>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</span>\r\n </div>\r\n\r\n <Divider style={{color: props.secondaryBackground, width: \"90%\", position: \"relative\", left: \"5%\", height: \"2px\", marginTop: \"5px\", marginBottom: \"5px\"}}/>\r\n\r\n <div style={{textAlign: \"center\"}}>\r\n <span style={{fontSize: \"12px\", color: props.primaryText}}>News & Announcements</span>\r\n </div>\r\n\r\n <div style={{display: \"flex\", flexDirection: \"row\"}}>\r\n <div style={{display: \"flex\", flexDirection: \"column\", padding: \"10px\", paddingTop: \"15px\"}}>\r\n <img style={{width: \"100%\"}} src={\"/images/newsletterPreviews/sampleImageOne.png\"} alt=\"header\"></img>\r\n <div style={{lineHeight: \"0.6\", width: \"100%\", marginTop: \"4px\"}}>\r\n <span style={{fontSize: \"11px\", color: props.linkTexts}}>Example of a title</span>\r\n <br/><br/>\r\n <span style={{fontSize: \"9px\", paddingTop: \"4px\", color: props.primaryText}}>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec aliquet eleifend mauris, et venenatis risus laoreet ultrices. Phasellus dapibus lectus quam, pharetra cursus dolor volutpat hendrerit. Integer rutrum mollis nulla nec tempus.</span>\r\n </div>\r\n </div>\r\n\r\n <div style={{display: \"flex\", flexDirection: \"column\", padding: \"10px\", paddingTop: \"15px\"}}>\r\n <img style={{width: \"100%\", height: \"60%\"}} src={\"/images/newsletterPreviews/sampleImageTwo.png\"} alt=\"header\"></img>\r\n <div style={{lineHeight: \"0.6\", width: \"100%\", marginTop: \"4px\"}}>\r\n <span style={{fontSize: \"11px\", color: props.linkTexts}}>Example of a title</span>\r\n <br/><br/>\r\n <span style={{fontSize: \"9px\", paddingTop: \"4px\", color: props.primaryText}}>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec aliquet eleifend mauris, et venenatis risus laoreet ultrices. Phasellus dapibus lectus quam, pharetra cursus dolor volutpat hendrerit. Integer rutrum mollis nulla nec tempus.</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div style={{display: \"flex\", flexDirection: \"column\", padding: \"10px\", paddingTop: \"15px\"}}>\r\n <img style={{width: \"45%\", height: \"60%\"}} src={\"/images/newsletterPreviews/sampleImageThree.png\"} alt=\"header\"></img>\r\n <div style={{lineHeight: \"0.6\", width: \"45%\", marginTop: \"4px\"}}>\r\n <span style={{fontSize: \"11px\", color: props.linkTexts}}>Example of a title</span>\r\n <br/><br/>\r\n <span style={{fontSize: \"9px\", paddingTop: \"4px\", color: props.primaryText}}>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec aliquet eleifend mauris, et venenatis risus laoreet ultrices. Phasellus dapibus lectus quam, pharetra cursus dolor volutpat hendrerit. Integer rutrum mollis nulla nec tempus.</span>\r\n </div>\r\n </div>\r\n\r\n <div style={{textAlign: \"center\", paddingTop: \"25px\", paddingBottom: \"35px\"}}>\r\n <Button style={{backgroundColor: props.secondaryBackground, color: props.secondaryText, borderRadius: \"24px\", fontSize: \"9px\"}}>See all news</Button>\r\n </div>\r\n\r\n <img style={{width: \"100%\"}} src={\"/images/newsletterPreviews/secondFooter.png\"} alt=\"header\"></img>\r\n\r\n <div style={{width: \"100%\", height: \"53px\", backgroundColor: props.secondaryBackground, textAlign: \"center\"}}>\r\n <span style={{fontSize: \"9px\", color: props.secondaryText}}>This is the footer. Copyright etc.</span>\r\n <br/>\r\n <span style={{fontSize: \"9px\", color: props.secondaryText}}>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>\r\n </div>\r\n\r\n <div style={{padding: \"4px\", paddingTop: \"10px\", lineHeight: \"0.6\", textAlign: \"center\"}}>\r\n <span style={{fontSize: \"8px\", color: props.primaryText}}>You are receiving this email because you are registered as an employee in {{TenantName}}. Contact your organization's administrators or internal communications team to learn more.</span> \r\n <span style={{fontSize: \"8px\", color: props.linkTexts}}>Click here to unsubscribe.</span>\r\n </div>\r\n\r\n <div style={{paddingTop: \"20px\", textAlign: \"center\"}}>\r\n <Button style={{backgroundColor: props.secondaryBackground, color: props.secondaryText, borderRadius: \"24px\", fontSize: \"9px\"}}>Powered by Sparrow Connected</Button>\r\n </div>\r\n </div>\r\n <svg height=\"900\" width=\"10%\">\r\n <path fill={props.emailBackground} d=\"M0 0 L0 900 L38 900 L38 0 Z\" />\r\n </svg>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n emailBackground: string;\r\n primaryBackground: string;\r\n primaryText: string;\r\n secondaryBackground: string;\r\n secondaryText: string;\r\n linkTexts: string;\r\n}\r\n\r\nexport default TwoColumnNewsletterPreview;","//For use inside the templateThemeSearchAndSelect file.\r\n//Intended to be used in an array.for loop.\r\nimport { Checkbox } from '@mui/material';\r\nimport * as React from 'react';\r\nimport KeyboardArrowDownIcon from \"@mui/icons-material/KeyboardArrowDown\";\r\nimport KeyboardArrowUpIcon from \"@mui/icons-material/KeyboardArrowUp\";\r\n\r\nimport '../../styles/themes.sass'\r\nimport { NewsletterTheme, SaveNewsletterModel } from 'modules/newsletters/models';\r\nimport moment from 'moment';\r\n\r\ninterface ComponentProps {\r\n theme: NewsletterTheme;\r\n selectedTheme: string;\r\n onNewsletterChange: (value: SaveNewsletterModel) => any;\r\n newsletter: SaveNewsletterModel;\r\n setOpen: (index: number, toSet: boolean) => void;\r\n isOpen: boolean;\r\n index: number;\r\n}\r\n\r\nconst ThemeDisplay: React.FunctionComponent<ComponentProps> = ( {theme, selectedTheme, onNewsletterChange, newsletter, isOpen, setOpen, index} ) => {\r\n\r\n const updateNewsletterWithTheme = (theme: NewsletterTheme) => {\r\n let toSave = {\r\n themeId: theme.id, primaryBackground: theme.primaryBackground,\r\n primaryText: theme.primaryText,\r\n secondaryBackground: theme.secondaryBackground,\r\n secondaryText: theme.secondaryText,\r\n emailBackground: theme.emailBackground,\r\n linkText: theme.linkText\r\n }\r\n onNewsletterChange({\r\n ...newsletter, \r\n newsletterTheme: toSave\r\n });\r\n }\r\n\r\n let dateToDisplay = moment(new Date(theme.lastModifiedOnUTC)).format(\"MMM D, YYYY\");\r\n let nameToDisplay = theme.lastModifiedByDisplayName?.substring(0, 27) + (theme.lastModifiedByDisplayName?.length > 27 ? \"...\" : \"\");\r\n\r\n return (\r\n <div style={{border: \"1px solid #E1E5E8\", borderRadius: \"5px\"}}>\r\n <div style={{display: \"flex\", flexDirection: \"row\"}}>\r\n <Checkbox checked={selectedTheme === theme.id} style={{height: \"40px\", position: \"relative\", top: \"8px\"}} onClick={() => updateNewsletterWithTheme(theme)} color='secondary'/>\r\n <div style={{display: \"flex\", flexDirection: \"row\", cursor: \"pointer\", width: \"100%\"}} onClick={() => setOpen(index, !isOpen)}>\r\n <div style={{display: \"flex\", flexDirection: \"column\", padding: \"8px 0\"}}>\r\n <span style={{fontSize: \"16px\"}}>{theme.name}</span>\r\n {!theme.isCustom \r\n ? <span style={{fontSize: \"13px\"}}>Standard template theme</span> \r\n : <span style={{fontSize: \"13px\"}}>{theme.lastModifiedOnUTC ? \"Last modified on \" + dateToDisplay + \" by \" + nameToDisplay : \"Custom template theme\"}</span>\r\n }\r\n </div>\r\n <div style={{display: \"flex\", alignItems: \"center\", marginLeft: \"auto\", marginRight: \"20px\"}}>\r\n {isOpen\r\n ? <KeyboardArrowUpIcon style={{fontSize: \"28px\", float: \"right\"}}/> \r\n : <KeyboardArrowDownIcon style={{fontSize: \"28px\", float: \"right\"}}/> \r\n }\r\n </div>\r\n </div>\r\n </div>\r\n {isOpen && \r\n <div className=\"theme-section\">\r\n <div style={{display: \"flex\", flexDirection: \"row\", width: \"100%\", marginTop: \"20px\"}}>\r\n <div className='left-theme-label'>Email background</div>\r\n <div style={{height: \"20px\", width: \"20px\", backgroundColor: theme.emailBackground, borderRadius: \"3px\", border: \"1px solid #DDE1E5\"}}></div>\r\n <div className='right-theme-label'>Secondary background</div>\r\n <div style={{height: \"20px\", width: \"20px\", backgroundColor: theme.secondaryBackground, borderRadius: \"3px\", border: \"1px solid #DDE1E5\"}}></div>\r\n </div>\r\n\r\n <div style={{display: \"flex\", flexDirection: \"row\", width: \"100%\", marginTop: \"10px\"}}>\r\n <div className='left-theme-label'>Primary background</div>\r\n <div style={{height: \"20px\", width: \"20px\", backgroundColor: theme.primaryBackground, borderRadius: \"3px\", border: \"1px solid #DDE1E5\"}}></div>\r\n <div className='right-theme-label'>Secondary text</div>\r\n <div style={{height: \"20px\", width: \"20px\", backgroundColor: theme.secondaryText, borderRadius: \"3px\", border: \"1px solid #DDE1E5\"}}></div>\r\n </div>\r\n\r\n <div style={{display: \"flex\", flexDirection: \"row\", width: \"100%\", marginTop: \"10px\"}}>\r\n <div className='left-theme-label'>Primary text</div>\r\n <div style={{height: \"20px\", width: \"20px\", backgroundColor: theme.primaryText, borderRadius: \"3px\", border: \"1px solid #DDE1E5\"}}></div>\r\n <div className='right-theme-label'>Link text</div>\r\n <div style={{height: \"20px\", width: \"20px\", backgroundColor: theme.linkText, borderRadius: \"3px\", border: \"1px solid #DDE1E5\"}}></div>\r\n </div>\r\n </div>}\r\n </div>\r\n );\r\n}\r\n\r\nexport default ThemeDisplay;","import * as React from \"react\";\r\nimport { Button, TextField } from \"@mui/material\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport ThemeDisplay from \"./themeDisplay\";\r\nimport { NewsletterTheme, SaveNewsletterModel } from \"modules/newsletters/models\";\r\n\r\n\r\nconst TemplateThemeSearchAndSelect: React.FunctionComponent<ComponentProps> = props => {\r\n\r\n const [filteredThemes, setFilteredThemes] = React.useState(props.themes\r\n .sort((a, b) => a.name.localeCompare(b.name))\r\n .map(t => ({theme: t, isOpen: false})));\r\n\r\n const [searchText, setSearchText] = React.useState(\"\");\r\n\r\n const totalOpen = filteredThemes.filter(f => f.isOpen).length;\r\n\r\n React.useEffect(() => {\r\n setFilteredThemes(props.themes\r\n .sort((a, b) => a.name.localeCompare(b.name))\r\n .map(t => ({theme: t, isOpen: false})));\r\n }, [props.themes])\r\n\r\n const onUpdateTextToSearch = (toSet: string) => {\r\n setSearchText(toSet);\r\n }\r\n\r\n //Changes state of drawer to open or closed.\r\n const setIndexOpen = (index: number, toSet: boolean) => {\r\n let newState = JSON.parse(JSON.stringify(filteredThemes)); //Duplicate data to not use the same reference.\r\n if(index < filteredThemes.length) {\r\n newState[index].isOpen = toSet;\r\n }\r\n setFilteredThemes(newState);\r\n }\r\n\r\n //Sets ALL items in the list to closed or open.\r\n const setFlip = (toSet: boolean) => {\r\n let newFiltered = [...filteredThemes];\r\n if(toSet) {\r\n newFiltered = newFiltered.map(theme => {\r\n theme.isOpen = true;\r\n return theme;\r\n });\r\n }\r\n else\r\n {\r\n newFiltered = newFiltered.map(theme => {\r\n theme.isOpen = false;\r\n return theme;\r\n });\r\n }\r\n setFilteredThemes(newFiltered);\r\n }\r\n\r\n //Hitting enter with search text will perform the filtering.\r\n const onKeyPress = (key) => {\r\n if (key.keyCode === 13 && !!searchText) {\r\n let newThemes = props.themes\r\n .filter(t => t.name.toLowerCase()\r\n .includes(searchText.toLowerCase()) \r\n || t.lastModifiedByDisplayName?.toLowerCase().includes(searchText.toLowerCase()))\r\n .map(t => ({theme: t, isOpen: false}))\r\n\r\n setFilteredThemes(newThemes);\r\n }\r\n }\r\n\r\n //Remove all filters.\r\n const resetSearch = () => {\r\n var newThemes = props.themes\r\n .map(t => ({theme: t, isOpen: false}));\r\n\r\n setFilteredThemes(newThemes);\r\n setSearchText(\"\");\r\n }\r\n\r\n return (\r\n <div>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n style={{width: \"77%\"}}\r\n value={searchText}\r\n placeholder=\"Search theme or author\"\r\n InputProps={{\r\n startAdornment: <SearchIcon className=\"search-icon\" />,\r\n endAdornment: filteredThemes.length !== props.themes.length \r\n && <CloseIcon htmlColor=\"grey\" style={{cursor: \"pointer\"}} onClick={resetSearch}/>\r\n }}\r\n onChange={(e) => onUpdateTextToSearch(e.target.value)}\r\n onKeyUp={onKeyPress}\r\n />\r\n {totalOpen >= 1 && \r\n <Button style={{float: \"right\"}} onClick={() => setFlip(false)}>\r\n Collapse all\r\n </Button>\r\n }\r\n {totalOpen === 0 &&\r\n <Button style={{float: \"right\"}} onClick={() => setFlip(true)}>\r\n Expand All\r\n </Button>\r\n }\r\n\r\n <div style={{marginTop: \"15px\", width: \"100%\", maxHeight: \"530px\", overflowY: \"scroll\"}}>\r\n {filteredThemes.map((theme, key) => \r\n <ThemeDisplay \r\n key={key} \r\n theme={theme.theme} \r\n isOpen={theme.isOpen} \r\n setOpen={setIndexOpen} \r\n index={key} \r\n selectedTheme={props.selectedTheme} \r\n onNewsletterChange={props.onNewsletterChange} \r\n newsletter={props.newsletter}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n themes: NewsletterTheme[];\r\n selectedTheme: string;\r\n onNewsletterChange: (value: SaveNewsletterModel) => any;\r\n newsletter: SaveNewsletterModel;\r\n}\r\n\r\nexport default TemplateThemeSearchAndSelect;","//File for storing things such as static newsletter / template / theme names.\r\n\r\nexport const standardTemplateNames = [\"1 column\", \"2 column\"];\r\n\r\nexport const getBase64 = file => {\r\n return new Promise<string>(resolve => {\r\n let baseURL:string = \"\";\r\n let reader = new FileReader();\r\n reader.readAsDataURL(file);\r\n reader.onload = () => {\r\n baseURL = reader.result?.toString() ?? \"\";\r\n resolve(baseURL);\r\n };\r\n });\r\n};","/*\r\n Designed to replace the old content section, this component essentially holds the same functionality but has Dialog functionality.\r\n This way we can show the enhanced template selection dialogue.\r\n*/\r\n\r\nimport * as React from \"react\";\r\nimport { NewsletterImageType, NewsletterTemplate, NewsletterTemplateImageType, NewsletterTheme, SaveNewsletterModel, SaveNewsletterModelStateErrors } from \"modules/newsletters\";\r\nimport _ from \"lodash\";\r\n\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport MoreOptionsButton from \"modules/common/components/buttons/moreOptionsButton\";\r\n\r\nimport { Button, Checkbox, Dialog, DialogContent, DialogTitle, Divider, Grid, Link, List, Typography } from \"@mui/material\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport EditIcon from \"@mui/icons-material/Edit\";\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport Tabs from \"pages/common/tabs\";\r\nimport ColorOption from \"./colorOption\";\r\nimport OneColumnNewsletterPreview from \"./oneColumnNewsletterPreview\";\r\nimport TwoColumnNewsletterPreview from \"./twoColumnNewsletterPreview\";\r\nimport TemplateThemeSearchAndSelect from \"./templateThemeSearchAndSelect\";\r\nimport ReplayIcon from '@mui/icons-material/Replay';\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport { actions } from \"modules/newsletters\";\r\nimport { hexCodeFromText } from \"utils/hexFunctions\";\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\nimport { standardTemplateNames } from \"utils/newsletterUtils\";\r\n\r\nconst colorLocations = [\"emailBackground\", \"primaryBackground\", \"primaryText\", \"secondaryBackground\", \"secondaryText\", \"linkText\"]\r\n\r\nconst headerType:NewsletterImageType = \"Header\";\r\nconst footerType:NewsletterImageType = \"Footer\";\r\n\r\nclass TemplateWithPopup extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n templateSelectionDialogOpen: props.firstTime,\r\n selectedTab: 0,\r\n imageHoverClass: \"template-thumbnail-image\",\r\n\r\n customImageLoading: false,\r\n loadingPreviewLink: false,\r\n loadingPreviewTemplateId: \"\",\r\n\r\n emailBackgroundVisible: false,\r\n primaryBackgroundVisible: false,\r\n primaryTextVisible: false,\r\n secondaryBackgroundVisible: false,\r\n secondaryTextVisible: false,\r\n linkTextVisible: false\r\n };\r\n }\r\n\r\n componentDidMount = () => {\r\n this.props.setFirstTime(false);\r\n if(this.props.selectedTemplate.isCustom && !this.state.previewImage) {\r\n this.loadThemePreview(this.props.selectedTemplate.id);\r\n }\r\n }\r\n\r\n public render() {\r\n const { selectedTemplate, templates } = this.props;\r\n\r\n const selectedTemplateIsCustom = selectedTemplate.isCustom;\r\n const hasCustomTemplates = _.some(templates,t => t.isCustom);\r\n\r\n const oneColumnSelected = this.props.selectedTemplate.name.toLowerCase() === standardTemplateNames[0];\r\n const twoColumnSelected = this.props.selectedTemplate.name.toLowerCase() === standardTemplateNames[1];\r\n\r\n const currentTheme = this.props.themes.find(t => t.id === this.props.newsletter.newsletterTheme.themeId);\r\n const themeToBeEdited = this.props.newsletter.newsletterTheme;\r\n\r\n let tabs = [\r\n { label: \"Standard\", id: \"standard-template-tab\" },\r\n ];\r\n\r\n if(hasCustomTemplates)\r\n tabs = tabs.concat({label: \"Custom\", id: \"custom-template-tab\"});\r\n\r\n return (\r\n <div style={{minHeight: \"665px\"}}>\r\n <div style={{display: \"flex\", flexDirection: \"row\"}}>\r\n <p className=\"tx-strong\">Select a template</p>\r\n <Button style={{marginLeft: \"auto\", marginRight: \"16px\"}} onClick={this.setTemplateDialogOpen} color=\"primary\" startIcon={<EditIcon/>}>Template & Theme</Button>\r\n </div>\r\n <div>\r\n <Grid container spacing={2}>\r\n <Grid item xs={3}>\r\n <Typography style={{lineHeight:'42px'}}>Template</Typography>\r\n </Grid>\r\n <Grid item xs={3}>\r\n <Typography style={{lineHeight:'42px'}}>{selectedTemplate.name}</Typography>\r\n </Grid>\r\n <Grid item xs={3}>\r\n </Grid>\r\n <Grid item xs={3}>\r\n </Grid>\r\n\r\n { selectedTemplateIsCustom &&\r\n <React.Fragment>\r\n <Grid item xs={12} style={{marginRight: \"10px\"}}>\r\n <Disclaimer\r\n icon={<InfoOutlinedIcon />}\r\n text={\r\n <React.Fragment>\r\n <span>\r\n Header and Footer images cannot be modified through the Newsletter Editor when using custom templates.\r\n Add or modify custom templates with the help of our Support team. <Link onClick={() => window.open(\"https://support.sparrowconnected.com/en/how-do-i-create-a-custom-template-for-newsletters\")} underline=\"always\">Learn more</Link>.\r\n </span>\r\n </React.Fragment>\r\n }\r\n />\r\n </Grid>\r\n <Grid item xs={3} style={{paddingLeft: \"\"}}>\r\n Preview\r\n </Grid>\r\n <Grid item xs={9}>\r\n {this.state.customImageLoading || !this.state.previewImage\r\n ? <Loading></Loading>\r\n : <img style={{width: \"100%\"}} src={this.state.previewImage ?? \"\"} alt={\"Preview for selected custom newsletter\"}></img> }\r\n </Grid>\r\n </React.Fragment>\r\n }\r\n </Grid>\r\n </div>\r\n {!this.props.selectedTemplate.isCustom &&\r\n <Grid container spacing={2} style={{paddingTop: \"20px\"}}>\r\n <Grid item xs={6}>\r\n <div>\r\n <p className=\"tx-strong\">Change theme colors </p>\r\n </div>\r\n <Grid container spacing={2}>\r\n <Grid item xs={5}>\r\n <div style={{position: \"relative\", top: \"6px\"}}>Email background</div>\r\n </Grid>\r\n <Grid item xs={6}>\r\n <ColorOption\r\n isColorPickerVisible={this.state.emailBackgroundVisible}\r\n colorSelected={themeToBeEdited.emailBackground}\r\n setColor={(e) => this.changeNewsletterColor(e.hexCode, colorLocations[0])}\r\n changeText={(e) => this.changeNewsletterColor(e, colorLocations[0])}\r\n setVisible={this.toggleEmailBackgroundVisible}\r\n />\r\n </Grid>\r\n <Grid item xs={1}>\r\n {currentTheme && themeToBeEdited.emailBackground !== currentTheme.emailBackground &&\r\n <ReplayIcon\r\n style={{fontSize: \"20px\", position: \"relative\", top: \"7px\", color: \"#3B78AB\"}}\r\n onClick={() => this.changeNewsletterColor(currentTheme.emailBackground, colorLocations[0])}\r\n />\r\n }\r\n </Grid>\r\n\r\n <Grid item xs={5}>\r\n <div style={{position: \"relative\", top: \"6px\"}}>Primary background</div>\r\n </Grid>\r\n <Grid item xs={6}>\r\n <ColorOption\r\n isColorPickerVisible={this.state.primaryBackgroundVisible}\r\n colorSelected={themeToBeEdited.primaryBackground}\r\n setColor={(e) => this.changeNewsletterColor(e.hexCode, colorLocations[1])}\r\n changeText={(e) => this.changeNewsletterColor(e, colorLocations[1])}\r\n setVisible={this.togglePrimaryBackgroundVisible}\r\n />\r\n </Grid>\r\n <Grid item xs={1}>\r\n {currentTheme && themeToBeEdited.primaryBackground !== currentTheme.primaryBackground &&\r\n <ReplayIcon\r\n style={{fontSize: \"20px\", position: \"relative\", top: \"7px\", color: \"#3B78AB\"}}\r\n onClick={() => this.changeNewsletterColor(currentTheme.primaryBackground, colorLocations[1])}\r\n />\r\n }\r\n </Grid>\r\n\r\n <Grid item xs={5}>\r\n <div style={{position: \"relative\", top: \"6px\"}}>Primary text</div>\r\n </Grid>\r\n <Grid item xs={6}>\r\n <ColorOption\r\n isColorPickerVisible={this.state.primaryTextVisible}\r\n colorSelected={themeToBeEdited.primaryText}\r\n setColor={(e) => this.changeNewsletterColor(e.hexCode, colorLocations[2])}\r\n changeText={(e) => this.changeNewsletterColor(e, colorLocations[2])}\r\n setVisible={this.togglePrimaryTextVisible}\r\n />\r\n </Grid>\r\n <Grid item xs={1}>\r\n {currentTheme && themeToBeEdited.primaryText !== currentTheme.primaryText &&\r\n <ReplayIcon\r\n style={{fontSize: \"20px\", position: \"relative\", top: \"7px\", color: \"#3B78AB\"}}\r\n onClick={() => this.changeNewsletterColor(currentTheme.primaryText, colorLocations[2])}\r\n />\r\n }\r\n </Grid>\r\n <Grid item xs={5}>\r\n <div style={{position: \"relative\", top: \"6px\"}}>Secondary background</div>\r\n </Grid>\r\n <Grid item xs={6}>\r\n <ColorOption\r\n isColorPickerVisible={this.state.secondaryBackgroundVisible}\r\n colorSelected={themeToBeEdited.secondaryBackground}\r\n setColor={(e) => this.changeNewsletterColor(e.hexCode, colorLocations[3])}\r\n changeText={(e) => this.changeNewsletterColor(e, colorLocations[3])}\r\n setVisible={this.toggleSecondaryBackgroundVisible}\r\n />\r\n </Grid>\r\n <Grid item xs={1}>\r\n {currentTheme && themeToBeEdited.secondaryBackground !== currentTheme.secondaryBackground &&\r\n <ReplayIcon\r\n style={{fontSize: \"20px\", position: \"relative\", top: \"7px\", color: \"#3B78AB\"}}\r\n onClick={() => this.changeNewsletterColor(currentTheme.secondaryBackground, colorLocations[3])}\r\n />\r\n }\r\n </Grid>\r\n\r\n <Grid item xs={5}>\r\n <div style={{position: \"relative\", top: \"6px\"}}>Secondary text</div>\r\n </Grid>\r\n <Grid item xs={6}>\r\n <ColorOption\r\n isColorPickerVisible={this.state.secondaryTextVisible}\r\n colorSelected={themeToBeEdited.secondaryText}\r\n setColor={(e) => this.changeNewsletterColor(e.hexCode, colorLocations[4])}\r\n changeText={(e) => this.changeNewsletterColor(e, colorLocations[4])}\r\n setVisible={this.toggleSecondaryTextVisible}\r\n />\r\n </Grid>\r\n <Grid item xs={1}>\r\n {currentTheme && themeToBeEdited.secondaryText !== currentTheme.secondaryText &&\r\n <ReplayIcon\r\n style={{fontSize: \"20px\", position: \"relative\", top: \"7px\", color: \"#3B78AB\"}}\r\n onClick={() => this.changeNewsletterColor(currentTheme.secondaryText, colorLocations[4])}\r\n />\r\n }\r\n </Grid>\r\n\r\n <Grid item xs={5}>\r\n <div style={{position: \"relative\", top: \"6px\"}}>Link texts</div>\r\n </Grid>\r\n <Grid item xs={6}>\r\n <ColorOption\r\n isColorPickerVisible={this.state.linkTextVisible}\r\n colorSelected={themeToBeEdited.linkText}\r\n setColor={(e) => this.changeNewsletterColor(e.hexCode, colorLocations[5])}\r\n changeText={(e) => this.changeNewsletterColor(e, colorLocations[5])}\r\n setVisible={this.toggleLinkTextVisible}\r\n />\r\n </Grid>\r\n <Grid item xs={1}>\r\n {currentTheme && themeToBeEdited.linkText !== currentTheme.linkText &&\r\n <ReplayIcon\r\n style={{fontSize: \"20px\", position: \"relative\", top: \"7px\", color: \"#3B78AB\"}}\r\n onClick={() => this.changeNewsletterColor(currentTheme.linkText, colorLocations[5])}\r\n />\r\n }\r\n </Grid>\r\n </Grid>\r\n </Grid>\r\n <Grid item xs={6}>\r\n { (oneColumnSelected || twoColumnSelected) && <span style={{color: \"#666666\", fontStyle: \"italic\", fontSize: \"11px\" }}>This preview uses placeholder images and texts only.</span> }\r\n {oneColumnSelected &&\r\n <OneColumnNewsletterPreview\r\n emailBackground={themeToBeEdited.emailBackground}\r\n primaryBackground={themeToBeEdited.primaryBackground}\r\n primaryText={themeToBeEdited.primaryText}\r\n secondaryBackground={themeToBeEdited.secondaryBackground}\r\n secondaryText={themeToBeEdited.secondaryText}\r\n linkTexts={themeToBeEdited.linkText}\r\n />\r\n }\r\n {twoColumnSelected &&\r\n <TwoColumnNewsletterPreview\r\n emailBackground={themeToBeEdited.emailBackground}\r\n primaryBackground={themeToBeEdited.primaryBackground}\r\n primaryText={themeToBeEdited.primaryText}\r\n secondaryBackground={themeToBeEdited.secondaryBackground}\r\n secondaryText={themeToBeEdited.secondaryText}\r\n linkTexts={themeToBeEdited.linkText}\r\n />\r\n }\r\n </Grid>\r\n </Grid>\r\n }\r\n {!!this.state.showPreviewImageName &&\r\n <Dialog open={true} onClose={this.onClosePreviewImage} maxWidth={false} scroll=\"paper\" classes={{ paper: \"newsletter-dialog\" }}>\r\n <DialogTitle className=\"newsletter-dialog-title\">\r\n <div>{this.state.showPreviewImageName} Preview</div>\r\n <IconButton onClick={this.onClosePreviewImage} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </DialogTitle>\r\n <DialogContent>\r\n {!!this.state.previewImage && <img src={this.state.previewImage} alt={this.state.showPreviewImageName} style={{ height:'auto', width:'auto', maxWidth:'100%'}} />}\r\n {!this.state.previewImage && <Loading />}\r\n </DialogContent>\r\n </Dialog>\r\n }\r\n\r\n <Dialog open={this.state.templateSelectionDialogOpen} maxWidth=\"md\" fullWidth onClose={this.setTemplateDialogClosed}>\r\n <DialogTitle style={{paddingBottom: \"0px\"}}>\r\n <div style={{display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\"}}>\r\n <Typography variant=\"h5\">Select Template and Theme</Typography>\r\n <IconButton onClick={this.setTemplateDialogClosed} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </DialogTitle>\r\n\r\n <div style={{marginRight: \"24px\", marginLeft: \"24px\"}}>\r\n <Tabs\r\n onSelectTab={this.swapTab}\r\n selectedTab={this.state.selectedTab}\r\n tabs={tabs}\r\n />\r\n </div>\r\n\r\n <DialogContent className=\"newsletter-page\" style={{overflowY: \"auto\", overflowX: \"hidden\", height: \"670px\"}}>\r\n <div style={{paddingTop: \"20px\", paddingBottom: \"16px\"}}>\r\n { this.state.selectedTab === 0 &&\r\n this.renderStandardTemplatesAndThemes()\r\n }\r\n { this.state.selectedTab === 1 &&\r\n this.renderCustomTemplateList()\r\n }\r\n </div>\r\n </DialogContent>\r\n\r\n <div style={{marginTop: \"10px\", marginBottom: \"24px\", marginRight: \"24px\", marginLeft: \"24px\"}}>\r\n <Divider style={{marginBottom: \"12px\"}}/>\r\n <Button style={{float: \"right\", marginLeft: \"24px\"}} color=\"primary\" variant=\"contained\" onClick={this.setTemplateDialogClosed}>Next</Button>\r\n <Button\r\n style={{float: \"right\"}}\r\n onClick={() => this.props.redirectTo(`/${this.props.tenant}/admin/newsletters`)}\r\n >\r\n Cancel\r\n </Button>\r\n </div>\r\n </Dialog>\r\n </div>\r\n );\r\n }\r\n\r\n private swapTab = (e: any) => {\r\n //Standard tab\r\n if(e === 0) {\r\n let toSelect = this.props.templates.find(t => t.name.toLowerCase() === \"1 column\")!.id; //All environments will have the basic 1&2 column\r\n this.onSelectTemplate(toSelect);\r\n }\r\n else if(e === 1) {\r\n let toSet = this.props.templates.filter(t => t.isCustom)[0] ?? null;\r\n if(toSet !== null) {\r\n this.onSelectTemplate(toSet.id);\r\n }\r\n }\r\n this.setState({selectedTab: e})\r\n }\r\n\r\n private setTemplateDialogOpen = () => {\r\n this.setState({templateSelectionDialogOpen: true});\r\n }\r\n\r\n private setTemplateDialogClosed = () => {\r\n let selectedTheme = this.props.themes.find(t => t.id === this.props.newsletter.newsletterTheme.themeId);\r\n if(!this.props.selectedTemplate.isCustom && this.props.newsletter.newsletterTheme && selectedTheme?.isCustom) {\r\n if(selectedTheme.themeHeaderImageIsCustomized) {\r\n //Load header\r\n this.props.getThemeImage(headerType, selectedTheme.id).then(image => {\r\n this.props.setLoadImage(headerType, image);\r\n });\r\n }\r\n if(selectedTheme.themeFooterImageIsCustomized) {\r\n //Load footer\r\n this.props.getThemeImage(footerType, selectedTheme.id).then(image => {\r\n this.props.setLoadImage(footerType, image);\r\n });\r\n }\r\n }\r\n if(selectedTheme)\r\n this.props.updateSavedTheme(selectedTheme)\r\n\r\n if(this.props.selectedTemplate.isCustom) {\r\n this.loadThemePreview(this.props.selectedTemplate.id);\r\n }\r\n\r\n this.setState({templateSelectionDialogOpen: false});\r\n }\r\n\r\n private loadThemePreview = async(templateId: string) => {\r\n this.setState({customImageLoading: true});\r\n let result = await this.props.getCustomPreview(templateId);\r\n this.setState({customImageLoading: false, previewImage: result});\r\n }\r\n\r\n private renderStandardTemplatesAndThemes = () => {\r\n const oneColumnThemeable = this.props.templates.find(t => t.name.toLowerCase() === \"1 column\")\r\n const twoColumnThemeable = this.props.templates.find(t => t.name.toLowerCase() === \"2 column\")\r\n\r\n return (\r\n <div>\r\n <Grid container spacing={2}>\r\n <Grid item xs={4}>\r\n <div>\r\n <div\r\n style={{cursor: \"pointer\", border: this.props.selectedTemplate.name.toLowerCase() === \"1 column\" ? \"2px solid #1C6EA4\" : \"\"}}\r\n onClick={() => this.onSelectTemplate(oneColumnThemeable?.id ?? \"\")}\r\n >\r\n <img style={{width: \"100%\"}} src={\"/images/newsletterPreviews/thumbnailOneColumn.png\"} alt=\"1 column preview\"></img>\r\n </div>\r\n <div style={{paddingTop: \"4px\", paddingBottom: \"4px\"}}>\r\n <span style={{float: \"left\", marginTop: \"4px\"}}>1 Column</span>\r\n <div style={{float: \"right\"}}>\r\n {this.state.loadingPreviewTemplateId !== oneColumnThemeable!.id ?\r\n <MoreOptionsButton text=\"Options\">\r\n <List disablePadding>\r\n <MoreOptionsItem\r\n text=\"Preview\"\r\n onClick={() => this.openInNewTab(oneColumnThemeable!.id)}\r\n disabled={this.state.loadingPreviewLink}\r\n />\r\n <Divider/>\r\n <MoreOptionsItem\r\n text=\"Download HTML\"\r\n onClick={() => this.onDownloadTemplateHtml(oneColumnThemeable!)}\r\n />\r\n <MoreOptionsItem\r\n text=\"Download Header Image\"\r\n onClick={() => this.onDownloadTemplateImage(oneColumnThemeable!, headerType)}\r\n />\r\n <MoreOptionsItem\r\n text=\"Download Footer Image\"\r\n onClick={() => this.onDownloadTemplateImage(oneColumnThemeable!, footerType)}\r\n />\r\n </List>\r\n </MoreOptionsButton>\r\n : <Loading size={18}/>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div style={{marginTop: \"40px\"}}>\r\n <div\r\n style={{cursor: \"pointer\", border: this.props.selectedTemplate.name.toLowerCase() === \"2 column\" ? \"2px solid #1C6EA4\" : \"\"}}\r\n onClick={() => this.onSelectTemplate(twoColumnThemeable?.id ?? \"\")}\r\n >\r\n <img style={{width: \"100%\"}} src={\"/images/newsletterPreviews/thumbnailTwoColumn.png\"} alt=\"2 column preview\"></img>\r\n </div>\r\n <div style={{paddingTop: \"4px\", paddingBottom: \"4px\"}}>\r\n <span style={{float: \"left\"}}>2 Column</span>\r\n <div style={{float: \"right\"}}>\r\n {this.state.loadingPreviewTemplateId !== twoColumnThemeable!.id ?\r\n <MoreOptionsButton text=\"Options\">\r\n <List disablePadding>\r\n <MoreOptionsItem\r\n text=\"Preview\"\r\n onClick={() => this.openInNewTab(twoColumnThemeable!.id)}\r\n disabled={this.state.loadingPreviewLink}\r\n />\r\n <Divider/>\r\n <MoreOptionsItem\r\n text=\"Download HTML\"\r\n onClick={() => this.onDownloadTemplateHtml(twoColumnThemeable!)}\r\n />\r\n <MoreOptionsItem\r\n text=\"Download Header Image\"\r\n onClick={() => this.onDownloadTemplateImage(twoColumnThemeable!, headerType)}\r\n />\r\n <MoreOptionsItem\r\n text=\"Download Footer Image\"\r\n onClick={() => this.onDownloadTemplateImage(twoColumnThemeable!, footerType)}\r\n />\r\n </List>\r\n </MoreOptionsButton>\r\n : <Loading size={18}/>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </Grid>\r\n <Grid item xs={8}>\r\n <TemplateThemeSearchAndSelect\r\n themes={this.props.themes}\r\n selectedTheme={this.props.newsletter.newsletterTheme.themeId}\r\n onNewsletterChange={this.props.onNewsletterChange}\r\n newsletter={this.props.newsletter}\r\n />\r\n </Grid>\r\n </Grid>\r\n </div>\r\n )\r\n }\r\n\r\n private openInNewTab = async(templateId: string) => {\r\n this.setState({loadingPreviewLink: true, loadingPreviewTemplateId: templateId});\r\n\r\n let result = await this.props.getCustomPreview(templateId);\r\n\r\n this.setState({loadingPreviewLink: false, loadingPreviewTemplateId: \"\"});\r\n\r\n let w = window.open(\"\");\r\n let image = new Image();\r\n image.src = result;\r\n setTimeout(function(){\r\n w?.document.write(\"<title>Newsletter Preview\"+image.outerHTML);\r\n }, 0);\r\n }\r\n\r\n private renderCustomTemplateList = () => {\r\n const customTemplates = this.props.templates.filter(t => t.isCustom).sort((a, b) => a.name.localeCompare(b.name));\r\n return (\r\n
    \r\n {customTemplates.length === 0 &&\r\n \r\n No custom templates have been uploaded for your organization.\r\n \r\n }\r\n {customTemplates.length > 0 &&\r\n
    \r\n
    \r\n {customTemplates.map((template, index) => (\r\n
    \r\n
    \r\n this.onSelectTemplate(template.id)} color='secondary'/>\r\n {template.name}\r\n {this.state.loadingPreviewLink && this.state.loadingPreviewTemplateId === template.id\r\n ?
    \r\n \r\n
    \r\n : this.openInNewTab(template.id)}\r\n disabled={this.state.loadingPreviewLink && this.state.loadingPreviewTemplateId !== template.id}>\r\n Preview\r\n }\r\n
    \r\n \r\n
    \r\n ))}\r\n
    \r\n
    \r\n }\r\n
    \r\n )\r\n }\r\n\r\n private onDownloadTemplateHtml = (template: NewsletterTemplate) => {\r\n this.props.onDownloadTemplateHtml(template);\r\n }\r\n\r\n private onDownloadTemplateImage = (template: NewsletterTemplate, imageType: NewsletterTemplateImageType) => {\r\n this.props.onDownloadTemplateImage(template, imageType);\r\n }\r\n\r\n private onSelectTemplate = (templateId: string) => {\r\n this.props.onNewsletterChange({...this.props.newsletter, emailTemplateId: templateId});\r\n }\r\n\r\n private onShowPreviewImage = (ev, template: NewsletterTemplate) => {\r\n ev.stopPropagation();\r\n var templateAsUri = encodeURI(template.name);\r\n window.open(`https://sparrowadcommonstorage.blob.core.windows.net/images/${templateAsUri}.png`, \"_blank\")\r\n }\r\n\r\n private onClosePreviewImage = () => this.setState({previewImage: null, showPreviewImageName:null });\r\n\r\n private toggleEmailBackgroundVisible = (toSet: boolean) => {\r\n this.setState({emailBackgroundVisible: toSet});\r\n }\r\n\r\n private togglePrimaryBackgroundVisible = (toSet: boolean) => {\r\n this.setState({primaryBackgroundVisible: toSet});\r\n }\r\n\r\n private togglePrimaryTextVisible = (toSet: boolean) => {\r\n this.setState({primaryTextVisible: toSet});\r\n }\r\n\r\n private toggleSecondaryBackgroundVisible = (toSet: boolean) => {\r\n this.setState({secondaryBackgroundVisible: toSet});\r\n }\r\n\r\n private toggleSecondaryTextVisible = (toSet: boolean) => {\r\n this.setState({secondaryTextVisible: toSet});\r\n }\r\n\r\n private toggleLinkTextVisible = (toSet: boolean) => {\r\n this.setState({linkTextVisible: toSet});\r\n }\r\n\r\n private changeNewsletterColor = (toSet: string, toChange: string) => {\r\n let hexcode = hexCodeFromText(toSet);\r\n let isHexCodeValid = hexcode !== null;\r\n\r\n if(isHexCodeValid && hexcode) {\r\n switch(toChange){\r\n case colorLocations[0]:\r\n this.props.onNewsletterChange({...this.props.newsletter, newsletterTheme: {...this.props.newsletter.newsletterTheme, emailBackground: hexcode}});\r\n break;\r\n\r\n case colorLocations[1]:\r\n this.props.onNewsletterChange({...this.props.newsletter, newsletterTheme: {...this.props.newsletter.newsletterTheme, primaryBackground: hexcode}});\r\n break;\r\n\r\n case colorLocations[2]:\r\n this.props.onNewsletterChange({...this.props.newsletter, newsletterTheme: {...this.props.newsletter.newsletterTheme, primaryText: hexcode}});\r\n break;\r\n\r\n case colorLocations[3]:\r\n this.props.onNewsletterChange({...this.props.newsletter, newsletterTheme: {...this.props.newsletter.newsletterTheme, secondaryBackground: hexcode}});\r\n break;\r\n\r\n case colorLocations[4]:\r\n this.props.onNewsletterChange({...this.props.newsletter, newsletterTheme: {...this.props.newsletter.newsletterTheme, secondaryText: hexcode}});\r\n break;\r\n\r\n case colorLocations[5]:\r\n this.props.onNewsletterChange({...this.props.newsletter, newsletterTheme: {...this.props.newsletter.newsletterTheme, linkText: hexcode}});\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\ninterface ComponentState {\r\n showPreviewImageName?: string | null;\r\n previewImage?: string | null;\r\n templateSelectionDialogOpen: boolean;\r\n imageHoverClass: string;\r\n selectedTab: number;\r\n customImageLoading: boolean;\r\n loadingPreviewLink: boolean;\r\n loadingPreviewTemplateId: string;\r\n\r\n emailBackgroundVisible: boolean;\r\n primaryBackgroundVisible: boolean;\r\n primaryTextVisible: boolean;\r\n secondaryBackgroundVisible: boolean;\r\n secondaryTextVisible: boolean;\r\n linkTextVisible: boolean;\r\n}\r\n\r\ninterface ComponentProps {\r\n newsletter: SaveNewsletterModel;\r\n templates: NewsletterTemplate[];\r\n themes: NewsletterTheme[];\r\n selectedTemplate: NewsletterTemplate;\r\n modelErrors: SaveNewsletterModelStateErrors | null;\r\n firstTime: boolean;\r\n setFirstTime: (value: boolean) => void;\r\n onNewsletterChange: (value: SaveNewsletterModel) => any;\r\n getTemplateImage: (templateId: string, imageType: NewsletterTemplateImageType) => Promise;\r\n onDownloadTemplateHtml: (template: NewsletterTemplate) => any;\r\n onDownloadTemplateImage: (template: NewsletterTemplate, imageType: NewsletterTemplateImageType) => any;\r\n setLoadImage: (type: NewsletterImageType, toSet: File) => void;\r\n updateSavedTheme: (toSet: NewsletterTheme) => void;\r\n children: any; //not used but errors out otherwise\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenant: state.tenant.id,\r\n }),\r\n {\r\n redirectTo: push,\r\n getThemeImage: actions.getThemeImage,\r\n getCustomPreview: actions.getNewsletterPreview\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(TemplateWithPopup);\r\n","import * as React from \"react\";\r\nimport { \r\n NewsletterTemplate, \r\n SaveNewsletterModel, \r\n SaveNewsletterModelStateErrors, \r\n NewsletterTheme, \r\n NewsletterImageType \r\n} from \"modules/newsletters/models\"\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { NewsletterTemplateImageType } from \"modules/newsletters\";\r\nimport TemplateWithPopup from \"./templateWithPopup\";\r\n\r\nclass TemplateSection extends React.Component {\r\n public render() {\r\n const { newsletter, templates, themes } = this.props;\r\n if(!newsletter || !templates || !themes)\r\n return ;\r\n\r\n const selectedTemplate = templates.find(t => t.id === newsletter.emailTemplateId);\r\n if(!selectedTemplate)\r\n return ;\r\n\r\n return (\r\n
    \r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n newsletter: SaveNewsletterModel;\r\n templates: NewsletterTemplate[];\r\n themes: NewsletterTheme[];\r\n modelErrors: SaveNewsletterModelStateErrors | null;\r\n footerImage?: File | null;\r\n headerImage?: File | null;\r\n isLoadingFooterImage?: boolean;\r\n isLoadingHeaderImage?: boolean;\r\n firstTime: boolean;\r\n setFirstTime: (value: boolean) => void;\r\n onNewsletterChange: (value: Partial) => void;\r\n onDownloadTemplateHtml: (template: NewsletterTemplate) => any;\r\n onDownloadTemplateImage: (template: NewsletterTemplate, image: NewsletterTemplateImageType) => any;\r\n getTemplateImage: (templateId: string, image: NewsletterTemplateImageType) => Promise;\r\n setImage: (imageType: string, image?: File) => void;\r\n setLoadImage: (type: NewsletterImageType, toSet: File) => void;\r\n updateSavedTheme: (toSet: NewsletterTheme) => void;\r\n onError: (message:string) => any;\r\n}\r\n\r\nexport default TemplateSection;","import * as React from \"react\";\r\nimport MuiChip from \"@mui/material/Chip\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport \"./chips.sass\";\r\n\r\n\r\nconst Chips: React.FunctionComponent = props => {\r\n const chipClassName = props.chipClassName || \"basic-chips\";\r\n\r\n if (!props.chips || !props.chips.length) {\r\n if (props.hideAll)\r\n return ;\r\n\r\n return (\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n\r\n return (\r\n
    \r\n {props.chips.map((chip) => (\r\n props.onDelete!(chip.id)\r\n : () => chip.onDelete!(chip.id)\r\n : undefined\r\n }\r\n deleteIcon={}\r\n />\r\n ))}\r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n chips: { id: string, name: string, onDelete?: (chipId: string) => void }[];\r\n emptyText?: string;\r\n hideAll?: boolean;\r\n onDelete?: (chipId: string) => void;\r\n chipClassName?: string;\r\n}\r\n\r\nexport default Chips;","import React, { useState } from \"react\";\r\nimport Callout from \"modules/common/components/callout\";\r\nimport { Audience } from \"modules/audiences/models\";\r\nimport { SimpleTag } from \"modules/newsletters/models\";\r\nimport Button from \"@mui/material/Button\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport { ButtonProps, ListItemButton } from \"@mui/material\";\r\n\r\nconst EditAudiences: React.FunctionComponent = props => {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const [audiences, setAudiences] = useState(props.audiences);\r\n const [calloutOpen, setCalloutOpen] = useState(false);\r\n\r\n return (\r\n \r\n }\r\n onClick={(event: any) => {\r\n setAudiences(props.audiences);\r\n setAnchorEl(event.currentTarget);\r\n setCalloutOpen(true);\r\n }}\r\n {...props.buttonProps}\r\n >\r\n Edit audiences\r\n \r\n {\r\n props.onChange(audiences);\r\n setCalloutOpen(toSet)\r\n }}\r\n footer={\r\n
    \r\n {\r\n props.onChange([]);\r\n setCalloutOpen(false);\r\n }}\r\n >\r\n Clear all\r\n \r\n
    \r\n }\r\n >\r\n \r\n {props.availableAudiences.map((audience) =>\r\n {\r\n const hasSelectedAudience: boolean = audiences.findIndex((selectedAudience) => selectedAudience.id === audience.id) !== -1;\r\n if (hasSelectedAudience)\r\n setAudiences(audiences.filter((selectedAudience) => selectedAudience.id !== audience.id));\r\n else\r\n setAudiences(audiences.concat([{ id: audience.id, name: audience.displayName }]));\r\n }}>\r\n \r\n selectedAudience.id === audience.id) !== -1}\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n audiences: SimpleTag[];\r\n availableAudiences: Audience[];\r\n onChange: (audiences: SimpleTag[]) => void;\r\n buttonProps?: ButtonProps;\r\n}\r\n\r\nexport default EditAudiences;","import * as React from \"react\";\r\nimport Chips from \"modules/common/components/chips/chips\";\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\n\r\nimport { Newsletter, NewsletterRecurrence, SaveNewsletterModelStateErrors, SaveNewsletterModel, SimpleTag, daysOfWeek, recurrenceWeeks, NewsletterDetails, Address } from \"modules/newsletters/models\";\r\nimport { Audience } from \"modules/audiences/models\";\r\n\r\nimport EditAudiences from \"../../common/editAudiences\";\r\n\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport Grid from \"@mui/material/Grid\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Select from \"@mui/material/Select\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport { DatePicker } from \"@mui/x-date-pickers/DatePicker\";\r\nimport { PickerLocalization } from \"modules/common/components/pickerLocalization\";\r\n\r\nimport moment from \"moment\";\r\nimport _ from \"lodash\";\r\nimport { Button, Checkbox, Divider, FormControlLabel, FormGroup, FormHelperText, ListItemIcon, ListItemText, MenuProps, Radio, Typography } from \"@mui/material\";\r\nimport { DayOfWeek } from \"modules/newsletters\";\r\nimport { CheckBox, CheckBoxOutlineBlank } from \"@mui/icons-material\";\r\nimport EditIcon from \"@mui/icons-material/Edit\";\r\nimport CalloutWithSearch from \"modules/common/components/calloutWithSearch\";\r\n\r\n\r\nconst selectMenuProps : Partial = {\r\n anchorOrigin: {\r\n vertical: \"bottom\",\r\n horizontal: \"left\"\r\n },\r\n};\r\n\r\nclass AudienceAndFrequencySettings extends React.Component {\r\n\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n this.state = {\r\n anchorEl: null,\r\n buttonRef: React.createRef(),\r\n singleOption: props.senders.length === 1\r\n };\r\n const now = new Date();\r\n this._today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\r\n }\r\n\r\n private _today : Date;\r\n\r\n componentDidMount() {\r\n moment.locale(\"en\");\r\n if(this.props.newsletter?.fromEmailAddress === \"\" && this.props.newsletter?.fromEmailName === \"\" && this.props.highlight) {\r\n this.state.buttonRef.current.click()\r\n }\r\n\r\n if(this.state.singleOption)\r\n {\r\n this.onSelectSender(this.props.senders[0]);\r\n }\r\n }\r\n\r\n private truncate = (str: string, n: number) => {\r\n return (str.length > n) ? str.slice(0, n-1) + \"...\" : str;\r\n } \r\n\r\n public render() {\r\n const showFirstIssueDateTime = this.props.newsletter.status === \"Draft\" || this.props.newsletter.recurrenceType !== 'Adhoc';\r\n\r\n return (\r\n
    \r\n

    Send details

    \r\n
    \r\n \r\n \r\n
    \r\n Sender name & email*\r\n
    \r\n This is the 'From' name and email address that appears when the emails are received. Go to Global Settings to modify your emails\r\n
    \r\n
    \r\n
    \r\n {this.props.newsletter.fromEmailAddress && this.props.newsletter.fromEmailName &&\r\n \r\n \r\n {this.truncate(this.props.newsletter.fromEmailName, 30)}\r\n \r\n {!this.state.singleOption ?\r\n \r\n \r\n \r\n : \r\n \r\n }\r\n \r\n \r\n \r\n {this.truncate(this.props.newsletter.fromEmailAddress, 50)}\r\n \r\n \r\n }\r\n {!this.props.newsletter.fromEmailAddress && !this.props.newsletter.fromEmailName && !this.state.singleOption && \r\n \r\n \r\n \r\n \r\n \r\n }\r\n {\r\n this.setState({anchorEl: null})\r\n }}\r\n performSearch={(e) => this.props.onSearchSenders(e)}\r\n searchOnType={true}\r\n highlight={(this.props.newsletter.fromEmailAddress === \"\" && this.props.newsletter.fromEmailName === \"\" && this.props.highlight)}\r\n >\r\n {this.props.senders.map(s => \r\n
    \r\n
    this.onSelectSender(s)}>\r\n {this.truncate(s.fromEmailName, 50)}
    \r\n {this.truncate(s.fromEmailAddress, 75)}\r\n
    \r\n \r\n
    \r\n )}\r\n \r\n
    \r\n
    \r\n\r\n
    \r\n \r\n \r\n
    \r\n Send to\r\n Target the audiences you want to send this newsletter to. If none are selected, the edition(s) will send to all subscribed users in your organization.\r\n
    \r\n
    \r\n \r\n
    \r\n \r\n \r\n
    \r\n \r\n this.onChangeAllowUnsubscribe(event.target.checked)} color=\"primary\" />} label=\"Allow recipients to unsubscribe\" />\r\n \r\n
    \r\n
    \r\n
    \r\n

    Frequency

    \r\n {showFirstIssueDateTime &&
    \r\n \r\n \r\n Send first issue on*\r\n \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    }\r\n
    \r\n \r\n \r\n Frequency\r\n \r\n \r\n
    \r\n event.target.checked && this.OnFrequencyChange(\"Adhoc\")} color=\"primary\" />} label=\"Adhoc\" style={{marginRight:'0'}} />\r\n Selecting adhoc will send only the first issue of this newsletter after publishing and will allow you to manually add and queue succeeding issues.\r\n
    \r\n
    \r\n event.target.checked && this.OnFrequencyChange(\"Daily\")} color=\"primary\" />} label=\"Every\" />\r\n
    \r\n {\r\n this.props.newsletter.recurrenceType === \"Daily\" && \r\n
    \r\n \r\n _.orderBy(selected, s=>daysOfWeek.indexOf(s)).join(', ')}\r\n onChange={(event) => this.onChangeDailyRecurrenceDay(typeof event.target.value === 'string' ? ((event.target.value as string).split(',') as DayOfWeek[]) : (event.target.value as DayOfWeek[]))}\r\n >\r\n {daysOfWeek.map((dayOfWeek) =>\r\n \r\n \r\n {this.props.newsletter.dailyRecurrenceOn.indexOf(dayOfWeek) === -1\r\n ? \r\n : }\r\n \r\n {dayOfWeek}\r\n )}\r\n \r\n {_.first(this.props.modelErrors?.DailyRecurrenceOn)}\r\n \r\n
    \r\n }\r\n
    \r\n event.target.checked && this.OnFrequencyChange(\"Biweekly\")} color=\"primary\" />} label=\"Every other week\" style={{marginRight:'0'}} />\r\n Selecting every other week queues issues biweekly. This setting will follow the day (Sunday-Monday) of the first issue's send date, and queues will skip every other week.\r\n
    \r\n
    \r\n event.target.checked && this.OnFrequencyChange(\"Monthly\")} color=\"primary\" />} label=\"Every month\" />\r\n
    \r\n {\r\n this.props.newsletter.recurrenceType === \"Monthly\" &&\r\n
    \r\n on the\r\n
    \r\n \r\n \r\n {recurrenceWeeks.map((weekOption) =>\r\n {weekOption}\r\n )}\r\n \r\n {_.first(this.props.modelErrors?.MonthlyRecurrenceWeek)}\r\n \r\n
    \r\n
    \r\n \r\n \r\n {daysOfWeek.map((dayOfWeek) =>\r\n {dayOfWeek}\r\n )}\r\n \r\n {_.first(this.props.modelErrors?.MonthlyRecurrenceDay)}\r\n \r\n
    \r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private shouldDisableDate = (day: Date) => {\r\n if(day < this._today){\r\n if(!!this.props.serverNewsletter && !!this.props.serverNewsletter.firstIssueDateTime){\r\n if(moment(this.props.serverNewsletter.firstIssueDateTime).toDate() !== day)\r\n return true;\r\n }else{\r\n return true;\r\n }\r\n }\r\n switch(this.props.newsletter.recurrenceType)\r\n {\r\n case \"Adhoc\":\r\n case \"Biweekly\":\r\n return false;\r\n case \"Daily\":\r\n const selectedDays = _.map(this.props.newsletter.dailyRecurrenceOn,d=>daysOfWeek.indexOf(d));\r\n return selectedDays.indexOf(day.getDay()) < 0;\r\n case \"Monthly\":\r\n if(!!this.props.newsletter.monthlyRecurrenceDay && day.getDay() !== daysOfWeek.indexOf(this.props.newsletter.monthlyRecurrenceDay))\r\n return true;\r\n const date = day.getDate();\r\n switch(this.props.newsletter.monthlyRecurrenceWeek)\r\n {\r\n case \"First\":\r\n return date > 7;\r\n case \"Second\":\r\n return date <=7 || date > 14;\r\n case \"Third\":\r\n return date <= 14 || date > 21;\r\n case \"Last\":\r\n const daysInMonth = new Date(day.getFullYear(), day.getMonth()+1, 0).getDate();\r\n return date < (daysInMonth - 6);\r\n }\r\n break;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n private onChange = (value: Partial) => {\r\n this.props.onNewsletterChange(value);\r\n }\r\n\r\n private onChangeAllowUnsubscribe = (value:boolean) => {\r\n this.onChange({allowUnsubscribe: value});\r\n }\r\n\r\n private onChangeAudiences = (audiences: SimpleTag[]) => {\r\n this.onChange({ audiences });\r\n }\r\n\r\n private onChangeMonthlyRecurrenceDay = (event) => {\r\n this.onChange({ monthlyRecurrenceDay: event.target.value });\r\n }\r\n\r\n private onChangeDailyRecurrenceDay = (values: DayOfWeek[]) => {\r\n this.onChange({ dailyRecurrenceOn: _.orderBy(values,v=>daysOfWeek.indexOf(v)) });\r\n }\r\n\r\n private onChangeMonthlyRecurrenceWeek = (event) => {\r\n this.onChange({ monthlyRecurrenceWeek: event.target.value });\r\n }\r\n\r\n private onDeleteAudience = (audienceId: string) => {\r\n this.onChange({ audiences: this.props.newsletter.audiences!.filter(audience => audience.id !== audienceId) });\r\n }\r\n\r\n private OnFrequencyChange = (frequency: NewsletterRecurrence) => {\r\n this.onChange({recurrenceType: frequency});\r\n }\r\n\r\n private onChangeIssueDate = (date) => {\r\n const updatedDate: string = moment(date).toISOString();\r\n this.onChange({ firstIssueDateTime: updatedDate });\r\n }\r\n\r\n private onChangeIssueTime = (event) => {\r\n const times: number[] = event.target.value.split(\":\");\r\n const updatedDate: string = moment(this.props.newsletter.firstIssueDateTime).set(\"hour\", times[0]).set(\"minutes\", times[1]).toISOString();\r\n this.onChange({ firstIssueDateTime: updatedDate });\r\n }\r\n\r\n private onSelectSender = (s: Address) => {\r\n this.onChange({ fromEmailName: s.fromEmailName, fromEmailAddress: s.fromEmailAddress })\r\n this.setState({ anchorEl: null })\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n newsletter: SaveNewsletterModel;\r\n serverNewsletter?: NewsletterDetails;\r\n audiences: Audience[];\r\n senders: Address[];\r\n modelErrors: SaveNewsletterModelStateErrors | null;\r\n highlight: boolean;\r\n onNewsletterChange: (value: Partial) => void;\r\n onSearchSenders: (value: string) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n anchorEl: any;\r\n buttonRef: any;\r\n singleOption: boolean;\r\n}\r\n\r\nexport default AudienceAndFrequencySettings;","import React, { useEffect, useState } from \"react\";\r\n\r\nimport Callout from \"modules/common/components/callout\";\r\n\r\nimport { Tag } from \"modules/common/components/authoring/models\";\r\nimport { SimpleTag } from \"modules/newsletters/models\";\r\nimport { TagSettings } from \"modules/settings/models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport { Theme } from \"@mui/material/styles\";\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\n\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n tagGroup: {\r\n color: \"#666666\",\r\n fontWeight: 500\r\n },\r\n tagList: {\r\n \"& > div\": {\r\n paddingLeft: 50\r\n }\r\n }\r\n })\r\n);\r\n\r\ninterface TagList {\r\n id: string;\r\n name: string;\r\n tags: Tag[];\r\n}\r\n\r\nconst EditTags: React.FunctionComponent = props => {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const [calloutOpen, setCalloutOpen] = useState(false);\r\n const [customTopics, setCustomTopics] = useState(props.customTopics);\r\n const [tagList, setTagList] = useState([] as TagList[]);\r\n\r\n useEffect(() => {\r\n let tagsList: TagList[] = [];\r\n\r\n props.tagSettings.tagGroups.map((tagGroup) => {\r\n const tags: Tag[] = tagGroup.tags.filter((tag) => !tag.disabled);\r\n if (!!tags.length) {\r\n tagsList.push({\r\n id: tagGroup.id,\r\n name: tagGroup.name,\r\n tags: tags\r\n });\r\n }\r\n return tagGroup;\r\n });\r\n\r\n setTagList(tagsList);\r\n }, [props.tagSettings]);\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n }\r\n onClick={(event: any) => {\r\n setCustomTopics(props.customTopics);\r\n setAnchorEl(event.currentTarget);\r\n setCalloutOpen(true);\r\n }}\r\n >\r\n Edit topics\r\n \r\n {\r\n props.onChange(customTopics);\r\n setCalloutOpen(toSet)\r\n }}\r\n footer={\r\n
    \r\n {\r\n props.onChange([]);\r\n setAnchorEl(null);\r\n }}\r\n >\r\n Clear all\r\n \r\n
    \r\n }\r\n >\r\n \r\n {tagList.map((tagGroup) => {\r\n const tagGroupChecked: boolean = tagGroup.tags.filter((tag) => !!customTopics.find((selectedTag) => selectedTag.id === tag.id)).length === tagGroup.tags.length;\r\n return (\r\n \r\n {\r\n let tags: Tag[] = customTopics.slice();\r\n if (!tagGroupChecked) {\r\n tagGroup.tags.map((tag) => {\r\n if (tags.findIndex(tagToFind => tagToFind.id === tag.id) === -1)\r\n tags.push(tag);\r\n return tag;\r\n });\r\n } else {\r\n tagGroup.tags.map((tag) => {\r\n tags = tags.filter((tagToFilter) => tagToFilter.id !== tag.id);\r\n return tag;\r\n });\r\n }\r\n setCustomTopics(tags);\r\n }}>\r\n \r\n \r\n \r\n \r\n \r\n \r\n {tagGroup.tags.map((tag) =>\r\n {\r\n const hasSelectedAudience: boolean = customTopics.findIndex((selectedTag) => selectedTag.id === tag.id) !== -1;\r\n if (hasSelectedAudience)\r\n setCustomTopics(customTopics.filter((selectedTag) => selectedTag.id !== tag.id));\r\n else\r\n setCustomTopics(customTopics.concat([{ id: tag.id, name: tag.name }]));\r\n }}>\r\n \r\n selectedTag.id === tag.id) !== -1}\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n customTopics: SimpleTag[];\r\n tagSettings: TagSettings;\r\n onChange: (audiences: SimpleTag[]) => void;\r\n}\r\n\r\nexport default EditTags;","import * as React from \"react\";\r\n\r\nimport { Address, SaveNewsletterModel, SaveNewsletterModelStateErrors } from \"modules/newsletters/models\";\r\nimport Divider from \"@mui/material/Divider\";\r\n\r\nimport AudienceAndFrequencySettings from \"./audienceAndFrequencySettings\";\r\nimport ContentTypeAndTopicsSettings from \"./contentTypeAndTopicSettings\";\r\nimport {Audience} from \"modules/audiences/models\";\r\nimport { NewsletterDetails } from \"modules/newsletters\";\r\n\r\nclass SettingsSection extends React.Component {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n}\r\ninterface ComponentProps {\r\n newsletter: SaveNewsletterModel;\r\n serverNewsletter?: NewsletterDetails;\r\n audiences: Audience[];\r\n senders: Address[];\r\n modelErrors: SaveNewsletterModelStateErrors | null;\r\n highlight: boolean;\r\n onNewsletterChange: (value: Partial) => void;\r\n onSearchSenders: (value: string) => void;\r\n}\r\n\r\nexport default SettingsSection;","import * as React from \"react\";\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport { SaveNewsletterModel } from \"modules/newsletters/models\";\r\nimport { Divider, Grid, Link } from \"@mui/material\";\r\nimport { NewsletterTemplate } from \"modules/newsletters\";\r\nimport { Audience } from \"modules/audiences/models\";\r\nimport moment from \"moment\";\r\nimport _ from \"lodash\";\r\nimport ChipLabels from \"modules/common/components/chips/chipLabels\";\r\nimport Tabs from \"pages/common/tabs\";\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nclass NewsletterPreview extends React.Component {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n this.state = {\r\n selectedTab: 0,\r\n isLoading: false,\r\n uniqueUsers: 0\r\n };\r\n }\r\n\r\n async componentDidMount() {\r\n await this.updateUniqueRecipients()\r\n }\r\n\r\n public async updateUniqueRecipients() {\r\n var ids = this.props.newsletter.audiences?.map(a => a.id) || [];\r\n var grabAll = ids.length === 0;\r\n this.setState({isLoading: true});\r\n var result = await this.props.getUniqueUsers(ids, grabAll);\r\n this.setState({uniqueUsers: result, isLoading: false});\r\n }\r\n\r\n public render() {\r\n const { newsletter } = this.props;\r\n const audiences = _.orderBy(_.map(newsletter.audiences,c => c.name),n=>n).join(', ');\r\n\r\n const tabs = [\r\n {label: \"Email details\", value: 0, id: \"email-details-tab\"},\r\n {label: \"More settings\", value: 1, id: \"more-settings-tab\"}\r\n ]\r\n\r\n var topicsUsed = Object.create({});\r\n if(newsletter.topicOption === 'All')\r\n {\r\n topicsUsed = [{id: 0, name: \"All topics\"}]\r\n }\r\n else if(newsletter.topicOption === 'Employee')\r\n {\r\n topicsUsed = [{id: 0, name:\"Employee topics\"}]\r\n }\r\n else if(newsletter.topicOption === 'Custom')\r\n {\r\n topicsUsed = newsletter.customTopics;\r\n }\r\n else\r\n {\r\n topicsUsed = [{id: 0, name: \"Invalid value\"}]\r\n }\r\n\r\n return (\r\n \r\n \r\n
    One last check!
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n \r\n Newsletter Title\r\n \r\n \r\n {newsletter.title}\r\n \r\n \r\n \r\n \r\n Description\r\n \r\n \r\n {newsletter.description === \"\" ? No description is included : newsletter.description}\r\n \r\n \r\n \r\n \r\n From\r\n \r\n \r\n
    \r\n {newsletter.fromEmailName}, {newsletter.fromEmailAddress}\r\n
    \r\n
    \r\n
    \r\n \r\n \r\n To\r\n \r\n \r\n \r\n \r\n \r\n
    \r\n this.setState({selectedTab: e})}\r\n />\r\n
    \r\n
    \r\n\r\n {this.state.selectedTab === 0 && \r\n
    \r\n
    \r\n \r\n \r\n Subject\r\n \r\n \r\n {newsletter.translatedContent[this.props.defaultLcid].subject}\r\n \r\n \r\n \r\n \r\n Preheader\r\n \r\n \r\n {newsletter.translatedContent[this.props.defaultLcid].preheader === \"\" \r\n ? No preheader is included \r\n : newsletter.translatedContent[this.props.defaultLcid].preheader}\r\n \r\n \r\n \r\n \r\n Theme\r\n \r\n \r\n {this.props.template.isCustom ? 'Custom': 'Standard'}\r\n \r\n \r\n
    \r\n \r\n
    \r\n { !this.props.template.isCustom && \r\n
    \r\n \r\n \r\n Header Image\r\n \r\n \r\n { this.props.headerImage \r\n ? \"header\"\r\n : \"header\"\r\n }\r\n \r\n \r\n \r\n \r\n Header text\r\n \r\n \r\n {newsletter.translatedContent[this.props.defaultLcid].header === \"\" \r\n ? No header text is included \r\n :
    \r\n }\r\n
    \r\n
    \r\n
    \r\n }\r\n { !this.props.template.isCustom && \r\n
    \r\n \r\n \r\n Body\r\n \r\n \r\n {newsletter.translatedContent[this.props.defaultLcid].body === \"\" \r\n ? No body text is included \r\n :
    \r\n }\r\n
    \r\n
    \r\n
    \r\n }\r\n {!this.props.template.isCustom && \r\n
    \r\n \r\n \r\n Footer Image\r\n \r\n \r\n { this.props.footerImage\r\n ? \"footer\"\r\n : \"footer\"\r\n }\r\n \r\n \r\n \r\n \r\n Footer text\r\n \r\n \r\n {newsletter.translatedContent[this.props.defaultLcid].footer === \"\" \r\n ? No footer text is included \r\n :
    \r\n }\r\n
    \r\n
    \r\n
    \r\n }\r\n {this.props.template.isCustom &&\r\n
    \r\n }\r\n text={\r\n \r\n \r\n Header and Footer images cannot be modified through the Newsletter Editor when using custom templates.\r\n Add or modify custom templates with the help of our Support team. window.open(\"https://support.sparrowconnected.com/en/how-do-i-create-a-custom-template-for-newsletters\")} underline=\"always\">Learn more.\r\n \r\n \r\n }\r\n />\r\n
    \r\n }\r\n
    \r\n
    \r\n }\r\n\r\n {this.state.selectedTab === 1 &&\r\n
    \r\n {this.state.isLoading &&\r\n
    \r\n \r\n
    \r\n }\r\n {!this.state.isLoading && \r\n
    \r\n \r\n \r\n Total unique recipients?\r\n \r\n \r\n {this.state.uniqueUsers}\r\n \r\n \r\n \r\n \r\n Send to\r\n \r\n \r\n {audiences || 'All users'}\r\n \r\n \r\n \r\n \r\n Next queued for\r\n \r\n \r\n {moment(newsletter.firstIssueDateTime).format(\"dddd, MMM D, YYYY, h:mmA\")}\r\n \r\n \r\n \r\n \r\n Frequency\r\n \r\n \r\n {newsletter.recurrenceType === 'Adhoc' ?
    Adhoc
    :\r\n
    Every {newsletter.recurrenceType === \"Monthly\" ? `${newsletter.monthlyRecurrenceWeek} ${newsletter.monthlyRecurrenceDay}` : (newsletter.recurrenceType === 'Biweekly' ? `other ${moment(newsletter.firstIssueDateTime).format('dddd')}` : newsletter.dailyRecurrenceOn.join(\", \"))}
    }\r\n
    \r\n
    \r\n \r\n \r\n Topics used\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Include unread posts\r\n \r\n \r\n {newsletter.maxPostsToInclude > 0 ? 'Yes': 'No'}\r\n \r\n \r\n {newsletter.maxPostsToInclude > 0 &&\r\n
    \r\n \r\n \r\n \r\n Include up to {newsletter.maxPostsToInclude} unread posts in the last {newsletter.postsToIncludeDaysWindow} days\r\n \r\n \r\n
    \r\n }\r\n \r\n \r\n Include upcoming events\r\n \r\n \r\n {newsletter.maxEventsToInclude > 0 ? 'Yes': 'No'}\r\n \r\n \r\n {newsletter.maxEventsToInclude > 0 &&\r\n
    \r\n \r\n \r\n \r\n Include up to {newsletter.maxEventsToInclude} upcoming events in the next {newsletter.eventsToIncludeDaysWindow} days\r\n \r\n \r\n
    \r\n }\r\n
    \r\n } \r\n
    \r\n }\r\n
    \r\n
    \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n newsletter: SaveNewsletterModel;\r\n template: NewsletterTemplate;\r\n audiences: Audience[];\r\n headerImage?: File | null;\r\n footerImage?: File | null;\r\n defaultLcid: string;\r\n publishNewsletter: () => any;\r\n onClose:() => any;\r\n getUniqueUsers: (ids: string[], grabAll: boolean) => Promise;\r\n}\r\n\r\ninterface ComponentState {\r\n selectedTab: number;\r\n isLoading: boolean;\r\n uniqueUsers: number;\r\n}\r\n\r\nexport default NewsletterPreview;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { SaveNewsletterModelStateErrors } from \"modules/newsletters/models\";\r\n\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\nimport moment from \"moment\";\r\n\r\n\r\nimport \"../../styles/dialogs.sass\";\r\n\r\n\r\nclass SendTestEmailDialog extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n additionalAddresses: \"\"\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public render() {\r\n return (\r\n \r\n \r\n
    \r\n Send test email\r\n Sending a test email will give you a real-time preview of the newsletter issue that uses the current settings and placeholder posts and events.\r\n
    \r\n \r\n \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n
    Newsletter
    \r\n
    {this.props.newsletterTitle}
    \r\n
    \r\n {/* {!!this.props.availableIssues &&
    \r\n
    Issue
    \r\n
    \r\n this.setState({selectedIssueDate: e.target.value as string})}\r\n >\r\n {\r\n this.props.availableIssues.map((issueDate) =>\r\n {moment(issueDate).format(\"MMM D, YYYY\")}\r\n )}\r\n \r\n \r\n
    \r\n
    } */}\r\n
    \r\n
    To
    \r\n
    \r\n {this.props.userEmail}\r\n
    \r\n
    \r\n
    \r\n
    CC
    \r\n
    \r\n this.setState({additionalAddresses:event.target.value})}\r\n />\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n Cancel\r\n \r\n \r\n Send\r\n \r\n
    \r\n
    \r\n \r\n
    \r\n );\r\n }\r\n\r\n private onSend = () => {\r\n const additionalAddresses: string[] = this.state.additionalAddresses.split(/[,; ]/).filter(s=>!!s);\r\n const issueDate = !!this.state.selectedIssueDate ? moment(this.state.selectedIssueDate) : (!!this.props.issueDate ? moment(this.props.issueDate) : moment());\r\n this.props.sendTestEmail(this.props.newsletterId, issueDate.format(\"YYYY-MM-DD\"), additionalAddresses).then(result =>{\r\n if(!!result.success){\r\n this.props.onSuccess(\"Test email sent\");\r\n this.props.onClose();\r\n }else if(!!result.error){\r\n this.props.onError(result.error.ModelState);\r\n }\r\n });\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n issueDate?: string;\r\n availableIssues?: string[];\r\n newsletterId: string;\r\n newsletterTitle: string;\r\n onClose: () => void;\r\n onSuccess: (message: string) => any;\r\n onError: (modelErrors: SaveNewsletterModelStateErrors) => any;\r\n}\r\n\r\ninterface ComponentState {\r\n additionalAddresses: string;\r\n selectedIssueDate?: string;\r\n isSending?: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n userEmail: state.settings.currentUser.email\r\n }),\r\n {\r\n sendTestEmail: actions.sendTestEmail\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(SendTestEmailDialog);","import * as React from \"react\";\r\nimport { SaveNewsletterModel, SaveNewsletterModelStateErrors } from \"modules/newsletters/models\"\r\nimport TextField from \"@mui/material/TextField\";\r\nimport { Grid, Typography } from \"@mui/material\";\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\nimport _ from \"lodash\";\r\n\r\nclass SubjectAndPreHeader extends React.Component {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n this.state = {};\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n

    Compose the email

    \r\n
    \r\n \r\n \r\n Subject*\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n Preheader\r\n The Preheader is the text following the subject line when an email is previewed.\r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private OnPreheaderChange = (event) => {\r\n let currentContent = this.props.newsletter.translatedContent;\r\n currentContent[this.props.currentLcid].preheader = event.target.value;\r\n this.props.onNewsletterChange({translatedContent: currentContent});\r\n }\r\n\r\n private onSubjectChange = (event) => {\r\n let currentContent = this.props.newsletter.translatedContent;\r\n currentContent[this.props.currentLcid].subject = event.target.value;\r\n this.props.onNewsletterChange({translatedContent: currentContent});\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n newsletter: SaveNewsletterModel;\r\n modelErrors: SaveNewsletterModelStateErrors | null;\r\n highlight: boolean;\r\n onNewsletterChange: (value: Partial) => void;\r\n currentLcid: string;\r\n}\r\n\r\nexport default SubjectAndPreHeader;","import * as React from 'react';\r\n\r\ninterface componentProps {\r\n color?: string\r\n width?: string\r\n height?: string\r\n}\r\n\r\nexport default class UploadIcon extends React.Component {\r\n public render() {\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}","import * as React from \"react\";\r\nimport UploadIcon from \"./uploadIconSvg\";\r\n\r\nimport IconButton from \"@mui/material/IconButton\";\r\n\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\n\r\nimport \"./uploader.sass\";\r\nimport { NewsletterTemplateImageType } from \"modules/newsletters\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\n\r\ninterface ComponentProps {\r\n imageSrc?: File | null;\r\n imageType: NewsletterTemplateImageType;\r\n setImage: (imageType: string, image?: File) => void;\r\n imageHeight: number;\r\n imageWidth: number;\r\n selectedFile?: File;\r\n onError: (message:string) => any;\r\n onClearImage?: (imageType: string) => void;\r\n isLoading: boolean;\r\n}\r\n\r\ninterface ComponentState {\r\n errors: string[];\r\n dragging: boolean;\r\n imageSrc: string;\r\n}\r\n\r\nclass UploaderWithLoad extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n errors: [],\r\n dragging: false,\r\n imageSrc: !!props.imageSrc ? URL.createObjectURL(props.imageSrc) : \"\"\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n if (!this.state.imageSrc && !!this.props.imageSrc) {\r\n this.setState({ imageSrc: URL.createObjectURL(this.props.imageSrc) });\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: ComponentProps) {\r\n if (!!this.props.imageSrc && this.props.imageSrc !== prevProps.imageSrc) {\r\n this.setState({ imageSrc: URL.createObjectURL(this.props.imageSrc) });\r\n }\r\n }\r\n\r\n public render() {\r\n if (!this.state.imageSrc)\r\n return this.renderUploadForm();\r\n else\r\n return (\r\n
    \r\n \r\n \r\n \r\n \"preview\"\r\n
    \r\n );\r\n }\r\n\r\n private renderUploadForm() {\r\n let draggingProps = {\r\n onDrag: this.dragging(true),\r\n onDragStart: this.dragging(true),\r\n onDragEnd: this.dragging(false),\r\n onDragOver: this.dragging(true),\r\n onDragEnter: this.dragging(true),\r\n onDragLeave: this.dragging(false),\r\n onDrop: this.onFileDropped,\r\n };\r\n\r\n return (\r\n
    \r\n
    \r\n {!this.props.isLoading \r\n ?
    \r\n \r\n \r\n

    \r\n \r\n

    \r\n
    \r\n :
    \r\n \r\n Loading image...\r\n
    }\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private dragging = (isDragging: boolean, callback?: () => void) => (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n if (typeof callback !== \"function\") callback = () => { };\r\n\r\n this.setState(\r\n {\r\n ...this.state,\r\n dragging: isDragging,\r\n },\r\n callback\r\n );\r\n return false;\r\n };\r\n\r\n private onFileDropped = (e: React.DragEvent) => {\r\n const files = e.dataTransfer.files;\r\n if (files) {\r\n this.dragging(false, () => {\r\n this.setImage(files);\r\n })(e);\r\n }\r\n };\r\n\r\n private onFileInputChanged = (e: React.FormEvent) => {\r\n const files = (e.target as HTMLInputElement).files;\r\n if (files) {\r\n var acceptedFiles = this.acceptedFiles();\r\n if(acceptedFiles.indexOf(files[0].type) !== -1) {\r\n this.setImage(files);\r\n }\r\n else {\r\n this.setError(`The ${this.props.imageType.toLowerCase()} image should be a proper image file type`);\r\n this.setState({ imageSrc: '' });\r\n }\r\n }\r\n };\r\n\r\n private setImage = (files: FileList) => {\r\n if (files) {\r\n this.props.setImage(this.props.imageType, files[0]);\r\n this.setState({ imageSrc: URL.createObjectURL(files[0]) });\r\n }\r\n }\r\n\r\n private onImageLoad = ({ target: img }) => {\r\n if (img.naturalHeight !== this.props.imageHeight || img.naturalWidth !== this.props.imageWidth) {\r\n this.setError(`The ${this.props.imageType.toLowerCase()} image should be ${this.props.imageWidth}px wide x ${this.props.imageHeight}px tall`);\r\n this.setState({ imageSrc: '' });\r\n this.props.setImage(this.props.imageType, undefined);\r\n }\r\n }\r\n\r\n private clearImage = (e) => {\r\n this.setState({ imageSrc: '' });\r\n this.props.setImage(this.props.imageType, undefined);\r\n\r\n if(this.props.onClearImage && this.props.imageType !== 'Preview')\r\n this.props.onClearImage(this.props.imageType);\r\n }\r\n\r\n private setError(error: string) {\r\n this.props.onError(error);\r\n }\r\n\r\n private acceptedFiles = () => {\r\n return \"image/jpg,image/jpeg,image/png,image/bmp\";\r\n };\r\n}\r\n\r\nexport default UploaderWithLoad;","import * as React from \"react\";\r\n\r\nimport { Newsletter, SaveNewsletterModelStateErrors } from \"modules/newsletters/models\"\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { Grid, Link, Typography } from \"@mui/material\";\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport { NewsletterTemplate, SaveNewsletterModel } from \"modules/newsletters\";\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\nimport UploaderWithLoad from \"modules/newsletters/common/uploader/uploaderWithLoad\";\r\nimport { useTinyMceAuthoringLogic } from \"modules/common/hooks/useTinyMceAuthoringLogic\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport * as galleryActions from \"modules/gallery/actionCreator\";\r\nimport * as adminLayoutActions from \"modules/adminLayout/actionCreator\";\r\nimport { AuthoringTinyEditor } from \"modules/common/components/authoring/authoringTinyMce\";\r\nimport IntenseEmphasis from \"modules/common/components/authoring/dialogs/intenseEmphasis\";\r\n\r\n/**\r\n * TODO: This and headerFooter should be one component\r\n */\r\nconst HeaderAndFooterComponent: React.FunctionComponent = ({\r\n emailTemplate,\r\n isLoadingFooterImage,\r\n isLoadingHeaderImage,\r\n newsletter,\r\n headerImage,\r\n footerImage,\r\n defaultLcid,\r\n currentLcid,\r\n setImage,\r\n setHeaderStyle,\r\n setMainStyle,\r\n onError,\r\n onNewsletterChange,\r\n clearImage,\r\n getImage\r\n}) => {\r\n const {\r\n editorRef: headerRef,\r\n intenseEmphasisDialogOpen,\r\n onShowIntenseEmphasisDialog,\r\n onApplyIntenseEmphasis,\r\n onHideIntenseEmphasisDialog,\r\n } = useTinyMceAuthoringLogic(getImage);\r\n\r\n const bodyRef = React.useRef(null);\r\n const footerRef = React.useRef(null);\r\n\r\n const onChangeNewsletter = (value: Partial) => {\r\n onNewsletterChange(value);\r\n }\r\n\r\n const onHeaderChange = (event) => {\r\n let currentContent = newsletter.translatedContent;\r\n currentContent[currentLcid].header = event;\r\n onChangeNewsletter({ emailTemplateHeaderText: event, translatedContent: currentContent });\r\n }\r\n\r\n const onBodyChange = (event) => {\r\n let currentContent = newsletter.translatedContent;\r\n currentContent[currentLcid].body = event;\r\n onChangeNewsletter({ bodyText: event, translatedContent: currentContent });\r\n }\r\n\r\n const onFooterChange = (event) => {\r\n let currentContent = newsletter.translatedContent;\r\n currentContent[currentLcid].footer = event;\r\n onChangeNewsletter({ emailTemplateFooterText: event, translatedContent: currentContent });\r\n }\r\n\r\n const onFullscreen = (isFullscreen: boolean) => {\r\n if (isFullscreen) {\r\n // one more than side nav bar\r\n setMainStyle({ zIndex: 3 });\r\n setHeaderStyle({ display: \"none\" });\r\n } else {\r\n setMainStyle(undefined);\r\n setHeaderStyle(undefined);\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n
    \r\n {!emailTemplate.isCustom &&\r\n
    \r\n
    \r\n \r\n \r\n Header Image\r\n \r\n \r\n {isLoadingHeaderImage\r\n ?
    \r\n \r\n
    \r\n : \r\n }\r\n
    \r\n
    \r\n \r\n \r\n Header Text\r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n Body\r\n Enter any supporting messages or paragraphs.\r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n Footer Image\r\n \r\n \r\n {isLoadingFooterImage\r\n ?
    \r\n \r\n
    \r\n : \r\n }\r\n
    \r\n
    \r\n \r\n \r\n Footer Text\r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    }\r\n {emailTemplate.isCustom &&\r\n <>\r\n }\r\n text={\r\n \r\n \r\n Header and Footer images cannot be modified through the Newsletter Editor when using custom templates.\r\n Add or modify custom templates with the help of our Support team. window.open(\"https://support.sparrowconnected.com/en/how-do-i-create-a-custom-template-for-newsletters\")} underline=\"always\">Learn more.\r\n \r\n \r\n }\r\n />\r\n\r\n \r\n \r\n
    \r\n Body\r\n Enter any supporting messages or paragraphs.\r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n\r\n \r\n \r\n Footer Text\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n
    \r\n \r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n newsletter: SaveNewsletterModel;\r\n emailTemplate: NewsletterTemplate;\r\n modelErrors: SaveNewsletterModelStateErrors | null;\r\n footerImage?: File | null;\r\n headerImage?: File | null;\r\n isLoadingFooterImage?: boolean;\r\n isLoadingHeaderImage?: boolean;\r\n highlight: boolean;\r\n currentLcid: string;\r\n changedSinceSaved: boolean;\r\n onNewsletterChange: (value: Partial) => void;\r\n setImage: (imageType: string, image?: File) => void;\r\n clearImage?: (imageType: string) => void;\r\n onError: (message: string) => any;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n defaultLcid: state.settings.tenantSettings.defaultLCID,\r\n }),\r\n {\r\n getImage: galleryActions.getImage,\r\n setMainStyle: adminLayoutActions.setMainStyle,\r\n setHeaderStyle: adminLayoutActions.setHeaderStyle,\r\n }\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps;\r\nexport const HeaderAndFooter = connector(HeaderAndFooterComponent);\r\n","import * as React from \"react\";\r\n\r\n\r\nimport { ILanguage } from \"modules/localization/models\";\r\nimport { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle, FormControl, MenuItem, Select } from \"@mui/material\";\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n currentLanguagesWithText: ILanguage[];\r\n onConfirm: (lcid: string) => void;\r\n onCancel: () => void;\r\n }\r\n\r\n interface ComponentState {\r\n currentSelectLanguage: string;\r\n allLanguages: ILanguage[];\r\n }\r\n\r\nclass TranslateContentConfirmation extends React.Component {\r\n public render() {\r\n return (\r\n \r\n {\"Translate Content\"}\r\n \r\n Your post has multiple translations. Which language would you like to translate from?\r\n \r\n 0 ? this.props.currentLanguagesWithText[0].lcid : \"\" }\r\n onBlur={(e) => this.setSelectedValue(e)}\r\n >\r\n {this.props.currentLanguagesWithText.length > 0 && this.props.currentLanguagesWithText.map((language) => (\r\n {language.language}\r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private setSelectedValue = (event) => {\r\n this.setState({currentSelectLanguage: event.target.value})\r\n }\r\n\r\n private onConfirm = () => {\r\n this.props.onConfirm(this.state.currentSelectLanguage);\r\n }\r\n\r\n private onCancel = () => {\r\n this.props.onCancel();\r\n }\r\n\r\n}\r\n\r\nexport default TranslateContentConfirmation;\r\n","import { Dispatch, SetStateAction, useState } from \"react\";\r\nimport { DEFAULT_TRANSLATABLE_CONTENT, TranslatableContent, TranslatableNewsletterContent, TranslatedNewsletterContent } from \"../components/authoring/models\";\r\nimport { TranslatedContent } from \"modules/posts/models\";\r\n\r\n/**\r\n * Encapsulate accordion logic for analytics\r\n * @param {\r\n * translations: any; //Intended to be the [lcid]: {content} objects, but may be different depending on what is calling the hook.\r\n * defaultContent: any; //Same as above.\r\n * onChangeTranslatedContent: (toSet: any) => void;\r\n * translationHasContent: (lcid: string) => boolean;\r\n * onTranslate: (any) => void;\r\n * onSelectLanguage: (key: string) => void;\r\n * onRemoveLanguage: (key: string) => void;\r\n * }\r\n * @returns {\r\n * showTranslationDialog: boolean;\r\n * removeLanguage: string | undefined;\r\n * setRemoveLanguage: Dispatch>;\r\n * onRemoveTranslation: (item: Record) => void;\r\n * onSelectTranslation: (item: Record) => void;\r\n * onShowTranslationDialog: () => void\r\n * onCloseTranslationDialog: () => void;\r\n * onConfirmDialog: (inputLanguage: string) => void;\r\n * onConfirmRemoveLanguage: (lcidToRemove?: string) => void;\r\n * }\r\n */\r\n\r\nexport type TranslatedContentProps = {\r\n translations: TranslatedNewsletterContent | TranslatedContent; //Intended to be the [lcid]: {content} objects, but may be different depending on what is calling the hook.\r\n defaultContent: TranslatableNewsletterContent | TranslatableContent; //Same as above.\r\n onChangeTranslatedContent: (toSet: any) => void;\r\n translationHasContent: (lcid: string) => boolean | undefined;\r\n onTranslate: (any) => void;\r\n onSelectLanguage: (key: string) => void;\r\n onRemoveLanguage: (key: string) => void;\r\n}\r\n\r\nexport type TranslatedContentStatus = {\r\n showTranslationDialog: boolean;\r\n removeLanguage: string | undefined;\r\n setRemoveLanguage: Dispatch>;\r\n onRemoveTranslation: (item: Record) => void;\r\n onSelectTranslation: (item: Record) => void;\r\n onShowTranslationDialog: () => void;\r\n onCloseTranslationDialog: () => void;\r\n onConfirmDialog: (inputLanguage: string) => void;\r\n onConfirmRemoveLanguage: (lcidToRemove?: string) => void;\r\n}\r\n\r\nconst useTranslatedContent = (props: TranslatedContentProps): TranslatedContentStatus => {\r\n const [showTranslationDialog, setShowTranslationDialog] = useState(false);\r\n const [removeLanguage, setRemoveLanguage] = useState();\r\n\r\n /**\r\n * Check if a translation has content\r\n * - if it does, show confirm dialog\r\n * - otherwise, continue remove\r\n */\r\n const onRemoveTranslation = (item: Record) => {\r\n if (props.translationHasContent(item.key)) {\r\n setRemoveLanguage(item.key);\r\n } else {\r\n onConfirmRemoveLanguage(item.key);\r\n }\r\n };\r\n\r\n /**\r\n * Select a translation\r\n * - if translation does not exist, add it\r\n */\r\n const onSelectTranslation = (item: Record) => {\r\n props.onSelectLanguage(item.key);\r\n\r\n // add to translations\r\n let newTranslations = { ...props.translations };\r\n\r\n if (!Object.keys(newTranslations).includes(item.key)) {\r\n newTranslations[item.key] = DEFAULT_TRANSLATABLE_CONTENT;\r\n props.onChangeTranslatedContent(newTranslations);\r\n }\r\n };\r\n\r\n const removeTranslation = (lcid: string) => {\r\n // remove from translations\r\n let newTranslations = { ...props.translations };\r\n if (Object.keys(newTranslations).includes(lcid)) {\r\n delete newTranslations[lcid];\r\n props.onChangeTranslatedContent(newTranslations);\r\n }\r\n };\r\n\r\n /**\r\n * Handle showing the translation dialog\r\n */\r\n const onShowTranslationDialog = (): void => {\r\n setShowTranslationDialog(true);\r\n };\r\n\r\n /**\r\n * Handle closing the translation dialog\r\n */\r\n const onCloseTranslationDialog = () => {\r\n setShowTranslationDialog(false);\r\n };\r\n\r\n /**\r\n * Handle dialog selection for the translation dialog\r\n */\r\n const onConfirmDialog = (inputLanguage: string) => {\r\n setShowTranslationDialog(false);\r\n props.onTranslate(inputLanguage);\r\n };\r\n\r\n /**\r\n * Handle confirm remove language or remove language with no content\r\n * @param lcidToRemove - used when no content (no confirm dialog)\r\n */\r\n const onConfirmRemoveLanguage = (lcidToRemove?: string) => {\r\n lcidToRemove = lcidToRemove || removeLanguage;\r\n\r\n if (lcidToRemove) {\r\n props.onRemoveLanguage(lcidToRemove); // prop function\r\n removeTranslation(lcidToRemove); // internal function\r\n setRemoveLanguage(undefined);\r\n }\r\n }\r\n\r\n return {\r\n showTranslationDialog,\r\n removeLanguage,\r\n setRemoveLanguage,\r\n onRemoveTranslation,\r\n onSelectTranslation,\r\n onShowTranslationDialog,\r\n onCloseTranslationDialog,\r\n onConfirmDialog,\r\n onConfirmRemoveLanguage\r\n }\r\n}\r\n\r\nexport default useTranslatedContent;\r\n","import React from \"react\";\r\n\r\nimport { Button, IconButton, PopoverOrigin } from \"@mui/material\";\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\n\r\nimport Callout from \"../../callout\";\r\n\r\nimport \"../styles/calloutMultiselect.sass\";\r\n\r\n// think about extending callout props\r\ninterface ICalloutMultiselectProps {\r\n items: Record[];\r\n open: boolean;\r\n setOpen: (toSet: boolean) => void;\r\n anchorEl: HTMLElement | null;\r\n activeValue?: string;\r\n defaultValue?: string;\r\n selectedValues?: string[];\r\n anchorOrigin?: PopoverOrigin;\r\n onSelectItem: (item: Record) => void;\r\n onAddItem: (item: Record) => void; // add button click\r\n onRemoveItem: (item: Record) => void; // list item click\r\n fullSize?: boolean;\r\n}\r\n\r\nconst CalloutMultiselect: React.FunctionComponent = ({\r\n items,\r\n open,\r\n anchorEl,\r\n selectedValues = [],\r\n activeValue = \"\",\r\n defaultValue = \"\",\r\n anchorOrigin,\r\n onAddItem,\r\n onRemoveItem,\r\n onSelectItem,\r\n setOpen,\r\n fullSize = false\r\n}) => {\r\n const getActions = (isDefault: boolean, isSelected: boolean, item: Record): JSX.Element => {\r\n if (isDefault) return <>;\r\n\r\n let element: JSX.Element;\r\n if (isSelected)\r\n element = {\r\n onRemoveItem(item);\r\n }}\r\n className=\"action\"\r\n >\r\n \r\n ;\r\n else\r\n element = {\r\n onAddItem(item);\r\n }}\r\n className=\"action\"\r\n >\r\n Add\r\n \r\n\r\n return element;\r\n }\r\n\r\n return (\r\n \r\n {items.map((item: Record) => {\r\n const isActive = item.key === activeValue;\r\n const isDefault = item.key === defaultValue;\r\n const isSelected = selectedValues.find((selectedItem) => selectedItem === item.key) !== undefined;\r\n\r\n return (\r\n
    \r\n \r\n {isDefault &&\r\n Default}\r\n {getActions(isDefault, isSelected, item)}\r\n
    \r\n );\r\n })}\r\n \r\n );\r\n}\r\n\r\nexport default CalloutMultiselect;\r\n","import React, { useState } from \"react\";\r\n\r\nimport { MoreVert } from '@mui/icons-material';\r\nimport TranslateIcon from \"@mui/icons-material/Translate\";\r\nimport { Button, PopoverOrigin, useTheme, useMediaQuery } from \"@mui/material\";\r\n\r\nimport CalloutMultiselect from \"modules/common/components/forms/inputs/calloutMultiselect\";\r\nimport { ILanguage } from \"../models\";\r\n\r\nimport \"../styles/languageBar.sass\";\r\n\r\ninterface ILanguageProps {\r\n languages: Record[];\r\n activeLcid: string;\r\n defaultLcid: string;\r\n selectedLanguages: ILanguage[];\r\n anyAvailableTranslationsCheck: boolean;\r\n hide?: boolean;\r\n onAddLanguage: (lang: Record) => void;\r\n onRemoveLanguage: (lang: Record) => void;\r\n onSelectLanguage: (lang: Record) => void;\r\n onTranslate: () => void;\r\n onOpen?: () => void;\r\n startIcon?: JSX.Element;\r\n endIcon?: JSX.Element;\r\n anchorOrigin?: PopoverOrigin;\r\n}\r\n\r\n/**\r\n * Language selector tool bar\r\n */\r\nconst LanguageBar: React.FunctionComponent = ({\r\n languages,\r\n activeLcid,\r\n selectedLanguages,\r\n defaultLcid,\r\n anyAvailableTranslationsCheck,\r\n hide = false,\r\n startIcon,\r\n endIcon,\r\n anchorOrigin,\r\n onAddLanguage,\r\n onRemoveLanguage,\r\n onTranslate,\r\n onOpen,\r\n ...restProps\r\n}) => {\r\n const theme = useTheme();\r\n const isSmallScreen = useMediaQuery(theme.breakpoints.down('sm'));\r\n\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const [calloutOpen, setCalloutOpen] = useState(false);\r\n\r\n const onButtonClick = (event: React.MouseEvent) => {\r\n if (onOpen)\r\n onOpen();\r\n\r\n setAnchorEl(event.currentTarget);\r\n setCalloutOpen(true);\r\n }\r\n\r\n /**\r\n * Close popout and send langauge to parent\r\n */\r\n const onSelectLanguage = (lang: Record) => {\r\n setCalloutOpen(false);\r\n restProps.onSelectLanguage(lang);\r\n }\r\n\r\n return (\r\n <>\r\n {!hide &&\r\n
    \r\n \r\n }\r\n onClick={onTranslate}\r\n disabled={anyAvailableTranslationsCheck}\r\n >\r\n TRANSLATE\r\n \r\n {anchorEl && lang.lcid)}\r\n onAddItem={onAddLanguage}\r\n onSelectItem={onSelectLanguage}\r\n onRemoveItem={onRemoveLanguage}\r\n />}\r\n
    \r\n }\r\n \r\n );\r\n}\r\n\r\nexport default LanguageBar;\r\n","import TranslateContentConfirmation from 'modules/common/components/authoring/dialogs/translateContentConfirmation';\r\nimport { DEFAULT_TRANSLATABLE_NEWSLETTER_CONTENT, TranslatableNewsletterContent, TranslatedNewsletterContent } from 'modules/common/components/authoring/models';\r\nimport ConfirmDialog from 'modules/common/components/dialogs/confirmDialog';\r\nimport useTranslatedContent from 'modules/common/hooks/useTranslatedContent';\r\nimport LanguageBar from 'modules/localization/components/languageBar';\r\nimport { ILanguage } from 'modules/localization/models';\r\nimport { lcidMappings } from 'modules/resources';\r\nimport * as React from 'react';\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nconst CONFIRM_REPLACE_TRANSLATION = {\r\n text:
    Are you sure you want to replace the existing content?
    ,\r\n title: \"Replace content\",\r\n};\r\n\r\nconst NewsletterLanguageBar: React.FunctionComponent = props => {\r\n const [checkIfAnyTranslatableContent, setCheckIfAnyTranslatableContent] = React.useState(false);\r\n const [translatableLanguagesWithText, setTranslatableLanguagesWithText] = React.useState([]);\r\n const translations = props.newsletterContent;\r\n\r\n const translationHasContent = (lcid: string) =>\r\n translations &&\r\n translations[lcid] &&\r\n (\r\n Boolean(translations[lcid].subject) || \r\n Boolean(translations[lcid].body) || \r\n Boolean(translations[lcid].footer) || \r\n Boolean(translations[lcid].header) || \r\n Boolean(translations[lcid].preheader)\r\n );\r\n\r\n /**\r\n * Handle translate click\r\n * - show dialog if translate will replace content\r\n */\r\n const onTranslate = async (inputLanguage: string) => {\r\n if (!translations || !inputLanguage) return;\r\n\r\n let translate = true;\r\n const outputLanguage = props.availableLanguages?.find((language: ILanguage) => language.lcid === props.activeLcid);\r\n\r\n // show confirm dialog\r\n if (translationHasContent(props.activeLcid)) translate = await confirm.show(CONFIRM_REPLACE_TRANSLATION);\r\n\r\n // do the translation and update state\r\n if (translate && outputLanguage) {\r\n const translation = await props.getNewsletterTranslation( \r\n translations[inputLanguage],\r\n outputLanguage.lcid,\r\n inputLanguage,\r\n props.newsletterId ?? \"00000000-0000-0000-0000-000000000000\"\r\n );\r\n\r\n let newTranslations = { ...translations };\r\n newTranslations[props.activeLcid] = {\r\n ...translation,\r\n\r\n header: translation.header.length > 0 ? `

    [${props.lcidMappings[props.activeLcid].autoTranslateText}]

    ${translation.header}` : \"\",\r\n body: translation.body.length > 0 ? `

    [${props.lcidMappings[props.activeLcid].autoTranslateText}]

    ${translation.body}` : \"\",\r\n footer: translation.footer.length > 0 ? `

    [${props.lcidMappings[props.activeLcid].autoTranslateText}]

    ${translation.footer}` : \"\",\r\n };\r\n\r\n props.onChangeTranslatedContent(newTranslations);\r\n }\r\n };\r\n\r\n const {\r\n showTranslationDialog,\r\n removeLanguage,\r\n onRemoveTranslation,\r\n setRemoveLanguage,\r\n onSelectTranslation,\r\n onShowTranslationDialog,\r\n onCloseTranslationDialog,\r\n onConfirmDialog,\r\n onConfirmRemoveLanguage\r\n } = useTranslatedContent({\r\n translations: translations, \r\n defaultContent: DEFAULT_TRANSLATABLE_NEWSLETTER_CONTENT,\r\n onChangeTranslatedContent: props.onChangeTranslatedContent,\r\n translationHasContent: translationHasContent,\r\n onTranslate: onTranslate,\r\n onSelectLanguage: props.onSelectLanguage,\r\n onRemoveLanguage: props.onRemoveLanguage\r\n });\r\n\r\n React.useEffect(() => {\r\n function setLanguageTranslationAvailability() {\r\n let currentAvailableTranslations = { ...translations };\r\n let languagesWithText: ILanguage[] = [];\r\n let allAddedLanguages: ILanguage[] = [];\r\n\r\n Object.keys(currentAvailableTranslations).forEach((nextLanguage) => {\r\n //Only subject is mandatory, so we only check that one.\r\n if (props.availableLanguages && translations && translations[nextLanguage].subject) {\r\n let matchingLang = props.availableLanguages.find((l) => l.lcid === nextLanguage);\r\n\r\n if (matchingLang) {\r\n languagesWithText.push(matchingLang);\r\n }\r\n }\r\n\r\n if (props.availableLanguages && translations) {\r\n let matchingLang = props.availableLanguages.find((l) => l.lcid === nextLanguage);\r\n\r\n if (matchingLang) {\r\n allAddedLanguages.push(matchingLang);\r\n }\r\n }\r\n });\r\n\r\n if (languagesWithText.length >= 1 && allAddedLanguages.length > 1) {\r\n setCheckIfAnyTranslatableContent(false);\r\n } else {\r\n setCheckIfAnyTranslatableContent(true);\r\n }\r\n\r\n setTranslatableLanguagesWithText(languagesWithText);\r\n }\r\n\r\n setLanguageTranslationAvailability();\r\n }, [translations, props.availableLanguages]);\r\n\r\n return (\r\n
    \r\n ({ key: lang.lcid, value: lang.language })) || []}\r\n activeLcid={props.activeLcid}\r\n defaultLcid={props.defaultLcid}\r\n selectedLanguages={props.selectedLanguages || []}\r\n onAddLanguage={onSelectTranslation}\r\n onRemoveLanguage={onRemoveTranslation}\r\n onSelectLanguage={onSelectTranslation}\r\n onTranslate={onShowTranslationDialog}\r\n anyAvailableTranslationsCheck={checkIfAnyTranslatableContent}\r\n hide={props.availableLanguages?.length === 1}\r\n />\r\n {showTranslationDialog && (\r\n \r\n )}\r\n {removeLanguage && (\r\n setRemoveLanguage(undefined)}\r\n onConfirm={() => setRemoveLanguage(undefined)} // KEEP\r\n onDeny={() => onConfirmRemoveLanguage()}\r\n >\r\n
    \r\n You have content on this language. Removing the language will clear the translated work you've done.\r\n
    \r\n
    \r\n Do you want to continue?\r\n
    \r\n \r\n )}\r\n
    \r\n )\r\n}\r\n\r\ninterface ComponentProps {\r\n newsletterContent: TranslatedNewsletterContent;\r\n onChangeTranslatedContent: (newValue: TranslatedNewsletterContent) => void;\r\n getNewsletterTranslation: (toTranslate: TranslatableNewsletterContent, targetLcid: string, inputLcid: string, newsletterId: string) => Promise;\r\n\r\n availableLanguages: ILanguage[] | undefined;\r\n selectedLanguages: ILanguage[] | undefined;\r\n activeLcid: string;\r\n defaultLcid: string;\r\n lcidMappings: lcidMappings;\r\n newsletterId?: string;\r\n onRemoveLanguage: ( lcid: string ) => void;\r\n onSelectLanguage: ( lcid: string ) => void; \r\n}\r\n\r\nexport default NewsletterLanguageBar;","import React, { useEffect, useState } from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\n\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { ILanguage } from \"modules/localization/models\";\r\nimport { TranslatedNewsletterContent } from \"../../components/authoring/models\";\r\nimport { lcidMappings } from \"modules/resources\";\r\nimport { IHeaderTranslation } from \"modules/contentBands/models\";\r\nimport { TranslatablePostContent } from \"modules/posts/models\";\r\n\r\n/**\r\n * Custom hook to encapsulate some language logic.\r\n *\r\n * returns {\r\n * - availableLanguages - tenant's languages available for selection\r\n * - selectedLanguages - current selected languages\r\n * - activeLcid - current language being viewed\r\n * - defaultLcid - tenant's default lcid\r\n * - lcidMappings - lcidMappingsResource\r\n * - onRemoveLanguage - function hanlder to remove a selected language\r\n * - onSelectLanguage - function handler to add a language and set it as active\r\n * }\r\n */\r\nexport type useLanguagesData = {\r\n availableLanguages: ILanguage[] | undefined;\r\n selectedLanguages: ILanguage[] | undefined;\r\n activeLcid: string;\r\n defaultLcid: string;\r\n lcidMappings: lcidMappings;\r\n onRemoveLanguage: (lcid: string) => void;\r\n onSelectLanguage: (lcid: string) => void;\r\n};\r\n\r\nconst useLanguages = (translations?: Record | undefined): useLanguagesData => {\r\n const tenantSettings = useSelector((state: GlobalApplicationState) => state.settings.tenantSettings);\r\n const lcidMappings: lcidMappings = useSelector((state: GlobalApplicationState) => state.resources.lcidMappings);\r\n\r\n const [availableLanguages, setAvailableLanguages] = useState();\r\n const [selectedLanguages, setSelectedLanguages] = useState();\r\n const [activeLcid, setActiveLcid] = useState(tenantSettings.defaultLCID || \"en-us\");\r\n\r\n /**\r\n * Grab available languages data\r\n */\r\n const loadAvailableLanguages = React.useCallback(() => {\r\n if (!lcidMappings || !tenantSettings) return [];\r\n\r\n const defaultLcid: string = tenantSettings.defaultLCID;\r\n const lcids: string[] = Object.keys(tenantSettings.translatedContent);\r\n let languages: ILanguage[] = [];\r\n\r\n // handle default lcid\r\n languages.push({\r\n availableForTranslation: false,\r\n language: lcidMappings[defaultLcid][\"languageInEnglish\"] || lcidMappings[defaultLcid].language.split(\" \")[0],\r\n lcid: defaultLcid,\r\n translateAs: defaultLcid,\r\n visible: true,\r\n });\r\n\r\n // handle rest of lcids\r\n lcids.forEach((lcid) => {\r\n if (lcid !== defaultLcid) {\r\n const currentMapping = lcidMappings[lcid];\r\n\r\n if (currentMapping) {\r\n languages.push({\r\n availableForTranslation: currentMapping[\"availableForTranslation\"],\r\n language: currentMapping[\"languageInEnglish\"] || currentMapping.language.split(\" \")[0],\r\n lcid: lcid,\r\n translateAs: currentMapping[\"translateAs\"],\r\n visible: !!translations && !!translations[lcid],\r\n });\r\n }\r\n }\r\n });\r\n\r\n setAvailableLanguages(languages);\r\n }, [lcidMappings, tenantSettings, translations]);\r\n\r\n /**\r\n * Load selected languages on changes to available languages and translations prop\r\n */\r\n useEffect(() => {\r\n if (availableLanguages && translations) {\r\n let newSelected: ILanguage[] = [];\r\n // grab each language in translations prop\r\n Object.keys(translations).forEach((key: string) => {\r\n // find in available languages\r\n let available = availableLanguages.find((lang: ILanguage) => lang.lcid === key);\r\n if (available) newSelected.push(available);\r\n\r\n setSelectedLanguages(newSelected);\r\n });\r\n }\r\n }, [availableLanguages, translations, loadAvailableLanguages]);\r\n\r\n /**\r\n * Load available languages on changes to tenant settings or lcid mappings\r\n */\r\n useEffect(() => {\r\n loadAvailableLanguages();\r\n }, [tenantSettings, lcidMappings, loadAvailableLanguages]);\r\n\r\n const onAddLanguage = (lcid: string): void => {\r\n let selected = selectedLanguages?.find((lang: ILanguage) => lang.lcid === lcid);\r\n let available = availableLanguages?.find((lang: ILanguage) => lang.lcid === lcid);\r\n\r\n if (!selected && available) {\r\n let newSelected = selectedLanguages ? [...selectedLanguages] : [];\r\n newSelected.push(available);\r\n\r\n setSelectedLanguages(newSelected);\r\n }\r\n };\r\n\r\n /**\r\n * Remove language from selected list\r\n * - also sets active lcid to tenant default if language removed was the active one\r\n */\r\n const onRemoveLanguage = (lcid: string): void => {\r\n let selected = selectedLanguages?.find((lang: ILanguage) => lang.lcid === lcid);\r\n if (selected && selectedLanguages) {\r\n let newSelected = [...selectedLanguages];\r\n newSelected = newSelected.filter((lang: ILanguage) => lang.lcid !== lcid);\r\n\r\n setSelectedLanguages(newSelected);\r\n\r\n // set active language to default if language to remove was active one\r\n if (lcid === activeLcid) setActiveLcid(tenantSettings.defaultLCID);\r\n }\r\n };\r\n\r\n const onSelectLanguage = (lcid: string): void => {\r\n onAddLanguage(lcid);\r\n setActiveLcid(lcid);\r\n };\r\n\r\n return {\r\n availableLanguages,\r\n selectedLanguages,\r\n activeLcid,\r\n defaultLcid: tenantSettings.defaultLCID,\r\n lcidMappings,\r\n onRemoveLanguage,\r\n onSelectLanguage,\r\n };\r\n};\r\n\r\nexport default useLanguages;\r\n","export function deepCopy(value: T): T {\r\n let stringified = JSON.stringify(value);\r\n\r\n return JSON.parse(stringified);\r\n}\r\n","import moment from 'moment';\r\nimport { useEffect } from 'react';\r\n\r\nexport const useDefaultLocale = () => {\r\n useEffect(() => {\r\n moment.locale(\"en\");\r\n }, []);\r\n};\r\n","import React, { useState } from \"react\";\r\n\r\nimport { AppBar, Button, ButtonGroup, Dialog, IconButton, Slide, SlideProps, Toolbar, useMediaQuery, useTheme } from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { Launch, InfoOutlined } from \"@mui/icons-material\";\r\n\r\nimport DesktopPreview from \"../desktopPreview\";\r\nimport LoadingOverlay from \"../../loadingOverlay\";\r\nimport { TeamsPreview } from \"../teamsPreview\";\r\nimport { MobilePreview } from \"../mobilePreview\";\r\nimport { MobileAppPages } from \"modules/contentBands/models\";\r\n\r\nimport \"../styles/preview.sass\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport Disclaimer from \"../../disclaimer\";\r\nimport PlainPreview from \"./plainPreview\";\r\n\r\nexport enum PreviewType {\r\n Mobile,\r\n Desktop,\r\n Teams,\r\n Plain\r\n}\r\n\r\nexport interface IPreview {\r\n label: string;\r\n component: JSX.Element;\r\n type: PreviewType;\r\n}\r\n\r\ninterface IPreviewProps {\r\n open: boolean;\r\n previews?: IPreview[];\r\n editLabel?: string;\r\n openLabel?: string;\r\n publishLabel?: string;\r\n disablePublish?: boolean;\r\n extraLabel?: string;\r\n extraLabelStartIcon?: JSX.Element;\r\n activePage?: MobileAppPages;\r\n appName?: string;\r\n onClose: () => void;\r\n openAction?: () => void;\r\n editAction?: () => void;\r\n publishAction?: () => void;\r\n extraAction?: () => void;\r\n isLoading?: boolean;\r\n previewHelpText?: string;\r\n}\r\n\r\nconst Transition = React.forwardRef(function Transition(props: SlideProps, ref) {\r\n return ;\r\n});\r\n\r\nconst Preview: React.FunctionComponent = ({ isLoading = false, activePage = MobileAppPages.Home, previews, ...props }) => {\r\n const theme = useTheme();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down(\"sm\"), { noSsr: true });\r\n const previewsToUse = isSmallAndSmaller ? previews?.filter((preview: IPreview) => preview.type !== PreviewType.Teams) : previews;\r\n\r\n const [activePreview, setActivePreview] = useState(0);\r\n const { displayName, mobileEventsEnabled } = useSelector((state: GlobalApplicationState) => state.settings.tenantSettings);\r\n\r\n const getActivePreview = (): JSX.Element => {\r\n const active = previewsToUse && previewsToUse[activePreview];\r\n\r\n switch (active?.type) {\r\n case PreviewType.Mobile:\r\n return {active.component};\r\n case PreviewType.Desktop:\r\n return {active.component};\r\n case PreviewType.Teams:\r\n return (\r\n \r\n {active.component}\r\n \r\n );\r\n case PreviewType.Plain:\r\n return {active.component};\r\n default:\r\n return <>;\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n

    Preview

    \r\n {previewsToUse && previewsToUse.length > 1 && (\r\n \r\n {previewsToUse.map((prvw: IPreview, idx: number) => (\r\n setActivePreview(idx)}\r\n >\r\n {prvw.label}\r\n \r\n ))}\r\n \r\n )}\r\n
    \r\n {props.openAction && props.openLabel && (\r\n }\r\n variant=\"text\"\r\n color=\"primary\"\r\n onClick={props.openAction}\r\n >\r\n {props.openLabel}\r\n \r\n )}\r\n {props.editAction && props.editLabel && (\r\n \r\n {props.editLabel}\r\n \r\n )}\r\n {props.publishAction && props.publishLabel && (\r\n \r\n {props.publishLabel}\r\n \r\n )}\r\n {props.extraAction && props.extraLabel && (\r\n \r\n {props.extraLabel}\r\n \r\n )}\r\n props.onClose()}\r\n aria-label=\"close\"\r\n size=\"large\"\r\n >\r\n \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n {isSmallAndSmaller && previews && previews.some((preview: IPreview) => preview.type === PreviewType.Teams) && (\r\n }\r\n containerStyle={{\r\n width: 407,\r\n marginBottom: 20,\r\n boxSizing: \"border-box\",\r\n }}\r\n />\r\n )}\r\n {getActivePreview()}\r\n {previews && previews.length > 0 &&

    {props.previewHelpText ?? \"Preview varies based on device and/or platform.\"}

    }\r\n {props.children}\r\n
    \r\n
    \r\n \r\n );\r\n};\r\n\r\nexport default Preview;\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { Prompt, RouteComponentProps } from \"react-router-dom\";\r\nimport * as actions from \"../actionCreator\";\r\nimport * as audiencesActions from \"modules/audiences/actionCreator\";\r\nimport * as settingsActions from \"modules/settings/actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport _ from \"lodash\";\r\n\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport SuccessSnackbar from \"modules/common/components/snackbars/successSnackbar\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Breadcrumb from \"pages/common/breadcrumb\";\r\nimport Columns from \"pages/common/columns\";\r\nimport MainContent from \"pages/common/mainContent\";\r\nimport MainContentWithFooter from \"pages/common/mainContentWithFooter\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Hidden from \"@mui/material/Hidden\";\r\nimport TitleSection from \"./components/title\";\r\nimport { ProgressSection } from \"./components/progress\";\r\nimport TemplateSection from \"./components/templateSection\";\r\nimport SettingsSection from \"./components/settingsSection\";\r\nimport NewsletterPreview from \"./components/newsletterPreview\";\r\nimport \"modules/common/components/authoring/authoring.sass\";\r\nimport {\r\n Address,\r\n FOOTER,\r\n HEADER,\r\n NewsletterDetails,\r\n NewsletterImageType,\r\n NewsletterTemplate,\r\n NewsletterTemplateImageType,\r\n NewsletterTheme,\r\n NewsletterThemeSimple,\r\n SaveNewsletterModel,\r\n SaveNewsletterModelStateErrors,\r\n NewsletterDigest,\r\n UploadNewsletterImageModel,\r\n} from \"modules/newsletters\";\r\nimport \"../styles/newsletter.sass\";\r\nimport \"../styles/progress-bar.sass\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport {\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogContentText,\r\n DialogTitle,\r\n Divider,\r\n Grid,\r\n IconButton,\r\n Link,\r\n List,\r\n TextField,\r\n Typography,\r\n} from \"@mui/material\";\r\nimport { Audience } from \"modules/audiences/models\";\r\nimport SendTestEmailDialog from \"../common/dialogs/sendTestEmailDialog\";\r\nimport Tabs from \"pages/common/tabs\";\r\nimport SubjectAndPreHeader from \"./components/subjectAndPreHeader\";\r\nimport { HeaderAndFooter } from \"./components/headerAndFooter\";\r\nimport MoreOptionsButton from \"modules/common/components/buttons/moreOptionsButton\";\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport OpenInNewIcon from \"@mui/icons-material/OpenInNew\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport { hexCodeFromText } from \"utils/hexFunctions\";\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\nimport { getBase64, standardTemplateNames } from \"utils/newsletterUtils\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\nimport NewsletterLanguageBar from \"./components/newsletterLanguageBar\";\r\nimport { TranslatedNewsletterContent } from \"modules/common/components/authoring/models\";\r\nimport useLanguages from \"modules/common/hooks/data/useLanguages\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { deepCopy } from \"utils/deepCopy\";\r\nimport { useDefaultLocale } from \"modules/common/hooks/useDefaultLocale\";\r\n\r\n//TODO: Chop this component up into smaller parts, it's way too big.\r\nconst EditNewsletterPage: React.FunctionComponent = (props) => {\r\n const getNewNewsletter = (): SaveNewsletterModel => {\r\n const { tenantSettings } = props;\r\n\r\n const newsletter: SaveNewsletterModel = {\r\n status: \"Draft\",\r\n allowUnsubscribe: true,\r\n audiences: [],\r\n customTopics: [],\r\n dailyRecurrenceOn: [\"Monday\"],\r\n monthlyRecurrenceWeek: \"First\",\r\n monthlyRecurrenceDay: \"Monday\",\r\n description: \"\",\r\n emailPreheader: \"\",\r\n emailSubject: \"\",\r\n recurrenceType: \"Adhoc\",\r\n emailTemplateHeaderText: \"\",\r\n emailTemplateFooterText: \"\",\r\n bodyText: \"\",\r\n emailTemplateId: \"\",\r\n maxEventsToInclude: 0,\r\n eventsToInclude: \"SinceLastIssue\",\r\n eventsToIncludeDaysWindow: 0,\r\n includeUpcomingEvents: false,\r\n postsToInclude: \"SinceLastIssue\",\r\n maxPostsToInclude: 4,\r\n postsToIncludeDaysWindow: 7,\r\n sortPostsAscending: true,\r\n title: \"\",\r\n topicOption: \"Employee\",\r\n tenantId: tenantSettings.tenantId,\r\n fromEmailAddress: \"\",\r\n fromEmailName: \"\",\r\n translatedContent: { defaultLcid: { subject: \"\", preheader: \"\", header: \"\", body: \"\", footer: \"\" } },\r\n\r\n //Overwritten on page load.\r\n newsletterTheme: {\r\n themeId: \"\",\r\n emailBackground: \"#F5F5F5\",\r\n primaryBackground: \"#FEFEFA\",\r\n primaryText: \"#333333\",\r\n secondaryBackground: \"#949494\",\r\n secondaryText: \"#FFFFFF\",\r\n linkText: \"#3B78AB\",\r\n },\r\n };\r\n return newsletter;\r\n };\r\n\r\n const getCommands = (): JSX.Element => {\r\n const currentStatus = !!serverNewsletter ? serverNewsletter.status : \"Draft\";\r\n const currentlyCustomTemplate = templates?.find((t) => t.id === newsletter.emailTemplateId)?.isCustom;\r\n \r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n setSaveTemplateOpen(true);\r\n setTemplateXClicked(false);\r\n }}\r\n disabled={currentlyCustomTemplate}\r\n />\r\n \r\n \r\n {currentStatus === \"Draft\" && (\r\n \r\n )}\r\n \r\n \r\n );\r\n };\r\n\r\n const saveNewsletter = (newsletter: SaveNewsletterModel): Promise => {\r\n setHighlightTitleFields(false);\r\n setIsSaving(true);\r\n setErrorMessage(null);\r\n return props.saveNewsletter(newsletter).then((response) => {\r\n if (!!response.success) {\r\n saveHeaderFooterImage(response.success);\r\n\r\n setChangedSinceSaved(false);\r\n setIsSaving(false);\r\n setServerNewsletter({\r\n ...response.success,\r\n futureIssues: [],\r\n sentIssueTags: [],\r\n emailBackground: \"\",\r\n primaryBackground: \"\",\r\n primaryText: \"\",\r\n secondaryBackground: \"\",\r\n secondaryText: \"\",\r\n linkTexts: \"\",\r\n newsletterTheme: {\r\n themeId: \"\",\r\n emailBackground: \"\",\r\n primaryBackground: \"\",\r\n primaryText: \"\",\r\n secondaryBackground: \"\",\r\n secondaryText: \"\",\r\n linkText: \"\",\r\n },\r\n });\r\n setModelErrors(null);\r\n\r\n if (newsletter.id === undefined) {\r\n let newNewsletter = newsletter;\r\n newNewsletter.id = response.success.id;\r\n setNewsletter(newNewsletter);\r\n props.redirectTo(`/${props.tenant}/admin/newsletters/${response.success.id}`);\r\n }\r\n\r\n return true;\r\n } else if (!!response.error) {\r\n const firstError = _.first(_.values(response.error.ModelState));\r\n setChangedSinceSaved(false);\r\n setIsSaving(false);\r\n setModelErrors(response.error.ModelState);\r\n setErrorMessage(firstError && _.first(firstError));\r\n if (isTemplateSectionInError()) {\r\n setTemplateSection();\r\n } else {\r\n setAudienceFrequencySection();\r\n }\r\n }\r\n return false;\r\n });\r\n };\r\n\r\n const checkAndHighlightTitleFields = () => {\r\n if (!newsletter.title) setHighlightTitleFields(true);\r\n };\r\n\r\n const onComposeClicked = () => {\r\n setSelectedTab(1);\r\n setHighlightSubjectAndHeader(true);\r\n setHighlightSenderDetails(false);\r\n };\r\n\r\n const onFrequencyClicked = () => {\r\n setSelectedTab(2);\r\n setHighlightSenderDetails(true);\r\n setHighlightSubjectAndHeader(false);\r\n };\r\n\r\n const setNewsletterToState = (\r\n newsletter: SaveNewsletterModel,\r\n selectedTemplate: NewsletterTemplate | undefined,\r\n selectedTheme: NewsletterTheme | undefined,\r\n isChanged: boolean\r\n ) => {\r\n const titleSectionIsComplete = isTitleSectionComplete(newsletter);\r\n const templateSectionIsComplete = isTemplateSectionComplete(newsletter);\r\n const audienceFrequencySectionIsComplete = isFrequencySectionComplete(newsletter);\r\n const composeSectionIsComplete = isComposeSectionComplete(newsletter);\r\n\r\n setNewsletter(newsletter);\r\n setHighlightTitleFields(false);\r\n setSelectedTemplate(selectedTemplate);\r\n setSelectedTheme(selectedTheme);\r\n setChangedSinceSaved(isChanged);\r\n\r\n setProgressCheck({\r\n isComplete:\r\n titleSectionIsComplete && templateSectionIsComplete && audienceFrequencySectionIsComplete && composeSectionIsComplete,\r\n titleSectionIsComplete: titleSectionIsComplete,\r\n audienceFrequencySectionIsComplete: audienceFrequencySectionIsComplete,\r\n templateSectionIsComplete: templateSectionIsComplete,\r\n composeSectionIsComplete: composeSectionIsComplete,\r\n });\r\n };\r\n\r\n const onChangeNewsletter = (value: Partial) => {\r\n const newsletterToSet = { ...newsletter, ...value };\r\n const selectedTemplate = _.first(_.filter(templates, (t) => t.id === newsletter.emailTemplateId));\r\n const selectedTheme = _.first(_.filter(themes, (t) => t.id === newsletter.newsletterTheme.themeId));\r\n setNewsletterToState(newsletterToSet, selectedTemplate, selectedTheme, true);\r\n };\r\n\r\n const renderFooter = (): React.ReactNode => {\r\n if (selectedTab === 0) {\r\n return returnTemplateOptions();\r\n } else if (selectedTab === 1) {\r\n return returnContentOptions();\r\n } else if (selectedTab === 2) {\r\n return returnSettingsOptions();\r\n } else {\r\n return
    ;\r\n }\r\n };\r\n\r\n const setImage = (imageType: NewsletterImageType, image?: File) => {\r\n let reader = new FileReader();\r\n if (imageType === FOOTER && !!image) {\r\n reader.readAsDataURL(image);\r\n reader.onload = (): void => {\r\n setChangedSinceSaved(true);\r\n setFooterImage(image);\r\n setHasFooterImageChanged(true);\r\n setHighlightTitleFields(false);\r\n setFooterImageBase64(reader.result?.toString());\r\n };\r\n } else if (imageType === HEADER && !!image) {\r\n reader.readAsDataURL(image);\r\n reader.onload = (): void => {\r\n setChangedSinceSaved(true);\r\n setHeaderImage(image);\r\n setHasHeaderImageChanged(true);\r\n setHighlightTitleFields(false);\r\n setHeaderImageBase64(reader.result?.toString());\r\n };\r\n }\r\n };\r\n\r\n const onDownloadTemplateHtml = (template: NewsletterTemplate) => {\r\n setIsDownloading(true);\r\n\r\n const file = {\r\n name: `${template.name}.html`,\r\n };\r\n props\r\n .getTemplateHtml(template.id)\r\n .then((data) => new FileDownloader(file).downloadProvided(data))\r\n .then((_) => setIsDownloading(false))\r\n .catch((_) => setIsDownloading(false));\r\n };\r\n\r\n const onDownloadTemplateImage = (template: NewsletterTemplate, imageType: NewsletterTemplateImageType) => {\r\n setIsDownloading(true);\r\n const file = {\r\n name: `${template.name} ${imageType}.png`,\r\n };\r\n props\r\n .getTemplateImage(template.id, imageType)\r\n .then((url) => new FileDownloader(file).downloadProvided(url))\r\n .then((_) => setIsDownloading(false))\r\n .catch((_) => setIsDownloading(false));\r\n };\r\n\r\n //Used when the theme is loaded, shouldn't mark things as edited.\r\n const setImageOnLoad = (type: NewsletterImageType, toSet: File) => {\r\n let reader = new FileReader();\r\n if (type === FOOTER && !!toSet) {\r\n reader.readAsDataURL(toSet);\r\n reader.onload = (): void => {\r\n setChangedSinceSaved(true);\r\n setFooterImage(toSet);\r\n setThemeHadFooterOnLoad(true);\r\n setFooterImageBase64(reader.result?.toString());\r\n };\r\n } else if (type === HEADER && !!toSet) {\r\n reader.readAsDataURL(toSet);\r\n reader.onload = (): void => {\r\n setChangedSinceSaved(true);\r\n setHeaderImage(toSet);\r\n setThemeHadHeaderOnLoad(true);\r\n setHeaderImageBase64(reader.result?.toString());\r\n };\r\n }\r\n };\r\n\r\n const updateSavedTheme = (toSet: NewsletterTheme) => {\r\n setSavedTheme(toSet);\r\n };\r\n\r\n const updateTranslatedContent = (toSet: TranslatedNewsletterContent) => {\r\n let newNewsletter = newsletter;\r\n newNewsletter.translatedContent = toSet;\r\n\r\n setNewsletterToState(newNewsletter, selectedTemplate, selectedTheme, true);\r\n };\r\n\r\n const clearImage = (type: NewsletterImageType) => {\r\n if (type === \"Header\") {\r\n setHeaderImage(null);\r\n setHeaderImageBase64(undefined);\r\n setHasHeaderImageChanged(true);\r\n } else if (type === \"Footer\") {\r\n setFooterImage(null);\r\n setFooterImageBase64(undefined);\r\n setHasFooterImageChanged(true);\r\n }\r\n };\r\n\r\n const onSearchSenders = (value: string) => {\r\n var newAddresses = originalAddresses.filter(\r\n (a) =>\r\n a.fromEmailAddress.toLocaleLowerCase().indexOf(value.toLocaleLowerCase()) >= 0 ||\r\n a.fromEmailName.toLocaleLowerCase().indexOf(value.toLocaleLowerCase()) >= 0\r\n );\r\n setAddresses(newAddresses);\r\n };\r\n\r\n const publishNewsletter = () => {\r\n const newsletterToPublish = deepCopy(newsletter);\r\n newsletterToPublish.status = \"Enabled\";\r\n saveNewsletter(newsletterToPublish).then((isSuccess) => {\r\n if (isSuccess) {\r\n props.redirectTo(`/${props.tenant}/admin/newsletters/${newsletterToPublish.id}/dashboard`);\r\n } else {\r\n setShowNewsletterPreview(false);\r\n }\r\n });\r\n };\r\n\r\n const handleThemeDialogClose = () => {\r\n setSaveTemplateOpen(false);\r\n setThemeName(\"\");\r\n };\r\n\r\n const swapToImagesTab = () => {\r\n setSelectedTab(1);\r\n setSaveTemplateOpen(false);\r\n };\r\n\r\n const updateThemeAndMoveOn = () => {\r\n let result = updateTheme();\r\n if (result) {\r\n setSuccessMessage(\"Successfully updated theme.\");\r\n } else {\r\n setErrorMessage(\"Could not update theme.\");\r\n }\r\n saveNewsletter(newsletter);\r\n setPreSaveWarningOpen(false);\r\n setAlreadySeenWarning(true);\r\n };\r\n\r\n const handleUpdateOrSaveClose = () => {\r\n if (postWarningRedirect) {\r\n postWarningRedirect();\r\n }\r\n setPreSaveWarningOpen(false);\r\n setAlreadySeenWarning(true);\r\n };\r\n\r\n const [newsletter, setNewsletter] = useState(getNewNewsletter());\r\n const [modelErrors, setModelErrors] = useState(null);\r\n const [errorMessage, setErrorMessage] = useState();\r\n const [successMessage, setSuccessMessage] = useState();\r\n const [showUnsavedChangesDialogPriorTo, setShowUnsavedChangesDialogPriorTo] = useState<\"onShowSendTestEmail\" | undefined | null>();\r\n\r\n const [highlightTitleFields, setHighlightTitleFields] = useState(false);\r\n const [highlightSubjectAndHeader, setHighlightSubjectAndHeader] = useState(false);\r\n const [highlightSenderDetails, setHighlightSenderDetails] = useState(false);\r\n\r\n const [showNewsletterPreview, setShowNewsletterPreview] = useState(false);\r\n const [showSendTestEmailDialog, setShowSendTestEmailDialog] = useState();\r\n\r\n const [isSaving, setIsSaving] = useState(false);\r\n const [isDownloading, setIsDownloading] = useState();\r\n const [isLoadingHeaderImage, setIsLoadingHeaderImage] = useState();\r\n const [isLoadingFooterImage, setIsLoadingFooterImage] = useState();\r\n const [themeHadHeaderOnLoad, setThemeHadHeaderOnLoad] = useState();\r\n const [themeHadFooterOnLoad, setThemeHadFooterOnLoad] = useState();\r\n const [headerImageBase64, setHeaderImageBase64] = useState();\r\n const [footerImageBase64, setFooterImageBase64] = useState();\r\n\r\n const [changedSinceSaved, setChangedSinceSaved] = useState(false);\r\n const [firstTime, setFirstTime] = useState(false);\r\n const [saveTemplateOpen, setSaveTemplateOpen] = useState(false);\r\n const [templateXClicked, setTemplateXClicked] = useState(false);\r\n const [preSaveWarningOpen, setPreSaveWarningOpen] = useState(false);\r\n const [alreadySeenWarning, setAlreadySeenWarning] = useState(false);\r\n const [hasHeaderImageChanged, setHasHeaderImageChanged] = useState(false);\r\n const [hasFooterImageChanged, setHasFooterImageChanged] = useState(false);\r\n\r\n const [selectedTab, setSelectedTab] = useState(0);\r\n const [themeName, setThemeName] = useState(\"\");\r\n const [themeError, setThemeError] = useState(\"\");\r\n const [addresses, setAddresses] = useState([]);\r\n const [originalAddresses, setOriginalAddresses] = useState([]);\r\n\r\n const [selectedTheme, setSelectedTheme] = useState();\r\n const [savedTheme, setSavedTheme] = useState();\r\n const [selectedTemplate, setSelectedTemplate] = useState();\r\n const [serverNewsletter, setServerNewsletter] = useState();\r\n const [headerImage, setHeaderImage] = useState();\r\n const [footerImage, setFooterImage] = useState();\r\n\r\n const [audiences, setAudiences] = useState();\r\n const [templates, setTemplates] = useState();\r\n const [themes, setThemes] = useState();\r\n const [postWarningRedirect, setPostWarningRedirect] = useState<() => any | undefined>(); //Make sure this line is okay.\r\n\r\n useDefaultLocale();\r\n\r\n const [progressCheck, setProgressCheck] = useState({\r\n isComplete: false,\r\n titleSectionIsComplete: false,\r\n audienceFrequencySectionIsComplete: false,\r\n templateSectionIsComplete: false,\r\n composeSectionIsComplete: false,\r\n });\r\n\r\n useEffect(() => {\r\n props.getConfig().then((currentConfig) => {\r\n setAddresses(currentConfig.addresses);\r\n setOriginalAddresses(currentConfig.addresses);\r\n });\r\n\r\n const fetchNewsletterDetails = async () => {\r\n let templateToSet;\r\n let themeToSet;\r\n let newsletterToSet;\r\n\r\n templateToSet = await fetchAndSetTemplate();\r\n newsletterToSet = await fetchAndSetNewsletter();\r\n themeToSet = await fetchAndSetTheme();\r\n\r\n //We did not load a newsletter, so make sure everything lines up with a new one.\r\n if (!newsletterToSet) {\r\n newsletterToSet = getNewNewsletter();\r\n newsletterToSet.emailTemplateId = templateToSet.id;\r\n\r\n let themeToApply: NewsletterThemeSimple = {\r\n themeId: themeToSet.id,\r\n primaryText: themeToSet.primaryText,\r\n primaryBackground: themeToSet.primaryBackground,\r\n secondaryBackground: themeToSet.secondaryBackground,\r\n secondaryText: themeToSet.secondaryText,\r\n emailBackground: themeToSet.emailBackground,\r\n linkText: themeToSet.linkText,\r\n };\r\n\r\n newsletterToSet.newsletterTheme = themeToApply;\r\n }\r\n setNewsletterToState(newsletterToSet, templateToSet, themeToSet, false);\r\n\r\n props.getAudiences().then((audiences) => {\r\n setAudiences(audiences);\r\n });\r\n props.getTagSettings();\r\n };\r\n\r\n fetchNewsletterDetails();\r\n }, []);\r\n\r\n const fetchAndSetNewsletter = async () => {\r\n if (!!props.match.params.newsletterId) {\r\n let fetchedNewsletter = await props.getNewsletterDetails(props.match.params.newsletterId);\r\n\r\n if (!fetchedNewsletter) {\r\n props.redirectTo(`/${props.tenant}/admin/newsletters`);\r\n } else {\r\n let idToCheck = fetchedNewsletter.emailTemplate?.isCustom\r\n ? fetchedNewsletter.emailTemplate.id\r\n : fetchedNewsletter.emailTemplateId;\r\n let selectedTemplate = _.first(_.filter(templates, (t) => t.id === idToCheck));\r\n if (!selectedTemplate) {\r\n selectedTemplate = _.first(_.filter(templates, (t) => t.name.toLowerCase() === standardTemplateNames[0]));\r\n }\r\n\r\n let selectedTheme = _.first(_.filter(themes, (t) => t.id === fetchedNewsletter?.newsletterTheme?.themeId));\r\n if (!selectedTheme) {\r\n selectedTheme = _.first(_.filter(themes, (t) => t.isDefault));\r\n }\r\n\r\n //No theme saved, custom!\r\n if (!fetchedNewsletter.newsletterTheme) {\r\n let themeToSet: NewsletterThemeSimple = {\r\n themeId: \"toBeReplaced\",\r\n emailBackground: \"#FFFFFF\",\r\n primaryBackground: \"#FFFFFF\",\r\n primaryText: \"#FFFFFF\",\r\n secondaryBackground: \"#FFFFFF\",\r\n secondaryText: \"#FFFFFF\",\r\n linkText: \"#FFFFFF\",\r\n };\r\n fetchedNewsletter.newsletterTheme = themeToSet;\r\n }\r\n\r\n fetchedNewsletter.newsletterTheme.themeId = selectedTheme?.id ?? fetchedNewsletter.newsletterTheme.themeId;\r\n setServerNewsletter(fetchedNewsletter);\r\n\r\n if (fetchedNewsletter.emailTemplateHeaderImageIsCustomized) {\r\n setIsLoadingHeaderImage(true);\r\n props.getNewsletterImage(fetchedNewsletter.id, HEADER).then((image) => {\r\n setHeaderImage(image);\r\n setIsLoadingHeaderImage(false);\r\n });\r\n } else {\r\n setHeaderImage(null);\r\n setIsLoadingHeaderImage(false);\r\n }\r\n if (fetchedNewsletter.emailTemplateFooterImageIsCustomized) {\r\n setIsLoadingFooterImage(true);\r\n props.getNewsletterImage(fetchedNewsletter.id, FOOTER).then((image) => {\r\n setFooterImage(image);\r\n setIsLoadingFooterImage(false);\r\n });\r\n } else {\r\n setFooterImage(null);\r\n setIsLoadingFooterImage(false);\r\n }\r\n\r\n return fetchedNewsletter;\r\n }\r\n }\r\n };\r\n\r\n const fetchAndSetTemplate = async () => {\r\n let templateResult = await props.getTemplates();\r\n\r\n if (!!templateResult) {\r\n setTemplates(templateResult);\r\n\r\n if (!!newsletter) {\r\n if (!newsletter.emailTemplateId) {\r\n const firstTemplate = templateResult.find((t) => t.name.toLowerCase() === \"1 column\");\r\n\r\n if (!!firstTemplate) {\r\n let newsletterToSet = newsletter;\r\n newsletter.emailTemplateId = firstTemplate.id;\r\n setNewsletter(newsletterToSet);\r\n setSelectedTemplate(firstTemplate);\r\n return firstTemplate;\r\n }\r\n } else {\r\n const selectedTemplateToSet = _.first(_.filter(templateResult, (t) => t.id === newsletter.emailTemplateId));\r\n\r\n setSelectedTemplate(selectedTemplateToSet);\r\n return selectedTemplateToSet;\r\n }\r\n }\r\n }\r\n };\r\n\r\n const fetchAndSetTheme = async () => {\r\n let themes = await props.getThemes();\r\n\r\n if (!!themes) {\r\n let sortedThemes = themes.sort((a, b) => a.name.localeCompare(b.name));\r\n setThemes(sortedThemes);\r\n\r\n if (!!newsletter) {\r\n if ((!newsletter.newsletterTheme || !newsletter.newsletterTheme.themeId) && !props.match.params.newsletterId) {\r\n //Check for default themes\r\n let validDefaultState = themes.filter((t) => t.isDefault).length === 1;\r\n let theme;\r\n\r\n if (validDefaultState) theme = themes.find((t) => t.isDefault);\r\n else {\r\n theme = themes.find((t) => t.name.toLowerCase() === \"sparrow connected light theme\");\r\n }\r\n if (!!theme) {\r\n let newsletterToUpdate = newsletter;\r\n\r\n //This is a new newsletter, load the colors of the theme.\r\n var colorsToSet: NewsletterThemeSimple = {\r\n themeId: theme.id,\r\n emailBackground: theme.emailBackground,\r\n primaryBackground: theme.primaryBackground,\r\n primaryText: theme.primaryText,\r\n secondaryBackground: theme.secondaryBackground,\r\n secondaryText: theme.secondaryText,\r\n linkText: theme.linkText,\r\n };\r\n\r\n newsletterToUpdate.newsletterTheme = colorsToSet;\r\n setNewsletter(newsletterToUpdate);\r\n setFirstTime(true);\r\n return theme;\r\n }\r\n } else {\r\n let selectedThemeToSet = _.first(_.filter(themes, (t) => t.id === newsletter.newsletterTheme.themeId));\r\n let newsletterToUpdate = newsletter;\r\n\r\n //Case where theme to be loaded has been deleted.\r\n if (!selectedThemeToSet) {\r\n selectedThemeToSet = themes.find((t) => t.isDefault);\r\n if (selectedThemeToSet) {\r\n newsletterToUpdate.newsletterTheme.themeId = selectedThemeToSet.id;\r\n }\r\n }\r\n\r\n setSelectedTheme(selectedThemeToSet);\r\n setNewsletter(newsletterToUpdate);\r\n return selectedThemeToSet;\r\n }\r\n }\r\n }\r\n };\r\n\r\n const returnTemplateOptions = () => {\r\n return (\r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n );\r\n };\r\n\r\n const returnContentOptions = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n );\r\n };\r\n\r\n const returnSettingsOptions = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n );\r\n };\r\n\r\n const publishClicked = () => {\r\n let colorsToCheck = newsletter.newsletterTheme;\r\n let backupTheme = savedTheme; //snapshot of theme to know if we edited or not.\r\n\r\n if (!backupTheme) {\r\n backupTheme = themes?.find((t) => t.id === newsletter.newsletterTheme.themeId);\r\n }\r\n\r\n //If user has changed the theme on the specific newsletter\r\n // compared to the one they loaded, show the warning a single time.\r\n if (backupTheme && !alreadySeenWarning) {\r\n if (\r\n colorsToCheck.emailBackground !== backupTheme.emailBackground ||\r\n colorsToCheck.primaryBackground !== backupTheme.primaryBackground ||\r\n colorsToCheck.primaryText !== backupTheme.primaryText ||\r\n colorsToCheck.secondaryBackground !== backupTheme.secondaryBackground ||\r\n colorsToCheck.secondaryText !== backupTheme.secondaryText ||\r\n colorsToCheck.linkText !== backupTheme.linkText ||\r\n hasHeaderImageChanged ||\r\n hasFooterImageChanged\r\n ) {\r\n setPreSaveWarningOpen(true);\r\n setPostWarningRedirect(() => () => setShowNewsletterPreview(true));\r\n return;\r\n }\r\n }\r\n\r\n setShowNewsletterPreview(true);\r\n };\r\n\r\n const saveAsDraftClicked = () => {\r\n var colorsToCheck = newsletter.newsletterTheme;\r\n var backupTheme = savedTheme;\r\n\r\n if (!backupTheme) {\r\n backupTheme = themes?.find((t) => t.id === newsletter.newsletterTheme.themeId);\r\n }\r\n\r\n if (backupTheme && !alreadySeenWarning) {\r\n if (\r\n colorsToCheck.emailBackground !== backupTheme.emailBackground ||\r\n colorsToCheck.primaryBackground !== backupTheme.primaryBackground ||\r\n colorsToCheck.primaryText !== backupTheme.primaryText ||\r\n colorsToCheck.secondaryBackground !== backupTheme.secondaryBackground ||\r\n colorsToCheck.secondaryText !== backupTheme.secondaryText ||\r\n colorsToCheck.linkText !== backupTheme.linkText ||\r\n hasHeaderImageChanged ||\r\n hasFooterImageChanged\r\n ) {\r\n setPreSaveWarningOpen(true);\r\n setPostWarningRedirect(() => () => saveNewsletter(newsletter));\r\n return;\r\n }\r\n }\r\n saveNewsletter(newsletter);\r\n };\r\n\r\n const isTitleSectionComplete = (newsletter: SaveNewsletterModel): boolean => {\r\n if (!newsletter || !newsletter.title) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n const isTemplateSectionComplete = (newsletter: SaveNewsletterModel): boolean => {\r\n if (!newsletter || !newsletter.newsletterTheme) return false;\r\n return true;\r\n };\r\n\r\n const isTemplateSectionInError = (): boolean => {\r\n if (!modelErrors) return false;\r\n\r\n if (\r\n !!modelErrors.EmailPreheader ||\r\n !!modelErrors.EmailSubject ||\r\n !!modelErrors.EmailTemplateHeaderText ||\r\n !!modelErrors.EmailTemplateId\r\n )\r\n return true;\r\n\r\n return false;\r\n };\r\n\r\n const isFrequencySectionComplete = (newsletter: SaveNewsletterModel): boolean => {\r\n if (!newsletter || !newsletter.firstIssueDateTime) {\r\n return false;\r\n } else if (!newsletter.fromEmailAddress || !newsletter.fromEmailName) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n const isComposeSectionComplete = (newsletter: SaveNewsletterModel): boolean => {\r\n if (!newsletter) {\r\n return false;\r\n }\r\n\r\n let allSubjectsValid = true;\r\n\r\n let newsletterLanguages = Object.keys(newsletter.translatedContent);\r\n newsletterLanguages.forEach((l) => {\r\n if (!newsletter.translatedContent[l].subject || newsletter.translatedContent[l].subject === \"\") {\r\n allSubjectsValid = false;\r\n }\r\n });\r\n\r\n return allSubjectsValid;\r\n };\r\n\r\n const onShowSendTestEmail = () => {\r\n if (changedSinceSaved || !serverNewsletter) setShowUnsavedChangesDialogPriorTo(\"onShowSendTestEmail\");\r\n else setShowSendTestEmailDialog(true);\r\n };\r\n\r\n const setTemplateSection = () => {\r\n setHighlightTitleFields(false);\r\n };\r\n\r\n const setAudienceFrequencySection = () => {\r\n setHighlightTitleFields(false);\r\n };\r\n\r\n const checkValidNewTheme = () => {\r\n return validateThemeName() && checkValidThemeDetails();\r\n };\r\n\r\n const checkValidExistingTheme = () => {\r\n return checkValidThemeDetails();\r\n };\r\n\r\n const validateThemeName = () => {\r\n if (themes) {\r\n if (themeName.trim().length === 0) {\r\n setThemeError(\"Enter a name.\");\r\n return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const checkValidThemeDetails = () => {\r\n if (themes) {\r\n if (themes.find((t) => t.name.trim().toLowerCase() === themeName.trim().toLowerCase())) {\r\n setThemeError(\"Theme already exists with current name.\");\r\n return false;\r\n } else if (!checkColorsValid()) {\r\n setThemeError(\"Cannot save a theme with invalid colors.\");\r\n return false;\r\n }\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const saveNewTheme = async () => {\r\n let currentState = newsletter.newsletterTheme;\r\n if (checkValidNewTheme()) {\r\n let toSave: NewsletterTheme = {\r\n id: \"00000000-0000-0000-0000-000000000000\",\r\n name: themeName,\r\n isDefault: false,\r\n isCustom: true,\r\n emailBackground: currentState.emailBackground,\r\n primaryBackground: currentState.primaryBackground,\r\n primaryText: currentState.primaryText,\r\n secondaryBackground: currentState.secondaryBackground,\r\n secondaryText: currentState.secondaryText,\r\n linkText: currentState.linkText,\r\n createdBy: \"\",\r\n createdByDisplayName: \"\",\r\n createdOnUTC: new Date(),\r\n lastModifiedBy: \"\",\r\n lastModifiedByDisplayName: \"\",\r\n lastModifiedOnUTC: new Date(),\r\n\r\n //Done elsewhere and updated independently.\r\n headerImage: \"\",\r\n footerImage: \"\",\r\n themeHeaderImageIsCustomized: false,\r\n themeFooterImageIsCustomized: false,\r\n };\r\n\r\n //Update images\r\n let updatedTheme = await props.saveTheme(toSave);\r\n let headerImageEncoded = \"\";\r\n let footerImageEncoded = \"\";\r\n\r\n if (!!headerImage) {\r\n headerImageEncoded = (await getBase64(headerImage)) ?? \"\";\r\n }\r\n\r\n if (!!footerImage) {\r\n footerImageEncoded = (await getBase64(footerImage)) ?? \"\";\r\n }\r\n\r\n if (headerImageEncoded !== \"\" || footerImageEncoded !== \"\") {\r\n await props.saveThemeImages(updatedTheme.id, headerImageEncoded, footerImageEncoded);\r\n }\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const updateTheme = () => {\r\n let currentState = newsletter.newsletterTheme;\r\n let themeId = newsletter.newsletterTheme.themeId;\r\n let themeToUpdate = themes?.find((t) => t.id === themeId) ?? null;\r\n\r\n if (themeToUpdate && checkValidExistingTheme()) {\r\n let toSave: NewsletterTheme = {\r\n id: newsletter.newsletterTheme.themeId,\r\n name: themeToUpdate.name,\r\n isDefault: themeToUpdate.isDefault,\r\n isCustom: true,\r\n emailBackground: currentState.emailBackground,\r\n primaryBackground: currentState.primaryBackground,\r\n primaryText: currentState.primaryText,\r\n secondaryBackground: currentState.secondaryBackground,\r\n secondaryText: currentState.secondaryText,\r\n linkText: currentState.linkText,\r\n createdBy: \"\",\r\n createdByDisplayName: \"\",\r\n createdOnUTC: new Date(),\r\n lastModifiedBy: \"\",\r\n lastModifiedByDisplayName: \"\",\r\n lastModifiedOnUTC: new Date(),\r\n\r\n //Done elsewhere and updated independently.\r\n headerImage: \"\",\r\n footerImage: \"\",\r\n themeHeaderImageIsCustomized: false,\r\n themeFooterImageIsCustomized: false,\r\n };\r\n\r\n props.saveTheme(toSave).then((theme) => {\r\n if (themes) {\r\n let toReplaceIndex = themes.findIndex((t) => t.id === theme.id);\r\n let themeCopy = [...themes];\r\n themeCopy[toReplaceIndex] = theme;\r\n setThemes(themeCopy);\r\n }\r\n });\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n const checkColorsValid = () => {\r\n let toCheck = newsletter.newsletterTheme;\r\n\r\n let hexEmailBackground = hexCodeFromText(toCheck.emailBackground);\r\n let hexPrimaryBackground = hexCodeFromText(toCheck.primaryBackground);\r\n let hexPrimaryText = hexCodeFromText(toCheck.primaryText);\r\n let hexSecondaryBackground = hexCodeFromText(toCheck.secondaryBackground);\r\n let hexSecondaryText = hexCodeFromText(toCheck.secondaryText);\r\n let hexLinkText = hexCodeFromText(toCheck.linkText);\r\n\r\n if (\r\n !hexEmailBackground ||\r\n !hexPrimaryBackground ||\r\n !hexPrimaryText ||\r\n !hexSecondaryBackground ||\r\n !hexSecondaryText ||\r\n !hexLinkText\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n const saveHeaderFooterImage = (response: NewsletterDigest) => {\r\n if (hasFooterImageChanged || hasHeaderImageChanged || themeHadHeaderOnLoad || themeHadFooterOnLoad) {\r\n if (hasHeaderImageChanged) {\r\n if (!headerImage) props.deleteNewsletterImage(response.id, HEADER);\r\n }\r\n\r\n if (hasFooterImageChanged) {\r\n if (!footerImage) props.deleteNewsletterImage(response.id, FOOTER);\r\n }\r\n\r\n const uploadImageModel: UploadNewsletterImageModel = {\r\n newsletterId: response.id,\r\n headerImage: headerImageBase64,\r\n footerImage: footerImageBase64,\r\n };\r\n\r\n props.uploadNewsletterHeaderFooterImage(uploadImageModel);\r\n }\r\n };\r\n\r\n const tabs = [\r\n { label: \"Template\", value: 0, id: \"template-tab\" },\r\n { label: \"Email details\", value: 1, id: \"email-details-tab\" },\r\n { label: \"Settings\", value: 2, id: \"settings-tab\" },\r\n ];\r\n\r\n const { availableLanguages, selectedLanguages, activeLcid, defaultLcid, lcidMappings, onRemoveLanguage, onSelectLanguage } =\r\n useLanguages(newsletter.translatedContent);\r\n\r\n if (!selectedTemplate) return ;\r\n\r\n if (!!props.match.params.newsletterId && !serverNewsletter) return ;\r\n\r\n if (!audiences || !props.tagSettings) return ;\r\n\r\n //Populate default language if loading existing newsletter\r\n if (!newsletter.translatedContent[defaultLcid]) {\r\n let defaultText: TranslatedNewsletterContent = {\r\n [defaultLcid]: {\r\n subject: newsletter.emailSubject,\r\n header: newsletter.emailTemplateHeaderText,\r\n footer: newsletter.emailTemplateFooterText,\r\n preheader: newsletter.emailPreheader,\r\n body: newsletter.bodyText,\r\n },\r\n };\r\n\r\n var newsletterCopy = newsletter;\r\n newsletterCopy.translatedContent = defaultText;\r\n setNewsletter(newsletterCopy);\r\n }\r\n\r\n const filledOutImages = !!headerImage && !!footerImage;\r\n const defaultThemeSelected = !selectedTheme?.isCustom;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n setSelectedTab(0)}\r\n onAudienceFrequencySectionClicked={onFrequencyClicked}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n }\r\n rightComponent={\r\n \r\n setSelectedTab(e)} />\r\n \r\n }\r\n >\r\n
    \r\n {selectedTab === 0 && (\r\n setErrorMessage(message)}\r\n setLoadImage={setImageOnLoad}\r\n updateSavedTheme={updateSavedTheme}\r\n themes={themes ?? []}\r\n >\r\n )}\r\n {selectedTab === 1 && (\r\n
    \r\n \r\n\r\n \r\n\r\n setErrorMessage(message)}\r\n highlight={highlightSubjectAndHeader}\r\n currentLcid={activeLcid}\r\n changedSinceSaved={changedSinceSaved}\r\n />\r\n
    \r\n )}\r\n {selectedTab === 2 && (\r\n \r\n )}\r\n
    \r\n \r\n }\r\n />\r\n {showNewsletterPreview && (\r\n setShowNewsletterPreview(false)}\r\n getUniqueUsers={props.getUniqueUsers}\r\n defaultLcid={defaultLcid}\r\n />\r\n )}\r\n setShowUnsavedChangesDialogPriorTo(null)}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n Unsaved Changes\r\n \r\n There are unsaved changes to the Newsletter.\r\n \r\n \r\n \r\n {\r\n const nextAction = showUnsavedChangesDialogPriorTo;\r\n setShowUnsavedChangesDialogPriorTo(null);\r\n saveNewsletter(newsletter).then((succeeded) => {\r\n if (succeeded) {\r\n switch (nextAction) {\r\n case \"onShowSendTestEmail\":\r\n onShowSendTestEmail();\r\n }\r\n }\r\n });\r\n }}\r\n color=\"primary\"\r\n autoFocus\r\n >\r\n Save changes\r\n \r\n \r\n \r\n {!!serverNewsletter && (\r\n {\r\n setShowSendTestEmailDialog(false);\r\n setModelErrors(modelErrors);\r\n setErrorMessage(_.first(_.first(_.values(modelErrors))));\r\n }}\r\n onClose={() => setShowSendTestEmailDialog(false)}\r\n onSuccess={(message) => setSuccessMessage(message)}\r\n />\r\n )}\r\n\r\n \r\n \r\n
    \r\n Save as Theme\r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n {(filledOutImages || templateXClicked) && (\r\n
    \r\n }\r\n text={\r\n \r\n \r\n A theme saves the color palette, header image, and footer image only.{\" \"}\r\n \r\n window.open(\"https://support.sparrowconnected.com/en/what-are-newsletter-themes\")\r\n }\r\n underline=\"always\"\r\n >\r\n Learn more\r\n \r\n .\r\n \r\n \r\n }\r\n >\r\n
    \r\n )}\r\n {!filledOutImages && !templateXClicked && (\r\n
    \r\n }\r\n backgroundColor=\"#FFE9AF\"\r\n text={\r\n \r\n \r\n You are saving a theme with the default header/footer images.{\" \"}\r\n \r\n Upload custom images\r\n \r\n .\r\n \r\n \r\n }\r\n >\r\n \r\n
    \r\n )}\r\n\r\n setThemeName(e.target.value)}\r\n onClick={() => setThemeError(\"\")}\r\n onFocus={() => setThemeError(\"\")}\r\n />\r\n
    \r\n \r\n {\r\n setSaveTemplateOpen(false);\r\n window.open(`/${props.tenant}/admin/newsletters/managethemes`, \"_blank\", \"noopener,noreferrer\");\r\n }}\r\n color=\"primary\"\r\n endIcon={}\r\n style={{ marginRight: \"auto\" }}\r\n >\r\n Manage Themes\r\n \r\n \r\n {\r\n let result = await saveNewTheme();\r\n\r\n if (result) {\r\n setSaveTemplateOpen(false);\r\n setSuccessMessage(\"Successfully saved as a theme.\");\r\n\r\n props.getThemes().then((themes) => {\r\n if (!!themes) {\r\n let sortedThemes = themes.sort((a, b) => a.name.localeCompare(b.name));\r\n setThemes(sortedThemes);\r\n }\r\n });\r\n }\r\n }}\r\n color=\"primary\"\r\n autoFocus\r\n >\r\n Save\r\n \r\n \r\n
    \r\n\r\n \r\n \r\n
    \r\n {defaultThemeSelected ? \"Save Theme?\" : \"Update or Save Theme?\"}\r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n {defaultThemeSelected ? (\r\n \r\n You've customized the colors and images of your newsletter. Would you like to save this as a new template theme?\r\n \r\n ) : (\r\n \r\n You've customized the colors and images of your newsletter. Would you like to update the '\r\n {selectedTheme?.name ?? \"\"}' theme or save this as a new template\r\n theme?\r\n \r\n )}\r\n \r\n \r\n {\r\n setPreSaveWarningOpen(false);\r\n setSaveTemplateOpen(true);\r\n setTemplateXClicked(false);\r\n setAlreadySeenWarning(true);\r\n }}\r\n >\r\n Save as new theme\r\n \r\n {!defaultThemeSelected && (\r\n \r\n )}\r\n \r\n
    \r\n \r\n setSuccessMessage(null)} />\r\n setErrorMessage(null)} />\r\n
    \r\n );\r\n};\r\n\r\ninterface RouteParams {\r\n newsletterId?: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: RouteComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n tenant: state.tenant.id,\r\n tenantSettings: state.settings.tenantSettings,\r\n tagSettings: state.settings.tagSettings,\r\n }),\r\n {\r\n getNewsletterDetails: actions.getNewsletterDetails,\r\n getUniqueUsers: audiencesActions.fetchUniqueUserCount,\r\n getNewsletterImage: actions.getNewsletterImage,\r\n saveNewsletter: actions.saveNewsletter,\r\n getAudiences: audiencesActions.getAudiences,\r\n getTemplates: actions.getTemplates,\r\n getThemes: actions.getThemes,\r\n saveTheme: actions.saveTheme,\r\n getTemplateHtml: actions.getTemplateHtml,\r\n getTemplateImage: actions.getTemplateImage,\r\n deleteNewsletterImage: actions.deleteNewsletterImage,\r\n uploadNewsletterImage: actions.uploadNewsletterImage,\r\n uploadNewsletterHeaderFooterImage: actions.uploadNewsletterHeaderFooterImage,\r\n translateNewsletter: actions.translateNewsletter,\r\n saveThemeImages: actions.saveThemeImages,\r\n redirectTo: push,\r\n getTagSettings: settingsActions.getTagSettings,\r\n getConfig: actions.getConfig,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(EditNewsletterPage);\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { Prompt, RouteComponentProps } from \"react-router-dom\";\r\nimport * as actions from \"../actionCreator\";\r\nimport * as audiencesActions from \"modules/audiences/actionCreator\";\r\nimport * as settingsActions from \"modules/settings/actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport moment from \"moment\";\r\n\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport SuccessSnackbar from \"modules/common/components/snackbars/successSnackbar\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Breadcrumb from \"pages/common/breadcrumb\";\r\nimport Columns from \"pages/common/columns\";\r\nimport MainContent from \"pages/common/mainContent\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Hidden from \"@mui/material/Hidden\";\r\nimport \"modules/common/components/authoring/authoring.sass\";\r\nimport { Address, NewsletterDetails, NewsletterImageType, NewsletterTemplate, NewsletterTemplateImageType, NewsletterTheme, SaveNewsletterModelStateErrors } from \"modules/newsletters\";\r\nimport \"../styles/newsletter.sass\";\r\nimport \"../styles/progress-bar.sass\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { Dialog, DialogActions, DialogContent, DialogTitle, Grid, TextField } from \"@mui/material\";\r\nimport { Audience } from \"modules/audiences/models\";\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\nimport Link from \"@mui/material/Link\";\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport ColorOption from \"./components/colorOption\";\r\nimport OneColumnNewsletterPreview from \"./components/oneColumnNewsletterPreview\";\r\nimport ReplayIcon from \"@mui/icons-material/Replay\";\r\nimport UploaderWithLoad from \"../common/uploader/uploaderWithLoad\";\r\nimport { hexCodeFromText } from \"utils/hexFunctions\";\r\n\r\nconst colorLocations = [\"emailBackground\", \"primaryBackground\", \"primaryText\", \"secondaryBackground\", \"secondaryText\", \"linkText\"]\r\nconst headerType:NewsletterImageType = \"Header\";\r\nconst footerType:NewsletterImageType = \"Footer\";\r\n\r\nclass EditThemePage extends React.Component {\r\n\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n const theme = this.getNewTheme();\r\n\r\n this.state = {\r\n currentTheme: theme,\r\n backupTheme: theme,\r\n emailBackgroundVisible: false,\r\n primaryBackgroundVisible: false,\r\n primaryTextVisible: false,\r\n secondaryBackgroundVisible: false,\r\n secondaryTextVisible: false,\r\n linkTextVisible: false,\r\n currentTitle: \"\",\r\n invalidState: false,\r\n imagesLoading: false,\r\n\r\n modelErrors: null,\r\n highlightTitleFields: false,\r\n highlightSubjectAndHeader: false,\r\n highlightSenderDetails: false,\r\n showTemplateSection: true,\r\n showAudienceFrequencySection: false,\r\n showNewsletterPreview: false,\r\n showContentSection: false,\r\n changedSinceSaved: false,\r\n isSaving: false,\r\n isLoading: false,\r\n selectedTab: 0,\r\n addresses: [],\r\n originalAddresses: [],\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n moment.locale(\"en\");\r\n\r\n this.setState({isLoading: true});\r\n this.props.getThemes().then((themes) => {\r\n if(!!themes){\r\n this.setState({themes: themes});\r\n\r\n // We have been passed a specific theme in the url.\r\n if(!!this.props.match.params.themeId){\r\n const themeFromUrl = themes.find(theme => theme.id === this.props.match.params.themeId);\r\n if(themeFromUrl)\r\n {\r\n let clonedTheme = JSON.parse(JSON.stringify(themeFromUrl));\r\n this.loadImages(themeFromUrl);\r\n this.setState({currentTheme: themeFromUrl, currentTitle: themeFromUrl.name, backupTheme: clonedTheme});\r\n }\r\n else{\r\n this.setState({errorMessage: \"Could not load a theme for specified id.\", invalidState: true});\r\n }\r\n }\r\n }\r\n });\r\n this.setState({isLoading: false});\r\n }\r\n\r\n private loadImages = async(theme: NewsletterTheme) => {\r\n this.setState({imagesLoading: true})\r\n if(theme.themeHeaderImageIsCustomized) {\r\n await this.props.getThemeImage(headerType, theme.id).then((result) => {\r\n this.setState({headerImage: result});\r\n })\r\n }\r\n\r\n if(theme.themeFooterImageIsCustomized) {\r\n await this.props.getThemeImage(footerType, theme.id).then((result) => {\r\n this.setState({footerImage: result});\r\n })\r\n }\r\n this.setState({imagesLoading: false});\r\n }\r\n\r\n public render() {\r\n const {currentTheme, backupTheme} = this.state;\r\n\r\n if(!!this.props.match.params.themeId && !this.state.currentTheme)\r\n return ;\r\n\r\n const formattedSavedOn = !this.state.invalidState && moment(new Date(this.state.currentTheme.createdOnUTC)).format(\"MMM D, YYYY, hh:mm a\");\r\n const formattedModifiedOn = !this.state.invalidState && moment(new Date(this.state.currentTheme.lastModifiedOnUTC)).format(\"MMM D, YYYY, hh:mm a\");\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n
    \r\n Theme title*\r\n this.setState({currentTitle: e.target.value})} placeholder=\"Enter theme title\"/>\r\n
    \r\n
    \r\n \r\n \r\n \r\n Last modified on\r\n \r\n \r\n {this.state.currentTheme.lastModifiedOnUTC ? formattedModifiedOn : \"\"}\r\n \r\n\r\n \r\n by\r\n \r\n \r\n {currentTheme.lastModifiedByDisplayName}\r\n \r\n\r\n \r\n Saved on\r\n \r\n \r\n {formattedSavedOn}\r\n \r\n\r\n \r\n by\r\n \r\n \r\n {currentTheme.createdByDisplayName}\r\n \r\n \r\n \r\n \r\n }\r\n rightComponent={\r\n
    \r\n
    \r\n }\r\n text={\r\n \r\n \r\n Editing a theme does not modify newsletters that have already applied it.\r\n To apply an updated theme, edit the newsletter and go to 'Templates & Themes' under the Template tab. \r\n window.open(\"https://support.sparrowconnected.com/en/how-do-i-use-a-newsletter-theme\")} underline=\"always\">Learn more.\r\n \r\n \r\n }\r\n />\r\n\r\n {!this.state.invalidState &&
    \r\n Change theme images\r\n\r\n \r\n \r\n Header image\r\n \r\n \r\n this.setState({errorMessage: err})}\r\n isLoading={this.state.imagesLoading}\r\n />\r\n \r\n\r\n \r\n Footer image\r\n \r\n \r\n this.setState({errorMessage: err})}\r\n isLoading={this.state.imagesLoading}\r\n />\r\n \r\n \r\n\r\n \r\n \r\n
    \r\n Change theme colors\r\n
    \r\n \r\n \r\n
    Email background
    \r\n
    \r\n \r\n this.changeNewsletterColor(e.hexCode, colorLocations[0])}\r\n changeText={(e) => this.changeNewsletterColor(e, colorLocations[0])}\r\n setVisible={(e) => this.toggleColorVisible(e, colorLocations[0])}\r\n />\r\n \r\n \r\n {currentTheme && backupTheme.emailBackground !== currentTheme.emailBackground &&\r\n this.changeNewsletterColor(backupTheme.emailBackground, colorLocations[0])}\r\n />\r\n }\r\n \r\n\r\n \r\n
    Primary background
    \r\n
    \r\n \r\n this.changeNewsletterColor(e.hexCode, colorLocations[1])}\r\n changeText={(e) => this.changeNewsletterColor(e, colorLocations[1])}\r\n setVisible={(e) => this.toggleColorVisible(e, colorLocations[1])}\r\n />\r\n \r\n \r\n {currentTheme && backupTheme.primaryBackground !== currentTheme.primaryBackground &&\r\n this.changeNewsletterColor(backupTheme.primaryBackground, colorLocations[1])}\r\n />\r\n }\r\n \r\n\r\n \r\n
    Primary text
    \r\n
    \r\n \r\n this.changeNewsletterColor(e.hexCode, colorLocations[2])}\r\n changeText={(e) => this.changeNewsletterColor(e, colorLocations[2])}\r\n setVisible={(e) => this.toggleColorVisible(e, colorLocations[2])}\r\n />\r\n \r\n \r\n {currentTheme && backupTheme.primaryText !== currentTheme.primaryText &&\r\n this.changeNewsletterColor(backupTheme.primaryText, colorLocations[2])}\r\n />\r\n }\r\n \r\n \r\n
    Secondary background
    \r\n
    \r\n \r\n this.changeNewsletterColor(e.hexCode, colorLocations[3])}\r\n changeText={(e) => this.changeNewsletterColor(e, colorLocations[3])}\r\n setVisible={(e) => this.toggleColorVisible(e, colorLocations[3])}\r\n />\r\n \r\n \r\n {currentTheme && backupTheme.secondaryBackground!== currentTheme.secondaryBackground &&\r\n this.changeNewsletterColor(backupTheme.secondaryBackground, colorLocations[3])}\r\n />\r\n }\r\n \r\n\r\n \r\n
    Secondary text
    \r\n
    \r\n \r\n this.changeNewsletterColor(e.hexCode, colorLocations[4])}\r\n changeText={(e) => this.changeNewsletterColor(e, colorLocations[4])}\r\n setVisible={(e) => this.toggleColorVisible(e, colorLocations[4])}\r\n />\r\n \r\n \r\n {currentTheme && backupTheme.secondaryText !== currentTheme.secondaryText &&\r\n this.changeNewsletterColor(backupTheme.secondaryText, colorLocations[4])}\r\n />\r\n }\r\n \r\n\r\n \r\n
    Link text
    \r\n
    \r\n \r\n this.changeNewsletterColor(e.hexCode, colorLocations[5])}\r\n changeText={(e) => this.changeNewsletterColor(e, colorLocations[5])}\r\n setVisible={(e) => this.toggleColorVisible(e, colorLocations[5])}\r\n />\r\n \r\n \r\n {currentTheme && backupTheme.linkText !== currentTheme.linkText &&\r\n this.changeNewsletterColor(backupTheme.linkText, colorLocations[5])}\r\n />\r\n }\r\n \r\n
    \r\n
    \r\n\r\n \r\n This preview uses placeholder images and texts only.\r\n \r\n \r\n\r\n
    \r\n
    }\r\n\r\n
    \r\n
    \r\n }\r\n />\r\n this.setState({ showUnsavedChangesDialogPriorTo: null })}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n fullWidth\r\n maxWidth=\"xs\"\r\n >\r\n Back to Manage Newsletters\r\n \r\n Your changes will not be saved.
    \r\n Do you want to continue?\r\n
    \r\n \r\n {\r\n this.setState({ showUnsavedChangesDialogPriorTo: null });\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/newsletters\");\r\n }}\r\n autoFocus>\r\n Exit\r\n \r\n \r\n \r\n \r\n \r\n this.setState({ successMessage: null })} />\r\n this.setState({ errorMessage: null })} />\r\n
    \r\n );\r\n }\r\n\r\n private onChangeImage = (imageType: NewsletterTemplateImageType, image?: File) => {\r\n switch(imageType)\r\n {\r\n case \"Header\":\r\n this.setState({headerImage: image, hasHeaderImageChanged: true});\r\n break;\r\n case \"Footer\":\r\n this.setState({footerImage: image, hasFooterImageChanged: true});\r\n break;\r\n }\r\n }\r\n\r\n private getCommands = (): JSX.Element => {\r\n const hasBeenChanged = this.hasBeenEdited();\r\n return (\r\n \r\n \r\n this.saveThemeAndUpdate()}\r\n >\r\n Save Changes\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private saveThemeAndUpdate = async() => {\r\n if(this.state.currentTheme.isCustom) {\r\n this.setState({isSaving: true});\r\n\r\n let headerImageEncoded = \"\";\r\n let deleteHeader = false;\r\n let footerImageEncoded = \"\";\r\n let deleteFooter = false;\r\n\r\n //Header exists, overwrite old one.\r\n if(!!this.state.headerImage && this.state.hasHeaderImageChanged) {\r\n headerImageEncoded = (await this.getBase64(this.state.headerImage)) ?? \"\";\r\n }\r\n //User deleted header, delete saved images.\r\n else if(!this.state.headerImage && this.state.currentTheme.themeHeaderImageIsCustomized) {\r\n deleteHeader = true;\r\n }\r\n\r\n if(!!this.state.footerImage && this.state.hasFooterImageChanged) {\r\n footerImageEncoded = (await this.getBase64(this.state.footerImage)) ?? \"\";\r\n }\r\n else if(!this.state.footerImage && this.state.currentTheme.themeFooterImageIsCustomized) {\r\n deleteFooter = true;\r\n }\r\n\r\n //There is an image to update\r\n if(headerImageEncoded !== \"\" || footerImageEncoded !== \"\")\r\n await this.props.saveThemeImages(this.state.currentTheme.id, headerImageEncoded, footerImageEncoded);\r\n\r\n if(deleteHeader) {\r\n await this.props.deleteThemeImage(headerType, this.state.currentTheme.id);\r\n }\r\n\r\n if(deleteFooter) {\r\n await this.props.deleteThemeImage(footerType, this.state.currentTheme.id);\r\n }\r\n\r\n const toSave = this.state.currentTheme;\r\n toSave.name = this.state.currentTitle;\r\n this.props.saveTheme(toSave).then(theme => {\r\n theme.isCustom = true;\r\n const themeClone = {...theme};\r\n this.setState({currentTheme: theme, backupTheme: themeClone, isSaving: false})\r\n if(theme) {\r\n this.setState({successMessage: \"Theme changes have been saved.\"});\r\n }\r\n else {\r\n this.setState({errorMessage: \"Theme could not be saved.\"})\r\n }\r\n }).catch(err => {\r\n this.setState({errorMessage: \"Theme could not be saved.\"});\r\n });\r\n }\r\n }\r\n\r\n private getBase64 = file => {\r\n return new Promise(resolve => {\r\n let baseURL:string = \"\";\r\n let reader = new FileReader();\r\n reader.readAsDataURL(file);\r\n reader.onload = () => {\r\n baseURL = reader.result?.toString() ?? \"\";\r\n resolve(baseURL);\r\n };\r\n });\r\n };\r\n\r\n private getNewTheme = (): NewsletterTheme => {\r\n const theme: NewsletterTheme = {\r\n id: \"guid.empty?\",\r\n name: \"\",\r\n isDefault: false,\r\n isCustom: true,\r\n emailBackground: \"#F5F5F5\",\r\n primaryBackground: \"#FEFEFA\",\r\n primaryText: \"#333333\",\r\n secondaryBackground: \"#949494\",\r\n secondaryText: \"#FFFFFF\",\r\n linkText: \"#3B78AB\",\r\n createdBy: \"\",\r\n createdByDisplayName: \"\",\r\n createdOnUTC: new Date(),\r\n lastModifiedBy: \"\",\r\n lastModifiedByDisplayName: \"\",\r\n lastModifiedOnUTC: new Date(),\r\n headerImage: \"\",\r\n footerImage: \"\",\r\n themeFooterImageIsCustomized: false,\r\n themeHeaderImageIsCustomized: false,\r\n }\r\n return theme;\r\n }\r\n\r\n private changeNewsletterColor = (toSet: string, toChange: string) => {\r\n let hexcode = hexCodeFromText(toSet);\r\n let isHexCodeValid = hexcode !== null;\r\n\r\n if(isHexCodeValid && hexcode) {\r\n let newTheme = this.state.currentTheme;\r\n switch(toChange){\r\n case colorLocations[0]:\r\n newTheme.emailBackground = hexcode;\r\n this.setState({currentTheme: newTheme})\r\n break;\r\n\r\n case colorLocations[1]:\r\n newTheme.primaryBackground = hexcode;\r\n this.setState({currentTheme: newTheme})\r\n break;\r\n\r\n case colorLocations[2]:\r\n newTheme.primaryText = hexcode;\r\n this.setState({currentTheme: newTheme})\r\n break;\r\n\r\n case colorLocations[3]:\r\n newTheme.secondaryBackground = hexcode;\r\n this.setState({currentTheme: newTheme})\r\n break;\r\n\r\n case colorLocations[4]:\r\n newTheme.secondaryText = hexcode;\r\n this.setState({currentTheme: newTheme})\r\n break;\r\n\r\n case colorLocations[5]:\r\n newTheme.linkText = hexcode;\r\n this.setState({currentTheme: newTheme})\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private toggleColorVisible = (toSet: boolean, toChange: string) => {\r\n switch(toChange){\r\n case colorLocations[0]:\r\n this.setState({emailBackgroundVisible: toSet})\r\n break;\r\n\r\n case colorLocations[1]:\r\n this.setState({primaryBackgroundVisible: toSet})\r\n break;\r\n\r\n case colorLocations[2]:\r\n this.setState({primaryTextVisible: toSet})\r\n break;\r\n\r\n case colorLocations[3]:\r\n this.setState({secondaryBackgroundVisible: toSet})\r\n break;\r\n\r\n case colorLocations[4]:\r\n this.setState({secondaryTextVisible: toSet})\r\n break;\r\n\r\n case colorLocations[5]:\r\n this.setState({linkTextVisible: toSet})\r\n break;\r\n }\r\n }\r\n\r\n private backToManageNewsletters = () => {\r\n if(this.hasBeenEdited()) {\r\n this.setState({showUnsavedChangesDialogPriorTo: \"onShowSendTestEmail\"})\r\n }\r\n else {\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/newsletters\");\r\n }\r\n }\r\n\r\n private hasBeenEdited = () => {\r\n const {backupTheme, currentTheme} = this.state;\r\n\r\n if(backupTheme.primaryBackground !== currentTheme.primaryBackground\r\n || currentTheme.emailBackground !== backupTheme.emailBackground\r\n || currentTheme.secondaryBackground !== backupTheme.secondaryBackground\r\n || currentTheme.primaryText !== backupTheme.primaryText\r\n || currentTheme.secondaryText !== backupTheme.secondaryText\r\n || currentTheme.linkText !== backupTheme.linkText\r\n || backupTheme.name !== this.state.currentTitle\r\n || this.state.hasHeaderImageChanged\r\n || this.state.hasFooterImageChanged) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\n\r\ninterface RouteParams {\r\n themeId?: string;\r\n}\r\n\r\ninterface ComponentState {\r\n currentTheme: NewsletterTheme;\r\n backupTheme: NewsletterTheme;\r\n emailBackgroundVisible: boolean;\r\n primaryBackgroundVisible: boolean;\r\n primaryTextVisible: boolean;\r\n secondaryBackgroundVisible: boolean;\r\n secondaryTextVisible: boolean;\r\n linkTextVisible: boolean;\r\n currentTitle: string;\r\n invalidState: boolean;\r\n imagesLoading: boolean;\r\n\r\n serverNewsletter?: NewsletterDetails;\r\n\r\n audiences?: Audience[];\r\n templates?: NewsletterTemplate[];\r\n themes?: NewsletterTheme[];\r\n selectedTemplate?: NewsletterTemplate;\r\n selectedTheme?: NewsletterTheme;\r\n\r\n modelErrors: SaveNewsletterModelStateErrors | null;\r\n successMessage?: string | null;\r\n errorMessage?: string | null;\r\n\r\n highlightTitleFields: boolean;\r\n highlightSubjectAndHeader: boolean;\r\n highlightSenderDetails: boolean;\r\n\r\n showTemplateSection: boolean;\r\n showAudienceFrequencySection: boolean;\r\n showNewsletterPreview?: boolean;\r\n showSendTestEmailDialog?: boolean;\r\n showUnsavedChangesDialogPriorTo?: 'onShowSendTestEmail' | null;\r\n showContentSection: boolean;\r\n\r\n headerImage?: File | null;\r\n isLoadingHeaderImage?: boolean;\r\n hasHeaderImageChanged?: boolean;\r\n\r\n footerImage?: File | null;\r\n isLoadingFooterImage?: boolean;\r\n hasFooterImageChanged?: boolean;\r\n\r\n changedSinceSaved:boolean;\r\n isSaving: boolean;\r\n isLoading: boolean;\r\n\r\n selectedTab: number;\r\n\r\n addresses: Address[];\r\n originalAddresses: Address[];\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: RouteComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n tenant: state.tenant.id,\r\n tenantSettings: state.settings.tenantSettings,\r\n tagSettings: state.settings.tagSettings\r\n }),\r\n {\r\n getNewsletterDetails: actions.getNewsletterDetails,\r\n getUniqueUsers: audiencesActions.fetchUniqueUserCount,\r\n getNewsletterImage: actions.getNewsletterImage,\r\n saveNewsletter: actions.saveNewsletter,\r\n getAudiences: audiencesActions.getAudiences,\r\n getTemplates: actions.getTemplates,\r\n getThemes: actions.getThemes,\r\n getTemmplateHtml: actions.getTemplateHtml,\r\n getTemplateImage: actions.getTemplateImage,\r\n deleteNewsletterImage: actions.deleteNewsletterImage,\r\n uploadNewsletterImage: actions.uploadNewsletterImage,\r\n redirectTo: push,\r\n getTagSettings: settingsActions.getTagSettings,\r\n getConfig: actions.getConfig,\r\n saveTheme: actions.saveTheme,\r\n saveThemeImages: actions.saveThemeImages,\r\n getThemeImage: actions.getThemeImage,\r\n deleteThemeImage: actions.deleteThemeImage\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(EditThemePage);\r\n","import React, { useState } from \"react\";\r\n\r\nimport { NewsletterDetails } from \"../../models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport Popover from \"@mui/material/Popover\";\r\n\r\nimport ArrowDropDownIcon from \"@mui/icons-material/ArrowDropDown\";\r\n\r\n\r\nconst DashboardActions: React.FunctionComponent = props => {\r\n const [actionsAnchorEl, setActionsAnchorEl] = useState(null);\r\n const [reportsAnchorEl, setReportsAnchorEl] = useState(null);\r\n \r\n const { details } = props;\r\n\r\n const onCloseActions = () => setActionsAnchorEl(null);\r\n const onCloseReports = () => setReportsAnchorEl(null);\r\n\r\n return (\r\n \r\n \r\n \r\n {!!details &&\r\n \r\n \r\n {\r\n onCloseReports();\r\n props.onViewEmailActivity();\r\n }}\r\n >\r\n \r\n \r\n {\r\n onCloseReports();\r\n props.onDownloadRecipientReport();\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n }\r\n {!!details &&\r\n \r\n \r\n {\r\n onCloseActions();\r\n props.onEdit();\r\n }}\r\n >\r\n \r\n \r\n {details.status === \"Enabled\" &&\r\n {\r\n onCloseActions();\r\n props.onDisable();\r\n }}\r\n >\r\n \r\n \r\n }\r\n {details.status === \"Disabled\" &&\r\n {\r\n onCloseActions();\r\n props.onEnable();\r\n }}\r\n >\r\n \r\n \r\n }\r\n {\r\n onCloseActions();\r\n props.onDelete();\r\n }}\r\n >\r\n \r\n \r\n \r\n {\r\n onCloseActions();\r\n props.onSendTestEmail();\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n }\r\n \r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n details: NewsletterDetails | undefined;\r\n onEdit: () => void;\r\n onDelete: () => void;\r\n onDisable: () => void;\r\n onDownloadRecipientReport: () => void;\r\n onSendTestEmail: () => void;\r\n onViewEmailActivity: () => void;\r\n onEnable: () => void;\r\n}\r\n\r\nexport default DashboardActions;","/*\r\n Component designed to have a show/hide section through the use of a Show More / Less button.\r\n The show more section will automatically close if anywhere outside of it is clicked.\r\n The actual expanded content is passed in with a prop called \"body\".\r\n*/\r\n\r\nimport React, { useEffect } from \"react\";\r\nimport { Button } from \"@mui/material\";\r\nimport './showMoreSection.sass';\r\n\r\nexport const ShowMoreSection: React.FunctionComponent = props => {\r\n const [showMore, setShowMore] = React.useState(false);\r\n\r\n //https://stackoverflow.com/questions/32553158/detect-click-outside-react-component\r\n function useOutsideAlerter(ref) {\r\n useEffect(() => {\r\n function handleClickOutside(event) {\r\n if (ref.current && !ref.current.contains(event.target)) {\r\n setShowMore(false);\r\n }\r\n }\r\n document.addEventListener(\"mousedown\", handleClickOutside);\r\n return () => {\r\n document.removeEventListener(\"mousedown\", handleClickOutside);\r\n };\r\n }, [ref]);\r\n }\r\n\r\n const wrapperRef = React.useRef(null);\r\n useOutsideAlerter(wrapperRef);\r\n\r\n return (\r\n
    \r\n {showMore &&\r\n
    \r\n {props.body ??
    }\r\n
    \r\n \r\n
    \r\n
    \r\n }\r\n {!showMore &&\r\n
    \r\n \r\n
    \r\n }\r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n body: JSX.Element;\r\n}","import React, { useEffect } from \"react\";\r\nimport ChipLabels from \"modules/common/components/chips/chipLabels\";\r\nimport { NewsletterConfigDigest, NewsletterDetails } from \"../../models\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport moment from \"moment\";\r\nimport { ShowMoreSection } from \"modules/common/components/showMoreSection\";\r\nimport { useDefaultLocale } from \"modules/common/hooks/useDefaultLocale\";\r\n\r\nexport const Details: React.FunctionComponent = props => {\r\n const { details } = props;\r\n const [defaultSenderName, setDefaultSenderName] = React.useState(\"\");\r\n const [defaultSenderEmail, setDefaultSenderEmail] = React.useState(\"\");\r\n useDefaultLocale();\r\n\r\n useEffect(() => {\r\n if(details?.fromEmailAddress === null || details?.fromEmailName === null)\r\n props.getConfig().then((currentConfig) => {\r\n setDefaultSenderName(currentConfig.fromEmailName);\r\n setDefaultSenderEmail(currentConfig.fromEmailAddress);\r\n });\r\n }, [props, details]);\r\n\r\n if (!details)\r\n return ;\r\n\r\n return (\r\n
    \r\n
    {details.title}{details.status === \"Disabled\" ? (Disabled) : \"\"}
    \r\n
    {details.description}
    \r\n \r\n
    \r\n
    \r\n
    Sender name
    \r\n
    {details.fromEmailName ?? defaultSenderName}
    \r\n
    \r\n
    \r\n
    Sender email
    \r\n
    {details.fromEmailAddress ?? defaultSenderEmail}
    \r\n
    \r\n
    \r\n \r\n
    \r\n {!!details.lastIssueSentOn &&\r\n
    \r\n
    Last sent on
    \r\n
    {moment(details.lastIssueSentOn).format(\"MMM D, YYYY, h:mmA\")}
    \r\n
    \r\n }\r\n {!!details.nextIssueSendOn &&\r\n
    \r\n
    Next queued for
    \r\n
    {moment(details.nextIssueSendOn).format(\"MMM D, YYYY, h:mmA\")}
    \r\n
    \r\n }\r\n
    \r\n
    Frequency
    \r\n {details.recurrenceType === \"Adhoc\"\r\n ?
    {details.recurrenceType}
    \r\n :
    Every {details.recurrenceType === \"Monthly\" ? `${details.monthlyRecurrenceWeek} ${details.monthlyRecurrenceDay}` : (details.recurrenceType === 'Biweekly' ? `other ${moment(details.firstIssueDateTime).format('dddd')}` : details.dailyRecurrenceOn.join(\", \"))}
    \r\n }\r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    Sent to
    \r\n
    \r\n
    \r\n
    \r\n
    Topics used
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    Subject
    \r\n
    {details.emailSubject}
    \r\n
    \r\n {!!details.emailPreheader &&\r\n
    \r\n
    Preheader
    \r\n
    {details.emailPreheader}
    \r\n
    \r\n }\r\n
    \r\n
    \r\n }/>\r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n details?: NewsletterDetails;\r\n getConfig: () => Promise\r\n}","import * as React from \"react\";\r\nimport UploadIcon from \"./uploadIconSvg\";\r\n\r\nimport IconButton from \"@mui/material/IconButton\";\r\n\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\n\r\nimport \"./uploader.sass\";\r\nimport { NewsletterTemplateImageType } from \"modules/newsletters\";\r\n\r\n\r\ninterface ComponentProps {\r\n imageSrc?: File | null;\r\n imageType: NewsletterTemplateImageType;\r\n setImage: (imageType: string, image?: File) => void;\r\n imageHeight: number;\r\n imageWidth: number;\r\n selectedFile?: File;\r\n onError: (message:string) => any;\r\n}\r\n\r\ninterface ComponentState {\r\n errors: string[];\r\n dragging: boolean;\r\n imageSrc: string;\r\n}\r\n\r\nclass Uploader extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n errors: [],\r\n dragging: false,\r\n imageSrc: !!props.imageSrc ? URL.createObjectURL(props.imageSrc) : \"\"\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n if (!this.state.imageSrc && !!this.props.imageSrc) {\r\n this.setState({ imageSrc: URL.createObjectURL(this.props.imageSrc) });\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: ComponentProps) {\r\n if (!!this.props.imageSrc && this.props.imageSrc !== prevProps.imageSrc) {\r\n this.setState({ imageSrc: URL.createObjectURL(this.props.imageSrc) });\r\n }\r\n }\r\n\r\n public render() {\r\n if (!this.state.imageSrc)\r\n return this.renderUploadForm();\r\n else\r\n return (\r\n
    \r\n \r\n \r\n \r\n \"preview\"\r\n
    \r\n );\r\n }\r\n\r\n private renderUploadForm() {\r\n let draggingProps = {\r\n onDrag: this.dragging(true),\r\n onDragStart: this.dragging(true),\r\n onDragEnd: this.dragging(false),\r\n onDragOver: this.dragging(true),\r\n onDragEnter: this.dragging(true),\r\n onDragLeave: this.dragging(false),\r\n onDrop: this.onFileDropped,\r\n };\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n \r\n

    \r\n \r\n

    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private dragging = (isDragging: boolean, callback?: () => void) => (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n if (typeof callback !== \"function\") callback = () => { };\r\n\r\n this.setState(\r\n {\r\n ...this.state,\r\n dragging: isDragging,\r\n },\r\n callback\r\n );\r\n return false;\r\n };\r\n\r\n private onFileDropped = (e: React.DragEvent) => {\r\n const files = e.dataTransfer.files;\r\n if (files) {\r\n this.dragging(false, () => {\r\n this.setImage(files);\r\n })(e);\r\n }\r\n };\r\n\r\n private onFileInputChanged = (e: React.FormEvent) => {\r\n const files = (e.target as HTMLInputElement).files;\r\n if (files) {\r\n var acceptedFiles = this.acceptedFiles();\r\n if(acceptedFiles.indexOf(files[0].type) !== -1) {\r\n this.setImage(files);\r\n }\r\n else {\r\n this.setError(`The ${this.props.imageType.toLowerCase()} image should be a proper image file type`);\r\n this.setState({ imageSrc: '' });\r\n }\r\n }\r\n };\r\n\r\n private setImage = (files: FileList) => {\r\n if (files) {\r\n this.props.setImage(this.props.imageType, files[0]);\r\n this.setState({ imageSrc: URL.createObjectURL(files[0]) });\r\n }\r\n }\r\n\r\n private onImageLoad = ({ target: img }) => {\r\n if (img.naturalHeight !== this.props.imageHeight || img.naturalWidth !== this.props.imageWidth) {\r\n this.setError(`The ${this.props.imageType.toLowerCase()} image should be ${this.props.imageWidth}px wide x ${this.props.imageHeight}px tall`);\r\n this.setState({ imageSrc: '' });\r\n this.props.setImage(this.props.imageType, undefined);\r\n }\r\n }\r\n\r\n private clearImage = (e) => {\r\n this.setState({ imageSrc: '' });\r\n this.props.setImage(this.props.imageType, undefined);\r\n }\r\n\r\n private setError(error: string) {\r\n this.props.onError(error);\r\n }\r\n\r\n private acceptedFiles = () => {\r\n return \"image/jpg,image/jpeg,image/png,image/bmp\";\r\n };\r\n}\r\n\r\nexport default Uploader;","import React, { useRef } from \"react\";\r\n\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport Uploader from \"../../common/uploader/uploader\";\r\nimport * as galleryActions from \"modules/gallery/actionCreator\";\r\nimport * as adminLayoutActions from \"modules/adminLayout/actionCreator\";\r\nimport { useTinyMceAuthoringLogic } from \"modules/common/hooks/useTinyMceAuthoringLogic\";\r\nimport { NewsletterDetails, NewsletterFutureIssueDetailModel, NewsletterTemplateImageType } from \"../../models\";\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\nimport { AuthoringTinyEditor } from \"modules/common/components/authoring/authoringTinyMce\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\n\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\n\r\nimport './styles.sass';\r\nimport { Grid, Link, Typography } from \"@mui/material\";\r\nimport IntenseEmphasis from \"modules/common/components/authoring/dialogs/intenseEmphasis\";\r\n\r\nconst HeaderFooterComponent: React.FunctionComponent = ({\r\n issue,\r\n newsletter,\r\n isLoadingFooterImage,\r\n isLoadingHeaderImage,\r\n headerImage,\r\n footerImage,\r\n setMainStyle,\r\n setHeaderStyle,\r\n onError,\r\n onSetImage,\r\n onChange,\r\n ...props\r\n}) => {\r\n const {\r\n editorRef: headerRef,\r\n intenseEmphasisDialogOpen,\r\n onShowIntenseEmphasisDialog,\r\n onApplyIntenseEmphasis,\r\n onHideIntenseEmphasisDialog,\r\n } = useTinyMceAuthoringLogic(props.getImage);\r\n\r\n const bodyRef = useRef(null);\r\n const footerRef = useRef(null);\r\n\r\n const onChangeFooterText = (newFooter: string) => {\r\n let newContent = issue.translatedContent;\r\n newContent[props.activeLcid].footer = newFooter;\r\n onChange({ ...issue, translatedContent: newContent });\r\n }\r\n\r\n const onChangeHeaderText = (newHeader: string) => {\r\n let newContent = issue.translatedContent;\r\n newContent[props.activeLcid].header = newHeader;\r\n onChange({ ...issue, translatedContent: newContent });\r\n }\r\n\r\n const onChangeBodyText = (newBody: string) => {\r\n let newContent = issue.translatedContent;\r\n newContent[props.activeLcid].body = newBody;\r\n onChange({ ...issue, translatedContent: newContent });\r\n }\r\n\r\n const onFullscreen = (isFullscreen: boolean) => {\r\n if (isFullscreen) {\r\n // one more than side nav bar\r\n setMainStyle({ zIndex: 3 });\r\n setHeaderStyle({ display: \"none\" });\r\n } else {\r\n setMainStyle(undefined);\r\n setHeaderStyle(undefined);\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n
    \r\n {newsletter.emailTemplateIsCustom\r\n ? \r\n <>\r\n }\r\n text={\r\n \r\n \r\n Header and Footer images cannot be modified through the Newsletter Editor when using custom templates.\r\n Add or modify custom templates with the help of our Support team. window.open(\"https://support.sparrowconnected.com/en/how-do-i-create-a-custom-template-for-newsletters\")} underline=\"always\">Learn more.\r\n \r\n \r\n }\r\n />\r\n\r\n \r\n \r\n
    \r\n Body\r\n Enter any supporting messages or paragraphs.\r\n
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    Footer text
    \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n \r\n : (\r\n
    \r\n
    \r\n
    Header image
    \r\n {issue.emailTemplateHeaderImageIsCustomized && isLoadingHeaderImage\r\n ?
    \r\n \r\n
    \r\n :
    \r\n \r\n
    \r\n }\r\n
    \r\n
    \r\n
    Header text
    \r\n
    \r\n \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n Body\r\n Enter any supporting messages or paragraphs.\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    Footer image
    \r\n {issue.emailTemplateFooterImageIsCustomized && isLoadingFooterImage\r\n ?
    \r\n \r\n
    \r\n :
    \r\n \r\n
    \r\n }\r\n
    \r\n
    \r\n
    Footer text
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n
    \r\n \r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n issue: NewsletterFutureIssueDetailModel;\r\n newsletter: NewsletterDetails;\r\n footerImage: File | null;\r\n headerImage: File | null;\r\n isLoadingFooterImage?: boolean;\r\n isLoadingHeaderImage?: boolean;\r\n onError: (message: string) => any;\r\n onChange: (issue: NewsletterFutureIssueDetailModel) => void;\r\n onSetImage: (imageType: NewsletterTemplateImageType, image?: File) => void;\r\n activeLcid: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n defaultLcid: state.settings.tenantSettings.defaultLCID,\r\n }),\r\n {\r\n getImage: galleryActions.getImage,\r\n setMainStyle: adminLayoutActions.setMainStyle,\r\n setHeaderStyle: adminLayoutActions.setHeaderStyle\r\n }\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps;\r\nexport const HeaderFooter = connector(HeaderFooterComponent);\r\n","import React from \"react\";\r\n\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\n\r\nimport { NewsletterFutureIssueDetailModel, NewsletterIssueInput, SaveNewsletterIssueModelStateErrors } from \"../../models\";\r\n\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport { DatePicker } from \"@mui/x-date-pickers/DatePicker\";\r\n\r\nimport moment from \"moment\";\r\nimport _ from \"lodash\";\r\nimport { Divider } from \"@mui/material\";\r\n\r\n\r\nclass IssueDetails extends React.Component {\r\n\r\n constructor(props:ComponentProps){\r\n super(props);\r\n this.state = {};\r\n const now = new Date();\r\n this._today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\r\n }\r\n\r\n private _today : Date;\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public render() {\r\n const { issue, issueFromServer} = this.props;\r\n\r\n return (\r\n
    \r\n
    \r\n
    Newsletter
    \r\n
    {this.props.newsletterTitle}
    \r\n
    \r\n {!!issueFromServer && !!issueFromServer.sendDateTime &&\r\n
    \r\n
    Original date of issue
    \r\n
    {issueFromServer.sendDateTime ? moment(issueFromServer.sendDateTime).format(\"MMM D, YYYY, h:mmA\") : \"\"}
    \r\n
    \r\n }\r\n
    \r\n
    Send issue on
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    Compose the email
    \r\n
    {this.props.languageBar}
    \r\n
    \r\n
    \r\n
    Subject*
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n Preheader\r\n The Preheader is the text following the subject line when an email is previewed.\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n \r\n private shouldDisableDate = (day: Date) => {\r\n if(day < this._today) return true;\r\n\r\n if(!!this.props.issue.earliestOverrideDateTime && day < moment(this.props.issue.earliestOverrideDateTime).toDate())\r\n return true;\r\n \r\n if(!!this.props.issue.latestOverrideDateTime && day > moment(this.props.issue.latestOverrideDateTime).toDate())\r\n return true;\r\n \r\n return false;\r\n };\r\n\r\n private onChangeEmailPreheader = (event) => {\r\n let newContent = this.props.issue.translatedContent;\r\n newContent[this.props.activeLcid].preheader = event.target.value;\r\n this.props.onChange({ translatedContent: newContent });\r\n }\r\n\r\n private onChangeEmailSubject = (event) => {\r\n let newContent = this.props.issue.translatedContent;\r\n newContent[this.props.activeLcid].subject = event.target.value;\r\n this.props.onChange({ translatedContent: newContent });\r\n }\r\n\r\n private onChangeIssueDate = (date) => {\r\n const updatedDate: string = moment(date).toISOString();\r\n this.props.onChange({ overriddenIssueDateTime: updatedDate });\r\n }\r\n\r\n private onChangeIssueTime = (event) => {\r\n const times: number[] = event.target.value.split(\":\");\r\n const updatedDate: string = moment(this.props.issue.overriddenIssueDateTime || this.props.issue.sendDateTime).set(\"hour\", times[0]).set(\"minutes\", times[1]).toISOString();\r\n this.props.onChange({ overriddenIssueDateTime: updatedDate });\r\n }\r\n}\r\ninterface ComponentProps {\r\n issue: NewsletterFutureIssueDetailModel;\r\n issueFromServer?: NewsletterFutureIssueDetailModel;\r\n issueModelErrors?: SaveNewsletterIssueModelStateErrors | null;\r\n newsletterTitle: string;\r\n activeLcid: string;\r\n onChange: (issue: Partial) => void;\r\n languageBar: JSX.Element;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nexport default IssueDetails;","import React, { useState } from \"react\";\r\n\r\nimport Callout from \"modules/common/components/callout\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport { EventFeedItem } from \"modules/events/models\";\r\n\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\n\r\nimport moment from \"moment\";\r\nimport { useDefaultLocale } from \"modules/common/hooks/useDefaultLocale\";\r\n\r\n// In the future, use contentSearch component instead\r\nconst SearchEvents: React.FunctionComponent = props => {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const [isSearching, setIsSearching] = useState(false);\r\n const [results, setResults] = useState([] as EventFeedItem[]);\r\n const [searchText, setSearchText] = useState(\"\");\r\n const [showCallout, setShowCallout] = useState(false);\r\n\r\n useDefaultLocale();\r\n\r\n return (\r\n \r\n \r\n }}\r\n onChange={(ev: any) => {\r\n setSearchText(ev.target.value);\r\n setAnchorEl(ev.currentTarget);\r\n }}\r\n onKeyUp={(key) => {\r\n if (key.keyCode === 13 && !!searchText) {\r\n setIsSearching(true);\r\n setResults([]);\r\n setShowCallout(true);\r\n props.onSearch(searchText).then((feed) => {\r\n setResults(feed);\r\n setIsSearching(false);\r\n });\r\n }\r\n }}\r\n className=\"search-text\"\r\n />\r\n \r\n
    \r\n {isSearching\r\n ? \r\n : !results.length\r\n ?
    No matching results found
    \r\n :
    \r\n {results.map((result) =>\r\n {\r\n props.onPin(result);\r\n setAnchorEl(null);\r\n setSearchText(\"\");\r\n setShowCallout(false);\r\n }}\r\n className=\"search-result\"\r\n >\r\n
    \r\n {!!result.imageUrl\r\n ? \"\"\r\n :
    \r\n }\r\n
    \r\n
    \r\n
    {result.title}
    \r\n
    {result.author.name}
    \r\n
    Event start date: {moment(result.publishTime).format(\"MMM D, YYYY\")}
    \r\n
    \r\n
    \r\n )}\r\n
    \r\n }\r\n \r\n \r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n onPin: (event: EventFeedItem) => void;\r\n onSearch: (searchText: string) => Promise;\r\n}\r\n\r\nexport default SearchEvents;\r\n","import React, { useState } from \"react\";\r\n\r\nimport Callout from \"modules/common/components/callout\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport { PostFeedItem } from \"modules/posts/models\";\r\n\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\n\r\nimport moment from \"moment\";\r\nimport { useDefaultLocale } from \"modules/common/hooks/useDefaultLocale\";\r\n\r\n// In the future, use contentSearch component instead\r\nconst SearchPosts: React.FunctionComponent = props => {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const [isSearching, setIsSearching] = useState(false);\r\n const [results, setResults] = useState([] as PostFeedItem[]);\r\n const [searchText, setSearchText] = useState(\"\");\r\n const [showCallout, setShowCallout] = useState(false);\r\n\r\n useDefaultLocale();\r\n\r\n return (\r\n \r\n \r\n }}\r\n onChange={(ev: any) => {\r\n setSearchText(ev.target.value);\r\n setAnchorEl(ev.currentTarget);\r\n }}\r\n onKeyUp={(key) => {\r\n if (key.keyCode === 13 && !!searchText) {\r\n setIsSearching(true);\r\n setResults([]);\r\n setShowCallout(true);\r\n props.onSearch(searchText).then((feed) => {\r\n setResults(feed);\r\n setIsSearching(false);\r\n });\r\n }\r\n }}\r\n className=\"search-text\"\r\n />\r\n \r\n
    \r\n {isSearching\r\n ? \r\n : !results.length\r\n ?
    No matching results found
    \r\n :
    \r\n {results.map((result) =>\r\n {\r\n props.onPin(result);\r\n setAnchorEl(null);\r\n setSearchText(\"\");\r\n setShowCallout(false);\r\n }}\r\n className=\"search-result\"\r\n >\r\n
    \r\n \"\"\r\n
    \r\n
    \r\n
    {result.title}
    \r\n
    {result.author.name}
    \r\n
    Published {moment(result.publishTime).format(\"MMM D, YYYY\")}
    \r\n
    \r\n
    \r\n )}\r\n
    \r\n }\r\n \r\n \r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n onPin: (post: PostFeedItem) => void;\r\n onSearch: (searchText: string) => Promise;\r\n}\r\n\r\nexport default SearchPosts;\r\n","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport { EventFeedItem } from \"modules/events/models\";\r\nimport { PostFeedItem } from \"modules/posts/models\";\r\n\r\nimport { FeaturedContent, NewsletterIssue } from \"../../models\";\r\n\r\nimport SearchEvents from \"./searchEvents\";\r\nimport SearchPosts from \"./searchPosts\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Radio from \"@mui/material/Radio\";\r\nimport RadioGroup from \"@mui/material/RadioGroup\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\n\r\nimport moment from \"moment\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\n\r\n\r\ninterface Pin extends FeaturedContent {\r\n author: string;\r\n bannerColor: string;\r\n imageUrl: string;\r\n time: string;\r\n}\r\n\r\nclass PinnedContent extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n currentSelection: { ...this.defaultContent() },\r\n isAdding: false,\r\n isLoading: !!props.issue.featuredContent && !!props.issue.featuredContent.length,\r\n isSearching: false,\r\n pins: [],\r\n searchText: \"\"\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n\r\n this.getPins();\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n
    \r\n Pinned Content in Featured Section\r\n The Featured Section of your quick newsletter hosts the events and/or posts you want to pin despite the employee's read status.\r\n
    \r\n {this.state.isLoading\r\n ? \r\n : \r\n {this.state.pins.map((pin, index) =>\r\n this.getContentSelection(pin, index + 1)\r\n )}\r\n \r\n {this.getContentSelection(this.state.currentSelection, this.state.pins.length + 1)}\r\n \r\n \r\n \r\n }\r\n
    \r\n );\r\n }\r\n\r\n private defaultContent = (): Pin => {\r\n return {\r\n contentType: \"Post\",\r\n author: \"\",\r\n bannerColor: \"\",\r\n id: \"\",\r\n imageUrl: \"\",\r\n name: \"\",\r\n time: \"\"\r\n };\r\n }\r\n\r\n private getContentSelection = (pin: Pin, index: number) => {\r\n return (\r\n
    \r\n
    Pinned Post or Event {index}
    \r\n {!!pin.id\r\n ?
    \r\n
    \r\n {!!pin.imageUrl\r\n ? \"\"\r\n :
    \r\n }\r\n
    \r\n
    \r\n
    {pin.name}
    \r\n
    {pin.author}
    \r\n
    {pin.contentType === \"Event\" ? \"Event start date:\" : \"Published\"} {moment(pin.time).format(\"MMM D, YYYY\")}
    \r\n
    \r\n this.onRemovePin(pin)} className=\"remove-pin\">\r\n \r\n \r\n
    \r\n : \r\n
    \r\n \r\n \r\n
    \r\n } label=\"Pin a post\" />\r\n {pin.contentType === \"Post\" &&\r\n this.props.searchPosts(text, 1, this.props.usersRoles.includes(UserRoleStrings.OWNER))}\r\n />\r\n }\r\n
    \r\n
    \r\n } label=\"Pin an event\" />\r\n {pin.contentType === \"Event\" &&\r\n this.props.searchEvents(text, 1)} />\r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n }\r\n
    \r\n );\r\n }\r\n\r\n private getPins = async () => {\r\n const pins: Pin[] = await Promise.all((this.props.issue.featuredContent || []).map((feature) => this.convertToPin(feature)));\r\n this.setState({ isLoading: false, pins });\r\n }\r\n\r\n\r\n private convertToPin = async (featuredContent: FeaturedContent): Promise => {\r\n if (featuredContent.contentType === \"Event\")\r\n return this.props.getEvent(featuredContent.id).then((event) => {\r\n return {\r\n ...featuredContent,\r\n author: event.author.name,\r\n bannerColor: event.bannerColor,\r\n imageUrl: event.imageUrl,\r\n time: event.eventStartTime\r\n };\r\n });\r\n else\r\n return this.props.getPost(featuredContent.id).then((post) => {\r\n return {\r\n ...featuredContent,\r\n author: post.author.name,\r\n bannerColor: post.bannerColor,\r\n imageUrl: post.imageUrl,\r\n time: post.publishTime\r\n };\r\n });\r\n }\r\n\r\n\r\n private onAddContent = () => {\r\n this.setState({ isAdding: true, currentSelection: { ...this.defaultContent() } });\r\n }\r\n\r\n private onChangeContentType = (event) => {\r\n this.setState({ currentSelection: { ...this.state.currentSelection, contentType: event.target.value }, searchText: \"\" });\r\n }\r\n\r\n private onPinEvent = (event: EventFeedItem) => {\r\n const featuredContent: FeaturedContent = { contentType: \"Event\", id: event.id, name: event.title };\r\n this.props.onChange({ featuredContent: (this.props.issue.featuredContent || []).concat([featuredContent]) });\r\n this.setState({ isAdding: false, pins: this.state.pins.concat([{ ...featuredContent, author: event.author.name, bannerColor: event.bannerColor, imageUrl: event.imageUrl, time: event.eventStartTime }]) });\r\n }\r\n\r\n private onPinPost = (post: PostFeedItem) => {\r\n const featuredContent: FeaturedContent = { contentType: \"Post\", id: post.id, name: post.title };\r\n this.props.onChange({ featuredContent: (this.props.issue.featuredContent || []).concat([featuredContent]) });\r\n this.setState({ isAdding: false, pins: this.state.pins.concat([{ ...featuredContent, author: post.author.name, bannerColor: post.bannerColor, imageUrl: post.imageUrl, time: post.publishTime }]) });\r\n }\r\n\r\n private onRemoveCurrentSelection = () => {\r\n this.setState({ isAdding: false });\r\n }\r\n\r\n private onRemovePin = (pin: Pin) => {\r\n this.props.onChange({ featuredContent: this.props.issue.featuredContent!.filter((currentFeature) => currentFeature.id !== pin.id ) });\r\n this.setState({ pins: this.state.pins.filter((currentPin) => currentPin.id !== pin.id )});\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n issue: Partial;\r\n onChange: (issue: Partial) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n currentSelection: Pin;\r\n isAdding: boolean;\r\n isLoading: boolean;\r\n isSearching: boolean;\r\n pins: Pin[];\r\n searchText: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n usersRoles: state.settings.currentUser.roles\r\n }),\r\n {\r\n getEvent: actions.getEvent,\r\n getPost: actions.getPost,\r\n searchEvents: actions.searchEvents,\r\n searchPosts: actions.searchPosts,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(PinnedContent);\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport {\r\n NewsletterDetails,\r\n NewsletterFutureIssueDetailModel,\r\n NewsletterTemplateImageType,\r\n SaveNewsletterIssueModelStateErrors,\r\n UploadIssueImageModel,\r\n HEADER,\r\n FOOTER\r\n} from \"../../models\";\r\n\r\nimport { HeaderFooter } from \"./headerFooter\";\r\nimport IssueDetails from \"./issueDetails\";\r\nimport PinnedContent from \"./pinnedContent\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport { PickerLocalization } from \"modules/common/components/pickerLocalization\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport SyncIcon from \"@mui/icons-material/Sync\";\r\n\r\nimport moment from \"moment\";\r\nimport _ from \"lodash\";\r\n\r\nimport \"modules/common/components/authoring/authoring.sass\";\r\nimport \"../../styles/dialogs.sass\";\r\nimport { useEffect, useState } from \"react\";\r\nimport NewsletterLanguageBar from \"modules/newsletters/edit/components/newsletterLanguageBar\";\r\nimport useLanguages from \"modules/common/hooks/data/useLanguages\";\r\nimport { TranslatedNewsletterContent } from \"modules/common/components/authoring/models\";\r\nimport { deepCopy } from \"utils/deepCopy\";\r\nimport { useDefaultLocale } from \"modules/common/hooks/useDefaultLocale\";\r\n\r\n\r\nconst EditQueuedIssue: React.FunctionComponent = props => {\r\n const onChangeIssue = (changed: Partial) => {\r\n let newIssue = {...issue!, ...changed}\r\n setIssue(newIssue);\r\n }\r\n\r\n const onResetIssue = () => {\r\n setIsSaving(true);\r\n\r\n props.onResetIssue().then(() => {\r\n setIsSaving(false);\r\n props.onCloseIssue();\r\n });\r\n }\r\n\r\n const onSaveHeaderFooterImage = (issue: NewsletterFutureIssueDetailModel): Promise => {\r\n return new Promise((resolve) => {\r\n if (hasFooterImageChanged || hasHeaderImageChanged) {\r\n if (hasHeaderImageChanged) {\r\n if (!headerImage && !!issueFromServer && issueFromServer.emailTemplateHeaderImageIsCustomized)\r\n return props.deleteIssueImage(props.newsletter.id, issue.issueDateLocal, HEADER).then(() => resolve());\r\n }\r\n\r\n if (hasFooterImageChanged) {\r\n if (!footerImage && !!issueFromServer && issueFromServer.emailTemplateFooterImageIsCustomized)\r\n return props.deleteIssueImage(props.newsletter!.id, issue.issueDateLocal, FOOTER).then(() => resolve());\r\n }\r\n\r\n const uploadImageModel: UploadIssueImageModel = {\r\n newsletterId: props.newsletter!.id,\r\n headerImage: headerImageBase64,\r\n footerImage: footerImageBase64,\r\n issueDate: issue.issueDateLocal\r\n };\r\n\r\n return props.uploadIssueHeaderFooterImage(uploadImageModel).then(() => resolve());\r\n } else {\r\n resolve();\r\n }\r\n });\r\n }\r\n\r\n const onSaveIssue = (): Promise => {\r\n setIsSaving(true);\r\n\r\n return props.saveIssue(issue!)\r\n .then((result) => {\r\n if (!!result.success) {\r\n return onSaveHeaderFooterImage(result.success);\r\n } else if (!!result.error) {\r\n const firstError = _.first(_.values(result.error.ModelState));\r\n !!firstError && props.onError(firstError[0]);\r\n setIsSaving(false);\r\n setIssueModelErrors(result.error.ModelState);\r\n }\r\n }).then(() => {\r\n setIsSaving(false);\r\n setIssueModelErrors(null);\r\n props.onSuccess('Issue saved');\r\n props.onIssueChanged();\r\n });\r\n }\r\n\r\n const onChangeImage = (imageType: NewsletterTemplateImageType, image?: File) => {\r\n let reader = new FileReader();\r\n if (imageType === HEADER && !!image) {\r\n reader.readAsDataURL(image);\r\n reader.onload = (): void => {\r\n setHeaderImage(image);\r\n setHasHeaderImageChanged(true);\r\n setHeaderImageBase64(reader.result?.toString());\r\n };\r\n }\r\n else if (imageType === FOOTER && !!image) {\r\n reader.readAsDataURL(image);\r\n reader.onload = (): void => {\r\n setFooterImage(image);\r\n setHasFooterImageChanged(true);\r\n setFooterImageBase64(reader.result?.toString());\r\n };\r\n }\r\n }\r\n\r\n const updateTranslatedContent = (toSet: TranslatedNewsletterContent) => {\r\n let updatedIssue = deepCopy(issue);\r\n updatedIssue!.translatedContent = toSet;\r\n setIssue(updatedIssue);\r\n }\r\n\r\n const allLanguagesHaveRequiredContent = () => {\r\n let validContent = true;\r\n\r\n selectedLanguages?.forEach(l => {\r\n if(!issue!.translatedContent[l.lcid].subject || issue!.translatedContent[l.lcid].subject === \"\") {\r\n validContent = false;\r\n }\r\n });\r\n\r\n return validContent;\r\n }\r\n\r\n const [issue, setIssue] = useState();\r\n const [issueFromServer, setIssueFromServer] = useState();\r\n const [isLoadingIssue, setIsLoadingIssue] = useState();\r\n const [issueModelErrors, setIssueModelErrors] = useState();\r\n\r\n const [headerImage, setHeaderImage] = useState();\r\n const [headerImageBase64, setHeaderImageBase64] = useState();\r\n const [isLoadingHeaderImage, setIsLoadingHeaderImage] = useState();\r\n const [hasHeaderImageChanged, setHasHeaderImageChanged] = useState();\r\n\r\n const [footerImage, setFooterImage] = useState();\r\n const [footerImageBase64, setFooterImageBase64] = useState();\r\n const [isLoadingFooterImage, setIsLoadingFooterImage] = useState();\r\n const [hasFooterImageChanged, setHasFooterImageChanged] = useState();\r\n\r\n const [isSaving, setIsSaving] = useState();\r\n\r\n const {\r\n availableLanguages,\r\n selectedLanguages,\r\n activeLcid,\r\n defaultLcid,\r\n lcidMappings,\r\n onRemoveLanguage,\r\n onSelectLanguage,\r\n } = useLanguages(issue?.translatedContent);\r\n useDefaultLocale();\r\n\r\n useEffect(() => {\r\n const loadHeaderAndFooterImage = (issueDetails: NewsletterFutureIssueDetailModel) => {\r\n if (issueDetails.emailTemplateHeaderImageIsCustomized) {\r\n setIsLoadingHeaderImage(true);\r\n props.getIssueImage(props.newsletter.id, issueDetails.issueDateLocal, HEADER).then((image) => {\r\n setHeaderImage(image);\r\n setIsLoadingHeaderImage(false);\r\n });\r\n } else if (props.newsletter.emailTemplateHeaderImageIsCustomized) {\r\n setIsLoadingHeaderImage(true);\r\n props.getNewsletterImage(props.newsletter.id, HEADER).then((image) => {\r\n setHeaderImage(image);\r\n setIsLoadingHeaderImage(false);\r\n });\r\n } else {\r\n setHeaderImage(null);\r\n setIsLoadingHeaderImage(false);\r\n }\r\n \r\n if (issueDetails.emailTemplateFooterImageIsCustomized) {\r\n setIsLoadingFooterImage(true);\r\n props.getIssueImage(props.newsletter.id, issueDetails.issueDateLocal, FOOTER).then((image) => {\r\n setFooterImage(image);\r\n setIsLoadingFooterImage(false);\r\n });\r\n }\r\n else if (props.newsletter.emailTemplateFooterImageIsCustomized) {\r\n setIsLoadingFooterImage(true);\r\n props.getNewsletterImage(props.newsletter.id, FOOTER).then((image) => {\r\n setFooterImage(image);\r\n setIsLoadingFooterImage(false);\r\n });\r\n }\r\n else {\r\n setFooterImage(null);\r\n setIsLoadingFooterImage(false);\r\n }\r\n }\r\n\r\n const onEditFutureIssue = (issueDateLocal: string) => {\r\n setIsLoadingIssue(true);\r\n \r\n props.getFutureIssueDetails(props.newsletter.id, issueDateLocal)\r\n .then((issueDetails) => {\r\n\r\n //Check and fix if legacy.\r\n if(Object.keys(issueDetails.translatedContent).length === 0) {\r\n issueDetails.translatedContent = {[defaultLcid]: {\r\n subject: issueDetails.emailSubject,\r\n preheader: issueDetails.emailPreheader,\r\n header: issueDetails.emailTemplateHeaderText, \r\n body: issueDetails.bodyText,\r\n footer: issueDetails.emailTemplateFooterText\r\n }};\r\n }\r\n\r\n setIssue(deepCopy(issueDetails));\r\n setIssueFromServer(deepCopy(issueDetails));\r\n setIsLoadingIssue(false);\r\n loadHeaderAndFooterImage(issueDetails);\r\n });\r\n }\r\n\r\n const onAddFutureIssue = () => {\r\n const { newsletter } = props;\r\n \r\n const futureDate: string = moment().add(1, \"day\").set(\"hours\", 12).set(\"minutes\", 0).toISOString();\r\n \r\n const isMissingTranslatedContent = !newsletter.translatedContent || Object.keys(newsletter.translatedContent).length === 0\r\n const makeupTranslatedContent:TranslatedNewsletterContent = {\r\n [defaultLcid]: {\r\n subject: newsletter.emailSubject,\r\n preheader: newsletter.emailPreheader,\r\n header: newsletter.emailTemplateHeaderText,\r\n body: newsletter.bodyText,\r\n footer: newsletter.emailTemplateFooterText,\r\n }\r\n };\r\n\r\n const newFutureIssue: NewsletterFutureIssueDetailModel = {\r\n issueDateLocal: \"\",\r\n issueType: \"Adhoc\",\r\n newsletterId: newsletter.id,\r\n tenantId: newsletter.tenantId,\r\n emailPreheader: newsletter.emailPreheader,\r\n emailSubject: newsletter.emailSubject,\r\n emailTemplateFooterText: newsletter.emailTemplateFooterText,\r\n emailTemplateHeaderText: newsletter.emailTemplateHeaderText,\r\n bodyText: newsletter.bodyText,\r\n featuredContent: [],\r\n overriddenIssueDateTime: futureDate,\r\n status: \"Future\",\r\n emailTemplateFooterImageIsCustomized: false,\r\n emailTemplateHeaderImageIsCustomized: false,\r\n isCustomized: false,\r\n sendDateTime: \"\",\r\n translatedContent: isMissingTranslatedContent ? makeupTranslatedContent : newsletter.translatedContent\r\n };\r\n \r\n setIssue(newFutureIssue);\r\n setIssueFromServer(newFutureIssue);\r\n setIsLoadingIssue(false);\r\n \r\n loadHeaderAndFooterImage(newFutureIssue);\r\n }\r\n\r\n if (props.isAddingNewIssue) {\r\n onAddFutureIssue();\r\n } else if (!!props.editingIssueDateLocal) {\r\n onEditFutureIssue(props.editingIssueDateLocal!);\r\n }\r\n }, [])\r\n\r\n const { isAddingNewIssue } = props;\r\n\r\n return (\r\n \r\n \r\n \r\n
    \r\n {isAddingNewIssue && New issue}\r\n {!isAddingNewIssue && Edit issue}\r\n Changing settings for a specific issue will not affect succeeding issues. Edit the newsletter to change the settings of this and all succeeding issues.\r\n
    \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n
    \r\n {!isLoadingIssue && !!issue &&\r\n \r\n \r\n }\r\n />\r\n \r\n \r\n \r\n \r\n }\r\n
    \r\n
    \r\n
    \r\n {!!issue && \r\n
    \r\n {!isAddingNewIssue && props.newsletter.recurrenceType !== \"Adhoc\" &&\r\n }\r\n disabled={!issue.isCustomized}\r\n onClick={onResetIssue}\r\n >\r\n Reset issue to original settings\r\n \r\n }\r\n
    \r\n
    \r\n \r\n Cancel\r\n \r\n \r\n Save\r\n \r\n
    \r\n
    }\r\n \r\n
    \r\n \r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n newsletter: NewsletterDetails;\r\n isAddingNewIssue: boolean;\r\n editingIssueDateLocal: string | null;\r\n onCloseIssue: () => any;\r\n onIssueChanged: () => any;\r\n onResetIssue: () => Promise;\r\n onError: (message: string) => any;\r\n onSuccess: (message: string) => any;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ownProps,\r\n {\r\n getFutureIssueDetails: actions.getFutureIssueDetails,\r\n getNewsletterImage: actions.getNewsletterImage,\r\n getIssueImage: actions.getIssueImage,\r\n deleteIssueImage: actions.deleteIssueImage,\r\n uploadIssueImage: actions.uploadIssueImage,\r\n uploadIssueHeaderFooterImage: actions.uploadIssueHeaderFooterImage,\r\n translateNewsletter: actions.translateNewsletter,\r\n saveIssue: actions.saveIssue\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(EditQueuedIssue);\r\n\r\n","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport { NewsletterDetails } from \"../../models\";\r\n\r\nimport EditQueuedIssueDialog from \"./editQueuedIssueDialog\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableContainer from \"@mui/material/TableContainer\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport SyncIcon from \"@mui/icons-material/Sync\";\r\n\r\nimport moment from \"moment\";\r\n\r\nclass FutureIssues extends React.Component {\r\n\r\n public constructor(props:PropsWithRedux){\r\n super(props);\r\n this.state={\r\n isAddingNewIssue:false,\r\n editingIssueDateLocal:null\r\n };\r\n }\r\n\r\n public componentDidMount(){\r\n moment.locale(\"en\");\r\n }\r\n\r\n public render() {\r\n const { newsletter } = this.props;\r\n const isNewsletterAdhoc = newsletter.recurrenceType === \"Adhoc\";\r\n\r\n if (!newsletter)\r\n return ;\r\n \r\n return (\r\n \r\n
    \r\n
    \r\n
    \r\n Future Issues\r\n Five future issues are automatically added even if you change the date of one edition. Newsletter issues added follow the farthest date sent, depending on the frequency you've set.\r\n
    \r\n
    \r\n {!isNewsletterAdhoc\r\n ? }\r\n disabled={newsletter.futureIssues.findIndex(futureIssue => futureIssue.isCustomized) === -1}\r\n onClick={async () => {\r\n if (await confirm.show({\r\n title: `Reset queued issues in '${newsletter.title}'`,\r\n text: (\r\n
    \r\n
    You're about to reset the queued items in '{newsletter.title}'. You'll lose customizations in all currently queued issues.
    \r\n
    \r\n
    Are you sure?
    \r\n
    \r\n ),\r\n yesColor: \"#a80000\",\r\n yesText: \"Reset\",\r\n noText: \"Cancel\"\r\n }))\r\n this.onResetIssues(newsletter.futureIssues.filter(futureIssue => futureIssue.isCustomized).map(futureIssue => futureIssue.issueDateLocal));\r\n }}\r\n >\r\n Reset issues\r\n \r\n : \r\n }\r\n
    \r\n
    \r\n {newsletter.status === \"Disabled\"\r\n ?
    Newsletter is disabled.
    \r\n : newsletter.futureIssues.length === 0\r\n ?
    No future issues were found.
    \r\n : (\r\n \r\n \r\n \r\n \r\n Scheduled for\r\n \r\n \r\n \r\n \r\n \r\n {newsletter.futureIssues.map((futureIssue, index) => {\r\n return (\r\n \r\n \r\n {moment(futureIssue.sendDateTime).format(\"MMM D, YYYY h:mmA\")}\r\n {futureIssue.status === \"Skip\" ? \" (Skipping)\" : (futureIssue.isCustomized ? \" (Customized)\" : \"\")}\r\n \r\n \r\n {futureIssue.status === \"Future\" &&\r\n \r\n }\r\n \r\n \r\n {!isNewsletterAdhoc && futureIssue.status === \"Skip\"\r\n && {\r\n this.onUnskipIssue(futureIssue.issueDateLocal);\r\n }}\r\n >\r\n Unskip\r\n \r\n }\r\n {!isNewsletterAdhoc && futureIssue.status === \"Future\"\r\n && {\r\n this.onSkipIssue(futureIssue.issueDateLocal);\r\n }}\r\n >\r\n Skip\r\n \r\n }\r\n {isNewsletterAdhoc &&\r\n {\r\n if (await confirm.show({\r\n title: `Remove '${moment(futureIssue.sendDateTime).format(\"MMM D, YYYY\")}' issue`,\r\n text: (\r\n
    \r\n
    You're about to remove the issue for '{moment(futureIssue.sendDateTime).format(\"MMM D, YYYY\")}'.
    \r\n
    \r\n
    Are you sure?
    \r\n
    \r\n ),\r\n yesColor: \"#a80000\",\r\n yesText: \"Remove\",\r\n noText: \"Cancel\"\r\n }))\r\n this.onResetIssue(futureIssue.issueDateLocal);\r\n }}\r\n >\r\n Remove\r\n \r\n }\r\n
    \r\n
    \r\n );\r\n })}\r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n
    \r\n {(this.state.isAddingNewIssue || !!this.state.editingIssueDateLocal) && \r\n this.onResetIssue(this.state.editingIssueDateLocal!)}\r\n onCloseIssue={this.onCloseIssue}\r\n onSuccess={this.props.onSuccess}\r\n onError={this.props.onError}\r\n /> \r\n }\r\n
    \r\n );\r\n }\r\n \r\n private onCloseIssue = () => {\r\n this.setState({ isAddingNewIssue: false, editingIssueDateLocal: null });\r\n }\r\n\r\n private onIssueChanged = () => {\r\n this.props.onNewsletterUpdated();\r\n this.onCloseIssue();\r\n }\r\n\r\n private onSkipIssue = (issueDateLocal: string): Promise => {\r\n this.props.onSaving();\r\n return this.props.skipIssue(this.props.newsletter.id, issueDateLocal).then((succeeded) => {\r\n if (succeeded){\r\n this.props.onSuccess(\"Skipped\");\r\n }else{\r\n this.props.onError(\"Failed\");\r\n }\r\n this.props.onNewsletterUpdated();\r\n });\r\n }\r\n\r\n private onUnskipIssue = (issueDateLocal: string): Promise => {\r\n this.props.onSaving();\r\n return this.props.unskipIssue(this.props.newsletter.id, issueDateLocal).then((succeeded) => {\r\n if (succeeded){\r\n this.props.onSuccess(\"Re-queued\");\r\n }else{\r\n this.props.onError(\"Failed\");\r\n }\r\n this.props.onNewsletterUpdated();\r\n });\r\n }\r\n\r\n private onResetIssue = (issueDateLocal: string): Promise => {\r\n this.props.onSaving();\r\n return this.props.resetIssue(this.props.newsletter.id, issueDateLocal).then((succeeded) => {\r\n if (succeeded) {\r\n this.props.onSuccess(\"Issue reset\");\r\n } else {\r\n this.props.onError(\"Failed\");\r\n }\r\n this.props.onNewsletterUpdated();\r\n return succeeded;\r\n });\r\n }\r\n\r\n private onResetIssues = (issueDatesLocal: string[]): Promise => {\r\n this.props.onSaving();\r\n return this.props.resetIssues(this.props.newsletter.id, issueDatesLocal).then((succeeded) => {\r\n if (succeeded){\r\n this.props.onSuccess(\"Issues Reset\");\r\n }else{\r\n this.props.onError(\"Failed\");\r\n }\r\n this.props.onNewsletterUpdated();\r\n });\r\n }\r\n}\r\n\r\ninterface ComponentState{\r\n isAddingNewIssue: boolean;\r\n editingIssueDateLocal: string | null;\r\n}\r\n\r\ninterface ComponentProps {\r\n newsletter: NewsletterDetails;\r\n onNewsletterUpdated:() => any;\r\n onSaving: () => any;\r\n onError: (message: string) => any;\r\n onSuccess: (message: string) => any;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ownProps,\r\n {\r\n resetIssue: actions.resetIssue,\r\n resetIssues: actions.resetIssues,\r\n skipIssue: actions.skipIssue,\r\n unskipIssue: actions.unskipIssue\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(FutureIssues);","import * as React from 'react';\r\n\r\nimport './three-dots.sass';\r\n\r\ninterface ComponentProps {\r\n width?: number\r\n height?: number\r\n}\r\ninterface ComponentState { }\r\n\r\nexport default class ThreeDots extends React.Component {\r\n\r\n public shouldComponentUpdate() {\r\n return false;\r\n }\r\n\r\n public render() {\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n}","import * as React from 'react';\r\n\r\ninterface ComponentProps { onChange: () => void }\r\ninterface ComponentState { }\r\n\r\nexport default class WindowResizeListener extends React.PureComponent {\r\n private _resizeDebounceToken: number | null = null;\r\n private _resizeDebounceTimeout = 50;\r\n\r\n public componentDidMount() {\r\n window.addEventListener('resize', this.handleWindowResize);\r\n window.addEventListener('transitionend', this.handleTransitionEnd);\r\n }\r\n\r\n public componentWillUnmount() {\r\n window.removeEventListener('resize', this.handleWindowResize);\r\n window.removeEventListener('transitionend', this.handleTransitionEnd)\r\n }\r\n\r\n public render() {\r\n return (\r\n <>\r\n );\r\n }\r\n\r\n /**\r\n * On transition end of drawer opening or closing emit resize event\r\n * @param e\r\n */\r\n private handleTransitionEnd = (e: any) => {\r\n if (e.target.id === \"adminAppNav\") {\r\n this.handleWindowResize();\r\n }\r\n }\r\n\r\n private handleWindowResize = () => {\r\n if (this._resizeDebounceToken != null) {\r\n window.clearTimeout(this._resizeDebounceToken);\r\n }\r\n this._resizeDebounceToken = window.setTimeout(() => {\r\n this.props.onChange();\r\n }, this._resizeDebounceTimeout);\r\n }\r\n}\r\n","import _ from 'lodash';\r\nimport numeral from 'numeral';\r\nimport {select, scaleBand, selectAll, scaleLinear, scaleOrdinal, max, axisLeft, axisBottom, map, range, schemeCategory10} from 'd3';\r\nconst d3 = { select, scaleBand, selectAll, scaleLinear, scaleOrdinal, max, axisLeft, axisBottom, map, range, schemeCategory10 };\r\n\r\nexport interface GroupedBarChartProps {\r\n el: any;\r\n width?: number;\r\n height: number;\r\n data: GroupedBarChartDataPoint[];\r\n showOnHover: boolean;\r\n locale?: string;\r\n colors?: string[];\r\n}\r\n\r\nexport interface GroupedBarChartDataPoint {\r\n id: string;\r\n group: string;\r\n label: string;\r\n value: number;\r\n onClick?: (point: GroupedBarChartDataPoint) => any;\r\n}\r\n\r\nexport class GroupedBarChart {\r\n\r\n constructor(props: GroupedBarChartProps) {\r\n this.update(props);\r\n }\r\n\r\n public update(props: GroupedBarChartProps) {\r\n\r\n if (!props.el) {\r\n return;\r\n }\r\n d3.select(props.el).select('svg').remove();\r\n\r\n const X = _.map(props.data, d => d.group);\r\n const Y = _.map(props.data, d => d.value);\r\n const Z = _.map(props.data, d => d.label);\r\n\r\n const xDomain = _.uniq(X);\r\n const maxY = _.max(Y);\r\n const yDomain = [0, !!maxY ? maxY : 1];\r\n const zDomain = _.uniq(Z);\r\n\r\n const boundingRect = props.el.getBoundingClientRect();\r\n // set the dimensions and margins of the graph\r\n const margin = {top: 15, right: 10, bottom: 25, left: 40};\r\n const width = props.width || boundingRect.width;\r\n const height = props.height;\r\n const xPadding = 0.1; // amount of x-range to reserve to separate groups\r\n const zPadding = 0.05; // amount of x-range to reserve to separate bars\r\n\r\n const colors = !!props.colors ? props.colors : d3.schemeCategory10\r\n\r\n const xScale = d3.scaleBand().domain(xDomain).range([margin.left, width-margin.right]).padding(xPadding);\r\n const xzScale = d3.scaleBand().domain(zDomain).range([0, xScale.bandwidth()]).padding(zPadding);\r\n const yScale = d3.scaleLinear().domain(yDomain).range([height-margin.bottom, margin.top]);\r\n const zScale = d3.scaleOrdinal(colors).domain(zDomain);\r\n const xAxis = d3.axisBottom(xScale).tickSizeOuter(0);\r\n const yAxis = d3.axisLeft(yScale).ticks(height / 60).tickFormat(y=>numeral(y).format(\"0a\"));\r\n\r\n // d3.select('body').append('div')\r\n // .attr('class', 'bar-chart-tooltip').style('opacity', 0);\r\n\r\n const svg = d3.select(props.el)\r\n .append('svg')\r\n .attr('width', width)\r\n .attr('height', height)\r\n .attr(\"viewBox\", `0, 0, ${width}, ${height}`)\r\n .attr(\"style\", \"height: auto; height: intrinsic;\");\r\n \r\n svg.append('g')\r\n .attr('transform', `translate(${margin.left},0)`)\r\n .call(yAxis)\r\n .call(g=>g.select(\".domain\").remove())\r\n .call(g=>g.selectAll(\".tick line\").clone().attr(\"x2\", width - margin.left - margin.right).attr(\"stroke-opacity\", 0.1))\r\n .call(g => g.append(\"text\")\r\n .attr(\"x\", -margin.left)\r\n .attr(\"y\", 10)\r\n .attr(\"fill\", \"currentColor\"));\r\n\r\n // append the rectangles for the bar chart\r\n const bar = svg.selectAll('.bar')\r\n .data(props.data)\r\n .enter()\r\n .append('g');\r\n\r\n bar.append('rect')\r\n .attr('class', 'bar')\r\n .attr('x', d => (xScale(d.group)! + xzScale(d.label)!))\r\n .attr('width', xzScale.bandwidth())\r\n .attr('y', d => yScale(d.value))\r\n .attr('height', d => yScale(0) - yScale(d.value))\r\n .attr('fill', d => zScale(d.label));\r\n \r\n if(props.showOnHover)\r\n bar.append(\"title\").text(d=>`${numeral(d.value).format(\"0,000\")} ${d.label}`);\r\n\r\n // add the x Axis\r\n svg.append('g')\r\n .attr('transform', `translate(0,${height - margin.bottom})`)\r\n .call(xAxis);\r\n \r\n Object.assign(svg.node() as any, {scales : {color: zScale}});\r\n }\r\n \r\n public destroy() {\r\n // Any clean-up would go here\r\n // in this example there is nothing to do\r\n }\r\n}\r\n\r\n","import * as React from 'react';\r\n\r\ninterface PlaceholderWidgetProps {\r\n title?: string;\r\n height: number;\r\n}\r\n\r\nexport default class PlaceholderWidget extends React.PureComponent {\r\n public render() {\r\n return
    \r\n
    {this.props.title}
    \r\n { this.props.children }\r\n
    \r\n
    \r\n
    \r\n }\r\n}\r\n","import React from \"react\";\r\n\r\nconst ChartSwatchComponent: React.FunctionComponent = props => {\r\n return (\r\n
    \r\n {props.swatches.map((s,i)=>{\r\n return \r\n
    \r\n {s.label}\r\n
    ;\r\n })}\r\n
    \r\n );\r\n}\r\n\r\ninterface Swatch {\r\n label: string;\r\n color: string;\r\n}\r\n\r\ninterface ComponentProps {\r\n swatches: Swatch[];\r\n}\r\n\r\nexport default ChartSwatchComponent;","import * as React from 'react';\r\nimport ThreeDots from 'modules/common/components/three-dots';\r\nimport WindowResizeListener from 'modules/common/components/window-resize-listener';\r\nimport moment from 'moment';\r\nimport {injectIntl, IntlShape} from \"react-intl\";\r\nimport {connect, ConnectedProps} from \"react-redux\";\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport { GroupedBarChart, GroupedBarChartProps } from 'modules/insights/components/charts/groupedBarChart';\r\nimport PlaceholderWidget from 'modules/insights/components/placeholderWidget';\r\nimport { DailyEmailEventStats } from 'modules/newsletters';\r\nimport _ from 'lodash';\r\nimport ChartSwatchComponent from '../../../../insights/components/charts/chartSwatchComponent';\r\n\r\ninterface ComponentProps {\r\n loading?: boolean\r\n events?: DailyEmailEventStats[];\r\n intl: IntlShape;\r\n}\r\n\r\nconst sentSwatch = {color:\"#aa214e\", label:'Sent'};\r\nconst deliveredSwatch = {color:\"#3b78ab\", label:'Delivered'};\r\nconst uniqueOpensSwatch = {color:\"#e6911a\", label:'Unique opens'};\r\nconst clicksSwatch = {color:\"#366531\", label:'Clicks'};\r\n\r\nclass DailyEmailEventsWidget extends React.Component {\r\n\r\n private _chart: GroupedBarChart;\r\n private _chartElement: HTMLElement;\r\n\r\n public componentDidMount() {\r\n this._chart = new GroupedBarChart(this.getChartState());\r\n }\r\n\r\n public componentDidUpdate() {\r\n if (this._chart) {\r\n this._chart.update(this.getChartState());\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n if (this._chart) {\r\n this._chart.destroy();\r\n }\r\n }\r\n\r\n public render() {\r\n moment.locale(\"en\");\r\n\r\n if (!this.props.events || !this.props.events.length)\r\n return
    No data is currently available.
    ;\r\n\r\n return \r\n \r\n
    \r\n
    \r\n {\r\n this.props.loading ?\r\n \r\n \r\n :\r\n
    \r\n
    this._chartElement = e!}>
    \r\n this._chart.update(this.getChartState())} />\r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    ;\r\n }\r\n\r\n private getChartState = (): GroupedBarChartProps => {\r\n const sent = _.map(this.props.events, e => {return {id:`${e.Day}_0`, label:'Sent', group:moment(e.Day).format(\"YYYY-MM-DD\"), value:e.Processed + e.Dropped }});\r\n const delivered = _.map(this.props.events, e => {return {id:`${e.Day}_1`, label:'Delivered', group:moment(e.Day).format(\"YYYY-MM-DD\"), value:e.Delivered }});\r\n const opened = _.map(this.props.events, e => {return {id:`${e.Day}_2`, label:'Unique opens', group:moment(e.Day).format(\"YYYY-MM-DD\"), value:e.UniqueOpened }});\r\n const clicked = _.map(this.props.events, e => {return {id:`${e.Day}_4`, label:'Clicks', group:moment(e.Day).format(\"YYYY-MM-DD\"), value:e.UniqueClicked }});\r\n\r\n const width = _.max([100,100*sent.length]);\r\n\r\n return {\r\n el: this._chartElement,\r\n locale: this.props.locale,\r\n width: width,\r\n height: 300,\r\n data: _.sortBy(_.concat(sent, _.concat(delivered, _.concat(opened, clicked))), d=>d.id),\r\n labelBars: true,\r\n colors: [sentSwatch.color, deliveredSwatch.color, uniqueOpensSwatch.color, clicksSwatch.color] ,\r\n showOnHover: true,\r\n margin: {top:0, right:0, bottom:0, left:0}\r\n } as GroupedBarChartProps;\r\n }\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n locale: state.localization.locale\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\nexport default injectIntl(connector(DailyEmailEventsWidget));\r\n\r\n","import * as React from 'react';\r\nimport ThreeDots from 'modules/common/components/three-dots';\r\nimport WindowResizeListener from 'modules/common/components/window-resize-listener';\r\nimport moment from 'moment';\r\nimport {injectIntl, IntlShape} from \"react-intl\";\r\nimport {connect, ConnectedProps} from \"react-redux\";\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport { GroupedBarChart, GroupedBarChartProps } from 'modules/insights/components/charts/groupedBarChart';\r\nimport PlaceholderWidget from 'modules/insights/components/placeholderWidget';\r\nimport { WeeklyEmailEventStats } from 'modules/newsletters';\r\nimport _ from 'lodash';\r\nimport ChartSwatchComponent from '../../../../insights/components/charts/chartSwatchComponent';\r\n\r\ninterface ComponentProps {\r\n loading?: boolean\r\n events?: WeeklyEmailEventStats[];\r\n intl: IntlShape;\r\n}\r\n\r\nconst sentSwatch = {color:\"#aa214e\", label:'Sent'};\r\nconst deliveredSwatch = {color:\"#3b78ab\", label:'Delivered'};\r\nconst uniqueOpensSwatch = {color:\"#e6911a\", label:'Unique opens'};\r\nconst clicksSwatch = {color:\"#366531\", label:'Clicks'};\r\n\r\nclass WeeklyEmailEventsWidget extends React.Component {\r\n\r\n private _chart: GroupedBarChart;\r\n private _chartElement: HTMLElement;\r\n\r\n public componentDidMount() {\r\n this._chart = new GroupedBarChart(this.getChartState());\r\n }\r\n\r\n public componentDidUpdate() {\r\n if (this._chart) {\r\n this._chart.update(this.getChartState());\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n if (this._chart) {\r\n this._chart.destroy();\r\n }\r\n }\r\n\r\n public render() {\r\n moment.locale(\"en\");\r\n\r\n if (!this.props.events || !this.props.events.length)\r\n return
    No data is currently available.
    ;\r\n\r\n return \r\n \r\n
    \r\n
    \r\n {\r\n this.props.loading ?\r\n \r\n \r\n :\r\n
    \r\n
    this._chartElement = e!}>
    \r\n this._chart.update(this.getChartState())} />\r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    ;\r\n }\r\n\r\n private getChartState = (): GroupedBarChartProps => {\r\n const sent = _.map(this.props.events, e => {return {id:`${e.WeekStarting}_0`, label:'Sent', group:moment(e.WeekStarting).format(\"YYYY-MM-DD\"), value:e.Processed + e.Dropped }});\r\n const delivered = _.map(this.props.events, e => {return {id:`${e.WeekStarting}_1`, label:'Delivered', group:moment(e.WeekStarting).format(\"YYYY-MM-DD\"), value:e.Delivered }});\r\n const opened = _.map(this.props.events, e => {return {id:`${e.WeekStarting}_2`, label:'Unique opens', group:moment(e.WeekStarting).format(\"YYYY-MM-DD\"), value:e.UniqueOpened }});\r\n const clicked = _.map(this.props.events, e => {return {id:`${e.WeekStarting}_4`, label:'Clicks', group:moment(e.WeekStarting).format(\"YYYY-MM-DD\"), value:e.UniqueClicked }});\r\n\r\n const width = _.max([100,100*sent.length]);\r\n\r\n return {\r\n el: this._chartElement,\r\n locale: this.props.locale,\r\n width: width,\r\n height: 300,\r\n data: _.sortBy(_.concat(sent, _.concat(delivered, _.concat(opened, clicked))), d=>d.id),\r\n labelBars: true,\r\n colors: [sentSwatch.color, deliveredSwatch.color, uniqueOpensSwatch.color, clicksSwatch.color] ,\r\n showOnHover: true,\r\n margin: {top:0, right:0, bottom:0, left:0}\r\n } as GroupedBarChartProps;\r\n }\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n locale: state.localization.locale\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\nexport default injectIntl(connector(WeeklyEmailEventsWidget));\r\n\r\n","import React from \"react\";\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\n\r\nexport const InsightsInfoHover : React.FunctionComponent = props => {\r\n\r\n return (\r\n \r\n
    \r\n Copies Sent is the number of emails sent out to recipients.\r\n
    \r\n
    \r\n
    \r\n Delivered is the sum of newsletters received in the recipients' mailboxes.\r\n
    \r\n
    \r\n
    \r\n Opens is the total number of times the emails were opened. Unique Opens is the total number of recipients who have opened and viewed a newsletter.\r\n
    \r\n
    \r\n
    \r\n Clicks is the total number of times any links have been clicked within the emails. Unique Clicks is the total number of recipients who clicked links within the emails.\r\n
    \r\n
    \r\n
    \r\n Unsubscribes is the number of recipients who unsubscribed from the newsletter. Spam Reports is the number of recipients who reported an email as spam.\r\n
    \r\n
    \r\n
    \r\n Drops is the number of emails that were not allowed to be delivered by the internet service provider.\r\n
    \r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {}","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as actions from \"../../../actionCreator\";\r\n\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport { DailyEmailEventStats, EmailEventStats, getEmptyEmailEventStats, NewsletterDetails, WeeklyEmailEventStats } from \"../../../models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport { ButtonGroup } from \"@mui/material\";\r\n\r\nimport moment from \"moment\";\r\nimport numeral from 'numeral';\r\nimport _ from 'lodash';\r\n\r\nimport DailyEmailEventsWidget from './dailyEmailEventsWidget';\r\nimport WeeklyEmailEventsWidget from './weeklyEmailEventsWidget';\r\nimport { InsightsInfoHover } from \"./insightsInfoHover\";\r\n\r\nclass NewsletterInsightsTab extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n this.state = {isLoadingDailyStats: false, totalStatsTimeFrame: 'eightWeeks', graphMode: 'weekly'};\r\n }\r\n\r\n public componentDidMount(){\r\n this.props.getTotalNewsletterInsights(this.props.newsletter.id).then((stats) => {\r\n this.setState({totalStatsAllTime: stats || {}});\r\n });\r\n\r\n this.props.GetWeeklyNewsletterInsights(this.props.newsletter.id).then((weeklyStats) => {\r\n const totalStatsEightWeeks = getEmptyEmailEventStats();\r\n var eightWeeksAgo = moment().add(-9,'week');\r\n weeklyStats.filter(s=>moment(s.WeekStarting).isAfter(eightWeeksAgo)).forEach(stat=>{\r\n totalStatsEightWeeks.Bounced += stat.Bounced;\r\n totalStatsEightWeeks.Clicked += stat.Clicked;\r\n totalStatsEightWeeks.Deferred += stat.Deferred;\r\n totalStatsEightWeeks.Delivered += stat.Delivered;\r\n totalStatsEightWeeks.Dropped += stat.Dropped;\r\n totalStatsEightWeeks.Opened += stat.Opened;\r\n totalStatsEightWeeks.Processed += stat.Processed;\r\n totalStatsEightWeeks.SpamReported += stat.SpamReported;\r\n totalStatsEightWeeks.Unsubscribed += stat.Unsubscribed;\r\n totalStatsEightWeeks.UniqueBounced += stat.UniqueBounced;\r\n totalStatsEightWeeks.UniqueClicked += stat.UniqueClicked;\r\n totalStatsEightWeeks.UniqueDeferred += stat.UniqueDeferred;\r\n totalStatsEightWeeks.UniqueDelivered += stat.UniqueDelivered;\r\n totalStatsEightWeeks.UniqueDropped += stat.UniqueDropped;\r\n totalStatsEightWeeks.UniqueOpened += stat.UniqueOpened;\r\n totalStatsEightWeeks.UniqueProcessed += stat.UniqueProcessed;\r\n totalStatsEightWeeks.UniqueSpamReported += stat.UniqueSpamReported;\r\n totalStatsEightWeeks.UniqueUnsubscribed += stat.UniqueUnsubscribed;\r\n });\r\n this.setState({totalStatsEightWeeks: totalStatsEightWeeks});\r\n\r\n if(weeklyStats.length > 0)\r\n {\r\n const currentWeek = moment(_.min(_.map(weeklyStats, w=>w.WeekStarting))).add(1,'weeks');\r\n const finalWeek = moment(_.max(_.map(weeklyStats, w=>w.WeekStarting)));\r\n while(currentWeek.isBefore(finalWeek)){\r\n if(!_.some(weeklyStats,s=>moment(s.WeekStarting).isSame(currentWeek))){\r\n weeklyStats.push({WeekStarting:currentWeek.toISOString(), ...getEmptyEmailEventStats()});\r\n }\r\n currentWeek.add(1,'weeks');\r\n }\r\n }\r\n\r\n this.setState({weeklyStats: weeklyStats});\r\n });\r\n }\r\n\r\n private viewDailyStats() {\r\n this.setState({graphMode: 'daily'});\r\n\r\n if(!this.state.dailyStats && !this.state.isLoadingDailyStats)\r\n {\r\n this.setState({isLoadingDailyStats: true});\r\n\r\n this.props.GetDailyNewsletterInsights(this.props.newsletter.id)\r\n .then(dailyStats => {\r\n if(dailyStats.length > 0)\r\n {\r\n const currentDay = moment(_.min(_.map(dailyStats, w=>w.Day))).add(1,'days');;\r\n const finalDay = moment(_.max(_.map(dailyStats, w=>w.Day)));\r\n while(currentDay.isBefore(finalDay)){\r\n if(!_.some(dailyStats,s=>moment(s.Day).isSame(currentDay))){\r\n dailyStats.push({Day:currentDay.toISOString(), ...getEmptyEmailEventStats()});\r\n }\r\n currentDay.add(1,'days');\r\n }\r\n }\r\n this.setState({isLoadingDailyStats: false, dailyStats: dailyStats});\r\n });\r\n }\r\n }\r\n\r\n public render() {\r\n const { newsletter } = this.props;\r\n\r\n if (!newsletter)\r\n return ;\r\n\r\n const totalStats = this.state.totalStatsTimeFrame === 'all' ? this.state.totalStatsAllTime : this.state.totalStatsEightWeeks;\r\n const totalCopiesSent = !!totalStats ? (totalStats.Processed + totalStats.Dropped) : 0;\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n Overall Newsletter Insights\r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n {!totalStats && }\r\n {!!totalStats &&
    \r\n
    \r\n
    \r\n {numeral(totalCopiesSent).format('0,0')}\r\n
    \r\n \r\n Copies Sent\r\n \r\n
    \r\n
    \r\n
    \r\n {numeral(totalCopiesSent === 0 ? 0 : (totalStats.Delivered/totalCopiesSent)).format('0%')}\r\n
    \r\n \r\n Delivered\r\n \r\n \r\n {numeral(totalStats.Delivered).format('0,0')} of {numeral(totalCopiesSent).format('0,0')} copies\r\n \r\n
    \r\n
    \r\n
    \r\n {numeral(totalStats.Delivered === 0 ? 0 : (totalStats.UniqueOpened/totalStats.Delivered)).format('0%')}\r\n
    \r\n \r\n Unique Opens\r\n \r\n \r\n {numeral(totalStats.UniqueOpened).format('0,0')} of {numeral(totalStats.Delivered).format('0,0')} delivered copies\r\n \r\n
    \r\n
    \r\n
    \r\n {numeral(totalStats.Delivered === 0 ? 0 : (totalStats.UniqueClicked/totalStats.Delivered)).format('0%')}\r\n
    \r\n \r\n Unique Clicks\r\n \r\n \r\n {numeral(totalStats.UniqueClicked).format('0,0')} of {numeral(totalStats.Delivered).format('0,0')} delivered copies\r\n \r\n
    \r\n
    }\r\n {!!totalStats &&\r\n
    \r\n
    \r\n
    \r\n {numeral(totalStats.Opened).format('0,0')}\r\n
    \r\n \r\n Total Opens\r\n \r\n
    \r\n
    \r\n
    \r\n {numeral(totalStats.UniqueClicked).format('0,0')}\r\n
    \r\n \r\n Unique Clicks\r\n \r\n
    \r\n
    \r\n
    \r\n {numeral(totalStats.UniqueBounced).format('0,0')}\r\n
    \r\n \r\n Invalid Emails\r\n \r\n
    \r\n
    \r\n
    \r\n {numeral(totalStats.UniqueUnsubscribed).format('0,0')}\r\n
    \r\n \r\n Unsubscribes\r\n \r\n
    \r\n
    \r\n
    \r\n {numeral(totalStats.UniqueSpamReported).format('0,0')}\r\n
    \r\n \r\n Spam Reports\r\n \r\n
    \r\n
    \r\n
    \r\n {numeral(totalStats.UniqueDropped).format('0,0')}\r\n
    \r\n \r\n Drops\r\n \r\n
    \r\n
    \r\n }\r\n\r\n \r\n \r\n \r\n \r\n\r\n {this.state.graphMode === 'daily' && }\r\n {this.state.graphMode === 'weekly' && }\r\n\r\n
    \r\n );\r\n }\r\n}\r\n\r\ninterface ComponentState {\r\n totalStatsTimeFrame: 'all' | 'eightWeeks';\r\n graphMode: 'daily' | 'weekly';\r\n\r\n totalStatsAllTime?: EmailEventStats;\r\n totalStatsEightWeeks?: EmailEventStats;\r\n weeklyStats?: WeeklyEmailEventStats[];\r\n\r\n isLoadingDailyStats: boolean;\r\n dailyStats?: DailyEmailEventStats[];\r\n}\r\n\r\ninterface ComponentProps {\r\n newsletter: NewsletterDetails;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => (ownProps),\r\n {\r\n getTotalNewsletterInsights: actions.getTotalNewsletterInsights,\r\n GetDailyNewsletterInsights: actions.GetDailyNewsletterInsights,\r\n GetWeeklyNewsletterInsights: actions.GetWeeklyNewsletterInsights\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(NewsletterInsightsTab);","import {pie, arc, select} from 'd3';\r\nconst d3 = {pie, arc, select};\r\n\r\nexport interface IPieChartProps {\r\n el: any;\r\n data: IPieChartDataPoint[];\r\n diameter: number;\r\n innerDiameter: number;\r\n locale?: string;\r\n}\r\n\r\nexport interface IPieChartDataPoint {\r\n label: string;\r\n value: number;\r\n color: string;\r\n}\r\n\r\nexport class PieChart {\r\n\r\n constructor(props: IPieChartProps) {\r\n this.update(props);\r\n }\r\n\r\n public update(props: IPieChartProps) {\r\n\r\n if (!props.el) {\r\n return;\r\n }\r\n\r\n props.el.getBoundingClientRect();\r\n\r\n const total = props.data.reduce((val, d) => val + d.value, 0);\r\n\r\n const padAngle = props.data.filter(d=>d.value > 0).length <= 1 ? 0 : 0.03;\r\n\r\n const pie = d3.pie()\r\n .value((d) => (d.value / total) as number)\r\n .sort(null)\r\n .padAngle(padAngle);\r\n\r\n const w = props.diameter, h = props.diameter;\r\n\r\n const outerRadius = w / 2;\r\n const innerRadius = props.innerDiameter / 2;\r\n\r\n const arc = d3.arc()\r\n .outerRadius(outerRadius)\r\n .innerRadius(innerRadius);\r\n\r\n d3.select(props.el)\r\n .select('svg').remove();\r\n\r\n const svg = d3.select(props.el)\r\n .append('svg')\r\n .attr('width', w)\r\n .attr('height', h)\r\n .attr('class', 'shadow')\r\n .append('g')\r\n .attr('transform', 'translate(' + w / 2 + ',' + h / 2 + ')');\r\n\r\n svg.selectAll('path')\r\n .data(pie(props.data))\r\n .enter()\r\n .append('path')\r\n .attr('d', arc as any)\r\n .attr('fill', (d: any, i) => d.data.color);\r\n }\r\n\r\n public destroy() {\r\n // Any clean-up would go here\r\n // in this example there is nothing to do\r\n }\r\n}\r\n\r\n","import React, { useRef, useState } from \"react\";\r\n\r\nimport Popover from \"@mui/material/Popover\";\r\n\r\n\r\nimport \"./textHover.sass\";\r\n\r\n\r\nconst TextHover: React.FC = ({ text, children }) => {\r\n const [showPopover, setShowPopover] = useState(false);\r\n const popoverRef = useRef(null);\r\n\r\n return (\r\n <>\r\n setShowPopover(true)}\r\n onMouseLeave={() => setShowPopover(false)}\r\n className=\"help-text\"\r\n >\r\n {text}\r\n \r\n setShowPopover(true),\r\n onMouseLeave: () => setShowPopover(false),\r\n style: {\r\n maxWidth: 250\r\n }\r\n }}\r\n style={{ pointerEvents: \"none\" }}\r\n onClose={() => setShowPopover(false)}\r\n classes={{\r\n paper: \"help-text-description\"\r\n }}\r\n >\r\n {children}\r\n \r\n \r\n )\r\n}\r\n\r\ninterface ComponentProps {\r\n text: string;\r\n}\r\n\r\nexport default TextHover;","/* eslint-disable react/style-prop-object */\r\nimport * as React from 'react';\r\nimport { IPieChartProps, PieChart } from 'modules/insights/components/charts/pieChart';\r\nimport WindowResizeListener from 'modules/common/components/window-resize-listener';\r\nimport {FormattedNumber, injectIntl, IntlShape} from \"react-intl\";\r\nimport {connect, ConnectedProps} from \"react-redux\";\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport { NewsletterPastIssueDigestModel } from 'modules/newsletters';\r\n\r\nimport TextHover from \"modules/common/components/hovers/textHover\";\r\n\r\nimport _ from 'lodash';\r\n\r\nclass IssuePublishingStatsWidget extends React.PureComponent {\r\n\r\n private _chart: PieChart;\r\n private _chartElement: HTMLElement;\r\n\r\n private _colors = ['#4caf50', '#9e9e9e', '#03a9f4', '#9c27b0'];\r\n\r\n public componentDidMount() {\r\n this._chart = new PieChart(this.getChartState());\r\n }\r\n\r\n public componentDidUpdate() {\r\n if (this._chart) {\r\n this._chart.update(this.getChartState());\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n if (this._chart) {\r\n this._chart.destroy();\r\n }\r\n }\r\n\r\n public render() {\r\n const chartState = this.getChartState();\r\n const total = _.sum(_.map(chartState.data,d=>d.value));\r\n\r\n return
    \r\n
    \r\n Publishing Stats\r\n
    \r\n {chartState.data.length === 0\r\n ?
    Issue has not yet been published.
    \r\n :
    \r\n
    \r\n
    \r\n
    this._chartElement = e! }>
    \r\n
    \r\n
    \r\n
      \r\n {chartState.data.map((data, index) => {\r\n return
    • \r\n \r\n {data.label === \"Excluded\"\r\n ? Excluded includes dynamic contacts or addressees who are fully up-to-date and have already viewed recent and new content(s) e.g. posts and events in your intranet AND/OR are addressees who have unsubscribed from this newsletter in the past.\r\n : data.label\r\n }: ()\r\n
    • \r\n })}\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n }\r\n\r\n private getChartState = (): IPieChartProps => {\r\n const issue = this.props.issue;\r\n const receipt = !!issue && issue.sentReceipt;\r\n const data = !!receipt ? [{\r\n label: 'Copies sent',\r\n value: issue.stats.UniqueProcessed,\r\n color: this._colors[0]\r\n },{\r\n label: 'Excluded',\r\n value: receipt.countOfSkippedWithNoContent,\r\n color: this._colors[1]\r\n },{\r\n label: 'Unsubscribers',\r\n value: receipt.countOfUnsubscribers,\r\n color: this._colors[2]\r\n },{\r\n label: 'Missing addresses',\r\n value: receipt.countOfInvalidEmailAddresses,\r\n color: this._colors[3]\r\n }] : [];\r\n\r\n return {\r\n el: this._chartElement,\r\n diameter: 150,\r\n innerDiameter: 100,\r\n data: data\r\n } as IPieChartProps;\r\n }\r\n\r\n private handleWindowResize = () => {\r\n this._chart.update(this.getChartState());\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n issue: NewsletterPastIssueDigestModel;\r\n intl: IntlShape;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps)=>({\r\n ...ownProps,\r\n locale: state.localization.locale\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n \r\nexport default injectIntl(connector(IssuePublishingStatsWidget));\r\n","import {max, select, scaleLinear, event} from 'd3';\r\nconst d3 = {max, select, scaleLinear, event};\r\n\r\nexport interface HBarChartProps {\r\n el: any;\r\n barHeight: number;\r\n data: HBarChartDataPoint[];\r\n labelWidth: number;\r\n color?: (d:HBarChartDataPoint) => string;\r\n locale?: string;\r\n}\r\n\r\nexport interface HBarChartDataPoint {\r\n id: string;\r\n label: string;\r\n value: number;\r\n valueLabel?: string;\r\n onClick?: (point: HBarChartDataPoint) => any;\r\n}\r\n\r\nexport class HorizontalBarChart {\r\n\r\n constructor(props: HBarChartProps) {\r\n this.update(props);\r\n }\r\n\r\n public update(props: HBarChartProps) {\r\n if (!props.el) return;\r\n\r\n let boundingRect = props.el.getBoundingClientRect();\r\n let x = d3.scaleLinear()\r\n .domain([0, d3.max(props.data.map(d => d.value)!)!])\r\n .range([0, boundingRect.width - props.labelWidth - 40]);\r\n\r\n d3.select(props.el)\r\n .select('svg').remove();\r\n\r\n const containerHeight = props.data.length * props.barHeight;\r\n const containerWidth = boundingRect.width;\r\n let chart = d3.select(props.el)\r\n .append('svg')\r\n .attr('height', containerHeight)\r\n .attr('width', containerWidth)\r\n .attr('class', 'basic-chart')\r\n\r\n let bar = chart\r\n .selectAll('*')\r\n .remove()\r\n .data(props.data)\r\n .enter()\r\n .append('g')\r\n .attr('class', (d, i) => {\r\n let classNames = '';\r\n if (d.onClick) {\r\n classNames += 'has-action';\r\n }\r\n\r\n const barWidth = x(d.value);\r\n\r\n if (barWidth === 0) {\r\n classNames += ' is-zero-width';\r\n }\r\n\r\n return classNames;\r\n })\r\n .attr('transform', function (d, i) {\r\n return 'translate(0,' + i * props.barHeight + ')';\r\n })\r\n .on('click', (d) => {\r\n if (d.onClick) {\r\n d.onClick(d);\r\n }\r\n d3.event?.stopPropagation();\r\n });\r\n\r\n bar.append('text')\r\n .attr('class', 'label')\r\n .attr('x', 0)\r\n .attr('y', props.barHeight / 2)\r\n .attr('dy', '.35em')\r\n .text(function (d) {\r\n return d.label;\r\n })\r\n .each(function() {\r\n let self = d3.select(this),\r\n padding = 5,\r\n textLength = self.node()!.getComputedTextLength(),\r\n text = self.text();\r\n while (textLength > (props.labelWidth - 2 * padding) && text.length > 0) {\r\n text = text.slice(0, -1);\r\n self.text(text + '...');\r\n textLength = self.node()!.getComputedTextLength();\r\n }\r\n })\r\n\r\n let rect = bar.append('rect')\r\n .attr('class', 'bar')\r\n .attr('width', (d) => x(d.value))\r\n .attr('height', props.barHeight - 1)\r\n .attr('transform', 'translate(' + props.labelWidth + ', 0)');\r\n\r\n if(!!props.color)\r\n rect.attr('fill',props.color);\r\n\r\n bar.append('text')\r\n .attr('class', 'value')\r\n .attr('x', (d) => {\r\n return x(d.value) + props.labelWidth + 5;\r\n })\r\n .attr('y', props.barHeight / 2)\r\n .attr('dy', '.35em')\r\n .text(function (d) {\r\n return d.valueLabel ? ' ' + d.valueLabel : d.value;\r\n });\r\n }\r\n\r\n public destroy() {\r\n // Any clean-up would go here\r\n // in this example there is nothing to do\r\n }\r\n}\r\n\r\n","import * as React from 'react';\r\nimport { HBarChartProps, HorizontalBarChart } from 'modules/insights/components/charts/horizontalBarChart';\r\nimport WindowResizeListener from 'modules/common/components/window-resize-listener';\r\nimport {injectIntl, IntlShape} from \"react-intl\";\r\nimport {connect, ConnectedProps} from \"react-redux\";\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport { NewsletterPastIssueDigestModel } from 'modules/newsletters';\r\n\r\ninterface ComponentProps {\r\n issue: NewsletterPastIssueDigestModel;\r\n intl: IntlShape\r\n}\r\n\r\nclass IssueEmailEventsWidget extends React.PureComponent {\r\n\r\n private _chart: HorizontalBarChart;\r\n private _chartElement: HTMLElement;\r\n\r\n private _colors = ['#366531', '#70B603', '#E6911A', '#F0BF79', '#3B78AB'];\r\n\r\n public componentDidMount() {\r\n this._chart = new HorizontalBarChart(this.getChartState());\r\n }\r\n\r\n public componentDidUpdate() {\r\n if (this._chart) {\r\n this._chart.update(this.getChartState());\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n if (this._chart) {\r\n this._chart.destroy();\r\n }\r\n }\r\n\r\n public render() {\r\n const chartState = this.getChartState();\r\n\r\n return
    \r\n
    \r\n Email Activity\r\n
    \r\n {chartState.data.length === 0\r\n ?
    Issue has not yet been published.
    \r\n :
    \r\n
    this._chartElement = e! } className=\"issue-email-events-chart-widget\">
    \r\n this._chart.update(this.getChartState())} />\r\n
    \r\n }\r\n
    \r\n }\r\n\r\n private getChartState = (): HBarChartProps => {\r\n const { sentReceipt, stats } = this.props.issue || {};\r\n\r\n const data = !!stats && !!sentReceipt ? [{\r\n id: '0',\r\n label: 'Copies sent',\r\n value: stats.UniqueProcessed\r\n },{\r\n id: '1',\r\n label: 'Delivered',\r\n value: stats.UniqueDelivered\r\n },{\r\n id: '2',\r\n label: 'Opens',\r\n value: stats.Opened\r\n },{\r\n id: '3',\r\n label: 'Unique opens',\r\n value: stats.UniqueOpened\r\n },{\r\n id: '4',\r\n label: 'Unique Clicks',\r\n value: stats.UniqueClicked\r\n }] : [];\r\n\r\n return {\r\n el: this._chartElement,\r\n locale: this.props.locale,\r\n height: 'auto',\r\n barHeight: 20,\r\n data: data,\r\n labelWidth: 125,\r\n color: d=> this._colors[parseInt(d.id)]\r\n } as HBarChartProps;\r\n }\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n locale: state.localization.locale,\r\n tagGroups: state.settings.tenantSettings.tagGroups\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\nexport default injectIntl(connector(IssueEmailEventsWidget))\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as actions from \"../../../actionCreator\";\r\n\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport { NewsletterDetails, NewsletterPastIssueDigestModel } from \"../../../models\";\r\n\r\nimport moment from \"moment\";\r\nimport numeral from \"numeral\";\r\nimport { InsightsInfoHover } from \"./insightsInfoHover\";\r\n\r\nimport IssuePublishingStatsWidget from \"./issuePublishingStatsWidget\";\r\nimport IssueEmailEventsWidget from \"./issueEmailEventsWidget\";\r\nimport useIsMounted from \"modules/common/hooks/useIsMounted\";\r\nimport usePrevious from \"modules/common/hooks/usePrevious\";\r\n\r\ninterface AnalyticsNumberProps {\r\n hoverLabel: string;\r\n analytic: string;\r\n title: string;\r\n subtitle: string;\r\n}\r\n\r\nconst AnalyticsNumber: React.FunctionComponent = ({ title, subtitle, hoverLabel, analytic }) => (\r\n
    \r\n
    {analytic}
    \r\n {title}\r\n {subtitle}\r\n
    {hoverLabel}
    \r\n
    \r\n);\r\n\r\nconst IssueInsightsTab: React.FunctionComponent = ({\r\n newsletter,\r\n onIssueLoaded,\r\n goBackToDashboard,\r\n getPastIssue,\r\n issueDate,\r\n}) => {\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [issue, setIssue] = useState();\r\n const isMounted = useIsMounted();\r\n const prevProps = usePrevious({ newsletterId: newsletter.id, issueDate });\r\n\r\n /**\r\n * Effect of mount\r\n * - load issue from propped newsletter\r\n */\r\n useEffect(() => {\r\n // async op to get issue by propped newsletter\r\n const getPastIssueAsync = async () => {\r\n const newIssue = await getPastIssue(newsletter.id, issueDate);\r\n if (newIssue && isMounted()) {\r\n setIssue(newIssue);\r\n onIssueLoaded(newIssue.id!);\r\n setIsLoading(false);\r\n } else if (!newIssue) {\r\n goBackToDashboard();\r\n }\r\n };\r\n\r\n // check if necessary to make api call\r\n if (prevProps?.newsletterId !== newsletter.id || prevProps.issueDate !== issueDate) getPastIssueAsync();\r\n }, [getPastIssue, goBackToDashboard, isMounted, issueDate, newsletter.id, onIssueLoaded, prevProps]);\r\n\r\n // format a number for display\r\n const formatNumeralLabel = (value: number) => numeral(value).format(\"0,0\");\r\n\r\n /**\r\n * helper to get props for AnalyticsNumber component for a specific stat\r\n */\r\n const getAnalyticNumberProps = (key: keyof IssueInsightsTabAnalytics, stats: IssueInsightsTabAnalytics): AnalyticsNumberProps => {\r\n const {\r\n unsubscribes = 0,\r\n dropped = 0,\r\n bounced = 0,\r\n spamReported = 0,\r\n invalidAddresses = 0,\r\n copiesSent = 0,\r\n copiesPublished = 0,\r\n } = stats || {};\r\n\r\n const copiesSentLabel = `${formatNumeralLabel(copiesSent)} sent copies`;\r\n\r\n let result: AnalyticsNumberProps;\r\n switch (key) {\r\n case \"invalidAddresses\":\r\n result = {\r\n title: \"Invalid Addresses\",\r\n subtitle: `${numeral(invalidAddresses).format(\"0,0\")} of ${formatNumeralLabel(copiesPublished)} published copies`,\r\n analytic: `${numeral(copiesPublished === 0 ? 0 : invalidAddresses / copiesPublished).format(\"0%\")}`,\r\n hoverLabel:\r\n \"Number of addressees who had malformed email addresses or whose mail provider reported the address as invalid\",\r\n };\r\n break;\r\n case \"bounced\":\r\n result = {\r\n title: \"Bounced Emails\",\r\n subtitle: `${numeral(bounced).format(\"0,0\")} of ${copiesSentLabel}`,\r\n analytic: `${numeral(copiesSent === 0 ? 0 : bounced / copiesSent).format(\"0%\")}`,\r\n hoverLabel:\r\n \"Number of emails that were denied by the receiving server and have been suppressed moving forward\",\r\n };\r\n break;\r\n case \"dropped\":\r\n result = {\r\n title: \"Drops\",\r\n subtitle: `${numeral(dropped).format(\"0,0\")} of ${copiesSentLabel}`,\r\n analytic: `${numeral(copiesSent === 0 ? 0 : dropped / copiesSent).format(\"0%\")}`,\r\n hoverLabel: \"Number of emails that were not allowed to be delivered by the internet service provider\",\r\n };\r\n break;\r\n case \"unsubscribes\":\r\n result = {\r\n title: \"New Unsubscribes\",\r\n subtitle: `${numeral(unsubscribes).format(\"0,0\")} from ${copiesSentLabel}`,\r\n analytic: `${numeral(copiesSent === 0 ? 0 : unsubscribes / copiesSent).format(\"0%\")}`,\r\n hoverLabel: \"Number of recipients who unsubscribed from an email\",\r\n };\r\n break;\r\n case \"spamReported\":\r\n result = {\r\n title: \"Spam Reports\",\r\n subtitle: `${numeral(spamReported).format(\"0,0\")} of ${copiesSentLabel}`,\r\n analytic: `${numeral(copiesSent === 0 ? 0 : spamReported / copiesSent).format(\"0%\")}`,\r\n hoverLabel: \"Number of recipients who reported the email as spam\",\r\n };\r\n break;\r\n default:\r\n throw new Error(\"Analytic not supported\");\r\n }\r\n\r\n return result;\r\n };\r\n\r\n /**\r\n * helper to get stats to display\r\n */\r\n const getStats = (): IssueInsightsTabAnalytics | undefined => {\r\n if (!issue) return;\r\n\r\n // destructure\r\n const { stats } = issue;\r\n const { Dropped, Processed, UniqueUnsubscribed, SpamReported, UniqueBounced } = stats;\r\n\r\n // calculate\r\n const copiesSent = !!sentReceipt ? sentReceipt.countOfCopiesSent : !!stats ? Processed : 0;\r\n const invalidAddresses = (!stats ? 0 : Dropped) + (!sentReceipt ? 0 : sentReceipt.countOfInvalidEmailAddresses);\r\n const copiesPublished = !!sentReceipt\r\n ? sentReceipt.countOfCopiesSent + sentReceipt.countOfInvalidEmailAddresses\r\n : !!stats\r\n ? copiesSent\r\n : 0;\r\n\r\n return {\r\n copiesPublished,\r\n bounced: UniqueBounced,\r\n dropped: Dropped,\r\n copiesSent,\r\n spamReported: SpamReported,\r\n unsubscribes: UniqueUnsubscribed,\r\n invalidAddresses,\r\n };\r\n };\r\n\r\n if (isLoading) return ;\r\n\r\n if (!newsletter || !issue) return Issue not found;\r\n\r\n const { stats, sentReceipt, status } = issue;\r\n if (status === \"Skipped\")\r\n return This issue has been skipped. It has not been published. There are no insights to report.;\r\n\r\n const displayStats = getStats() || ({} as IssueInsightsTabAnalytics);\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n {moment(issue.issueProcessedOnDateTime).format(\"dddd, MMM D, YYYY h:mmA\")}\r\n \r\n
    \r\n
    \r\n \r\n \r\n {!!stats && (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n )}\r\n
    \r\n );\r\n};\r\n\r\ninterface ComponentProps {\r\n newsletter: NewsletterDetails;\r\n issueDate: string;\r\n onIssueLoaded: (issueId: string) => any;\r\n goBackToDashboard: () => any;\r\n}\r\n\r\ninterface IssueInsightsTabAnalytics {\r\n copiesPublished: number;\r\n bounced: number;\r\n dropped: number;\r\n copiesSent: number;\r\n spamReported: number;\r\n unsubscribes: number;\r\n invalidAddresses: number;\r\n}\r\n\r\nconst connector = connect((state: GlobalApplicationState, ownProps: ComponentProps) => ownProps, {\r\n getPastIssue: actions.getPastIssue,\r\n});\r\n\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(IssueInsightsTab);\r\n","import React from \"react\";\r\n\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport { NewsletterPastIssuesPage } from \"../../models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableContainer from \"@mui/material/TableContainer\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TablePagination from \"@mui/material/TablePagination\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\n\r\nimport moment from \"moment\";\r\nimport numeral from \"numeral\";\r\n\r\n\r\nconst PastIssues: React.FunctionComponent = props => {\r\n const { pastIssues, isLoading, onGetPastIssues } = props;\r\n\r\n return (\r\n
    \r\n
    \r\n
    Past Issues
    \r\n
    \r\n {(isLoading || !pastIssues)\r\n ? \r\n : pastIssues.totalItems === 0\r\n ?
    No past issues were found.
    \r\n : (\r\n
    \r\n \r\n \r\n \r\n \r\n Issue\r\n Recipients\r\n Failed attempts\r\n Unique opens\r\n Unique clicks\r\n \r\n \r\n Recipients are unique individuals who received the issue. Failed attempts are issues that were not successfully delivered.\r\n Unique opens count the recipients who opened the issue and Unique clicks count individuals who interacted with the email.\r\n \r\n \r\n \r\n \r\n \r\n {pastIssues?.results?.map((pastIssue, index) => {\r\n if (pastIssue.status === 'Skipped')\r\n return (\r\n \r\n {moment(pastIssue.issueDateLocal).format(\"MMM D, YYYY\")}\r\n Skipped\r\n \r\n \r\n );\r\n\r\n return (\r\n \r\n {moment(pastIssue.issueDateLocal,\"YYYY-MM-DD\").format(\"MMM D, YYYY\")}\r\n {numeral(pastIssue.stats.Delivered).format('0,0')}\r\n {numeral(pastIssue.stats.Bounced + pastIssue.stats.Dropped).format('0,0')}\r\n {numeral(pastIssue.stats.UniqueOpened).format('0,0')}\r\n {numeral(pastIssue.stats.UniqueClicked).format('0,0')}\r\n \r\n {\r\n props.onViewInsightsClicked(pastIssue.issueDateLocal);\r\n }}\r\n >\r\n View Insights\r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n
    \r\n
    \r\n {pastIssues.currentPage > 0 && pastIssues.totalPages > 1 &&\r\n {\r\n onGetPastIssues(pageNumber + 1);\r\n }}\r\n />\r\n }\r\n
    \r\n )\r\n }\r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n pastIssues?: NewsletterPastIssuesPage;\r\n isLoading: boolean;\r\n onGetPastIssues: (pageNumber: number) => any;\r\n onViewInsightsClicked: (issueDateLocal: string) => any;\r\n}\r\n\r\nexport default PastIssues;\r\n","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport * as actions from \"../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Breadcrumb from \"pages/common/breadcrumb\";\r\nimport Columns from \"pages/common/columns\";\r\nimport MainContent from \"pages/common/mainContent\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport { NewsletterDetails, NewsletterPastIssuesPage } from \"../models\";\r\n\r\nimport DashboardActions from \"./components/dashboardActions\";\r\nimport {Details} from \"./components/details\";\r\nimport FutureIssues from \"./components/futureIssues\";\r\nimport NewsletterInsightsTab from \"./components/insights/newsletterInsightsTab\";\r\nimport IssueInsightsTab from \"./components/insights/issueInsightsTab\";\r\nimport PastIssues from \"./components/pastIssues\";\r\nimport SendTestEmail from \"../common/dialogs/sendTestEmailDialog\";\r\n\r\nimport Divider from \"@mui/material/Divider\";\r\n\r\nimport moment from \"moment\";\r\n\r\nimport \"../styles/newsletterDashboard.sass\";\r\nimport EmailActivityLog from \"../common/dialogs/emailActivityLog\"\r\nimport _ from \"lodash\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport Tabs from \"pages/common/tabs\";\r\nimport SnackbarWrapper from \"modules/common/components/snackbars/snackbarWrapper\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\n\r\ntype tabs = 'details' | 'issue' | 'insights';\r\nclass NewsletterDashboardPage extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n isLoadingNewsletter: true,\r\n isLoadingPastIssues: true,\r\n selectedTab: 0\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n\r\n const newsletterId = this.props.match.params.newsletterId;\r\n if (!!newsletterId) {\r\n this.onGetNewsletterDetails();\r\n this.getPastIssues(1);\r\n }\r\n }\r\n\r\n private _componentUnmounted = false;\r\n public componentWillUnmount(){\r\n this._componentUnmounted = true;\r\n }\r\n\r\n public render() {\r\n const { details } = this.state;\r\n\r\n var selectedTab: tabs = 'details';\r\n if(!!this.props.match.params.tab)\r\n {\r\n if(this.props.match.params.tab === 'insights')\r\n selectedTab = 'insights';\r\n else\r\n selectedTab = 'issue';\r\n }\r\n\r\n const backToManageNewsletters = { title: \"Back to Manage Newsletters\", link: \"~/admin/newsletters\" };\r\n const backToNewsletterDashboard = { title: \"Back to Newsletter Issues\", link: `~/admin/newsletters/${this.props.match.params.newsletterId}/dashboard` };\r\n\r\n const breadcrumbItems = [\r\n { title: \"Newsletters\", link: \"~/admin/newsletters\" },\r\n { title: !!details ? details.title : \"\" }\r\n ];\r\n\r\n if(selectedTab !== 'details'){\r\n breadcrumbItems[1].link = `~/admin/newsletters/${this.props.match.params.newsletterId}/dashboard`;\r\n\r\n if(selectedTab === 'insights')\r\n breadcrumbItems.push({title: \"Overall Insights\"});\r\n else\r\n breadcrumbItems.push({title: \"Issue Insights\"});\r\n }\r\n\r\n var tabs=[\r\n { label: \"Future & Past Issues\", value: 0, id: \"issues-newsletters-tab\" },\r\n ];\r\n\r\n if(!!this.state.pastIssues && !!this.state.pastIssues.totalItems)\r\n tabs = tabs.concat({ label: \"Newsletter Insights\", value: 1, id: \"insights-newsletters-tab\" })\r\n\r\n if(!!this.state.details && !!this.state.details.lastSentIssueDateLocal)\r\n tabs = tabs.concat({ label: \"Recent Issue's Insights\", value: 2, id: \"recent-newsletters-tab\" })\r\n\r\n return (\r\n \r\n this.setState({showEmailActivityLog:true})}\r\n />\r\n }\r\n />\r\n this.setState({ successMessage: null })} severity=\"success\" message={this.state.successMessage} />\r\n this.setState({ errorMessage: null })} severity=\"error\" message={this.state.errorMessage} />\r\n \r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n }\r\n rightComponent={\r\n \r\n \r\n
    \r\n {selectedTab === 'details' && this.getDetails()}\r\n {selectedTab === 'insights' && this.getOverallInsights()}\r\n {selectedTab === 'issue' && this.getIssueInsights()}\r\n {!!details && !!this.state.sendTestEmailForIssue &&\r\n i.issueDateLocal)}\r\n newsletterId={this.props.match.params.newsletterId}\r\n newsletterTitle={details!.title}\r\n onError={(modelErrors) => {this.setState({sendTestEmailForIssue: null, errorMessage: _.first(_.first(_.values(modelErrors)))});}}\r\n onClose={()=>this.setState({ sendTestEmailForIssue: null })}\r\n onSuccess={(message) => this.setState({successMessage:message})}\r\n />\r\n }\r\n
    \r\n {!!this.state.showEmailActivityLog && !!details && this.setState({showEmailActivityLog:false})} />}\r\n \r\n
    \r\n }\r\n />\r\n \r\n );\r\n }\r\n\r\n private getDashboardMenu = (selectedTab: tabs) => {\r\n const newsletter = this.state.details;\r\n if(!newsletter) return ;\r\n\r\n return (\r\n \r\n
    \r\n
    Dashboard Contents
    \r\n
    \r\n
    this.showIssuesTab()} className={`menu-item ${selectedTab === 'details' ? \"selected\" : \"\"}`}>\r\n
    \r\n
    Future & Past Issues
    \r\n
    Track past issues and manage future issues
    \r\n
    \r\n
    \r\n {!!this.state.pastIssues && !!this.state.pastIssues.totalItems &&\r\n \r\n
    this.showOverallInsightsTab()} className={`menu-item ${selectedTab === 'insights' ? \"selected\" : \"\"}`}>\r\n
    \r\n
    Overall Newsletter Insights
    \r\n
    {this.state.pastIssues.totalItems} issue(s)
    \r\n
    \r\n
    \r\n {!!newsletter && !!newsletter.lastSentIssueDateLocal &&\r\n
    this.showIssueInsightsTab(newsletter.lastSentIssueDateLocal!)} className={`menu-item ${selectedTab === 'issue' ? \"selected\" : \"\"}`}>\r\n
    \r\n
    Insights for Recent Issue
    \r\n
    Last issue sent on {moment(newsletter.lastIssueSentOn!).format(\"MMM D, YYYY, h:mmA\")}
    \r\n
    \r\n
    \r\n }\r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private getDetails = () => {\r\n if (!this.state.details)\r\n return ;\r\n\r\n return (\r\n
    \r\n this.onGetNewsletterDetails()}\r\n onSaving={()=>this.setState({isSaving: true})}\r\n onError={(message) => this.setState({isSaving: false, errorMessage:message})}\r\n onSuccess={(message) => this.setState({isSaving: false, successMessage:message})}\r\n />\r\n \r\n this.viewInsightsClicked(issueDateLocal)} />\r\n
    \r\n );\r\n }\r\n\r\n private getOverallInsights = () => {\r\n const newsletter = this.state.details;\r\n if(!newsletter)\r\n return ;\r\n\r\n return (\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n\r\n private getIssueInsights = () => {\r\n const newsletter = this.state.details;\r\n if(!newsletter)\r\n return ;\r\n\r\n return (\r\n
    \r\n this.setState({currentIssueId: issueId})}\r\n goBackToDashboard={()=>this.showIssuesTab()}\r\n />\r\n
    \r\n );\r\n }\r\n\r\n private getPastIssues = (pageNumber: number): Promise => {\r\n this.setState({isLoadingPastIssues: true});\r\n return this.props.getPastIssues(this.props.match.params.newsletterId, pageNumber).then((pastIssues) => {\r\n if(this._componentUnmounted) return;\r\n this.setState({ pastIssues, isLoadingPastIssues: false });\r\n });\r\n }\r\n\r\n private onDeleteNewsletter = async () => {\r\n if (await confirm.show({\r\n title: `Delete Newsletter`,\r\n text: (\r\n
    \r\n
    You're about to permanently delete '{this.state.details!.title}'. You'll lose all queued and sent issues, reports, and settings associated with this. You cannot undo this action.
    \r\n
    \r\n
    Are you sure?
    \r\n
    \r\n ),\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\"\r\n })){\r\n this.setState({isSaving: true});\r\n this.props.deleteNewsletter(this.props.match.params.newsletterId).then((succeeded) => {\r\n this.setState({isSaving: false});\r\n if (succeeded)\r\n this.redirectBackToNewsletters();\r\n else\r\n this.onGetNewsletterDetails();\r\n });\r\n }\r\n }\r\n\r\n private onDisableNewsletter = () => {\r\n this.setState({isSaving: true});\r\n this.props.disableNewsletter(this.props.match.params.newsletterId)\r\n .then((succeeded) => {\r\n if(succeeded){\r\n this.setState({successMessage:'Newsletter disabled'});\r\n }\r\n this.onGetNewsletterDetails();\r\n this.setState({isSaving: false});\r\n });\r\n }\r\n\r\n private onEnableNewsletter = () => {\r\n this.setState({isSaving: true});\r\n this.props.enableNewsletter(this.props.match.params.newsletterId)\r\n .then((succeeded) => {\r\n if (succeeded){\r\n this.setState({successMessage:'Newsletter enabled'});\r\n }\r\n this.onGetNewsletterDetails();\r\n this.setState({isSaving: false});\r\n });\r\n }\r\n\r\n private onDownloadRecipientReport = () => {\r\n this.setState({ isDownloading: true });\r\n const file = {\r\n name: `${this.state.details!.title} Recipients.csv`\r\n };\r\n this.props.getRecipientsCsv(this.state.details!.id)\r\n .then((url) => new FileDownloader(file).downloadProvided(url))\r\n .then(_ => this.setState({ isDownloading: false }))\r\n .catch(_ => this.setState({ isDownloading: false }));\r\n }\r\n\r\n private onEditNewsletter = () => {\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/newsletters/\" + this.props.match.params.newsletterId);\r\n }\r\n\r\n private onGetNewsletterDetails = () => {\r\n this.setState({ isLoadingNewsletter:true });\r\n this.props.getNewsletterDetails(this.props.match.params.newsletterId).then((details) => {\r\n if(this._componentUnmounted) return;\r\n if (!!details)\r\n this.setState({ details, isLoadingNewsletter:false });\r\n else\r\n this.redirectBackToNewsletters();\r\n });\r\n }\r\n\r\n private onSendTestEmail = () => {\r\n this.setState({ sendTestEmailForIssue: this.state.details!.nextIssueSendOn || this.state.details!.lastIssueSentOn });\r\n }\r\n\r\n private showIssuesTab = () => {\r\n this.setState({currentIssueId:null});\r\n this.props.redirectTo(\"/\" + this.props.match.params.tenant + \"/admin/newsletters/\" + this.props.match.params.newsletterId + \"/dashboard\");\r\n }\r\n\r\n private showOverallInsightsTab = () => {\r\n this.props.redirectTo(\"/\" + this.props.match.params.tenant + \"/admin/newsletters/\" + this.props.match.params.newsletterId + \"/dashboard/insights\");\r\n }\r\n\r\n private showIssueInsightsTab = (issueDateLocal: string) => {\r\n this.props.redirectTo(\"/\" + this.props.match.params.tenant + \"/admin/newsletters/\" + this.props.match.params.newsletterId + \"/dashboard/\" + issueDateLocal);\r\n }\r\n\r\n private redirectBackToNewsletters = () => {\r\n this.props.redirectTo(`/${this.props.tenant}/admin/newsletters`);\r\n }\r\n\r\n private viewInsightsClicked = (issueDateLocal: string) => {\r\n this.setState({selectedTab: 2});\r\n this.showIssueInsightsTab(issueDateLocal);\r\n }\r\n\r\n private onChangeTab = (e) => {\r\n const newsletter = this.state.details;\r\n this.setState({selectedTab: e});\r\n\r\n //Future & Past Issues\r\n if(e === 0) {\r\n this.showIssuesTab();\r\n }\r\n\r\n //Newsletter Insights\r\n if(e === 1) {\r\n this.showOverallInsightsTab();\r\n }\r\n\r\n //Recent Issue\r\n if(e === 2) {\r\n if(!!newsletter)\r\n this.showIssueInsightsTab(newsletter.lastSentIssueDateLocal!)\r\n }\r\n }\r\n}\r\n\r\n\r\ninterface RouteParams {\r\n tenant: string;\r\n newsletterId: string;\r\n tab?: string;\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\ninterface ComponentState {\r\n details?: NewsletterDetails;\r\n isLoadingNewsletter: boolean;\r\n pastIssues?: NewsletterPastIssuesPage;\r\n isLoadingPastIssues: boolean;\r\n currentIssueId?: string | null;\r\n\r\n sendTestEmailForIssue?: string | null;\r\n showEmailActivityLog?: boolean;\r\n showCopyNewsletter?: boolean;\r\n isDownloading?: boolean;\r\n isSaving?: boolean;\r\n selectedTab: number;\r\n\r\n successMessage?: string | null;\r\n errorMessage?: string | null;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n tenant: state.tenant.id\r\n }),\r\n {\r\n deleteNewsletter: actions.deleteNewsletter,\r\n disableNewsletter: actions.disableNewsletter,\r\n enableNewsletter: actions.enableNewsletter,\r\n getNewsletterDetails: actions.getNewsletterDetails,\r\n getPastIssues: actions.getPastIssues,\r\n getRecipientsCsv: actions.getRecipientsCSV,\r\n getConfig: actions.getConfig,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(NewsletterDashboardPage);\r\n","import React from \"react\";\r\n\r\nimport { postsApi } from \"api/instances\";\r\nimport DownloadButton from \"modules/common/components/buttons/muiDownloadButton\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\nimport { PostFilterValues } from \"modules/posts/models\";\r\n\r\nconst DownloadReports: React.FunctionComponent = props => {\r\n const onClick = async (): Promise => {\r\n const result = await postsApi.GetPostsCSV(props.filter);\r\n\r\n return result;\r\n };\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n filter: Partial;\r\n}\r\n\r\nexport default DownloadReports;\r\n","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\n\r\n\r\nconst NewPost: React.FunctionComponent = props => {\r\n return (\r\n }\r\n onClick={() => props.redirectTo(\"/\" + props.tenant + \"/admin/posts/edit/new\")\r\n }>\r\n New Post\r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenant: state.tenant.id\r\n }),\r\n {\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(NewPost);","import * as React from \"react\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\n\r\nclass AuthoringFilter extends React.Component {\r\n public render() {\r\n return (\r\n \r\n \r\n }}\r\n onChange={this.props.onUpdateTextToSearch}\r\n onKeyUp={this.onKeyUp}\r\n className=\"text-to-search\"\r\n />\r\n {this.props.additionalFilters}\r\n \r\n );\r\n }\r\n\r\n private onKeyUp = (key) => {\r\n if (key.keyCode === 13)\r\n this.props.onChangeTextToSearch();\r\n }\r\n}\r\n \r\n\r\ninterface IAuthoringFilterProps {\r\n textToSearch: string;\r\n additionalFilters?: JSX.Element;\r\n searchTextPlaceholder?: string;\r\n onChangeTextToSearch: () => void;\r\n onUpdateTextToSearch: (event: React.ChangeEvent) => void;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nexport default AuthoringFilter;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\n\r\nimport { PostFilterValues, PostListingPageId } from \"../../models\";\r\n\r\nimport AuthoringFilter from \"modules/common/components/filters/authoringFilter\";\r\nimport AuthoringSearch from \"modules/common/components/filters/authoringSearch\";\r\nimport FilterContainer from \"modules/common/components/filters/filterContainer\";\r\nimport FilterDropdown from \"modules/common/components/filters/filterDropdown\";\r\n\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Chip from \"@mui/material/Chip\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\nimport { DatePicker } from \"@mui/x-date-pickers/DatePicker\";\r\nimport { PickerLocalization } from \"modules/common/components/pickerLocalization\";\r\n\r\nimport moment from \"moment\";\r\nimport { TenantSettingsTagGroup } from \"modules/settings\";\r\nimport { SelectOption } from \"modules/common/models\";\r\nimport TopicDropdown from \"modules/common/components/topicDropdown\";\r\nimport { availableContentStates, ContentState, contentStateLabels } from \"utils/managementUtils\";\r\n\r\nconst availablePostTypes: SelectOption[] = [\r\n { key: \"standard\", text: \"Standard\", type: \"item\" },\r\n { key: \"mandatory\", text: \"Mandatory\", type: \"item\" },\r\n { key: \"compliance\", text: \"Compliance\", type: \"item\" },\r\n { key: \"public\", text: \"Public\", type: \"item\" }\r\n];\r\n\r\nclass PostFilters extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n canSearch: !this.hasNoCurrentFilters(),\r\n lcidToSearch: props.filters.lcidToSearch || \"\",\r\n textToSearch: props.filters.textToSearch || \"\",\r\n // \"to\" date needs to be stored as state as we need to add on 23 hrs 59 secs for our filter.olderThan\r\n olderThanDateTimeValue: \"\",\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.filters.lcidToSearch !== prevProps.filters.lcidToSearch)\r\n this.setState({ lcidToSearch: this.props.filters.lcidToSearch || \"\" });\r\n\r\n if (this.props.filters.textToSearch !== prevProps.filters.textToSearch)\r\n this.setState({ textToSearch: this.props.filters.textToSearch || \"\" });\r\n }\r\n\r\n public getFilterByState = () => \r\n \r\n {availableContentStates.map((availablePostState) => (\r\n this.onChangePostStates(availablePostState)}>\r\n \r\n selectedPostState === availablePostState) !== undefined)}\r\n />\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n\r\n public render() {\r\n const { filters } = this.props;\r\n const tagSelected = (filters.tags?.length ?? [].length) > 0;\r\n\r\n return (\r\n \r\n \r\n {this.props.pageId === PostListingPageId.ALL && this.getFilterByState()}\r\n\r\n \r\n \r\n
    \r\n
    \r\n
    From
    \r\n \r\n
    \r\n
    \r\n
    To
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n \r\n\r\n {\r\n this.props.pageId !== PostListingPageId.SUBMISSIONS && \r\n \r\n \r\n {availablePostTypes.map((availablePostType) => (\r\n this.onChangePostTypes(availablePostType.key)}>\r\n \r\n selectedPostType === availablePostType.key)}\r\n />\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n }\r\n
    \r\n }\r\n onChangeTextToSearch={this.onChangeTextToSearch}\r\n onUpdateTextToSearch={this.onUpdateTextToSearch}\r\n />\r\n
    \r\n }\r\n filterCommands={\r\n \r\n }\r\n filterSelection={this.getFilterSelection()}\r\n />\r\n );\r\n }\r\n\r\n private getFilterSelection = (): JSX.Element | undefined => {\r\n const { filters } = this.props;\r\n\r\n if (!filters.textToSearch && !filters.tags!.length && !filters.postTypes!.length && !filters.newerThan && !filters.olderThan && !filters.postStates!.length)\r\n return undefined;\r\n\r\n const availableTags: SelectOption[] = this.getAvailableTags();\r\n\r\n return (\r\n \r\n {!!filters.textToSearch &&\r\n }\r\n />\r\n }\r\n {filters.tags!.map((selectedTag) =>\r\n tag.key === selectedTag)!.text}\r\n onDelete={() => this.onClearTag(selectedTag)}\r\n deleteIcon={}\r\n />\r\n )}\r\n {filters.postTypes!.map((selectedPostType) =>\r\n postType.key === selectedPostType)!.text}\r\n onDelete={() => this.onClearPostType(selectedPostType)}\r\n deleteIcon={}\r\n />\r\n )}\r\n {filters.postStates!.map((selectedPostState) =>\r\n this.props.pageId === PostListingPageId.ALL &&\r\n this.onClearPostState(selectedPostState)}\r\n deleteIcon={}\r\n />\r\n )}\r\n {(!!filters.newerThan || !!filters.olderThan) &&\r\n }\r\n />\r\n }\r\n \r\n );\r\n }\r\n\r\n\r\n private getAvailableTags = (): SelectOption[] => {\r\n if (!this.props.tenantSettings)\r\n return [];\r\n\r\n let availableTags: SelectOption[] = [];\r\n this.props.availableTopics.map((tagGroup) => {\r\n if (!!tagGroup.tags.length && !tagGroup.deleted && !tagGroup.disabled) {\r\n availableTags.push({ key: tagGroup.id, text: tagGroup.name, type: \"header\" });\r\n tagGroup.tags.map((tag) => {\r\n if (!tag.deleted && !tag.disabled)\r\n availableTags.push({ key: tag.id, text: tag.name, type: \"item\" });\r\n return tag;\r\n });\r\n }\r\n return tagGroup;\r\n });\r\n return availableTags;\r\n }\r\n\r\n private onChangePostStates = (currentPostState: ContentState) => {\r\n if (this.props.pageId === PostListingPageId.ALL) {\r\n const hasSelectedPostState: boolean = !!(this.props.filters.postStates!.find((selectedPostState) => selectedPostState === currentPostState) !== undefined);\r\n \r\n if (hasSelectedPostState)\r\n this.onChangeFilters({ postStates: this.props.filters.postStates!.filter((selectedPostState) => selectedPostState !== currentPostState) });\r\n else\r\n this.onChangeFilters({ postStates: this.props.filters.postStates!.concat([currentPostState]) });\r\n\r\n }\r\n }\r\n\r\n private onChangeFilters = (value: Partial) => {\r\n this.props.onChangeFilters({ ...this.props.filters, lcidToSearch: this.state.lcidToSearch, textToSearch: this.state.textToSearch, ...value });\r\n this.setCanSearch();\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.clearCanSearch();\r\n this.props.onClearFilters();\r\n this.setState({textToSearch: \"\", olderThanDateTimeValue: \"\"});\r\n }\r\n\r\n private checkGroupSelected = (tagGroup: TenantSettingsTagGroup) => {\r\n return tagGroup.tags.every(tag => {\r\n return this.props.filters.tags!.includes(tag.id);\r\n })\r\n }\r\n\r\n private handleTagGroupClick = (tagGroup: TenantSettingsTagGroup) => {\r\n let isCurrentlyChecked = this.checkGroupSelected(tagGroup);\r\n\r\n if(isCurrentlyChecked) {\r\n this.deselectTagGroup(tagGroup);\r\n }\r\n else {\r\n this.selectTagGroup(tagGroup);\r\n }\r\n }\r\n\r\n private selectTagGroup = (tagGroup: TenantSettingsTagGroup) => {\r\n let currentTags = this.props.filters.tags ?? [];\r\n\r\n tagGroup.tags.forEach(tag => {\r\n if(!currentTags.includes(tag.id)) {\r\n currentTags.push(tag.id);\r\n }\r\n })\r\n\r\n let newFilters = this.props.filters;\r\n newFilters.tags = currentTags;\r\n this.onChangeFilters(newFilters);\r\n }\r\n\r\n private deselectTagGroup = (tagGroup: TenantSettingsTagGroup) => {\r\n let currentTags = this.props.filters.tags ?? [];\r\n let tagsToRemove = tagGroup.tags.map(t => t.id);\r\n\r\n currentTags = currentTags.filter(currentTag => !tagsToRemove.includes(currentTag));\r\n\r\n let newFilters = this.props.filters;\r\n newFilters.tags = currentTags;\r\n this.onChangeFilters(newFilters);\r\n }\r\n\r\n private onHandleAllTags = (tagSelected: boolean) => {\r\n if(tagSelected) {\r\n let newFilters = this.props.filters;\r\n newFilters.tags = [];\r\n this.onChangeFilters(newFilters);\r\n }\r\n else {\r\n let currentTags = this.props.filters.tags ?? [];\r\n let tagGroups = this.props.availableTopics;\r\n\r\n tagGroups.forEach(tagGroup => {\r\n tagGroup.tags.forEach(tag => {\r\n if(!currentTags.includes(tag.id)) {\r\n currentTags.push(tag.id);\r\n }\r\n });\r\n });\r\n\r\n let newFilters = this.props.filters;\r\n newFilters.tags = currentTags;\r\n this.onChangeFilters(newFilters);\r\n }\r\n }\r\n\r\n private onChangeLcidToSearch = (lcidToSearch: string) => {\r\n this.onChangeFilters({ lcidToSearch });\r\n }\r\n\r\n private onChangePostTypes = (currentPostType: string) => {\r\n const hasSelectedPostType: boolean = !!this.props.filters.postTypes!.find((selectedPostType) => selectedPostType === currentPostType);\r\n if (hasSelectedPostType)\r\n this.onChangeFilters({ postTypes: this.props.filters.postTypes!.filter((selectedPostType) => selectedPostType !== currentPostType) });\r\n else\r\n this.onChangeFilters({ postTypes: this.props.filters.postTypes!.concat([currentPostType]) });\r\n }\r\n\r\n private onChangeTags = (currentTag: string) => {\r\n const hasSelectedTag: boolean = !!this.props.filters.tags!.find((selectedTag) => selectedTag === currentTag);\r\n if (hasSelectedTag)\r\n this.onChangeFilters({ tags: this.props.filters.tags!.filter((selectedTag) => selectedTag !== currentTag) });\r\n else\r\n this.onChangeFilters({ tags: this.props.filters.tags!.concat([currentTag]) });\r\n }\r\n\r\n private onChangeTextToSearch = () => {\r\n this.onChangeFilters({ textToSearch: this.state.textToSearch });\r\n }\r\n\r\n private onClearPostType = (postType: string) => {\r\n this.onChangeFilters({ postTypes: this.props.filters.postTypes!.filter((selectedPostType) => selectedPostType !== postType) });\r\n }\r\n\r\n private onClearPostState = (postState: ContentState) => {\r\n if (this.props.pageId === PostListingPageId.ALL)\r\n this.onChangeFilters({ postStates: this.props.filters.postStates!.filter((selectedPostState) => selectedPostState !== postState) });\r\n }\r\n\r\n private onClearTag = (tag: string) => {\r\n this.onChangeFilters({ tags: this.props.filters.tags!.filter((selectedTag) => selectedTag !== tag) });\r\n }\r\n\r\n private onClearTextToSearch = () => {\r\n this.onChangeFilters({ textToSearch: \"\" });\r\n }\r\n\r\n private onUpdateLcidToSearch = (event) => {\r\n this.setState({ lcidToSearch: event.target.value });\r\n if (!!this.props.filters.textToSearch)\r\n this.onChangeLcidToSearch(event.target.value);\r\n }\r\n\r\n private onUpdateTextToSearch = (event) => {\r\n this.setState({ textToSearch: event.target.value });\r\n if(event.target.value && event.target.value !== \"\") {\r\n this.setCanSearch();\r\n }\r\n else if(this.hasNoCurrentFilters()){\r\n this.clearCanSearch();\r\n }\r\n }\r\n\r\n\r\n // Will set the 'newerThan' date to start at the 00:00 time of the chosen date\r\n private onChangeFromDate = (date) => {\r\n let dateToUse = new Date(date);\r\n let timeNow = new Date();\r\n\r\n if(this.props.onlyNewer) {\r\n if(moment(date).dayOfYear() === moment().dayOfYear()) {\r\n dateToUse.setHours(timeNow.getHours(), timeNow.getMinutes(), timeNow.getSeconds());\r\n }\r\n }\r\n\r\n this.onChangeFilters({ newerThan: moment(dateToUse).toISOString() });\r\n }\r\n\r\n // Will set the 'olderThan' date to start at the 23:59 time of the chosen date\r\n private onChangeToDate = (date) => {\r\n let dateToUse = new Date(date);\r\n\r\n // add 24 hours and subtract 1 second to force the 'To Date' to be inclusive of the chosen date\r\n let nextDay = dateToUse.getTime() + ((24 * 60 * 60 - 1) * 1000);\r\n let nextDayDateToUse = new Date(nextDay);\r\n\r\n let timeNow = new Date();\r\n\r\n if(this.props.onlyOlder) {\r\n if(moment(date).dayOfYear() === moment().dayOfYear()) {\r\n nextDayDateToUse.setHours(timeNow.getHours(), timeNow.getMinutes(), timeNow.getSeconds());\r\n }\r\n }\r\n\r\n this.onChangeFilters({ olderThan: moment(nextDayDateToUse).toISOString() });\r\n this.setState({ olderThanDateTimeValue: moment(dateToUse).toISOString() });\r\n }\r\n\r\n private onClearPublishedTime = () => {\r\n this.onChangeFilters({ newerThan: \"\", olderThan: \"\" });\r\n this.setState({ olderThanDateTimeValue: \"\" });\r\n }\r\n\r\n private clearCanSearch = () => {\r\n this.setState({ canSearch: false });\r\n }\r\n\r\n private setCanSearch = () => {\r\n this.setState({ canSearch: true });\r\n }\r\n\r\n private hasNoCurrentFilters = () => {\r\n let filters = this.props.filters;\r\n\r\n return (!filters.tags || filters.tags.length === 0)\r\n && filters.textToSearch === \"\"\r\n && (!filters.postTypes || filters.postTypes.length === 0)\r\n && !filters.newerThan && !filters.olderThan\r\n && filters.postStates!.length === 0\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n filters: Partial;\r\n onChangeFilters: (filters: Partial) => void;\r\n onClearFilters: () => void;\r\n pageId: PostListingPageId;\r\n availableTopics: TenantSettingsTagGroup[];\r\n onlyOlder?: boolean;\r\n onlyNewer?: boolean;\r\n}\r\n\r\ninterface ComponentState {\r\n canSearch: boolean;\r\n lcidToSearch: string;\r\n textToSearch: string;\r\n olderThanDateTimeValue: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n lcidMappings: state.resources.lcidMappings,\r\n tenantSettings: state.settings.tenantSettings,\r\n tenant: state.tenant.id\r\n }),\r\n {\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(PostFilters);\r\n","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport MoreOptionsIconButton from \"modules/common/components/buttons/moreOptionsIconButton\";\r\n\r\nimport Divider from \"@mui/material/Divider\";\r\nimport List from \"@mui/material/List\";\r\n\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\nimport { POST_TYPES, PostListItem } from \"modules/posts/models\";\r\nimport { push } from \"react-router-redux\";\r\n\r\nconst MoreOptions: React.FunctionComponent = ({\r\n isContributor = false,\r\n ...props\r\n}) => {\r\n let post = props.post;\r\n\r\n return (\r\n \r\n \r\n \r\n {\r\n props.onPreview(post);\r\n }}\r\n />\r\n \r\n {\r\n !isContributor &&\r\n {\r\n props.onInsight(post);\r\n }}\r\n />\r\n }\r\n {\r\n props.onClone(post);\r\n }}\r\n buttonId=\"more-options-duplicate-button\"\r\n />\r\n {\r\n !isContributor && post.postType !== POST_TYPES.COMPLIANCE &&\r\n <>\r\n \r\n {\r\n props.onBoost(post);\r\n }}\r\n />\r\n \r\n \r\n }\r\n \r\n {\r\n !isContributor && post.status.toLowerCase() !== \"draft\" &&\r\n {\r\n props.onUnpublish(post);\r\n }}\r\n buttonId=\"more-options-unpublish-button\"\r\n />\r\n }\r\n {\r\n props.onDelete(post);\r\n }}\r\n disabled={isContributor && post.status.toLowerCase() !== \"draft\"}\r\n buttonId=\"more-options-delete-button\"\r\n />\r\n \r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n post: PostListItem;\r\n onPreview: (postToPreview?: PostListItem) => void;\r\n onPublish: (postToPublish: PostListItem) => void;\r\n onClone: (postToClone?: PostListItem) => void;\r\n onBoost: (postToBoost?: PostListItem) => void;\r\n onUnpublish: (postToUnpublish?: PostListItem) => void;\r\n onDelete: (postToDelete?: PostListItem) => void;\r\n isContributor?: boolean;\r\n onEditPost: () => void;\r\n onInsight: (postToPreview?: PostListItem) => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenant: state.tenant.id\r\n }),\r\n {\r\n redirectTo: push,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(MoreOptions);\r\n","import React from \"react\";\r\n\r\nimport \"./styles/desktopPreview.sass\";\r\n\r\ninterface IDesktopPreviewProps {\r\n}\r\n\r\nconst DesktopPreview: React.FunctionComponent = ({\r\n children\r\n}) => {\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {children}\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default DesktopPreview;\r\n","import React from \"react\";\r\n\r\n/**\r\n * Fluent PostUpdate Icon\r\n * seach for post update at https://developer.microsoft.com/en-us/fluentui#/styles/web/icons#usage-svg-icons\r\n*/\r\nexport const FluentPostUpdateIcon: React.FC> = (props) => (\r\n \r\n \r\n \r\n);\r\n","import React from \"react\";\r\n\r\n/**\r\n * Fluent Calendar Icon\r\n * seach for calendar at https://developer.microsoft.com/en-us/fluentui#/styles/web/icons#usage-svg-icons\r\n */\r\nexport const FluentCalendarIcon: React.FC> = (props) => (\r\n \r\n \r\n \r\n);\r\n","import React from \"react\";\r\nimport { Home, SettingsOutlined } from \"@mui/icons-material\";\r\n\r\nimport { FluentPostUpdateIcon } from \"modules/common/icons/fluentPostUpdateIcon\";\r\nimport { FluentCalendarIcon } from \"modules/common/icons/fluentCalendarIcon\";\r\n\r\nimport \"./styles/teamsPreview.sass\";\r\nimport { Divider } from \"@mui/material\";\r\n\r\ninterface ITeamsPreviewProps {\r\n displayName: string;\r\n eventsEnabled: boolean;\r\n}\r\n\r\nexport const TeamsPreview: React.FC = ({ displayName, eventsEnabled, children }) => {\r\n return (\r\n
    \r\n
    \r\n \"Teams\r\n
    \r\n
    \r\n
    LOGO
    \r\n {displayName}\r\n
    Home
    \r\n
    Activity
    \r\n
    About
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n Home\r\n
    \r\n
    \r\n \r\n My Feed\r\n
    \r\n
    \r\n \r\n Events\r\n
    \r\n \r\n
    \r\n \r\n Preferences\r\n
    \r\n \r\n
    \r\n
    {children}
    \r\n
    \r\n
    \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { AccountCircle, HomeOutlined, Menu, MessageOutlined, Search } from \"@mui/icons-material\";\r\nimport { Divider } from \"@mui/material\";\r\n\r\nimport { MobileAppPages } from \"modules/contentBands/models\";\r\n\r\nimport \"./styles/mobilePreview.sass\";\r\n\r\nexport interface IMobileAppPreviewProps {\r\n activePage: MobileAppPages;\r\n appName?: string;\r\n}\r\n\r\nexport const MobilePreview: React.FunctionComponent = ({ children, appName = \"Sparrow Connected\", activePage }) => {\r\n return (\r\n
    \r\n
    \r\n \r\n {appName}\r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n {children}\r\n
    \r\n \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n","import React from \"react\";\r\nimport \"../styles/plainPreview.sass\";\r\n\r\ninterface IPlainPreviewProps {}\r\n\r\nconst PlainPreview: React.FC = ({ children }) => {\r\n return
    \r\n
    \r\n
    \r\n {children}\r\n
    \r\n
    \r\n
    \r\n};\r\n\r\nexport default PlainPreview;\r\n","import React from \"react\";\r\nimport { Button, Paper, Menu, MenuItem } from \"@mui/material\";\r\nimport ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown';\r\nimport { ContentType, SelectOption } from \"modules/common/models\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { UserRoleWrapper } from \"routes/_layout/common/components/wrappers/UserRoleWrapper\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\n\r\ninterface IMyContentFilter {\r\n selectedFilter: CreatedBySelectValues;\r\n content: ContentType;\r\n onSelect: (selection: CreatedBySelectValues) => void;\r\n}\r\n\r\nexport enum CreatedBySelectValues {\r\n VIEW_MY,\r\n VIEW_ALL\r\n}\r\n\r\ninterface IContentCreatedBySelectOption extends SelectOption {\r\n id: CreatedBySelectValues;\r\n}\r\n\r\nconst createdByOptions = (content: ContentType): IContentCreatedBySelectOption[] => {\r\n const contentType = ContentType[content].toLowerCase();\r\n\r\n return [\r\n {\r\n id: CreatedBySelectValues.VIEW_ALL,\r\n key: \"allContent\",\r\n text: `All ${contentType}s`,\r\n type: \"item\"\r\n },\r\n {\r\n id: CreatedBySelectValues.VIEW_MY,\r\n key: \"myContent\",\r\n text: `My ${contentType}s (Created by me)`,\r\n type: \"item\"\r\n }\r\n ];\r\n};\r\n\r\nconst CreatedByFilter: React.FunctionComponent = (props) => {\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const isDropDownOpen = Boolean(anchorEl);\r\n const contentType = ContentType[props.content].toLowerCase();\r\n\r\n const onPostCreatedByClick = (event: React.MouseEvent) => {\r\n event.persist();\r\n setAnchorEl(event.target);\r\n };\r\n\r\n const onSelect = (selection: CreatedBySelectValues) => {\r\n setAnchorEl(null);\r\n props.onSelect(selection);\r\n };\r\n\r\n const getDropDownMenu = (): JSX.Element => setAnchorEl(null)}\r\n >\r\n {\r\n createdByOptions(props.content)\r\n .map((item: IContentCreatedBySelectOption) =>\r\n onSelect(item.id)}\r\n >\r\n {item.text}\r\n \r\n )\r\n }\r\n ;\r\n\r\n return \r\n \r\n }\r\n onClick={onPostCreatedByClick}\r\n >\r\n {\r\n props.selectedFilter === CreatedBySelectValues.VIEW_MY\r\n ? `View my ${contentType}s`\r\n : `View all ${contentType}s`\r\n }\r\n \r\n\r\n {getDropDownMenu()}\r\n \r\n ;\r\n};\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IMyContentFilter) => ({\r\n ...ownProps,\r\n fetching: state.posts.editor.fetching,\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(CreatedByFilter);","import * as React from \"react\";\r\n\r\n\r\nclass Video extends React.Component {\r\n private player;\r\n private videoRef: HTMLVideoElement;\r\n\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n isPlaying: false\r\n };\r\n }\r\n\r\n private getSourceType(src: string, fileName?: string): string | null {\r\n if (src.toLowerCase().includes(\"/manifest(format=m3u8-aapl\"))\r\n return \"application/x-mpegURL\";\r\n \r\n if (fileName) {\r\n const standardizedText = fileName.toLowerCase();\r\n if (standardizedText.includes(\".mp4\"))\r\n return \"video/mp4\";\r\n if (standardizedText.includes(\".ogg\"))\r\n return \"video/ogg\";\r\n if (standardizedText.includes(\".webm\"))\r\n return \"video/webm\";\r\n }\r\n return null;\r\n }\r\n\r\n private initialize(src: string, fileName?: string) {\r\n if (this.videoRef) {\r\n const type = this.getSourceType(src, fileName);\r\n\r\n const options = {\r\n ...this.props,\r\n html5: {\r\n nativeVideoTracks: false,\r\n nativeAudioTracks: false\r\n },\r\n sources: src\r\n ? [{ src: `${src.replace(\"http://\",\"https://\")}#t=0.1`, type: type }]\r\n : null\r\n };\r\n\r\n this.player = (window as any).videojs(this.videoRef, options);\r\n this.player\r\n .ready(() => {\r\n this.player.src(src);\r\n })\r\n .on(\"ended\", () => {\r\n this.player.pause().currentTime(0).trigger(\"loadstart\");\r\n })\r\n .on(\"loadeddata\", () => {\r\n if (this.player.paused()) this.player.bigPlayButton.el_.style.display = \"block\";\r\n })\r\n .on(\"pause\", () => {\r\n this.player.bigPlayButton.el_.style.display = \"block\";\r\n })\r\n .on(\"play\", () => {\r\n this.player.bigPlayButton.el_.style.display = \"none\";\r\n });\r\n } else {\r\n this.forceUpdate();\r\n }\r\n }\r\n\r\n public componentDidMount() {\r\n this.initialize(this.props.src, this.props.fileName);\r\n }\r\n\r\n public componentDidUpdate(prevProps: ComponentProps) {\r\n if (!!this.props.pauseVideo && (this.props.pauseVideo !== prevProps.pauseVideo))\r\n this.pauseVideo();\r\n }\r\n\r\n public componentWillUnmount() {\r\n if (this.player) {\r\n this.player.dispose();\r\n }\r\n }\r\n\r\n public render() {\r\n const { style, className } = this.props;\r\n const { isPlaying } = this.state;\r\n\r\n return (\r\n
    \r\n
    \r\n this.videoRef = node! }\r\n controls\r\n data-setup=\"{'fluid': true}\"\r\n crossOrigin=\"anonymous\"\r\n preload=\"metadata\"\r\n onPlay={() => this.setIsPlaying(true)}\r\n onPause={() => this.setIsPlaying(false)}\r\n className=\"video-js vjs-default-skin post-video-primary vjs-16-9 vjs-big-play-centered\">\r\n \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private setIsPlaying = (isPlaying: boolean) => this.setState({ isPlaying });\r\n private pauseVideo = () => this.player.pause();\r\n}\r\n\r\ninterface ComponentProps {\r\n src: string;\r\n fileName?: string;\r\n pauseVideo: boolean;\r\n\r\n style?: React.CSSProperties;\r\n className?: string;\r\n}\r\n\r\ninterface ComponentState {\r\n isPlaying: boolean;\r\n}\r\n\r\nexport default Video;","import * as React from 'react';\r\nimport * as dom from 'react-dom';\r\n\r\ninterface componentProps {\r\n cropPoints: number[];\r\n src: string;\r\n height?: number;\r\n width?: number;\r\n onClick?: () => void;\r\n}\r\ninterface componentState { }\r\n\r\nexport default class CanvasPreviewImage extends React.Component {\r\n private canvasElement: HTMLCanvasElement\r\n\r\n public componentDidMount() {\r\n // after the canvas is added to the page, force update to\r\n // trigger drawing the image on the canvas.\r\n this.drawImageOnCanvas();\r\n }\r\n\r\n public componentDidUpdate(prevProps: componentProps, prevState: componentState) {\r\n if (prevProps.height !== this.props.height\r\n || prevProps.width !== this.props.width\r\n || prevProps.src !== this.props.src\r\n || JSON.stringify(prevProps.cropPoints) !== JSON.stringify(this.props.cropPoints))\r\n this.drawImageOnCanvas();\r\n }\r\n\r\n public render() {\r\n return this.canvasElement = el!} />\r\n }\r\n\r\n private drawImageOnCanvas() {\r\n let canvas = dom.findDOMNode(this.canvasElement) as HTMLCanvasElement;\r\n let image = new Image();\r\n\r\n canvas.width = this.props.width || canvas.clientWidth;\r\n canvas.height = this.props.height || canvas.clientHeight;\r\n\r\n this.drawTextInCenterOfCanvas(canvas, \"loading...\");\r\n\r\n image.addEventListener(\"load\", (e) => {\r\n let ctx = canvas.getContext('2d')!;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n let srcHeight = image.naturalHeight;\r\n let srcWidth = image.naturalWidth;\r\n\r\n let cropPoints = !!this.props.cropPoints && this.props.cropPoints.length === 4 ?\r\n this.props.cropPoints : [0, 0, srcWidth, srcHeight]\r\n\r\n let croppedX = Number(cropPoints[0]);\r\n let croppedY = Number(cropPoints[1]);\r\n let croppedWidth = Number(cropPoints[2]) - croppedX;\r\n let croppedHeight = Number(cropPoints[3]) - croppedY;\r\n\r\n this.drawImageInMultipleParts(ctx!, image, croppedX, croppedY, croppedWidth, croppedHeight, 0, 0, canvas.width, canvas.height);\r\n });\r\n\r\n image.onerror = (e) => {\r\n this.drawTextInCenterOfCanvas(canvas, \"Error loading image. Please refresh the page.\")\r\n }\r\n\r\n image.src = this.props.src;\r\n }\r\n\r\n private drawTextInCenterOfCanvas(canvas: HTMLCanvasElement, text: string) {\r\n let ctx = canvas.getContext('2d')!;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n ctx.font = '16px Open Sans';\r\n ctx.textAlign = 'center';\r\n ctx.fillStyle = '#333';\r\n ctx.fillText(text, canvas.width / 2, canvas.height / 2);\r\n }\r\n\r\n /*\r\n * Internet explorer and Edge seem to have difficulty rendering large images on canvas,\r\n * particularly on canvases that are smaller than the image. Both browsers throw an IndexSizeError.\r\n * The solution found is to break the image in multiple parts and draw each part individually.\r\n * Since there is no technical limit to the size of the image (cropping only constrains aspect ratio)\r\n * the number of parts needs to be dynamic to allow for larger images. The 400 pixels increment that\r\n * was chosen was an abritrary number that seems to make the image render in all browsers.\r\n */\r\n private drawImageInMultipleParts(context: CanvasRenderingContext2D, image: HTMLImageElement, srcOffsetX: number, srcOffsetY: number, srcWidth: number, srcHeight: number, targetOffsetX: number, targetOffsetY: number, targetWidth: number, targetHeight: number) {\r\n let increment = 400;\r\n let xParts = Math.ceil((srcWidth - srcOffsetX) / increment);\r\n let yParts = Math.ceil((srcHeight - srcOffsetY) / increment);\r\n\r\n // its possible if the cropped area is small enough or to the right the number will be negative\r\n xParts = !!xParts && xParts > 0 ? xParts : 1\r\n yParts = !!yParts && yParts > 0 ? yParts : 1\r\n\r\n let partWidth = srcWidth / xParts;\r\n let partHeight = srcHeight / yParts;\r\n\r\n /*\r\n * image src width and height is different from image target width and height\r\n * because the image may be a much higher resolution so its partWidth might\r\n * be 200px but it might need to be squished to a targetWidth of 60px\r\n */\r\n for (let i = 0; i < xParts; i++) {\r\n for (let j = 0; j < yParts; j++) {\r\n context.drawImage(image,\r\n // image parts: xOffset, yOffset, partWidth, partHeight\r\n srcOffsetX + (partWidth * (i)), srcOffsetY + (partHeight * (j)), partWidth, partHeight,\r\n // target positions: xOffset, yOffset, targetPartWidth, taretPartHeight,\r\n targetOffsetX + (targetWidth / xParts) * (i), targetOffsetY + (targetHeight / yParts) * (j), (targetWidth / xParts), (targetHeight / yParts)\r\n );\r\n }\r\n }\r\n }\r\n}\r\n","import React, { useEffect, useState } from \"react\";\r\n\r\nimport { AttachedFile } from \"modules/gallery\";\r\nimport Video from \"modules/posts/components/post-view/video\";\r\n\r\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\r\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\r\nimport FiberManualRecordIcon from '@mui/icons-material/FiberManualRecord';\r\nimport { IconButton } from \"@mui/material\";\r\n\r\nimport \"./carousel.sass\";\r\nimport CanvasPreviewImage from \"../canvasPreviewImage\";\r\n\r\ninterface ICarouselProps {\r\n files?: ICarouselItem[];\r\n feature?: Partial;\r\n}\r\n\r\nexport interface ICarouselItem extends AttachedFile {\r\n style: React.CSSProperties;\r\n useCanvas?: boolean;\r\n}\r\n\r\nconst Carousel: React.FunctionComponent = ({\r\n files,\r\n feature,\r\n children\r\n}) => {\r\n const [carouselIdx, setCarouselIdx] = useState(0);\r\n const [items, setItems] = useState([]);\r\n const [videoPaused, setVideoPaused] = useState(false);\r\n\r\n useEffect(() => {\r\n let newItems: ICarouselItem[] = [];\r\n if (files)\r\n newItems = [...files].map((file) => ({\r\n ...file,\r\n style: { backgroundImage: 'url(\"' + file.fileUrl + '\")' }\r\n }));\r\n\r\n // put feature first\r\n if (feature)\r\n newItems = [\r\n {\r\n ...feature,\r\n blobId: \"\",\r\n ospreyId: \"\",\r\n fileExtension: \"\",\r\n fileName: \"\",\r\n fileType: \"image\",\r\n style: { backgroundImage: 'url(\"' + feature.fileUrl + '\")' }\r\n },\r\n ...newItems\r\n ];\r\n\r\n setItems(newItems);\r\n }, [files, feature]);\r\n\r\n useEffect(() => {\r\n // reset flag to default value\r\n if (videoPaused)\r\n setVideoPaused(false);\r\n }, [videoPaused]);\r\n\r\n const pauseVideo = () => {\r\n setVideoPaused(true);\r\n }\r\n\r\n const rightArrow = (): JSX.Element => {\r\n if (carouselIdx === items.length - 1) return <>;\r\n\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const leftArrow = (): JSX.Element => {\r\n if (carouselIdx === 0) return <>;\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n const shiftLeft = () => {\r\n const newIdx = carouselIdx === 0\r\n ? items.length - 1\r\n : carouselIdx - 1;\r\n\r\n setCarouselIdx(newIdx);\r\n\r\n pauseVideo();\r\n }\r\n\r\n const shiftRight = () => {\r\n const newIdx = carouselIdx === items.length - 1\r\n ? 0\r\n : carouselIdx + 1;\r\n\r\n setCarouselIdx(newIdx);\r\n\r\n pauseVideo();\r\n }\r\n\r\n const onClickBubble = (idx: number) => {\r\n if (idx > -1 && idx < items.length) {\r\n setCarouselIdx(idx);\r\n\r\n pauseVideo();\r\n }\r\n }\r\n\r\n const hasFeature = !!feature;\r\n return (\r\n <>\r\n
    \r\n
    \r\n {items.map((media) =>\r\n media.fileType !== 'video' || !media.style\r\n ? \r\n {media.useCanvas\r\n ?
    \r\n {media.transforms && media.transforms.points && media.transforms.zoom ? \r\n \r\n : \r\n }\r\n
    \r\n : \r\n
    \r\n }\r\n \r\n : \r\n )}\r\n
    \r\n {leftArrow()}\r\n {items.length > 1 &&\r\n
    \r\n {hasFeature\r\n ?
    {carouselIdx === 0 ? \"Banner Image\" : `${carouselIdx} of ${items.length - 1}`}
    \r\n :
    {carouselIdx + 1} of {items.length}
    }\r\n
    }\r\n {rightArrow()}\r\n {children}\r\n \r\n {items.length > 1 &&\r\n
    \r\n {items.map((_, idx) =>\r\n onClickBubble(idx)}\r\n >\r\n \r\n
    )}\r\n \r\n }\r\n \r\n );\r\n}\r\n\r\nexport { Carousel }\r\n","import * as React from \"react\";\r\n\r\nimport { AttachedFile } from \"modules/gallery\";\r\nimport { CroppableImage } from \"modules/common/components/authoring/models\";\r\nimport { Carousel, ICarouselItem } from \"modules/common/components/carousel/carousel\";\r\n\r\nclass HeroBanner extends React.Component {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n selectedCarouselIndex: 0,\r\n pauseVideo: false\r\n };\r\n }\r\n\r\n public render() {\r\n const hasHeroImage: boolean = (!!this.props.image && !!this.props.image.id) || !!this.props.imageUrl;\r\n const hasAttachedContent: boolean = !!(this.props.attachedContent || []).length;\r\n\r\n if (!hasHeroImage && !hasAttachedContent)\r\n return
    ;\r\n\r\n let heroImage: Partial | undefined;\r\n if (Boolean(this.props.image) || Boolean(this.props.imageUrl))\r\n heroImage = {\r\n fileUrl: this.props.image?.url || this.props.imageUrl,\r\n transforms: this.props.image?.transforms,\r\n useCanvas: this.props.useCanvas\r\n };\r\n\r\n return (\r\n \r\n {this.props.children}\r\n \r\n );\r\n }\r\n\r\n private getFiles(): ICarouselItem[] {\r\n if (!this.props.image && !this.props.attachedContent) return [];\r\n\r\n const { useCanvas } = this.props;\r\n\r\n let attachedFiles = this.props.attachedContent\r\n ? this.props.attachedContent.map((attachedFile: AttachedFile) => ({ ...attachedFile, style: {}, useCanvas }))\r\n : [];\r\n\r\n return [...attachedFiles];\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n attachedContent?: AttachedFile[];\r\n bannerColor: string;\r\n image?: CroppableImage;\r\n imageUrl?: string;\r\n useCanvas?: boolean; // use canvas when drafting, when post is published the image url is to an image with the transforms applied\r\n}\r\n\r\ninterface ComponentState {\r\n selectedCarouselIndex: number;\r\n pauseVideo: boolean;\r\n}\r\n\r\nexport default HeroBanner;\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { PostViewStats } from \"modules/posts/models\";\r\n\r\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\n\r\nimport \"./typeBanner.sass\";\r\n\r\n\r\nconst icoComplied: string = \"/images/icons/complied_ico.svg\";\r\nconst icoMandatory: string = \"/images/icons/mandatory_ico.svg\";\r\nconst icoNotComplied: string = \"/images/icons/not_complied_ico.svg\";\r\nconst icoPublic: string = \"/images/icons/public_ico.svg\";\r\nconst icoRestricted: string = \"/images/icons/restricted_ico.svg\";\r\n\r\n\r\ninterface IBanner {\r\n color: string;\r\n icon: string;\r\n text: string;\r\n description: string;\r\n urlDescription?: string;\r\n}\r\n\r\ntype BannerTypes = \"complied\" | \"mandatory\" | \"notComplied\" | \"public\" | \"restricted\";\r\n\r\ntype Banners = { [bannerType in BannerTypes]: IBanner; };\r\n\r\nconst BannerText: React.FunctionComponent<{full?: boolean, expanded: boolean, onClick: (e: any) => void, style?: React.CSSProperties}> = (props) => {\r\n return (\r\n
    \r\n
    \r\n {props.children}\r\n {props.full &&\r\n \r\n }\r\n
    \r\n
    \r\n );\r\n};\r\n\r\nconst ExpandIcon: React.FunctionComponent<{full?: boolean, expanded: boolean, onClick: (e: any) => void, style?: React.CSSProperties, iconOnly?: boolean }> = (props) => {\r\n return (\r\n
    \r\n {props.children}\r\n {props.full &&\r\n \r\n }\r\n
    \r\n );\r\n};\r\n\r\nconst TypeBanner: React.FunctionComponent<{className?: string}> = (props) => {\r\n return (\r\n
    \r\n {props.children}\r\n
    \r\n );\r\n};\r\n\r\n\r\nconst Banner: React.FunctionComponent<{banner: IBanner, full?: boolean, description?: JSX.Element, expanded: boolean, onClick: (e: any) => void, className?: string, iconOnly?: boolean}> = (props) => {\r\n const { banner, full, description, expanded, iconOnly = false, onClick, className } = props;\r\n\r\n return (\r\n \r\n \r\n \"post\r\n \r\n \r\n
    \r\n {!full\r\n ? banner.text\r\n : description || banner.description\r\n }\r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\n\r\nclass PostTypeBanner extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n expandPublic: false,\r\n expandRestricted: false,\r\n expandType: props.iconOnly ? false : true\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n this.onSetBannerExpansions();\r\n }\r\n\r\n public render() {\r\n if (!this.props.clientSettings)\r\n return (null);\r\n\r\n const { clientSettings } = this.props;\r\n const { specialtyPostColors } = clientSettings;\r\n\r\n const banners: Banners = {\r\n complied: {\r\n color: (specialtyPostColors && specialtyPostColors.complianceChecked) || \"#05b34b\",\r\n icon: icoComplied,\r\n text: this.onGetTranslatedText(\"compliedPost\") || \"Complied\",\r\n description: this.onGetTranslatedText(\"compliedBannerDescription\") || \"You have already read and complied to this post.\"\r\n },\r\n mandatory: {\r\n color: (specialtyPostColors && specialtyPostColors.mandatory) || \"#004e79\",\r\n icon: icoMandatory,\r\n text: this.onGetTranslatedText(\"mandatoryPost\") || \"Mandatory\",\r\n description: this.onGetTranslatedText(\"mandatoryBannerDescription\") || \"You are required to read this post.\"\r\n },\r\n notComplied: {\r\n color: (specialtyPostColors && specialtyPostColors.compliance) || \"#faaf18\",\r\n icon: icoNotComplied,\r\n text: this.onGetTranslatedText(\"compliancePost\") || \"Compliance\",\r\n description: this.onGetTranslatedText(\"complianceBannerDescription\") || \"If you agree with the content of this post, comply using the checkbox down below.\"\r\n },\r\n public: {\r\n color: (specialtyPostColors && specialtyPostColors.public) || \"#ffffff\",\r\n icon: icoPublic,\r\n text: this.onGetTranslatedText(\"publicPost\") || \"Public\",\r\n description: this.onGetTranslatedText(\"publicBannerDescription\") || \"This is a public post.\",\r\n urlDescription: this.onGetTranslatedText(\"publicBannerDescriptionShareTitle\") || \"Share it through here\"\r\n },\r\n restricted: {\r\n color: (specialtyPostColors && specialtyPostColors.restricted) || \"#b72026\",\r\n icon: icoRestricted,\r\n text: this.onGetTranslatedText(\"restrictedContent\") || \"Restricted\",\r\n description: this.onGetTranslatedText(\"restrictedBannerDescription\") || \"This post is exclusive to specific audiences.\"\r\n }\r\n };\r\n\r\n return (\r\n
    \r\n {this._typeBanner(banners)}\r\n {this._restrictedBanner(banners.restricted)}\r\n {this._publicBanner(banners.public)}\r\n
    \r\n );\r\n }\r\n\r\n private _publicBanner = (banner: IBanner) => {\r\n // don't show share link if not public or if is not published\r\n if (this.props.postType !== \"public\" || this.props.status !== \"published\")\r\n return (null);\r\n\r\n return (\r\n \r\n {banner.description} \r\n
    \r\n }\r\n expanded={this.state.expandPublic}\r\n onClick={this.onToggleExpandPublic}\r\n className=\"public\" />\r\n );\r\n }\r\n\r\n private _restrictedBanner = (banner: IBanner) => {\r\n if (!this.props.isRestricted || !this.props.clientSettings.bannerVisibility.showRestrictedBanner) {\r\n return (null);\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _typeBanner = (banners: Banners) => {\r\n const { postType, stats, full, currentUserHasComplied, hideCompliance, iconOnly = false } = this.props;\r\n\r\n if (postType === \"standard\" || postType === \"public\")\r\n return (null);\r\n\r\n let banner = banners.mandatory;\r\n if (postType === \"compliance\") {\r\n if (stats) {\r\n banner = !!stats && !!stats.complianceTime ? banners.complied : banners.notComplied\r\n }\r\n else {\r\n banner = currentUserHasComplied ? banners.complied : banners.notComplied;\r\n }\r\n }\r\n\r\n if (hideCompliance) return null\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private onGetTranslatedText = (field: string, defaultLCID: string = \"en-us\") => {\r\n const { clientSettings, lcid } = this.props;\r\n const { translatedContent } = clientSettings;\r\n\r\n if (!translatedContent || (!translatedContent[lcid] && !translatedContent[defaultLCID]))\r\n return \"\";\r\n\r\n return translatedContent[lcid] ? translatedContent[lcid][field] : translatedContent[defaultLCID][field];\r\n }\r\n\r\n private onSetBannerExpansions = () => {\r\n if (this.props.iconOnly) return;\r\n\r\n const expandType: boolean = this.props.postType === \"compliance\" || this.props.postType === \"mandatory\";\r\n const expandRestricted: boolean = !expandType && this.props.clientSettings.bannerVisibility.showRestrictedBanner && !!this.props.isRestricted;\r\n const expandPublic: boolean = !expandType && !expandRestricted && this.props.postType === \"public\";\r\n\r\n this.setState({\r\n expandPublic,\r\n expandRestricted,\r\n expandType\r\n });\r\n }\r\n\r\n private onToggleExpandPublic = (e: any) => {\r\n if (this.props.iconOnly) return;\r\n\r\n e.stopPropagation();\r\n if (this.state.expandPublic)\r\n this.setState({ expandPublic: false });\r\n else\r\n this.setState({\r\n expandPublic: true,\r\n expandRestricted: false,\r\n expandType: false\r\n });\r\n }\r\n\r\n private onToggleExpandRestricted = (e: any) => {\r\n if (this.props.iconOnly) return;\r\n\r\n e.stopPropagation();\r\n if (this.state.expandRestricted)\r\n this.setState({ expandRestricted: false });\r\n else\r\n this.setState({\r\n expandPublic: false,\r\n expandRestricted: true,\r\n expandType: false\r\n });\r\n }\r\n\r\n private onToggleExpandType = (e: any) => {\r\n if (this.props.iconOnly) return;\r\n\r\n e.stopPropagation();\r\n if (this.state.expandType)\r\n this.setState({ expandType: false });\r\n else\r\n this.setState({\r\n expandPublic: false,\r\n expandRestricted: false,\r\n expandType: true\r\n });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n lcid: string;\r\n postType: string;\r\n full?: boolean;\r\n id: string;\r\n isRestricted?: boolean;\r\n stats?: PostViewStats;\r\n title: string;\r\n currentUserHasComplied?: boolean\r\n hideCompliance?: boolean\r\n status: string;\r\n iconOnly?: boolean;\r\n}\r\n\r\ninterface ComponentState {\r\n expandPublic: boolean;\r\n expandRestricted: boolean;\r\n expandType: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n clientSettings: state.settings.clientSettings,\r\n lcidMappings: state.resources.lcidMappings\r\n }),\r\n {\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\nexport default connector(PostTypeBanner);\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\n\r\nimport \"./breakingFeaturedBanner.sass\";\r\nimport { RouteComponentProps, withRouter } from \"react-router\";\r\n\r\n\r\ninterface IBanner {\r\n color: string;\r\n text: string;\r\n textStyle?: React.CSSProperties;\r\n description: string;\r\n}\r\n\r\ntype BannerTypes = \"breaking\" | \"featured\";\r\n\r\ntype Banners = { [bannerType in BannerTypes]: IBanner; };\r\n\r\nconst Banner: React.FunctionComponent<{banner: IBanner, detailed?: boolean}> = (props) => {\r\n const { banner } = props;\r\n\r\n return (\r\n
    \r\n
    \r\n {banner.text}\r\n
    \r\n {props.detailed &&\r\n
    \r\n {banner.description}\r\n
    \r\n }\r\n
    \r\n );\r\n}\r\n\r\n\r\nclass BreakingFeaturedBanner extends React.Component {\r\n public render() {\r\n const { specialtyPostColors, specialtyPostColorAdmin } = this.props;\r\n\r\n const colorsToUse = this.props.history.location.pathname.includes(\"/admin\")\r\n ? specialtyPostColorAdmin\r\n : specialtyPostColors;\r\n\r\n if (!colorsToUse || (!this.props.isBreaking && !this.props.isFeatured))\r\n return (null);\r\n\r\n const banners: Banners = {\r\n breaking: {\r\n color: (colorsToUse && colorsToUse.breaking) || \"#b72026\",\r\n text: this.onGetTranslatedText(\"breakingPost\") || \"BREAKING\",\r\n textStyle: { fontWeight: 700 },\r\n description: this.onGetTranslatedText(\"breakingBannerDescription\") || \"Breaking News! Share with colleagues, and spread the word.\"\r\n },\r\n featured: {\r\n color: (colorsToUse && colorsToUse.featured) || \"#599fa0\",\r\n text: this.onGetTranslatedText(\"featuredPost\") || \"FEATURED\",\r\n description: this.onGetTranslatedText(\"featuredBannerDescription\") || \"Keep in the loop and get the latest facts with our featured news and updates.\"\r\n }\r\n };\r\n\r\n return (\r\n \r\n {this.props.isBreaking\r\n ? this._breakingBanner(banners.breaking, this.props.detailed)\r\n : this._featuredBanner(banners.featured, this.props.detailed)\r\n }\r\n \r\n );\r\n }\r\n\r\n private _breakingBanner = (banner: IBanner, detailed?: boolean) => {\r\n if (!this.props.isBreaking)\r\n return (null);\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private _featuredBanner = (banner: IBanner, detailed?: boolean) => {\r\n if (!this.props.isFeatured)\r\n return (null);\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private onGetTranslatedText = (field: string) => {\r\n const { activeLcid, configTranslations, defaultLCID } = this.props;\r\n\r\n if (configTranslations[activeLcid])\r\n return configTranslations[activeLcid][field];\r\n else if (configTranslations[defaultLCID])\r\n return configTranslations[defaultLCID][field];\r\n\r\n return \"\";\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n activeLcid: string;\r\n detailed?: boolean;\r\n isBreaking?: boolean;\r\n isFeatured?: boolean;\r\n}\r\n\r\ninterface ComponentState {\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n configTranslations: state.settings.clientSettings.translatedContent,\r\n defaultLCID: state.settings.clientSettings.defaultLCID,\r\n specialtyPostColors: state.settings.clientSettings.specialtyPostColors,\r\n specialtyPostColorAdmin: state.settings.tenantSettings.specialtyPostColors,\r\n }),\r\n {\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps & RouteComponentProps<{}>;\r\nexport default withRouter(connector(BreakingFeaturedBanner));\r\n\r\n","import * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport * as actions from 'modules/posts/actionCreator';\r\n\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport { PostViewStats } from '../../../models';\r\n\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\n\r\n\r\nimport \"./compliance.sass\";\r\n\r\n\r\nclass Compliance extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n isSaving: false\r\n };\r\n }\r\n\r\n public render() {\r\n const { postType, stats, currentUserHasComplied } = this.props;\r\n\r\n if (postType !== 'compliance')\r\n return ;\r\n \r\n const acknowledgedCompliance = (\r\n \r\n \"complied\r\n {this.props.complianceText}\r\n \r\n );\r\n const unacknowledgedCompliance = (\r\n \r\n \r\n {this.props.complianceText}\r\n \r\n );\r\n const hasComplied = stats ? !!stats && !!stats.complianceTime : currentUserHasComplied;\r\n\r\n return (\r\n \r\n
    \r\n {hasComplied\r\n ? acknowledgedCompliance\r\n : unacknowledgedCompliance\r\n }\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n\r\n private onSendAcknowledgement = () => {\r\n this.setState({ isSaving: true });\r\n \r\n const postId = this.props.postId;\r\n this.props.sendAcknowledgement(postId).then(success => {\r\n if (success) {\r\n this.props.updatePostsFeed(\r\n this.props.postsFeed.map(post => post.id === postId\r\n ? { ...post, stats: { ...post.stats, complianceTime: new Date().toISOString() } }\r\n : post\r\n )\r\n );\r\n }\r\n this.setState({ isSaving: false });\r\n });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n complianceText: string;\r\n postId: string;\r\n postType: string;\r\n stats?: PostViewStats;\r\n currentUserHasComplied?: boolean\r\n}\r\n\r\ninterface ComponentState {\r\n isSaving: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n commentsEnabled: state.settings.tenantSettings.commentsEnabled,\r\n postsFeed: state.posts.postsFeed.postsFeed\r\n }),\r\n {\r\n sendAcknowledgement: actions.sendAcknowledgement,\r\n updatePostsFeed: actions.updatePostsFeed\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\nexport default connector(Compliance);","import * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport * as actions from 'modules/posts/actionCreator';\r\n\r\nimport { ReactionStat } from \"../../../models\";\r\n\r\n\r\nclass Reaction extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n puffOut: false\r\n };\r\n }\r\n\r\n public render() {\r\n const { reaction, preview } = this.props;\r\n const { puffOut } = this.state;\r\n\r\n return (\r\n \r\n {reaction.name}\r\n {reaction.sentiment}\r\n {reaction.count}\r\n \r\n );\r\n }\r\n\r\n private onSetReaction = (): void => {\r\n const { preview = false} = this.props;\r\n if (preview) return;\r\n\r\n if (!this.state.puffOut) {\r\n this.setState({ puffOut: true });\r\n this.props.setReaction(this.props.reaction.postId, !this.props.reaction.selected ? this.props.reaction.id : null);\r\n }\r\n }\r\n\r\n private onSetReactionEnd = (): void => {\r\n this.setState({ puffOut: false });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n preview?: boolean;\r\n reaction: ReactionStat;\r\n}\r\n\r\ninterface ComponentState {\r\n puffOut: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n }),\r\n {\r\n setReaction: actions.setReaction\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\nexport default connector(Reaction);\r\n","import * as React from 'react';\r\n\r\nimport { PostViewStats, Reaction as IReaction, ReactionStat } from '../../../models';\r\nimport Reaction from \"./reaction\";\r\n\r\n\r\nimport \"./reactions.sass\";\r\nimport { ClientSettingsReaction } from 'modules/settings';\r\n\r\n\r\nclass Reactions extends React.Component {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n public render() {\r\n const { stats, preview } = this.props;\r\n\r\n if (!stats || !this.props.reactionsEnabledOnTenant || !this.props.reactingEnabledOnPost || this.props.postType === 'compliance') {\r\n return (null);\r\n }\r\n\r\n const reactions: ReactionStat[] = this.getReactions(stats.reactions);\r\n\r\n return (\r\n
    \r\n
    {reactions.map(reaction => )}
    \r\n
    \r\n );\r\n }\r\n\r\n private getReactions = (postReactions: IReaction[]): ReactionStat[] => {\r\n const reactionsList = this.props.reactions.sort((a, b) => a.order - b.order);\r\n const reactions = reactionsList.map(reaction => {\r\n const matchFound = postReactions.filter(postReaction => postReaction.id === reaction.id);\r\n if (matchFound && matchFound.length > 0) {\r\n const match = matchFound[0];\r\n return {\r\n postId: this.props.stats.postId,\r\n id: reaction.id,\r\n sentiment: reaction.sentiment,\r\n name: reaction.name,\r\n count: match.count,\r\n selected: match.selected\r\n } as ReactionStat;\r\n }\r\n return {\r\n postId: this.props.stats.postId,\r\n id: reaction.id,\r\n sentiment: reaction.sentiment,\r\n name: reaction.name,\r\n count: 0\r\n } as ReactionStat;\r\n });\r\n return reactions;\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n postType: string;\r\n reactingEnabledOnPost: boolean;\r\n stats: PostViewStats;\r\n reactionsEnabledOnTenant: boolean;\r\n reactions: ClientSettingsReaction[];\r\n preview?: boolean;\r\n}\r\n\r\ninterface ComponentState {\r\n}\r\n\r\nexport default Reactions;\r\n","import React from \"react\";\r\n\r\nimport { Editor } from \"@tinymce/tinymce-react\";\r\nimport { Editor as IEditor } from \"tinymce\";\r\n\r\nimport { acceptableLanguages, spellcheckerRpcUrl } from 'utils/spellcheckLanguages';\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as actions from 'modules/posts/actionCreator';\r\n\r\ninterface IBasicTinyMceProps {\r\n placeholder?: string;\r\n editorRef: React.MutableRefObject;\r\n gifRef: React.MutableRefObject;\r\n disabled?: boolean;\r\n value?: string;\r\n id: string;\r\n isGifsVisible: boolean;\r\n onChangeIsGifsVisible: (value: boolean) => void;\r\n onChange: (newText: string, event: IEditor) => void;\r\n initializeCallback?: () => void;\r\n}\r\n\r\n/**\r\n * A tiny mce text box with basic plugins\r\n */\r\nconst BasicTinyMceComponent: React.FunctionComponent = ({\r\n placeholder,\r\n commentMaxLength,\r\n editorRef,\r\n gifRef,\r\n defaultLcid,\r\n tenantGifsEnabled,\r\n value,\r\n disabled,\r\n id,\r\n isGifsVisible,\r\n onChangeIsGifsVisible,\r\n grabMentionUsers,\r\n onChange,\r\n initializeCallback\r\n}) => {\r\n const setup = (editor: IEditor) => {\r\n editor.on(\"init\", (e) =>{\r\n editorRef.current = editor;\r\n if(initializeCallback) \r\n initializeCallback();\r\n });\r\n\r\n editor.options.register('tenor_visible', {\r\n processor: 'boolean',\r\n default: isGifsVisible\r\n });\r\n\r\n if (tenantGifsEnabled) {\r\n editor.ui.registry.addToggleButton('gifs', {\r\n icon: 'embed',\r\n text: 'GIF',\r\n onAction: function (api) {\r\n gifRef.current = api;\r\n api.setActive(!api.isActive())\r\n editor.options.set('tenor_visible', !editor.options.get('tenor_visible'))\r\n\r\n onChangeIsGifsVisible(editor.options.get('tenor_visible'));\r\n }\r\n });\r\n }\r\n\r\n const onAction = function (autocompleteApi, rng, value) {\r\n editor.selection.setRng(rng);\r\n editor.insertContent(`@${value.name} `);\r\n autocompleteApi.hide();\r\n }\r\n\r\n editor.ui.registry.addAutocompleter('specialchars', {\r\n ch: '@',\r\n minChars: 0,\r\n columns: 1,\r\n highlightOn: ['name_text', 'email_text'],\r\n onAction: onAction,\r\n fetch: async function (pattern) {\r\n let results = await grabMentionUsers(pattern);\r\n\r\n const userData = results.map(u => ({\r\n fullName: (u.firstName === \"\" ? \"[Unknown]\" : u.firstName + ' ' + u.lastName),\r\n email: u.email, id: u.id, color: u.color, firstName: u.firstName, lastName: u.lastName, initials: u.firstName === \"\" || u.lastName === \"\" ? \"Un\" : u.firstName[0] + u.lastName[0]\r\n }));\r\n\r\n return userData.map(function (char) {\r\n let colorForAvatar = char.color;\r\n if (char.color !== null && char.color !== \"\")\r\n colorForAvatar = colorForAvatar.substr(1);\r\n\r\n return {\r\n type: 'cardmenuitem',\r\n value: ({ id: char.id, name: char.fullName === \"[Unknown]\" ? char.email : char.fullName }),\r\n label: char.fullName,\r\n items: [\r\n {\r\n type: 'cardcontainer',\r\n direction: 'horizontal',\r\n items: [\r\n {\r\n type: 'cardtext',\r\n text: char.initials,\r\n name: 'name_image',\r\n classes: ['mentions-icon-formatting', 'avatar-color-' + colorForAvatar]\r\n },\r\n {\r\n type: 'cardcontainer',\r\n direction: 'vertical',\r\n items: [\r\n {\r\n type: 'cardtext',\r\n text: char.fullName,\r\n name: 'name_text'\r\n },\r\n {\r\n type: 'cardtext',\r\n text: char.email,\r\n name: 'email_text',\r\n classes: ['mentions-email-formatting']\r\n }\r\n ]\r\n }]\r\n }\r\n ]\r\n }\r\n }).slice(0, 6);\r\n }\r\n });\r\n }\r\n\r\n let spellcheckEnabled = true;\r\n let spellcheckLanguage = defaultLcid.substring(0, 2)?.toLocaleLowerCase() ?? \"en\";\r\n\r\n if (!acceptableLanguages.includes(spellcheckLanguage.toLocaleLowerCase())) {\r\n spellcheckLanguage = \"en\";\r\n spellcheckEnabled = false;\r\n }\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IBasicTinyMceProps) => ({\r\n ...ownProps,\r\n commentMaxLength: state.settings.clientSettings.commentSystem.commentMaxLength,\r\n defaultLcid: state.settings.tenantSettings.defaultLCID,\r\n tenantGifsEnabled: state.settings.tenantSettings.gifSelectionEnabledForComments\r\n }),\r\n {\r\n grabMentionUsers: actions.getMentionsUsers\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\nexport const BasicTinyMce = connector(BasicTinyMceComponent);\r\n","import React, { Dispatch } from \"react\";\r\nimport { Editor as IEditor} from \"tinymce\";\r\n\r\nexport const handleTinyText = (setText: Dispatch, setPlaintext: Dispatch, setCount: Dispatch, editor: IEditor) => {\r\n setText(editor.getContent())\r\n setPlaintext(editor.getContent({ format: 'text' }))\r\n\r\n setCount(editor.getContent({ format: 'text' }).length + ((editor.getContent().match(/, setGifsVisible: Dispatch, editorRef: React.MutableRefObject, gifRef: any) => {\r\n if (!editorRef.current) return;\r\n\r\n editorRef.current.insertContent('\"gif');\r\n if (editorRef.current.getContent({ format: 'text' }).trim().length === 0) {\r\n setPlaintext(\"📷 GIF\");\r\n }\r\n\r\n gifRef.current.setActive(false)\r\n editorRef.current.options.set('tenor_visible', false);\r\n setGifsVisible(false);\r\n};","import { Button } from \"@mui/material\";\r\nimport * as React from 'react';\r\n\r\ninterface ComponentProps {\r\n onAdd: () => void;\r\n onAddDisabled: boolean;\r\n onCancel?: () => void;\r\n letterCount: number;\r\n maxLength: number;\r\n}\r\n\r\nconst TextboxButtons: React.FC = (props) => {\r\n const { onAdd, onAddDisabled, onCancel, letterCount, maxLength } = props;\r\n const isReply = !!onCancel;\r\n\r\n return (\r\n
    \r\n \r\n Submit\r\n \r\n\r\n {isReply &&\r\n \r\n Discard\r\n \r\n }\r\n
    {letterCount}/{maxLength}
    \r\n
    \r\n );\r\n}\r\n\r\nexport default TextboxButtons;","import { useEffect } from 'react';\r\nimport * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { Editor as IEditor} from \"tinymce\";\r\n\r\nimport { BasicTinyMce } from 'modules/common/components/basicTinyMce';\r\nimport * as actions from 'modules/posts/actionCreator';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport { addGif, handleTinyText } from 'utils/textEditorUtils';\r\nimport TextboxButtons from './textboxButtons';\r\n\r\nimport Tenor from 'react-tenor';\r\nimport 'react-tenor/dist/styles.css'\r\n\r\ninterface ComponentProps {\r\n placeholder: string\r\n postId: string\r\n preview?: boolean;\r\n}\r\n\r\nconst MentionTextbox: React.FunctionComponent = ({\r\n placeholder,\r\n commentMaxLength,\r\n savingComment,\r\n postId,\r\n preview = false,\r\n addComment,\r\n}) => {\r\n const [text, setText] = React.useState(\"\");\r\n const [letterCount, setCount] = React.useState(0);\r\n const [bodyPlaintext, setBodyPlaintext] = React.useState(\"\");\r\n const [gifsVisible, setGifsVisible] = React.useState(false);\r\n const textRef = React.useRef(null)\r\n const editorRef = React.useRef(null);\r\n const gifRef = React.useRef(null);\r\n\r\n const isOnlyWhitespace = React.useMemo(() => {\r\n let isOnlyWhitespace = true;\r\n if (editorRef.current)\r\n isOnlyWhitespace = (bodyPlaintext.trim() === \"\" && editorRef.current.getContent().match(/ {\r\n return () => {\r\n if (timeout)\r\n clearTimeout(timeout);\r\n }\r\n }, [timeout]);\r\n\r\n const onAdd = () => {\r\n if (!editorRef.current) return;\r\n\r\n commentCooldown = true;\r\n timeout = setTimeout(() => { commentCooldown = false }, 1000);\r\n\r\n let plain = bodyPlaintext;\r\n let content = editorRef.current.getContent();\r\n let hasGif = content?.match(/ 0 && bodyPlaintext === \"\") {\r\n plain = \"📷 GIF\";\r\n }\r\n\r\n addComment(postId, text, plain).then((response) => {\r\n if (response) {\r\n setText('')\r\n setBodyPlaintext('')\r\n setCount(0)\r\n }\r\n });\r\n }\r\n\r\n return (\r\n
    \r\n {gifsVisible ?\r\n
    \r\n addGif(result, setBodyPlaintext, setGifsVisible, editorRef, gifRef)} \r\n token={'A9HCCDQ5VCW0'} \r\n defaultResults={true} \r\n autoFocus={true} \r\n searchPlaceholder={\"Search GIFs\"} \r\n />\r\n
    \r\n : null}\r\n
    \r\n setGifsVisible(value)}\r\n placeholder={placeholder}\r\n editorRef={editorRef}\r\n gifRef={gifRef}\r\n value={text}\r\n id={'tiny-comment-editor'}\r\n onChange={() => handleTinyText(setText, setBodyPlaintext, setCount, editorRef.current!)}\r\n disabled={preview || savingComment || commentCooldown}\r\n />\r\n
    \r\n commentMaxLength || isOnlyWhitespace || gifsVisible}\r\n letterCount={letterCount}\r\n maxLength={commentMaxLength}\r\n />\r\n
    \r\n )\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n commentMaxLength: state.settings.clientSettings.commentSystem.commentMaxLength,\r\n savingComment: state.posts.postView.savingComment,\r\n }),\r\n {\r\n addComment: actions.addComment,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\nexport default connector(MentionTextbox);\r\n","import * as React from \"react\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogContentText from \"@mui/material/DialogContentText\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\n\r\n\r\nclass DeleteComment extends React.Component {\r\n public render() {\r\n return (\r\n \r\n {`Delete Comment${this.props.hasReplies ? \"s\" : \"\"}`}\r\n \r\n {this.props.hasReplies && \"You're about to delete a comment and its replies. \"} This action cannot be undone. Are you sure you want to delete this comment?\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private onConfirm = () => {\r\n this.props.onConfirm();\r\n }\r\n\r\n private onCancel = () => {\r\n this.props.onCancel();\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n hasReplies: boolean;\r\n onConfirm: () => void;\r\n onCancel: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n}\r\n\r\nexport default DeleteComment;","import * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport Button from \"@mui/material/Button\";\r\n\r\nimport Tenor from 'react-tenor';\r\nimport 'react-tenor/dist/styles.css'\r\nimport { BasicTinyMce } from 'modules/common/components/basicTinyMce';\r\n\r\nexport interface IEditCommentProps {\r\n text: string;\r\n onEdit: (bodyFormatted: string, bodyPlain: string) => Promise;\r\n onCancel: () => void;\r\n editButtonText: string;\r\n cancelText: string;\r\n disabled?: boolean;\r\n}\r\n\r\nexport interface IEditCommentState {\r\n bodyPlaintext: string;\r\n bodyFormatted: string;\r\n charsCount: number;\r\n snapshot: string;\r\n}\r\n\r\nexport class EditComment extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n const { bodyPlain, bodyFormatted } = props;\r\n\r\n this.state = {\r\n bodyPlain: bodyPlain,\r\n bodyFormatted: bodyFormatted,\r\n charsCount: bodyPlain ? bodyPlain.length : 0,\r\n snapshot: bodyFormatted,\r\n gifsVisible: false,\r\n imageVisible: false,\r\n editorRef: React.createRef(),\r\n gifRef: React.createRef()\r\n };\r\n }\r\n\r\n public render() {\r\n const { commentMaxLength, onCancel, savingComment } = this.props;\r\n const { bodyPlain, bodyFormatted, charsCount, gifsVisible, editorRef, gifRef } = this.state;\r\n\r\n let onlyWhitespace = true;\r\n if (editorRef.current != null)\r\n onlyWhitespace = (bodyPlain.trim() === \"\" && editorRef.current.getContent().match(/\r\n {gifsVisible ?\r\n
    \r\n this.addGif(result)} token={'A9HCCDQ5VCW0'} defaultResults={true} autoFocus={true} limit={8} contentFilter={\"high\"} />\r\n
    \r\n : null}\r\n this.setState({ ...this.state, gifsVisible: value })}\r\n editorRef={editorRef}\r\n gifRef={gifRef}\r\n id=\"edit-comment-tiny\"\r\n value={bodyFormatted}\r\n onChange={this.handleTinyText}\r\n disabled={savingComment}\r\n />\r\n
    \r\n
    \r\n \r\n {onCancel &&\r\n \r\n }\r\n
    \r\n
    {charsCount}/{commentMaxLength}
    \r\n
    \r\n \r\n );\r\n }\r\n\r\n private handleTinyText = (event, editor) => {\r\n var count = (editor.getContent({ format: 'text' }).length + ((editor.getContent().match(/ {\r\n var plain = this.state.bodyPlain;\r\n if ((this.state.editorRef.current.getContent().match(/ 0) && this.state.bodyPlain === \"\") {\r\n plain = \"📷 GIF\";\r\n }\r\n this.props.onEdit(this.state.bodyFormatted, plain, this.state.snapshot).then((response) => {\r\n if(this.props.confirmCallback)\r\n this.props.confirmCallback();\r\n\r\n if (response) {\r\n this.props.onCancel();\r\n }\r\n })\r\n }\r\n\r\n private addGif = (result) => {\r\n this.state.editorRef.current.insertContent('\"gif');\r\n if (this.state.editorRef.current.getContent({ format: 'text' }).length === 0) {\r\n this.setState({ charsCount: 1, bodyPlain: \"📷 GIF\" })\r\n }\r\n\r\n var editedState = this.state.editorRef;\r\n editedState.current.options.set('tenor_visible', false);\r\n\r\n var toggledOffGif = this.state.gifRef;\r\n toggledOffGif.current.setActive(false);\r\n\r\n this.setState({ gifsVisible: false, editorRef: editedState, gifRef: toggledOffGif })\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n bodyPlain: string;\r\n bodyFormatted: string;\r\n onEdit: (bodyFormatted: string, bodyPlain: string, snapshot: string) => Promise;\r\n onCancel: () => void;\r\n confirmCallback?: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n bodyPlain: string;\r\n bodyFormatted: string;\r\n charsCount: number;\r\n snapshot: string;\r\n gifsVisible: boolean;\r\n imageVisible: boolean;\r\n editorRef: any;\r\n gifRef: any;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n commentMaxLength: state.settings.tenantSettings.commentMaxLength,\r\n savingComment: state.posts.postView.savingComment,\r\n }),\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\nexport default connector(EditComment);\r\n","import * as React from \"react\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogContentText from \"@mui/material/DialogContentText\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\n\r\n\r\nclass FlagComment extends React.Component {\r\n public render() {\r\n return (\r\n \r\n Report as Inappropriate\r\n \r\n Are you sure you want to flag and report this content as inappropriate?\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private onConfirm = () => {\r\n this.props.onConfirm();\r\n }\r\n\r\n private onCancel = () => {\r\n this.props.onCancel();\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n onConfirm: () => void;\r\n onCancel: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n}\r\n\r\nexport default FlagComment;","import * as React from 'react';\r\nimport { Comment } from '../../../models';\r\nimport { StarBorder, KeyboardReturn, Star } from '@mui/icons-material';\r\nimport { Button } from '@mui/material';\r\n\r\nconst CommentFooter: React.FunctionComponent = (props) => {\r\n const { comment, pendingStar, isAuthor, onReply } = props;\r\n const replyCount = comment.replyCount ?? 0;\r\n const starCount = comment.starCount ?? 0;\r\n\r\n const formattedLikes = starCount.toLocaleString() ?? 0;\r\n const formattedReplies = replyCount.toLocaleString() ?? 0;\r\n const commentLiked = comment.starredByCurrentUser;\r\n \r\n const handleLikeClick = () => {\r\n if(!pendingStar && !isAuthor) {\r\n if(commentLiked) {\r\n props.onDestar(comment);\r\n }\r\n else {\r\n props.onStar(comment);\r\n }\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n {starCount > 0 &&\r\n <>\r\n {commentLiked || isAuthor\r\n ? \r\n : \r\n }\r\n \r\n {formattedLikes}\r\n \r\n }\r\n
    \r\n\r\n |\r\n\r\n
    \r\n \r\n\r\n {replyCount > 0 && comment.repliesPreview.length > 0 &&\r\n <>\r\n \r\n {formattedReplies}\r\n \r\n }\r\n
    \r\n
    \r\n )\r\n}\r\n\r\ninterface ComponentProps {\r\n comment: Comment;\r\n onStar: (comment: Comment) => void;\r\n onDestar: (comment: Comment) => void;\r\n onReply: (comment: Comment) => void;\r\n pendingStar: boolean;\r\n isAuthor: boolean;\r\n}\r\n\r\nexport default CommentFooter;","import React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport * as actions from 'modules/posts/actionCreator';\r\nimport moment from \"moment\";\r\n\r\nimport { Comment as IComment } from '../../../models';\r\nimport DeleteCommentConfirmation from \"./deleteComment\";\r\nimport EditComment from \"./editComment\";\r\nimport FlagCommentConfirmation from \"./flagComment\";\r\n\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport Popover from \"@mui/material/Popover\";\r\n\r\nimport MoreVertIcon from \"@mui/icons-material/MoreVert\";\r\nimport CommentFooter from './commentFooter';\r\n\r\n\r\nconst Commands: React.FunctionComponent<{ comment: IComment, commandMenu: CommandMenu[], flaggedIcon: JSX.Element, savingComment: boolean, deletionEnabled: boolean, isAuthor: boolean }> = props => {\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n\r\n const { comment, commandMenu, isAuthor } = props;\r\n\r\n let commandsToUse = commandMenu;\r\n\r\n if (!comment.flaggedByCurrentUser && !commandMenu.length)\r\n return ;\r\n\r\n if (!props.deletionEnabled && !isAuthor) {\r\n commandsToUse = commandMenu.filter(c => c.text !== \"Delete\");\r\n }\r\n\r\n return (\r\n
    \r\n {comment.flaggedByCurrentUser && props.flaggedIcon}\r\n {commandsToUse.length > 0 &&\r\n \r\n setAnchorEl(e.currentTarget)}>\r\n \r\n \r\n setAnchorEl(null)}\r\n anchorOrigin={{\r\n vertical: \"bottom\",\r\n horizontal: \"right\",\r\n }}\r\n transformOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"right\",\r\n }}\r\n >\r\n \r\n {commandsToUse.map((command, index) =>\r\n {\r\n command.onClick();\r\n setAnchorEl(null);\r\n }}\r\n >\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n }\r\n
    \r\n );\r\n}\r\n\r\nclass Comment extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n isEditing: false,\r\n pendingDeletion: false,\r\n pendingFlag: false,\r\n pendingStar: false,\r\n showDeleteConfirmation: false,\r\n showFlagConfirmation: false\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public render() {\r\n const { comment, userId, onReply } = this.props;\r\n const { isEditing, pendingDeletion, pendingStar, showDeleteConfirmation, showFlagConfirmation } = this.state;\r\n \r\n const isAuthor = userId === comment.author.id;\r\n\r\n const flaggedIcon: JSX.Element = (\r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n\r\n let commandMenu: CommandMenu[] = [];\r\n\r\n const formattedDate = moment(comment.createdTime).fromNow();\r\n const initials = comment.author.name ? comment.author.name[0] : '';\r\n\r\n if (!isAuthor && !comment.flaggedByCurrentUser) {\r\n commandMenu.push(\r\n {\r\n text: \"Report as inappropriate\",\r\n onClick: this.onFlagClick\r\n }\r\n );\r\n }\r\n\r\n if (comment.isEditable) {\r\n if (isAuthor) {\r\n commandMenu.push(\r\n {\r\n text: \"Edit\",\r\n onClick: this.onEditClick,\r\n disabled: this.props.editingComment\r\n }\r\n );\r\n }\r\n commandMenu.push(\r\n {\r\n text: \"Delete\",\r\n textColor: \"#B72026\",\r\n onClick: this.onDeleteClick\r\n }\r\n );\r\n }\r\n\r\n const wasEdited = comment.updatedTime !== null && comment.updatedTime !== comment.createdTime &&\r\n
    edited
    ;\r\n\r\n const body = (\r\n \r\n
    {comment.formattedBody === null ? comment.body :
    }
    \r\n {wasEdited}\r\n \r\n );\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    {initials}
    \r\n
    \r\n
    \r\n
    \r\n
    {comment.author.name}
    \r\n
    {formattedDate}
    \r\n
    \r\n {!isEditing\r\n ? body\r\n : \r\n }\r\n \r\n
    \r\n 0}/>\r\n \r\n
    \r\n \r\n
    \r\n );\r\n }\r\n\r\n private onDeleteClick = () => this.setState({ showDeleteConfirmation: true });\r\n private onDeleteConfirm = () => {\r\n this.setState({ pendingDeletion: true });\r\n this.onEditCancel();\r\n this.handleDelete();\r\n this.onDeleteDismiss();\r\n }\r\n private onDeleteDismiss = () => this.setState({ showDeleteConfirmation: false });\r\n\r\n private onEditClick = () => {\r\n if(!this.props.editingComment) {\r\n this.setState({ isEditing: true }); \r\n this.props.toggleEdit(true);\r\n }\r\n }\r\n\r\n private onEditConfirm = (htmlBody: string, plainBody: string, snapshot: string) => this.props.editComment(this.props.comment.id, htmlBody, plainBody, snapshot);\r\n \r\n private onEditCancel = () => { \r\n this.props.toggleEdit(false);\r\n this.setState({ isEditing: false });\r\n }\r\n \r\n private onFlagClick = () => this.setState({ showFlagConfirmation: true });\r\n private onFlagConfirm = () => {\r\n this.handleFlag();\r\n this.onFlagDismiss();\r\n }\r\n private onFlagDismiss = () => this.setState({ showFlagConfirmation: false });\r\n\r\n private onStarClick = () => {\r\n this.setState({ pendingStar: true });\r\n this.props.onStar(this.props.comment.id).then(() => {\r\n this.setState({ pendingStar: false });\r\n \r\n if(this.props.confirmCallback) {\r\n this.props.confirmCallback();\r\n }\r\n });\r\n }; \r\n\r\n private onDestarClick = () => {\r\n this.setState({ pendingStar: true });\r\n this.props.onDestar(this.props.comment.id).then(() => {\r\n this.setState({ pendingStar: false });\r\n \r\n if(this.props.confirmCallback) {\r\n this.props.confirmCallback();\r\n }\r\n });\r\n }\r\n\r\n private handleDelete = () => {\r\n this.props.deleteComment(this.props.comment.id).then(_ => {\r\n this.setState({ pendingDeletion: false });\r\n\r\n if(this.props.isReply && this.props.confirmCallback) {\r\n this.props.confirmCallback();\r\n }\r\n });\r\n }\r\n private handleFlag = (): Promise => {\r\n return new Promise((resolve) => {\r\n this.props.flagComment(this.props.comment.id).then(_ => {\r\n resolve();\r\n\r\n if(this.props.confirmCallback) {\r\n this.props.confirmCallback();\r\n }\r\n })\r\n });\r\n }\r\n}\r\n\r\n\r\ninterface CommandMenu {\r\n text: string;\r\n textColor?: string;\r\n disabled?: boolean;\r\n onClick: () => void;\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n comment: IComment;\r\n onStar: (toStarId: string) => Promise;\r\n onDestar: (toStarId: string) => Promise;\r\n editingComment: boolean;\r\n toggleEdit: (isEditing: boolean) => void;\r\n onReply: (comment: IComment) => void;\r\n confirmCallback?: () => void;\r\n isReply?: boolean;\r\n}\r\n\r\ninterface ComponentState {\r\n isEditing: boolean;\r\n pendingDeletion: boolean;\r\n pendingFlag: boolean;\r\n pendingStar: boolean;\r\n showDeleteConfirmation: boolean;\r\n showFlagConfirmation: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n savingComment: state.posts.postView.savingComment,\r\n userId: state.settings.currentUser.userId,\r\n deletionEnabled: state.settings.tenantSettings.commentModerationEnabled\r\n }),\r\n {\r\n deleteComment: actions.deleteComment,\r\n destarComment: actions.destarComment,\r\n editComment: actions.editComment,\r\n flagComment: actions.flagComment,\r\n starComment: actions.starComment\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\nexport default connector(Comment);","import { useEffect } from 'react';\r\nimport * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { Bookmark, Editor as IEditor} from \"tinymce\";\r\n\r\nimport { BasicTinyMce } from 'modules/common/components/basicTinyMce';\r\nimport * as actions from 'modules/posts/actionCreator';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\n\r\nimport Tenor from 'react-tenor';\r\nimport 'react-tenor/dist/styles.css'\r\nimport { ReplyDetails } from 'modules/posts/models';\r\nimport { addGif, handleTinyText } from 'utils/textEditorUtils';\r\nimport TextboxButtons from './textboxButtons';\r\n\r\ninterface ComponentProps {\r\n placeholder: string\r\n postId: string\r\n preview?: boolean;\r\n parentCommentId: string;\r\n replyDetails: ReplyDetails;\r\n repliesExpanded: boolean;\r\n loadReplies: () => void;\r\n onCancelReply: () => void;\r\n}\r\n\r\nconst ReplyTextbox: React.FunctionComponent = ({\r\n placeholder,\r\n commentMaxLength,\r\n savingComment,\r\n postId,\r\n preview = false,\r\n addCommentReply,\r\n replyDetails,\r\n parentCommentId,\r\n repliesExpanded,\r\n loadReplies,\r\n onCancelReply\r\n}) => {\r\n const [text, setText] = React.useState(\"\");\r\n const [letterCount, setCount] = React.useState(0);\r\n const [bodyPlaintext, setBodyPlaintext] = React.useState(\"\");\r\n const [gifsVisible, setGifsVisible] = React.useState(false);\r\n const [startBookmark, setStartBookmark] = React.useState();\r\n const textRef = React.useRef(null)\r\n const editorRef = React.useRef(null);\r\n const gifRef = React.useRef(null);\r\n\r\n const isOnlyWhitespace = React.useMemo(() => {\r\n let isOnlyWhitespace = true;\r\n if (editorRef.current)\r\n isOnlyWhitespace = (bodyPlaintext.trim() === \"\" && editorRef.current.getContent().match(/ {\r\n return () => {\r\n if (timeout)\r\n clearTimeout(timeout);\r\n }\r\n }, [timeout]);\r\n\r\n useEffect(() => {\r\n if (!editorRef.current) return;\r\n\r\n let oldMention = editorRef.current.dom.get(\"initial-reply-mention\");\r\n\r\n if(oldMention !== null) {\r\n oldMention.setAttribute(\"data-user-id\", replyDetails.id);\r\n oldMention.childNodes[0].nodeValue = \"@\"+replyDetails.name;\r\n }\r\n else {\r\n editorRef.current.selection.moveToBookmark(startBookmark!);\r\n editorRef.current.insertContent(`@${replyDetails.name}`);\r\n }\r\n }, [replyDetails]);\r\n\r\n const onAdd = () => {\r\n if (!editorRef.current) return;\r\n\r\n commentCooldown = true;\r\n timeout = setTimeout(() => { commentCooldown = false }, 1000);\r\n\r\n let plain = bodyPlaintext;\r\n let content = editorRef.current.getContent();\r\n let hasGif = content?.match(/ 0 && bodyPlaintext === \"\") {\r\n plain = \"📷 GIF\";\r\n }\r\n\r\n addCommentReply(postId, text, plain, parentCommentId).then((response) => {\r\n if (response) {\r\n setText('');\r\n setBodyPlaintext('');\r\n setCount(0);\r\n\r\n if(repliesExpanded) {\r\n loadReplies();\r\n }\r\n }\r\n });\r\n };\r\n\r\n const initializeCallback = () => {\r\n if(editorRef.current) {\r\n let startBookmark = editorRef.current.selection.getBookmark(1, true);\r\n setStartBookmark(startBookmark);\r\n editorRef.current.insertContent(`@${replyDetails.name}`);\r\n }\r\n }\r\n\r\n return (\r\n
    \r\n {gifsVisible ?\r\n
    \r\n addGif(result, setBodyPlaintext, setGifsVisible, editorRef, gifRef)} \r\n token={'A9HCCDQ5VCW0'} \r\n defaultResults={true} \r\n autoFocus={true} \r\n searchPlaceholder={\"Search GIFs\"} \r\n />\r\n
    \r\n : null}\r\n
    \r\n setGifsVisible(value)}\r\n placeholder={placeholder}\r\n editorRef={editorRef}\r\n gifRef={gifRef}\r\n value={text}\r\n id={`tiny-comment-editor-reply-${parentCommentId}`}\r\n onChange={() => handleTinyText(setText, setBodyPlaintext, setCount, editorRef.current!)}\r\n disabled={preview || savingComment || commentCooldown}\r\n initializeCallback={initializeCallback}\r\n />\r\n
    \r\n commentMaxLength || isOnlyWhitespace || gifsVisible}\r\n onCancel={onCancelReply}\r\n letterCount={letterCount}\r\n maxLength={commentMaxLength}\r\n />\r\n
    \r\n )\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n commentMaxLength: state.settings.clientSettings.commentSystem.commentMaxLength,\r\n savingComment: state.posts.postView.savingComment,\r\n }),\r\n {\r\n addCommentReply: actions.addCommentReply,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\nexport default connector(ReplyTextbox);\r\n","import * as React from 'react';\r\nimport { useState } from 'react';\r\nimport { Comment as IComment, ReplyDetails } from '../../../models';\r\nimport { Button } from '@mui/material';\r\nimport Comment from './comment';\r\nimport ReplyTextbox from './replyTextbox';\r\n\r\n\r\ninterface ComponentProps {\r\n parentComment: IComment;\r\n postId: string;\r\n fetchAllReplies: (parentId: string) => any;\r\n onStar: (toStarId: string) => Promise;\r\n onDestar: (toStarId: string) => Promise;\r\n editingComment: boolean;\r\n toggleEdit: (isEditing: boolean) => void;\r\n}\r\n\r\nconst ReplySection: React.FunctionComponent = (props) => {\r\n const {parentComment, postId, fetchAllReplies, onStar, onDestar, editingComment, toggleEdit} = props;\r\n\r\n const [replyDetails, setReplyDetails] = useState({name: \"\", id: \"\", time: \"\"});\r\n const [replyTextboxVisible, setReplyTextboxVisible] = useState(false);\r\n const [loadingReplies, setLoadingReplies] = useState(false);\r\n const [allRepliesVisible, setAllRepliesVisible] = useState(false);\r\n const [allReplies, setAllReplies] = useState([]);\r\n\r\n const repliesLoadable = (parentComment.replyCount ?? 0) > 2 && (allReplies.length === 0);\r\n\r\n const onReplyToChild = (comment: IComment) => {\r\n let newReply = {name: comment.author.name, id: comment.author.id, time: new Date().toISOString()};\r\n\r\n setReplyDetails(newReply);\r\n setReplyTextboxVisible(true);\r\n }\r\n\r\n const toggleAllRepliesForParent = async () => {\r\n setLoadingReplies(true);\r\n\r\n let parentReplies = await fetchAllReplies(parentComment.id);\r\n setAllRepliesVisible(true);\r\n setAllReplies(parentReplies);\r\n setLoadingReplies(false);\r\n }\r\n\r\n const onCancelReply = () => {\r\n setReplyTextboxVisible(false);\r\n }\r\n\r\n return (\r\n
    \r\n onReplyToChild(parentComment)}\r\n />\r\n\r\n
    \r\n {allRepliesVisible &&\r\n
    \r\n {allReplies.map(reply => \r\n props.onStar(id)} \r\n onDestar={(id) => props.onDestar(id)}\r\n onReply={() => onReplyToChild(reply)}\r\n confirmCallback={toggleAllRepliesForParent}\r\n isReply\r\n />\r\n )}\r\n
    \r\n }\r\n\r\n {parentComment.repliesPreview.length > 0 && !allRepliesVisible &&\r\n
    \r\n {parentComment.repliesPreview.map(reply => \r\n props.onStar(id)} \r\n onDestar={(id) => props.onDestar(id)}\r\n onReply={() => onReplyToChild(reply)}\r\n isReply\r\n />\r\n )}\r\n
    \r\n }\r\n\r\n {repliesLoadable &&\r\n \r\n }\r\n\r\n {replyTextboxVisible && \r\n
    \r\n 0 ? \"Leave a reply\" : \"Be the first to reply\"}\r\n postId={postId}\r\n parentCommentId={parentComment.id} \r\n replyDetails={replyDetails}\r\n repliesExpanded={allRepliesVisible}\r\n loadReplies={toggleAllRepliesForParent}\r\n onCancelReply={onCancelReply}\r\n /> \r\n
    \r\n }\r\n
    \r\n
    \r\n )\r\n}\r\n\r\nexport default ReplySection;","import React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport * as actions from 'modules/posts/actionCreator';\r\n\r\nimport { Comment as IComment } from '../../../models';\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport Popover from \"@mui/material/Popover\";\r\n\r\nimport NotificationsNoneOutlinedIcon from \"@mui/icons-material/NotificationsNoneOutlined\";\r\nimport NotificationsOffOutlinedIcon from \"@mui/icons-material/NotificationsOffOutlined\";\r\n\r\n\r\nimport \"./comments.sass\";\r\nimport MentionTextbox from './mentionTextbox';\r\nimport ReplySection from './replySection';\r\n\r\n\r\nconst SortSelector: React.FunctionComponent<{ sortByOldestFirst: boolean, onSortByOldestFirst: (sortByOldestFirst: boolean) => void }> = props => {\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n\r\n return (\r\n \r\n setAnchorEl(e.currentTarget)}\r\n className=\"sort-selector\"\r\n >\r\n {props.sortByOldestFirst ? \"Oldest First\" : \"Newest First\"}\r\n \r\n setAnchorEl(null)}\r\n anchorOrigin={{\r\n vertical: \"center\",\r\n horizontal: \"right\",\r\n }}\r\n transformOrigin={{\r\n vertical: \"center\",\r\n horizontal: \"right\",\r\n }}\r\n >\r\n \r\n {\r\n props.onSortByOldestFirst(false);\r\n setAnchorEl(null);\r\n }}\r\n >\r\n \r\n \r\n {\r\n props.onSortByOldestFirst(true);\r\n setAnchorEl(null);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nclass Comments extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n pendingSubscribe: false,\r\n sortByOldestFirst: false,\r\n editingComment: false,\r\n };\r\n }\r\n\r\n public render() {\r\n const { comments, containerStyle, preview = false } = this.props;\r\n const { sortByOldestFirst, editingComment } = this.state;\r\n\r\n if (!comments || !this.props.commentsEnabledOnPost || !this.props.commentsEnabledOnTenant) {\r\n return (null);\r\n }\r\n\r\n const hasComments = !!comments && !!comments.length;\r\n \r\n const commentTotal = comments.reduce((currentTotal, comment) => {\r\n return currentTotal + (comment.replyCount ?? 0) + 1;\r\n }, 0 as number);\r\n const numberOfComments = hasComments ? ` (${commentTotal.toLocaleString()})` : '';\r\n\r\n const parentComments = comments.filter(c => c.parentId === null);\r\n const sortedComments = sortByOldestFirst ? this.sortByOldestFirst(parentComments) : this.sortByNewestFirst(parentComments);\r\n\r\n return (\r\n
    \r\n
    \r\n Comments{numberOfComments}\r\n {this.props.showSubscription &&\r\n (this.props.isSubscribed\r\n ? \r\n \r\n \r\n : \r\n \r\n \r\n )\r\n }\r\n
    \r\n \r\n \r\n {hasComments &&\r\n
    \r\n Sort By \r\n \r\n
    \r\n }\r\n {sortedComments.map((comment, index) =>\r\n
    \r\n \r\n
    \r\n )}\r\n
    \r\n );\r\n }\r\n\r\n private onSortByOldestFirst = (sortByOldestFirst: boolean) => {\r\n this.setState({ sortByOldestFirst });\r\n }\r\n\r\n private sortByNewestFirst(comments: IComment[]): IComment[] {\r\n return comments.sort((a, b) => {\r\n const dateA = new Date(a.createdTime);\r\n const dateB = new Date(b.createdTime);\r\n return dateA > dateB\r\n ? -1\r\n : dateA === dateB\r\n ? 0\r\n : 1;\r\n });\r\n }\r\n\r\n private sortByOldestFirst(comments: IComment[]): IComment[] {\r\n return comments.sort((a, b) => {\r\n const dateA = new Date(a.createdTime);\r\n const dateB = new Date(b.createdTime);\r\n return dateA < dateB\r\n ? -1\r\n : dateA === dateB\r\n ? 0\r\n : 1;\r\n });\r\n }\r\n\r\n private onStar = (toStarId: string) => {\r\n return this.props.starComment(toStarId).then((response) => {\r\n if(!!response) {\r\n const comments = this.props.comments.slice().map(comment => {\r\n if (comment.id === response.id)\r\n return response;\r\n \r\n comment.repliesPreview = comment.repliesPreview.map(reply => {\r\n if (reply.id === response.id) {\r\n return response;\r\n }\r\n return reply;\r\n });\r\n \r\n return comment;\r\n });\r\n \r\n this.props.onUpdateComments(comments);\r\n }\r\n });\r\n }\r\n\r\n private onDestar = (toDestarId: string) => {\r\n return this.props.destarComment(toDestarId).then((response) => {\r\n if(!!response) {\r\n const comments = this.props.comments.slice().map(comment => {\r\n if (comment.id === response.id)\r\n return response;\r\n \r\n comment.repliesPreview = comment.repliesPreview.map(reply => {\r\n if (reply.id === response.id) {\r\n return response;\r\n }\r\n return reply;\r\n });\r\n \r\n return comment;\r\n });\r\n \r\n this.props.onUpdateComments(comments);\r\n }\r\n });\r\n }\r\n\r\n private onSubscribeToComments = () => {\r\n if (!this.state.pendingSubscribe) {\r\n this.setState({ pendingSubscribe: true });\r\n this.props.subscribeToComments(this.props.id).then((response) => {\r\n if (response)\r\n this.props.onUpdateCommentSubscriptions(true);\r\n this.setState({ pendingSubscribe: false });\r\n });\r\n }\r\n }\r\n\r\n private onUnsubscribeFromComments = () => {\r\n if (!this.state.pendingSubscribe) {\r\n this.setState({ pendingSubscribe: true });\r\n this.props.unsubscribeFromComments(this.props.id).then((response) => {\r\n if (response)\r\n this.props.onUpdateCommentSubscriptions(false);\r\n this.setState({ pendingSubscribe: false });\r\n });\r\n }\r\n }\r\n\r\n private updateCommentList = (isEditing: boolean) => {\r\n this.setState({editingComment: isEditing});\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n id: string;\r\n containerStyle?: React.CSSProperties;\r\n commentsEnabledOnPost: boolean;\r\n commentsEnabledOnTenant: boolean;\r\n comments: IComment[];\r\n isSubscribed: boolean;\r\n showSubscription?: boolean;\r\n preview?: boolean;\r\n onUpdateComments: (comments: IComment[]) => void;\r\n onUpdateCommentSubscriptions: (subscribed: boolean) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n pendingSubscribe: boolean;\r\n sortByOldestFirst: boolean;\r\n editingComment: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n }),\r\n {\r\n subscribeToComments: actions.subscribeToComments,\r\n unsubscribeFromComments: actions.unsubscribeFromComments,\r\n fetchAllReplies: actions.fetchAllReplies,\r\n starComment: actions.starComment,\r\n destarComment: actions.destarComment\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\nexport default connector(Comments);\r\n","import { useEffect } from \"react\";\r\nimport { useHistory } from \"react-router\";\r\n\r\nimport useIsMounted from \"../useIsMounted\";\r\nimport { ICustomCssModelv1 } from \"api/files\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { GLOBAL_LAYOUT_STATUS, fetchCustomCssFileAsync } from \"modules/globalLayout/reducer\";\r\nimport { getExpiryFromSasUrl } from \"utils/urlUtils\";\r\n\r\ntype UseCustomTinyMceCssContentReturnType = {\r\n customCss?: ICustomCssModelv1;\r\n fetching: boolean;\r\n}\r\n\r\ninterface IUseCustomTinyMceCssContentProps {\r\n enabled: boolean;\r\n tenantId: string;\r\n}\r\n\r\n/**\r\n * Wrap logic for interacting with custom css file in redux\r\n * @param enabled - tenant setting is enabled for this feature - tinyMceCustomCssEnabled\r\n * @returns UseCustomTinyMceCssContentReturnType\r\n */\r\nexport const useCustomTinyMceCssContent = ({ enabled, tenantId }: IUseCustomTinyMceCssContentProps): UseCustomTinyMceCssContentReturnType => {\r\n const isMounted = useIsMounted();\r\n const { customCss, status } = useSelector((state: GlobalApplicationState) => state.globalLayout);\r\n const fetching = status === GLOBAL_LAYOUT_STATUS.FETCHING;\r\n const dispatch = useDispatch();\r\n const { location: { pathname } } = useHistory();\r\n\r\n useEffect(() => {\r\n // check if the sas url has expired\r\n const isExpired = (): boolean => {\r\n let result = false;\r\n\r\n if (customCss && customCss.sasUrl) {\r\n let utcExpiry = getExpiryFromSasUrl(customCss.sasUrl);\r\n\r\n if (utcExpiry)\r\n result = utcExpiry.getTime() < Date.now();\r\n }\r\n\r\n return result;\r\n }\r\n\r\n if ((!customCss || isExpired()) && enabled && !fetching)\r\n dispatch(fetchCustomCssFileAsync({ tenantId, admin: pathname.includes(\"/admin/\") }));\r\n }, [customCss, fetching, pathname, isMounted, enabled, tenantId, dispatch]);\r\n\r\n return {\r\n customCss,\r\n fetching\r\n };\r\n}\r\n","/**\r\n * Grab the se (expiry) query param from a url\r\n * @param sasUrl\r\n * @returns date || null\r\n */\r\nexport const getExpiryFromSasUrl = (sasUrl: string): Date | null => {\r\n let url = new URL(sasUrl);\r\n let params = url.searchParams;\r\n\r\n const expiry: string | null = params.get(\"se\");\r\n\r\n return expiry === null\r\n ? null\r\n : new Date(expiry);\r\n}\r\n\r\n/**\r\n* Check if a url is valid by attempting to create an object with it.\r\n* @param url\r\n* @returns true if object was created without error, false if not\r\n*/\r\nexport const checkValidUrl = (url: string): boolean => {\r\n try {\r\n new URL(url);\r\n\r\n var containsSpaces = url.includes(\" \");\r\n var urlRegExpression = /https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)?/gi; // eslint-disable-line\r\n const result = url.match(urlRegExpression);\r\n\r\n return result !== null && !containsSpaces;\r\n }\r\n catch {\r\n return false;\r\n }\r\n};\r\n","import React from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { useHistory, useParams } from \"react-router\";\r\n\r\nimport { useCustomTinyMceCssContent } from \"../hooks/data/useCustomTinyMceCssContent\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\ninterface ICustomCssProps {\r\n enabled: boolean;\r\n}\r\n\r\n/**\r\n * Renders link tag for tenant custom css file\r\n */\r\nexport const CustomCss: React.FunctionComponent = ({\r\n enabled,\r\n}) => {\r\n const { tenantSettings } = useSelector((state: GlobalApplicationState) => state.settings);\r\n const { tenantId } = tenantSettings;\r\n const { tenant: requestTenantId } = useParams<{ tenant: string }>();\r\n const { location: { pathname } } = useHistory();\r\n\r\n // try use logged in user, fallback to request tenant id in order to support custom css on public pages\r\n const tenantIdToUse = tenantId || requestTenantId;\r\n const { customCss } = useCustomTinyMceCssContent({ enabled: enabled || pathname.includes(\"/public/\"), tenantId: tenantIdToUse });\r\n\r\n return (\r\n <>\r\n {customCss?.sasUrl &&\r\n }\r\n \r\n );\r\n}\r\n","import React, { useEffect, useState } from \"react\";\r\n\r\nimport moment from 'moment';\r\nimport { Button, Divider } from \"@mui/material\";\r\n\r\nimport { PostOverview } from \"modules/posts/models\";\r\nimport HeroBanner from \"../../../common/components/heroBanner\";\r\nimport PostTypeBanner from \"modules/common/components/banners/postTypeBanner\";\r\nimport BreakingFeaturedBanner from \"../banners/breakingFeaturedBanner\";\r\nimport { postsApi } from \"api/instances\";\r\nimport { ILanguage } from \"modules/localization/models\";\r\nimport { getTranslatedBody, getTranslatedComplianceText, getTranslatedTitle } from \"utils/getTranslatedContent\";\r\nimport { parseAnchors } from \"utils/htmlUtils\";\r\nimport { lcidMappings } from \"modules/resources\";\r\nimport Compliance from \"./compliance/compliance\";\r\nimport Reactions from \"./reactions/reactions\";\r\nimport Comments from \"./comments/comments\";\r\nimport { ClientSettingsReaction } from \"modules/settings\";\r\nimport { CustomCss } from \"modules/common/components/customCss\";\r\n\r\ninterface IPostContentViewProps {\r\n post: PostOverview;\r\n defaultLcid: string;\r\n lcidMappings: lcidMappings;\r\n reactions: ClientSettingsReaction[];\r\n reactionsEnabledOnTenant: boolean;\r\n commentsEnabledOnTenant: boolean;\r\n showComments?: boolean; // if post has comments, do we display them?\r\n showReactions?: boolean; // if post has reaction, do we display them?\r\n tinyMceCustomCssEnabled: boolean;\r\n}\r\n\r\nconst PostContentView: React.FunctionComponent = ({\r\n post,\r\n lcidMappings,\r\n defaultLcid,\r\n reactions,\r\n reactionsEnabledOnTenant,\r\n commentsEnabledOnTenant,\r\n showComments = true,\r\n showReactions = true,\r\n tinyMceCustomCssEnabled\r\n}) => {\r\n const [activeLcid, setActiveLcid] = useState(defaultLcid);\r\n const [availableLanguages, setAvailableLanguages] = useState[]>();\r\n\r\n useEffect(() => {\r\n const availableLcids: string[] = Object.keys(post.translatedContent!);\r\n const availableLanguages: Partial[] = availableLcids.map((lcid) => ({\r\n language: lcidMappings[lcid]\r\n ? lcidMappings[lcid].languageShort\r\n : lcid,\r\n lcid\r\n }));\r\n const activeLcid: string = !!post.translatedContent![post.preferredLCID]\r\n ? post.preferredLCID\r\n : defaultLcid;\r\n\r\n setAvailableLanguages(availableLanguages);\r\n setActiveLcid(activeLcid);\r\n\r\n }, [post.translatedContent, defaultLcid, post.preferredLCID, lcidMappings]);\r\n\r\n const renderLanguages = (): JSX.Element => {\r\n if (!availableLanguages || availableLanguages.length < 2)\r\n return <>;\r\n\r\n return (\r\n
    \r\n Available In: \r\n {availableLanguages\r\n .map(({ language, lcid = defaultLcid }) =>\r\n setActiveLcid(lcid)}\r\n className={lcid === activeLcid ? \"\" : \"inactive-language\"}\r\n >\r\n {language}\r\n \r\n )\r\n .reduce((prev, curr) => [prev, \", \", curr])\r\n }\r\n
    \r\n );\r\n }\r\n\r\n const title = getTranslatedTitle(post.translatedContent, activeLcid);\r\n\r\n return (\r\n <>\r\n \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    {title}
    \r\n
    Published {moment(post.datePublished!).format(\"MMMM D, YYYY\")}
    \r\n {!!post.tags && !!post.tags.length &&\r\n
    Topics: {post.tags.map((tag) => tag.name).join(\", \")}
    \r\n }\r\n \r\n
    \r\n \r\n
    \r\n
    {post.author ? post.author.name[0] : \"\"}
    \r\n
    \r\n
    Post By
    \r\n {post && post.author && post.author.email\r\n ? {post.author.name}\r\n :
    {post && post.author ? post.author.name : \"\"}
    \r\n }\r\n
    \r\n
    \r\n \r\n
    \r\n {renderLanguages()}\r\n
    \r\n {!!post.fileAttachments && !!post.fileAttachments.length &&\r\n
    \r\n
    Documents ({post.fileAttachments.length})
    \r\n
    \r\n {post.fileAttachments.map((fileAttachment) =>\r\n \r\n )}\r\n
    \r\n
    \r\n }\r\n \r\n
    \r\n {showReactions &&\r\n }\r\n {showComments &&\r\n
    \r\n { }}\r\n onUpdateCommentSubscriptions={() => { }}\r\n preview\r\n commentsEnabledOnPost={post.commentingEnabled}\r\n commentsEnabledOnTenant={commentsEnabledOnTenant}\r\n {...post}\r\n />\r\n
    }\r\n
    \r\n
    \r\n \r\n );\r\n}\r\n\r\nexport default PostContentView;\r\n","/**\r\n * Helper function to open a post in private user portal\r\n * @param tenantId\r\n * @param postId\r\n */\r\nconst openPostInPortal = (tenantId: string, postId: string) => {\r\n const hrefToOpen = `/${tenantId}/posts/${postId}`;\r\n const url = `${window.location.origin}${hrefToOpen}`;\r\n const newWindow = window.open(url, \"_blank\");\r\n\r\n if (newWindow !== null)\r\n newWindow.focus();\r\n}\r\n\r\nexport { openPostInPortal };\r\n","import React from \"react\";\r\nimport ConfirmDialog from \"./confirmDialog\";\r\n\r\ninterface IConfirmRepublishCompliancePostProps {\r\n open: boolean;\r\n onConfirm: () => void;\r\n onDeny: () => void;\r\n onClose: () => void;\r\n}\r\n\r\nexport const ConfirmRepublishCompliancePostDialog: React.FunctionComponent = ({\r\n open,\r\n onConfirm,\r\n onDeny,\r\n onClose\r\n}) => {\r\n return (\r\n \r\n Publishing your changes will reset the Compliance Report of this post, clearing the list of users who have complied to it.\r\n

    \r\n Would you like to proceed?\r\n \r\n );\r\n}\r\n","import { useEffect, useMemo } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\n\r\nimport {\r\n IContentBand,\r\n IContentBandSettings,\r\n ContentBandContentType,\r\n ContentBandLayoutType,\r\n ReadStatus,\r\n IContentBandConfig,\r\n} from \"modules/contentBands/models\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport {\r\n contentBandsSlice,\r\n fetchContentBandConfigAsync,\r\n fetchContentBandsAsync,\r\n fetchContentForBandAsync,\r\n publishContentBandsAsync,\r\n saveContentBandsAsync,\r\n} from \"modules/contentBands/reducer\";\r\nimport { SortStyle } from \"utils/managementUtils\";\r\n\r\nexport const isPinnedDeleted = (contentBands: IContentBand[], publishedBands: IContentBand[] | null, selectedIds: string[]): boolean => {\r\n const someHandler = (cb: IContentBand) => cb.pinnedIds !== undefined && cb.pinnedIds.some((id: string) => selectedIds.includes(id));\r\n\r\n const isPinnedDeleted = contentBands.some(someHandler) || (publishedBands !== null && publishedBands.some(someHandler));\r\n\r\n return isPinnedDeleted;\r\n};\r\n\r\n// helper to cast IcontentBand to Partial for comparing against other bands\r\nexport const castBandToComparableSettings = (x: IContentBand): Partial => {\r\n let { posts, events, id, publishedDateTimeUtc, createdById, createdDateTimeUtc, parentId, status, ...settings } = x;\r\n\r\n return settings;\r\n};\r\n\r\nexport type UseContentBandsReturnType = {\r\n contentBands: IContentBand[];\r\n isLoading: boolean;\r\n latestSavedContentBands: IContentBand[]; // keeps track of what's on server\r\n isValid: boolean; // are content bands valid\r\n isContentBandsDirty: boolean;\r\n isConfigDirty: boolean;\r\n successMessage: string;\r\n publishCount: number;\r\n fetchIdx?: number | null; // the idx of the content band we are fetching content for\r\n publishedContentBands: IContentBand[] | null;\r\n addFinished: boolean;\r\n config: IContentBandConfig | undefined;\r\n pristineConfig: IContentBandConfig | undefined;\r\n saveContentBands: (successMessage: string) => void; // save to server\r\n publishContentBands: (successMessage: string) => void;\r\n onChangeLayout: (newValue: ContentBandLayoutType, idx: number) => void;\r\n onChangeContentType: (newValue: ContentBandContentType, idx: number) => void;\r\n onChangeDisplayFullTitles: (newValue: boolean, idx: number) => void;\r\n onChangeEnableSeeMoreLink: (newValue: boolean, idx: number) => void;\r\n onChangeContentCount: (newValue: number, idx: number) => void;\r\n onChangeSortBy: (newValue: SortStyle, idx: number) => void;\r\n onChangePinnedIds: (newValue: string[], idx: number) => void;\r\n onChangeLockToReadStatus: (newValue: ReadStatus, idx: number) => void;\r\n onChangeLockToTypes: (newValue: string[], idx: number) => void;\r\n onChangeLockToTopics: (newValue: string[], idx: number) => void;\r\n onChangeAutoPlayCarousel: (newValue: boolean, idx: number) => void;\r\n onChangeIgnoreSubscriptions: (newValue: boolean, idx: number) => void;\r\n onChangeHeaderText: (newValue: string, lcid: string, idx: number) => void;\r\n fetchContentForBand: (band: IContentBand, idx: number) => void;\r\n};\r\n\r\n/**\r\n * Hook to interact with redux content bands for editor pages\r\n * @param includeContent control whether or not to fetch content as well on initial fetch\r\n * @returns UseContentBandsReturnType\r\n */\r\nexport const useContentBands = (includeContent: boolean = false): UseContentBandsReturnType => {\r\n const dispatch = useDispatch();\r\n const {\r\n contentBands,\r\n pristineContentBands,\r\n publishedContentBands,\r\n fetched,\r\n publishCount,\r\n fetchIdx,\r\n successMessage = \"\",\r\n addFinished,\r\n config,\r\n pristineConfig,\r\n isLoadingContentBandConfig,\r\n isLoadingContentBands,\r\n isLoadingPublishedContentBands,\r\n isPublishingContentBandConfig,\r\n isPublishingContentBands,\r\n isSavingContentBandConfig,\r\n isSavingContentBands,\r\n } = useSelector((state: GlobalApplicationState) => state.contentBands);\r\n\r\n // content bands are valid if\r\n // - content count > 0\r\n // - carousel content count < 11\r\n // - all other layouts content count < 21\r\n const isValid = useMemo(() => {\r\n return !contentBands.some(\r\n (band: IContentBand) =>\r\n (band.contentCount || 0) < 1 ||\r\n (band.layoutType === ContentBandLayoutType.Carousel && (band.contentCount || 0) > 10) ||\r\n (band.layoutType !== ContentBandLayoutType.Carousel && (band.contentCount || 0) > 20)\r\n );\r\n }, [contentBands]);\r\n\r\n // check if pristine matches current bands\r\n // first, set content to empty so we only check band settings\r\n const isContentBandsDirty = useMemo(\r\n () =>\r\n JSON.stringify([...contentBands].map(castBandToComparableSettings)) !==\r\n JSON.stringify([...pristineContentBands].map(castBandToComparableSettings)),\r\n [pristineContentBands, contentBands]\r\n );\r\n\r\n // check current config changes against pristine version\r\n // do not check for mismatch undefined because those are default values while fetching\r\n const isConfigDirty =\r\n pristineConfig !== undefined &&\r\n config !== undefined &&\r\n Object.keys(pristineConfig).some((key: string) => pristineConfig[key] !== config[key]);\r\n\r\n const fetchContentForBand = (band: IContentBand, idx: number) => {\r\n dispatch(fetchContentForBandAsync({ band, idx }));\r\n };\r\n\r\n // fetch content bands\r\n // dont fetch if include content goes false and we've already fetched since we already have everything we need\r\n // dont fetch if we have content already and include content goes true\r\n useEffect(() => {\r\n if (fetched && !includeContent) return;\r\n\r\n const haveContentAlready = contentBands.every((cb: IContentBand) => cb.events !== null || cb.posts !== null);\r\n if (includeContent && fetched && haveContentAlready) return;\r\n\r\n dispatch(fetchContentBandsAsync(includeContent));\r\n }, [includeContent, dispatch, fetched, contentBands]);\r\n\r\n // pull config into redux if we don't have it\r\n useEffect(() => {\r\n if (config === undefined) dispatch(fetchContentBandConfigAsync());\r\n }, [config, dispatch]);\r\n\r\n // save current state content bands to server\r\n const saveContentBands = (successMessage: string) => {\r\n dispatch(saveContentBandsAsync({ contentBands, includeContent, successMessage }));\r\n };\r\n\r\n // publish current state content bands\r\n const publishContentBands = (successMessage: string) => {\r\n dispatch(publishContentBandsAsync({ contentBands, includeContent: false, successMessage }));\r\n };\r\n\r\n // helper function to modify a specific field and dispatch redux update\r\n function editContentBandDraftField(idx: number, fieldName: keyof IContentBandSettings, value: T) {\r\n const originalBand = { ...contentBands[idx] };\r\n\r\n const newBand: IContentBand = {\r\n ...originalBand,\r\n // reset values to defaults that do not apply to certain layouts\r\n autoPlayCarousel: originalBand.layoutType === ContentBandLayoutType.Carousel ? originalBand.autoPlayCarousel : false,\r\n displayFullTitles: originalBand.layoutType === ContentBandLayoutType.Card ? originalBand.displayFullTitles : false,\r\n seeMoreEnabled: originalBand.layoutType === ContentBandLayoutType.Carousel ? false : originalBand.seeMoreEnabled,\r\n [fieldName]: value,\r\n };\r\n\r\n // reset some values when changing content type\r\n if (fieldName === \"contentType\") {\r\n newBand.lockToTypes = [];\r\n newBand.pinnedIds = [];\r\n\r\n if (value === ContentBandContentType.Event) newBand.sortBy = SortStyle.startDesc;\r\n else newBand.sortBy = SortStyle.publishDesc;\r\n }\r\n\r\n dispatch({\r\n type: contentBandsSlice.actions.EDIT_CONTENT_BAND,\r\n payload: {\r\n values: newBand,\r\n idx,\r\n },\r\n });\r\n }\r\n\r\n const onChangeLayout = (newValue: ContentBandLayoutType, idx: number) => {\r\n editContentBandDraftField(idx, \"layoutType\", newValue);\r\n };\r\n\r\n const onChangeContentType = (newValue: ContentBandContentType, idx: number) => {\r\n editContentBandDraftField(idx, \"contentType\", newValue);\r\n };\r\n\r\n const onChangeDisplayFullTitles = (newValue: boolean, idx: number) => {\r\n editContentBandDraftField(idx, \"displayFullTitles\", newValue);\r\n };\r\n\r\n const onChangeEnableSeeMoreLink = (newValue: boolean, idx: number) => {\r\n editContentBandDraftField(idx, \"seeMoreEnabled\", newValue);\r\n };\r\n\r\n const onChangeContentCount = (newValue: number, idx: number) => {\r\n editContentBandDraftField(idx, \"contentCount\", newValue);\r\n };\r\n\r\n const onChangeSortBy = (newValue: SortStyle, idx: number) => {\r\n editContentBandDraftField(idx, \"sortBy\", newValue);\r\n };\r\n\r\n const onChangePinnedIds = (newValue: string[], idx: number) => {\r\n editContentBandDraftField(idx, \"pinnedIds\", newValue);\r\n };\r\n\r\n const onChangeLockToReadStatus = (newValue: ReadStatus, idx: number) => {\r\n editContentBandDraftField(idx, \"lockToReadStatus\", newValue);\r\n };\r\n\r\n const onChangeLockToTypes = (newValue: string[], idx: number) => {\r\n editContentBandDraftField(idx, \"lockToTypes\", newValue);\r\n };\r\n\r\n const onChangeLockToTopics = (newValue: string[], idx: number) => {\r\n editContentBandDraftField(idx, \"lockToTopicIds\", newValue);\r\n };\r\n\r\n const onChangeIgnoreSubscriptions = (newValue: boolean, idx: number) => {\r\n editContentBandDraftField(idx, \"ignoreSubscriptions\", newValue);\r\n };\r\n\r\n const onChangeAutoPlayCarousel = (newValue: boolean, idx: number) => {\r\n editContentBandDraftField(idx, \"autoPlayCarousel\", newValue);\r\n };\r\n\r\n const onChangeHeaderText = (newValue: string, lcid: string, idx: number) => {\r\n const band = { ...contentBands[idx] };\r\n\r\n if (band.headers && Object.keys(band.headers).includes(lcid)) {\r\n band.headers = {\r\n ...band.headers,\r\n [lcid]: {\r\n header: newValue,\r\n },\r\n };\r\n\r\n editContentBandDraftField(idx, \"headers\", band.headers);\r\n }\r\n };\r\n\r\n return {\r\n contentBands: contentBands?.map((cb: IContentBand) => ({ ...cb, posts: cb.posts || [], events: cb.events || [] })) || [],\r\n isLoading:\r\n isLoadingContentBandConfig ||\r\n isLoadingContentBands ||\r\n isLoadingPublishedContentBands ||\r\n isSavingContentBands ||\r\n isSavingContentBandConfig ||\r\n isPublishingContentBandConfig ||\r\n isPublishingContentBands,\r\n latestSavedContentBands: pristineContentBands,\r\n isValid,\r\n successMessage,\r\n isContentBandsDirty,\r\n publishCount,\r\n fetchIdx,\r\n publishedContentBands,\r\n addFinished,\r\n config,\r\n pristineConfig,\r\n isConfigDirty,\r\n saveContentBands,\r\n publishContentBands,\r\n onChangeLayout,\r\n onChangeContentCount,\r\n onChangeContentType,\r\n onChangeSortBy,\r\n onChangeDisplayFullTitles,\r\n onChangeEnableSeeMoreLink,\r\n onChangeLockToReadStatus,\r\n onChangeLockToTopics,\r\n onChangeIgnoreSubscriptions,\r\n onChangeLockToTypes,\r\n onChangePinnedIds,\r\n onChangeAutoPlayCarousel,\r\n onChangeHeaderText,\r\n fetchContentForBand,\r\n };\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { ContentType } from 'modules/common/models';\r\n\r\nimport ConfirmDialog from 'modules/common/components/dialogs/confirmDialog';\r\n\r\nconst EDIT_PUBLISHED_WARNING = \"Once approved, the content will be updated. The existing, live version will remain the same until revisions are approved.\";\r\n\r\nconst EditPublishedContentDialog: React.FunctionComponent = (props: IEditPublishedContentDialog) => {\r\n return (\r\n \r\n {\r\n `Editing a published ${ContentType[props.content].toLowerCase()} and resubmitting your revisions will require re-approval.`\r\n + EDIT_PUBLISHED_WARNING\r\n }\r\n \r\n

    \r\n Do you want to continue?\r\n \r\n );\r\n};\r\n\r\ninterface IEditPublishedContentDialog {\r\n content: ContentType;\r\n open: boolean;\r\n onEdit: () => void;\r\n onClose: () => void;\r\n}\r\n\r\nexport default EditPublishedContentDialog;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport {\r\n defaultPostOverview,\r\n Epoch,\r\n PostFilterValues,\r\n PostListingPage,\r\n PostListItem,\r\n PostOverview,\r\n ImageScale,\r\n POST_TYPES,\r\n PostListingPageId\r\n} from \"../../models\";\r\nimport { SortStyle } from \"utils/managementUtils\";\r\nimport moment from \"moment\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport PostFilters from \"../post-filters/postFilters\";\r\n\r\nimport TabContent from \"pages/common/tabContent\";\r\nimport TabContentToolbar from \"pages/common/tabContentToolbar\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableContainer from \"@mui/material/TableContainer\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport WarningIcon from '@mui/icons-material/Warning';\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\nimport CloudOffIcon from \"@mui/icons-material/CloudOff\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport DoubleArrowIcon from \"@mui/icons-material/DoubleArrow\";\r\nimport EditIcon from \"@mui/icons-material/Edit\";\r\nimport FileCopyIcon from \"@mui/icons-material/FileCopy\";\r\nimport TimelineIcon from \"@mui/icons-material/Timeline\";\r\nimport VisibilityIcon from \"@mui/icons-material/Visibility\";\r\nimport ArrowDownward from \"@mui/icons-material/ArrowDownward\";\r\nimport ArrowUpward from \"@mui/icons-material/ArrowUpward\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\nimport { postsApi } from \"api/instances\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport Paging from \"modules/common/components/paging\";\r\nimport ChipLabels from \"modules/common/components/chips/chipLabels\";\r\nimport Cookies from \"js-cookie\";\r\nimport MoreOptions from \"./moreOptions\";\r\nimport { TenantSettingsTagGroup } from \"modules/settings\";\r\nimport ManagementEmptyResults from \"modules/common/components/managementEmptyResults\";\r\nimport Preview, { PreviewType } from \"modules/common/components/authoring/dialogs/preview\";\r\nimport PostContentView from \"../post-view/postContentView\";\r\nimport { openPostInPortal } from \"utils/redirectUtils\";\r\nimport { getHighestRole } from \"utils/userRoleUtils\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport { Tooltip, TooltipProps, tooltipClasses } from \"@mui/material\";\r\nimport { styled } from \"@mui/styles\";\r\nimport ConfirmDialog from \"modules/common/components/dialogs/confirmDialog\";\r\nimport { QUERY_PARAM_KEYS } from \"modules/common/hooks/useQueryParams\";\r\nimport { ROWS_PER_PAGE_COOKIE_NAMES } from \"utils/cookie\";\r\nimport { ConfirmRepublishCompliancePostDialog } from \"modules/common/components/dialogs/confirmRepublishCompliancePostDialog\";\r\nimport { contentBandsSlice } from \"modules/contentBands/reducer\";\r\nimport { isPinnedDeleted } from \"modules/common/hooks/data/useContentBands\";\r\nimport SnackbarWrapper from \"modules/common/components/snackbars/snackbarWrapper\";\r\nimport EditPublishedContentDialog from \"../../../common/components/authoring/dialogs/editPublishedContentDialog\";\r\nimport { ContentType } from \"modules/common/models\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\n\r\nconst LightTooltip = styled(({ className, ...props }: TooltipProps) => (\r\n \r\n))(({ theme }) => ({\r\n [`& .${tooltipClasses.tooltip}`]: {\r\n backgroundColor: 'white',\r\n color: 'rgba(0, 0, 0, 0.87)',\r\n boxShadow: '1px 1px 1px 2px rgba(0, 0, 0, 0.2)',\r\n fontSize: 11,\r\n },\r\n [`& .${tooltipClasses.arrow}`]: {\r\n color: 'white',\r\n \"&::before\": {\r\n border: '1px solid rgba(153, 153, 153, 0.5)'\r\n }\r\n },\r\n}));\r\n\r\ninterface HeaderCell {\r\n id: string;\r\n label: string;\r\n ascValue?: SortStyle;\r\n descValue?: SortStyle;\r\n clickable?: boolean;\r\n}\r\n\r\nclass PostList extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n hasFiltersApplied: false,\r\n isPagedLoad: false,\r\n selectedItems: [],\r\n showPostPreview: false,\r\n postToPreview: { ...defaultPostOverview },\r\n isLoadingPreview: false,\r\n successMessage: \"\",\r\n showEditPublishedPostDialog: false,\r\n currDraftId: \"\",\r\n showConfirmComplianceEditPost: false,\r\n showConfirmUnpublishCompliancePost: false,\r\n showConfirmPublishEditedCompliancePost: false,\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public render() {\r\n const { page } = this.props;\r\n const { postToPreview } = this.state;\r\n const isPostPublishDateValid = postToPreview.datePublished && moment(postToPreview.datePublished).isBefore(moment());\r\n const isContributor = getHighestRole(this.props.currentUser) === UserRoleStrings.CONTRIBUTOR;\r\n\r\n // show 'open in portal' if post is already a published post\r\n const showOpenInPortalPreviewAction = postToPreview.status !== \"draft\" && isPostPublishDateValid;\r\n\r\n // show 'open published' version of draft if post is not a draft\r\n const showOpenPublishedVersion = postToPreview.status === \"draft\" && isPostPublishDateValid;\r\n\r\n const getPreviewOpenLabel = (): string | undefined => {\r\n let openLabel: string | undefined;\r\n\r\n if (showOpenInPortalPreviewAction)\r\n openLabel = \"OPEN POST IN PORTAL\";\r\n else if (showOpenPublishedVersion)\r\n openLabel = \"VIEW PUBLISHED VERSION\";\r\n\r\n return openLabel;\r\n };\r\n\r\n const getPreviewOpenAction = (): (() => void) | undefined => {\r\n let openAction: (() => void) | undefined;\r\n\r\n if (showOpenInPortalPreviewAction)\r\n openAction = () => openPostInPortal(this.props.tenant, this.state.postToPreview.id);\r\n else if (\r\n showOpenPublishedVersion &&\r\n this.state.postToPreview.previouslyPublishedPostId\r\n )\r\n openAction = () => openPostInPortal(this.props.tenant, this.state.postToPreview.previouslyPublishedPostId);\r\n\r\n return openAction;\r\n };\r\n\r\n const getPreviewPublishLabel = (): string | undefined => {\r\n let publishLabel: string | undefined;\r\n\r\n if (isContributor && this.props.page.id === 'drafts')\r\n publishLabel = 'Submit';\r\n else if (!isContributor && this.props.page.id === 'submissions')\r\n publishLabel = \"Approve & Publish\";\r\n\r\n return publishLabel;\r\n }\r\n\r\n const getPreviewPublishAction = (): (() => void) | undefined => {\r\n return this.props.page.id === 'submissions' || this.props.page.id === 'drafts' ?\r\n async () => {\r\n let date = this.state.postToPreview.datePublished\r\n ? new Date(this.state.postToPreview.datePublished)\r\n : new Date();\r\n\r\n try {\r\n isContributor ?\r\n await this.props.submitPost(this.state.postToPreview.draftId)\r\n :\r\n await this.props.publishPost(this.state.postToPreview.draftId, date.toISOString());\r\n }\r\n catch (err) { }\r\n finally {\r\n this.onHidePostPreview();\r\n }\r\n }\r\n :\r\n undefined;\r\n };\r\n\r\n if (!this.props.show)\r\n return <>;\r\n\r\n if (!this.state.isPagedLoad && page.isFetching)\r\n return
    ;\r\n\r\n return (\r\n \r\n {this.getToolbar(isContributor)}\r\n \r\n {this.getFilter()}\r\n {this.getList(isContributor)}\r\n this.setState({successMessage: \"\"})}\r\n />\r\n {this.state.postToPreview &&\r\n await this.onEditPost(isContributor, this.state.postToPreview.draftId, this.state.postToPreview.postType)}\r\n editLabel={\"EDIT POST\"}\r\n openAction={getPreviewOpenAction()}\r\n openLabel={getPreviewOpenLabel()}\r\n onClose={this.onHidePostPreview}\r\n open={this.state.showPostPreview}\r\n disablePublish={this.state.postToPreview.status.toLocaleLowerCase() === 'draft'}\r\n previews={[{ type: PreviewType.Desktop, component: this.getDesktopPreview(), label: \"DESKTOP\" }]}\r\n publishLabel={getPreviewPublishLabel()}\r\n publishAction={getPreviewPublishAction()}\r\n isLoading={this.props.publishing || this.props.submitting}\r\n />}\r\n \r\n \r\n this.setState({ showEditPublishedPostDialog: false, currDraftId: '' })}\r\n /> \r\n this.setState({ showConfirmComplianceEditPost: false, currDraftId: \"\" })}\r\n onClose={() => this.setState({ showConfirmComplianceEditPost: false, currDraftId: \"\" })}\r\n >\r\n Editing a compliance post and publishing its changes will reset its Compliance Report, clearing the list of users who have complied to it.\r\n

    \r\n Would you like to proceed?\r\n \r\n this.setState({ currDraftId: \"\", showConfirmUnpublishCompliancePost: false })}\r\n onClose={() => this.setState({ currDraftId: \"\", showConfirmUnpublishCompliancePost: false })}\r\n >\r\n Unpublishing a compliance post and republishing any changes will reset its Compliance Report, clearing the list of users who have complied to it.\r\n

    \r\n Would you like to proceed?\r\n \r\n {\r\n this.setState({ currDraftId: \"\", showConfirmPublishEditedCompliancePost: false });\r\n this.onPublishPostConfirm(this.state.currDraftId)\r\n }}\r\n onClose={() => this.setState({ currDraftId: \"\", showConfirmPublishEditedCompliancePost: false })}\r\n onDeny={() => this.setState({ currDraftId: \"\", showConfirmPublishEditedCompliancePost: false })}\r\n />\r\n
    );\r\n }\r\n\r\n private getDesktopPreview = (): JSX.Element => (\r\n
    \r\n {this.state.postToPreview &&\r\n t.enabled).map((t) => ({ ...t, order: t.sortIndex }))}\r\n reactionsEnabledOnTenant={this.props.tenantSettings.reactionsEnabled}\r\n commentsEnabledOnTenant={this.props.tenantSettings.commentsEnabled}\r\n post={this.state.postToPreview}\r\n lcidMappings={this.props.lcidMappings}\r\n defaultLcid={this.props.defaultLang}\r\n />}\r\n
    \r\n );\r\n\r\n private formatEpochTime = (time?: Epoch): string => {\r\n if (time) {\r\n return moment(new Date(time.date)).format(\"MMM D, YYYY h:mmA\");\r\n }\r\n return \"-\";\r\n }\r\n\r\n private formatEpochTimeFromNow = (time?: Epoch): string => {\r\n if (time) {\r\n return moment(new Date(time.date)).fromNow();\r\n }\r\n return \"-\";\r\n }\r\n\r\n private getFilter = (): JSX.Element => {\r\n return (\r\n \r\n );\r\n }\r\n\r\n //Default to descending, if currently descending make it ascending.\r\n private onClickHeader = (descValue: SortStyle | undefined, ascValue: SortStyle | undefined) => {\r\n const rowsPerPage = Cookies.get(ROWS_PER_PAGE_COOKIE_NAMES.DEFAULT);\r\n let updatedFilters = { ...this.props.filters };\r\n\r\n if (descValue === undefined || ascValue === undefined) {\r\n return;\r\n }\r\n\r\n if (this.props.filters.sortType === descValue) {\r\n updatedFilters = { ...updatedFilters, sortType: ascValue };\r\n } else {\r\n updatedFilters = { ...updatedFilters, sortType: descValue };\r\n }\r\n\r\n this.props.onUpdateFilters(\r\n updatedFilters,\r\n () => { this.onChangePage(0, Number(rowsPerPage) ?? 10, updatedFilters); }\r\n );\r\n }\r\n\r\n private getHeader = (): HeaderCell[] => {\r\n const { page } = this.props;\r\n\r\n let header: HeaderCell[] = [\r\n {\r\n id: \"title\",\r\n label: \"Post title\",\r\n ascValue: SortStyle.titleAsc,\r\n descValue: SortStyle.titleDesc,\r\n clickable: true\r\n }\r\n ];\r\n\r\n header.push({ id: \"options\", label: \"\" })\r\n\r\n if (page.id === PostListingPageId.ALL)\r\n header.push({\r\n id: \"state\",\r\n label: \"State\",\r\n ascValue: SortStyle.stateAsc,\r\n descValue: SortStyle.stateDesc,\r\n clickable: true\r\n });\r\n\r\n if (page.id !== PostListingPageId.DRAFTS && page.id !== PostListingPageId.SUBMISSIONS)\r\n header.push({\r\n id: \"publishedTime\",\r\n label: this.getPublishedTimeTabLabel(),\r\n ascValue: SortStyle.publishAsc,\r\n descValue: SortStyle.publishDesc,\r\n clickable: true\r\n });\r\n\r\n if (page.id === PostListingPageId.SUBMISSIONS)\r\n header.push({\r\n id: \"lastSubmittedOn\",\r\n label: \"Submitted On\",\r\n ascValue: SortStyle.submittedAsc,\r\n descValue: SortStyle.submittedDesc,\r\n clickable: true\r\n })\r\n\r\n header.push({\r\n id: \"updatedTime\",\r\n label: \"Last modified\",\r\n ascValue: SortStyle.modifiedAsc,\r\n descValue: SortStyle.modifiedDesc,\r\n clickable: true\r\n });\r\n\r\n if (page.id !== PostListingPageId.SUBMISSIONS) {\r\n header.push({\r\n id: \"expiryTime\",\r\n label: \"Expiry date\",\r\n ascValue: SortStyle.expiryAsc,\r\n descValue: SortStyle.expiryDesc,\r\n clickable: true\r\n });\r\n\r\n header.push({\r\n id: \"postType\",\r\n label: \"Type\",\r\n ascValue: SortStyle.typeAsc,\r\n descValue: SortStyle.typeDesc,\r\n clickable: true\r\n });\r\n }\r\n\r\n header.push({\r\n id: \"author\",\r\n label: \"Published by\",\r\n ascValue: SortStyle.authorAsc,\r\n descValue: SortStyle.authorDesc,\r\n clickable: true\r\n });\r\n\r\n header.push({\r\n id: \"tags\",\r\n label: \"Topics\",\r\n });\r\n\r\n return header;\r\n }\r\n\r\n private getList = (isContributor: boolean): JSX.Element => {\r\n const { page, filters } = this.props;\r\n const { selectedItems } = this.state;\r\n\r\n const getStatusColorToUse = (post: PostListItem): string => {\r\n let color = \"yellow\";\r\n if (post.status.toLowerCase() === \"published\")\r\n color = \"green\";\r\n else if (post.status.toLowerCase() === \"draft\" && post.isSubmission)\r\n color = \"red\";\r\n else if (post.status.toLowerCase() === \"draft\")\r\n color = \"grey\";\r\n else\r\n color = \"yellow\";\r\n\r\n return color;\r\n }\r\n\r\n const rowCount = page.posts.length || 10;\r\n\r\n if (page.isFetching)\r\n return
    ;\r\n\r\n if (!page.posts.length)\r\n return (\r\n \r\n );\r\n\r\n return (\r\n <>\r\n {\r\n this.state.hasFiltersApplied &&\r\n Results\r\n }\r\n \r\n \r\n \r\n \r\n \r\n 0 && selectedItems.length < rowCount}\r\n checked={rowCount > 0 && selectedItems.length === rowCount}\r\n onChange={this.onSelectAllPosts}\r\n inputProps={{ \"aria-label\": \"select all posts\" }}\r\n />\r\n \r\n {\r\n this.getHeader()\r\n .map((headerCell) => (\r\n this.onClickHeader(headerCell.descValue, headerCell.ascValue)}\r\n >\r\n
    \r\n {headerCell.label}\r\n {filters.sortType === headerCell.ascValue && }\r\n {filters.sortType === headerCell.descValue && }\r\n
    \r\n \r\n ))\r\n }\r\n
    \r\n
    \r\n \r\n {\r\n page\r\n .posts\r\n .map((post, index) => {\r\n const isPostSelected = this.isPostSelected(post);\r\n const labelId = `post-list-checkbox-${index}`;\r\n const colorToUse = getStatusColorToUse(post);\r\n\r\n return (\r\n this.handlePostClick(post, isContributor)}\r\n role=\"checkbox\"\r\n aria-checked={isPostSelected}\r\n tabIndex={-1}\r\n key={post.id}\r\n selected={isPostSelected}\r\n style={{ cursor: \"pointer\" }}\r\n >\r\n \r\n this.onSelectPost(ev, post)}\r\n />\r\n \r\n \r\n \r\n \r\n {post.title}\r\n \r\n\r\n \r\n {isContributor && post.alertUnopened && \r\n }>\r\n Post has been rejected or unpublished\r\n \r\n }\r\n \r\n \r\n \r\n \r\n await this.onEditPost(isContributor, post.draftId, post.postType)}\r\n isContributor={isContributor}\r\n onInsight={this.onViewInsights}\r\n />\r\n \r\n {\r\n page.id === PostListingPageId.ALL &&\r\n \r\n \r\n {post.isSubmission ? \"needs review\" : post.status}\r\n \r\n \r\n }\r\n {\r\n page.id !== PostListingPageId.DRAFTS && page.id !== PostListingPageId.SUBMISSIONS &&\r\n {this.formatEpochTime(post.publishedTime)}\r\n }\r\n {\r\n page.id === PostListingPageId.SUBMISSIONS &&\r\n {this.formatEpochTime(post.lastSubmittedTime)}\r\n }\r\n {this.formatEpochTimeFromNow(post.updatedTime)}\r\n {\r\n page.id !== PostListingPageId.SUBMISSIONS &&\r\n <>\r\n \r\n {this.formatEpochTime(post.expiryTime)}\r\n \r\n {post.postType}\r\n \r\n }\r\n {post.authorFullName ? post.authorFullName : post.author}\r\n \r\n \r\n );\r\n })\r\n }\r\n \r\n
    \r\n
    \r\n \r\n \r\n );\r\n }\r\n\r\n private getToolbar = (isContributor: boolean): JSX.Element => {\r\n const { page } = this.props;\r\n const { selectedItems } = this.state;\r\n const selected = selectedItems.length === 1 && selectedItems[0];\r\n\r\n // delete button is disabled for contributors when trying to delete published posts\r\n const isDeleteBtnDisabled = isContributor &&\r\n (\r\n page.id === PostListingPageId.PUBLISHED ||\r\n page.id === PostListingPageId.SCHEDULED ||\r\n selectedItems.findIndex(item => item.status !== 'draft') !== -1\r\n );\r\n\r\n if (!selectedItems.length)\r\n return ;\r\n\r\n return (\r\n \r\n
    \r\n {this.getToolbarIcon(`${selectedItems.length} selected`, , this.onClearAllPosts)}\r\n
    \r\n
    \r\n {selectedItems.length === 1 &&\r\n \r\n {\r\n this.getToolbarIcon(\"Edit\", , async () => await this.onEditPost(isContributor))\r\n }\r\n {this.getToolbarIconWithAsyncOnClick(\"Preview\", , this.onPreviewPost)}\r\n {\r\n page.id === PostListingPageId.PUBLISHED && !isContributor &&\r\n this.getToolbarIcon(\"Insights\", , this.onViewInsights)\r\n }\r\n {this.getToolbarIcon(\"Duplicate\", , this.onClonePost)}\r\n {\r\n page.id === PostListingPageId.PUBLISHED && selectedItems[0].postType !== \"compliance\" && !isContributor &&\r\n this.getToolbarIcon(\"Boost\", , this.onBoostPost)\r\n }\r\n {\r\n selected &&\r\n (selected.status === PostListingPageId.PUBLISHED || selected.status === PostListingPageId.SCHEDULED) &&\r\n !isContributor &&\r\n this.getToolbarIcon(\"Unpublish\", , this.onUnpublishPost)\r\n }\r\n \r\n }\r\n {\r\n this.getToolbarIcon(\r\n \"Delete\",\r\n ,\r\n () => this.onDeletePosts(),\r\n isDeleteBtnDisabled,\r\n isDeleteBtnDisabled ?\r\n \"Contact your administrator(s) to delete published or scheduled posts\" :\r\n undefined\r\n )\r\n }\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private getToolbarIconWithAsyncOnClick = (title: string, icon: React.ReactNode, onClick: () => Promise) => {\r\n return (\r\n { await onClick(); }}\r\n >\r\n {title}\r\n \r\n );\r\n }\r\n\r\n private getToolbarIcon = (title: string, icon: React.ReactNode, onClick: () => void, disabled?: boolean, toolTipText?: string) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private isExpired = (time?: Epoch): boolean => {\r\n if (time) {\r\n return moment(new Date(time.date)) <= moment();\r\n }\r\n return false;\r\n }\r\n\r\n private isPostSelected = (post: PostListItem): boolean => {\r\n return this.state.selectedItems.findIndex((selectedItem) => selectedItem.id === post.id) !== -1;\r\n }\r\n\r\n private onChangeFilters = (filters: Partial) => {\r\n const updatedFilters = { ...this.props.filters, ...filters };\r\n\r\n this.setState({ hasFiltersApplied: true, isPagedLoad: true });\r\n\r\n this.props.onUpdateFilters(\r\n updatedFilters,\r\n () => { this.props.fetchPage(1, updatedFilters); }\r\n );\r\n }\r\n\r\n private onClearFilters = () => {\r\n let filtersToSet = { ...this.props.defaultPostFilterValues };\r\n\r\n filtersToSet.tags = [];\r\n\r\n this.setState({ hasFiltersApplied: false, isPagedLoad: true });\r\n\r\n this.props.onUpdateFilters(\r\n filtersToSet,\r\n () => { this.props.fetchPage(1, {}); }\r\n );\r\n }\r\n\r\n private onClearAllPosts = () => {\r\n this.setState({ selectedItems: [] });\r\n }\r\n\r\n private onBoostPost = async (postToBoost?: PostListItem) => {\r\n let toBoost = postToBoost?.draftId ?? this.state.selectedItems[0].draftId;\r\n if (await confirm.show({ text: \"This will revise the published date to today. Would you like to continue?\", title: \"Boost post\" })) {\r\n this.props.publishPost(toBoost, Date.now().toString()).then(() => {\r\n this.onClearAllPosts();\r\n });\r\n }\r\n }\r\n\r\n private onClonePost = (postToClone?: PostListItem) => {\r\n let toClone = postToClone?.draftId ?? this.state.selectedItems[0].draftId;\r\n this.props.clonePost(toClone).then((response) => {\r\n if (!!response) {\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/posts/edit/\" + response);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Removes content bands from redux when a pinned post\r\n * gets deleted. This will force a re-fetch if user goes to content bands\r\n * page during session and keeps their content up to date.\r\n */\r\n private getIsPinnedDeleted = (postToDelete?: PostListItem): boolean => {\r\n const { contentBands, publishedContentBands } = this.props.contentBandsState;\r\n const selectedIds = this.state.selectedItems.map((post: PostListItem) => post.id);\r\n const idsToCheck = postToDelete === undefined ? selectedIds : [postToDelete.id];\r\n\r\n return isPinnedDeleted(contentBands, publishedContentBands, idsToCheck);\r\n };\r\n\r\n private onDeletePosts = async (postToDelete?: PostListItem) => {\r\n const isPinnedDeleted = this.getIsPinnedDeleted(postToDelete);\r\n\r\n let singularPost = postToDelete ?? this.state.selectedItems[0];\r\n\r\n const confirmationMessage: string = (this.state.selectedItems.length > 1 && !postToDelete)\r\n ? `You're about to permanently delete these ${this.state.selectedItems.length} posts.`\r\n : `You're about to permanently delete '${singularPost.title}'. You cannot undo this action.`;\r\n\r\n if (await confirm.show({\r\n title: `Delete Post`,\r\n text: (\r\n
    \r\n
    {confirmationMessage}
    \r\n
    \r\n
    Are you sure?
    \r\n
    \r\n ),\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\"\r\n })) {\r\n if (isPinnedDeleted)\r\n this.props.clearContentBands();\r\n\r\n if (postToDelete) {\r\n this.props.deletePosts([postToDelete]).then(() => {\r\n this.onClearAllPosts();\r\n });\r\n }\r\n else {\r\n this.props.deletePosts(this.state.selectedItems).then(() => {\r\n this.onClearAllPosts();\r\n });\r\n }\r\n }\r\n }\r\n\r\n private onEditPost = async (isContributor: boolean, postToEdit?: string, postType?: string) => {\r\n let toEdit = postToEdit ?? this.state.selectedItems[0].draftId;\r\n\r\n let postTypeToEdit = postType ?? this.state.selectedItems[0].postType;\r\n\r\n if (postTypeToEdit === POST_TYPES.COMPLIANCE) {\r\n const complianceStatus = await postsApi.GetPostUsersComplianceStatus(toEdit);\r\n\r\n if (complianceStatus.usersHaveComplied) {\r\n this.setState({ showConfirmComplianceEditPost: true, currDraftId: toEdit });\r\n } else {\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/posts/edit/\" + toEdit);\r\n }\r\n\r\n return;\r\n }\r\n\r\n // show confirmation for contributors if they edit any post that isn't a draft post\r\n if (isContributor &&\r\n (\r\n this.props.page.id === PostListingPageId.PUBLISHED ||\r\n this.props.page.id === PostListingPageId.SCHEDULED ||\r\n (this.state.selectedItems.length === 1 && this.state.selectedItems[0].status !== 'draft') || // editing via single item selection\r\n (this.state.showPostPreview && this.state.postToPreview.status !== 'draft') // editing via post preview\r\n )\r\n )\r\n this.setState({ showEditPublishedPostDialog: true, currDraftId: toEdit });\r\n else\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/posts/edit/\" + toEdit);\r\n }\r\n\r\n private onEditPostConfirm = () => {\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/posts/edit/\" + this.state.currDraftId);\r\n this.setState({ showEditPublishedPostDialog: false, showConfirmComplianceEditPost: false, currDraftId: \"\" });\r\n }\r\n\r\n private onHidePostPreview = () => {\r\n this.setState({ showPostPreview: false, postToPreview: { ...defaultPostOverview } });\r\n }\r\n\r\n /**\r\n * Determine the post endpoint we need to hit, drafts vs posts,\r\n * grab the PostOverview from API,\r\n * set postToPreview state value\r\n * and show preview dialog\r\n */\r\n private onPreviewPost = async (postToDisplay?: PostListItem) => {\r\n const { fetchDraftPost, clearFetchPost } = this.props;\r\n clearFetchPost();\r\n\r\n const { id, draftId, status } = postToDisplay ?? this.state.selectedItems[0];\r\n const isDraft = status === \"draft\";\r\n let task = isDraft ? fetchDraftPost(draftId, ImageScale.Modal) : postsApi.GetPostOverview(id, ImageScale.Modal);\r\n\r\n // since we use redux for fetching the draft the loading overlay is handled in postListing.tsx\r\n this.setState({ isLoadingPreview: !isDraft });\r\n try {\r\n const post = await task;\r\n const postToPreview = {\r\n ...post,\r\n author: isDraft\r\n ? { name: post.author, email: post.authorEmail, avatar: { color: '#2196f3' } }\r\n : post.author,\r\n imageUrl: isDraft\r\n ? post.image.url\r\n : post.imageUrl,\r\n draftId,\r\n // If there is no datePublished (OverviewModelV2), it must be a DraftPostModelv1 which has the prop publishTime\r\n datePublished: post.datePublished ?? post.publishTime,\r\n };\r\n\r\n this.setState({ postToPreview, showPostPreview: true });\r\n } catch (error) {\r\n this.setState({ showPostPreview: false });\r\n\r\n } finally {\r\n this.setState({ isLoadingPreview: false });\r\n }\r\n }\r\n\r\n private onViewInsights = (postToDisplay?: PostListItem) => {\r\n const queryParams = new URLSearchParams(window.location.search);\r\n\r\n const allPageNum = +(queryParams.get(QUERY_PARAM_KEYS.ALL_PAGE_NUMBER) ?? 1);\r\n const pubPageNum = +(queryParams.get(QUERY_PARAM_KEYS.PUBLISHED_PAGE_NUMBER) ?? 1);\r\n const schPageNum = +(queryParams.get(QUERY_PARAM_KEYS.SCHEDULED_PAGE_NUMBER) ?? 1);\r\n const dftPageNum = +(queryParams.get(QUERY_PARAM_KEYS.DRAFT_PAGE_NUMBER) ?? 1);\r\n\r\n let currentTab = +(queryParams.get(QUERY_PARAM_KEYS.TAB_NUMBER) ?? 0);\r\n if (currentTab > 3 || currentTab < 0) {\r\n currentTab = 0;\r\n }\r\n\r\n const pageContext = `${allPageNum},${pubPageNum},${schPageNum},${dftPageNum},${currentTab}`;\r\n\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/posts/\" + (postToDisplay?.id ?? this.state.selectedItems[0].id) + \"?context=\" + pageContext);\r\n }\r\n\r\n private onSelectAllPosts = () => {\r\n if (this.state.selectedItems.length === this.props.page.posts.length)\r\n this.setState({ selectedItems: [] });\r\n else\r\n this.setState({ selectedItems: this.props.page.posts });\r\n }\r\n\r\n private onSelectPost = (ev, post: PostListItem) => {\r\n ev.stopPropagation();\r\n let selectedItems = this.state.selectedItems.slice();\r\n\r\n if (selectedItems.findIndex((selectedItem) => selectedItem.id === post.id) === -1)\r\n selectedItems = selectedItems.concat([post]);\r\n else\r\n selectedItems = selectedItems.filter(selectedItem => selectedItem.id !== post.id);\r\n\r\n this.setState({ selectedItems });\r\n }\r\n\r\n private handlePostClick = async (post: PostListItem, isContributor: boolean) => {\r\n if (post.status !== 'draft' && this.props.page.id !== 'submissions') {\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/posts/\" + (isContributor ? `edit/${post.draftId}` : post.id));\r\n }\r\n else if (!isContributor && this.props.page.id === 'submissions') {\r\n await this.onPreviewPost(post);\r\n }\r\n else {\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/posts/edit/\" + post.id);\r\n }\r\n }\r\n\r\n private onUnpublishPost = async (toUnpublish?: PostListItem) => {\r\n let toRemove = toUnpublish?.id ?? this.state.selectedItems[0].id;\r\n let postTypToEdit = toUnpublish?.postType ?? this.state.selectedItems[0].postType;\r\n\r\n if (postTypToEdit === POST_TYPES.COMPLIANCE) {\r\n const complianceStatus = await postsApi.GetPostUsersComplianceStatus(toRemove);\r\n\r\n if (complianceStatus.usersHaveComplied) {\r\n this.setState({ showConfirmUnpublishCompliancePost: true, currDraftId: toRemove });\r\n } else {\r\n this.unPublishPost(toRemove);\r\n }\r\n } else if (await confirm.show({ text: \"Are you sure you would like to unpublish the selected post? Unpublishing removes the post and deletes all comments and reactions.\", title: \"Unpublish post\" })) {\r\n this.unPublishPost(toRemove);\r\n }\r\n }\r\n\r\n private onUnpublishCompliancePostConfirm = () => {\r\n this.unPublishPost(this.state.currDraftId);\r\n this.setState({ showConfirmUnpublishCompliancePost: false, currDraftId: \"\" });\r\n }\r\n\r\n private onPublishPost = (toPublish: PostListItem) => {\r\n // only show compliance confirm if there is a currently published version of compliance post\r\n let shouldShowConfirmDialog = toPublish.postType === POST_TYPES.COMPLIANCE;\r\n\r\n if (shouldShowConfirmDialog) {\r\n this.setState({ currDraftId: toPublish.draftId, showConfirmPublishEditedCompliancePost: true });\r\n return;\r\n } else {\r\n this.onPublishPostConfirm(toPublish.draftId);\r\n }\r\n }\r\n\r\n private onPublishPostConfirm = (toPublishDraftId: string) => {\r\n let currentTime = moment(new Date()).toISOString();\r\n\r\n this.props.publishPost(toPublishDraftId, currentTime).then(() => {\r\n this.onClearAllPosts();\r\n });\r\n }\r\n\r\n private onChangePage = (page: number, rowsPerPage: number, filters?: Partial) => {\r\n this.setState({ isPagedLoad: true });\r\n this.props.fetchPage(page + 1, filters ?? this.props.filters, rowsPerPage);\r\n }\r\n\r\n private resetSelection = () => {\r\n this.setState({ selectedItems: [] });\r\n }\r\n\r\n private getPublishedTimeTabLabel = (): string => {\r\n if (this.props.page.id === PostListingPageId.PUBLISHED || this.props.page.id === PostListingPageId.ALL) {\r\n return \"Publish date\";\r\n }\r\n\r\n return \"Scheduled for\"\r\n }\r\n\r\n private unPublishPost(toRemove: string) {\r\n this.props.unpublishPost(toRemove).then((succeeded) => {\r\n this.onClearAllPosts();\r\n if (succeeded) this.setState({successMessage: \"Successfully unpublished! Your post has been moved to drafts.\"})\r\n });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n page: PostListingPage;\r\n fetchPage: (pageNumber: number, filters: Partial, pageAmount?: number) => void;\r\n availableTopics: TenantSettingsTagGroup[];\r\n filters: Partial;\r\n onUpdateFilters: (newFilters: Partial, callback?: (() => void | undefined)) => void;\r\n defaultPostFilterValues: PostFilterValues;\r\n}\r\n\r\ninterface ComponentState {\r\n hasFiltersApplied: boolean;\r\n isPagedLoad: boolean;\r\n selectedItems: PostListItem[];\r\n showPostPreview: boolean;\r\n postToPreview: PostOverview;\r\n isLoadingPreview: boolean;\r\n showEditPublishedPostDialog: boolean;\r\n showConfirmComplianceEditPost: boolean;\r\n showConfirmUnpublishCompliancePost: boolean;\r\n showConfirmPublishEditedCompliancePost: boolean;\r\n currDraftId: string;\r\n successMessage: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenant: state.tenant.id,\r\n tenantSettings: state.settings.tenantSettings,\r\n defaultLang: state.settings.tenantSettings ? state.settings.tenantSettings.defaultLCID : \"en-us\",\r\n lcidMappings: state.resources.lcidMappings,\r\n publishing: state.posts.publishing,\r\n currentUser: state.settings.currentUser,\r\n submitting: state.posts.submitting,\r\n contentBandsState: state.contentBands\r\n }),\r\n {\r\n clonePost: actions.clonePost,\r\n deletePosts: actions.deleteDraftPosts,\r\n publishPost: actions.publishPost,\r\n unpublishPost: actions.unpublishPost,\r\n redirectTo: push,\r\n fetchDraftPost: actions.fetchDraftPost,\r\n clearFetchPost: actions.clearFetchPost,\r\n submitPost: actions.submitPost,\r\n clearContentBands: contentBandsSlice.actions.CLEAR_BANDS\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(PostList);\r\n","import { useState, useEffect, useRef } from \"react\";\r\nimport { AxiosResponse } from \"axios\";\r\nimport { debounce } from \"lodash\";\r\nimport useIsMounted from \"./useIsMounted\";\r\n\r\nexport type UseRetryableRequest = {\r\n response?: T;\r\n isFailed: boolean;\r\n};\r\n\r\ninterface RetryableRequest {\r\n asyncRequest: () => Promise>;\r\n maxRetry: number;\r\n requesting: boolean;\r\n}\r\n\r\nconst FETCH_REQUEST_WAIT_MS = 500; // time between requests in ms\r\n\r\nexport function useRetryableRequest(props: RetryableRequest): UseRetryableRequest {\r\n const [retryCount, setRetryCount] = useState(0);\r\n const [res, setRes] = useState(undefined);\r\n const isMounted = useIsMounted();\r\n\r\n const { requesting } = props;\r\n\r\n const makeRequest = useRef(\r\n debounce(async (retry : number) => {\r\n try {\r\n const { data } = await props.asyncRequest();\r\n\r\n data ? setRes(data) : handleFetchPublishedError(retry);\r\n }\r\n catch {\r\n handleFetchPublishedError(retry);\r\n }\r\n }, FETCH_REQUEST_WAIT_MS)\r\n ).current;\r\n\r\n const handleFetchPublishedError = (retry: number) => {\r\n if (retry < props.maxRetry) setRetryCount(retry + 1);\r\n };\r\n\r\n useEffect(() => {\r\n if (requesting && isMounted()) makeRequest(retryCount);\r\n }, [requesting, retryCount, makeRequest, isMounted]);\r\n\r\n return {\r\n response: res,\r\n isFailed: !res && (retryCount >= props.maxRetry)\r\n };\r\n}\r\n","import React from \"react\";\r\nimport { Accordion, AccordionDetails, AccordionSummary, Button, IconButton, useMediaQuery, useTheme } from \"@mui/material\";\r\nimport ReplayIcon from \"@mui/icons-material/Replay\";\r\nimport WhereToVoteIcon from '@mui/icons-material/WhereToVote';\r\nimport PublicIcon from '@mui/icons-material/Public';\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\n\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\nimport { ContentAnalysis } from \"modules/common/components/authoring/models\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport EmptyDataMessage from \"./emptyDataMessage\";\r\n\r\nimport \"../styles/contentAnalyses.sass\";\r\nimport ReadabilityAndReachIndicators from \"./readabilityAndReachIndicators\";\r\nimport TextAndWords from \"./textAndWords\";\r\nimport ContentIssues from \"./contentIssues\";\r\nimport { PostAverages } from \"modules/posts/models\";\r\nimport useAccordion from \"modules/common/hooks/useAccordion\";\r\n\r\ninterface IContentAnalysesProps {\r\n fetching: boolean;\r\n content?: string;\r\n contentAnalyses?: ContentAnalysis;\r\n tenantAverages: PostAverages;\r\n globalAverages: PostAverages;\r\n highlightsOn: boolean;\r\n toggleHighlights?: () => void;\r\n analyze: () => void;\r\n isUsingTenantAverages: boolean;\r\n setIsUsingTenantAverages: (usingTenantData: boolean) => void;\r\n}\r\n\r\nconst SCORE_ICON_SRC: string = \"/images/icons/change_history.svg\";\r\nconst SYNC_ARROWS_SRC: string = \"/images/icons/sync_arrows.svg\";\r\n\r\n// indices for open state array\r\nenum ACCORDIONS {\r\n REACH_AND_READABILITY,\r\n TEXT_AND_WORDS,\r\n ISSUES\r\n}\r\n\r\n// NOTE: This was made when we used the language \"Content Analyses\" in the authoring settings panel tab which is now \"Content Analysis\"\r\nconst ContentAnalyses: React.FunctionComponent = ({\r\n content,\r\n contentAnalyses,\r\n tenantAverages,\r\n globalAverages,\r\n fetching,\r\n highlightsOn,\r\n toggleHighlights,\r\n analyze,\r\n isUsingTenantAverages,\r\n setIsUsingTenantAverages\r\n}) => {\r\n const theme = useTheme();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down('md'), { noSsr: true });\r\n\r\n const accordionHook = useAccordion(3);\r\n const { accordionOpenStates, onChangeAccordionOpen, expandAllLabel, onExpandOrCollapseAll } = accordionHook;\r\n\r\n const {\r\n toneIndicator,\r\n sentimentIndicator,\r\n personalismIndicator,\r\n readabilityIndicator,\r\n wordsPerSentence,\r\n sentencesPerParagraph,\r\n lettersPerWord,\r\n wordsPerParagraph,\r\n syllablesPerWord,\r\n sentenceCount,\r\n wordCount,\r\n readingTime,\r\n highlightAnalysis,\r\n } = contentAnalyses || {};\r\n\r\n const disableHighlightsButton = (): boolean => {\r\n let disable = !content;\r\n\r\n if (!disable) {\r\n disable = !contentAnalyses?.highlightAnalysis?.processedHighlightText.includes(\"data-issues\");\r\n }\r\n\r\n return disable;\r\n }\r\n\r\n const getAccordion = (key: ACCORDIONS, label: string, content: JSX.Element | undefined = <>) => {\r\n return (\r\n onChangeAccordionOpen(expanded, key)}\r\n classes={{\r\n expanded: \"expanded\"\r\n }}\r\n className=\"content-analyses-accordion\"\r\n style={{\r\n width: isSmallAndSmaller ? \"95%\" : 428\r\n }}\r\n >\r\n }\r\n style={{ fontWeight: 500 }}\r\n >\r\n {label}\r\n \r\n \r\n {content}\r\n \r\n \r\n );\r\n }\r\n\r\n const highlightsDisabled = disableHighlightsButton();\r\n return (\r\n
    \r\n
    \r\n
    \r\n {isUsingTenantAverages ?\r\n <>\r\n \r\n \r\n Average scores taken from your organization's most engaging posts.\r\n \r\n \r\n :\r\n <>\r\n \r\n \r\n Global average scores are taken from most engaging posts in Sparrow.\r\n \r\n \r\n }\r\n \"Your\r\n Current scores\r\n
    \r\n\r\n
    \r\n \r\n {`Toggle\r\n \r\n }>\r\n Show or hide highlights\r\n \r\n
    \r\n\r\n \r\n \r\n \r\n }\r\n >\r\n Analyze content again\r\n \r\n
    \r\n {!content\r\n ? \r\n
    \r\n Start writing the body of your post to try our content analysis tool.\r\n
    \r\n
    \r\n : (fetching\r\n ?
    \r\n \r\n
    \r\n :
    \r\n }\r\n text={\"Content analysis applies to English text only.\"}\r\n />\r\n {getAccordion(\r\n ACCORDIONS.REACH_AND_READABILITY,\r\n \"Reach & Readability\",\r\n )}\r\n {getAccordion(\r\n ACCORDIONS.TEXT_AND_WORDS,\r\n \"Text & Words\",\r\n )}\r\n {getAccordion(\r\n ACCORDIONS.ISSUES,\r\n \"Issues\",\r\n )}\r\n
    )\r\n }\r\n
    \r\n \r\n \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default ContentAnalyses;\r\n","import * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport Dialog from '@mui/material/Dialog';\r\nimport { DialogContent } from '@mui/material';\r\nimport * as actions from 'modules/posts/actionCreator';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\n\r\nimport './successfulActionDialog.sass';\r\n\r\nclass SuccessfulActionDialog extends React.Component {\r\n private wrapper: HTMLElement;\r\n\r\n private defaultImage = () =>\r\n
    this.wrapper = e!}>\r\n
    \r\n
    \r\n
    \r\n
    ;\r\n\r\n public render() {\r\n return (\r\n \r\n \r\n {this.props.customImage ?? this.defaultImage()}\r\n\r\n

    {this.props.title}

    \r\n\r\n
    \r\n {this.props.displayMessage}\r\n
    \r\n\r\n {this.props.children ??\r\n
    \r\n \r\n
    \r\n }\r\n
    \r\n \r\n );\r\n }\r\n\r\n private onClickCheckmark = (_e: any) => {\r\n this.wrapper.className = \"\";\r\n setTimeout(() => {\r\n this.wrapper.className = \"success-checkmark-pop-wrapper\";\r\n }, 50);\r\n };\r\n\r\n private onClickOK = () => {\r\n if (this.props.afterPublishSuccess) {\r\n this.props.afterPublishSuccess();\r\n }\r\n this.props.hideSuccessfulActionDialog();\r\n };\r\n}\r\n\r\ninterface ComponentProps {\r\n displayMessage: JSX.Element;\r\n title: string;\r\n afterPublishSuccess?: () => void;\r\n closeModal?: () => any;\r\n customImage?: JSX.Element;\r\n children?: React.ReactNode;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps\r\n }),\r\n {\r\n hideSuccessfulActionDialog: actions.hidePublishSuccessfulDialog\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(SuccessfulActionDialog);","// BUTTON ACTIONS\r\n\r\n// Saving Changes\r\nexport const DRAFT_SAVE_BTN_TEXT = \"Save As Draft\";\r\nexport const DRAFT_MOVE_BTN_TEXT = \"Move To Drafts\";\r\nexport const DRAFT_CHANGED_BTN_TEXT = \"Save Changes\";\r\nexport const DISCARD_BTN_TEXT = \"Discard\";\r\n\r\n// Editing\r\nexport const RETURN_TO_EDITOR = \"Keep Editing\";\r\n\r\n// Publishing\r\nexport const DFLT_PUBLISH_TEXT = \"Publish\";\r\nexport const SUBMISSION_PUBLISH_TEXT = \"Approve & Publish\";\r\nexport const CONTRIBUTOR_PUBLISH_TEXT = \"Submit\";\r\nexport const CONTRIBUTOR_REPUBLISH_TEXT = \"Resubmit\";\r\n\r\nexport const PREVIEW_HOVER_TEXT = \"Preview (Desktop only)\";\r\n\r\nexport const REJECT_BTN_TEXT = \"Reject Submission\";\r\n\r\nexport const BACK_POST_TEXT = \"Back to Manage Posts\";\r\nexport const BACK_EVENT_TEXT = \"Back to Manage Events\";\r\nexport const BACK_EMAIL_TEXT = \"Back to Manage Emails\";\r\n","import * as React from 'react';\r\nimport { useEffect, useState } from 'react';\r\nimport moment from 'moment';\r\nimport { connect, ConnectedProps, useDispatch } from 'react-redux';\r\nimport { Button, Checkbox, FormControlLabel, Typography } from '@mui/material';\r\n\r\nimport * as actions from 'modules/posts/actionCreator';\r\nimport * as userActions from \"modules/profile/actionCreator\";\r\nimport * as eventActions from \"modules/events/actionCreator\";\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport TenantLink from 'modules/common/components/tenantLink';\r\nimport Loading from '../../loading';\r\n\r\nimport SuccessfulActionDialog from 'modules/common/components/successfulActionDialog';\r\nimport { ContentType } from 'modules/common/models';\r\nimport { BACK_EMAIL_TEXT, BACK_EVENT_TEXT, BACK_POST_TEXT } from 'modules/common/components/authoring/constants';\r\nimport { emailsSlice } from 'modules/emails/reducer';\r\n\r\nimport \"../../successfulActionDialog.sass\";\r\n\r\nconst PublishedContentDialog: React.FunctionComponent = (props: PropsWithRedux) => {\r\n const [autoHide, setAutoHide] = useState(props.currentUser.hidePublishDialog);\r\n const [isTimedOut, setIsTimedOut] = React.useState(false);\r\n const [isScheduled, setIsScheduled] = useState(false);\r\n const dispatch = useDispatch();\r\n\r\n const hideEmailSentDialog = () => dispatch({ \r\n type: emailsSlice.actions.SET_SHOW_SENT_CONFIRMATION, \r\n payload: { \r\n sentConfirmation: {\r\n shouldShowDialog: false,\r\n expectedSentTime: \"\",\r\n emailId: \"\",\r\n }\r\n }\r\n });\r\n\r\n const TIMEOUT = 8000;\r\n useEffect(() => {\r\n const autoHideTimeout = setTimeout(() => setIsTimedOut(true), TIMEOUT);\r\n return () => clearTimeout(autoHideTimeout);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (props.expectedPublishTime) {\r\n const isScheduledPost = moment(props.expectedPublishTime)\r\n .isAfter(moment().add(15, \"minutes\"));\r\n\r\n setIsScheduled(isScheduledPost);\r\n }\r\n }, [props.expectedPublishTime]);\r\n\r\n const onClickOK = async () => {\r\n switch (props.content) {\r\n case ContentType.Post:\r\n props.hideSuccessfulPostPublish();\r\n break;\r\n case ContentType.Event:\r\n props.hideSuccessfulEventPublish();\r\n break;\r\n case ContentType.Email:\r\n hideEmailSentDialog();\r\n break;\r\n }\r\n await updateUserSettings();\r\n };\r\n\r\n const updateUserSettings = async () => {\r\n if (props.currentUser.hidePublishDialog === autoHide) return;\r\n\r\n await props.saveUserSettings({ ...props.currentUser, hidePublishDialog : autoHide });\r\n };\r\n\r\n const getRedirectLink = () => {\r\n const contentUrl = `${ContentType[props.content].toLowerCase()}s`;\r\n switch (props.content) {\r\n case ContentType.Post:\r\n case ContentType.Event:\r\n return props.contentId ? `~/${contentUrl}/${props.contentId}` : `~/${contentUrl}`;\r\n case ContentType.Email:\r\n return `~/admin/${contentUrl}/edit/new`;\r\n }\r\n };\r\n\r\n const getDialogImg = (name: string, alt: string) =>\r\n {alt};\r\n\r\n const getReturnButtonText = () => {\r\n switch (props.content) {\r\n case ContentType.Post:\r\n return BACK_POST_TEXT;\r\n case ContentType.Event:\r\n return BACK_EVENT_TEXT;\r\n case ContentType.Email:\r\n return BACK_EMAIL_TEXT;\r\n }\r\n }\r\n\r\n const getReturnButton = () => \r\n \r\n {getReturnButtonText()}\r\n ;\r\n\r\n const autoHideOption = () => setAutoHide(checked)}\r\n size=\"small\"\r\n />\r\n }\r\n label={Automatically hide this next time}\r\n labelPlacement=\"end\"\r\n />;\r\n\r\n const getVideoContentWarning = (): JSX.Element => \r\n {\r\n props.content === ContentType.Post && props.containsVideoContent &&\r\n

    The published post contains video content. As a result this may take a little while to process.

    \r\n }\r\n
    ;\r\n\r\n const getOkButtonText = () => {\r\n switch (props.content) {\r\n case ContentType.Post:\r\n case ContentType.Event:\r\n return `Open ${ContentType[props.content].toLocaleLowerCase()} in portal`;\r\n case ContentType.Email:\r\n return \"Send new email\";\r\n }\r\n }\r\n\r\n const getImmediateContent = (): JSX.Element => {\r\n if (props.hideFeedRedirect) return getVideoContentWarning();\r\n\r\n return props.contentId ?\r\n \r\n \r\n \r\n \r\n\r\n {getVideoContentWarning()}\r\n \r\n : ;\r\n };\r\n\r\n const getDialogContent = () => isScheduled\r\n ? \r\n {getScheduledContentDialog()}\r\n
    \r\n {moment(props.expectedPublishTime).format(\"dddd, MMMM Do YYYY, h:mm a\")}\r\n
    \r\n : getImmediateContent();\r\n\r\n const getScheduledContentDialog = () => {\r\n switch (props.content) {\r\n case ContentType.Post:\r\n case ContentType.Event:\r\n return `This ${ContentType[props.content].toLocaleLowerCase()} will be published on`;\r\n case ContentType.Email:\r\n return \"Your email will be sent on\";\r\n }\r\n }\r\n\r\n const getSuccessImageAltText = () => {\r\n switch (props.content) {\r\n case ContentType.Post:\r\n case ContentType.Event:\r\n return `The ${ContentType[props.content].toLocaleLowerCase()} was successfully published.`;\r\n case ContentType.Email:\r\n return \"The email was successfully sent.\";\r\n }\r\n }\r\n\r\n const getPublishedTitle = () => {\r\n switch (props.content) {\r\n case ContentType.Post:\r\n case ContentType.Event:\r\n return \"Successfully published!\";\r\n case ContentType.Email:\r\n return \"Your email is on its way!\";\r\n }\r\n }\r\n\r\n return (\r\n \r\n {\r\n props.currentUser.hidePublishDialog || isTimedOut\r\n ? null\r\n : \r\n {(isScheduled || props.contentId || props.hideFeedRedirect) && getReturnButton()}\r\n {autoHideOption()}\r\n \r\n }\r\n \r\n );\r\n};\r\n\r\ninterface ComponentProps {\r\n content: ContentType;\r\n expectedPublishTime: string;\r\n hideFeedRedirect: boolean;\r\n containsVideoContent?: boolean;\r\n contentId?: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n currentUser: state.settings.currentUser,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n hideSuccessfulPostPublish: actions.hidePublishSuccessfulDialog,\r\n hideSuccessfulEventPublish: eventActions.clearShowPublishSuccess,\r\n saveUserSettings: userActions.saveUserSettings,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(PublishedContentDialog);","import * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\n\r\nimport { draftPostsApi } from 'api/instances';\r\nimport { ContentType } from 'modules/common/models';\r\nimport { useRetryableRequest } from 'modules/common/hooks/useRetryableRequest';\r\nimport PublishedContentDialog from '../../../../common/components/authoring/dialogs/publishedContentDialog';\r\n\r\nconst MAX_RETRY_COUNT = 3;\r\nconst PublishedPostDialog: React.FunctionComponent = (props: PropsWithRedux) => {\r\n const fetchPostId = async () =>\r\n await draftPostsApi.getPublishedFromDraftId(props.draftId ?? \"\");\r\n\r\n const { response, isFailed } = useRetryableRequest({\r\n asyncRequest: fetchPostId,\r\n maxRetry: MAX_RETRY_COUNT,\r\n requesting: !!props.draftId\r\n });\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n expectedPublishTime: state.posts.publishConfirmation.expectedPublishTime,\r\n publishedPostContainsVideoContent: state.posts.publishConfirmation.containsVideoContent,\r\n draftId: state.posts.publishConfirmation.publishedDraftId,\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(PublishedPostDialog);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\n\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport moment from \"moment\";\r\nimport {\r\n defaultDraftPostFilterValues,\r\n defaultSubmissionPostFilterValues,\r\n defaultPublishedPostFilterValues,\r\n PostFilterValues,\r\n PostListingPage,\r\n TAB_IDS,\r\n} from \"../../models\";\r\nimport PostList from \"./postList\";\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport Tabs from \"pages/common/tabs\";\r\nimport { tagsApi } from \"api/instances\";\r\nimport { TenantSettingsTagGroup } from \"modules/settings\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport { push } from \"react-router-redux\";\r\n\r\nimport { QUERY_PARAM_KEYS } from \"modules/common/hooks/useQueryParams\";\r\nimport { setShouldDisplayNav } from \"modules/adminLayout/actionCreator\";\r\nimport CreatedByFilter, { CreatedBySelectValues } from \"modules/common/components/authoring/createdByFilter\";\r\nimport SuccessSnackbar from \"modules/common/components/snackbars/successSnackbar\";\r\nimport { ContentType } from \"modules/common/models\";\r\n\r\nimport \"../../../common/components/authoring/styles/authoringListing.sass\";\r\nimport PublishedPostDialog from \"../post-creation/dialogs/publishedPostDialog\";\r\nimport { getHighestRole } from \"utils/userRoleUtils\";\r\n\r\nclass PostListing extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n showingPublishErrorsDialog: false,\r\n availableTopics: [],\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n\r\n if (!this.props.shouldDisplayNav)\r\n this.props.setShouldDisplayNav(true);\r\n\r\n const queryParams = new URLSearchParams(window.location.search);\r\n\r\n const allPageNumber = +(queryParams.get(QUERY_PARAM_KEYS.ALL_PAGE_NUMBER) ?? 1);\r\n const publishedPageNumber = +(queryParams.get(QUERY_PARAM_KEYS.PUBLISHED_PAGE_NUMBER) ?? 1);\r\n const scheduledPageNumber = +(queryParams.get(QUERY_PARAM_KEYS.SCHEDULED_PAGE_NUMBER) ?? 1);\r\n const draftPageNumber = +(queryParams.get(QUERY_PARAM_KEYS.DRAFT_PAGE_NUMBER) ?? 1);\r\n const submissionPageNumber = +(queryParams.get(QUERY_PARAM_KEYS.SUBMISSION_PAGE_NUMBER) ?? 1);\r\n\r\n let currentTab = +(queryParams.get(QUERY_PARAM_KEYS.TAB_NUMBER) ?? TAB_IDS.DRAFTS);\r\n if (currentTab >= TAB_IDS.__LENGTH || currentTab < 0) {\r\n currentTab = TAB_IDS.DRAFTS;\r\n }\r\n\r\n const freshLoad = (!queryParams.has(QUERY_PARAM_KEYS.ALL_PAGE_NUMBER) || !queryParams.has(QUERY_PARAM_KEYS.PUBLISHED_PAGE_NUMBER)\r\n || !queryParams.has(QUERY_PARAM_KEYS.SCHEDULED_PAGE_NUMBER) || !queryParams.has(QUERY_PARAM_KEYS.DRAFT_PAGE_NUMBER) || !queryParams.has(QUERY_PARAM_KEYS.TAB_NUMBER));\r\n\r\n if (freshLoad) {\r\n let newUrl = this.generateUrl(currentTab, allPageNumber, publishedPageNumber, scheduledPageNumber, draftPageNumber, submissionPageNumber);\r\n\r\n window.history.replaceState(null, \"\", newUrl);\r\n }\r\n\r\n this.onSelectTab(currentTab, true);\r\n this.fetchLists(allPageNumber, publishedPageNumber, scheduledPageNumber, draftPageNumber, submissionPageNumber);\r\n this.getTags();\r\n }\r\n\r\n private shouldShowLoadingOverlay = () => {\r\n return (this.props.publishing\r\n || this.props.deleting\r\n || this.props.fetching\r\n || this.props.unpublishing)\r\n && !this.props.shouldShowPublishedDialog\r\n && !this.state.showingPublishErrorsDialog;\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: PropsWithRedux, nextState: ComponentState) {\r\n return !(this.props.publishing && !nextProps.publishing && !nextState.showingPublishErrorsDialog); //to ensure publishing state is shown\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux, prevState: ComponentState) {\r\n if (\r\n Object.keys(prevProps.publishValidationErrors.errors).length === 0\r\n && Object.keys(this.props.publishValidationErrors.errors).length > 0\r\n ) {\r\n this.setState(prevState => ({ ...prevState, showingPublishErrorsDialog: true }));\r\n }\r\n\r\n if (this.props.shouldFetch && (this.props.shouldFetch !== prevProps.shouldFetch)) {\r\n this.fetchLists();\r\n }\r\n }\r\n\r\n public render() {\r\n const { selectedTab } = this.props;\r\n\r\n return (\r\n \r\n
    \r\n \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n {this.props.shouldShowPublishedDialog && }\r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n\r\n // apply this filter to all tabs\r\n private onSelectPostCreatedBy = (selection: CreatedBySelectValues) => {\r\n let newFilters = [...this.props.filters];\r\n\r\n newFilters = newFilters.map((filter: Partial) => ({\r\n ...filter,\r\n createdByMeOnly: selection === CreatedBySelectValues.VIEW_MY\r\n }));\r\n\r\n this.props.onReplaceFilters(newFilters, this.fetchLists);\r\n }\r\n\r\n private fetchLists = (\r\n allPageNumber: number = 1,\r\n publishedPageNumber: number = 1,\r\n draftsPageNumber: number = 1,\r\n scheduledPageNumber: number = 1,\r\n submissionPageNumber: number = 1,\r\n ) => {\r\n this.fetchAllPostList(\r\n allPageNumber,\r\n {\r\n sortType: this.props.filters[TAB_IDS.ALL].sortType,\r\n createdByMeOnly: this.props.filters[TAB_IDS.ALL].createdByMeOnly,\r\n },\r\n undefined,\r\n true\r\n );\r\n\r\n this.fetchPublished(\r\n publishedPageNumber,\r\n {\r\n sortType: this.props.filters[TAB_IDS.PUBLISHED].sortType,\r\n createdByMeOnly: this.props.filters[TAB_IDS.PUBLISHED].createdByMeOnly,\r\n },\r\n undefined,\r\n true\r\n );\r\n\r\n this.fetchDrafts(\r\n draftsPageNumber,\r\n {\r\n sortType: this.props.filters[TAB_IDS.DRAFTS].sortType,\r\n createdByMeOnly: this.props.filters[TAB_IDS.DRAFTS].createdByMeOnly,\r\n postStates: this.props.filters[TAB_IDS.DRAFTS].postStates,\r\n },\r\n undefined,\r\n true\r\n );\r\n\r\n this.fetchScheduled(\r\n scheduledPageNumber,\r\n {\r\n sortType: this.props.filters[TAB_IDS.SCHEDULED].sortType,\r\n createdByMeOnly: this.props.filters[TAB_IDS.SCHEDULED].createdByMeOnly,\r\n },\r\n undefined,\r\n true\r\n );\r\n\r\n this.fetchSubmissions(\r\n submissionPageNumber,\r\n {\r\n sortType: this.props.filters[TAB_IDS.SUBMISSIONS].sortType,\r\n createdByMeOnly: this.props.filters[TAB_IDS.SUBMISSIONS].createdByMeOnly,\r\n postStates: this.props.filters[TAB_IDS.SUBMISSIONS].postStates,\r\n },\r\n undefined,\r\n true\r\n );\r\n\r\n this.props.clearShouldFetch();\r\n }\r\n\r\n private fetchSubmissions = (pageNumber: number, filters: Partial, pageAmount?: number, skipUrlUpdate: boolean = false) => {\r\n if (!skipUrlUpdate) {\r\n let newUrl = this.generateUrl(this.props.selectedTab, undefined, undefined, undefined, undefined, pageNumber);\r\n window.history.replaceState(null, \"\", newUrl);\r\n }\r\n\r\n !this.props.submissionPostList.isFetching &&\r\n this.props.fetchSubmissionPosts(pageNumber, filters, pageAmount);\r\n }\r\n\r\n private getTabLabel = (label: string, page: PostListingPage): string => {\r\n if (!!page.currentPage)\r\n return `${label} (${page.totalPosts})`;\r\n return label;\r\n }\r\n\r\n private onSelectTab = (tabIndex: number, skipUrlUpdate: boolean = false) => {\r\n if (!skipUrlUpdate) {\r\n let newUrl = this.generateUrl(tabIndex, undefined, undefined, undefined, undefined);\r\n window.history.replaceState(null, \"\", newUrl);\r\n }\r\n\r\n this.props.onSelectTab(tabIndex);\r\n }\r\n\r\n //Leaving a page number as undefined means it will not be updated in the function call.\r\n private generateUrl = (\r\n tabNumber: number,\r\n allPageNumber?: number,\r\n publishedPageNumber?: number,\r\n scheduledPageNumber?: number,\r\n draftPageNumber?: number,\r\n submissionPageNumber?: number\r\n ) => {\r\n const queryParams = new URLSearchParams(window.location.search);\r\n let newUrl = `/${this.props.tenantId}/admin/posts`;\r\n\r\n const urlAllPageNumber = +(queryParams.get(QUERY_PARAM_KEYS.ALL_PAGE_NUMBER) ?? 1);\r\n const urlPublishedPageNumber = +(queryParams.get(QUERY_PARAM_KEYS.PUBLISHED_PAGE_NUMBER) ?? 1);\r\n const urlScheduledPageNumber = +(queryParams.get(QUERY_PARAM_KEYS.SCHEDULED_PAGE_NUMBER) ?? 1);\r\n const urlDraftPageNumber = +(queryParams.get(QUERY_PARAM_KEYS.DRAFT_PAGE_NUMBER) ?? 1);\r\n const urlDraftSubmissionNumber = +(queryParams.get(QUERY_PARAM_KEYS.SUBMISSION_PAGE_NUMBER) ?? 1);\r\n\r\n newUrl = newUrl + `?${QUERY_PARAM_KEYS.ALL_PAGE_NUMBER}=${allPageNumber ?? urlAllPageNumber}`;\r\n newUrl = newUrl + `&${QUERY_PARAM_KEYS.PUBLISHED_PAGE_NUMBER}=${publishedPageNumber ?? urlPublishedPageNumber}`;\r\n newUrl = newUrl + `&${QUERY_PARAM_KEYS.SCHEDULED_PAGE_NUMBER}=${scheduledPageNumber ?? urlScheduledPageNumber}`;\r\n newUrl = newUrl + `&${QUERY_PARAM_KEYS.DRAFT_PAGE_NUMBER}=${draftPageNumber ?? urlDraftPageNumber}`;\r\n newUrl = newUrl + `&${QUERY_PARAM_KEYS.SUBMISSION_PAGE_NUMBER}=${submissionPageNumber ?? urlDraftSubmissionNumber}`;\r\n newUrl = newUrl + `&${QUERY_PARAM_KEYS.TAB_NUMBER}=${tabNumber}`;\r\n\r\n return newUrl;\r\n }\r\n\r\n private fetchDrafts = (pageNumber: number, filters: Partial, pageAmount?: number, skipUrlUpdate: boolean = false) => {\r\n if (!skipUrlUpdate) {\r\n let newUrl = this.generateUrl(this.props.selectedTab, undefined, undefined, undefined, pageNumber);\r\n window.history.replaceState(null, \"\", newUrl);\r\n }\r\n\r\n !this.props.draftPostList.isFetching &&\r\n this.props.fetchDraftPosts(pageNumber, filters, pageAmount);\r\n }\r\n\r\n private fetchExpired = (pageNumber: number, filters: Partial) => {\r\n !this.props.expiredPostList.isFetching &&\r\n this.props.fetchExpiredPosts(pageNumber, filters);\r\n }\r\n\r\n private fetchPublished = (pageNumber: number, filters: Partial, pageAmount?: number, skipUrlUpdate: boolean = false) => {\r\n if (!skipUrlUpdate) {\r\n let newUrl = this.generateUrl(this.props.selectedTab, undefined, pageNumber, undefined, undefined);\r\n window.history.replaceState(null, \"\", newUrl);\r\n }\r\n\r\n !this.props.publishedPostList.isFetching &&\r\n this.props.fetchPublishedPosts(pageNumber, filters, pageAmount);\r\n }\r\n\r\n private fetchScheduled = (pageNumber: number, filters: Partial, pageAmount?: number, skipUrlUpdate: boolean = false) => {\r\n if (!skipUrlUpdate) {\r\n let newUrl = this.generateUrl(this.props.selectedTab, undefined, undefined, pageNumber, undefined);\r\n window.history.replaceState(null, \"\", newUrl);\r\n }\r\n\r\n !this.props.scheduledPostList.isFetching &&\r\n this.props.fetchScheduledPosts(pageNumber, filters, pageAmount);\r\n }\r\n\r\n private fetchAllPostList = (pageNumber: number, filters: Partial, pageAmount?: number, skipUrlUpdate: boolean = false) => {\r\n if (!skipUrlUpdate) {\r\n let newUrl = this.generateUrl(this.props.selectedTab, pageNumber, undefined, undefined, undefined);\r\n window.history.replaceState(null, \"\", newUrl);\r\n }\r\n\r\n !this.props.allPostList.isFetching &&\r\n this.props.fetchAllPosts(pageNumber, filters, pageAmount);\r\n }\r\n\r\n private getTags = async () => {\r\n let tagsToSet: TenantSettingsTagGroup[] = [];\r\n\r\n tagsApi.getUserTags(true).then(response => {\r\n tagsToSet = response;\r\n }).catch((err) => {\r\n tagsToSet = [];\r\n }).finally(() => {\r\n this.setState({ availableTopics: tagsToSet });\r\n });\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n filters: Partial[];\r\n onUpdateFilters: (newFilters: Partial, callback?: (() => void | undefined)) => void;\r\n onReplaceFilters: (newFilters: Partial[], callback?: (() => void | undefined)) => void;\r\n selectedTab:TAB_IDS;\r\n onSelectTab: (tabIndex: number) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n showingPublishErrorsDialog: boolean;\r\n availableTopics: TenantSettingsTagGroup[];\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenant: state.tenant.id,\r\n allPostList: state.posts.allPostList,\r\n draftPostList: state.posts.draftPostList,\r\n expiredPostList: state.posts.expiredPostList,\r\n publishedPostList: state.posts.publishedPostList,\r\n scheduledPostList: state.posts.scheduledPostList,\r\n submissionPostList: state.posts.submissionPostList,\r\n deleting: state.posts.editor.deleting,\r\n errorMessage: state.posts.errorMessage,\r\n successMessage: state.posts.successMessage,\r\n fetching: state.posts.editor.fetching,\r\n submitting: state.posts.submitting,\r\n isInitialLoad: state.posts.isInitialLoad,\r\n publishing: state.posts.publishing,\r\n publishValidationErrors: state.posts.publishValidationErrors,\r\n shouldShowPublishedDialog: state.posts.publishConfirmation.shouldShowDialog,\r\n unpublishing: state.posts.unpublishing,\r\n shouldFetch: state.posts.shouldFetch,\r\n user: state.settings.currentUser,\r\n tenantId: state.tenant.id,\r\n shouldDisplayNav: state.adminLayout.shouldDisplayNav\r\n }),\r\n {\r\n clearErrorMessage: actions.clearPostAuthoringErrorMessage,\r\n clearSuccessMessage: actions.clearPostAuthoringSuccessMessage,\r\n clearShouldFetch: actions.clearShouldFetch,\r\n fetchAllPosts: actions.fetchAllPost,\r\n fetchDraftPosts: actions.fetchDraftPostList,\r\n fetchExpiredPosts: actions.FetchExpiredPosts,\r\n fetchPublishedPosts: actions.fetchPublishedPosts,\r\n fetchScheduledPosts: actions.fetchScheduledPosts,\r\n fetchSubmissionPosts: actions.fetchSubmissionPosts,\r\n redirectTo: push,\r\n setShouldDisplayNav\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(PostListing);\r\n","import * as React from \"react\"\r\n\r\nimport DownloadReports from \"./action-buttons/downloadReports\";\r\nimport NewPost from \"./action-buttons/newPost\";\r\nimport PostListing from \"./post-listing/postListing\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Header from \"pages/common/header\";\r\nimport MainContent from \"pages/common/mainContent\";\r\nimport { PostFilterValues, TAB_IDS, defaultDraftPostFilterValues, defaultPublishedPostFilterValues, defaultSubmissionPostFilterValues } from \"../models\";\r\n\r\nclass PostManagementPage extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n selectedTab: TAB_IDS.DRAFTS,\r\n filters: Array(TAB_IDS.__LENGTH)\r\n .fill(defaultDraftPostFilterValues, 0, 1)\r\n .fill(defaultSubmissionPostFilterValues, 1, 2)\r\n .fill(defaultPublishedPostFilterValues, 2, TAB_IDS.__LENGTH) // published posts default filter sort by published desc\r\n };\r\n }\r\n\r\n public render() {\r\n return (\r\n \r\n \r\n {\r\n !this.props.isContributor &&\r\n // only support reports downloads for published posts because of accompanying post analytics data and stats\r\n this.state.selectedTab === TAB_IDS.PUBLISHED &&\r\n \r\n }\r\n \r\n \r\n }\r\n />\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n )\r\n }\r\n\r\n private onUpdateFilters = (newFilters: Partial, callback?: (() => void | undefined)) => {\r\n let filters = this.state.filters;\r\n filters[this.state.selectedTab] = newFilters;\r\n\r\n this.setState({ ...this.state, filters }, callback);\r\n }\r\n\r\n private onReplaceFilters = (newFilters: Partial[], callback?: (() => void | undefined)) => {\r\n this.setState({ ...this.state, filters: newFilters }, callback);\r\n }\r\n\r\n private onSelectTab = (tabIndex: number) => {\r\n this.setState({ ...this.state, selectedTab: tabIndex });\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n isContributor: boolean;\r\n}\r\n\r\ninterface ComponentState {\r\n filters: Partial[];\r\n selectedTab: TAB_IDS;\r\n}\r\n\r\nexport default PostManagementPage;","import React from \"react\";\r\nimport { DraftAction, DraftActivity } from \"../models\";\r\nimport { Divider, TableCell, TableRow } from \"@mui/material\";\r\n\r\nimport moment from \"moment\";\r\ninterface ComponentProps {\r\n activity: DraftActivity;\r\n index: number;\r\n}\r\n\r\nconst DraftActivityLog: React.FunctionComponent = (props) => {\r\n const formatDate = (date: Date): string => moment(date).format('MMM D, YYYY, h:mm A');\r\n\r\n const activityToString = (): string => {\r\n var firstLetter = props.activity.action[0].toLocaleUpperCase();\r\n var lowerCaseLetters = props.activity.action.slice(1, props.activity.action.length).toLocaleLowerCase();\r\n return `${firstLetter}${lowerCaseLetters}`;\r\n };\r\n\r\n return (\r\n \r\n {\r\n props.index !== 0 &&\r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n {`${activityToString()}ed By`}\r\n {props.activity.userFullName}\r\n \r\n \r\n {`${activityToString()}ed On`}\r\n {formatDate(props.activity.time)}\r\n \r\n\r\n {\r\n props.activity.action === DraftAction.Reject &&\r\n \r\n {\"Comments\"}\r\n {props.activity.comment ?? No comment}\r\n \r\n }\r\n \r\n );\r\n};\r\n\r\nexport default DraftActivityLog;","import React from \"react\";\r\nimport { Box, Table, TableBody, TableContainer } from \"@mui/material\";\r\nimport { DraftActivity } from \"../models\";\r\nimport DraftActivityLog from \"./draftActivityLog\";\r\nimport \"./draftActivityLog.sass\";\r\n\r\nconst NO_DRAFT_ACTIVITY = \"No publishing history found\";\r\n\r\nexport const DraftHistory: React.FunctionComponent = ({ activities }) => {\r\n return (\r\n \r\n {\r\n !activities || activities?.length === 0\r\n ? \r\n {NO_DRAFT_ACTIVITY}\r\n \r\n : \r\n \r\n \r\n {activities.map((activity: DraftActivity, index: number) =>\r\n \r\n )}\r\n \r\n
    \r\n
    \r\n }\r\n
    \r\n );\r\n};\r\n\r\ninterface IDraftHistoryProps {\r\n activities: DraftActivity[];\r\n}","import React from \"react\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Popover from \"@mui/material/Popover\";\r\nimport RestoreIcon from '@mui/icons-material/Restore';\r\n\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport { DraftActivity } from \"../models\";\r\nimport { draftPostsApi as authoringApi } from \"api/instances\";\r\nimport { DraftHistory } from \"./draftHistory\";\r\n\r\nconst DRAFT_HISTORY_TOOLTIP = \"Publishing and submission log\";\r\n\r\nconst DraftHistoryButton: React.FunctionComponent = (\r\n props\r\n) => {\r\n const [activities, setActivities] = React.useState(undefined);\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n\r\n const [initialOpen, setInitialOpen] = React.useState(false);\r\n\r\n const iconButtonRef = React.createRef();\r\n const open = Boolean(anchorEl);\r\n\r\n const {\r\n inToolbar = false,\r\n otherPopoutsClosed,\r\n } = props;\r\n\r\n const handleOpen = () => {\r\n if (iconButtonRef.current) setAnchorEl(iconButtonRef.current);\r\n };\r\n\r\n const handleClose = () => setAnchorEl(null);\r\n\r\n React.useEffect(() => {\r\n const fetchActivities = async () => {\r\n const draftId = getDraftId();\r\n const act = await authoringApi.getDraftActivity(draftId);\r\n setActivities(act);\r\n };\r\n\r\n if (activities === undefined) fetchActivities();\r\n }, [activities]);\r\n\r\n React.useEffect(() => {\r\n if ((activities?.length ?? 0) > 0 && iconButtonRef.current !== null && !initialOpen && otherPopoutsClosed) {\r\n setAnchorEl(iconButtonRef.current);\r\n setInitialOpen(true);\r\n }\r\n }, [initialOpen, activities, iconButtonRef, otherPopoutsClosed]);\r\n\r\n const getDraftId = () => {\r\n const url = window.location.href;\r\n return url.substring(url.lastIndexOf(\"/\") + 1);\r\n };\r\n\r\n return \r\n \r\n } paperStyle={{ padding: \"unset\" }}>\r\n {}\r\n \r\n \r\n \r\n \r\n \r\n ;\r\n};\r\n\r\ninterface IDraftHistoryButtonProps {\r\n otherPopoutsClosed: boolean;\r\n inToolbar?: boolean;\r\n}\r\n\r\nexport default DraftHistoryButton;","import React from \"react\";\r\nimport { AppBar, Divider, Theme, Toolbar } from \"@mui/material\";\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport DraftHistoryButton from \"./draftLog/draftHistoryButton\";\r\n\r\ninterface IAuthoringAppBar {\r\n backAction: JSX.Element;\r\n actions: JSX.Element;\r\n contentGuidelinesOpen?: boolean;\r\n}\r\n\r\nconst useStylesAppBar = makeStyles((theme: Theme) =>\r\n createStyles({\r\n header: {\r\n backgroundColor: theme.palette.background.default,\r\n color: theme.palette.text.primary,\r\n zIndex: 0,\r\n },\r\n wordmark: {\r\n width: 28,\r\n height: 28,\r\n },\r\n wordMarkContainer: {\r\n backgroundColor: \"#dde1e5\",\r\n height: 50,\r\n width: 50,\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\"\r\n },\r\n toolbarActionsContainer: {\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n justifyContent: \"space-between\",\r\n paddingLeft: 17,\r\n paddingRight: 21,\r\n flex: 1,\r\n backgroundColor: \"#f2f2f2\"\r\n },\r\n authorActionsContainer: {\r\n marginLeft: \"auto\",\r\n display: \"flex\",\r\n alignItems: \"center\"\r\n },\r\n restoreIcon: {\r\n color: \"#d3d3d3\",\r\n marginTop: \"auto\",\r\n marginBottom: \"auto\",\r\n marginLeft: \"5px\"\r\n }\r\n })\r\n);\r\n\r\nconst AuthoringAppBar: React.FunctionComponent = ({\r\n backAction,\r\n actions,\r\n contentGuidelinesOpen\r\n}) => {\r\n const classes = useStylesAppBar();\r\n\r\n const isPostEditor = window.location.href.includes(\"/admin/posts/edit/\");\r\n\r\n return (\r\n \r\n \r\n
    \r\n \"wordmark\"\r\n
    \r\n
    \r\n {backAction}\r\n \r\n {isPostEditor ? : <>}\r\n
    {actions}
    \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport default AuthoringAppBar;\r\n","import React from \"react\";\r\n\r\nconst EditorWrapperLayout: React.FunctionComponent<{}> = (props) => {\r\n return (\r\n
    \r\n {props.children}\r\n
    \r\n );\r\n}\r\n\r\nexport default EditorWrapperLayout;\r\n","import React from \"react\";\r\nimport { Paper, PaperProps } from \"@mui/material\";\r\n\r\ninterface IMainEditorLayoutProps {\r\n paperProps?: PaperProps;\r\n}\r\n\r\nconst MainEditorLayout: React.FunctionComponent = ({\r\n children,\r\n paperProps,\r\n}) => {\r\n return (\r\n \r\n
    \r\n {children}\r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default MainEditorLayout;\r\n","import * as React from \"react\";\r\n\r\nimport { ValidationCheck, ValidationChecks } from \"./models\";\r\n\r\nimport ClickAwayListener from \"@mui/material/ClickAwayListener\";\r\n\r\n\r\n\r\nconst ProgressBar: React.FunctionComponent<{validationChecks: ValidationCheck[]}> = (props) => {\r\n const valid: number = props.validationChecks.filter(check => !check.skip && check.isValid).length;\r\n const total: number = props.validationChecks.filter(check => !check.skip).length;\r\n\r\n const percentComplete = (valid / total) * 100;\r\n const progressBarText = `${valid} of ${total}`;\r\n\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    {progressBarText}
    \r\n
    \r\n );\r\n};\r\n\r\nconst ProgressList: React.FunctionComponent<{validationChecks: ValidationCheck[]}> = (props) => {\r\n return (\r\n \r\n
    \r\n
    \r\n {props.validationChecks.map((check) => {\r\n if (check.skip)\r\n return ;\r\n else\r\n return (\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    {check.description}
    \r\n
    \r\n );\r\n })}\r\n {props.children}\r\n
    \r\n
    \r\n );\r\n};\r\n\r\n\r\nclass Validator extends React.Component {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n expandProgressList: false\r\n };\r\n }\r\n\r\n public render() {\r\n return (\r\n \r\n
    \r\n
    \r\n \r\n {this.props.children}\r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private onCollapseProgressList = () => {\r\n this.setState({ expandProgressList: false });\r\n }\r\n\r\n private onExpandProgressList = () => {\r\n this.setState({ expandProgressList: true });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n validationChecks: ValidationChecks;\r\n}\r\n\r\ninterface ComponentState {\r\n expandProgressList: boolean;\r\n}\r\n\r\nexport default Validator;\r\nexport { ProgressBar, ProgressList };\r\n","import React from \"react\";\r\n\r\nimport { Drawer, DrawerProps, IconButton, useMediaQuery, useTheme } from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\ninterface IAuthoringDrawerProps extends DrawerProps {\r\n onBookmarkClick: () => void;\r\n}\r\n\r\nconst AuthoringDrawer: React.FunctionComponent = ({\r\n children,\r\n onBookmarkClick,\r\n ...drawerProps\r\n}) => {\r\n const theme = useTheme();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down('md'), { noSsr: true });\r\n\r\n return (\r\n \r\n <>\r\n {isSmallAndSmaller &&\r\n
    \r\n \r\n \r\n \r\n
    }\r\n {children}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default AuthoringDrawer;","import React from \"react\";\r\n\r\nimport { DatePicker as DatePickerMui } from \"@mui/x-date-pickers/DatePicker\";\r\nimport moment from \"moment\";\r\nimport { DateView } from \"@mui/x-date-pickers\";\r\n\r\ninterface IDatePickerProps {\r\n clearable?: boolean;\r\n placeholder?: string;\r\n minDate?: moment.Moment;\r\n maxDate?: moment.Moment;\r\n date?: string;\r\n style?: React.CSSProperties;\r\n views?: DateView[];\r\n avoidPickerViewLayoutShift?: boolean;\r\n onChangeDate: (value: string | undefined) => void;\r\n inputEndAdornment?: JSX.Element;\r\n}\r\n/**\r\n * Wrapper around KeyboardDatePicker\r\n */\r\nconst DatePicker: React.FunctionComponent = ({\r\n clearable,\r\n minDate,\r\n maxDate,\r\n placeholder,\r\n date,\r\n style,\r\n views,\r\n avoidPickerViewLayoutShift,\r\n onChangeDate,\r\n inputEndAdornment\r\n}) => {\r\n const onChangeDateInternal = (newDate) => {\r\n const publishTime: string = date\r\n ? moment(newDate).toISOString()\r\n : moment(newDate).startOf(\"hour\").add(1, \"hour\").toISOString();\r\n\r\n onChangeDate(publishTime);\r\n }\r\n\r\n return (\r\n }) => {\r\n state.styles.popper.height = '320px';\r\n if (state.placement.includes('top-start')) {\r\n state.styles.popper = {\r\n ...state.styles.popper,\r\n display: 'flex',\r\n alignItems: 'flex-end',\r\n };\r\n }\r\n if (state.placement.includes('bottom')) {\r\n state.styles.popper = {\r\n ...state.styles.popper,\r\n display: 'block',\r\n };\r\n }\r\n },\r\n }\r\n : {}\r\n ],\r\n },\r\n textField: {\r\n size: \"small\",\r\n placeholder: placeholder || \"Select date\",\r\n inputProps: { readOnly: true },\r\n style: { ...style },\r\n InputProps: { endAdornment: inputEndAdornment }\r\n },\r\n openPickerIcon: {\r\n color: \"primary\"\r\n },\r\n actionBar: {\r\n actions: clearable\r\n ? ['clear']\r\n : [] //Swapped clearable functionality above for this.\r\n }\r\n }}\r\n onChange={onChangeDateInternal}\r\n className=\"date-picker\"\r\n />\r\n );\r\n}\r\n\r\nexport default DatePicker;\r\n","import React from \"react\";\r\nimport { TextField } from \"@mui/material\";\r\nimport DatePicker from \"./datePicker\";\r\nimport moment from \"moment\";\r\nimport EventIcon from '@mui/icons-material/Event';\r\nimport ScheduleIcon from '@mui/icons-material/Schedule';\r\nimport \"../styles/switchAndCollapse.sass\";\r\nimport { DateView } from \"@mui/x-date-pickers\";\r\n\r\ninterface IDateAndTimeProps {\r\n date?: string;\r\n label?: string;\r\n datePlaceholder?: string;\r\n timePlaceholder?: string;\r\n minDate?: moment.Moment;\r\n maxDate?: moment.Moment;\r\n containerStyle?: React.CSSProperties;\r\n dateStyle?: React.CSSProperties;\r\n timeStyle?: React.CSSProperties;\r\n clearable?: boolean;\r\n views?: DateView[];\r\n avoidPickerViewLayoutShift?: boolean;\r\n onChangeDate: (value: string | undefined) => void;\r\n showIcons?: boolean;\r\n initializeDateWithCurrentTime?: boolean;\r\n}\r\n\r\nconst DateAndTime: React.FunctionComponent = ({\r\n date,\r\n label,\r\n minDate,\r\n maxDate,\r\n datePlaceholder,\r\n dateStyle,\r\n timeStyle,\r\n timePlaceholder,\r\n views,\r\n clearable = false,\r\n avoidPickerViewLayoutShift,\r\n onChangeDate,\r\n showIcons = false,\r\n initializeDateWithCurrentTime = false\r\n}) => {\r\n const timeDisabled = Boolean(date) === false;\r\n\r\n const onChangeTimeInternal = (event: React.ChangeEvent) => {\r\n const times: number[] = event.target.value.split(\":\").map(time => Number(time));\r\n onChangeTime(times[0], times[1]);\r\n }\r\n\r\n const onChangeTime = (hours: number, minutes: number, dateValue = date) => {\r\n const publishTime: string = moment(dateValue)\r\n .set(\"hour\", hours)\r\n .set(\"minutes\", minutes)\r\n .toISOString();\r\n\r\n onInnerChangeDate(publishTime);\r\n }\r\n\r\n const getTime = (): string | undefined | null => {\r\n let result: string | undefined | null = \"\";\r\n if (Boolean(date))\r\n result = moment(date).format(\"HH:mm\");\r\n\r\n return result;\r\n }\r\n\r\n const onChangeDatePicker = (value: string | undefined) => {\r\n if (initializeDateWithCurrentTime && !date) {\r\n onChangeTime(moment().hours(), moment().minutes(), value);\r\n }\r\n else {\r\n onInnerChangeDate(value);\r\n }\r\n }\r\n\r\n const onInnerChangeDate = (value: string | undefined) => {\r\n if (minDate && moment(value).isBefore(minDate)) {\r\n onChangeDate(minDate.toISOString());\r\n }\r\n else {\r\n onChangeDate(value);\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n
    \r\n {label && }\r\n : undefined}\r\n />\r\n {\r\n Boolean(date)\r\n ? \r\n // TextFields with type=\"time\" do not support placeholder so we use an empty TextField instead if there is no valid date\r\n : \r\n }}\r\n value=\"\"\r\n />\r\n }\r\n
    \r\n \r\n );\r\n}\r\n\r\nexport default DateAndTime;\r\n","import * as React from \"react\";\r\n\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport Switch from \"@mui/material/Switch\";\r\nimport moment from \"moment\";\r\n\r\nimport DateAndTime from \"modules/common/components/forms/inputs/dateAndTime\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\n\r\nclass BreakingTime extends React.Component {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n showBreakingTime: this.props.breakingTime ? true : false\r\n };\r\n }\r\n\r\n public render() {\r\n const { breakingTime = \"\", publishTime = \"\", expiryTime } = this.props;\r\n\r\n const isBackdated: boolean = moment(publishTime).isBefore(new Date());\r\n const minBreakingTime = isBackdated ? moment(publishTime) : moment(publishTime || new Date());\r\n const maxBreakingTime = expiryTime ? moment(expiryTime) : undefined;\r\n\r\n return (\r\n <>\r\n
    \r\n
    \r\n Set as \r\n \r\n Displays the Breaking News banner on the post and pins the post on certain web parts until the banner expires.\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n \r\n );\r\n }\r\n\r\n private onToggleBreakingTime = () => {\r\n if (!this.state.showBreakingTime)\r\n this.props.onChange(moment().add(72, \"hours\").toISOString());\r\n else\r\n this.props.onChange(null);\r\n\r\n this.setState({ showBreakingTime: !this.state.showBreakingTime });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n breakingTime: string | undefined;\r\n publishTime: string | undefined;\r\n expiryTime: string | undefined;\r\n onChange: (breakingTime: string | null | undefined) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n showBreakingTime: boolean;\r\n}\r\n\r\nexport default BreakingTime;\r\n","import * as React from \"react\";\r\n\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport Switch from \"@mui/material/Switch\";\r\n\r\nimport moment from \"moment\";\r\nimport DateAndTime from \"modules/common/components/forms/inputs/dateAndTime\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\n\r\nclass FeaturedTime extends React.Component {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n showFeaturedTime: !!this.props.featuredTime\r\n };\r\n }\r\n\r\n public render() {\r\n const { featuredTime, publishTime, expiryTime } = this.props;\r\n\r\n const isBackdated: boolean = moment(publishTime).isBefore(new Date());\r\n const nonBackdatedLimit = moment(this.props.publishTime || new Date()).add(14, \"days\");\r\n\r\n const minFeaturedTime = isBackdated \r\n ? moment(publishTime) \r\n : moment(publishTime || new Date());\r\n\r\n //If it's not backdated, check if the 14 day hard limit or the expiry time is closer to now and use that one.\r\n const maxFeaturedTime = isBackdated \r\n ? moment(new Date()).add(14, \"days\") \r\n : (expiryTime && nonBackdatedLimit.isAfter(expiryTime) \r\n ? moment(expiryTime) \r\n : nonBackdatedLimit);\r\n\r\n return (\r\n <>\r\n
    \r\n
    \r\n Set as \r\n \r\n Displays the Featured News banner on the post until it the specified date.\r\n \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n \r\n );\r\n }\r\n\r\n private onToggleFeaturedTime = () => {\r\n if (!this.state.showFeaturedTime)\r\n this.props.onChange(moment().add(14, \"days\").toISOString());\r\n else\r\n this.props.onChange(null);\r\n\r\n this.setState({ showFeaturedTime: !this.state.showFeaturedTime });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n featuredTime: string | undefined;\r\n publishTime: string | undefined;\r\n expiryTime: string | undefined;\r\n onChange: (featuredTime: string | null | undefined) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n showFeaturedTime: boolean;\r\n}\r\n\r\nexport default FeaturedTime;\r\n","import * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\n\r\nimport { NotificationRange, Notifications, Reminder, ReminderChannel } from \"./models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport Drawer from \"@mui/material/Drawer\";\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport Radio from \"@mui/material/Radio\";\r\nimport RadioGroup from \"@mui/material/RadioGroup\";\r\nimport Select from \"@mui/material/Select\";\r\nimport Switch from \"@mui/material/Switch\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport ArrowBackIcon from \"@mui/icons-material/ArrowBack\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\n\r\n\r\nclass Reminders extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n \r\n this.state = {\r\n reminders: props.isPreviouslyPublished ? this.getReminders() : [this.getDefaultReminder()]\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.show && !prevProps.show) {\r\n this.setState({\r\n reminders: !!this.props.notifications\r\n ? this.getReminders()\r\n : [this.getDefaultReminder()]\r\n });\r\n }\r\n }\r\n\r\n public render() {\r\n if (!this.props.show || !this.props.notifications || !this.props.notificationSettings)\r\n return ;\r\n\r\n const { type } = this.props;\r\n\r\n const settings = this.props.notificationSettings.settings;\r\n const reminderSettingsEnabled = settings[`${type}ReminderEmailAttempt`]?.toggle || settings[`${type}ReminderMobileAttempt`]?.toggle || settings[`${type}ReminderSMSAttempt`]?.toggle || settings[`${type}ReminderTeamsAttempt`]?.toggle;\r\n\r\n if (!reminderSettingsEnabled)\r\n return ;\r\n \r\n return (\r\n \r\n \r\n \r\n \r\n \r\n
    More {type} reminder settings
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    Send reminder if {type} is unread
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n Remind employees if the {type} is still unread after a set amount of time. Add/edit additional reminder channels:\r\n
    \r\n
    \r\n {this.state.reminders.map((reminder, index) =>\r\n \r\n \r\n
    Reminder {index + 1}
    \r\n
    \r\n
    \r\n
    If unread, send reminder after
    \r\n this.onChangeReminderDelay(index, ev.target.value as unknown as number)}\r\n className=\"reminder-time-input\"\r\n />\r\n \r\n this.onChangeReminderDelayType(index, ev.target.value as DelayType)}\r\n className=\"reminder-time-type\"\r\n >\r\n hours\r\n days\r\n \r\n \r\n
    \r\n
    \r\n \r\n this.onSetNotificationReminderChannels(index)}\r\n />\r\n }\r\n label={`Use channels selected in ${type} publishing notifications`}\r\n />\r\n this.onSetCustomReminderChannels(index)}\r\n />\r\n }\r\n label=\"Custom channel options\"\r\n />\r\n \r\n \r\n
    \r\n {settings[`${type}ReminderTeamsAttempt`]?.toggle &&\r\n
    \r\n this.onChangeReminderChannel(checked, index, \"teams\")}\r\n />\r\n }\r\n label=\"MS Teams Chatbot\"\r\n />\r\n
    \r\n }\r\n {settings[`${type}ReminderMobileAttempt`]?.toggle &&\r\n
    \r\n this.onChangeReminderChannel(checked, index, \"mobile\")}\r\n />\r\n }\r\n label=\"Mobile App\"\r\n />\r\n
    \r\n }\r\n {settings[`${type}ReminderEmailAttempt`]?.toggle &&\r\n
    \r\n this.onChangeReminderChannel(checked, index, \"email\")}\r\n />\r\n }\r\n label=\"Email\"\r\n />\r\n \r\n this.onChangeReminderRange(index, \"email\", ev.target.value as NotificationRange)}\r\n className=\"custom-reminder-type\"\r\n >\r\n Only if standard app notifications are not set up\r\n To all topic subscribers\r\n \r\n \r\n
    \r\n }\r\n {settings[`${type}ReminderSMSAttempt`]?.toggle &&\r\n
    \r\n this.onChangeReminderChannel(checked, index, \"sms\")}\r\n />\r\n }\r\n label=\"SMS\"\r\n />\r\n \r\n this.onChangeReminderRange(index, \"sms\", ev.target.value as NotificationRange)}\r\n className=\"custom-reminder-type\"\r\n >\r\n Only if standard app notifications or email are not set up\r\n To all topic subscribers\r\n \r\n \r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n {index !== 0 &&\r\n this.onDeleteReminder(index)}>\r\n }\r\n
    \r\n )}\r\n {!!this.state.reminders.length && this.state.reminders.length < 5 &&\r\n \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n\r\n private getDefaultReminder = (): ReminderOption => {\r\n const { type } = this.props;\r\n const defaultReminder = this.props.notificationSettings[`default${type.charAt(0).toUpperCase() + type.substr(1)}Reminder`];\r\n\r\n const reminder: number = defaultReminder || 0;\r\n const delay: number = reminder % 24 === 0 ? reminder / 24 : reminder;\r\n const delayType: DelayType = reminder > 0 && reminder % 24 === 0 ? \"days\" : \"hours\";\r\n\r\n let reminderOption: ReminderOption = {\r\n customChannels: false,\r\n delay: delay,\r\n delayType: delayType,\r\n emailRange: \"fallback\",\r\n mobileRange: \"none\",\r\n sendEmail: false,\r\n sendSMS: false,\r\n smsRange: \"fallback\",\r\n teamsRange: \"none\"\r\n };\r\n\r\n reminderOption.customChannels = this.getDefaultCustomerChannels();\r\n\r\n return reminderOption;\r\n }\r\n\r\n private getDefaultCustomerChannels = () => {\r\n\r\n return !!this.props.notifications && (this.props.notifications.emailOnPublish === \"none\" && this.props.notifications.mobileOnPublish === \"none\" && this.props.notifications.smsOnPublish === \"none\" && this.props.notifications.teamsOnPublish === \"none\");\r\n }\r\n\r\n private getReminders = (): ReminderOption[] => {\r\n if (!!this.props.notifications && !!this.props.notifications.reminders) {\r\n if (!this.props.notifications.reminders.length)\r\n return [this.getDefaultReminder()];\r\n \r\n let reminders: ReminderOption[] = [];\r\n this.props.notifications.reminders.map((reminder, index) => {\r\n const delay: number = reminder.delay % 24 === 0 ? reminder.delay / 24 : reminder.delay;\r\n const delayType: DelayType = reminder.delay > 0 && reminder.delay % 24 === 0 ? \"days\" : \"hours\";\r\n\r\n /** Parse out \"default\" channels if returned from the API */\r\n if (reminder.channel as string === \"default\")\r\n return reminder;\r\n\r\n if (reminder.channel === \"none\") {\r\n reminders.push({\r\n customChannels: true,\r\n delay: delay,\r\n delayType: delayType,\r\n emailRange: \"fallback\",\r\n mobileRange: \"none\",\r\n sendEmail: false,\r\n sendSMS: false,\r\n smsRange: \"fallback\",\r\n teamsRange: \"none\"\r\n });\r\n } else if (reminder.channel === \"inherit\") {\r\n reminders.push({\r\n customChannels: false,\r\n delay: delay,\r\n delayType: delayType,\r\n emailRange: \"fallback\",\r\n mobileRange: \"none\",\r\n sendEmail: false,\r\n sendSMS: false,\r\n smsRange: \"fallback\",\r\n teamsRange: \"none\"\r\n });\r\n } else {\r\n if (index > 0 && (reminders[reminders.length - 1].delay === delay && reminders[reminders.length - 1].delayType === delayType)) {\r\n if (reminder.channel === \"email\") {\r\n reminders[reminders.length - 1].emailRange = reminder.range;\r\n reminders[reminders.length - 1].sendEmail = true;\r\n } else if (reminder.channel === \"mobile\") {\r\n reminders[reminders.length - 1].mobileRange = reminder.range;\r\n } else if (reminder.channel === \"sms\") {\r\n reminders[reminders.length - 1].sendSMS = true;\r\n reminders[reminders.length - 1].smsRange = reminder.range;\r\n } else if (reminder.channel === \"teams\") {\r\n reminders[reminders.length - 1].teamsRange = reminder.range;\r\n }\r\n } else {\r\n reminders.push({\r\n customChannels: true,\r\n delay: delay,\r\n delayType: delayType,\r\n emailRange: reminder.channel === \"email\" ? reminder.range : \"subscribers\",\r\n mobileRange: reminder.channel === \"mobile\" ? reminder.range : \"none\",\r\n sendEmail: reminder.channel === \"email\",\r\n sendSMS: reminder.channel === \"sms\",\r\n smsRange: reminder.channel === \"sms\" ? reminder.range : \"subscribers\",\r\n teamsRange: reminder.channel === \"teams\" ? reminder.range : \"none\"\r\n });\r\n }\r\n }\r\n return reminder;\r\n });\r\n\r\n return reminders;\r\n }\r\n\r\n return [this.getDefaultReminder()];\r\n }\r\n\r\n\r\n private onAddReminder = () => {\r\n this.setState({ reminders: this.state.reminders.concat([ this.getDefaultReminder() ]) })\r\n }\r\n\r\n private onApplyReminderSettings = () => {\r\n let reminders: Reminder[] = [];\r\n\r\n this.state.reminders\r\n .filter((reminder) => !!reminder.delay)\r\n .map((reminder) => {\r\n const delay: number = reminder.delayType === \"hours\" ? reminder.delay! : reminder.delay! * 24;\r\n\r\n if (!reminder.customChannels) {\r\n reminders.push({ channel: \"inherit\", delay, range: \"subscribers\" });\r\n } else if (!reminder.sendEmail && reminder.mobileRange === \"none\" && !reminder.sendSMS && reminder.teamsRange === \"none\") {\r\n reminders.push({ channel: \"none\", delay, range: \"fallback\" });\r\n } else {\r\n if (reminder.sendEmail)\r\n reminders.push({ channel: \"email\", delay, range: reminder.emailRange });\r\n if (reminder.mobileRange !== \"none\")\r\n reminders.push({ channel: \"mobile\", delay, range: reminder.mobileRange });\r\n if (reminder.sendSMS)\r\n reminders.push({ channel: \"sms\", delay, range: reminder.smsRange });\r\n if (reminder.teamsRange !== \"none\")\r\n reminders.push({ channel: \"teams\", delay, range: reminder.teamsRange });\r\n }\r\n return reminder;\r\n });\r\n\r\n const notifications: Notifications = {\r\n ...this.props.notifications!,\r\n reminders: reminders\r\n };\r\n this.props.onChangeNotifications(notifications);\r\n }\r\n \r\n private onChangeReminderChannel = (checked: boolean, reminderIndex: number, channel: ReminderChannel) => {\r\n const reminders: ReminderOption[] = this.state.reminders.map((reminder, index) => {\r\n if (index === reminderIndex) {\r\n if (channel === \"email\")\r\n return { ...reminder, sendEmail: checked };\r\n else if (channel === \"mobile\")\r\n return { ...reminder, mobileRange: checked ? \"subscribers\" : \"none\" };\r\n else if (channel === \"sms\")\r\n return { ...reminder, sendSMS: checked };\r\n else if (channel === \"teams\")\r\n return { ...reminder, teamsRange: checked ? \"subscribers\" : \"none\" };\r\n return reminder;\r\n }\r\n return reminder;\r\n });\r\n\r\n this.setState({ reminders });\r\n }\r\n\r\n private onChangeReminderDelay = (reminderIndex: number, delay: number) => {\r\n const reminders: ReminderOption[] = this.state.reminders.map((reminder, index) => {\r\n if (index === reminderIndex)\r\n return { ...reminder, delay: isNaN(delay) ? 0 : delay };\r\n return reminder;\r\n });\r\n\r\n this.setState({ reminders });\r\n }\r\n\r\n private onChangeReminderDelayType = (reminderIndex: number, delayType: DelayType) => {\r\n const reminders: ReminderOption[] = this.state.reminders.map((reminder, index) => {\r\n if (index === reminderIndex)\r\n return { ...reminder, delayType };\r\n return reminder;\r\n });\r\n\r\n this.setState({ reminders });\r\n }\r\n\r\n private onChangeReminderRange = (reminderIndex: number, channel: ReminderChannel, range: NotificationRange) => {\r\n const reminders: ReminderOption[] = this.state.reminders.map((reminder, index) => {\r\n if (index === reminderIndex) {\r\n if (channel === \"email\")\r\n return { ...reminder, emailRange: range };\r\n else if (channel === \"sms\")\r\n return { ...reminder, smsRange: range };\r\n return reminder;\r\n }\r\n return reminder;\r\n });\r\n\r\n this.setState({ reminders });\r\n }\r\n\r\n private onClose = () => {\r\n this.onApplyReminderSettings();\r\n this.props.onClose();\r\n }\r\n\r\n private onDeleteReminder = (reminderIndex: number) => {\r\n let reminders: ReminderOption[] = this.state.reminders.slice();\r\n reminders.splice(reminderIndex, 1);\r\n this.setState({ reminders });\r\n }\r\n\r\n private onSetCustomReminderChannels = (reminderIndex: number) => {\r\n const reminders: ReminderOption[] = this.state.reminders.map((reminder, index) => {\r\n if (index === reminderIndex)\r\n return { ...reminder, customChannels: true };\r\n return reminder;\r\n });\r\n\r\n this.setState({ reminders });\r\n }\r\n\r\n private onSetNotificationReminderChannels = (reminderIndex: number) => {\r\n const reminders: ReminderOption[] = this.state.reminders.map((reminder, index) => {\r\n if (index === reminderIndex)\r\n return { ...reminder, customChannels: false };\r\n return reminder;\r\n });\r\n \r\n this.setState({ reminders });\r\n }\r\n\r\n private onToggleRemindersEnabled = () => {\r\n if (!!this.state.reminders.length) {\r\n this.setState({ reminders: [] });\r\n } else {\r\n this.setState({ reminders: [this.getDefaultReminder()] });\r\n }\r\n }\r\n}\r\n\r\n\r\ninterface ReminderOption {\r\n customChannels: boolean;\r\n delay: number | undefined;\r\n delayType: DelayType;\r\n emailRange: NotificationRange;\r\n mobileRange: NotificationRange;\r\n sendEmail: boolean;\r\n sendSMS: boolean;\r\n smsRange: NotificationRange;\r\n teamsRange: NotificationRange;\r\n}\r\n\r\ntype DelayType = \"hours\" | \"days\";\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n isPreviouslyPublished: boolean;\r\n notifications: Notifications | undefined;\r\n type: \"post\" | \"event\";\r\n onChangeNotifications: (notifications: Notifications) => void;\r\n onClose: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n reminders: ReminderOption[];\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n tenantSettings: state.settings.tenantSettings,\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(Reminders);","import * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\n\r\nimport { NotificationRange, Notifications as INotifications } from \"./models\";\r\n\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport Drawer from \"@mui/material/Drawer\";\r\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport Radio from \"@mui/material/Radio\";\r\nimport RadioGroup from \"@mui/material/RadioGroup\";\r\nimport Switch from \"@mui/material/Switch\";\r\n\r\nimport ArrowBackIcon from \"@mui/icons-material/ArrowBack\";\r\n\r\nclass Notifications extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = this.getNotifications();\r\n }\r\n\r\n public render() {\r\n const { type } = this.props;\r\n\r\n const areAnyPlatformsEnabled =\r\n this.props.notificationSettings.settings[`${type}PublishedEmailAttempt`].toggle ||\r\n this.props.notificationSettings.settings[`${type}PublishedTeamsAttempt`].toggle ||\r\n this.props.notificationSettings.settings[`${type}PublishedSMSAttempt`].toggle ||\r\n this.props.notificationSettings.settings[`${type}PublishedMobileAttempt`].toggle;\r\n\r\n if (!this.props.show || !this.props.notifications || !this.props.notificationSettings || !areAnyPlatformsEnabled)\r\n return ;\r\n\r\n const { settings } = this.props.notificationSettings;\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n
    Edit notification upon publishing
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    Notify upon publishing
    \r\n this.onTogglePostNotifications(evt.target.checked)}\r\n disabled={!areAnyPlatformsEnabled}\r\n />\r\n
    \r\n \r\n
    \r\n
    \r\n Upon publishing this {type}, employees will be notified through the following channels:\r\n
    \r\n {settings[`${type}PublishedTeamsAttempt`]?.toggle && (\r\n
    \r\n \r\n }\r\n label=\"MS Teams Chatbot\"\r\n />\r\n
    \r\n )}\r\n {settings[`${type}PublishedMobileAttempt`]?.toggle && (\r\n
    \r\n \r\n }\r\n label=\"Mobile App\"\r\n />\r\n
    \r\n )}\r\n {settings[`${type}PublishedEmailAttempt`]?.toggle && (\r\n
    \r\n this.onToggleEmailEnabled(e)}\r\n />\r\n }\r\n label=\"Email\"\r\n />\r\n
    \r\n \r\n \r\n }\r\n label=\"Send to all topic subscribers\"\r\n />\r\n \r\n }\r\n label=\"Send email only if standard app notifications are not set up for the topic subscriber\"\r\n />\r\n \r\n
    \r\n
    \r\n )}\r\n {settings[`${type}PublishedSMSAttempt`]?.toggle && (\r\n
    \r\n this.onToggleSMSEnabled(e)}\r\n />\r\n }\r\n label=\"SMS\"\r\n />\r\n
    \r\n \r\n \r\n }\r\n label=\"Send to all topic subscribers\"\r\n />\r\n \r\n \r\n }\r\n label=\"Send SMS only if standard app notifications or email are not set up for the topic subscriber\"\r\n />\r\n
    \r\n
    \r\n )}\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n /*\r\n * Gets the current notifications on first mount, if a post has previous notifications set the post notifications. If the post is previouslyPublished disable the notifications\r\n * else set the default notifications. If toggle is off, set the post notifications that are saved to the post.\r\n */\r\n private getNotifications = (): ComponentState => {\r\n const { notifications } = this.props;\r\n\r\n let isOldPublishedPost = this.props.isPreviouslyPublished && this.props.postPublished && new Date(this.props.postPublished).toISOString() <= new Date().toISOString();\r\n\r\n //Checks if our toggle is on, if it is let's use the post notifications else if it's not, let's use our default notifications\r\n if (this.props.notificationsToggle) {\r\n if (isOldPublishedPost || this.props.previousNotifications) {\r\n return {\r\n emailEnabled: !!this.props.previousNotifications && this.props.previousNotifications.emailOnPublish !== \"none\",\r\n emailNotificationRange:\r\n !!this.props.previousNotifications && this.props.previousNotifications.emailOnPublish !== \"none\"\r\n ? this.props.previousNotifications.emailOnPublish\r\n : \"none\",\r\n mobileNotificationRange:\r\n !!this.props.previousNotifications && this.props.previousNotifications.mobileOnPublish !== \"none\"\r\n ? this.props.previousNotifications.mobileOnPublish\r\n : \"none\",\r\n notificationsEnabled: isOldPublishedPost ? false : true,\r\n smsEnabled: !!this.props.previousNotifications && this.props.previousNotifications.smsOnPublish !== \"none\",\r\n smsNotificationRange:\r\n !!this.props.previousNotifications && this.props.previousNotifications.smsOnPublish !== \"none\"\r\n ? this.props.previousNotifications!.smsOnPublish\r\n : \"none\",\r\n teamsNotificationRange:\r\n !!this.props.previousNotifications && this.props.previousNotifications.teamsOnPublish !== \"none\"\r\n ? this.props.previousNotifications!.teamsOnPublish\r\n : \"none\",\r\n };\r\n } else {\r\n return {\r\n emailEnabled: !!this.props.defaultNotificationsState && this.props.defaultNotificationsState.emailOnPublish !== \"none\",\r\n emailNotificationRange:\r\n !!this.props.defaultNotificationsState && this.props.defaultNotificationsState.emailOnPublish !== \"none\"\r\n ? this.props.defaultNotificationsState.emailOnPublish\r\n : \"none\",\r\n mobileNotificationRange:\r\n !!this.props.defaultNotificationsState && this.props.defaultNotificationsState.mobileOnPublish !== \"none\"\r\n ? this.props.defaultNotificationsState.mobileOnPublish\r\n : \"none\",\r\n notificationsEnabled: true,\r\n smsEnabled: !!this.props.defaultNotificationsState && this.props.defaultNotificationsState!.smsOnPublish !== \"none\",\r\n smsNotificationRange:\r\n !!this.props.defaultNotificationsState && this.props.defaultNotificationsState!.smsOnPublish !== \"none\"\r\n ? this.props.defaultNotificationsState!.smsOnPublish\r\n : \"none\",\r\n teamsNotificationRange:\r\n !!this.props.defaultNotificationsState && this.props.defaultNotificationsState!.teamsOnPublish !== \"none\"\r\n ? this.props.defaultNotificationsState!.teamsOnPublish\r\n : \"none\",\r\n };\r\n }\r\n } else {\r\n return {\r\n emailEnabled: !!notifications && notifications.emailOnPublish !== \"none\",\r\n emailNotificationRange:\r\n !!notifications && notifications.emailOnPublish !== \"none\" ? notifications.emailOnPublish : \"none\",\r\n mobileNotificationRange:\r\n !!notifications && notifications.mobileOnPublish !== \"none\" ? notifications.mobileOnPublish : \"none\",\r\n notificationsEnabled: true,\r\n smsEnabled: !!notifications && notifications.smsOnPublish !== \"none\",\r\n smsNotificationRange: !!notifications && notifications.smsOnPublish !== \"none\" ? notifications.smsOnPublish : \"none\",\r\n teamsNotificationRange: !!notifications && notifications.teamsOnPublish !== \"none\" ? notifications.teamsOnPublish : \"none\",\r\n };\r\n }\r\n };\r\n\r\n private onApplyNotificationSettings = () => {\r\n const emailOnPublish: NotificationRange = this.state.emailEnabled ? this.state.emailNotificationRange : \"none\";\r\n const mobileOnPublish: NotificationRange = this.state.mobileNotificationRange;\r\n const smsOnPublish: NotificationRange = this.state.smsEnabled ? this.state.smsNotificationRange : \"none\";\r\n const teamsOnPublish: NotificationRange = this.state.teamsNotificationRange;\r\n const notifications: INotifications = {\r\n ...this.props.notifications!,\r\n emailOnPublish: emailOnPublish,\r\n mobileOnPublish: mobileOnPublish,\r\n smsOnPublish: smsOnPublish,\r\n teamsOnPublish: teamsOnPublish,\r\n };\r\n this.props.onChangeNotifications(notifications);\r\n };\r\n\r\n private checkPostNotificationsAreOff = () => {\r\n if (\r\n !this.state.emailEnabled &&\r\n !this.state.smsEnabled &&\r\n this.state.teamsNotificationRange === \"none\" &&\r\n this.state.mobileNotificationRange === \"none\" &&\r\n this.props.onToggleNotifications\r\n ) {\r\n this.props.onToggleNotifications(false);\r\n }\r\n };\r\n\r\n private onClose = () => {\r\n this.onApplyNotificationSettings();\r\n this.checkPostNotificationsAreOff();\r\n this.props.onClose();\r\n };\r\n\r\n private onEmailFallback = () => {\r\n this.setState({ emailNotificationRange: \"fallback\" });\r\n };\r\n\r\n private onEmailSubscribers = () => {\r\n this.setState({ emailNotificationRange: \"subscribers\" });\r\n };\r\n\r\n private onSMSFallback = () => {\r\n this.setState({ smsNotificationRange: \"fallback\" });\r\n };\r\n\r\n private onSMSSubscribers = () => {\r\n this.setState({ smsNotificationRange: \"subscribers\" });\r\n };\r\n\r\n private onToggleEmailEnabled = (e: any) => {\r\n if(e.target.checked)\r\n this.setState({ emailEnabled: e.target.checked, emailNotificationRange: this.checkWhichEmailRangeToUse() });\r\n else\r\n this.setState({ emailEnabled: e.target.checked, emailNotificationRange: 'none' });\r\n };\r\n\r\n private onToggleMobileEnabled = () => {\r\n if (this.state.mobileNotificationRange === \"none\") this.setState({ mobileNotificationRange: \"subscribers\" });\r\n else this.setState({ mobileNotificationRange: \"none\" });\r\n };\r\n\r\n private onToggleTeamsEnabled = () => {\r\n if (this.state.teamsNotificationRange === \"none\") this.setState({ teamsNotificationRange: \"subscribers\" });\r\n else this.setState({ teamsNotificationRange: \"none\" });\r\n };\r\n\r\n private onToggleSMSEnabled = (e: any) => {\r\n if(e.target.checked)\r\n this.setState({ smsEnabled: e.target.checked, smsNotificationRange: this.checkWhichSMSRangeToUse() });\r\n else\r\n this.setState({ smsEnabled: e.target.checked, smsNotificationRange: 'none' });\r\n };\r\n\r\n /*\r\n * Toggles on or off post previous notifications notifications if checked.\r\n */\r\n private onTogglePostNotifications = (checked: boolean) => {\r\n if (checked) {\r\n this.onSetPostNotificationsToPost(checked);\r\n } else {\r\n this.setPostNotificationsToNone(checked);\r\n }\r\n };\r\n\r\n /*\r\n * Sets the current post notifications, checks if any previous notifications, if none sets to the default notifications\r\n */\r\n private onSetPostNotificationsToPost = (checked: boolean) => {\r\n if ((this.props.isPreviouslyPublished && this.props.postPublished && new Date(this.props.postPublished).toISOString() <= new Date().toISOString()) \r\n || this.props.previousNotifications) \r\n {\r\n this.setPreviousPostNotifications(checked);\r\n } else {\r\n this.setDefaultPostNotifications(checked);\r\n }\r\n }\r\n\r\n /*\r\n * Sets default notifications of the tenant notification config.\r\n */\r\n private setDefaultPostNotifications = (checked: boolean) => {\r\n const { type } = this.props;\r\n const defaultSettings = this.props.notificationSettings[`default${type.charAt(0).toUpperCase() + type.substr(1)}Settings`];\r\n\r\n this.setState({\r\n emailEnabled: defaultSettings?.emailOnPublish !== \"none\",\r\n emailNotificationRange: (defaultSettings?.emailOnPublish as NotificationRange) || \"subscribers\",\r\n mobileNotificationRange: (defaultSettings?.mobileOnPublish as NotificationRange) || \"none\",\r\n notificationsEnabled: checked,\r\n smsEnabled: defaultSettings?.smsOnPublish !== \"none\",\r\n smsNotificationRange: (defaultSettings?.smsOnPublish as NotificationRange) || \"subscribers\",\r\n teamsNotificationRange: (defaultSettings?.teamsOnPublish as NotificationRange) || \"none\",\r\n });\r\n }\r\n\r\n /*\r\n * Sets notifications to none.\r\n */\r\n private setPostNotificationsToNone = (checked: boolean) => {\r\n this.setState({\r\n emailEnabled: false,\r\n emailNotificationRange: 'none',\r\n mobileNotificationRange: 'none',\r\n notificationsEnabled: checked,\r\n smsEnabled: false,\r\n smsNotificationRange: 'none',\r\n teamsNotificationRange: 'none',\r\n });\r\n }\r\n\r\n /*\r\n * Sets notifications to the posts previous notifications.\r\n */\r\n private setPreviousPostNotifications = (checked: boolean) => {\r\n this.setState({\r\n emailEnabled:\r\n this.props.previousNotifications!.emailOnPublish && this.props.previousNotifications!.emailOnPublish !== \"none\",\r\n emailNotificationRange: this.props.previousNotifications && this.props.previousNotifications!.emailOnPublish !== \"none\"\r\n ? this.props.previousNotifications!.emailOnPublish\r\n : \"none\",\r\n mobileNotificationRange:\r\n this.props.previousNotifications && this.props.previousNotifications!.mobileOnPublish !== \"none\"\r\n ? this.props.previousNotifications!.mobileOnPublish\r\n : \"none\",\r\n notificationsEnabled: checked,\r\n smsEnabled: this.props.previousNotifications!.smsOnPublish !== \"none\",\r\n smsNotificationRange: this.props.previousNotifications && this.props.previousNotifications!.smsOnPublish !== \"none\"\r\n ? this.props.previousNotifications!.smsOnPublish\r\n : \"none\",\r\n teamsNotificationRange:\r\n this.props.previousNotifications!.teamsOnPublish !== \"none\"\r\n ? this.props.previousNotifications!.teamsOnPublish\r\n : \"none\",\r\n });\r\n }\r\n\r\n /*\r\n * Checks whether to use previous set emailOnPublish if any, will fall back to the default settings if any else default is subscribers if none are set for tenant settings.\r\n */\r\n private checkWhichEmailRangeToUse = () => {\r\n const { type } = this.props;\r\n const defaultSettings = this.props.notificationSettings[`default${type.charAt(0).toUpperCase() + type.substr(1)}Settings`];\r\n\r\n if(this.props.previousNotifications && this.props.previousNotifications.emailOnPublish !== 'none')\r\n return this.props.previousNotifications.emailOnPublish;\r\n else \r\n return defaultSettings.emailOnPublish !== 'none' ? defaultSettings.emailOnPublish : 'subscribers';\r\n }\r\n\r\n /*\r\n * Checks whether to use previous set smsOnPublish if any, will fall back to the default settings if any else default is subscribers if none are set for tenant settings.\r\n */\r\n private checkWhichSMSRangeToUse = () => {\r\n const { type } = this.props;\r\n const defaultSettings = this.props.notificationSettings[`default${type.charAt(0).toUpperCase() + type.substr(1)}Settings`];\r\n\r\n if(this.props.previousNotifications && this.props.previousNotifications.smsOnPublish !== 'none')\r\n return this.props.previousNotifications.smsOnPublish;\r\n else\r\n return defaultSettings.smsOnPublish !== 'none' ? defaultSettings.smsOnPublish : 'subscribers';\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n isPreviouslyPublished: boolean;\r\n notifications: INotifications | undefined;\r\n //optional parameters for now until events authoring gets updated.\r\n previousNotifications?: INotifications | undefined;\r\n notificationsToggle?: boolean;\r\n postPublished?: Date | null | undefined;\r\n defaultNotificationsState?: INotifications | undefined;\r\n type: \"post\" | \"event\";\r\n onChangeNotifications: (notifications: INotifications) => void;\r\n onClose: () => void;\r\n onToggleNotifications?: (checked: boolean) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n emailEnabled: boolean;\r\n emailNotificationRange: NotificationRange;\r\n mobileNotificationRange: NotificationRange;\r\n notificationsEnabled: boolean;\r\n smsEnabled: boolean;\r\n smsNotificationRange: NotificationRange;\r\n teamsNotificationRange: NotificationRange;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n notificationSettings: state.settings.notificationSettings,\r\n tenantSettings: state.settings.tenantSettings,\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(Notifications);\r\n","import * as React from \"react\";\r\n\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport moment from \"moment\";\r\nimport DateAndTime from \"../forms/inputs/dateAndTime\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport { PickerLocalization } from \"../pickerLocalization\";\r\nimport DatePicker from \"../forms/inputs/datePicker\";\r\n\r\n\r\n// authoring v2 component\r\nconst PublishTimev2: React.FunctionComponent = ({\r\n publishTime,\r\n onChange,\r\n}) => {\r\n return (\r\n <>\r\n \r\n Schedule when this post gets published or change the publish date that appears on the post.\r\n \r\n \r\n \r\n );\r\n}\r\n\r\n\r\nclass PublishTime extends React.Component {\r\n public render() {\r\n const { publishTime } = this.props;\r\n\r\n return (\r\n
    \r\n
    \r\n
    Publish on
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    at
    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private onChangePublishTime = (event) => {\r\n const times: number[] = event.target.value.split(\":\");\r\n const publishTime: string = moment(this.props.publishTime).set(\"hour\", times[0]).set(\"minutes\", times[1]).toISOString();\r\n this.props.onChange(publishTime);\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n publishTime: string | undefined;\r\n onChange: (publishTime: string | undefined) => void;\r\n}\r\n\r\ninterface ComponentState { }\r\n\r\nexport default PublishTime;\r\nexport { PublishTimev2 };\r\n","import * as React from \"react\";\r\n\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport moment from \"moment\";\r\nimport DateAndTime from \"../forms/inputs/dateAndTime\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport { PickerLocalization } from \"../pickerLocalization\";\r\nimport DatePicker from \"../forms/inputs/datePicker\";\r\n\r\n\r\n// authoring v2 component\r\nconst ExpiryTimev2: React.FunctionComponent = ({\r\n expiryTime,\r\n onChange,\r\n}) => {\r\n return (\r\n
    \r\n \r\n Schedule to expire this post and hide it from all feeds after the specified time.\r\n \r\n \r\n
    \r\n );\r\n}\r\n\r\n\r\nclass ExpiryTime extends React.Component {\r\n public render() {\r\n const { expiryTime } = this.props;\r\n\r\n return (\r\n
    \r\n
    \r\n
    Expire on
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n
    at
    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private onChangeExpiryTime = (event) => {\r\n const times: number[] = event.target.value.split(\":\");\r\n const expiryTime: string = moment(this.props.expiryTime).set(\"hour\", times[0]).set(\"minutes\", times[1]).toISOString();\r\n this.props.onChange(expiryTime);\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n expiryTime: string | undefined;\r\n onChange: (expiryTime: string) => void;\r\n}\r\n\r\ninterface ComponentState { }\r\n\r\nexport default ExpiryTime;\r\nexport { ExpiryTimev2 };\r\n","import * as React from \"react\";\r\n\r\nimport Switch from \"@mui/material/Switch\";\r\n\r\nclass ReactingEnabled extends React.Component {\r\n public render() {\r\n const { reactingEnabled = false, disabled = false } = this.props;\r\n\r\n return (\r\n \r\n
    \r\n
    Enable Reactions
    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private onToggleReactingEnabled = () => {\r\n this.props.onChange(!this.props.reactingEnabled);\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n reactingEnabled: boolean;\r\n onChange: (reactingEnabled: boolean) => void;\r\n disabled?: boolean;\r\n}\r\n\r\ninterface ComponentState { }\r\n\r\nexport default ReactingEnabled;\r\n","import * as React from \"react\";\r\n\r\nimport { CommentingTypes } from \"../../../models\";\r\n\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Select from \"@mui/material/Select\";\r\nimport Switch from \"@mui/material/Switch\";\r\n\r\n\r\nclass CommentingEnabled extends React.Component {\r\n public render() {\r\n const { disabled = false } = this.props;\r\n \r\n return (\r\n \r\n
    \r\n
    Enable Comments
    \r\n \r\n
    \r\n \r\n \r\n \r\n Standard\r\n Anonymous\r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n\r\n private onChangeCommentingType = (event) => {\r\n this.props.onChangeCommentingType(event.target.value);\r\n }\r\n\r\n private onToggleBreakingTime = () => {\r\n this.props.onChangeCommentingEnabled(!this.props.commentingEnabled);\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n commentingEnabled: boolean;\r\n commentingType: CommentingTypes;\r\n onChangeCommentingEnabled: (commentingEnabled: boolean) => void;\r\n onChangeCommentingType: (commentingType: CommentingTypes) => void;\r\n disabled?: boolean;\r\n}\r\n\r\ninterface ComponentState { }\r\n\r\nexport default CommentingEnabled;\r\n","import { OpenInNew } from '@mui/icons-material';\r\nimport { TextField } from '@mui/material';\r\nimport HoverText from 'modules/documents/components/action-buttons/hoverText';\r\nimport * as React from 'react';\r\nimport { checkValidUrl } from 'utils/urlUtils';\r\n\r\ninterface IShareLinkProps {\r\n onChangePublicLink: (toSet: string) => void\r\n customPublicUrl: string\r\n}\r\n\r\nconst PublicShareLinkEdit: React.FC = (props) => {\r\n const [isValidUrl, setIsValidUrl] = React.useState(true);\r\n const [urlText, setUrlText] = React.useState(props.customPublicUrl);\r\n\r\n //Don't actually update the post text until the focus changes.\r\n const onTextUpdate = (toSet: string) => {\r\n setIsValidUrl(checkValidUrl(toSet) || toSet === \"\")\r\n\r\n props.onChangePublicLink(toSet);\r\n }\r\n\r\n const endIcon = window.open(urlText)} color=\"primary\"/>\r\n\r\n return (\r\n
    \r\n \r\n Customize the URL link that this post loads and displays when employees share this publicly.\r\n \r\n\r\n onTextUpdate(e.target.value)}\r\n onChange={(e) => setUrlText(e.target.value)}\r\n helperText={isValidUrl ? \"\" : \"Enter valid URL. Ex. https://sparrowconnected.com\"}\r\n error={!isValidUrl}\r\n value={urlText}\r\n InputProps={{endAdornment: \r\n urlText !== \"\" && endIcon\r\n }}\r\n />\r\n
    \r\n );\r\n}\r\n\r\nexport default PublicShareLinkEdit;","import React, { useState } from \"react\";\r\n\r\nimport { Button, Collapse, Divider, Switch } from \"@mui/material\";\r\n\r\nimport { CommentingTypes, Post } from \"modules/posts/models\";\r\nimport { Notifications as INotifications } from \"./models\";\r\nimport BreakingTime from \"modules/posts/components/post-creation/components/breakingTime\";\r\nimport FeaturedTime from \"modules/posts/components/post-creation/components/featuredTime\";\r\nimport Reminders from \"./reminders\";\r\nimport Notifications from \"./notifications\";\r\nimport { PublishTimev2 } from \"./publishTime\";\r\nimport { ExpiryTimev2 } from \"./expiryTime\";\r\nimport ReactingEnabled from \"modules/posts/components/post-creation/components/reactingEnabled\";\r\nimport CommentingEnabled from \"modules/posts/components/post-creation/components/commentingEnabled\";\r\n\r\nimport \"./styles/optionsEditor.sass\";\r\nimport PublicShareLinkEdit from \"modules/posts/components/post-creation/components/publicShareLinkEdit\";\r\n\r\ninterface IOptionsEditorProps {\r\n post: Partial;\r\n notificationsEnabled: boolean;\r\n previousNotifications: INotifications | undefined;\r\n reminderNotificationsEnabled: boolean;\r\n commentsEnabled: boolean;\r\n reactionsEnabled: boolean;\r\n canContributorsToggleReactions: boolean;\r\n canContributorsToggleComments: boolean;\r\n onChangeReactionsEnabled: (enabled: boolean) => void;\r\n onChangeNotifications: (notifications: INotifications) => void;\r\n onChangeBreakingTime: (breakingTime: string | null) => void;\r\n onChangePublishTime: (publishTime: string | undefined) => void;\r\n onChangeFeaturedTime: (featuredTime: string) => void;\r\n onChangeExpiryTime: (expiryTime: string) => void;\r\n onChangeCommentingEnabled: (enabled: boolean) => void;\r\n onChangeCommentingType: (type: CommentingTypes) => void;\r\n onToggleReminderSettings: (enabled: boolean) => void;\r\n onToggleNotifications: (enabled: boolean, currToggleVal: boolean) => void;\r\n onChangePublicLink: (toSet: string) => void;\r\n isContributor: boolean;\r\n}\r\n\r\nconst OptionsEditor: React.FunctionComponent = ({\r\n post,\r\n previousNotifications, //Original post notifications\r\n notificationsEnabled, // tenant setting\r\n reminderNotificationsEnabled, // tenant setting\r\n reactionsEnabled, // tenant setting\r\n commentsEnabled, // tenant setting\r\n canContributorsToggleReactions, // tenant setting\r\n canContributorsToggleComments, // tenant setting\r\n onChangeExpiryTime,\r\n onChangePublishTime,\r\n onChangeNotifications,\r\n onChangeBreakingTime,\r\n onChangeFeaturedTime,\r\n onChangeReactionsEnabled,\r\n onChangeCommentingEnabled,\r\n onChangeCommentingType,\r\n onToggleReminderSettings,\r\n onToggleNotifications,\r\n onChangePublicLink,\r\n isContributor,\r\n}) => {\r\n const [notificationsPanelOpen, setNotificationsPanelOpen] = useState(false);\r\n const [reminderNotificationsPanelOpen, setReminderNotificationsPanelOpen] = useState(false);\r\n const [toggleNotifications, setToggleNotifications] = useState(false);\r\n\r\n React.useEffect(() => {\r\n if(post.isPreviouslyPublished && post.publishTime && new Date(post.publishTime).toISOString() <= new Date().toISOString()) {\r\n onToggleNotifications(false, toggleNotifications);\r\n }\r\n\r\n if(post.publishTime && new Date(post.publishTime).toISOString() >= new Date().toISOString() && checkPreviousNotifications()) {\r\n setToggleNotifications(false);\r\n onToggleNotifications(false, toggleNotifications);\r\n }\r\n }, [previousNotifications]);\r\n\r\n React.useEffect(() => {\r\n if(previousNotifications?.emailOnPublish === 'none' && \r\n previousNotifications.mobileOnPublish === 'none' && \r\n previousNotifications?.teamsOnPublish === 'none' && \r\n previousNotifications.smsOnPublish === 'none') {\r\n setToggleNotifications(false);\r\n }\r\n }, []);\r\n\r\n const defaultPublishedNotificationState: INotifications = {\r\n emailOnPublish: 'none',\r\n teamsOnPublish: 'none',\r\n smsOnPublish: 'none',\r\n mobileOnPublish: 'none',\r\n reminders: []\r\n }\r\n\r\n const onToggleNotificationSettings = (checked: boolean) => {\r\n if (checked === true)\r\n setNotificationsPanelOpen(true);\r\n\r\n // update post values\r\n setToggleNotifications(checked);\r\n onToggleNotifications(checked, toggleNotifications);\r\n }\r\n\r\n const onToggleReminderSettingsInternal = (_: React.ChangeEvent, checked: boolean) => {\r\n if (!hasReminders())\r\n setReminderNotificationsPanelOpen(true);\r\n\r\n // update post values\r\n onToggleReminderSettings(checked);\r\n }\r\n\r\n const onHideNotificationSettings = () => {\r\n setNotificationsPanelOpen(false);\r\n }\r\n\r\n const onShowNotificationSettings = () => {\r\n setNotificationsPanelOpen(true);\r\n }\r\n\r\n const onHideReminderSettings = () => {\r\n setReminderNotificationsPanelOpen(false);\r\n }\r\n\r\n const onShowReminderSettings = () => {\r\n setReminderNotificationsPanelOpen(true);\r\n }\r\n\r\n const postToggleOnPublished = () => {\r\n if(post.publishTime && new Date(post.publishTime).toISOString() <= new Date().toISOString()) {\r\n onToggleNotifications(true, toggleNotifications);\r\n setToggleNotifications(false);\r\n } else {\r\n setToggleNotifications(true);\r\n }\r\n }\r\n\r\n const checkPreviousNotifications = () => {\r\n return previousNotifications?.emailOnPublish === 'none' && previousNotifications.mobileOnPublish === 'none' \r\n && previousNotifications.smsOnPublish === 'none' && previousNotifications.teamsOnPublish === 'none';\r\n }\r\n\r\n useState(() => {\r\n postToggleOnPublished();\r\n })\r\n\r\n const getDateString = (date: Date | undefined | null): string => date ? new Date(date).toISOString() : \"\";\r\n\r\n const hasReminders = (): boolean => {\r\n let has = Boolean(post.notifications?.reminders?.length);\r\n\r\n return has;\r\n }\r\n \r\n const remindersToggled = hasReminders();\r\n\r\n return (\r\n <>\r\n
    \r\n {\r\n <>\r\n \r\n \r\n \r\n \r\n }\r\n {notificationsEnabled &&\r\n <>\r\n
    \r\n \r\n onToggleNotificationSettings(e.target.checked)}\r\n />\r\n
    \r\n \r\n \r\n Edit notifications\r\n \r\n \r\n \r\n }\r\n {reminderNotificationsEnabled &&\r\n <>\r\n
    \r\n \r\n \r\n
    \r\n \r\n \r\n Edit reminders\r\n \r\n \r\n \r\n }\r\n {((!post.isPreviouslyPublished && notificationsEnabled) || reminderNotificationsEnabled) && }\r\n {\r\n !isContributor &&\r\n <>\r\n \r\n \r\n \r\n \r\n }\r\n {\r\n reactionsEnabled &&\r\n \r\n }\r\n {\r\n commentsEnabled &&\r\n \r\n }\r\n {post.postType === 'public' && \r\n <>\r\n \r\n \r\n \r\n }\r\n
    \r\n \r\n \r\n \r\n\r\n );\r\n}\r\n\r\nexport default OptionsEditor;\r\n","import * as React from 'react';\r\nconst queryIcon: string = \"/images/icons/query_stats_grey.svg\";\r\n\r\ninterface IEmptyDataMessageProps {\r\n containerStyle?: React.CSSProperties;\r\n}\r\n\r\nconst EmptyDataMessage: React.FunctionComponent = ({\r\n containerStyle,\r\n children = No data available\r\n}) => {\r\n return (\r\n \r\n {\"Magnifying\r\n \r\n {children}\r\n \r\n
    \r\n );\r\n}\r\nexport default EmptyDataMessage;\r\n","import { LinearProgress } from \"@mui/material\";\r\nimport React, { useEffect, useState } from \"react\";\r\n\r\nimport \"../styles/indicator.sass\";\r\n\r\nconst SCORE_ICON_SRC: string = \"/images/icons/change_history.svg\";\r\nconst RECC_ICON_SRC: string = \"/images/icons/recommended_score_pin.svg\";\r\nconst GLBL_ICON_SRC: string = \"/images/icons/global_score_pin.svg\";\r\n\r\nexport type Range = {\r\n min: number;\r\n max: number;\r\n}\r\n\r\ninterface IIndicatorProps {\r\n scoreLabel: string;\r\n startLabel: string;\r\n endLabel: string;\r\n title: string;\r\n range: Range;\r\n score: number;\r\n reverse?: boolean; // max numbers and labels on the left\r\n recommendedScore?: number;\r\n useGlobalIcon: boolean;\r\n}\r\n\r\n/**\r\n * An indicator component indicating the following:\r\n * - recommended score (FUTURE ITERATION)\r\n * - current score\r\n * - max/min scores\r\n *\r\n * The progress bar alg works like this:\r\n * 1. Split up the full range into two separate equal ranges\r\n * 2. The two separate range can then be normalized to 0-100 range and applied to a mui progress bar\r\n * 3. The right to left, rtl, progress bar is then rotated 180 deg so the progress goes from right to left\r\n *\r\n * NOTE: the hard coded 100s are the default max value for a React MUI progress component\r\n */\r\nconst Indicator: React.FunctionComponent = ({\r\n scoreLabel,\r\n startLabel,\r\n endLabel,\r\n title,\r\n range,\r\n score,\r\n recommendedScore,\r\n reverse = false,\r\n useGlobalIcon\r\n}) => {\r\n const [rtlRange, setRtlRange] = useState();\r\n const [ltrRange, setLtrRange] = useState();\r\n\r\n /**\r\n * Split up the full range into two equal ranges (ex. if range is 0-100, split into 0-50, 50-100)\r\n */\r\n useEffect(() => {\r\n let half = range.max / 2;\r\n\r\n setRtlRange({ min: range.min, max: half });\r\n setLtrRange({ min: half, max: range.max });\r\n }, [range]);\r\n\r\n /**\r\n * Get the normalized value for the progress bar that grows left to right\r\n */\r\n const getLeftToRightValue = (scoreToUse: number): number => {\r\n if (!rtlRange || !ltrRange) return 0;\r\n\r\n let value = 0;\r\n if (scoreToUse >= ltrRange.min && scoreToUse <= ltrRange.max)\r\n value = normalise(scoreToUse, ltrRange.min, ltrRange.max);\r\n\r\n return value;\r\n }\r\n\r\n /**\r\n * Get the normalized value for the progress bar that grows from right to left\r\n */\r\n const getRightToLeftValue = (scoreToUse: number): number => {\r\n if (!rtlRange || !ltrRange) return 0;\r\n\r\n let value = 0;\r\n\r\n // minus from 100 here because we're flipping a one directional range, ex. [0 -> 100], to two ranges going the opposite ways\r\n // for example, a score of 2 in a 0 - 100 range, should take up most of the right to left progress bar in our bi-directional range\r\n // 100 because that's the range the LinearProgress component uses\r\n if (scoreToUse >= rtlRange.min && scoreToUse <= rtlRange.max)\r\n value = 100 - normalise(scoreToUse, rtlRange.min, rtlRange.max);\r\n\r\n\r\n return value;\r\n }\r\n\r\n // transform a value in one range to the same value in a different range\r\n // https://mui.com/material-ui/react-progress/#non-standard-ranges\r\n const normalise = (value: number, min: number, max: number): number => ((value - min) * 100) / (max - min);\r\n\r\n const linearProgress = (left: boolean): JSX.Element => {\r\n let value = 0;\r\n const ltrValue = getLeftToRightValue(score);\r\n const rtlValue = getRightToLeftValue(score);\r\n\r\n // with reverse we put the value from one progress bar in the other and vice versa\r\n value = reverse === left\r\n ? ltrValue\r\n : rtlValue;\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n const verticalLine = (): JSX.Element => (\r\n
    \r\n );\r\n\r\n /**\r\n * Get the component to display the start and end labels\r\n */\r\n const startEndLabels = (): JSX.Element => (\r\n
    \r\n {reverse\r\n ? <>\r\n {endLabel}\r\n {startLabel}\r\n \r\n : <>\r\n {startLabel}\r\n {endLabel}\r\n }\r\n
    \r\n );\r\n\r\n /**\r\n * Gets the element that displays their score\r\n */\r\n const scoreLabelComponent = (): JSX.Element => {\r\n const ltrValue = getLeftToRightValue(score);\r\n const rtlValue = getRightToLeftValue(score);\r\n\r\n let valueToUse = rtlValue === 0 ? ltrValue : rtlValue;\r\n\r\n // the label starts off in the middle of the progress bars\r\n // if the progress bar is going right to left, then we negate the translation percent to move it left\r\n // by the amount of progress ie rtlValue\r\n let translateBy = rtlValue > 0 && !reverse ? 0 - valueToUse : valueToUse;\r\n\r\n // handle cases where value is 100 i.e. max score\r\n let containerStyle: React.CSSProperties = { justifyContent: \"center\" };\r\n let labelStyle: React.CSSProperties = { textAlign: \"center\" };\r\n\r\n // left to right score is maxed OR reverse is on and right to left is maxed\r\n if ((!reverse && ltrValue === 100) || (reverse && rtlValue === 100)) {\r\n containerStyle = { justifyContent: \"flex-end\" };\r\n labelStyle = { textAlign: \"right\" };\r\n translateBy = 0;\r\n // right to left is maxed OR reverse is on and left to right is maxed\r\n } else if ((!reverse && rtlValue === 100) || (reverse && ltrValue === 100)) {\r\n containerStyle = { justifyContent: \"flex-start\" };\r\n labelStyle = { textAlign: \"unset\" };\r\n translateBy = 0;\r\n } else if (reverse && ltrValue > 0) {\r\n translateBy = -1 * translateBy;\r\n }\r\n\r\n return (\r\n
    \r\n \r\n {scoreLabel}
    \r\n {\"Your\r\n

    \r\n
    \r\n );\r\n }\r\n\r\n /**\r\n * Gets the element that displays the suggested score\r\n */\r\n const recommendedScoreLabelComponent = (): JSX.Element => {\r\n const ltrValue = getLeftToRightValue(recommendedScore!);\r\n const rtlValue = getRightToLeftValue(recommendedScore!);\r\n\r\n let valueToUse = rtlValue === 0 ? ltrValue : rtlValue;\r\n\r\n // the label starts off in the middle of the progress bars\r\n // if the progress bar is going right to left, then we negate the translation percent to move it left\r\n // by the amount of progress ie rtlValue\r\n let translateBy = rtlValue > 0 && !reverse ? 0 - valueToUse : valueToUse;\r\n\r\n // handle cases where value is 100 i.e. max score\r\n let containerStyle: React.CSSProperties = { justifyContent: \"center\" };\r\n let labelStyle: React.CSSProperties = { textAlign: \"center\" };\r\n\r\n // left to right score is maxed OR reverse is on and right to left is maxed\r\n if ((!reverse && ltrValue === 100) || (reverse && rtlValue === 100)) {\r\n containerStyle = { justifyContent: \"flex-end\" };\r\n labelStyle = { textAlign: \"right\" };\r\n translateBy = 0;\r\n // right to left is maxed OR reverse is on and left to right is maxed\r\n } else if ((!reverse && rtlValue === 100) || (reverse && ltrValue === 100)) {\r\n containerStyle = { justifyContent: \"flex-start\" };\r\n labelStyle = { textAlign: \"unset\" };\r\n translateBy = 0;\r\n } else if (reverse && ltrValue > 0) {\r\n translateBy = -1 * translateBy;\r\n }\r\n\r\n return (\r\n
    \r\n \r\n {\"Average\r\n

    \r\n
    \r\n );\r\n }\r\n\r\n return (\r\n
    \r\n \r\n {recommendedScore !== null && recommendedScoreLabelComponent()}\r\n {scoreLabelComponent()}\r\n
    \r\n {linearProgress(true)}\r\n {verticalLine()}\r\n {linearProgress(false)}\r\n
    \r\n {startEndLabels()}\r\n
    \r\n );\r\n}\r\n\r\nexport default Indicator;\r\n","import { IIndicatorDetail } from \"modules/common/components/authoring/models\";\r\nimport React from \"react\";\r\n\r\nimport Indicator from \"./indicator\";\r\n\r\ninterface IIndicatorWrapperProps {\r\n indicator?: IIndicatorDetail;\r\n reverse?: boolean;\r\n useGlobalIcon: boolean;\r\n title: string;\r\n}\r\n\r\nconst IndicatorWrapper: React.FunctionComponent = ({\r\n indicator = {} as IIndicatorDetail,\r\n reverse = false,\r\n title,\r\n useGlobalIcon = false,\r\n}) => {\r\n const {\r\n minScore,\r\n maxScore,\r\n minLabel,\r\n maxLabel,\r\n score,\r\n recommendedScore,\r\n scoreLabel\r\n } = indicator;\r\n\r\n // NOTE: for some reason readable actually sometimes gives us greater than 100, so we just set it to 100\r\n const scoreToUse = score > maxScore\r\n ? maxScore\r\n : score;\r\n\r\n return (\r\n
    \r\n {indicator\r\n ? \r\n : <>}\r\n\r\n
    \r\n )\r\n}\r\n\r\nexport default IndicatorWrapper;\r\n","import React from \"react\";\r\n\r\nimport { IIndicatorDetail } from \"modules/common/components/authoring/models\";\r\nimport IndicatorWrapper from \"./indicatorWrapper\";\r\n\r\ninterface IReadabilityAndReachIndicatorsProps {\r\n readabilityIndicator?: IIndicatorDetail;\r\n toneIndicator?: IIndicatorDetail;\r\n personalismIndicator?: IIndicatorDetail;\r\n sentimentIndicator?: IIndicatorDetail;\r\n isUsingTenantAverages?: boolean;\r\n}\r\n\r\nconst ReadabilityAndReachIndicators: React.FunctionComponent = ({\r\n readabilityIndicator,\r\n toneIndicator,\r\n sentimentIndicator,\r\n personalismIndicator,\r\n isUsingTenantAverages = false\r\n}) => {\r\n return (\r\n <>\r\n {readabilityIndicator && }\r\n {toneIndicator && }\r\n {personalismIndicator && }\r\n {sentimentIndicator && }\r\n \r\n );\r\n}\r\n\r\nexport default ReadabilityAndReachIndicators;\r\n","import React from \"react\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport { getNiceTimerString } from \"utils/stringFormatting\";\r\nimport WarningIcon from '@mui/icons-material/Warning';\r\nimport CheckCircleIcon from '@mui/icons-material/CheckCircle';\r\n\r\ninterface ITextAndWordsProps {\r\n estimatedReadingTime?: string;\r\n wordCount?: number;\r\n usingGlobalStats?: boolean\r\n averageWordCount?: number\r\n}\r\n\r\nconst warning = (): JSX.Element => ;\r\nconst check = (): JSX.Element => ;\r\n\r\nconst TextAndWords: React.FunctionComponent = ({\r\n estimatedReadingTime = \"\",\r\n wordCount = 0,\r\n usingGlobalStats = false,\r\n averageWordCount = 0,\r\n}) => {\r\n const bottomRange = averageWordCount < 100 ? 0 : Math.round(averageWordCount - 100); //don't allow bottom limit to go below 0\r\n const topRange = Math.round(averageWordCount + 100);\r\n\r\n const textIndicator = (title: string, count: string, first: boolean = false, icon?: JSX.Element) => (\r\n <>\r\n
    \r\n
    \r\n {icon &&\r\n \r\n {`${usingGlobalStats ? \"Global\" : \"Internal\"} average word count is ${bottomRange}-${topRange}`}\r\n }\r\n {title}\r\n
    \r\n {count}\r\n
    \r\n \r\n );\r\n\r\n return (\r\n <>\r\n {textIndicator(\"Estimated Reading Time\", getNiceTimerString(estimatedReadingTime))}\r\n {textIndicator(\"Word Count\", \r\n wordCount.toLocaleString(), \r\n true, \r\n (bottomRange <= wordCount && wordCount <= topRange) ? check() : warning(),\r\n )}\r\n \r\n );\r\n}\r\n\r\nexport default TextAndWords;\r\n","import React from \"react\";\r\n\r\nimport WarningIcon from '@mui/icons-material/Warning';\r\nimport CheckCircleIcon from '@mui/icons-material/CheckCircle';\r\n\r\nimport { IHighlightAnalysis } from \"modules/common/components/authoring/models\";\r\nimport { getPercentString } from \"utils/stringFormatting\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\n\r\ninterface IContentIssues {\r\n totalWordCount?: number;\r\n totalSentenceCount?: number;\r\n lettersPerWord?: string;\r\n syllablesPerWord?: string;\r\n wordsPerSentence?: string;\r\n wordsPerParagraph?: string;\r\n sentencesPerParagraph?: string;\r\n issues?: IHighlightAnalysis;\r\n hideHighlights?: boolean;\r\n}\r\n\r\nconst PASSIVE_REGEX = /<[a-z]+[0-9\\s=\"]?class=\"highlight_passive\"[a-z]*[0-9\\s=]*>(.*?)<\\//gm;\r\nconst CLICHE_REGEX = /<[a-z]+[0-9\\s=\"]?class=\"highlight_cliche\"[a-z]*[0-9\\s=]*>(.*?)<\\//gm;\r\n\r\nconst ContentIssues: React.FunctionComponent = ({\r\n issues = {} as IHighlightAnalysis,\r\n totalSentenceCount = 0,\r\n totalWordCount = 0,\r\n lettersPerWord = 0,\r\n syllablesPerWord = 0,\r\n wordsPerParagraph = 0,\r\n wordsPerSentence = 0,\r\n sentencesPerParagraph = 0,\r\n hideHighlights = false,\r\n}) => {\r\n const {\r\n spellingErrorCount = 0,\r\n grammarErrorCount = 0,\r\n veryLongSentenceCount = 0,\r\n longSentenceCount = 0,\r\n longWordCount = 0,\r\n highSyllableWordCount = 0,\r\n passiveVoiceCount = 0,\r\n adverbCount = 0,\r\n clicheCount = 0,\r\n } = issues;\r\n\r\n const {\r\n highlightedText = \"\"\r\n } = issues;\r\n\r\n const textIndicator = (title: string, count: string, percent: string, first: boolean = false, icon?: JSX.Element, hoverText?: string): JSX.Element => (\r\n <>\r\n
    \r\n
    \r\n {icon &&\r\n \r\n {hoverText}\r\n }\r\n {title}\r\n
    \r\n {count}\r\n {percent}\r\n
    \r\n \r\n );\r\n\r\n /**\r\n * For cliche and passive voice counts, we need to sum up the words identified as cliche or passive\r\n * - first capture group is the class, which is what we use to determine if marked as cliche vs passive vs something else\r\n * - second capture group is the contents of the tag, which is what we use to sum up the words identified in the cliche or passive phrase\r\n * - adapted from code generator at https://regex101.com/\r\n * - TODO: Figure out the regex to handle both cases in one.\r\n */\r\n const getSpecialCount = (regex: RegExp) => {\r\n if (!highlightedText) return \"0%\";\r\n\r\n let passiveCount = 0;\r\n let m: RegExpExecArray | null;\r\n\r\n while ((m = regex.exec(highlightedText)) !== null) {\r\n // This is necessary to avoid infinite loops with zero-width matches\r\n if (m.index === regex.lastIndex) {\r\n regex.lastIndex++;\r\n }\r\n\r\n let contents = m[1];\r\n let countToAdd = contents.split(\" \").length;\r\n\r\n passiveCount += countToAdd;\r\n }\r\n\r\n return getPercentString(totalWordCount, passiveCount);\r\n }\r\n\r\n const warning = (): JSX.Element => ;\r\n const check = (): JSX.Element => ;\r\n\r\n const cliche = getSpecialCount(CLICHE_REGEX);\r\n const passive = getSpecialCount(PASSIVE_REGEX);\r\n\r\n return (\r\n <>\r\n {issues &&\r\n <>\r\n {!hideHighlights && \r\n <>\r\n

    Language

    \r\n {/* percent of words spelt wrong */}\r\n {textIndicator(\"Spelling Issues\",\r\n spellingErrorCount.toLocaleString(),\r\n getPercentString(totalWordCount, spellingErrorCount),\r\n true,\r\n spellingErrorCount > 0 ? warning() : check(),\r\n \"Try to aim for no spelling mistakes.\")}\r\n\r\n {/* percent of sentences with a grammar issue */}\r\n {textIndicator(\"Grammar Issues\",\r\n grammarErrorCount.toLocaleString(),\r\n getPercentString(totalSentenceCount,\r\n grammarErrorCount),\r\n false,\r\n grammarErrorCount > 0 ? warning() : check(),\r\n \"Try to aim for no grammar mistakes.\"\r\n )}\r\n\r\n

    Readability

    \r\n {/* percent of sentences that are very long - aim for less than 6% */}\r\n {textIndicator(\"Sentences > 30 Syllables\",\r\n veryLongSentenceCount.toLocaleString(),\r\n getPercentString(totalSentenceCount, veryLongSentenceCount),\r\n true,\r\n Math.round((veryLongSentenceCount / totalSentenceCount) * 100) > 6 ? warning() : check(),\r\n \"Try to aim for less than 6% very long sentences.\")}\r\n\r\n {/* percent of sentences that are long */}\r\n {textIndicator(\"Sentences > 20 Syllables\",\r\n longSentenceCount.toLocaleString(),\r\n getPercentString(totalSentenceCount,\r\n longSentenceCount),\r\n false,\r\n Math.round((longSentenceCount / totalSentenceCount) * 100) > 12 ? warning() : check(),\r\n \"Try to aim for less than 12% long sentences.\")}\r\n\r\n {/* percent of words with more than 4 syllables */}\r\n {textIndicator(\"Words > 4 Syllables\",\r\n highSyllableWordCount.toLocaleString(),\r\n getPercentString(totalWordCount, highSyllableWordCount),\r\n false,\r\n Math.round((highSyllableWordCount / totalWordCount) * 100) > 3 ? warning() : check(),\r\n \"Try to aim for less than 3% difficult words.\")}\r\n\r\n {/* percent of words with more than 12 letters */}\r\n {textIndicator(\"Words > 12 Letters\",\r\n longWordCount.toLocaleString(),\r\n getPercentString(totalWordCount,\r\n longWordCount),\r\n false,\r\n Math.round((longWordCount / totalWordCount) * 100) > 3 ? warning() : check(),\r\n \"Try to aim for less than 3% long words.\")}\r\n\r\n

    Writing Style

    \r\n {/* percent of words involved in passive voice count (1 passive voice count can have multiple words) */}\r\n {textIndicator(\"Passive Voice Count\",\r\n passiveVoiceCount.toLocaleString(),\r\n passive,\r\n true,\r\n Number(passive.split(\"%\")[0]) > 3 ? warning() : check(),\r\n \"Try to aim for less than 3% passive voice.\")}\r\n\r\n {/* percent of words that are adverbs */}\r\n {textIndicator(\"Adverb Count\",\r\n adverbCount.toLocaleString(),\r\n getPercentString(totalWordCount, adverbCount),\r\n false,\r\n Math.round((adverbCount / totalWordCount) * 100) > 4 ? warning() : check(),\r\n \"Try to aim for less than 4% adverbs.\")}\r\n\r\n {/* percent of words involved in cliches (1 cliche count can have multiple words) */}\r\n {textIndicator(\"Cliché Count\",\r\n clicheCount.toLocaleString(),\r\n cliche,\r\n false,\r\n Number(cliche.split(\"%\")[0]) > 1 ? warning() : check(),\r\n \"Try to aim for less than 1% clichés.\")}\r\n \r\n }\r\n\r\n

    Text Density

    \r\n {textIndicator(\"Characters per Word\",\r\n lettersPerWord.toLocaleString(),\r\n \"\",\r\n true,\r\n Number(lettersPerWord) === 4.2 ? check() : warning(),\r\n \"Highly readable content averages 4.2 letters per word.\")}\r\n {textIndicator(\"Syllables per Word\",\r\n syllablesPerWord.toLocaleString(),\r\n \"\",\r\n false,\r\n Number(syllablesPerWord) === 1.4 ? check() : warning(),\r\n \"Highly readable content averages 1.4 syllables per word.\")}\r\n {textIndicator(\"Words per Sentence\",\r\n wordsPerSentence.toLocaleString(),\r\n \"\",\r\n false,\r\n Number(wordsPerSentence) === 14 ? check() : warning(),\r\n \"Highly readable content averages 14 words per sentence.\")}\r\n {textIndicator(\"Words per Paragraph\",\r\n wordsPerParagraph.toLocaleString(),\r\n \"\",\r\n false,\r\n Number(wordsPerParagraph) === 60 ? check() : warning(),\r\n \"Highly readable content averages 60 words per paragraph.\")}\r\n {textIndicator(\"Sentences per Paragraph\",\r\n sentencesPerParagraph.toLocaleString(),\r\n \"\",\r\n false,\r\n Number(sentencesPerParagraph) === 4 ? check() : warning(),\r\n \"Highly readable content averages 4 sentences per paragraph.\")}\r\n }\r\n \r\n );\r\n}\r\n\r\nexport default ContentIssues;\r\n","import { Dispatch, SetStateAction, useEffect, useState } from \"react\";\r\n\r\n/**\r\n * Encapsulate accordion logic\r\n * @returns {\r\n * accordionOpenStates: boolean[];\r\n * expandAllLabel: string;\r\n * setExpandAllLabel: Dispatch>;\r\n * onChangeAccordionOpen: (expanded: boolean, key: ACCORDIONS) => void;\r\n * onExpandAll: () => void;\r\n * onCollapseAll: () => void;\r\n * onExpandOrCollapseAll: () => void;\r\n * }\r\n */\r\n\r\nconst COLLAPSE_ALL: string = \"COLLAPSE ALL\";\r\nconst EXPAND_ALL: string = \"EXPAND ALL\";\r\n\r\nexport type AccordionStatus = {\r\n accordionOpenStates: boolean[];\r\n expandAllLabel: string;\r\n setExpandAllLabel: Dispatch>;\r\n onChangeAccordionOpen: (expanded: boolean, key: number) => void;\r\n onExpandAll: () => void;\r\n onCollapseAll: () => void;\r\n onExpandOrCollapseAll: () => void;\r\n}\r\n\r\nconst useAccordion = (accordionCount: number, defaultValue: boolean = false): AccordionStatus => {\r\n const [accordionOpenStates, setAccordionOpenStates] = useState(Array.from({ length: accordionCount }, i => i = defaultValue));\r\n const [expandAllLabel, setExpandAllLabel] = useState(EXPAND_ALL);\r\n\r\n useEffect(() => {\r\n if (accordionOpenStates.every((item) => item)) setExpandAllLabel(COLLAPSE_ALL); // all are open\r\n else if (accordionOpenStates.every((item) => !item)) setExpandAllLabel(EXPAND_ALL); // all are close\r\n\r\n }, [accordionOpenStates, setExpandAllLabel]);\r\n\r\n useEffect(() => {\r\n setAccordionOpenStates(Array.from({ length: accordionCount }, i => i = defaultValue));\r\n }, [accordionCount, defaultValue]);\r\n\r\n const onChangeAccordionOpen = (expanded: boolean, key: number) => {\r\n let newOpenStates = [...accordionOpenStates];\r\n newOpenStates[key] = expanded;\r\n\r\n setAccordionOpenStates(newOpenStates);\r\n }\r\n\r\n const onExpandAll = () => {\r\n setAccordionOpenStates(accordionOpenStates.fill(true));\r\n setExpandAllLabel(COLLAPSE_ALL);\r\n }\r\n\r\n const onCollapseAll = () => {\r\n setAccordionOpenStates(accordionOpenStates.fill(false));\r\n setExpandAllLabel(EXPAND_ALL);\r\n }\r\n\r\n const onExpandOrCollapseAll = () => {\r\n if (expandAllLabel === EXPAND_ALL) onExpandAll();\r\n else onCollapseAll();\r\n }\r\n\r\n return {\r\n accordionOpenStates,\r\n expandAllLabel,\r\n setExpandAllLabel,\r\n onChangeAccordionOpen,\r\n onExpandAll,\r\n onCollapseAll,\r\n onExpandOrCollapseAll\r\n }\r\n}\r\n\r\nexport default useAccordion;\r\n","import React, { useMemo } from \"react\";\r\nimport SubjectIcon from \"@mui/icons-material/Subject\";\r\nimport TitleIcon from '@mui/icons-material/Title';\r\nimport SubtitlesIcon from '@mui/icons-material/Subtitles';\r\n\r\nimport { ITileButton } from \"modules/common/buttons/tileButton\";\r\nimport { SmartContentHome } from \"modules/smartContent/smartContentHome\";\r\nimport { POST_SMART_CONTENT_PAGES } from \"./postSmartContentPanel\";\r\n\r\nexport enum POST_SMART_CONTENT_TILE_BUTTON_IDX {\r\n GENERATE_IDEAS,\r\n GENERATE_TITLES,\r\n GENERATE_SUMMARIES,\r\n GENERATE_BODY_TEXT,\r\n};\r\n\r\ninterface IPostSmartContentHomeProps {\r\n onClose: () => void;\r\n onClick: (buttonClicked: POST_SMART_CONTENT_TILE_BUTTON_IDX, nextPage: POST_SMART_CONTENT_PAGES) => void;\r\n onOpenReadabilitySettings: () => void;\r\n transition: boolean; // flag whether we should transition in the buttons - this allows us to control only transition on first render for example\r\n keywords?: string;\r\n highlights?: POST_SMART_CONTENT_TILE_BUTTON_IDX[]; // an array of button indexes that we should highlight via a transition\r\n}\r\n\r\n/**\r\n * Post specific wrapper around SmartContentHome\r\n */\r\nconst PostSmartContentHome: React.FunctionComponent = ({\r\n highlights,\r\n keywords,\r\n transition,\r\n onClick,\r\n onOpenReadabilitySettings,\r\n onClose,\r\n}) => {\r\n // only apply transition on first render\r\n const BASE_BUTTON: Partial = {\r\n transition: transition ? \"zoom\" : undefined\r\n };\r\n\r\n const tileButtons = useMemo(() => {\r\n return [\r\n {\r\n ...BASE_BUTTON,\r\n id: \"smart-content-generate-ideas\",\r\n label: \"Generate ideas\",\r\n onClick: () => {\r\n let nextPage = keywords\r\n ? POST_SMART_CONTENT_PAGES.IDEAS_LIST\r\n : POST_SMART_CONTENT_PAGES.KEYWORDS;\r\n\r\n onClick(POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_IDEAS, nextPage);\r\n },\r\n labelIcon: \"Generate,\r\n className: highlights?.some((element: POST_SMART_CONTENT_TILE_BUTTON_IDX) => element === POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_IDEAS)\r\n ? \"heart-beat\"\r\n : \"\",\r\n },\r\n {\r\n ...BASE_BUTTON,\r\n id: \"smart-content-generate-titles\",\r\n label: \"Generate titles\",\r\n onClick: () => {\r\n let nextPage = keywords\r\n ? POST_SMART_CONTENT_PAGES.TITLES_LIST\r\n : POST_SMART_CONTENT_PAGES.KEYWORDS;\r\n\r\n onClick(POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_TITLES, nextPage);\r\n },\r\n labelIcon: ,\r\n delay: 400,\r\n className: highlights?.some((element: POST_SMART_CONTENT_TILE_BUTTON_IDX) => element === POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_TITLES)\r\n ? \"heart-beat\"\r\n : \"\",\r\n },\r\n {\r\n ...BASE_BUTTON,\r\n id: \"smart-content-generate-summaries\",\r\n label: \"Generate summaries\",\r\n onClick: () => {\r\n let nextPage = keywords\r\n ? POST_SMART_CONTENT_PAGES.SUMMARIES_LIST\r\n : POST_SMART_CONTENT_PAGES.KEYWORDS;\r\n\r\n onClick(POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_SUMMARIES, nextPage);\r\n },\r\n labelIcon: ,\r\n delay: 800,\r\n className: highlights?.some((element: POST_SMART_CONTENT_TILE_BUTTON_IDX) => element === POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_SUMMARIES)\r\n ? \"heart-beat\"\r\n : \"\",\r\n },\r\n {\r\n ...BASE_BUTTON,\r\n id: \"smart-content-generate-body\",\r\n label: \"Generate post body\",\r\n onClick: () => {\r\n let nextPage = keywords\r\n ? POST_SMART_CONTENT_PAGES.BODY_LIST\r\n : POST_SMART_CONTENT_PAGES.KEYWORDS;\r\n\r\n onClick(POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_BODY_TEXT, nextPage);\r\n },\r\n labelIcon: ,\r\n delay: 1200,\r\n className: highlights?.some((element: POST_SMART_CONTENT_TILE_BUTTON_IDX) => element === POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_BODY_TEXT)\r\n ? \"heart-beat\"\r\n : \"\",\r\n },\r\n ];\r\n }, [highlights, keywords, onClick, BASE_BUTTON]);\r\n\r\n return (\r\n \r\n );\r\n}\r\n\r\nexport { PostSmartContentHome };\r\n","import React from \"react\";\r\nimport { FormControl, MenuItem, Select, SelectChangeEvent } from \"@mui/material\";\r\nimport { PaginationItem } from \"@mui/material\";\r\n\r\nimport \"./pagination.sass\";\r\n\r\ninterface IPageCounterProps {\r\n count: number;\r\n currIndex: number;\r\n dropDown: boolean;\r\n selectLabel?: string;\r\n onPageChange: (newPage: number) => void;\r\n}\r\n\r\nconst PageCounter = React.forwardRef((props, ref) => {\r\n const onSelectChange = (pageToVisit: number | string) => {\r\n const num = Number(pageToVisit);\r\n props.onPageChange(num);\r\n }\r\n\r\n const getDropDown = (): JSX.Element => {\r\n return (\r\n \r\n {props.selectLabel && {props.selectLabel}}\r\n onSelectChange(e.target.value)}\r\n style={{ fontSize: 12 }}\r\n >\r\n {/* this weird looking thing just creates an array so we can loop through the number of pages */}\r\n {[...Array(props.count)].map((_, idx: number) => (\r\n {idx + 1}\r\n ))}\r\n \r\n \r\n );\r\n }\r\n\r\n const renderCounter = (): JSX.Element => {\r\n let result = {getNonDropDownLabel()};\r\n if (props.dropDown)\r\n result = getDropDown();\r\n\r\n return result;\r\n }\r\n\r\n const getNonDropDownLabel = (): string => `${props.currIndex + 1} of ${props.count}`;\r\n\r\n return (\r\n
    \r\n {props.children}\r\n {props.count === 0\r\n ? \"0 of 0\"\r\n : renderCounter()}\r\n
    \r\n )\r\n});\r\n\r\ninterface IPaginationProps {\r\n onPageChange: (newPage: number) => void;\r\n count: number;\r\n dropDown?: boolean; // page selector dropdown toggle\r\n currentPage: number; // 0-based index\r\n selectLabel?: string; // label before the select drop down\r\n}\r\n\r\nconst Pagination: React.FunctionComponent = ({\r\n onPageChange,\r\n selectLabel,\r\n currentPage,\r\n count,\r\n dropDown = false,\r\n}) => {\r\n return (\r\n
    \r\n onPageChange(0)}\r\n type=\"first\"\r\n disabled={currentPage === 0}\r\n className=\"pagination-item action\" />\r\n {\r\n let newPage = currentPage - 1 > -1 ? currentPage - 1 : 0;\r\n onPageChange(newPage);\r\n }}\r\n type=\"previous\"\r\n disabled={currentPage === 0}\r\n className=\"pagination-item action\"\r\n />\r\n \r\n = count}\r\n onClick={() => {\r\n let newPage = currentPage + 1 < count ? currentPage + 1 : 0;\r\n onPageChange(newPage);\r\n }}\r\n type=\"next\"\r\n className=\"pagination-item action\"\r\n />\r\n = count}\r\n onClick={() => onPageChange(count - 1)}\r\n type=\"last\"\r\n className=\"pagination-item action\"\r\n />\r\n
    \r\n );\r\n}\r\n\r\nexport default Pagination;\r\n","import * as React from 'react';\r\nimport {injectIntl, IntlShape} from \"react-intl\";\r\n\r\nimport { Icons } from 'modules/common/icons';\r\n\r\ninterface componentState {\r\n prompts: string[]\r\n}\r\ninterface componentProps {\r\n intl: IntlShape;\r\n}\r\n\r\nclass AnimatedDragPrompt extends React.Component {\r\n private timer;\r\n \r\n constructor(props){\r\n super(props);\r\n this.state = {prompts: []};\r\n }\r\n\r\n componentDidMount() {\r\n this.timer = setTimeout(() => {\r\n this.setState({prompts: [\r\n this.props.intl.formatMessage({id: \"posts.dragPrompt\", defaultMessage: \"Drag to Reposition, Scroll to Zoom\"})\r\n ]});\r\n }, 1250)\r\n }\r\n\r\n componentWillUnmount() {\r\n clearTimeout(this.timer);\r\n }\r\n\r\n public render() {\r\n return ( \r\n this.state.prompts.map(prompt => {\r\n return (\r\n
    \r\n {prompt}\r\n
    \r\n )\r\n })\r\n );\r\n }\r\n}\r\n\r\nexport default injectIntl(AnimatedDragPrompt);","import * as React from 'react';\r\nimport * as dom from 'react-dom';\r\nimport AnimatedDragPrompt from './animatedDragPrompt';\r\nimport shallowEquals from 'utils/shallowEquals';\r\nimport Croppie from 'croppie';\r\n\r\n// the actual croppie module needs to be 'required' due to dependencies on window object\r\nimport 'croppie/croppie.css';\r\n\r\nimport './cropper.sass';\r\nimport Loading from '../../loading';\r\n\r\ninterface WidthHeightObject { width: number, height: number }\r\n\r\ninterface componentProps {\r\n viewport: WidthHeightObject,\r\n boundary: WidthHeightObject,\r\n url: string,\r\n cropPoints: number[],\r\n zoom?: number;\r\n}\r\n\r\ninterface componentState {\r\n loading: boolean;\r\n}\r\n\r\nexport default class Cropper extends React.Component {\r\n private cropperContainer: HTMLElement;\r\n private croppie;\r\n\r\n constructor(props: componentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n loading: false,\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n /*\r\n * Force update is called here in order to call didUpdate\r\n * after the initial render. (The croppie container needs\r\n * to be rendered before that is called)\r\n */\r\n this.initializeCroppie();\r\n this.forceUpdate();\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: componentProps, nextState: componentState) {\r\n return !shallowEquals(this.props, nextProps)\r\n || !shallowEquals(this.state, nextState);\r\n }\r\n\r\n componentDidUpdate(prevProps: Readonly, prevState: Readonly, snapshot?: any): void {\r\n if (prevProps.url !== this.props.url) {\r\n this.bind();\r\n }\r\n }\r\n\r\n public render() {\r\n return (\r\n <>\r\n {this.state.loading && }\r\n
    \r\n
    \r\n \r\n
    \r\n {/*\r\n Dont place anything in this div other than the target img.\r\n The cropping tool may remove it.\r\n */}\r\n \"crop\" this.cropperContainer = el!} />\r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n }\r\n\r\n public getData = () => {\r\n return this.croppie.get();\r\n }\r\n\r\n private bind() {\r\n this.setState({ loading: true });\r\n\r\n this.croppie.bind({\r\n url: this.props.url,\r\n zoom: this.props.zoom || 0,\r\n points: this.props.cropPoints || [],\r\n })\r\n .then(r => {\r\n let checkExists = setInterval(() => {\r\n let elementExists = document.getElementById(\"croppie-parent\");\r\n if (elementExists) {\r\n document.getElementById(\"croppie-parent\")!.style.opacity = \"1\";\r\n clearInterval(checkExists);\r\n }\r\n }, 100);\r\n })\r\n .finally(() => {\r\n this.setState({ loading: false });\r\n });\r\n }\r\n\r\n private initializeCroppie() {\r\n if (typeof window === 'undefined') {\r\n // Croppie has dependencies on window object.\r\n // Don't execute this server side.\r\n return null;\r\n }\r\n\r\n this.croppie = new Croppie(dom.findDOMNode(this.cropperContainer) as HTMLElement, {\r\n boundary: this.props.boundary,\r\n viewport: this.props.boundary,\r\n showZoomer: false,\r\n enableOrientation: false,\r\n });\r\n\r\n this.bind();\r\n }\r\n}\r\n","import * as React from 'react';\r\n\r\nconst paddedImage: React.FunctionComponent = (props) => {\r\n \r\n return (\r\n
    \r\n \r\n {props.footer && \r\n props.footer\r\n }\r\n
    \r\n )\r\n}\r\n\r\ninterface ComponentProps {\r\n src: string;\r\n height: string;\r\n width: string;\r\n backgroundColor: string;\r\n footer?: JSX.Element;\r\n onClick?: (any) => void;\r\n}\r\n\r\nexport default paddedImage;","import * as React from \"react\";\r\nimport { useRef, useState } from \"react\";\r\n\r\nimport { CroppableImage } from \"../models\";\r\nimport Pagination from \"../../pagination/pagination\";\r\nimport Cropper from \"../cropper/cropper\";\r\nimport Loading from \"../../loading\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport { UnfoldMore } from \"@mui/icons-material\";\r\nimport PaddedImage from \"../../paddedImage\";\r\n\r\nconst ImageCropper: React.FunctionComponent = ({\r\n images,\r\n loading = false,\r\n show,\r\n ...props\r\n}) => {\r\n const [currentPage, setCurrentPage] = useState(0);\r\n const [isCropping, setIsCropping] = useState(true);\r\n const cropper = useRef(null);\r\n\r\n React.useEffect(() => {\r\n if (!show)\r\n setCurrentPage(0);\r\n setIsCropping(true);\r\n\r\n }, [show]);\r\n\r\n const getCurrentImage = () => {\r\n if (!images) return undefined;\r\n\r\n let result: CroppableImage | undefined = undefined;\r\n if (currentPage < images.length)\r\n result = images[currentPage];\r\n\r\n return result;\r\n }\r\n\r\n const imageToCrop = getCurrentImage();\r\n const cropBoundary = props.cropBoundary || { width: 560, height: 315 };\r\n\r\n const onPageChange = (newPage: number) => {\r\n if (!images) return;\r\n let imageToSet:CroppableImage = { ...imageToCrop! };\r\n\r\n if(isCropping) {\r\n const cropperData = cropper.current!.getData() as { points: number[], zoom: number };\r\n imageToSet.transforms = cropperData;\r\n }\r\n\r\n props.onPageChange(imageToSet, newPage === images.length);\r\n \r\n if (newPage < 0) newPage = 0;\r\n if (newPage >= images.length) newPage = images.length - 1;\r\n \r\n setCurrentPage(newPage);\r\n }\r\n\r\n const getButtonLabel = (): string => {\r\n let result = \"Finish\";\r\n if (!images) return result;\r\n\r\n // if on last image\r\n if (images.length - 1 === currentPage)\r\n result = \"Finish\";\r\n else\r\n result = \"Next\";\r\n\r\n return result;\r\n }\r\n\r\n return (\r\n \r\n \r\n
    \r\n {(images?.length || 0) > 1 ? \"Adjust Images\" : \"Adjust Image\"}\r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n {loading && }\r\n {!!imageToCrop && !loading && isCropping &&\r\n { cropper.current = c }}\r\n />\r\n }\r\n {!!imageToCrop && !loading && !isCropping && \r\n \r\n }\r\n \r\n \r\n \r\n
    \r\n \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n );\r\n}\r\n\r\ninterface ICropBoundary {\r\n width: number;\r\n height: number;\r\n}\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n images?: CroppableImage[];\r\n loading?: boolean;\r\n cropBoundary?: ICropBoundary\r\n skippable?: boolean;\r\n onPageChange: (image: CroppableImage, finished: boolean) => void;\r\n onClose: () => void;\r\n}\r\n\r\nexport default ImageCropper;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\n\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\nimport CropIcon from \"@mui/icons-material/Crop\";\r\nimport CreateIcon from '@mui/icons-material/CreateOutlined';\r\nimport { Fab, useMediaQuery, useTheme } from \"@mui/material\";\r\n\r\nimport { Icons } from \"modules/common/icons\";\r\nimport { CroppableImage } from \"../models\";\r\nimport { AttachedFile } from \"modules/gallery\";\r\nimport CanvasPreviewImage from \"../../canvasPreviewImage\";\r\nimport * as galleryActions from \"modules/gallery/actionCreator\";\r\nimport ImageCropper from \"../dialogs/imageCropper\";\r\nimport ImageGalleryDialog from \"../dialogs/imageGalleryDialog\";\r\nimport Pagination from \"../../pagination/pagination\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport \"./heroBannerv2.sass\";\r\nimport PortraitImage from \"../../paddedImage\";\r\n\r\ninterface IHeroBannerEditorProps {\r\n onEditHeroImage: (image: CroppableImage | undefined) => void;\r\n onEditAttachedContent: (images: AttachedFile[]) => void;\r\n images: AttachedFile[];\r\n}\r\n\r\n// authoring v2\r\nconst HeroBannerEditor: React.FunctionComponent = ({\r\n images,\r\n onEditAttachedContent,\r\n onEditHeroImage,\r\n getImage,\r\n getVideo,\r\n getVideosComplete\r\n}) => {\r\n const theme = useTheme();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down('md'), { noSsr: true });\r\n\r\n const [pageIndex, setPageIndex] = useState(0);\r\n const [imageGalleryOpen, setImageGalleryOpen] = useState(false);\r\n const [imageCropperOpen, setImageCropperOpen] = useState(false);\r\n const includeVideos = false; // we don't support videos for heros currently\r\n const [imagesToCrop, setImagesToCrop] = useState();\r\n const [imagesToCropAttachedFile, setImagesToCropAttachedFile] = useState(); // same as imagesToCrop just in AttachedFile interface\r\n const [isCropSkippable, setIsCropSkippable] = useState(false);\r\n const [fetching, setFetching] = useState(false);\r\n const [previewedImage, setPreviewedImage] = useState();\r\n\r\n useEffect(() => {\r\n let newImage = pageIndex < images.length\r\n ? images[pageIndex]\r\n : undefined;\r\n\r\n setPreviewedImage(newImage);\r\n }, [pageIndex, images]);\r\n\r\n const onCloseImageCropper = () => {\r\n setImagesToCrop([]);\r\n setImagesToCropAttachedFile([]);\r\n setImageCropperOpen(false);\r\n setIsCropSkippable(false);\r\n }\r\n\r\n const onCloseImageGallery = () => {\r\n setImageGalleryOpen(false);\r\n }\r\n\r\n const getImagePreview = (): JSX.Element => {\r\n let result = <>;\r\n if (images.length === 0) {\r\n result =
    { setImageGalleryOpen(true); }}>\r\n \r\n Set a hero banner image\r\n
    ;\r\n } else {\r\n result = canvas();\r\n }\r\n\r\n return result;\r\n }\r\n\r\n const canvas = () => {\r\n return previewedImage && previewedImage.transforms && previewedImage.transforms.zoom && previewedImage.transforms.points.length > 0\r\n ? <>\r\n { setImageGalleryOpen(true); }}\r\n height={234}\r\n width={416}\r\n src={previewedImage.fileUrl!}\r\n cropPoints={previewedImage.transforms?.points || []}\r\n />\r\n {getImageActions()}\r\n \r\n : \r\n { setImageGalleryOpen(true); }}\r\n footer={getImageActions()}\r\n />\r\n }\r\n\r\n const getImageActions = () => {\r\n return (\r\n <>\r\n {images.length > 0 &&\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n { setImageGalleryOpen(true); }}>\r\n \r\n \r\n
    }\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Apply transforms to image\r\n * - first find it in images array\r\n * - if it is the first element, call hero image update from props\r\n * - else build new attached content array and call attached content update from props\r\n */\r\n const onApplyImageTransform = (newImage: CroppableImage, finished: boolean = false) => {\r\n if (!imagesToCropAttachedFile)\r\n return;\r\n\r\n // find image in images\r\n let imageToUpdateIndex = images?.findIndex((img: AttachedFile) => img.blobId === newImage.id);\r\n if (imageToUpdateIndex === -1)\r\n return;\r\n\r\n // handle main hero image\r\n if (imageToUpdateIndex === 0) {\r\n onEditHeroImage({ ...newImage });\r\n } else {\r\n let [, ...newAttachedContent] = [...images!];\r\n let valueToReplace = images[imageToUpdateIndex];\r\n\r\n // -1 since hero image is always first\r\n newAttachedContent[imageToUpdateIndex - 1] = { ...valueToReplace, ...newImage };\r\n\r\n onEditAttachedContent(newAttachedContent);\r\n }\r\n\r\n if (finished) onCloseImageCropper();\r\n }\r\n\r\n const onSelectImages = async (attachedContent: AttachedFile[]) => {\r\n setFetching(true);\r\n onCloseImageGallery();\r\n setIsCropSkippable(true);\r\n setImageCropperOpen(true);\r\n\r\n const results = await getAttachedContents(attachedContent);\r\n\r\n let newImagesAttachedFileToCrop = results\r\n .filter((value: AttachedFile) => value.fileType !== \"video\");\r\n\r\n let newImagesToCrop = newImagesAttachedFileToCrop\r\n .map((value: AttachedFile) => {\r\n return ({ id: value.ospreyId, url: value.fileUrl!, transforms: { points: [] } });\r\n });\r\n\r\n let [newHero, ...rest] = results;\r\n\r\n if (newHero)\r\n onEditHeroImage({ id: newHero.ospreyId, url: newHero.fileUrl!, transforms: newHero.transforms || { points: [] } });\r\n\r\n if (rest && rest.length > 0)\r\n onEditAttachedContent(rest);\r\n\r\n setFetching(false);\r\n setImagesToCrop(newImagesToCrop);\r\n setImagesToCropAttachedFile(newImagesAttachedFileToCrop);\r\n }\r\n\r\n const getAttachedContents = async (attachedContent: AttachedFile[]): Promise => {\r\n let containsVideo = false\r\n let tasks: Promise[] = [];\r\n\r\n for (let i = 0; i < attachedContent.length; i++) {\r\n const curr = attachedContent[i];\r\n\r\n let taskToAdd: Promise;\r\n if (curr.fileType === \"video\") {\r\n taskToAdd = Promise.resolve({ ...curr, fileUrl: (await getVideo(curr.ospreyId)) });\r\n containsVideo = true;\r\n } else {\r\n taskToAdd = getImage(curr.ospreyId);\r\n }\r\n\r\n tasks.push(taskToAdd);\r\n }\r\n\r\n if (containsVideo)\r\n getVideosComplete();\r\n\r\n return await Promise.all(tasks);\r\n }\r\n\r\n const onCropImage = () => {\r\n if (previewedImage)\r\n setImagesToCrop([{\r\n url: previewedImage.fileUrl!,\r\n id: previewedImage.blobId,\r\n transforms: previewedImage.transforms || { points: [] },\r\n }]);\r\n\r\n setImageCropperOpen(true);\r\n }\r\n\r\n /**\r\n * Remove an image\r\n * - first image always hero banner\r\n */\r\n const onRemoveImage = () => {\r\n let [currHeroImage, ...newAttachedContent] = [...images];\r\n let newHeroImage: AttachedFile | undefined = { ...currHeroImage };\r\n\r\n // removing hero, next element becomes hero if it exists otherwise empty all images\r\n if (pageIndex === 0) {\r\n if (images.length > 1) {\r\n newHeroImage = { ...images[1] };\r\n newAttachedContent.splice(0, 1);\r\n } else {\r\n newHeroImage = undefined;\r\n newAttachedContent = [];\r\n }\r\n } else {\r\n newAttachedContent = newAttachedContent.filter((img: AttachedFile) => img.blobId !== previewedImage?.blobId);\r\n }\r\n\r\n // set current image preview to the one before that was removed or the first one\r\n setPageIndex(prev => prev === 0 ? 0 : prev - 1);\r\n onEditAttachedContent(newAttachedContent);\r\n onEditHeroImage({ url: newHeroImage?.fileUrl!, id: newHeroImage?.ospreyId!, transforms: newHeroImage?.transforms! });\r\n }\r\n\r\n return (\r\n <>\r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n {getImagePreview()}\r\n
    \r\n
    \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IHeroBannerEditorProps) => ({\r\n ...ownProps,\r\n isFetching: state.gallery.isFetching\r\n }), {\r\n getImage: galleryActions.getImage,\r\n getVideo: galleryActions.getVideo,\r\n getVideosComplete: galleryActions.getVideosComplete\r\n}\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(HeroBannerEditor);\r\n","import * as React from \"react\";\r\n\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Select from \"@mui/material/Select\";\r\n\r\nconst INLINE_STYLES = {\r\n container: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\"\r\n },\r\n label: {\r\n flex: 1,\r\n },\r\n input: {\r\n width: \"100%\",\r\n overflow: \"hidden\"\r\n }\r\n}\r\n\r\nclass PostType extends React.Component {\r\n\r\n public render() {\r\n const { inline = false } = this.props;\r\n\r\n return (\r\n
    \r\n
    \r\n
    {this.props.label || \"Post Type\"}
    \r\n \r\n \r\n Standard\r\n Compliance\r\n Mandatory\r\n Public\r\n \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private onChangePostType = (event) => {\r\n this.props.onChange(event.target.value);\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n hasPublished: boolean;\r\n postType: string;\r\n inline?: boolean;\r\n label?: string;\r\n onChange: (postType: string) => void;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nexport default PostType;\r\n","import React, { useEffect, useState } from \"react\";\r\n\r\nimport { InputAdornment, InputProps, TextField } from \"@mui/material\";\r\n\r\n\r\ninterface IIconTextFieldProps {\r\n iconStart?: JSX.Element;\r\n iconEnd?: JSX.Element;\r\n InputProps?: InputProps;\r\n variant?: \"standard\" | \"filled\" | \"outlined\";\r\n value?: string;\r\n error?: boolean;\r\n errorMessage?: string;\r\n className?: string;\r\n size?: \"small\" | \"medium\";\r\n characterCount?: boolean;\r\n maxCount?: number;\r\n characterCountThreshold?: number;\r\n onBlur?: (event: React.FocusEvent) => void;\r\n onFocus?: (event: React.FocusEvent) => void;\r\n}\r\n\r\n/**\r\n * A textfield with icons\r\n * - adapted from https://muhimasri.com/blogs/how-to-create-an-icon-text-field-component-with-material-ui/\r\n */\r\nconst IconTextField: React.FunctionComponent = ({\r\n iconStart,\r\n iconEnd,\r\n InputProps,\r\n className,\r\n characterCount,\r\n maxCount,\r\n characterCountThreshold = 0,\r\n size = \"medium\",\r\n error = false,\r\n errorMessage,\r\n value = \"\",\r\n ...props\r\n}) => {\r\n const [internalValue, setInternalValue] = useState(value);\r\n\r\n useEffect(() => {\r\n setInternalValue(value);\r\n }, [value]);\r\n\r\n const onChange = (event: React.ChangeEvent) => {\r\n let newValue = event.target.value;\r\n let effectiveNewValue = maxCount && newValue.length > maxCount\r\n ? internalValue // keep value at max count\r\n : newValue;\r\n\r\n setInternalValue(effectiveNewValue);\r\n }\r\n\r\n const getErrorStyles = (): React.CSSProperties | undefined => {\r\n let styles: React.CSSProperties | undefined = undefined;\r\n if (error)\r\n styles = { borderColor: \"#B72026 \" };\r\n\r\n return styles;\r\n }\r\n\r\n const errorStyles = getErrorStyles();\r\n\r\n return (\r\n
    \r\n {iconStart}\r\n ) : undefined,\r\n endAdornment: iconEnd ? (\r\n {iconEnd}\r\n ) : undefined,\r\n onBlur: props.onBlur,\r\n onFocus: props.onFocus\r\n }}\r\n />\r\n {characterCount && maxCount && internalValue.length >= characterCountThreshold &&\r\n
    \r\n \r\n {internalValue.length}/{maxCount}\r\n \r\n
    }\r\n {error && errorMessage &&

    \r\n {errorMessage}\r\n

    }\r\n
    \r\n );\r\n};\r\n\r\nexport default IconTextField;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\n\r\nimport { AttachedFile } from \"modules/gallery/models\";\r\nimport { CroppableImage } from \"modules/common/components/authoring/models\";\r\nimport HeroBannerEditor from \"./heroBanner/heroBannerEditor\";\r\nimport PostType from \"modules/posts/components/post-creation/components/postType\";\r\nimport { Post, Tag } from \"modules/posts/models\";\r\nimport MultiselectAndChipsWithSearch from \"../forms/inputs/multiSelectAndChipsWithSearch\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport Disclaimer from \"../disclaimer\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport { IdNamePair } from \"modules/common/models\";\r\nimport useIsMounted from \"modules/common/hooks/useIsMounted\";\r\nimport ChipList, { IChipListItem } from \"../chipList\";\r\nimport IconTextField from \"../forms/inputs/iconTextInput\";\r\nimport { isPostEmailValid } from \"modules/posts/components/post-creation/validation\";\r\nimport FileAttachments from \"./fileAttachments\";\r\nimport { tagsApi } from \"api/instances\";\r\nimport { TenantSettingsTag, TenantSettingsTagGroup, MultiSelectTopic, MultiSelectTopicGroup } from \"modules/settings\";\r\nimport { Divider } from \"@mui/material\";\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport PersonIcon from '@mui/icons-material/Person';\r\nimport EmailIcon from '@mui/icons-material/Email'\r\n\r\nimport \"./styles/detailsEditor.sass\";\r\nimport { mentionCheck } from \"utils/regexUserValidation\";\r\n\r\ninterface IDetailsEditorProps {\r\n hasPublished: boolean;\r\n post: Partial;\r\n onChangeAttachedContent: (selectedImages: AttachedFile[]) => void;\r\n onChangeImage: (image: CroppableImage | undefined) => void;\r\n onChangePostType: (postType: string) => void;\r\n onChangeTopics: (topics: Tag[]) => void;\r\n onChangeAuthor: (author: string) => void;\r\n onChangeAuthorEmail: (authorEmail: string) => void;\r\n onChangeFileAttachements: (fileAttachments: AttachedFile[]) => void;\r\n isContributor: boolean;\r\n}\r\n\r\ninterface AuthorContact {\r\n name: string,\r\n email: string\r\n}\r\n\r\nconst defaultAuthorContact: AuthorContact = {\r\n name: \"\",\r\n email: \"\"\r\n}\r\n\r\nconst DetailsEditor: React.FunctionComponent = ({\r\n post,\r\n hasPublished,\r\n topicGroups,\r\n onChangeTopics,\r\n onChangePostType,\r\n onChangeAttachedContent,\r\n onChangeImage,\r\n onChangeAuthor,\r\n onChangeAuthorEmail,\r\n onChangeFileAttachements,\r\n isContributor,\r\n}) => {\r\n const { translatedContent } = post;\r\n const [hasMention, setHasMention] = useState();\r\n const [tags, setTags] = useState([]);\r\n const [topicAudiences, setTopicAudiences] = useState[]>([]);\r\n const [authorContact, setAuthorContact] = useState(defaultAuthorContact);\r\n const isMounted = useIsMounted();\r\n\r\n // for old sparrow accounts with no email stored, allow to edit email address\r\n const canEditAuthorName = !isContributor;\r\n const canEditAuthorEmail = canEditAuthorName || post.authorEmail === undefined || post.authorEmail === \"\";\r\n useEffect(() => {\r\n const getTags = async () => {\r\n let tagsToSet: TenantSettingsTagGroup[] = [];\r\n try {\r\n tagsToSet = await tagsApi.getUserTags(true);\r\n }\r\n catch {\r\n tagsToSet = [];\r\n }\r\n finally {\r\n if (isMounted()) setTags(tagsToSet);\r\n }\r\n }\r\n\r\n getTags();\r\n }, [isMounted]);\r\n\r\n useEffect(() => {\r\n const toTest = JSON.stringify(translatedContent);\r\n const result = mentionCheck.test(toTest);\r\n\r\n if (result !== hasMention)\r\n setHasMention(result);\r\n\r\n }, [translatedContent, hasMention]);\r\n\r\n useEffect(() => {\r\n const getAudiences = async () => {\r\n let newAudiences = [];\r\n try {\r\n if (post.tags && post.tags.length > 0)\r\n newAudiences = await tagsApi.getAssociatedAudiences(post.tags.map((tag: Tag) => tag.id));\r\n } catch (error) {\r\n } finally {\r\n if (isMounted())\r\n setTopicAudiences(newAudiences);\r\n }\r\n }\r\n\r\n getAudiences();\r\n }, [post.tags, isMounted]);\r\n\r\n /**\r\n * Put hero and attached content in one array\r\n */\r\n const getImages = (): AttachedFile[] => {\r\n const { image, attachedContent } = post;\r\n\r\n if (!image || !image.id) return [];\r\n\r\n let consolidatedImages: AttachedFile[] = [\r\n {\r\n ...image,\r\n fileName: \"\",\r\n fileType: \"image\",\r\n fileExtension: \"\",\r\n blobId: image.id,\r\n fileUrl: image.url,\r\n ospreyId: image.id,\r\n }\r\n ];\r\n\r\n if (attachedContent)\r\n consolidatedImages = [...consolidatedImages, ...attachedContent];\r\n\r\n return consolidatedImages;\r\n }\r\n\r\n /**\r\n * Remove disabled topics and empty topic groups before rendering\r\n */\r\n const filterTopicGroups = () : MultiSelectTopicGroup[] => {\r\n return tags.map((group: TenantSettingsTagGroup) => ({\r\n ...group,\r\n children: group.tags.filter((tag: TenantSettingsTag) => !tag.disabled)\r\n }))\r\n .filter((group: TenantSettingsTagGroup) => group.tags.length > 0);\r\n }\r\n\r\n const onEditHeroImage = (image: CroppableImage | undefined) => {\r\n onChangeImage(image);\r\n }\r\n\r\n const onEditAttachedContent = (attached: AttachedFile[]) => {\r\n onChangeAttachedContent(attached);\r\n }\r\n\r\n const onEditTopics = (topics: MultiSelectTopic[]) => {\r\n onChangeTopics([...topics]);\r\n }\r\n\r\n const onEditAuthor = (event: React.FocusEvent) => {\r\n const newAuthorName = event.currentTarget.value\r\n if (authorContact.name !== newAuthorName) {\r\n onChangeAuthor(newAuthorName);\r\n }\r\n }\r\n\r\n const onEditAuthorEmail = (event: React.FocusEvent) => {\r\n const newEmail = event.currentTarget.value\r\n if (authorContact.email !== newEmail) {\r\n onChangeAuthorEmail(newEmail);\r\n }\r\n }\r\n\r\n const onFocusAuthor = (event: React.FocusEvent) => {\r\n const name = event.target.value\r\n setAuthorContact({ ...authorContact, name })\r\n }\r\n\r\n const onFocusAuthorEmail = (event: React.FocusEvent) => {\r\n const email = event.target.value\r\n setAuthorContact({ ...authorContact, email })\r\n }\r\n\r\n const getSelectedTopics = (): MultiSelectTopic[] | undefined => {\r\n let allTopics = topicGroups.flatMap((group: TenantSettingsTagGroup) => group.tags);\r\n\r\n return allTopics\r\n .filter((topic: TenantSettingsTag) => (post.tags?.map((postTag: Tag) => postTag.id) || []).includes(topic.id))\r\n }\r\n\r\n const showAccessibleToAllUsersDisclaimer = (): JSX.Element => {\r\n const postTopics = getSelectedTopics();\r\n\r\n let hasRestricted = postTopics?.some((topic: MultiSelectTopic) => topic.restricted);\r\n let hasNonRestricted = postTopics?.some((topic: MultiSelectTopic) => !topic.restricted);\r\n\r\n return hasRestricted && hasNonRestricted\r\n ? }\r\n backgroundColor=\"#ffe9af\"\r\n />\r\n : <>;\r\n }\r\n\r\n const showMentionsAndRestrictedDisclaimer = (): JSX.Element => {\r\n let result = <>;\r\n let postTopics = getSelectedTopics();\r\n\r\n let hasRestricted = postTopics?.some((topic: MultiSelectTopic) => topic.restricted);\r\n let hasNonRestricted = postTopics?.some((topic: MultiSelectTopic) => !topic.restricted);\r\n\r\n if (hasRestricted && !hasNonRestricted && hasMention)\r\n result = }\r\n text={\"@Mentioning someone in a restricted post will not send a notification to the user if they do not have access to the restricted topic.\"}\r\n />;\r\n\r\n return result;\r\n }\r\n\r\n const showPrivateToAudiencesDisclaimer = (): JSX.Element => {\r\n let result = <>;\r\n let postTopics = getSelectedTopics();\r\n let hasRestricted = postTopics?.some((topic: MultiSelectTopic) => topic.restricted);\r\n\r\n if (hasRestricted) {\r\n let hasNonRestricted = postTopics?.some((topic: MultiSelectTopic) => !topic.restricted);\r\n result = hasNonRestricted\r\n ? <>\r\n : }\r\n text={\"This post is private to the following audiences.\"}\r\n />\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get a list of audiences\r\n * - if post has no topics then render a default message\r\n * @returns\r\n */\r\n const getAudienceList = (): IChipListItem[] => {\r\n let audiences: IChipListItem[] = topicAudiences.map((chip: IdNamePair) => ({ ...chip, disabled: true }));\r\n\r\n if (!post.tags || post.tags.length === 0)\r\n audiences = [{ id: \"EMPTY\", name: \"Select at least 1 topic\", disabled: true }];\r\n else if (post.tags && post.tags.length > 0 && topicAudiences.length === 0)\r\n audiences = [{ id: \"ALL\", name: \"All users\", disabled: true, labelStyle: { fontStyle: \"italic\" } }];\r\n\r\n return audiences;\r\n }\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n \r\n {\r\n !isContributor &&\r\n \r\n }\r\n
    0 ? \"flex-start\" : \"center\"\r\n }}>\r\n \r\n \r\n
    \r\n {showMentionsAndRestrictedDisclaimer()}\r\n {showAccessibleToAllUsersDisclaimer()}\r\n {showPrivateToAudiencesDisclaimer()}\r\n
    \r\n \r\n Shows you the targeted audiences when the topic you use is default, mandatory or restricted to specific audiences.\r\n \r\n {topicAudiences &&\r\n
    \r\n \r\n
    }\r\n
    \r\n \r\n {\r\n canEditAuthorEmail &&\r\n <>\r\n
    \r\n \r\n Change the {canEditAuthorName && 'name and'} email that appears on the post.\r\n \r\n
    \r\n {\r\n canEditAuthorName &&\r\n }\r\n variant=\"outlined\"\r\n className=\"author-inputs\"\r\n error={!post.author}\r\n characterCount\r\n maxCount={64}\r\n characterCountThreshold={50}\r\n onFocus={onFocusAuthor}\r\n />\r\n }\r\n
    \r\n }\r\n variant=\"outlined\"\r\n className=\"author-inputs\"\r\n error={!isPostEmailValid(post)}\r\n errorMessage={\"Enter a valid email address\"}\r\n onFocus={onFocusAuthorEmail}\r\n />\r\n
    \r\n
    \r\n
    \r\n \r\n \r\n }\r\n onChangeFileAttachements([])}\r\n footNoteStyle={{ textAlign: \"left\" }}\r\n />\r\n
    \r\n
    \r\n );\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IDetailsEditorProps) => ({\r\n ...ownProps,\r\n topicGroups: state.settings.tenantSettings.tagGroups,\r\n }));\r\n\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(DetailsEditor);\r\n","import { NotificationRange } from \"modules/documents\";\r\nimport { NotificationEvents, TenantNotificationSettings } from \"modules/messaging\";\r\n\r\n// checks if ANY tenant notifications on post published are enabled (toggle === true)\r\nexport const isAnyTenantPostNotificationsEnabled = (notificationSettings: TenantNotificationSettings): boolean => {\r\n return notificationSettings.settings[NotificationEvents.PostPublishedEmail]?.toggle || \r\n notificationSettings.settings[NotificationEvents.PostPublishedMobile]?.toggle || \r\n notificationSettings.settings[NotificationEvents.PostPublishedSMS]?.toggle || \r\n notificationSettings.settings[NotificationEvents.PostPublishedTeams]?.toggle;\r\n};\r\n\r\n// checks if ANY tenant notifications on event published are enabled\r\nexport const isAnyTenantEventNotificationsEnabled = (notificationSettings: TenantNotificationSettings): boolean => {\r\n return notificationSettings.settings[NotificationEvents.EventPublishedEmail]?.toggle || \r\n notificationSettings.settings[NotificationEvents.EventPublishedMobile]?.toggle || \r\n notificationSettings.settings[NotificationEvents.EventPublishedSMS]?.toggle || \r\n notificationSettings.settings[NotificationEvents.EventPublishedTeams]?.toggle;\r\n};\r\n\r\n// Get the default NotificationRange tenant setting for all NotificationEvents \r\n// that's either on post published or event published\r\nexport const getDefaultNotificationSetting = (\r\n event: NotificationEvents, \r\n notificationSettings: TenantNotificationSettings\r\n): NotificationRange => {\r\n let range: NotificationRange = \"none\";\r\n\r\n if (notificationSettings.settings[event]?.toggle) {\r\n if (event === NotificationEvents.PostPublishedEmail)\r\n range = notificationSettings.defaultPostSettings?.emailOnPublish || \"none\";\r\n else if (event === NotificationEvents.PostPublishedMobile)\r\n range = notificationSettings.defaultPostSettings?.mobileOnPublish || \"subscribers\";\r\n else if (event === NotificationEvents.PostPublishedSMS)\r\n range = notificationSettings.defaultPostSettings?.smsOnPublish || \"none\";\r\n else if (event === NotificationEvents.PostPublishedTeams)\r\n range = notificationSettings.defaultPostSettings?.teamsOnPublish || \"subscribers\";\r\n else if (event === NotificationEvents.EventPublishedEmail)\r\n range = notificationSettings.defaultEventSettings?.emailOnPublish || \"fallback\";\r\n else if (event === NotificationEvents.EventPublishedMobile)\r\n range = notificationSettings.defaultEventSettings?.mobileOnPublish || \"none\";\r\n else if (event === NotificationEvents.EventPublishedSMS)\r\n range = notificationSettings.defaultEventSettings?.smsOnPublish || \"fallback\";\r\n else if (event === NotificationEvents.EventPublishedTeams)\r\n range = notificationSettings.defaultEventSettings?.teamsOnPublish || \"none\";\r\n }\r\n\r\n return range;\r\n}\r\n\r\n// checks if ANY tenant reminders are enabled\r\nexport const isAnyTenantRemindersEnabled = (notificationSettings: TenantNotificationSettings): boolean => {\r\n return notificationSettings.settings[NotificationEvents.PostReminderEmail]?.toggle || \r\n notificationSettings.settings[NotificationEvents.PostReminderMobile]?.toggle || \r\n notificationSettings.settings[NotificationEvents.PostReminderSMS]?.toggle || \r\n notificationSettings.settings[NotificationEvents.PostReminderTeams]?.toggle;\r\n};","import React, { useRef, useState } from \"react\";\r\nimport { Box, Button, Checkbox, DrawerProps, FormControlLabel, Tab, Tabs, useMediaQuery, useTheme } from \"@mui/material\";\r\nimport FiberManualRecordIcon from '@mui/icons-material/FiberManualRecord';\r\n\r\nimport { Tab as ITab } from \"pages/common/tabs\";\r\nimport { ContentAnalysis, CroppableImage, ValidationChecks } from \"modules/common/components/authoring/models\";\r\nimport { ProgressBar } from \"modules/common/components/authoring/validator\";\r\nimport AuthoringDrawer from \"../../../../common/components/drawers/authoringDrawer\";\r\nimport { AttachedFile } from \"modules/gallery\";\r\nimport { CommentingTypes, Post, Tag, Notifications as INotifications, PostAverages, Notifications } from \"modules/posts/models\";\r\nimport OptionsEditor from \"modules/common/components/authoring/optionsEditor\";\r\nimport { NotificationEvents, TenantNotificationSettings } from \"modules/messaging\";\r\nimport ContentAnalyses from \"modules/insights/components/contentAnalyses\";\r\nimport { CurrentUserSettings } from \"modules/settings\";\r\nimport Callout from \"modules/common/components/callout\";\r\nimport DetailsEditor from \"modules/common/components/authoring/detailsEditor\";\r\n\r\nimport \"../styles/postSettingsPanel.sass\";\r\nimport { lcidMappings } from \"modules/resources\";\r\nimport { LANGUAGE_CODES } from \"modules/localization/models\";\r\nimport { getDefaultNotificationSetting } from \"utils/notificationsHelper\";\r\n\r\ninterface IContentAnalysesCalloutProps {\r\n anchorEl: HTMLElement | null;\r\n checked: boolean;\r\n onChange: (checked: boolean) => void;\r\n onClose: (element: HTMLElement | null) => void;\r\n}\r\n\r\nconst ContentAnalysesCallout: React.FunctionComponent = ({\r\n anchorEl,\r\n checked,\r\n onChange,\r\n onClose,\r\n}) => {\r\n const [calloutOpen, setCalloutOpen] = React.useState(false);\r\n\r\n return (\r\n {\r\n setCalloutOpen(toSet);\r\n }}\r\n contentClassName=\"content-analyses-callout\"\r\n anchorEl={anchorEl}\r\n arrowPosition=\"right\"\r\n popoverProps={{\r\n anchorOrigin: {\r\n vertical: -44,\r\n horizontal: -163\r\n }\r\n }}\r\n >\r\n

    We have some suggestions to improve the readership and engagement for your post!

    \r\n
    \r\n onChange(checked)} checked={checked} size=\"small\" color=\"primary\" />}\r\n />\r\n onClose(null)}\r\n >\r\n Close\r\n \r\n
    \r\n \r\n );\r\n}\r\n\r\ninterface IPostSettingsPanelProps {\r\n drawerProps: DrawerProps;\r\n validationChecks: ValidationChecks;\r\n post: Partial;\r\n hasPublished: boolean;\r\n notificationsEnabled: boolean;\r\n reminderNotificationsEnabled: boolean;\r\n reactionsEnabled: boolean;\r\n commentsEnabled: boolean;\r\n tenantNotificationSettings: TenantNotificationSettings;\r\n tenantAverages: PostAverages | undefined;\r\n globalAverages: PostAverages | undefined;\r\n isUsingTenantAverages: boolean;\r\n setIsUsingTenantAverages: (toSet: boolean) => void;\r\n analysisIndicator?: boolean;\r\n activeLcid: string;\r\n currentUser: CurrentUserSettings;\r\n selectedTab: number;\r\n contentAnalyses?: ContentAnalysis;\r\n fetchingAnalyses?: boolean;\r\n highlightsOn: boolean;\r\n lcidMappings: lcidMappings;\r\n toggleHighlights: () => void;\r\n analyze: () => void;\r\n onChangeTab: (event: React.ChangeEvent, newTab: number) => void;\r\n saveUserSettings: (newSettings: Partial) => Promise;\r\n onChangePost: (value: Partial) => void;\r\n onBookmarkClick: () => void;\r\n isContributor: boolean;\r\n canContributorsToggleReactions: boolean;\r\n canContributorsToggleComments: boolean;\r\n}\r\n\r\nconst POST_DETAILS = 0;\r\nconst POST_OPTIONS = 1;\r\nconst CONTENT_ANALYSES = 2;\r\n\r\nconst TABS: ITab[] = [\r\n {\r\n label: \"Post details\",\r\n value: POST_DETAILS,\r\n id: \"post-details-tab\"\r\n },\r\n {\r\n label: \"Post options\",\r\n value: POST_OPTIONS,\r\n id: \"post-options-tab\"\r\n },\r\n {\r\n label: \"Content analysis\",\r\n value: CONTENT_ANALYSES,\r\n id: \"content-analysis-tab\"\r\n }\r\n];\r\n\r\n/**\r\n * The post settings editor drawer\r\n * - this is an authoring v2 component\r\n */\r\nconst PostSettingsPanel: React.FunctionComponent = ({\r\n onBookmarkClick,\r\n onChangePost,\r\n analyze,\r\n saveUserSettings,\r\n onChangeTab,\r\n toggleHighlights,\r\n currentUser,\r\n lcidMappings,\r\n highlightsOn,\r\n contentAnalyses,\r\n hasPublished,\r\n selectedTab,\r\n reminderNotificationsEnabled,\r\n notificationsEnabled,\r\n drawerProps,\r\n post,\r\n validationChecks,\r\n commentsEnabled,\r\n reactionsEnabled,\r\n tenantAverages,\r\n globalAverages,\r\n isUsingTenantAverages,\r\n setIsUsingTenantAverages,\r\n analysisIndicator = false,\r\n tenantNotificationSettings,\r\n activeLcid,\r\n fetchingAnalyses = false,\r\n isContributor,\r\n canContributorsToggleComments,\r\n canContributorsToggleReactions,\r\n}) => {\r\n const theme = useTheme();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down('md'), { noSsr: true });\r\n\r\n const [analysesTab, setAnalysesTab] = useState(null);\r\n const [calloutOpen, setCalloutOpen] = useState(currentUser.showContentAnalysesCallout);\r\n const [showContentAnalysesCalloutChecked, setShowContentAnalysesCalloutChecked] = useState(!currentUser.showContentAnalysesCallout);\r\n\r\n const originalPostNotifications = useRef(post.notifications);\r\n\r\n const onChangeAttachedContent = (attachedContent: AttachedFile[]) => {\r\n onChangePost({ attachedContent });\r\n }\r\n\r\n const onChangeImage = (image: CroppableImage | undefined) => {\r\n onChangePost({ image });\r\n }\r\n\r\n const onChangePostType = (postType: string) => {\r\n onChangePost({ postType });\r\n }\r\n\r\n const onChangeTopics = (topics: Tag[]) => {\r\n onChangePost({ tags: topics });\r\n }\r\n\r\n const onChangeAuthor = (author: string) => {\r\n onChangePost({ author });\r\n }\r\n\r\n const onChangeAuthorEmail = (authorEmail: string) => {\r\n onChangePost({ authorEmail });\r\n }\r\n\r\n const onChangeFileAttachments = (fileAttachments: AttachedFile[]) => {\r\n onChangePost({ fileAttachments });\r\n }\r\n\r\n const onChangeBreakingTime = (breakingTime: string | null) => {\r\n onChangePost({ breakingTime: !!breakingTime ? new Date(breakingTime) : null });\r\n }\r\n\r\n const onChangeCommentingEnabled = (commentingEnabled: boolean) => {\r\n onChangePost({ commentingEnabled });\r\n }\r\n\r\n const onChangeCommentingType = (commentingType: CommentingTypes) => {\r\n onChangePost({ commentingType });\r\n }\r\n\r\n const onChangeFeaturedTime = (featuredTime: string | null) => {\r\n onChangePost({ featuredTime: !!featuredTime ? new Date(featuredTime) : null });\r\n }\r\n\r\n const onChangeExpiryTime = (expiryTime: string | undefined | null) => {\r\n let newExpiryTime = expiryTime ? new Date(expiryTime) : undefined;\r\n\r\n if (post.publishTime && !post.expiryTime && newExpiryTime && newExpiryTime < post.publishTime) {\r\n newExpiryTime.setDate(post.publishTime.getDate() + 1);\r\n newExpiryTime.setHours(post.publishTime.getHours())\r\n }\r\n else if (!post.expiryTime && newExpiryTime) newExpiryTime.setHours(8);\r\n\r\n onChangePost({ expiryTime: newExpiryTime });\r\n }\r\n\r\n const onChangePublishTime = (publishTime: string | undefined | null) => {\r\n let newDateTime = publishTime ? new Date(publishTime) : undefined;\r\n if (!post.publishTime) newDateTime?.setHours(8);\r\n onChangePost({ publishTime: newDateTime });\r\n }\r\n\r\n const onChangeReactingEnabled = (reactingEnabled: boolean) => {\r\n onChangePost({ reactingEnabled });\r\n }\r\n\r\n const onChangeNotifications = (notifications: INotifications) => {\r\n onChangePost({ notifications });\r\n }\r\n\r\n const onChangePublicLink = (linkToSet: string) => {\r\n onChangePost ({ customPublicUrl: linkToSet });\r\n }\r\n\r\n const onSetReminders = (checked: boolean) => {\r\n let currNotifications = post.notifications || {} as INotifications;\r\n\r\n if (!checked) {\r\n onChangePost({\r\n notifications: {\r\n ...currNotifications,\r\n reminders: []\r\n }\r\n });\r\n } else {\r\n const remindersDefined = Boolean(tenantNotificationSettings.defaultPostSettings?.reminders?.length);\r\n\r\n onChangePost({\r\n notifications: {\r\n ...currNotifications,\r\n reminders: remindersDefined && tenantNotificationSettings.defaultPostSettings?.reminders?.length! > 0\r\n ? tenantNotificationSettings.defaultPostSettings!.reminders\r\n : [{\r\n channel: \"inherit\",\r\n delay: tenantNotificationSettings.defaultPostReminder || 0,\r\n range: \"subscribers\"\r\n }]\r\n }\r\n });\r\n }\r\n }\r\n\r\n /*\r\n * Sets the notifications of the post when toggled.\r\n */\r\n const onSetNotifications = (checked: boolean, currToggleVal: boolean) => {\r\n let currNotifications = post.notifications || ({} as INotifications);\r\n\r\n if (checked) {\r\n setPreviousPostNotifications(currToggleVal);\r\n } else {\r\n onChangePost({\r\n notifications: {\r\n ...currNotifications,\r\n emailOnPublish: \"none\",\r\n mobileOnPublish: \"none\",\r\n smsOnPublish: \"none\",\r\n teamsOnPublish: \"none\",\r\n },\r\n });\r\n }\r\n };\r\n\r\n /*\r\n * Try to set the previous notifications of a post, if not they will be none or reverted to default.\r\n */\r\n const setPreviousPostNotifications = (currToggleVal: boolean) => {\r\n let currNotifications = post.notifications || ({} as INotifications);\r\n\r\n //If true, sets toggles to the previous published post details or else none. If not true, set's the default from the tenantConfig\r\n if ((post.isPreviouslyPublished && post.publishTime && new Date(post.publishTime).toISOString() <= new Date().toISOString()) ||\r\n originalPostNotifications.current) {\r\n if (currToggleVal) {\r\n onChangePost({\r\n notifications: {\r\n ...currNotifications,\r\n emailOnPublish: post.notifications?.emailOnPublish || \"none\",\r\n mobileOnPublish: post.notifications?.mobileOnPublish || \"none\",\r\n smsOnPublish: post.notifications?.smsOnPublish || \"none\",\r\n teamsOnPublish: post.notifications?.teamsOnPublish || \"none\"\r\n },\r\n });\r\n } \r\n else {\r\n onChangePost({\r\n notifications: {\r\n ...currNotifications,\r\n emailOnPublish: getDefaultNotificationSetting(NotificationEvents.PostPublishedEmail, tenantNotificationSettings),\r\n mobileOnPublish: getDefaultNotificationSetting(NotificationEvents.PostPublishedMobile, tenantNotificationSettings),\r\n smsOnPublish: getDefaultNotificationSetting(NotificationEvents.PostPublishedSMS, tenantNotificationSettings),\r\n teamsOnPublish: getDefaultNotificationSetting(NotificationEvents.PostPublishedTeams, tenantNotificationSettings)\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Get the english content that was analyzed\r\n */\r\n const getAnalysisContent = (): string | undefined => {\r\n let content: string | undefined = undefined;\r\n\r\n if (post.translatedContent && lcidMappings[activeLcid].translateAs === LANGUAGE_CODES.en)\r\n content = post.translatedContent[activeLcid].body;\r\n\r\n return content;\r\n }\r\n\r\n const getTabLabel = (isAnalysis: boolean, label: string): JSX.Element => (\r\n {isAnalysis && analysisIndicator ? : undefined}\r\n {label}\r\n )\r\n\r\n const getTab = (isAnalysis: boolean, tab: ITab): JSX.Element => (\r\n {\r\n if (isAnalysis) setAnalysesTab(element);\r\n }}\r\n classes={{\r\n iconWrapper: isAnalysis ? \"tab-label-icon\" : \"\",\r\n labelIcon: isAnalysis ? \"tab-label-icon-container\" : \"\"\r\n }}\r\n className={`tab-label ${tab.value === selectedTab ? \"selected\" : \"\"}`}\r\n key={`${tab.label}-${tab.value}`}\r\n label={getTabLabel(isAnalysis, tab.label)}\r\n wrapped\r\n />\r\n );\r\n\r\n const onChangeCalloutChecked = (checked: boolean) => {\r\n setShowContentAnalysesCalloutChecked(checked);\r\n }\r\n\r\n /**\r\n * Close call out and save show content analyses setting\r\n */\r\n const onCloseCallout = async () => {\r\n setCalloutOpen(false);\r\n\r\n // check if api call is neccessary\r\n // note: the checkbox label language is negative (\"Don't show me again\") but we save in the positive (\"settings.showCallout\")\r\n // so this check should be not equal\r\n if (currentUser.showContentAnalysesCallout !== showContentAnalysesCalloutChecked)\r\n return;\r\n\r\n let newSettings = { ...currentUser, showContentAnalysesCallout: !showContentAnalysesCalloutChecked };\r\n\r\n await saveUserSettings(newSettings);\r\n }\r\n\r\n /**\r\n * Logic to show or not show content analyses tab\r\n * - dont show on small screens because by default on small screens settings pannel is closed\r\n * - dont show if user has previously checked \"Dont show again\"\r\n * @returns true to show callout false otherwise\r\n */\r\n const showCallout = (): boolean => calloutOpen && currentUser.showContentAnalysesCallout && !isSmallAndSmaller;\r\n\r\n return (\r\n \r\n {/* progress bar and checklist */}\r\n
    \r\n
    \r\n \r\n
    \r\n {validationChecks.checks.map(({ skip, key, isValid, description }) => {\r\n let listItem: JSX.Element;\r\n if (skip)\r\n listItem = ;\r\n else\r\n listItem = (\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    {description}
    \r\n
    \r\n );\r\n\r\n return listItem;\r\n })}\r\n
    \r\n
    \r\n
    \r\n {/* tabs */}\r\n \r\n \r\n {TABS.map((tab: ITab) => getTab(tab.value === CONTENT_ANALYSES, tab))}\r\n \r\n \r\n \r\n \r\n \r\n {showCallout() &&\r\n }\r\n \r\n );\r\n}\r\n\r\nexport default PostSettingsPanel;\r\n","import React, { useEffect } from \"react\";\r\n\r\nimport FilledInput from \"../forms/inputs/filledInput\";\r\nimport Bodyv2 from \"./bodyv2\";\r\nimport { DEFAULT_TRANSLATABLE_CONTENT, TranslatableContent } from \"./models\";\r\nimport { ICustomCssModelv1 } from \"api/files\";\r\nimport { PromptTypeEnum } from \"modules/smartContent/models\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\ninterface ITranslatableContentProps {\r\n translation: TranslatableContent;\r\n highlightedText?: string;\r\n activeLcid?: string;\r\n fetchingAnalyses?: boolean;\r\n customCss?: ICustomCssModelv1;\r\n smartContentSuggestion: string;\r\n showSCDropdownButton?: boolean;\r\n onBodyFocus?: () => void;\r\n onFullscreen?: () => void;\r\n onChangeBody: (newBody: string) => void;\r\n onChangeTitle: (newTitle: string) => void;\r\n onChangeSummary: (newSummary: string) => void;\r\n onShowSmartContentInsert: (highlightedText: string, promptType: PromptTypeEnum) => void;\r\n clearSmartContentSuggestion?: () => void;\r\n generateAndOpenSmartContent?: (promptTypeForGeneration: PromptTypeEnum, promptTypeForInsert: PromptTypeEnum, body?: string) => void;\r\n}\r\n\r\ninterface TextPostContent {\r\n oldTitle: string,\r\n oldSummary: string\r\n}\r\n\r\nconst defaultContentText : TextPostContent = {\r\n oldTitle:\"\",\r\n oldSummary: \"\"\r\n}\r\n\r\n/**\r\n * Form for translatable content\r\n * - this is a authoring v2 component\r\n */\r\nconst TranslatableContentEditor: React.FunctionComponent = ({\r\n translation = DEFAULT_TRANSLATABLE_CONTENT,\r\n highlightedText = \"\",\r\n activeLcid,\r\n fetchingAnalyses = false,\r\n customCss,\r\n smartContentSuggestion,\r\n onBodyFocus,\r\n onFullscreen,\r\n onChangeBody,\r\n onChangeSummary,\r\n onChangeTitle,\r\n onShowSmartContentInsert,\r\n clearSmartContentSuggestion,\r\n generateAndOpenSmartContent\r\n}) => {\r\n // destructure values\r\n const { body, title, description } = translation;\r\n\r\n const changedSinceSaved = useSelector((state: GlobalApplicationState) => state.posts.editor.changedSinceSaved);\r\n\r\n const [contentText, setContentText] = React.useState(defaultContentText);\r\n const [titleHasAnyValue, setTitleHasAnyValue] = React.useState(title.length <= 0);\r\n const [summaryHasAnyValue, setSummaryHasAnyValue] = React.useState(description.length <= 0);\r\n\r\n //Makes sure that these values are always updated in case of a undo.\r\n useEffect(() => {\r\n setTitleHasAnyValue(title.length <= 0);\r\n setSummaryHasAnyValue(description.length <= 0);\r\n }, [title, description])\r\n\r\n /**\r\n * Grab title change and pass to parent change handler\r\n */\r\n const onBlurTitle = (event: React.FocusEvent) => {\r\n let newTitle = event.target.value as string;\r\n if (contentText.oldTitle !== newTitle) {\r\n onChangeTitle(newTitle);\r\n }\r\n }\r\n\r\n /**\r\n * Grab summary change and pass to parent change handler\r\n */\r\n const onBlurSummary = (event: React.FocusEvent) => {\r\n const newSummary = event.target.value as string;\r\n if (contentText.oldSummary !== newSummary) {\r\n onChangeSummary(newSummary)\r\n }\r\n }\r\n\r\n /**\r\n * Tracks the original value written in title textfield\r\n */\r\n const onFocusTitle = (event: React.FocusEvent) => {\r\n let oldTitle = event.target.value;\r\n setContentText({...contentText, oldTitle})\r\n }\r\n\r\n /**\r\n * Tracks the original value written in summary textfield\r\n */\r\n const onFocusSummary = (event: React.FocusEvent) => {\r\n let oldSummary = event.target.value;\r\n setContentText({...contentText, oldSummary})\r\n }\r\n\r\n /**\r\n * Updates the Save As Draft button availability if it's the first time entering text in a field.\r\n */\r\n const onKeyPressCheck = (currentValue: string, onChange: (newValue: string) => void) => {\r\n if(currentValue === \"\") {\r\n onChangeSummary(\"\");\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n onChangeTitle(newValue || \"\")}\r\n required\r\n value={title}\r\n characterCount\r\n maxCount={100}\r\n inputProps={{\r\n placeholder: \"Enter a title\",\r\n onFocus: onFocusTitle,\r\n onBlur: onBlurTitle,\r\n }}\r\n onKeyDown={(value) => onKeyPressCheck(value, onChangeTitle)}\r\n setMagicButtonDisabled={(disabled: boolean) => setTitleHasAnyValue(disabled)}\r\n smartContentButtonDisabled={titleHasAnyValue}\r\n promptType={PromptTypeEnum.Title}\r\n onSmartContentGenerate={generateAndOpenSmartContent}\r\n />\r\n onChangeSummary(newValue || \"\")}\r\n label={\"Summary (optional)\"}\r\n value={description}\r\n characterCount\r\n maxCount={300}\r\n inputProps={{\r\n placeholder: \"Give an overview of your post to help people quickly see what it's about.\",\r\n style: {\r\n fontSize: 16\r\n },\r\n onFocus: onFocusSummary,\r\n onBlur: onBlurSummary\r\n }}\r\n onKeyDown={(value) => onKeyPressCheck(value, onChangeSummary)}\r\n onSmartContentGenerate={generateAndOpenSmartContent}\r\n setMagicButtonDisabled={(disabled: boolean) => setSummaryHasAnyValue(disabled)}\r\n smartContentButtonDisabled={summaryHasAnyValue}\r\n promptType={PromptTypeEnum.Summarize}\r\n />\r\n \r\n \r\n )\r\n}\r\n\r\nexport default TranslatableContentEditor;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport { DEFAULT_TRANSLATABLE_CONTENT, TranslatableContent, TranslatedContent } from \"modules/common/components/authoring/models\";\r\nimport LanguageBar from \"modules/localization/components/languageBar\";\r\nimport { ILanguage } from \"modules/localization/models\";\r\nimport TranslatableContentEditor from \"modules/common/components/authoring/translatableContentEditor\";\r\nimport { lcidMappings } from \"modules/resources\";\r\nimport ConfirmDialog from \"modules/common/components/dialogs/confirmDialog\";\r\nimport TranslateContentConfirmation from \"modules/common/components/authoring/dialogs/translateContentConfirmation\";\r\nimport useTranslatedContent from \"modules/common/hooks/useTranslatedContent\";\r\nimport { ICustomCssModelv1 } from \"api/files\";\r\nimport { PromptTypeEnum } from \"modules/smartContent/models\";\r\nimport { useMediaQuery, useTheme } from \"@mui/material\";\r\n\r\nimport \"../styles/postMainPanel.sass\";\r\n\r\ninterface IPostMainPanelProps {\r\n postId?: string;\r\n translations?: TranslatedContent;\r\n availableLanguages?: ILanguage[];\r\n selectedLanguages?: ILanguage[];\r\n activeLcid: string;\r\n defaultLcid: string;\r\n lcidMappings: lcidMappings;\r\n highlightedText?: string;\r\n fullscreenEditor?: boolean;\r\n fetchingAnalyses?: boolean;\r\n smartContentEnabledForTenant?: boolean;\r\n translation: TranslatableContent\r\n customCss?: ICustomCssModelv1;\r\n smartContentSuggestion: string;\r\n turnHighlightsOff?: () => void;\r\n onBodyFocus?: () => void;\r\n onFullscreen?: () => void;\r\n onRemoveLanguage: (lcid: string) => void;\r\n onSelectLanguage: (lcid: string) => void;\r\n getDraftTranslation: (id: string, content: TranslatableContent, outputLCID: string) => Promise;\r\n onChangeBody: (newBody: string) => void;\r\n onChangeTitle: (newTitle: string) => void;\r\n onChangeSummary: (newSummary: string) => void;\r\n onChangeTranslatedContent: (newValue: TranslatedContent) => void;\r\n onShowSmartContentInsert: (highlightedText: string, promptType: PromptTypeEnum) => void;\r\n clearSmartContentSuggestion?: () => void;\r\n generateAndOpenSmartContent?: (promptTypeForGeneration: PromptTypeEnum, promptTypeForInsert: PromptTypeEnum, body?: string) => void;\r\n}\r\n\r\nconst CONFIRM_REPLACE_TRANSLATION = {\r\n text:
    Are you sure you want to replace the existing content?
    ,\r\n title: \"Replace content\",\r\n};\r\n\r\n/**\r\n * The post content editor panel\r\n * - language selector\r\n * - TranslatableContent editor\r\n * - this is an authoring v2 component\r\n */\r\nconst PostMainPanel: React.FunctionComponent = ({\r\n translations,\r\n postId,\r\n availableLanguages,\r\n selectedLanguages,\r\n activeLcid,\r\n defaultLcid,\r\n highlightedText,\r\n lcidMappings,\r\n fetchingAnalyses = false,\r\n translation,\r\n customCss,\r\n smartContentSuggestion,\r\n smartContentEnabledForTenant,\r\n onBodyFocus,\r\n onFullscreen,\r\n turnHighlightsOff,\r\n onRemoveLanguage,\r\n onSelectLanguage,\r\n getDraftTranslation,\r\n onChangeTranslatedContent,\r\n onChangeBody,\r\n onChangeSummary,\r\n onChangeTitle,\r\n onShowSmartContentInsert,\r\n clearSmartContentSuggestion,\r\n generateAndOpenSmartContent\r\n}) => {\r\n const [translatableLanguagesWithText, setTranslatableLanguagesWithText] = useState([]);\r\n const [checkIfAnyTranslatableContent, setCheckIfAnyTranslatableContent] = useState(false);\r\n const emptyTranslatedContent:TranslatedContent = ({[defaultLcid]: {body: \"\", title: \"\", description: \"\"}});\r\n const theme = useTheme();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down('md'));\r\n\r\n useEffect(() => {\r\n function setLanguageTranslationAvailability() {\r\n let currentAvailableTranslations = { ...translations };\r\n let languagesWithText: ILanguage[] = [];\r\n let allAddedLanguages: ILanguage[] = [];\r\n\r\n Object.keys(currentAvailableTranslations).forEach((nextLanguage) => {\r\n if (availableLanguages && translations && translations[nextLanguage].body && translations[nextLanguage].title) {\r\n let matchingLang = availableLanguages.find((l) => l.lcid === nextLanguage);\r\n\r\n if (matchingLang) {\r\n languagesWithText.push(matchingLang);\r\n }\r\n }\r\n if (availableLanguages && translations) {\r\n let matchingLang = availableLanguages.find((l) => l.lcid === nextLanguage);\r\n\r\n if (matchingLang) {\r\n allAddedLanguages.push(matchingLang);\r\n }\r\n }\r\n });\r\n\r\n if (languagesWithText.length >= 1 && allAddedLanguages.length > 1) {\r\n setCheckIfAnyTranslatableContent(false);\r\n } else {\r\n setCheckIfAnyTranslatableContent(true);\r\n }\r\n\r\n setTranslatableLanguagesWithText(languagesWithText);\r\n }\r\n\r\n setLanguageTranslationAvailability();\r\n }, [translations, availableLanguages]);\r\n\r\n const translationHasContent = (lcid: string) =>\r\n translations &&\r\n translations[lcid] &&\r\n (Boolean(translations[lcid].title) || Boolean(translations[lcid].body) || Boolean(translations[lcid].description));\r\n\r\n /**\r\n * Handle translate click\r\n * - show dialog if translate will replace content\r\n */\r\n const onTranslate = async (inputLanguage: string) => {\r\n if (!translations || !inputLanguage) return;\r\n\r\n let translate = true;\r\n const ouputLanguage = availableLanguages?.find((language: ILanguage) => language.lcid === activeLcid);\r\n\r\n // show confirm dialog\r\n if (translationHasContent(activeLcid)) translate = await confirm.show(CONFIRM_REPLACE_TRANSLATION);\r\n\r\n // do the translation and update state\r\n if (translate && ouputLanguage) {\r\n // TODO: what is this id?\r\n const translation = await getDraftTranslation(\r\n postId || \"00000000-0000-7368-6172-65706f696e74\",\r\n translations[inputLanguage],\r\n ouputLanguage.translateAs\r\n );\r\n\r\n let newTranslations = { ...translations };\r\n newTranslations[activeLcid] = {\r\n ...translation,\r\n body: `

    [${lcidMappings[activeLcid].autoTranslateText}]

    ${translation.body}`,\r\n };\r\n\r\n onChangeTranslatedContent(newTranslations);\r\n }\r\n };\r\n\r\n const {\r\n showTranslationDialog,\r\n removeLanguage,\r\n onRemoveTranslation,\r\n setRemoveLanguage,\r\n onSelectTranslation,\r\n onShowTranslationDialog,\r\n onCloseTranslationDialog,\r\n onConfirmDialog,\r\n onConfirmRemoveLanguage\r\n } = useTranslatedContent({\r\n translations: translations ?? emptyTranslatedContent, \r\n defaultContent: DEFAULT_TRANSLATABLE_CONTENT,\r\n onChangeTranslatedContent: onChangeTranslatedContent,\r\n translationHasContent: translationHasContent,\r\n onTranslate: onTranslate,\r\n onSelectLanguage: onSelectLanguage,\r\n onRemoveLanguage: onRemoveLanguage\r\n });\r\n\r\n return (\r\n <>\r\n
    \r\n ({ key: lang.lcid, value: lang.language })) || []}\r\n activeLcid={activeLcid}\r\n defaultLcid={defaultLcid}\r\n selectedLanguages={selectedLanguages || []}\r\n onAddLanguage={onSelectTranslation}\r\n onRemoveLanguage={onRemoveTranslation}\r\n onSelectLanguage={onSelectTranslation}\r\n onTranslate={onShowTranslationDialog}\r\n anyAvailableTranslationsCheck={checkIfAnyTranslatableContent}\r\n hide={availableLanguages?.length === 1}\r\n onOpen={() => {\r\n if (turnHighlightsOff) turnHighlightsOff();\r\n }}\r\n />\r\n \r\n
    \r\n {showTranslationDialog && (\r\n \r\n )}\r\n {removeLanguage && (\r\n setRemoveLanguage(undefined)}\r\n onConfirm={() => setRemoveLanguage(undefined)} // KEEP\r\n onDeny={() => onConfirmRemoveLanguage()}\r\n >\r\n
    \r\n You have content on this language. Removing the language will clear the translated work you've done.\r\n
    \r\n
    \r\n Do you want to continue?\r\n
    \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default PostMainPanel;\r\n","import React, { useRef, useState } from \"react\";\r\n\r\nimport { Button, Checkbox, Fab, FormControlLabel } from \"@mui/material\";\r\nimport FiberManualRecordIcon from '@mui/icons-material/FiberManualRecord';\r\n\r\nimport Callout from \"modules/common/components/callout\";\r\nimport MagicIcon from \"../common/magicIcon\";\r\n\r\ninterface ISmartContentPaperFabProps {\r\n onClick: () => void;\r\n fabStyle?: React.CSSProperties;\r\n fabClassName?: string;\r\n calloutOpen?: boolean;\r\n onClose?: (skipCallouts: boolean) => void;\r\n callout: boolean; // enable/disable showing callout at all\r\n indicator?: boolean;\r\n setCalloutOpen: (value: boolean) => void;\r\n}\r\n\r\nconst SmartContentPaperFab: React.FunctionComponent = ({\r\n onClick,\r\n fabStyle,\r\n fabClassName,\r\n calloutOpen,\r\n onClose,\r\n callout = true,\r\n indicator = false,\r\n setCalloutOpen\r\n}) => {\r\n const anchorEl = useRef(null);\r\n\r\n const [skipCallouts, setSkipCallouts] = useState(!callout);\r\n\r\n return (\r\n <>\r\n (anchorEl.current = button)}\r\n id=\"smart-post-authoring-fab\"\r\n className={fabClassName}\r\n onClick={onClick}\r\n style={{\r\n backgroundColor: \"#3b78ab\",\r\n ...fabStyle,\r\n }}\r\n >\r\n \r\n {indicator && (\r\n \r\n )}\r\n \r\n {callout && calloutOpen && (\r\n \r\n

    Writer’s block? Get some ideas for a new post using our new Smart Content AI tool!

    \r\n setSkipCallouts(checked)}\r\n checked={skipCallouts}\r\n size=\"small\"\r\n color=\"primary\"\r\n />\r\n }\r\n />\r\n {\r\n if (onClose) onClose(skipCallouts);\r\n }}\r\n >\r\n Close\r\n \r\n \r\n )}\r\n \r\n );\r\n}\r\n\r\nexport { SmartContentPaperFab };\r\n","import React from \"react\";\r\n\r\nimport { Paper, Slide, useMediaQuery, useTheme } from \"@mui/material\";\r\n\r\nimport \"./styles/smartContentPaper.sass\";\r\nimport \"/images/icons/generate_ideas.svg\";\r\n\r\ninterface ISmartContentPaperProps {\r\n open: boolean;\r\n id: string;\r\n}\r\n\r\nconst SmartContentPaper: React.FunctionComponent = ({\r\n open,\r\n children,\r\n id,\r\n}) => {\r\n const theme = useTheme();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down('sm'));\r\n\r\n const getContainerStyle = (): React.CSSProperties => {\r\n let style: React.CSSProperties = { position: \"absolute\", right: 56 };\r\n\r\n if (isSmallAndSmaller)\r\n style = {\r\n ...style,\r\n right: 0,\r\n marginTop: 0,\r\n };\r\n\r\n return style;\r\n }\r\n\r\n return (\r\n
    \r\n \r\n
    \r\n \r\n {children}\r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport { SmartContentPaper };\r\n","import React from \"react\";\r\n\r\nimport ConditionalWrapper from \"../components/conditionalWrapper\";\r\nimport { Collapse, Fade, Grow, Slide, Zoom } from \"@mui/material\";\r\n\r\nimport \"./tileButton.sass\";\r\n\r\nexport interface ITileButton {\r\n label: string;\r\n labelIcon: JSX.Element;\r\n onClick: () => void;\r\n id: string;\r\n transition?: \"zoom\" | \"grow\" | \"slide\" | \"fade\" | \"collapse\";\r\n delay?: number;\r\n style?: React.CSSProperties;\r\n className?: string;\r\n}\r\n\r\ninterface ITileButtonProps {\r\n button: ITileButton;\r\n}\r\n\r\nconst TileButton: React.FunctionComponent = ({\r\n button: {\r\n transition,\r\n label,\r\n labelIcon,\r\n delay,\r\n id,\r\n style,\r\n className,\r\n onClick\r\n },\r\n}) => {\r\n /**\r\n * Decide which transition wrapper to use\r\n * @param children\r\n */\r\n const getTransition = (children: React.ReactElement): JSX.Element => {\r\n let props = { style: { transitionDelay: `${delay}ms` }, in: true, unmountOnExit: true };\r\n let wrapper = <>;\r\n\r\n switch (transition) {\r\n case \"collapse\":\r\n wrapper = {children}\r\n break;\r\n case \"fade\":\r\n wrapper = {children}\r\n break;\r\n case \"grow\":\r\n wrapper = {children}\r\n break;\r\n case \"slide\":\r\n wrapper = {children}\r\n break;\r\n case \"zoom\":\r\n wrapper = {children}\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * Outer conditional handles the optional wrapper prop\r\n */\r\n return (\r\n getTransition(children)}\r\n >\r\n {/* extra div here so transitions don't clash */}\r\n
    \r\n
    \r\n
    \r\n {labelIcon}\r\n
    \r\n {label}\r\n
    \r\n
    \r\n
    \r\n \r\n );\r\n}\r\n\r\ninterface ITileButtonFlexContainerProps {\r\n buttons: ITileButton[];\r\n delay?: number;\r\n}\r\n\r\nconst TileButtonFlexContainer: React.FunctionComponent = ({\r\n buttons,\r\n delay = 400,\r\n}) => {\r\n return (\r\n
    \r\n {buttons.map((button: ITileButton, idx: number) => {\r\n return ;\r\n })}\r\n
    \r\n );\r\n}\r\n\r\nexport { TileButton, TileButtonFlexContainer };\r\n","import React from \"react\";\r\n\r\ninterface ISmartContentFooterProps {\r\n}\r\n\r\nconst SmartContentFooter: React.FunctionComponent = ({\r\n children,\r\n}) => {\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nexport { SmartContentFooter };\r\n","import React from \"react\";\r\n\r\nimport { IconButton, Link, SvgIcon } from \"@mui/material\";\r\nimport { ITileButton, TileButtonFlexContainer } from \"modules/common/buttons/tileButton\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew';\r\nimport { SmartContentFooter } from \"./smartContentFooter\";\r\n\r\ninterface ISmartContentHomeProps {\r\n onClose: () => void;\r\n onOpenReadabilitySettings: () => void;\r\n buttons: ITileButton[];\r\n}\r\n\r\nconst SmartContentHome: React.FunctionComponent = ({\r\n onClose,\r\n onOpenReadabilitySettings,\r\n buttons\r\n}) => {\r\n return (\r\n <>\r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n

    \r\n Welcome to Smart Content!\r\n

    \r\n

    \r\n Smart Content uses AI to help you create and optimize your content.\r\n
    \r\n
    \r\n\r\n Generate ideas, titles, summaries, or complete articles based on topics and keywords. Sparrow’s AI companion utilizes your analytics to match tone, voice and create engaging content for your organization.\r\n
    \r\n \r\n Learn more about Smart Content.\r\n \r\n
    \r\n
    \r\n Let's start with one of the tools below\r\n

    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n \r\n Open Readability Settings\r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport { SmartContentHome };\r\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\n\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport copy from \"copy-to-clipboard\";\r\n\r\nimport { SmartContentPaper } from \"../../../../smartContent/smartContentPaper\";\r\nimport { POST_SMART_CONTENT_TILE_BUTTON_IDX, PostSmartContentHome } from \"./postSmartContentHome\";\r\nimport { TranslatableContent } from \"modules/common/components/authoring/models\";\r\nimport { IBaseSmartContentPageProps, IGPTChoice, IGenerateContentRequest, IGenerateContentResponse, ISuggestion, PromptTypeEnum } from \"modules/smartContent/models\";\r\nimport { cognitiveServicesApi } from \"api/instances\";\r\nimport useIsMounted from \"modules/common/hooks/useIsMounted\";\r\nimport { PostSmartContentKeywords } from \"./postSmartContentKeywords\";\r\nimport { useReadabilitySettings } from \"modules/common/hooks/data/useReadabilitySettings\";\r\nimport { SmartContentTitles } from \"modules/smartContent/smartContentTitles\";\r\nimport SnackbarWrapper from \"modules/common/components/snackbars/snackbarWrapper\";\r\nimport { PostSmartContentIdeas } from \"./postSmartContentIdeas\";\r\nimport { SmartContentSummaries } from \"modules/smartContent/smartContentSummaries\";\r\nimport { SmartContentDraftPage } from \"modules/smartContent/smartContentDraftPage\";\r\nimport ConfirmDialog from \"modules/common/components/dialogs/confirmDialog\";\r\nimport SuccessSnackbar from \"modules/common/components/snackbars/successSnackbar\";\r\n\r\nimport \"../styles/postSmartContent.sass\";\r\nimport { ReadabilitySettingsDialog } from \"modules/settings/components/content/readability/readabilitySettingsDialog\";\r\nimport usePrevious from \"modules/common/hooks/usePrevious\";\r\nimport { SmartContentGeneric } from \"modules/smartContent/smartContentGeneric\";\r\n\r\ninterface IPostSmartContentPanelProps {\r\n open: boolean;\r\n activeTranslation?: TranslatableContent;\r\n indicatorOn?: boolean;\r\n usedTinyMceDropDown?: boolean;\r\n typeOfPrompt?: PromptTypeEnum;\r\n highlightedText?: string;\r\n keywords: string | undefined;\r\n setKeywords: (keywords: string | undefined) => void;\r\n onClose: () => void;\r\n onChangeTitle: (newTitle: string) => void;\r\n onChangeBody: (newBody: string) => void;\r\n onChangeSummary: (newSummary: string) => void;\r\n applySmartContentSuggestion: (suggestion: string) => void;\r\n}\r\n\r\nexport enum POST_SMART_CONTENT_PAGES {\r\n HOME,\r\n KEYWORDS,\r\n IDEAS_LIST,\r\n TITLES_LIST,\r\n SUMMARIES_LIST,\r\n BODY_LIST,\r\n //Generic pages below\r\n REWRITE_LIST,\r\n FRIENDLY_LIST,\r\n PROFESSIONAL_LIST,\r\n WITTY_LIST,\r\n HEARTFELT_LIST,\r\n EDUCATIONAL_LIST,\r\n GENDERNEUTRAL_LIST,\r\n SHORTEN_LIST,\r\n EXPAND_LIST,\r\n TEST_LIST,\r\n}\r\n\r\nconst NO_PREFERENCE = \"no preference\";\r\n\r\n/**\r\n * Post smart content\r\n * - TODO: depending on how smart content looks for events move this to a common place and remove post specific language\r\n */\r\nconst PostSmartContentPanel: React.FunctionComponent = ({\r\n open,\r\n activeTranslation,\r\n indicatorOn = false,\r\n usedTinyMceDropDown = false,\r\n typeOfPrompt,\r\n highlightedText = \"\",\r\n keywords,\r\n setKeywords,\r\n onClose,\r\n onChangeBody,\r\n onChangeSummary,\r\n onChangeTitle,\r\n applySmartContentSuggestion\r\n}) => {\r\n const hasBeenOpen = useRef(false);\r\n const isMounted = useIsMounted();\r\n const {\r\n options: readabilityOptions,\r\n settings: readabilitySettings,\r\n onChange: onChangeReadabilitySettings,\r\n resetToDefault: resetReadabilitySettings,\r\n defaults: defaultReadabilitySettings,\r\n } = useReadabilitySettings();\r\n\r\n const [fetching, setFetching] = useState(false);\r\n const [fetchType, setFetchType] = useState<\"full\" | \"more\" | undefined>();\r\n const [currentPage, setCurrentPage] = useState(POST_SMART_CONTENT_PAGES.HOME);\r\n const [highlights, setHighlights] = useState([]); // the buttons to highlight\r\n const [errorMessage, setErrorMessage] = useState();\r\n const [successMessage, setSuccessMessage] = useState();\r\n const [confirmApplyBodyDraft, setConfirmApplyBodyDraft] = useState(false);\r\n const [confirmClearBodySuggestions, setConfirmClearBodySuggestions] = useState(false);\r\n const [readabilitySettingsOpen, setReadabilitySettingsOpen] = useState(false);\r\n const previousPage = usePrevious(currentPage);\r\n\r\n // smart content states\r\n const buttonUsedToEnterFlow = useRef();\r\n const [suggestions, setSuggestions] = useState([]);\r\n const [ideas, setIdeas] = useState([]);\r\n const [titles, setTitles] = useState([]);\r\n const [bodyDrafts, setBodyDrafts] = useState([]);\r\n const [summaries, setSummaries] = useState([]);\r\n const [draftIdx, setDraftIdx] = useState(0);\r\n //Used for the tone content pages that share the same content or similar. Example: Tones, Expand, Rewrite & Shorten.\r\n const [changeToneContent, setChangeToneContent] = useState([]);\r\n const sessionId = useRef();\r\n\r\n const transitionButtonsRef = useRef(true);\r\n\r\n const currentDraft: IGPTChoice | null = useMemo(\r\n () => (draftIdx >= 0 && draftIdx < bodyDrafts.length ? bodyDrafts[draftIdx] : null),\r\n [bodyDrafts, draftIdx]\r\n );\r\n\r\n useEffect(() => {\r\n let transitionTimeout: NodeJS.Timeout | undefined;\r\n\r\n if (open) {\r\n transitionTimeout = setTimeout(() => {\r\n transitionButtonsRef.current = false;\r\n }, 1600); // 1600 ms is how long button transitions take to complete\r\n }\r\n return () => {\r\n if (transitionTimeout) clearTimeout(transitionTimeout);\r\n };\r\n }, [open]);\r\n\r\n /*\r\n * Fetch content when the type of prompt or keyword changes.\r\n */\r\n useEffect(() => {\r\n fetchContent();\r\n }, [typeOfPrompt]);\r\n\r\n /*\r\n * Fetch content, set all content to empty.\r\n */\r\n const fetchContent = async () => {\r\n if (typeOfPrompt) {\r\n setChangeToneContent([]);\r\n setTitles([]);\r\n setSummaries([]);\r\n setBodyDrafts([]);\r\n\r\n const generationFunctions = {\r\n [PromptTypeEnum.Body]: onGenerateBodyText,\r\n [PromptTypeEnum.Title]: onGenerateTitles,\r\n [PromptTypeEnum.Summarize]: onGenerateSummaries,\r\n default: () => onGenerateContent(typeOfPrompt, false),\r\n };\r\n\r\n try {\r\n const generate = await generationFunctions[typeOfPrompt] || generationFunctions.default;\r\n await generate(false);\r\n } catch (error) {\r\n // Handle error\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Handle page change if there is a prompt type in the props.\r\n */\r\n useEffect(() => {\r\n const pageKey = typeOfPrompt ? POST_SMART_CONTENT_PAGES[`${typeOfPrompt.toUpperCase()}_LIST` as keyof typeof POST_SMART_CONTENT_PAGES] : \"\";\r\n\r\n if(pageKey) {\r\n setCurrentPage(pageKey);\r\n }\r\n else {\r\n //Because the naming convention is different for the prompt name type and the page name type, we have to handle this case separately.\r\n switch(typeOfPrompt) {\r\n case PromptTypeEnum.Title:\r\n setCurrentPage(POST_SMART_CONTENT_PAGES.TITLES_LIST);\r\n break;\r\n case PromptTypeEnum.Summarize:\r\n setCurrentPage(POST_SMART_CONTENT_PAGES.SUMMARIES_LIST);\r\n break;\r\n default:\r\n setCurrentPage(POST_SMART_CONTENT_PAGES.HOME);\r\n break;\r\n }\r\n }\r\n }, [typeOfPrompt]);\r\n\r\n // handle fetch keyword suggestions\r\n // only fetch if no keywords\r\n useEffect(() => {\r\n const fetchSuggestions = async () => {\r\n setFetching(true);\r\n let newSuggestions: ISuggestion[] = [];\r\n\r\n try {\r\n newSuggestions = await cognitiveServicesApi.getSuggestions();\r\n } catch (err) {\r\n setErrorMessage(\"Something went wrong. Please try again.\");\r\n } finally {\r\n if (isMounted()) {\r\n setFetching(false);\r\n setSuggestions(newSuggestions);\r\n }\r\n }\r\n };\r\n\r\n if (!keywords) fetchSuggestions();\r\n }, [keywords, isMounted]);\r\n\r\n const { title, description, body } = activeTranslation || {};\r\n\r\n useEffect(() => {\r\n let newHighlights: POST_SMART_CONTENT_TILE_BUTTON_IDX[] = [];\r\n\r\n // first time opening\r\n if (open && !hasBeenOpen.current) {\r\n // no content, highlight generate ideas\r\n if (!title && !description && !body) {\r\n newHighlights = [POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_IDEAS];\r\n\r\n // red dot indicator on, then highlight all empty field generate buttons\r\n } else if (indicatorOn) {\r\n if (!title) newHighlights = [...newHighlights, POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_TITLES];\r\n if (!description) newHighlights = [...newHighlights, POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_SUMMARIES];\r\n if (!body) newHighlights = [...newHighlights, POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_BODY_TEXT];\r\n }\r\n }\r\n\r\n setHighlights(newHighlights);\r\n\r\n if (open) hasBeenOpen.current = true;\r\n }, [title, description, body, hasBeenOpen, open, indicatorOn]);\r\n\r\n const suggestedTextExists = useCallback((): boolean => {\r\n return (\r\n titles.length > 0 || ideas.length > 0 || summaries.length > 0 || bodyDrafts.length > 0 || (!!keywords && keywords.length > 0)\r\n );\r\n }, [titles, bodyDrafts, keywords, summaries, ideas]);\r\n\r\n /**\r\n * Handle page change\r\n */\r\n const onChangePage = (nextPage: POST_SMART_CONTENT_PAGES) => {\r\n setCurrentPage(nextPage);\r\n };\r\n\r\n /**\r\n * Whether or not to fetch content for the next page and which page to use.\r\n * @param nextPage \r\n * @param param1 \r\n * @returns \r\n */\r\n const shouldFetchContent = (nextPage, {ideas, titles, summaries, bodyDrafts, content}) => {\r\n const pageLengthMapping = {\r\n [POST_SMART_CONTENT_PAGES.IDEAS_LIST]: ideas.length,\r\n [POST_SMART_CONTENT_PAGES.TITLES_LIST]: titles.length,\r\n [POST_SMART_CONTENT_PAGES.SUMMARIES_LIST]: summaries.length,\r\n [POST_SMART_CONTENT_PAGES.BODY_LIST]: bodyDrafts.length,\r\n };\r\n \r\n //Generic pages that share the same page and content.\r\n const emptyContentPages = new Set([\r\n POST_SMART_CONTENT_PAGES.REWRITE_LIST,\r\n POST_SMART_CONTENT_PAGES.EDUCATIONAL_LIST,\r\n POST_SMART_CONTENT_PAGES.EXPAND_LIST,\r\n POST_SMART_CONTENT_PAGES.FRIENDLY_LIST,\r\n POST_SMART_CONTENT_PAGES.HEARTFELT_LIST,\r\n POST_SMART_CONTENT_PAGES.PROFESSIONAL_LIST,\r\n POST_SMART_CONTENT_PAGES.GENDERNEUTRAL_LIST,\r\n POST_SMART_CONTENT_PAGES.SHORTEN_LIST,\r\n POST_SMART_CONTENT_PAGES.WITTY_LIST,\r\n ]);\r\n \r\n //Checks if we are rendering the generic pages that share the same content (or similar), \r\n //in this case the tinymce quicklinks bar all use generic pages with a generic list.\r\n if (emptyContentPages.has(nextPage)) return content.length === 0;\r\n \r\n //Check if the page is in the mapping and if the length is 0\r\n return pageLengthMapping[nextPage] === 0;\r\n };\r\n \r\n const onClickTileButton = async (buttonClicked, nextPage) => {\r\n buttonUsedToEnterFlow.current = buttonClicked;\r\n onChangePage(nextPage);\r\n \r\n const contentState = { ideas, titles, summaries, bodyDrafts, content: changeToneContent }; \r\n const shouldFetch = shouldFetchContent(nextPage, contentState);\r\n \r\n if (shouldFetch) await onGenerate(nextPage);\r\n };\r\n\r\n /**\r\n * Helper to get the base request to send to generate content endpoint\r\n * @param promptType\r\n */\r\n const getBaseGenerateContentRequest = (promptType: PromptTypeEnum, text: string = \"\"): IGenerateContentRequest => {\r\n let result: IGenerateContentRequest = {\r\n sessionId: sessionId.current,\r\n contentType: \"post\",\r\n promptType,\r\n text: text || keywords,\r\n };\r\n\r\n // only send readability settings for bodies\r\n if (promptType === PromptTypeEnum.Body)\r\n result = {\r\n ...result,\r\n readability:\r\n readabilitySettings?.readability.toLowerCase() === NO_PREFERENCE ? undefined : readabilitySettings?.readability,\r\n tone: readabilitySettings?.tone.toLowerCase() === NO_PREFERENCE ? undefined : readabilitySettings?.tone,\r\n personalism: readabilitySettings?.personalism === NO_PREFERENCE ? undefined : readabilitySettings?.personalism,\r\n sentiment: readabilitySettings?.sentiment === NO_PREFERENCE ? undefined : readabilitySettings?.sentiment,\r\n length: readabilitySettings?.length === NO_PREFERENCE ? undefined : readabilitySettings?.length,\r\n };\r\n\r\n return result;\r\n };\r\n\r\n /**\r\n * Make api request to make content of promptType\r\n * @param promptType\r\n */\r\n const generateContent = async (\r\n promptType: PromptTypeEnum,\r\n choices: number = 5,\r\n text: string = \"\"\r\n ): Promise => {\r\n const req: IGenerateContentRequest = {\r\n ...getBaseGenerateContentRequest(promptType, text),\r\n numberOfContentToGenerate: choices,\r\n };\r\n\r\n const { data } = await cognitiveServicesApi.generateContent(req);\r\n sessionId.current = data.sessionId;\r\n\r\n return data;\r\n };\r\n\r\n const onGenerateIdeas = async (concatenate?: boolean): Promise => {\r\n setFetching(true);\r\n let newIdeas = concatenate ? [...ideas] : [];\r\n\r\n try {\r\n const res = await generateContent(PromptTypeEnum.Idea);\r\n\r\n // reset the indexs of choices so each is unique\r\n newIdeas = [...newIdeas, ...res.choices].map((choice: IGPTChoice, idx: number) => ({ ...choice, index: idx }));\r\n\r\n setIdeas(newIdeas);\r\n } catch (err) {\r\n setErrorMessage(\"Something went wrong. Please try again.\");\r\n } finally {\r\n if (isMounted()) {\r\n setIdeas(newIdeas);\r\n setFetching(false);\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Fetch some more bodies\r\n * @param concatenate - flag indicating whether or not to clear bodies first\r\n * @returns\r\n */\r\n const onGenerateBodyText = async (concatenate?: boolean, text: string = \"\"): Promise => {\r\n setFetching(true);\r\n let newBodies: IGPTChoice[] = concatenate ? [...bodyDrafts] : [];\r\n\r\n try {\r\n const res = await generateContent(PromptTypeEnum.Body, 1, text);\r\n\r\n // reset the indexs of choices so each is unique\r\n newBodies = [...newBodies, ...res.choices].map((choice: IGPTChoice, idx: number) => ({ ...choice, index: idx }));\r\n\r\n setBodyDrafts(newBodies);\r\n } catch (err) {\r\n setErrorMessage(\"Something went wrong. Please try again.\");\r\n } finally {\r\n if (isMounted()) {\r\n setBodyDrafts(newBodies);\r\n setFetching(false);\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Fetch some more summaries\r\n * @param concatenate - flag indicating whether or not to clear summaries first\r\n * @returns\r\n */\r\n const onGenerateSummaries = async (concatenate?: boolean): Promise => {\r\n setFetching(true);\r\n let newSummaries: IGPTChoice[] = concatenate ? [...summaries] : [];\r\n\r\n try {\r\n const res = await generateContent(PromptTypeEnum.Summarize);\r\n\r\n // reset the indexs of choices so each is unique\r\n newSummaries = [...newSummaries, ...res.choices].map((choice: IGPTChoice, idx: number) => ({ ...choice, index: idx }));\r\n\r\n setSummaries(newSummaries);\r\n } catch (err) {\r\n setErrorMessage(\"Something went wrong. Please try again.\");\r\n } finally {\r\n if (isMounted()) {\r\n setFetching(false);\r\n setSummaries(newSummaries);\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Fetch some more titles\r\n * @param concatenate - flag indicating whether or not to clear titles first\r\n */\r\n const onGenerateTitles = async (concatenate?: boolean): Promise => {\r\n setFetching(true);\r\n let newTitles: IGPTChoice[] = concatenate ? [...titles] : [];\r\n\r\n try {\r\n const res = await generateContent(PromptTypeEnum.Title);\r\n\r\n // reset the indexs of choices so each is unique\r\n newTitles = [...newTitles, ...res.choices].map((choice: IGPTChoice, idx: number) => ({ ...choice, index: idx }));\r\n\r\n setTitles(newTitles);\r\n } catch (err) {\r\n setErrorMessage(\"Something went wrong. Please try again.\");\r\n } finally {\r\n if (isMounted()) {\r\n setTitles(newTitles);\r\n setFetching(false);\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Fetch some more content based on the prompt type.\r\n * @param prompt - the prompt to be used to generate content.\r\n * @param concatenate - flag indicating whether or not to clear titles first\r\n */\r\n const onGenerateContent = async (prompt: PromptTypeEnum, concatenate?: boolean): Promise => {\r\n setFetching(true);\r\n let newContentChoices: IGPTChoice[] = concatenate ? [...changeToneContent] : [];\r\n\r\n try {\r\n const res = await generateContent(prompt, 1, highlightedText);\r\n\r\n // reset the indexs of choices so each is unique\r\n newContentChoices = [...newContentChoices, ...res.choices].map((choice: IGPTChoice, idx: number) => ({ ...choice, index: idx }));\r\n\r\n setChangeToneContent(newContentChoices);\r\n } catch (err) {\r\n setErrorMessage(\"Something went wrong. Please try again.\");\r\n } finally {\r\n if (isMounted()) {\r\n setChangeToneContent(newContentChoices);\r\n setFetching(false);\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Generate more suggestions of promptTypes\r\n * @param promptType\r\n */\r\n const onGenerateMore = async (promptType: PromptTypeEnum) => { \r\n // For cases that directly map to a specific function call\r\n const directMappings = {\r\n [PromptTypeEnum.Idea]: () => onGenerateIdeas(true),\r\n [PromptTypeEnum.Summarize]: () => onGenerateSummaries(true),\r\n [PromptTypeEnum.Title]: () => onGenerateTitles(true),\r\n [PromptTypeEnum.Body]: () => {\r\n const nextIndex = bodyDrafts.length; // set current draft to one about to be generated\r\n onGenerateBodyText(true);\r\n setDraftIdx(nextIndex);\r\n },\r\n };\r\n \r\n // Check if the promptType has a direct mapping and execute it\r\n if (directMappings[promptType]) {\r\n await directMappings[promptType]();\r\n } else {\r\n // For all other cases, use a generic content generation function\r\n await onGenerateContent(promptType, true);\r\n }\r\n };\r\n\r\n /**\r\n * Handle generate click from keywords page\r\n * - decide which type of content to generate\r\n * - clear its suggestions\r\n * - go its list page\r\n * - generate more suggestions\r\n * @param nextPage - override next page calculation with this param\r\n */\r\n const onGenerate = async (nextPage?: POST_SMART_CONTENT_PAGES): Promise => {\r\n let generate: (() => Promise) | undefined = undefined;\r\n\r\n switch (buttonUsedToEnterFlow.current) {\r\n case POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_BODY_TEXT:\r\n // set current draft to the one about to be generated\r\n let nextIndex = bodyDrafts.length;\r\n\r\n nextPage = nextPage || POST_SMART_CONTENT_PAGES.BODY_LIST;\r\n\r\n generate = async () => {\r\n await onGenerateBodyText(true);\r\n setDraftIdx(nextIndex);\r\n };\r\n break;\r\n case POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_IDEAS:\r\n onClearIdeaSuggestions();\r\n nextPage = nextPage || POST_SMART_CONTENT_PAGES.IDEAS_LIST;\r\n generate = onGenerateIdeas;\r\n break;\r\n case POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_SUMMARIES:\r\n onClearSummarySuggestions();\r\n nextPage = nextPage || POST_SMART_CONTENT_PAGES.SUMMARIES_LIST;\r\n generate = onGenerateSummaries;\r\n break;\r\n case POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_TITLES:\r\n onClearTitleSuggestions();\r\n nextPage = nextPage || POST_SMART_CONTENT_PAGES.TITLES_LIST;\r\n generate = onGenerateTitles;\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n if (nextPage && generate) {\r\n onChangePage(nextPage);\r\n await generate();\r\n }\r\n };\r\n\r\n const getBasePageProps = (backTo: POST_SMART_CONTENT_PAGES = POST_SMART_CONTENT_PAGES.HOME): IBaseSmartContentPageProps => ({\r\n onBack: () => { \r\n onChangePage(backTo) \r\n setKeywords(undefined);\r\n },\r\n onClose,\r\n });\r\n\r\n /**\r\n * Clears all suggested texts\r\n */\r\n const onClearSuggestedText = () => {\r\n setTitles([]);\r\n setIdeas([]);\r\n setSummaries([]);\r\n setBodyDrafts([]);\r\n setKeywords(undefined);\r\n\r\n onChangePage(POST_SMART_CONTENT_PAGES.KEYWORDS);\r\n setSuccessMessage(\"All suggested text in Smart Content were successfully cleared.\");\r\n };\r\n\r\n /**\r\n * Clear title suggestions\r\n */\r\n const onClearTitleSuggestions = () => {\r\n setTitles([]);\r\n onChangePage(POST_SMART_CONTENT_PAGES.KEYWORDS);\r\n };\r\n\r\n /**\r\n * Clear content suggestions (this is generic and can be used for any content type like expand, shorten etc.)\r\n */\r\n const onClearContentSuggestions = () => {\r\n setChangeToneContent([]);\r\n onClose();\r\n };\r\n\r\n /**\r\n * Clear idea suggestions\r\n */\r\n const onClearIdeaSuggestions = () => {\r\n setIdeas([]);\r\n onChangePage(POST_SMART_CONTENT_PAGES.KEYWORDS);\r\n };\r\n\r\n /**\r\n * Clear summary suggestions\r\n */\r\n const onClearSummarySuggestions = () => {\r\n setSummaries([]);\r\n onChangePage(POST_SMART_CONTENT_PAGES.KEYWORDS);\r\n };\r\n\r\n /**\r\n * Clear body suggestions\r\n */\r\n const onClearBodySuggestionsConfirmed = () => {\r\n setBodyDrafts([]);\r\n setDraftIdx(0);\r\n onChangePage(POST_SMART_CONTENT_PAGES.KEYWORDS);\r\n setSuccessMessage(\"All suggested bodies in Smart Content were successfully cleared.\");\r\n };\r\n\r\n /**\r\n * Handle clear body suggestions with confirm dialog\r\n */\r\n const onClearBodySuggestions = () => {\r\n setConfirmClearBodySuggestions(true);\r\n };\r\n\r\n /**\r\n * Make changes to current body draft text\r\n * @param newText\r\n */\r\n const onChangeBodyDraft = (newText: string) => {\r\n setBodyDrafts(bodyDrafts.map((draft: IGPTChoice, idx: number) => (idx === draftIdx ? { ...draft, text: newText } : { ...draft })));\r\n };\r\n\r\n const onChangeDraftIdx = (newIdx: number) => {\r\n setDraftIdx(newIdx);\r\n };\r\n\r\n /**\r\n * Handle \"GENERATE POST\" click\r\n * - generate body from idea\r\n * - set new body as current draft\r\n * - go to body list page\r\n * @param idea\r\n */\r\n const onGeneratePost = async (idea: IGPTChoice) => {\r\n setFetchType(\"full\");\r\n let newIdx = bodyDrafts.length;\r\n\r\n await onGenerateBodyText(true, idea.message.content);\r\n\r\n setDraftIdx(newIdx);\r\n\r\n onChangePage(POST_SMART_CONTENT_PAGES.BODY_LIST);\r\n setFetchType(undefined);\r\n };\r\n\r\n /**\r\n * Handle applying body draft\r\n * - check whether body has inline images or embedded media, if so show confirm dialog, else apply\r\n */\r\n const onApplyBodyDraft = () => {\r\n if (!currentDraft) return;\r\n\r\n let needToConfirm = false;\r\n\r\n if (body) {\r\n let temp = document.createElement(\"div\");\r\n temp.innerHTML = body;\r\n\r\n needToConfirm = Boolean(temp.querySelector(\"img\") || temp.querySelector(\"iframe\"));\r\n }\r\n\r\n if (needToConfirm) setConfirmApplyBodyDraft(true);\r\n else onApplyBodyDraftConfirmed();\r\n };\r\n\r\n /**\r\n * Handle body draft apply confirmed\r\n * - update post\r\n */\r\n const onApplyBodyDraftConfirmed = () => {\r\n setConfirmApplyBodyDraft(false);\r\n\r\n // gpt will give us new line characters (they actually give use \\n\\r which is windows for line break)\r\n // since tinymce is an html editor we need to convert to br tags\r\n // first, strip the \\r, then replace the \\n with
    \r\n let { message } = { ...currentDraft };\r\n let newText = message?.content;\r\n\r\n newText = newText?.replaceAll(\"\\r\", \"\");\r\n newText = newText?.replaceAll(\"\\n\", \"
    \");\r\n\r\n if (newText) {\r\n onChangeBody(newText);\r\n }\r\n };\r\n\r\n /**\r\n * Helper to get the labels for the keywords page (these change depending on the button used to enter the smart content flow)\r\n */\r\n const getKeywordsPageLabels = (): { generateLabel: string | undefined; headerTitle: string | undefined } => {\r\n let result = {} as { generateLabel: string | undefined; headerTitle: string | undefined };\r\n\r\n switch (buttonUsedToEnterFlow.current) {\r\n case POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_BODY_TEXT:\r\n result = { generateLabel: \"GENERATE POST BODY\", headerTitle: \"Suggested Post Body\" };\r\n break;\r\n case POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_IDEAS:\r\n result = { generateLabel: \"GENERATE IDEAS\", headerTitle: \"Suggested Ideas\" };\r\n break;\r\n case POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_SUMMARIES:\r\n result = { generateLabel: \"GENERATE SUMMARIES\", headerTitle: \"Suggested Summaries\" };\r\n break;\r\n case POST_SMART_CONTENT_TILE_BUTTON_IDX.GENERATE_TITLES:\r\n result = { generateLabel: \"GENERATE TITLES\", headerTitle: \"Suggested Titles\" };\r\n break;\r\n default:\r\n break;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n const createGenericSmartContentComponent = (pageTitle: string, promptTypeForPage: PromptTypeEnum) => () => (\r\n \r\n );\r\n\r\n /**\r\n * Gets the page based on the specified content pages.\r\n */\r\n const getPage = (): JSX.Element => {\r\n const baseProps = getBasePageProps();\r\n\r\n const pageComponents = {\r\n [POST_SMART_CONTENT_PAGES.HOME]: () => (\r\n setReadabilitySettingsOpen(true)}\r\n onClose={onClose}\r\n transition={transitionButtonsRef.current}\r\n highlights={highlights}\r\n keywords={keywords}\r\n onClick={onClickTileButton}\r\n />\r\n ),\r\n [POST_SMART_CONTENT_PAGES.KEYWORDS]: () => (\r\n setKeywords(newKeywords)}\r\n suggestions={suggestions}\r\n onGenerate={onGenerate}\r\n />\r\n ),\r\n [POST_SMART_CONTENT_PAGES.IDEAS_LIST]: () => (\r\n \r\n ),\r\n [POST_SMART_CONTENT_PAGES.TITLES_LIST]: () => (\r\n \r\n ),\r\n [POST_SMART_CONTENT_PAGES.SUMMARIES_LIST]: () => (\r\n \r\n ),\r\n [POST_SMART_CONTENT_PAGES.BODY_LIST]: () => (\r\n \r\n ),\r\n [POST_SMART_CONTENT_PAGES.REWRITE_LIST]: createGenericSmartContentComponent(\"Rewrite\", PromptTypeEnum.Rewrite),\r\n [POST_SMART_CONTENT_PAGES.FRIENDLY_LIST]: createGenericSmartContentComponent(\"Change to Friendly Tone\", PromptTypeEnum.Friendly),\r\n [POST_SMART_CONTENT_PAGES.SHORTEN_LIST]: createGenericSmartContentComponent(\"Shorten\", PromptTypeEnum.Shorten),\r\n [POST_SMART_CONTENT_PAGES.EXPAND_LIST]: createGenericSmartContentComponent(\"Expand\", PromptTypeEnum.Expand),\r\n [POST_SMART_CONTENT_PAGES.EDUCATIONAL_LIST]: createGenericSmartContentComponent(\"Change to Educational Tone\", PromptTypeEnum.Educational),\r\n [POST_SMART_CONTENT_PAGES.GENDERNEUTRAL_LIST]: createGenericSmartContentComponent(\"Change to Gender Neutral Tone\", PromptTypeEnum.GenderNeutral),\r\n [POST_SMART_CONTENT_PAGES.WITTY_LIST]: createGenericSmartContentComponent(\"Change to Witty Tone\", PromptTypeEnum.Witty),\r\n [POST_SMART_CONTENT_PAGES.PROFESSIONAL_LIST]: createGenericSmartContentComponent(\"Change to Professional Tone\", PromptTypeEnum.Professional),\r\n [POST_SMART_CONTENT_PAGES.HEARTFELT_LIST]: createGenericSmartContentComponent(\"Change to Heartfelt Tone\", PromptTypeEnum.Heartfelt),\r\n };\r\n\r\n return pageComponents[currentPage] ? pageComponents[currentPage]() : <>;\r\n };\r\n\r\n return (\r\n <>\r\n \r\n {getPage()}\r\n \r\n {open && (\r\n setErrorMessage(undefined)}\r\n icon={}\r\n severity=\"error\"\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n />\r\n )}\r\n {\r\n onClearBodySuggestionsConfirmed();\r\n setConfirmClearBodySuggestions(false);\r\n onChangePage(POST_SMART_CONTENT_PAGES.KEYWORDS);\r\n }}\r\n onDeny={() => setConfirmClearBodySuggestions(false)}\r\n onClose={() => setConfirmClearBodySuggestions(false)}\r\n confirmButtonProps={{ id: \"post-smart-content-confirm-clear\", color: \"secondary\", style: { backgroundColor: \"#b72026\" } }}\r\n denyButtonProps={{ id: \"post-smart-content-deny-clear\" }}\r\n >\r\n
    \r\n
    \r\n You are about to clear all Smart Content’s suggested bodies, including any revisions you've made on the drafts. You\r\n may not be able to retrieve the same responses again.\r\n
    \r\n
    \r\n
    Do you want to proceed?
    \r\n
    \r\n \r\n setConfirmApplyBodyDraft(false)}\r\n onDeny={() => {\r\n if (currentDraft) copy(currentDraft.message.content, { format: \"text/plain\" });\r\n\r\n setConfirmApplyBodyDraft(false);\r\n }}\r\n >\r\n
    \r\n
    \r\n Applying the suggested draft will clear all the text in your current post body, including the images or videos\r\n attached.\r\n
    \r\n
    \r\n
    Do you want to proceed?
    \r\n
    \r\n \r\n setSuccessMessage(\"\")} />\r\n setReadabilitySettingsOpen(false)}\r\n onChangeReadabilitySettings={onChangeReadabilitySettings}\r\n defaultReadabilitySettings={defaultReadabilitySettings}\r\n readabilityOptions={readabilityOptions}\r\n readabilitySettings={readabilitySettings}\r\n resetReadabilitySettings={resetReadabilitySettings}\r\n onClearAllSuggestedText={onClearSuggestedText}\r\n suggestedTextExists={suggestedTextExists()}\r\n />\r\n \r\n );\r\n}\r\n\r\nexport { PostSmartContentPanel };\r\n","import React from \"react\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport ArrowBackIcon from \"@mui/icons-material/ArrowBack\";\r\nimport { IconButton } from \"@mui/material\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport AutorenewIcon from \"@mui/icons-material/Autorenew\";\r\n\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport { PromptTypeEnum } from \"./models\";\r\n\r\ninterface ISmartContentSuggestedHeaderProps {\r\n title: string;\r\n fetching?: boolean;\r\n promptType?: PromptTypeEnum;\r\n usedTinymceDropDown?: boolean;\r\n onTrash?: () => void; // funciton/flag to enable clear action\r\n onGenerateMore?: (promptType: PromptTypeEnum) => Promise; \r\n onClose: () => void;\r\n onBack: () => void;\r\n}\r\n\r\nconst SmartContentSuggestedHeader: React.FunctionComponent = ({\r\n title,\r\n fetching,\r\n promptType,\r\n usedTinymceDropDown,\r\n onTrash,\r\n onGenerateMore,\r\n onClose,\r\n onBack,\r\n}) => {\r\n return (\r\n \r\n {usedTinymceDropDown ? (\r\n
    \r\n {title}\r\n
    \r\n ) : (\r\n
    \r\n \r\n \r\n \r\n }\r\n >\r\n Back to Smart Content menu\r\n \r\n {title}\r\n
    \r\n )}\r\n
    \r\n {!usedTinymceDropDown && (\r\n <>\r\n {onTrash && (\r\n \r\n \r\n \r\n }\r\n >\r\n Clear all suggestions\r\n \r\n )}\r\n {onGenerateMore && promptType && (\r\n await onGenerateMore(promptType)}\r\n >\r\n \r\n \r\n }\r\n >\r\n Generate more\r\n \r\n )}\r\n \r\n )}\r\n \r\n \r\n \r\n
    \r\n \r\n );\r\n};\r\n\r\nexport { SmartContentSuggestedHeader };\r\n","import React from \"react\";\r\nimport { Button, IconButton } from \"@mui/material\";\r\nimport FileCopyOutlinedIcon from '@mui/icons-material/FileCopyOutlined';\r\nimport copy from \"copy-to-clipboard\";\r\n\r\nimport { ISuggestion } from \"./models\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\n\r\ninterface ISmartContentSuggestionProps {\r\n suggestion: ISuggestion;\r\n confirmLabel: string;\r\n copyToClipboard?: boolean;\r\n confirmPosition?: \"inline\" | \"block\"\r\n onConfirm: (suggestion: ISuggestion) => void;\r\n}\r\n\r\nconst SmartContentSuggestion: React.FunctionComponent = ({\r\n suggestion,\r\n confirmLabel,\r\n copyToClipboard = false,\r\n confirmPosition = \"block\",\r\n onConfirm,\r\n}) => {\r\n const onClick = (event: React.MouseEvent) => {\r\n onConfirm(suggestion);\r\n }\r\n\r\n const isInline = confirmPosition === \"inline\";\r\n return (\r\n \r\n
    \r\n

    {suggestion.suggestion}

    \r\n {copyToClipboard &&\r\n { copy(suggestion.suggestion, { format: \"text/plain\" }); }}>\r\n \r\n }>\r\n Copy text\r\n }\r\n {isInline &&\r\n }\r\n
    \r\n {!isInline &&\r\n
    \r\n \r\n {confirmLabel}\r\n \r\n
    }\r\n \r\n )\r\n}\r\n\r\nexport { SmartContentSuggestion };\r\n","import React from \"react\";\r\n\r\nimport { IBaseSmartContentPageProps, ISuggestion } from \"modules/smartContent/models\";\r\nimport { SmartContentSuggestedHeader } from \"modules/smartContent/smartContentSuggestedHeader\";\r\nimport { Button, TextField } from \"@mui/material\";\r\nimport { SmartContentSuggestion } from \"modules/smartContent/smartContentSuggestion\";\r\nimport { SmartContentFooter } from \"modules/smartContent/smartContentFooter\";\r\nimport { POST_SMART_CONTENT_PAGES } from \"./postSmartContentPanel\";\r\n\r\nimport \"../styles/postSmartContentKeywords.sass\";\r\n\r\ninterface IPostSmartContentKeywordsProps extends IBaseSmartContentPageProps {\r\n suggestions: ISuggestion[];\r\n keywords: string;\r\n generateLabel?: string;\r\n headerTitle?: string;\r\n previousPage: POST_SMART_CONTENT_PAGES;\r\n setCurrentPage: (newPage: POST_SMART_CONTENT_PAGES) => void;\r\n onGenerate: () => Promise;\r\n onChangeKeywords: (newKeywords: string) => void;\r\n}\r\n\r\n/**\r\n * Keywords/topics suggestion page\r\n * - TODO: depending on how smart content looks for events move this to a common place and remove post specific language\r\n */\r\nconst PostSmartContentKeywords: React.FunctionComponent = ({\r\n suggestions,\r\n keywords,\r\n generateLabel = \"GENERATE\",\r\n headerTitle = \"Suggested Keywords\",\r\n previousPage,\r\n setCurrentPage,\r\n onChangeKeywords,\r\n onBack,\r\n onClose,\r\n onGenerate,\r\n}) => {\r\n // show cancel button when got here from the list page\r\n // cancel button will take user back to list page instead of home like the back button\r\n // NOTE: Consider this when adding/removing pages\r\n const cancelable = previousPage !== POST_SMART_CONTENT_PAGES.HOME &&\r\n previousPage !== POST_SMART_CONTENT_PAGES.KEYWORDS;\r\n\r\n const onChange = (event: React.ChangeEvent) => {\r\n onChangeKeywords(event.currentTarget.value);\r\n }\r\n\r\n return (\r\n <>\r\n
    \r\n \r\n
    \r\n

    Do you have a topic or keywords in mind?

    \r\n \r\n

    Suggestions

    \r\n
    \r\n {suggestions.map((suggestion: ISuggestion) =>\r\n onChangeKeywords(newKeywordSuggestion.suggestion)}\r\n suggestion={suggestion}\r\n confirmPosition=\"block\"\r\n />)}\r\n
    \r\n
    \r\n
    \r\n \r\n
    \r\n {cancelable &&\r\n setCurrentPage(previousPage)}\r\n >\r\n CANCEL\r\n }\r\n await onGenerate()}\r\n >\r\n {generateLabel}\r\n \r\n
    \r\n
    \r\n \r\n );\r\n}\r\n\r\nexport { PostSmartContentKeywords };\r\n","import React from \"react\";\r\n\r\nimport { Button } from \"@mui/material\";\r\nimport InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';\r\n\r\nimport { SmartContentSuggestedHeader } from \"./smartContentSuggestedHeader\";\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { IBaseSmartContentPageProps, PromptTypeEnum } from \"./models\";\r\nimport { POST_SMART_CONTENT_PAGES } from \"modules/posts/components/post-creation/smartContent/postSmartContentPanel\";\r\nimport { POST_SMART_CONTENT_TILE_BUTTON_IDX } from \"modules/posts/components/post-creation/smartContent/postSmartContentHome\";\r\nimport { SmartContentFooter } from \"./smartContentFooter\";\r\n\r\nexport interface ISmartContentListPageProps extends IBaseSmartContentPageProps {\r\n id?: string;\r\n contentId?: string;\r\n title: string;\r\n usedTinyMceDropDown?: boolean;\r\n fetching?: boolean;\r\n fetchType?: \"full\" | \"more\"; // controls where the spinner goes, more = at the end of list, full = list disappears\r\n disclaimerText?: string;\r\n enableGenerateMoreListButton?: boolean; // flag whether to add generate more at bottom of list\r\n contentStyle?: React.CSSProperties;\r\n promptType: PromptTypeEnum;\r\n onChangePage: (newPage: POST_SMART_CONTENT_PAGES, concatenate?: boolean, button?: POST_SMART_CONTENT_TILE_BUTTON_IDX) => void;\r\n onGenerateMore: (promptType: PromptTypeEnum) => Promise;\r\n onTrash: () => void;\r\n}\r\n\r\nconst SmartContentListPage: React.FunctionComponent = ({\r\n id,\r\n contentId,\r\n fetching,\r\n title,\r\n children,\r\n enableGenerateMoreListButton = false,\r\n usedTinyMceDropDown,\r\n contentStyle,\r\n disclaimerText,\r\n promptType,\r\n fetchType = \"more\",\r\n onChangePage,\r\n onGenerateMore,\r\n onTrash,\r\n ...restProps\r\n}) => {\r\n return (\r\n <>\r\n
    \r\n \r\n
    \r\n <>\r\n
    \r\n {disclaimerText && }\r\n text={disclaimerText}\r\n />}\r\n {fetching && fetchType === \"full\"\r\n ? \r\n : <>{children}}\r\n {enableGenerateMoreListButton &&\r\n
    \r\n {fetching\r\n ? <>{fetchType === \"more\" && }\r\n :\r\n await onGenerateMore(promptType)}\r\n >\r\n GENERATE MORE\r\n \r\n }\r\n
    }\r\n
    \r\n \r\n
    \r\n
    \r\n {!usedTinyMceDropDown &&\r\n \r\n onChangePage(POST_SMART_CONTENT_PAGES.KEYWORDS)}\r\n style={{\r\n fontWeight: \"normal\",\r\n textTransform: \"none\",\r\n textDecoration: \"underline\"\r\n }}\r\n href=\"\"\r\n >\r\n Edit keywords\r\n \r\n \r\n }\r\n \r\n );\r\n}\r\n\r\nexport { SmartContentListPage };\r\n","import React from \"react\";\r\n\r\nimport { IGPTChoice, PromptTypeEnum } from \"./models\";\r\nimport { SmartContentSuggestion } from \"./smartContentSuggestion\";\r\nimport { ISmartContentListPageProps, SmartContentListPage } from \"./smartContentListPage\";\r\n\r\ninterface ISmartContentTitles extends ISmartContentListPageProps {\r\n titles: IGPTChoice[];\r\n onApplyTitle: (newTitle: string) => void;\r\n}\r\n\r\nconst SmartContentTitles: React.FunctionComponent = ({\r\n titles,\r\n onApplyTitle,\r\n ...props\r\n}) => {\r\n // before passing to propped function, scroll to bottom of list so spinner shows\r\n const onGenerateMoreHandler = async (promptType: PromptTypeEnum): Promise => {\r\n const element = document.getElementById(\"smart-content-titles-list\");\r\n if (element)\r\n element.scroll({ top: element.scrollHeight, behavior: \"smooth\" });\r\n\r\n await props.onGenerateMore(promptType);\r\n }\r\n\r\n return (\r\n \r\n {titles.map(({ index, message: { content } }: IGPTChoice) =>\r\n onApplyTitle(content)}\r\n suggestion={{ suggestion: content, suggestionId: index.toString() }}\r\n confirmLabel=\"APPLY\"\r\n confirmPosition=\"inline\"\r\n />)}\r\n \r\n );\r\n}\r\n\r\nexport { SmartContentTitles };\r\n","import React from \"react\";\r\n\r\nimport { IGPTChoice, PromptTypeEnum } from \"modules/smartContent/models\";\r\nimport { ISmartContentListPageProps, SmartContentListPage } from \"modules/smartContent/smartContentListPage\";\r\nimport { SmartContentSuggestion } from \"modules/smartContent/smartContentSuggestion\";\r\n\r\ninterface IPostSmartContentIdeasProps extends ISmartContentListPageProps {\r\n ideas: IGPTChoice[];\r\n onApplyIdea: (newIdea: IGPTChoice) => void;\r\n}\r\n\r\nconst PostSmartContentIdeas: React.FunctionComponent = ({\r\n ideas,\r\n onApplyIdea,\r\n ...props\r\n}) => {\r\n return (\r\n \r\n {ideas.map((choice: IGPTChoice) =>\r\n onApplyIdea(choice)}\r\n suggestion={{ suggestionId: choice.index.toString(), suggestion: choice.message.content }}\r\n confirmLabel=\"GENERATE POST\"\r\n confirmPosition=\"block\"\r\n />)}\r\n \r\n );\r\n}\r\n\r\nexport { PostSmartContentIdeas };\r\n","import React from \"react\";\r\n\r\nimport { IGPTChoice, PromptTypeEnum } from \"./models\";\r\nimport { SmartContentSuggestion } from \"./smartContentSuggestion\";\r\nimport { ISmartContentListPageProps, SmartContentListPage } from \"./smartContentListPage\";\r\n\r\ninterface ISmartContentSummariesProps extends ISmartContentListPageProps {\r\n summaries: IGPTChoice[];\r\n onApply: (newSummary: string) => void;\r\n}\r\n\r\nconst SmartContentSummaries: React.FunctionComponent = ({\r\n summaries,\r\n onApply,\r\n ...props\r\n}) => {\r\n // before passing to propped function, scroll to bottom of list so spinner shows\r\n const onGenerateMoreHandler = async (promptType: PromptTypeEnum): Promise => {\r\n const element = document.getElementById(\"smart-content-summaries-list\");\r\n if (element)\r\n element.scroll({ top: element.scrollHeight, behavior: \"smooth\" });\r\n\r\n await props.onGenerateMore(promptType);\r\n }\r\n\r\n return (\r\n \r\n {summaries.map(({ index, message: { content } }: IGPTChoice) =>\r\n onApply(content)}\r\n suggestion={{ suggestion: content, suggestionId: index.toString() }}\r\n confirmLabel=\"APPLY\"\r\n confirmPosition=\"inline\"\r\n />)}\r\n \r\n );\r\n}\r\n\r\nexport { SmartContentSummaries };\r\n","import React from \"react\";\r\n\r\nimport { Button, IconButton, TextField } from \"@mui/material\";\r\nimport FileCopyOutlinedIcon from '@mui/icons-material/FileCopyOutlined';\r\nimport copy from \"copy-to-clipboard\";\r\n\r\nimport { ISmartContentListPageProps, SmartContentListPage } from \"./smartContentListPage\";\r\nimport { IGPTChoice } from \"./models\";\r\nimport Pagination from \"modules/common/components/pagination/pagination\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\ninterface ISmartContentDraftPage extends ISmartContentListPageProps {\r\n onApplyDraft: () => void;\r\n onChangeDraft: (newText: string) => void;\r\n onChangeDraftIdx: (newDraftIdx: number) => void;\r\n drafts: IGPTChoice[];\r\n draftIdx: number;\r\n currentDraft: IGPTChoice | null;\r\n}\r\n\r\nconst SmartContentDraftPage: React.FunctionComponent = ({\r\n drafts,\r\n draftIdx,\r\n fetching,\r\n currentDraft,\r\n onChangeDraftIdx,\r\n onChangeDraft,\r\n onApplyDraft,\r\n ...props\r\n}) => {\r\n return (\r\n \r\n {fetching\r\n ? \r\n : <>\r\n
    \r\n \r\n
    \r\n { copy(currentDraft?.message.content || \"\", { format: \"text/plain\" }); }}\r\n >\r\n \r\n \r\n onApplyDraft()}\r\n >\r\n APPLY\r\n \r\n
    \r\n
    \r\n ) => onChangeDraft(event.currentTarget.value)}\r\n />\r\n }\r\n \r\n );\r\n}\r\n\r\nexport { SmartContentDraftPage };\r\n","import React, { useState } from \"react\";\r\n\r\nimport { Button, Dialog, DialogActions, DialogContent, DialogTitle, IconButton, Link } from \"@mui/material\";\r\nimport { Close, InfoOutlined } from \"@mui/icons-material\";\r\n\r\nimport { ReadabilitySettings } from \"./readabilitySettings\";\r\nimport { EMPTY_READABILITY_SETTINGS, IReadabilityOptionModel, IReadabilitySettings, IReadabilitySettingsOptionModel } from \"../../../models\";\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\nimport ConfirmDialog from \"modules/common/components/dialogs/confirmDialog\";\r\nimport SuccessSnackbar from \"modules/common/components/snackbars/successSnackbar\";\r\n\r\nimport \"../../styles/readabilitySettingsDialog.sass\";\r\n\r\ninterface IReadabilitySettingsDialogProps {\r\n open: boolean;\r\n readabilityOptions?: IReadabilitySettingsOptionModel;\r\n readabilitySettings?: IReadabilitySettings;\r\n defaultReadabilitySettings?: IReadabilitySettings;\r\n suggestedTextExists: boolean; // is there any suggested text to clear?\r\n onClose: () => void;\r\n onChangeReadabilitySettings: (newSettings: IReadabilitySettings) => void;\r\n resetReadabilitySettings: () => void;\r\n onClearAllSuggestedText: () => void;\r\n}\r\n\r\nexport const ReadabilitySettingsDialog: React.FunctionComponent = ({\r\n open,\r\n readabilityOptions,\r\n readabilitySettings,\r\n defaultReadabilitySettings,\r\n suggestedTextExists,\r\n onChangeReadabilitySettings,\r\n resetReadabilitySettings,\r\n onClearAllSuggestedText,\r\n onClose,\r\n}) => {\r\n const [confirmClearSuggestions, setConfirmClearSuggestions] = useState(false);\r\n const [successMessage, setSuccessMessage] = useState(\"\");\r\n\r\n const randomizeSelections = () => {\r\n if (!readabilityOptions) return;\r\n\r\n let newSelections: IReadabilitySettings = readabilitySettings\r\n ? { ...readabilitySettings }\r\n : EMPTY_READABILITY_SETTINGS;\r\n\r\n Object\r\n .keys(readabilityOptions)\r\n .forEach((key: string) => {\r\n const currentSetting: IReadabilityOptionModel[] = readabilityOptions[key];\r\n const randomSelection = getRandomSelection(currentSetting);\r\n\r\n newSelections[key] = randomSelection;\r\n });\r\n\r\n onChangeReadabilitySettings(newSelections);\r\n }\r\n\r\n // get a random element in the options array\r\n const getRandomSelection = (options: IReadabilityOptionModel[]): string => options[Math.floor(Math.random() * options.length)].name;\r\n\r\n const onConfirmClearAllSuggestions = () => {\r\n setConfirmClearSuggestions(false);\r\n onClearAllSuggestedText();\r\n\r\n setSuccessMessage(\"All suggested text in Smart Content were successfully cleared.\");\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n Readability Settings in Smart Content\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n text={
    \r\n Our AI tool uses the readability settings as guides when generating body text. Learn more.\r\n
    }\r\n />\r\n {readabilityOptions && readabilitySettings &&\r\n <>\r\n \r\n
    \r\n \r\n Reset to default settings\r\n \r\n \r\n Randomize\r\n \r\n
    \r\n }\r\n\r\n
    \r\n \r\n
    \r\n

    \r\n Saved changes will only apply to succeeding suggestions, and will not affect any existing ones that were generated prior to the changes.\r\n

    \r\n
    \r\n setConfirmClearSuggestions(true)}\r\n disabled={!suggestedTextExists}\r\n href=\"\"\r\n >\r\n Clear all existing suggested text\r\n \r\n
    \r\n
    \r\n
    \r\n \r\n setConfirmClearSuggestions(false)}\r\n onDeny={() => setConfirmClearSuggestions(false)}\r\n onConfirm={onConfirmClearAllSuggestions}\r\n headerStyle={{ padding: \"16px 24px 8px\" }}\r\n confirmButtonProps={{ id: \"post-smart-content-confirm-clear\", color: \"secondary\", style: { backgroundColor: \"#b72026\" } }}\r\n denyButtonProps={{ id: \"post-smart-content-deny-clear\" }}\r\n >\r\n
    \r\n
    \r\n You are about to clear all Smart Content keywords, titles, summaries and body text. You may not be able to retrieve the same responses again.\r\n
    \r\n
    \r\n
    Do you want to proceed?
    \r\n
    \r\n \r\n setSuccessMessage(\"\")}\r\n />\r\n \r\n );\r\n}\r\n","import React from \"react\";\r\n\r\nimport { IGPTChoice, PromptTypeEnum } from \"./models\";\r\nimport { SmartContentSuggestion } from \"./smartContentSuggestion\";\r\nimport { ISmartContentListPageProps, SmartContentListPage } from \"./smartContentListPage\";\r\n\r\ninterface ISmartContentGeneric extends ISmartContentListPageProps {\r\n choices: IGPTChoice[];\r\n promptType: PromptTypeEnum;\r\n onApplyText: (newTitle: string) => void;\r\n onClose: () => void;\r\n}\r\n\r\nconst SmartContentGeneric: React.FunctionComponent = ({\r\n choices,\r\n title,\r\n usedTinyMceDropDown,\r\n promptType,\r\n onApplyText,\r\n ...props\r\n}) => {\r\n\r\n\r\n // before passing to propped function, scroll to bottom of list so spinner shows\r\n const onGenerateMoreHandler = async (promptType: PromptTypeEnum): Promise => {\r\n const element = document.getElementById(\"smart-content-titles-list\");\r\n if (element)\r\n element.scroll({ top: element.scrollHeight, behavior: \"smooth\" });\r\n\r\n await props.onGenerateMore(promptType);\r\n }\r\n\r\n return (\r\n \r\n {choices.map(({ index, message: { content } }: IGPTChoice) =>\r\n onApplyText(content)}\r\n suggestion={{ suggestion: content, suggestionId: index.toString() }}\r\n confirmLabel=\"Insert\"\r\n confirmPosition=\"block\"\r\n />)}\r\n \r\n );\r\n}\r\n\r\nexport { SmartContentGeneric };\r\n","import React, { useEffect, useState } from \"react\";\r\n\r\nimport { Button, Dialog, DialogContent, Tab, Tabs } from \"@mui/material\";\r\nimport moment from 'moment';\r\n\r\nimport { TagStats } from \"modules/insights\";\r\nimport { Tab as ITab } from \"pages/common/tabs\";\r\nimport ChipList from \"../../chipList\";\r\nimport InfoHover from \"../../hovers/infoHover\";\r\nimport { TenantNotificationSettings } from \"modules/messaging\";\r\nimport { Notifications } from \"../models\";\r\nimport { TenantSettings } from \"modules/settings\";\r\nimport { CommentingTypes } from \"modules/posts/models\";\r\nimport Loading from \"../../loading\";\r\nimport useIsMounted from \"modules/common/hooks/useIsMounted\";\r\nimport { insightsApi } from \"api/instances\";\r\nimport LoadingSpinner from \"../../loadingSpinner\";\r\nimport { dateOptions } from \"utils/dateFormatting\";\r\nimport OneLastCheckMoreDetails from \"./oneLastCheckMoreDetails\";\r\n\r\nimport \"../styles/oneLastCheck.sass\";\r\nimport { SubmissionDisclaimer } from \"./submissionDisclaimer\";\r\nimport { ContentType } from \"modules/common/models\";\r\n\r\ninterface IOneLastCheckProps {\r\n open: boolean;\r\n publishTime: Date | null | undefined;\r\n tenantNotificationSettings: TenantNotificationSettings;\r\n expiryTime: Date | null | undefined;\r\n breakingTime: Date | null | undefined;\r\n featuredTime: Date | null | undefined;\r\n tenantSettings: TenantSettings;\r\n isPreviouslyPublished?: boolean;\r\n notifications?: Notifications;\r\n commentsEnabledOnContent?: boolean;\r\n reactionsEnabledOnContent?: boolean;\r\n commentType?: CommentingTypes;\r\n tags?: string[];\r\n disableKeepEditing?: boolean;\r\n onClose: () => void;\r\n onPublish: () => Promise;\r\n isContributor: boolean;\r\n publishBtnName: string;\r\n}\r\n\r\nenum ONE_LAST_CHECK_TAB_VALUES {\r\n DETAILS,\r\n PREVIEW\r\n}\r\nconst ONE_LAST_CHECK_TABS: ITab[] = [\r\n {\r\n label: \"Post details\",\r\n value: ONE_LAST_CHECK_TAB_VALUES.DETAILS,\r\n id: \"post-details-tab\"\r\n },\r\n {\r\n label: \"Content preview\",\r\n value: ONE_LAST_CHECK_TAB_VALUES.PREVIEW,\r\n id: \"content-preview-tab\"\r\n },\r\n];\r\n\r\nconst OneLastCheck: React.FunctionComponent = ({\r\n open,\r\n publishTime,\r\n children,\r\n tenantNotificationSettings,\r\n expiryTime,\r\n breakingTime,\r\n featuredTime,\r\n tenantSettings,\r\n notifications,\r\n tags = [],\r\n isPreviouslyPublished = false,\r\n commentsEnabledOnContent = false,\r\n reactionsEnabledOnContent = false,\r\n commentType,\r\n disableKeepEditing = false,\r\n onPublish,\r\n onClose,\r\n isContributor = false,\r\n publishBtnName = 'Submit',\r\n}) => {\r\n const isMounted = useIsMounted();\r\n\r\n const [publishing, setPublishing] = useState(false);\r\n const [fetching, setFetching] = useState(true);\r\n const [totalReach, setTotalReach] = useState();\r\n const [tagNamesMap, setTagNamesMap] = useState>();\r\n const [tagSubscriberCountsMap, setTagSubscriberCountsMap] = useState>();\r\n const [selectedTab, setSelectedTab] = useState(ONE_LAST_CHECK_TAB_VALUES.DETAILS);\r\n\r\n // fetch data\r\n useEffect(() => {\r\n const fetch = async () => {\r\n try {\r\n const TAG_STATS_IDX = 0;\r\n const TOTAL_REACH_IDX = 1;\r\n let results = await Promise.all([insightsApi.GetTagStats(), insightsApi.GetUniqueSubscribersForTopics(tags)]);\r\n\r\n const tagStatsResult = results[TAG_STATS_IDX];\r\n const totalReachResult = results[TOTAL_REACH_IDX];\r\n\r\n let tagStatsHashMap: Record = tagStatsResult.reduce((map: Record, curr: TagStats) => ({\r\n ...map,\r\n [curr.id]: curr.subscriberCount\r\n }), {});\r\n\r\n let tagNamesHashMap: Record = tagStatsResult.reduce((map: Record, curr: TagStats) => ({\r\n ...map,\r\n [curr.id]: curr.name\r\n }), {});\r\n\r\n if (isMounted()) {\r\n setTotalReach(totalReachResult);\r\n setTagNamesMap(tagNamesHashMap);\r\n setTagSubscriberCountsMap(tagStatsHashMap);\r\n }\r\n } catch {\r\n\r\n } finally {\r\n if (isMounted()) setFetching(false);\r\n }\r\n }\r\n\r\n if (open) fetch();\r\n }, [open, isMounted, tags]);\r\n\r\n const onChangeTab = (event: React.ChangeEvent, newTab: number) => {\r\n setSelectedTab(newTab);\r\n }\r\n\r\n const publish = async () => {\r\n setPublishing(true);\r\n await onPublish();\r\n\r\n if (isMounted())\r\n setPublishing(false);\r\n }\r\n\r\n const getTab = (tab: ITab) => (\r\n \r\n );\r\n\r\n return (\r\n \r\n
    \r\n One last check!\r\n \r\n {publishing ?\r\n
    \r\n : }\r\n
    \r\n \r\n <>\r\n {fetching\r\n ? \r\n : <>\r\n
    \r\n \r\n
    \r\n \r\n {publishTime ? moment(publishTime).locale(\"en\").format(dateOptions.dateAndTime) : \"Now\"}\r\n
    \r\n
    \r\n \r\n
    \r\n {tagNamesMap && {\r\n const label = `${tagNamesMap[tagId]} (${tagSubscriberCountsMap ? tagSubscriberCountsMap[tagId] : \"\"})`;\r\n return { id: tagId, name: label };\r\n }) || []}\r\n />}\r\n
    \r\n
    \r\n
    \r\n \r\n {totalReach?.toLocaleString() || \"\"}\r\n
    \r\n
    \r\n
    \r\n \r\n {ONE_LAST_CHECK_TABS.map(getTab)}\r\n \r\n \r\n Preview varies based on device and/or platform.\r\n \r\n
    \r\n \r\n \r\n }\r\n \r\n
    \r\n \r\n );\r\n}\r\n\r\nexport default OneLastCheck;\r\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport moment from \"moment\";\r\nimport { useMediaQuery, useTheme } from \"@mui/material\";\r\n\r\nimport {\r\n Post,\r\n PostAverages,\r\n TranslatedContent as ITranslatedContent\r\n} from \"../../models\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport * as userActions from \"modules/profile/actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport EditorWrapperLayout from \"modules/common/components/authoring/editorLayouts/editorWrapperLayout\";\r\nimport MainEditorLayout from \"modules/common/components/authoring/editorLayouts/mainEditorLayout\";\r\nimport { POST_SETTINGS_EDITOR_DRAWER_WIDTH, POST_SETTINGS_TAB_VALUES } from \"./postCreation\";\r\nimport { ContentAnalysis, DEFAULT_TRANSLATABLE_CONTENT, TranslatableContent } from \"modules/common/components/authoring/models\";\r\nimport useIsMounted from \"modules/common/hooks/useIsMounted\";\r\nimport { getTranslatedBody, getTranslatedDescription, getTranslatedTitle } from \"utils/getTranslatedContent\";\r\nimport PostSettingsPanel from \"./components/postSettingsPanel\";\r\nimport useLanguages from \"modules/common/hooks/data/useLanguages\";\r\nimport PostMainPanel from \"./components/postMainPanel\";\r\nimport { loggedEventsApi, postsApi } from \"api/instances\";\r\nimport { FEATURE_ACTION_CODES } from \"modules/common/models\";\r\nimport usePrevious from \"modules/common/hooks/usePrevious\";\r\nimport { LANGUAGE_CODES } from \"modules/localization/models\";\r\nimport { SmartContentPaperFab } from \"modules/smartContent/buttons/smartContentPaperFab\";\r\nimport useIsFirstRender from \"modules/common/hooks/useIsFirstRender\";\r\nimport cookie from \"utils/cookie\";\r\nimport { PostSmartContentPanel } from \"./smartContent/postSmartContentPanel\";\r\nimport { ICustomCssModelv1 } from \"api/files\";\r\nimport { PromptTypeEnum } from \"modules/smartContent/models\";\r\n\r\nconst PostEditor: React.FunctionComponent = ({\r\n settingsDrawerOpen,\r\n selectedTab,\r\n fullscreenEditor,\r\n customCss,\r\n analysisIndicator,\r\n onChangeAnalysisIndicator,\r\n onChangeFullscreen,\r\n onToggleSettingsDrawer,\r\n getContentAnalysis,\r\n isContributor,\r\n ...props\r\n}) => {\r\n const { currentUser, post, tenant } = props;\r\n const {\r\n availableLanguages,\r\n selectedLanguages,\r\n activeLcid,\r\n defaultLcid,\r\n lcidMappings,\r\n onRemoveLanguage,\r\n onSelectLanguage,\r\n } = useLanguages(post.translatedContent);\r\n\r\n const setTenantAveragesSetting = (toSet: boolean) => {\r\n setIsUsingTenant(toSet);\r\n cookie.setTenantAveragesSetting(toSet);\r\n\r\n if (!!currentAnalyses)\r\n updateAnalysisAverageScores(currentAnalyses, toSet);\r\n }\r\n\r\n const theme = useTheme();\r\n const isMounted = useIsMounted();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down('md'));\r\n const isFirstRender = useIsFirstRender();\r\n const contentAnalysesTabVisited = useRef(false); // keep track if user has selected content analyses tab yet\r\n const bodyChangedSinceLastAnalyze = useRef(false);\r\n const previousTranslatedContent = usePrevious(post.translatedContent); // keep track of the previous renders translated content\r\n const prevLcid = usePrevious(activeLcid); // keep track of previous renders active lcid\r\n\r\n const notificationSettingsEnabled = !!post.notifications && props.isTenantNotifsEnabled;\r\n const reminderSettingsEnabled = !!post.notifications && !!post.notifications.reminders && props.isTenantNotifsEnabled;\r\n\r\n const [currentAnalyses, setCurrentAnalyses] = useState();\r\n const [fetchingAnalyses, setFetchingAnlyses] = useState(false);\r\n const [initAnalyze, setInitAnalyze] = useState(false); // this is used to allow other components to send an analyze request through this component\r\n const [highlightsOn, setHighlightsOn] = useState(true);\r\n const [smartContentOpen, setSmartContentOpen] = useState(false);\r\n const [smartContentCalloutOpen, setSmartContentCalloutOpen] = useState(false);\r\n const [smartContentIndicator, setSmartContentIndicator] = useState(false);\r\n const [tenantPostAverages, setTenantPostAverages] = useState();\r\n const [globalPostAverages, setGlobalPostAverages] = useState();\r\n const [isUsingTenant, setIsUsingTenant] = useState(cookie.getTenantAveragesSetting());\r\n\r\n const smartContentHasBeenOpenOnce = useRef(false);\r\n const settingsOpenBeforeSmartContent = useRef(null);\r\n const contentChangesMade = useRef(false); // keep track of any changes made to title, summary, body in order to show smart content callout after 20s\r\n const defaultContent = useRef(post.translatedContent); // the content when post is first loaded\r\n\r\n const [highlightedTextInTinyEditor, setHighlightedTextInTinyEditor] = useState();\r\n const [promptType, setPromptType] = useState();\r\n const [usedTinyMceDropDown, setUsedTinyMceDropDown] = useState();\r\n const [smartContentKeywords, setsmartContentKeywords] = useState();\r\n const [smartContentSuggestion, setSmartContentSuggestion] = useState(\"\");\r\n\r\n const { translatedContent } = post;\r\n const title = useMemo(() => getTranslatedTitle(translatedContent, activeLcid), [activeLcid, translatedContent]);\r\n const body = useMemo(() => getTranslatedBody(translatedContent, activeLcid), [activeLcid, translatedContent]);\r\n const summary = useMemo(() => getTranslatedDescription(translatedContent, activeLcid), [activeLcid, translatedContent]);\r\n\r\n const fetchTenantPostAverages = useCallback(() => {\r\n postsApi.GetTenantPostAverages()\r\n .then(result => {\r\n setTenantPostAverages(result);\r\n })\r\n .catch();\r\n }, []);\r\n\r\n /**\r\n * Get title, summary, body etc for current language\r\n */\r\n const getTranslation = useCallback((lcid: string, translation: ITranslatedContent | undefined): TranslatableContent => {\r\n return translation\r\n ? translation[lcid]\r\n : DEFAULT_TRANSLATABLE_CONTENT;\r\n }, []);\r\n\r\n const translation = useMemo(() => getTranslation(activeLcid, translatedContent), [activeLcid, translatedContent, getTranslation]);\r\n\r\n const fetchGlobalPostAverages = useCallback(() => {\r\n postsApi.GetGlobalPostAverages()\r\n .then(result => {\r\n setGlobalPostAverages(result);\r\n })\r\n .catch();\r\n }, []);\r\n\r\n useEffect(() => {\r\n moment.locale(LANGUAGE_CODES.en);\r\n fetchTenantPostAverages();\r\n fetchGlobalPostAverages();\r\n }, [fetchGlobalPostAverages, fetchTenantPostAverages]);\r\n\r\n // show fab callout logic\r\n useEffect(() => {\r\n // after 20 seconds if no changes to title, body or summary made show the smart content callout\r\n const smartContentCalloutTimeout = setTimeout(() => {\r\n // no changes, smart content modal not open, not on small screen and no content\r\n if (!contentChangesMade.current && !smartContentOpen && !isSmallAndSmaller && !title && !body && !summary) {\r\n setSmartContentCalloutOpen(true);\r\n }\r\n }, 20000);\r\n\r\n return () => {\r\n clearTimeout(smartContentCalloutTimeout);\r\n }\r\n }, [smartContentOpen, isSmallAndSmaller, body, title, summary]);\r\n\r\n // show fab indicator logic\r\n useEffect(() => {\r\n if (contentChangesMade.current) {\r\n // if at least one field has content and at least one field does not have content\r\n // but not all fields have content and not all fields dont have content\r\n if (!smartContentHasBeenOpenOnce.current && (title || summary || body) && (!title || !summary || !body) && !(title && summary && body) && !(!title && !summary && !body))\r\n setSmartContentIndicator(true);\r\n else\r\n setSmartContentIndicator(false);\r\n }\r\n }, [title, body, summary]);\r\n\r\n /**\r\n * Keep track if changes have been made\r\n * We use this to show/not show the smart content callout and red dot indicator\r\n */\r\n useEffect(() => {\r\n if (contentChangesMade.current === false) {\r\n const defaultTranslation = getTranslation(activeLcid, defaultContent.current);\r\n\r\n contentChangesMade.current = defaultTranslation?.body !== body ||\r\n defaultTranslation?.title !== title ||\r\n defaultTranslation?.description !== summary;\r\n }\r\n }, [title, body, summary, getTranslation, activeLcid]);\r\n\r\n // handle effects of closing smart content modal\r\n // - remove red indicator\r\n // - restore settings panel open state\r\n useEffect(() => {\r\n if (!smartContentOpen) {\r\n if (settingsOpenBeforeSmartContent.current) {\r\n onToggleSettingsDrawer(settingsOpenBeforeSmartContent.current);\r\n }\r\n }\r\n }, [smartContentOpen, onToggleSettingsDrawer]);\r\n\r\n // keep track of if smart content modal has been open once\r\n useEffect(() => {\r\n if (smartContentOpen) smartContentHasBeenOpenOnce.current = true;\r\n else if (!isFirstRender) setSmartContentIndicator(false);\r\n }, [smartContentOpen, isFirstRender]);\r\n\r\n const updateAnalysisAverageScores = useCallback((contentAnalyses: ContentAnalysis, isUsingTenant: boolean) => {\r\n let analysisToModify = contentAnalyses;\r\n analysisToModify.readabilityIndicator.score = Math.max(analysisToModify.readabilityIndicator.score, 1);\r\n\r\n if (!tenantPostAverages || !globalPostAverages || !analysisToModify) {\r\n return;\r\n }\r\n\r\n if (isUsingTenant) {\r\n analysisToModify.personalismIndicator.recommendedScore = tenantPostAverages.averagePersonalism;\r\n analysisToModify.toneIndicator.recommendedScore = tenantPostAverages.averageTone;\r\n analysisToModify.readabilityIndicator.recommendedScore = Math.max(tenantPostAverages.averageReadabilityScore, 1);\r\n analysisToModify.sentimentIndicator.recommendedScore = tenantPostAverages.averageSentiment;\r\n } else {\r\n analysisToModify.personalismIndicator.recommendedScore = globalPostAverages.averagePersonalism;\r\n analysisToModify.toneIndicator.recommendedScore = globalPostAverages.averageTone;\r\n analysisToModify.readabilityIndicator.recommendedScore = Math.max(globalPostAverages.averageReadabilityScore, 1);\r\n analysisToModify.sentimentIndicator.recommendedScore = globalPostAverages.averageSentiment;\r\n }\r\n\r\n setCurrentAnalyses(analysisToModify);\r\n }, [tenantPostAverages, globalPostAverages]);\r\n\r\n const analyze = useCallback(async () => {\r\n bodyChangedSinceLastAnalyze.current = false;\r\n setFetchingAnlyses(true);\r\n\r\n try {\r\n if (!body) return;\r\n\r\n // only analyze if active lcid is an english language\r\n if (lcidMappings[activeLcid].translateAs !== LANGUAGE_CODES.en)\r\n return;\r\n\r\n let analyses = await getContentAnalysis(post.id || \"00000000-0000-7368-6172-65706f696e74\", body, true);\r\n if (isMounted()) {\r\n // add the red dot if we are not on the analyses tab\r\n onChangeAnalysisIndicator(selectedTab !== POST_SETTINGS_TAB_VALUES.CONTENT_ANALYSES);\r\n updateAnalysisAverageScores(analyses, isUsingTenant);\r\n setHighlightsOn(true);\r\n }\r\n } catch (err) { }\r\n finally {\r\n setInitAnalyze(false);\r\n setFetchingAnlyses(false);\r\n }\r\n }, [isUsingTenant, updateAnalysisAverageScores, selectedTab, activeLcid, isMounted, post.id, getContentAnalysis, lcidMappings, body]);\r\n\r\n // keep track of body changes since last analyze request\r\n useEffect(() => {\r\n const prevBody = getTranslatedBody(previousTranslatedContent, activeLcid);\r\n\r\n const bodyChanged = body !== prevBody || prevLcid !== activeLcid;\r\n\r\n // only set to true here, false should only ever be set after analyze\r\n // also, show red dot indicator\r\n if (bodyChanged) {\r\n bodyChangedSinceLastAnalyze.current = bodyChanged;\r\n\r\n if (!isFirstRender)\r\n onChangeAnalysisIndicator(true);\r\n }\r\n }, [body, activeLcid, previousTranslatedContent, isFirstRender, prevLcid]);\r\n\r\n /**\r\n * analyze content tab click side effect\r\n * analyze when:\r\n * 1. change to content anlyses tab\r\n */\r\n useEffect(() => {\r\n if (selectedTab === POST_SETTINGS_TAB_VALUES.CONTENT_ANALYSES) {\r\n let shouldFetch = (bodyChangedSinceLastAnalyze.current && !fetchingAnalyses) || !contentAnalysesTabVisited.current;\r\n\r\n if (shouldFetch)\r\n analyze();\r\n\r\n contentAnalysesTabVisited.current = true;\r\n }\r\n }, [selectedTab, activeLcid, fetchingAnalyses, analyze]);\r\n\r\n useEffect(() => {\r\n if (initAnalyze) {\r\n analyze();\r\n\r\n // record event\r\n loggedEventsApi.sendFeatureUsageEvent(FEATURE_ACTION_CODES.ANALYZE_AGAIN, currentUser.userId, tenant);\r\n }\r\n }, [initAnalyze, analyze, currentUser.userId, tenant]);\r\n\r\n const onChangePost = (value: Partial) => {\r\n props.updatePost(value);\r\n }\r\n\r\n /**\r\n * Grab body change and pass to parent change handler\r\n */\r\n const onChangeBody = (newBody: string) => {\r\n onChangeTranslation({ ...translation, body: newBody });\r\n }\r\n\r\n /**\r\n * Grab title change and pass to parent change handler\r\n */\r\n const onChangeTitle = (newTitle: string) => {\r\n onChangeTranslation({ ...translation, title: newTitle });\r\n }\r\n\r\n /**\r\n * Grab summary change and pass to parent change handler\r\n */\r\n const onChangeSummary = (newSummary: string) => {\r\n onChangeTranslation({ ...translation, description: newSummary });\r\n }\r\n\r\n /**\r\n * Handle changes to title, summary, body for current langauge\r\n */\r\n const onChangeTranslation = (newValue: TranslatableContent) => {\r\n let newTranslations = { ...translatedContent, [activeLcid]: { ...newValue } };\r\n onChangeTranslatedContent(newTranslations);\r\n }\r\n\r\n const onChangeTranslatedContent = (translatedContent: ITranslatedContent) => {\r\n onChangePost({ translatedContent });\r\n }\r\n\r\n const getMainEditorClassName = (): string => {\r\n let result: string = \"\";\r\n // on sm screens we will just overlap the two panels\r\n if (isSmallAndSmaller) {\r\n result = \"main-editor-paper\";\r\n } else {\r\n result = settingsDrawerOpen || smartContentOpen\r\n ? \"main-editor-paper main-editor-paper-open\"\r\n : \"main-editor-paper main-editor-paper-closed\"\r\n }\r\n\r\n return result;\r\n }\r\n\r\n const onChangeTab = (event: React.ChangeEvent, newValue: number) => {\r\n if (newValue === POST_SETTINGS_TAB_VALUES.CONTENT_ANALYSES) {\r\n onChangeAnalysisIndicator(false);\r\n\r\n // record event if not already on analyses tab\r\n if (selectedTab !== POST_SETTINGS_TAB_VALUES.CONTENT_ANALYSES)\r\n loggedEventsApi.sendFeatureUsageEvent(FEATURE_ACTION_CODES.SELECT_CONTENT_ANLYSIS_TAB, currentUser.userId, props.tenant);\r\n } else {\r\n setHighlightsOn(false);\r\n }\r\n\r\n props.onChangeTab(event, newValue);\r\n }\r\n\r\n /**\r\n * Handle focus to tiny editor\r\n * - turn highlights off\r\n */\r\n const onBodyFocus = () => {\r\n setHighlightsOn(false);\r\n }\r\n\r\n const onBookmarkClick = () => {\r\n // close smart content if we are opening settings\r\n if (!settingsDrawerOpen) {\r\n setSmartContentOpen(false);\r\n }\r\n\r\n onToggleSettingsDrawer();\r\n }\r\n\r\n /**\r\n * Show smart content callout, set highlighted text and prompt type.\r\n * @param highlightedText \r\n * @param promptType \r\n */\r\n const setShowSmartContentInsertOpen = (highlightedText: string, promptType: PromptTypeEnum) => {\r\n setSmartContentOpen(true);\r\n onToggleSettingsDrawer(false);\r\n setHighlightedTextInTinyEditor(highlightedText);\r\n setUsedTinyMceDropDown(true);\r\n setPromptType(promptType);\r\n }\r\n\r\n /**\r\n * Used to apply smart content suggestion to the body when using the expanded drop down and override the highlighted selection.\r\n * @param suggestion \r\n */\r\n const applySmartContentSuggestion = (suggestion: string) => {\r\n setSmartContentSuggestion(suggestion);\r\n }\r\n\r\n /**\r\n * Clear smart content suggestions\r\n */\r\n const clearSmartContentSuggestion = () => {\r\n setSmartContentSuggestion(\"\");\r\n }\r\n\r\n /*\r\n * On smart content generation, set the smart content keyword to the translated content\r\n */\r\n const generateAndOpenSmartContent = (promptTypeForGeneration: PromptTypeEnum, promptTypeForInsert: PromptTypeEnum, tinyBody?: string) => {\r\n if (post.translatedContent) {\r\n switch (promptTypeForGeneration) {\r\n case PromptTypeEnum.Title:\r\n setsmartContentKeywords(post.translatedContent[activeLcid].title);\r\n break;\r\n case PromptTypeEnum.Summarize:\r\n setsmartContentKeywords(post.translatedContent[activeLcid].description);\r\n break;\r\n case PromptTypeEnum.Body:\r\n setsmartContentKeywords(tinyBody);\r\n break;\r\n }\r\n setPromptType(promptTypeForInsert);\r\n setSmartContentOpen(true);\r\n onToggleSettingsDrawer(false);\r\n }\r\n };\r\n\r\n /**\r\n * On close smart content callout, save user settings if neccessary\r\n * @param skipCallouts\r\n */\r\n const onCloseSmartContentCallout = async (skipCallouts: boolean): Promise => {\r\n // testing equality here because the language on these properties is reversed i.e. skipCallouts is dont show smart content help callouts\r\n // so if they are equal we need to save the new skip value\r\n if (skipCallouts === currentUser.showSmartContentHelpCallouts) {\r\n await props.saveUserSettings({ ...currentUser, showSmartContentHelpCallouts: skipCallouts });\r\n }\r\n\r\n setSmartContentCalloutOpen(false);\r\n }\r\n\r\n const onClosePostSmartContentPanel = () => {\r\n setSmartContentOpen(false);\r\n setHighlightedTextInTinyEditor(\"\");\r\n setUsedTinyMceDropDown(false);\r\n setPromptType(undefined);\r\n setsmartContentKeywords(undefined);\r\n }\r\n\r\n return (\r\n \r\n \r\n setHighlightsOn(false)}\r\n fullscreenEditor={fullscreenEditor}\r\n onFullscreen={onChangeFullscreen}\r\n onBodyFocus={onBodyFocus}\r\n translations={post.translatedContent}\r\n availableLanguages={availableLanguages}\r\n selectedLanguages={selectedLanguages}\r\n activeLcid={activeLcid}\r\n defaultLcid={defaultLcid}\r\n lcidMappings={lcidMappings}\r\n smartContentEnabledForTenant={props.tenantSettings.postSmartContentEnabledByTenant}\r\n onRemoveLanguage={onRemoveLanguage}\r\n onSelectLanguage={onSelectLanguage}\r\n getDraftTranslation={props.getDraftTranslation}\r\n onChangeTranslatedContent={onChangeTranslatedContent}\r\n highlightedText={highlightsOn ? currentAnalyses?.highlightAnalysis?.processedHighlightText : undefined}\r\n onChangeBody={onChangeBody}\r\n onChangeSummary={onChangeSummary}\r\n onChangeTitle={onChangeTitle}\r\n translation={translation}\r\n onShowSmartContentInsert={setShowSmartContentInsertOpen}\r\n smartContentSuggestion={smartContentSuggestion}\r\n clearSmartContentSuggestion={clearSmartContentSuggestion}\r\n generateAndOpenSmartContent={generateAndOpenSmartContent}\r\n />\r\n \r\n {props.tenantSettings.showFeatures.postSmartContentEnabledForTenant && props.tenantSettings.postSmartContentEnabledByTenant &&\r\n <>\r\n {\r\n // store the open state of settings panel before smart content open so we can return to that state when smart content closed\r\n settingsOpenBeforeSmartContent.current = settingsDrawerOpen;\r\n\r\n // close settings panel and open smart content\r\n setSmartContentCalloutOpen(false);\r\n onToggleSettingsDrawer(false);\r\n setSmartContentOpen(true);\r\n }}\r\n fabStyle={{\r\n display: smartContentOpen ? \"none\" : \"inline-flex\", // only display when smart content is not open\r\n right: settingsDrawerOpen\r\n ? POST_SETTINGS_EDITOR_DRAWER_WIDTH + 27 // 27 is the space between fab and post settings panel when its open - from prototype\r\n : 58,\r\n }}\r\n fabClassName={settingsDrawerOpen ? \"open\" : \"closed\"}\r\n calloutOpen={smartContentCalloutOpen}\r\n onClose={onCloseSmartContentCallout}\r\n callout={currentUser.showSmartContentHelpCallouts}\r\n indicator={!smartContentOpen && smartContentIndicator}\r\n />\r\n onClosePostSmartContentPanel()}\r\n indicatorOn={smartContentIndicator}\r\n onChangeBody={onChangeBody}\r\n onChangeSummary={onChangeSummary}\r\n onChangeTitle={onChangeTitle}\r\n typeOfPrompt={promptType}\r\n usedTinyMceDropDown={usedTinyMceDropDown}\r\n highlightedText={highlightedTextInTinyEditor}\r\n applySmartContentSuggestion={applySmartContentSuggestion}\r\n keywords={smartContentKeywords}\r\n setKeywords={(keyword: string | undefined) => setsmartContentKeywords(keyword)}\r\n />\r\n }\r\n { setHighlightsOn(prev => !prev); }}\r\n highlightsOn={highlightsOn}\r\n post={post}\r\n fetchingAnalyses={fetchingAnalyses}\r\n contentAnalyses={currentAnalyses}\r\n tenantAverages={tenantPostAverages}\r\n globalAverages={globalPostAverages}\r\n isUsingTenantAverages={isUsingTenant}\r\n setIsUsingTenantAverages={setTenantAveragesSetting}\r\n currentUser={currentUser}\r\n selectedTab={selectedTab}\r\n onChangeTab={onChangeTab}\r\n analyze={() => { setInitAnalyze(true); }}\r\n activeLcid={activeLcid}\r\n analysisIndicator={analysisIndicator}\r\n lcidMappings={lcidMappings}\r\n notificationsEnabled={notificationSettingsEnabled}\r\n reminderNotificationsEnabled={reminderSettingsEnabled}\r\n hasPublished={props.hasPublished || false}\r\n commentsEnabled={props.tenantSettings.commentsEnabled}\r\n reactionsEnabled={props.tenantSettings.reactionsEnabled}\r\n canContributorsToggleComments={props.tenantSettings.canContributorsToggleComments}\r\n canContributorsToggleReactions={props.tenantSettings.canContributorsToggleReactions}\r\n tenantNotificationSettings={props.notificationSettings}\r\n onChangePost={onChangePost}\r\n onBookmarkClick={onBookmarkClick}\r\n saveUserSettings={props.saveUserSettings}\r\n validationChecks={props.validationChecks}\r\n drawerProps={{\r\n open: settingsDrawerOpen,\r\n PaperProps: {\r\n id: \"post-settings-drawer\",\r\n }\r\n }}\r\n isContributor={isContributor}\r\n />\r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n settingsDrawerOpen: boolean;\r\n selectedTab: number;\r\n fullscreenEditor?: boolean;\r\n customCss?: ICustomCssModelv1;\r\n onChangeFullscreen?: () => void;\r\n onChangeTab: (event: React.ChangeEvent, newTab: number) => void;\r\n isContributor: boolean;\r\n onToggleSettingsDrawer: (open?: boolean) => void;\r\n analysisIndicator: boolean;\r\n onChangeAnalysisIndicator: (value: boolean) => void;\r\n isTenantNotifsEnabled: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n lcidMappings: state.resources.lcidMappings,\r\n post: state.posts.editor.post,\r\n currentUser: state.settings.currentUser,\r\n hasPublished:\r\n !!state.posts.editor.post &&\r\n state.posts.editor.post.revisions &&\r\n state.posts.editor.post.revisions.findIndex((r) => !!r.publishedTime) >= 0,\r\n notificationSettings: state.settings.notificationSettings,\r\n tenantSettings: state.settings.tenantSettings,\r\n tenant: state.tenant.id,\r\n validationChecks: state.posts.editor.validationChecks\r\n }),\r\n {\r\n getContentAnalysis: actions.getContentAnalysis,\r\n getDraftTranslation: actions.getDraftTranslation,\r\n updatePost: actions.updatePost,\r\n saveUserSettings: userActions.saveUserSettings,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(PostEditor);\r\n","import React, { useEffect, useState } from \"react\";\r\nimport CheckIcon from \"@mui/icons-material/Check\";\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\nimport { Divider } from \"@mui/material\";\r\nimport moment from 'moment';\r\n\r\nimport { TenantNotificationSettings } from \"modules/messaging\";\r\nimport { DelayType, NotificationRange, Notifications, Reminder, ReminderInfo } from \"../models\";\r\nimport { CommentingTypes } from \"modules/posts/models\";\r\nimport Pagination from \"../../pagination/pagination\";\r\nimport { dateOptions } from \"utils/dateFormatting\";\r\nimport { isAnyTenantPostNotificationsEnabled, isAnyTenantRemindersEnabled } from \"utils/notificationsHelper\";\r\n\r\ninterface IOneLastCheckMoreDetailsProps {\r\n tenantNotificationSettings: TenantNotificationSettings;\r\n notifications?: Notifications;\r\n breakingTime: Date | null | undefined;\r\n featuredTime: Date | null | undefined;\r\n expiryTime: Date | null | undefined;\r\n commentsEnabledOnContent: boolean;\r\n commentType?: CommentingTypes;\r\n reactionsEnabledOnTenant: boolean;\r\n reactionsEnabledOnContent: boolean;\r\n isPreviouslyPublished: boolean;\r\n}\r\n\r\nconst OneLastCheckMoreDetails: React.FunctionComponent = ({\r\n tenantNotificationSettings,\r\n notifications,\r\n breakingTime,\r\n featuredTime,\r\n expiryTime,\r\n reactionsEnabledOnTenant = false,\r\n reactionsEnabledOnContent = false,\r\n commentsEnabledOnContent = false,\r\n commentType,\r\n isPreviouslyPublished,\r\n}) => {\r\n const [reminders, setReminders] = useState([]);\r\n const [reminderIndex, setReminderIndex] = useState(0);\r\n\r\n // setup reminders\r\n useEffect(() => {\r\n // Because we cannot edit reminders from this modal, we only need to do this reminder update the first time we render.\r\n // That's why we can check if the lengths are not matching\r\n if (notifications && notifications.reminders.length > 0 && reminders.length === 0) {\r\n let reminderInfos: ReminderInfo[] = [];\r\n\r\n // build usable reminder info objects\r\n notifications.reminders.forEach((reminder: Reminder, index: number) => {\r\n const delay: number = reminder.delay % 24 === 0 ? reminder.delay / 24 : reminder.delay;\r\n const delayType: DelayType = reminder.delay > 0 && reminder.delay % 24 === 0 ? \"days\" : \"hours\";\r\n\r\n let newReminderInfo: ReminderInfo | undefined = undefined;\r\n\r\n if (reminder.channel === \"none\") {\r\n newReminderInfo = {\r\n delay,\r\n delayType,\r\n emailRange: \"none\",\r\n mobileRange: \"none\",\r\n smsRange: \"none\",\r\n teamsRange: \"none\"\r\n };\r\n } else if (reminder.channel === \"inherit\") {\r\n newReminderInfo = {\r\n delay,\r\n delayType,\r\n emailRange: notifications.emailOnPublish,\r\n mobileRange: notifications.mobileOnPublish,\r\n smsRange: notifications.smsOnPublish,\r\n teamsRange: notifications.teamsOnPublish\r\n };\r\n } else {\r\n // we get reminders as separate notifications for each channel\r\n // this block consolidates all the reminders of the same delay and delayType so we can display as 1 notification with multiple channels\r\n\r\n // find a previous reminder with the same delay and delay type\r\n let previousReminder = reminderInfos.find((info: ReminderInfo) => info.delay === delay && info.delayType === delayType);\r\n\r\n // if previous reminder with same delay and delay type exists, add the current reminder channel to the previous one\r\n if (previousReminder) {\r\n if (reminder.channel === \"email\")\r\n previousReminder.emailRange = reminder.range;\r\n else if (reminder.channel === \"mobile\")\r\n previousReminder.mobileRange = reminder.range;\r\n else if (reminder.channel === \"sms\")\r\n previousReminder.smsRange = reminder.range;\r\n else if (reminder.channel === \"teams\")\r\n previousReminder.teamsRange = reminder.range;\r\n } else {\r\n newReminderInfo = {\r\n delay,\r\n delayType,\r\n emailRange: reminder.channel === \"email\" ? reminder.range : \"none\",\r\n mobileRange: reminder.channel === \"mobile\" ? reminder.range : \"none\",\r\n smsRange: reminder.channel === \"sms\" ? reminder.range : \"none\",\r\n teamsRange: reminder.channel === \"teams\" ? reminder.range : \"none\"\r\n };\r\n }\r\n }\r\n\r\n if (newReminderInfo) reminderInfos.push(newReminderInfo);\r\n });\r\n\r\n setReminders(reminderInfos)\r\n }\r\n }, [notifications, reminders]);\r\n\r\n const onPageChange = (newPage: number) => {\r\n setReminderIndex(newPage);\r\n }\r\n\r\n const getDateString = (date: Date | null | undefined) => {\r\n return date ? moment(date).locale(\"en\").format(dateOptions.dateAndTime) : \"\";\r\n }\r\n\r\n const getCommentsLabel = () => commentsEnabledOnContent\r\n ? `Enabled - ${commentType || \"Standard\"}`\r\n : \"Disabled\";\r\n\r\n const areNotificationsEnabledOnTenant = isAnyTenantPostNotificationsEnabled(tenantNotificationSettings);\r\n\r\n const areRemindersEnabledOnTenant = isAnyTenantRemindersEnabled(tenantNotificationSettings);\r\n\r\n const getNotificationStatus = (label: string, range: NotificationRange, notificationsEnabled: boolean = true) => {\r\n if (range === \"none\" || !notificationsEnabled)\r\n return
    {label}
    ;\r\n\r\n return
    {label}
    \r\n }\r\n\r\n const divider = (): JSX.Element => ();\r\n\r\n const getRow = (label: string, data: string) => (\r\n
    \r\n \r\n {data}\r\n
    \r\n );\r\n\r\n const getReminder = (reminder: ReminderInfo, index: number): JSX.Element => (\r\n
    \r\n
    Reminder {index + 1}
    \r\n
    \r\n Send in {reminder.delay} {reminder.delayType} if unread\r\n {getNotificationStatus(\"MS Teams Chatbot\", reminder.teamsRange, tenantNotificationSettings.settings[\"postReminderTeamsAttempt\"].toggle)}\r\n {getNotificationStatus(\"Mobile App\", reminder.mobileRange, tenantNotificationSettings.settings[\"postReminderMobileAttempt\"].toggle)}\r\n {getNotificationStatus(\"Email\", reminder.emailRange, tenantNotificationSettings.settings[\"postReminderEmailAttempt\"].toggle)}\r\n {getNotificationStatus(\"SMS\", reminder.smsRange, tenantNotificationSettings.settings[\"postReminderSMSAttempt\"].toggle)}\r\n
    \r\n
    \r\n );\r\n\r\n return (\r\n <>\r\n {breakingTime && getRow(\"Breaking News until\", getDateString(breakingTime))}\r\n {featuredTime && getRow(\"Featured News until\", getDateString(featuredTime))}\r\n {expiryTime && getRow(\"Expires on\", getDateString(expiryTime))}\r\n {(expiryTime || featuredTime || breakingTime) && divider()}\r\n {getRow(\"Comments\", getCommentsLabel())}\r\n {reactionsEnabledOnTenant && getRow(\"Reactions\", reactionsEnabledOnContent ? \"Enabled\" : \"Disabled\")}\r\n {divider()}\r\n {notifications &&\r\n <>\r\n
    \r\n \r\n
    \r\n {areNotificationsEnabledOnTenant\r\n ? <>\r\n {getNotificationStatus(\"MS Teams Chatbot\", notifications.teamsOnPublish, tenantNotificationSettings.settings[\"postPublishedTeamsAttempt\"]?.toggle)}\r\n {getNotificationStatus(\"Mobile App\", notifications.mobileOnPublish, tenantNotificationSettings.settings[\"postPublishedMobileAttempt\"]?.toggle)}\r\n {getNotificationStatus(\"Email\", notifications.emailOnPublish, tenantNotificationSettings.settings[\"postPublishedEmailAttempt\"]?.toggle)}\r\n {getNotificationStatus(\"SMS\", notifications.smsOnPublish, tenantNotificationSettings.settings[\"postPublishedSMSAttempt\"]?.toggle)}\r\n \r\n :

    Your organization has disabled post publishing notifications.
    Change this setting in Tenant Configurations.

    }\r\n
    \r\n
    \r\n }\r\n {reminders && reminders.length > 0 &&\r\n <>\r\n
    \r\n \r\n
    \r\n {areRemindersEnabledOnTenant\r\n ? <>\r\n {getReminder(reminders[reminderIndex], reminderIndex)}\r\n \r\n \r\n :

    Your organization has disabled post reminder notifications.
    Change this setting in Tenant Configurations.

    }\r\n
    \r\n
    \r\n \r\n }\r\n \r\n );\r\n}\r\n\r\nexport default OneLastCheckMoreDetails;\r\n","import React from \"react\";\r\nimport { Link } from \"@mui/material\";\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\n\r\nimport RequireRole from \"../../requireRole\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport Disclaimer from \"../../disclaimer\";\r\nimport { ContentType } from \"modules/common/models\";\r\n\r\ninterface ISubmissionDisclaimer {\r\n show: boolean;\r\n contentType: ContentType\r\n}\r\n\r\nexport const SubmissionDisclaimer: React.FunctionComponent = (props) => {\r\n\r\n return (\r\n \r\n {\r\n props.show &&\r\n }\r\n text={\r\n \r\n A submission manager or administrator will review, approve and publish this {ContentType[props.contentType].toLowerCase()} for you. \r\n \r\n Learn more\r\n .\r\n \r\n }\r\n backgroundColor=\"#ffe9af\"\r\n />\r\n }\r\n \r\n );\r\n};","import React from \"react\";\r\n\r\nimport { MoreVert, VisibilityOutlined } from \"@mui/icons-material\";\r\nimport { Button, ButtonGroup, Divider, IconButton, Menu, MenuItem, useMediaQuery, useTheme } from \"@mui/material\";\r\nimport { DockToLeftIcon } from \"modules/common/icons/dockToLeftIcon\";\r\nimport ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown';\r\nimport AutoStoriesOutlinedIcon from '@mui/icons-material/AutoStoriesOutlined';\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport { BACK_POST_TEXT, DFLT_PUBLISH_TEXT, DISCARD_BTN_TEXT, DRAFT_SAVE_BTN_TEXT, PREVIEW_HOVER_TEXT, REJECT_BTN_TEXT } from \"./constants\";\r\n\r\nexport interface IAuthoringAppBarActionsProps {\r\n actions: Record;\r\n}\r\n\r\nexport enum AuthoringAppBarAction {\r\n Save,\r\n Discard,\r\n Preview,\r\n Back,\r\n ToggleSettingsPanel,\r\n Publish,\r\n Reject,\r\n OpenGuidelines,\r\n}\r\n\r\nexport interface IAuthoringAppBarAction {\r\n onClick: () => void;\r\n disabled: boolean;\r\n label?: string;\r\n}\r\n\r\ninterface MenuAction {\r\n id: string,\r\n label: string,\r\n action: IAuthoringAppBarAction | undefined;\r\n}\r\n\r\nexport const AuthoringAppBarActions: React.FunctionComponent = ({\r\n actions\r\n}) => {\r\n const publishAction = actions[AuthoringAppBarAction.Publish];\r\n const saveAction = actions[AuthoringAppBarAction.Save];\r\n const rejectAction = actions[AuthoringAppBarAction.Reject];\r\n const previewAction = actions[AuthoringAppBarAction.Preview];\r\n const backAction = actions[AuthoringAppBarAction.Back];\r\n const toggleSettingsAction = actions[AuthoringAppBarAction.ToggleSettingsPanel];\r\n const discardAction = actions[AuthoringAppBarAction.Discard];\r\n const openGuidelinesAction = actions[AuthoringAppBarAction.OpenGuidelines];\r\n\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const groupAnchorRef = React.useRef(null);\r\n const showMoreActionsOpen = Boolean(anchorEl);\r\n const theme = useTheme();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down(\"md\"), { noSsr: true });\r\n\r\n const reviewActions: MenuAction[] = [\r\n {\r\n id: \"authoring-app-bar-reject\",\r\n label: REJECT_BTN_TEXT,\r\n action: rejectAction\r\n }\r\n ];\r\n\r\n const smallScreenActions = React.useMemo(\r\n (): MenuAction[] => [\r\n {\r\n id: \"authoring-app-bar-back\",\r\n label: BACK_POST_TEXT,\r\n action: backAction\r\n },\r\n {\r\n id: \"authoring-app-bar-preview\",\r\n label: PREVIEW_HOVER_TEXT,\r\n action: previewAction\r\n },\r\n {\r\n id: \"authoring-app-bar-discard\",\r\n label: DISCARD_BTN_TEXT,\r\n action: discardAction\r\n },\r\n {\r\n id: \"authoring-app-bar-save\",\r\n label: saveAction?.label ?? DRAFT_SAVE_BTN_TEXT,\r\n action: saveAction\r\n }\r\n ]\r\n , [backAction, previewAction, discardAction, saveAction]);\r\n\r\n const onClickMoreActions = (event: React.MouseEvent) => {\r\n setAnchorEl(event?.currentTarget);\r\n };\r\n\r\n const onClickButtonGroupDrop = () => {\r\n setAnchorEl(groupAnchorRef.current);\r\n };\r\n\r\n const getMenuOptions = (actions: MenuAction[]): JSX.Element[] => {\r\n return actions\r\n .filter((option: MenuAction) => option.action)\r\n .map((option: MenuAction) =>\r\n onAction(option.action?.onClick)}\r\n disabled={option.action?.disabled}\r\n >\r\n {option.label}\r\n \r\n );\r\n };\r\n\r\n const getMoreOptionsMenu = (): JSX.Element => {\r\n let options = isSmallAndSmaller ? [...smallScreenActions] : [];\r\n options = rejectAction ? [...options, ...reviewActions] : options;\r\n\r\n return setAnchorEl(null)}\r\n >\r\n {getMenuOptions(options)}\r\n ;\r\n };\r\n\r\n const onAction = (callback?: () => void) => {\r\n setAnchorEl(null);\r\n if (callback) callback();\r\n };\r\n\r\n const getPublishButton = (): JSX.Element => {\r\n if (!publishAction) return ;\r\n\r\n return (\r\n \r\n {publishAction.label ?? DFLT_PUBLISH_TEXT}\r\n \r\n );\r\n };\r\n\r\n const getIconButtons = (): JSX.Element => <>\r\n {\r\n previewAction &&\r\n \r\n \r\n \r\n }\r\n >\r\n Preview\r\n \r\n }\r\n {\r\n openGuidelinesAction &&\r\n \r\n \r\n \r\n }\r\n {\r\n toggleSettingsAction &&\r\n \r\n \r\n \r\n }\r\n >\r\n {toggleSettingsAction?.label ?? \"Settings\"}\r\n \r\n }\r\n ;\r\n\r\n return (\r\n <>\r\n {isSmallAndSmaller\r\n ? <>\r\n \r\n \r\n \r\n {getMoreOptionsMenu()}\r\n {getPublishButton()}\r\n \r\n : <>\r\n {\r\n discardAction &&\r\n \r\n {DISCARD_BTN_TEXT}\r\n \r\n }\r\n {\r\n saveAction &&\r\n \r\n {saveAction.label ?? DRAFT_SAVE_BTN_TEXT}\r\n \r\n }\r\n\r\n {\r\n rejectAction\r\n ? \r\n {getPublishButton()}\r\n \r\n \r\n \r\n \r\n : publishAction?.disabled && toggleSettingsAction?.disabled\r\n ? \r\n Complete the required fields to publish.\r\n \r\n : getPublishButton()\r\n }\r\n\r\n \r\n\r\n {getIconButtons()}\r\n {getMoreOptionsMenu()}\r\n }\r\n );\r\n};\r\n","import React from \"react\";\r\nimport { SvgIcon } from \"@mui/material\";\r\n\r\n/**\r\n * DockToLeftIcon\r\n * icon: https://fonts.google.com/icons?selected=Material+Symbols+Outlined:dock_to_left:FILL@0;wght@400;GRAD@0;opsz@24&icon.query=panel\r\n * @returns\r\n */\r\nexport const DockToLeftIcon: React.FunctionComponent = () => {\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\n","import * as React from \"react\";\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { withRouter, RouteComponentProps, useHistory } from \"react-router-dom\";\r\nimport { push } from \"react-router-redux\";\r\nimport { injectIntl, IntlShape } from \"react-intl\";\r\nimport {\r\n useMediaQuery,\r\n useTheme,\r\n FormControlLabel,\r\n Checkbox,\r\n} from \"@mui/material\";\r\nimport { PickerLocalization } from \"modules/common/components/pickerLocalization\";\r\n\r\nimport * as postActions from \"modules/posts/actionCreator\";\r\nimport * as settingsActions from \"modules/settings/actionCreator\";\r\nimport * as userActions from \"modules/profile/actionCreator\";\r\nimport { BackItem } from \"pages/common/breadcrumb\";\r\nimport AuthoringAppBar from \"modules/common/components/authoring/authoringAppBar\";\r\nimport useIsMounted from \"modules/common/hooks/useIsMounted\";\r\nimport * as RemoteFocusRequests from \"modules/common/remoteFocusRequest\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport BasePage from \"pages/common/basePage\";\r\nimport { POST_TYPES, Post, PostOverview } from \"../../models\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport PostEditor from \"./postEditor\";\r\nimport PostContentView from \"../post-view/postContentView\";\r\nimport ConfirmDialog from \"modules/common/components/dialogs/confirmDialog\";\r\nimport Preview, { PreviewType } from \"modules/common/components/authoring/dialogs/preview\";\r\nimport { Tab as ITab } from \"pages/common/tabs\";\r\nimport OneLastCheck from \"modules/common/components/authoring/dialogs/oneLastCheck\";\r\nimport useQueryParams, { QUERY_PARAM_KEYS } from \"modules/common/hooks/useQueryParams\";\r\nimport { draftPostsApi, loggedEventsApi, submissionsApi } from \"api/instances\";\r\nimport SuccessSnackbar from \"modules/common/components/snackbars/successSnackbar\";\r\nimport useIsFirstRender from \"modules/common/hooks/useIsFirstRender\";\r\nimport { useCustomTinyMceCssContent } from \"modules/common/hooks/data/useCustomTinyMceCssContent\";\r\n\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport { getHighestRole } from \"utils/userRoleUtils\";\r\nimport { openPostInPortal } from \"utils/redirectUtils\";\r\nimport { setShouldDisplayNav } from \"modules/adminLayout/actionCreator\";\r\nimport {\r\n getDefaultNotificationSetting,\r\n isAnyTenantPostNotificationsEnabled\r\n} from \"utils/notificationsHelper\";\r\nimport { NotificationEvents } from \"modules/messaging\";\r\nimport { ConfirmRepublishCompliancePostDialog } from \"modules/common/components/dialogs/confirmRepublishCompliancePostDialog\";\r\nimport PostAuthoringActions from \"./components/postAuthoringActionsAppBar\";\r\nimport { getPublishBtnName } from \"../../../common/components/authoring/utils\";\r\nimport ContentGuidelinePreview from \"modules/settings/components/content/guidelines/contentGuidelinePreview\";\r\nimport { HintType } from \"modules/common/components/authoring/dialogs/guidelineHint\";\r\nimport RejectSubmissionDialog from \"../../../common/components/authoring/dialogs/rejectSubmissionDialog\";\r\nimport { BACK_POST_TEXT, CONTRIBUTOR_PUBLISH_TEXT, CONTRIBUTOR_REPUBLISH_TEXT, DFLT_PUBLISH_TEXT, DISCARD_BTN_TEXT, DRAFT_CHANGED_BTN_TEXT, SUBMISSION_PUBLISH_TEXT } from \"modules/common/components/authoring/constants\";\r\n\r\nimport \"modules/common/components/authoring/authoring.sass\";\r\nimport \"modules/common/components/authoring/styles/authoringLayout.sass\";\r\nimport \"./postCreation.sass\";\r\nimport \"styles/views.sass\";\r\nimport \"modules/posts/components/post-view/postView.sass\";\r\nimport \"modules/posts/components/post-view/reactions/reactions.sass\";\r\nimport { useDefaultLocale } from \"modules/common/hooks/useDefaultLocale\";\r\nimport { useOpenContentGuidelines } from \"modules/common/hooks/useOpenContentGuidelines\";\r\n\r\nexport const POST_SETTINGS_EDITOR_DRAWER_WIDTH = 469; // match with authoringLayout.sass $settings-drawer-width variable\r\n\r\nexport enum POST_SETTINGS_TAB_VALUES {\r\n POST_DETAILS,\r\n POST_OPTIONS,\r\n CONTENT_ANALYSES\r\n}\r\n\r\nconst TABS: ITab[] = [\r\n {\r\n label: \"Post details\",\r\n value: POST_SETTINGS_TAB_VALUES.POST_DETAILS,\r\n id: \"post-details-tab\"\r\n },\r\n {\r\n label: \"Post options\",\r\n value: POST_SETTINGS_TAB_VALUES.POST_OPTIONS,\r\n id: \"post-optics-tab\"\r\n },\r\n {\r\n label: \"Conent analyses\",\r\n value: POST_SETTINGS_TAB_VALUES.CONTENT_ANALYSES,\r\n id: \"content-analysis-tab\"\r\n }\r\n];\r\n\r\nconst PostCreation: React.FunctionComponent = ({\r\n currentUser,\r\n notificationSettings,\r\n match,\r\n tagSettings,\r\n tenantSettings,\r\n isValid,\r\n post,\r\n tenantId,\r\n getTagSettings,\r\n setNewPost,\r\n fetchDraftPost,\r\n setShouldDisplayNav,\r\n redirectTo,\r\n setSaving,\r\n setChangedSinceSaved,\r\n save,\r\n updateId,\r\n createNew,\r\n ...props\r\n}) => {\r\n const { userId } = currentUser;\r\n const { params: { draftId } } = match;\r\n const isDraftIdPresent = React.useMemo(() => draftId && draftId !== \"new\", [draftId]);\r\n\r\n const openedTimeStamp = useRef(new Date().toISOString());\r\n const isMounted = useIsMounted();\r\n const isFirstRender = useIsFirstRender();\r\n const theme = useTheme();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down('md'), { noSsr: true });\r\n const queryParams = useQueryParams();\r\n const history = useHistory();\r\n const { customCss, fetching: fetchingCustomCss } = useCustomTinyMceCssContent({ enabled: tenantSettings.showFeatures.tinyMceCustomCssEnabled, tenantId });\r\n const isContributor = getHighestRole(currentUser) === UserRoleStrings.CONTRIBUTOR;\r\n const isSubmission = post.isSubmission !== undefined && post.isSubmission;\r\n const isTenantNotifsEnabled = isAnyTenantPostNotificationsEnabled(notificationSettings);\r\n const [isLoading, setIsLoading] = useState(true);\r\n const [oneLastCheckOpen, setOneLastCheckOpen] = useState(false);\r\n const [settingsDrawerOpen, setSettingsDrawerOpen] = useState(!isSmallAndSmaller);\r\n const [previewOpen, setPreviewOpen] = useState(false);\r\n const [previewPost, setPreviewPost] = useState(); // for preview page and one last check modal\r\n const [confirmAnalyticsDialogOpen, setConfirmAnalyticsDialogOpen] = useState(false); // content analyses publish confirm dialog\r\n const [unsavedChangesWarning, setUnsavedChangesWarning] = useState(false);\r\n const [confirmDiscardPost, setConfirmDiscardPost] = useState(false);\r\n const [confirmRejectSubmission, setConfirmRejectSubmission] = useState(false);\r\n const [selectedSettingsTab, setSelectedSettingTab] = useState(TABS[0].value);\r\n const [dontShowConfirmDialogAgainChecked, setDontShowConfirmDialogAgainChecked] = useState(!currentUser.showContentAnalysesDialog);\r\n const [successMessage, setSuccessMessage] = useState();\r\n const [fullscreenEditor, setFullscreenEditor] = useState(false);\r\n const [analysisIndicator, setAnalysisIndicator] = useState(false);\r\n const [confirmRepublishComplianceOpen, setConfirmRepublishComplianceOpen] = useState(false);\r\n \r\n const { openContentGuidelines, setOpenContentGuidelines } = useOpenContentGuidelines();\r\n\r\n useDefaultLocale();\r\n\r\n const getNewPost = useCallback(() => {\r\n const author: string = currentUser ? (currentUser.preferredName ? `${currentUser.preferredName} ${currentUser.lastName}` : `${currentUser.firstName} ${currentUser.lastName}`) : \"\";\r\n const authorEmail: string = currentUser ? currentUser.email : \"\";\r\n const lcid: string = tenantSettings ? tenantSettings.defaultLCID : \"en-us\";\r\n\r\n const post: Partial = {\r\n id: \"\",\r\n attachedContent: [],\r\n author: author,\r\n authorEmail: authorEmail,\r\n commentingEnabled: tenantSettings.isCommentingEnabledForNewPostsByDefault,\r\n commentingType: \"standard\",\r\n fileAttachments: [],\r\n image: {\r\n id: \"\",\r\n url: \"\",\r\n transforms: {\r\n points: [],\r\n zoom: 1\r\n }\r\n },\r\n notifications: {\r\n emailOnPublish: getDefaultNotificationSetting(NotificationEvents.PostPublishedEmail, notificationSettings),\r\n mobileOnPublish: getDefaultNotificationSetting(NotificationEvents.PostPublishedMobile, notificationSettings),\r\n reminders: isTenantNotifsEnabled ?\r\n notificationSettings.defaultPostSettings?.reminders || [] :\r\n [],\r\n smsOnPublish: getDefaultNotificationSetting(NotificationEvents.PostPublishedSMS, notificationSettings),\r\n teamsOnPublish: getDefaultNotificationSetting(NotificationEvents.PostPublishedTeams, notificationSettings)\r\n },\r\n postType: \"standard\",\r\n reactingEnabled: tenantSettings.isReactingEnabledForNewPostsByDefault &&\r\n isContributor ? tenantSettings.canContributorsToggleReactions : true,\r\n tags: [],\r\n translatedContent: {\r\n [lcid]: {\r\n body: \"\",\r\n description: \"\",\r\n title: \"\"\r\n }\r\n },\r\n };\r\n\r\n return post;\r\n }, [currentUser, notificationSettings, tenantSettings, isTenantNotifsEnabled, isContributor]);\r\n\r\n const setupPreviewPost = React.useCallback(async (id?: string) => {\r\n const idToUse = post.id || id;\r\n if (!idToUse) return;\r\n\r\n try {\r\n // using api fetch instead of redux because redux clears the post from editor state\r\n const postOverview = await draftPostsApi.getDraftPost(idToUse);\r\n if (isMounted()) {\r\n setPreviewOpen(true);\r\n setPreviewPost({\r\n ...postOverview,\r\n author: { name: postOverview.author, email: postOverview.authorEmail, avatar: { color: \"#2196f3\" } },\r\n imageUrl: postOverview.image.url,\r\n });\r\n }\r\n } catch (err) { }\r\n }, [post.id, isMounted]);\r\n\r\n const sendPostAuthoringClosedSparrow = React.useCallback(async () => {\r\n try {\r\n if (isDraftIdPresent && userId)\r\n await loggedEventsApi.sendPostAuthoringClosedEvent(tenantId, draftId, userId);\r\n } catch (err) { }\r\n }, [isDraftIdPresent, userId, tenantId, draftId]);\r\n\r\n const sendPostAuthoringClosedEventBeacon = React.useCallback(async () => {\r\n try {\r\n if (isDraftIdPresent && userId && tenantId) {\r\n await loggedEventsApi.sendPostAuthoringClosedEventBeacon(tenantId, draftId, userId);\r\n }\r\n } catch (err) { }\r\n }, [draftId, tenantId, userId, isDraftIdPresent]);\r\n\r\n const sendPostAuthoringOpenedEvent = React.useCallback(async (time?: string) => {\r\n try {\r\n if (isDraftIdPresent && userId)\r\n await loggedEventsApi.sendPostAuthoringOpenedEvent(draftId, time || openedTimeStamp.current);\r\n } catch (err) { }\r\n }, [userId, isDraftIdPresent, draftId]);\r\n\r\n // on page visibilitychange send post opened or post closed depending on document.visibilityState\r\n useEffect(() => {\r\n /**\r\n * Send post authoring depending on visibility state\r\n * - this is the recommended way to send any analytics on user session end of a page\r\n * - more info here: https://developer.chrome.com/blog/page-lifecycle-api/\r\n */\r\n const onVisbilityChange = async () => {\r\n if (document.visibilityState === \"hidden\")\r\n await sendPostAuthoringClosedEventBeacon();\r\n else if (document.visibilityState === \"visible\")\r\n await sendPostAuthoringOpenedEvent(new Date().toISOString());\r\n };\r\n\r\n document.addEventListener(\"visibilitychange\", onVisbilityChange);\r\n\r\n return () => {\r\n document.removeEventListener(\"visibilitychange\", onVisbilityChange);\r\n };\r\n }, [sendPostAuthoringClosedEventBeacon, sendPostAuthoringOpenedEvent]);\r\n\r\n // send post authoring open event when post has id\r\n useEffect(() => {\r\n sendPostAuthoringOpenedEvent(openedTimeStamp.current);\r\n }, [userId, isDraftIdPresent, draftId, sendPostAuthoringOpenedEvent]);\r\n\r\n // hide nav\r\n useEffect(() => {\r\n setShouldDisplayNav(false);\r\n }, [setShouldDisplayNav]);\r\n\r\n // post authoring close event\r\n // - this will handle the navigations within our app\r\n useEffect(() => {\r\n return () => {\r\n sendPostAuthoringClosedSparrow();\r\n };\r\n }, [sendPostAuthoringClosedSparrow]);\r\n\r\n /**\r\n * Handle preview query param effects\r\n */\r\n useEffect(() => {\r\n if (queryParams.get(QUERY_PARAM_KEYS.LOAD_PREVIEW_OPEN) === \"true\" && match.params.draftId !== \"new\") {\r\n setupPreviewPost(match.params.draftId);\r\n\r\n // remove query param\r\n const urlParams = new URLSearchParams(window.location.search);\r\n urlParams.delete(QUERY_PARAM_KEYS.LOAD_PREVIEW_OPEN);\r\n history.replace({\r\n search: urlParams.toString()\r\n });\r\n }\r\n }, [isFirstRender, queryParams, match.params.draftId, history, setupPreviewPost]);\r\n\r\n // effects of post changes\r\n useEffect(() => {\r\n const loadExistingPost = async () => {\r\n // redux fetch\r\n await fetchDraftPost(match.params.draftId);\r\n if (isMounted())\r\n setIsLoading(false);\r\n };\r\n\r\n if (!isDraftIdPresent) {\r\n const post = { ...getNewPost() };\r\n setNewPost(post);\r\n setIsLoading(false);\r\n } else if (isFirstRender) {\r\n loadExistingPost();\r\n }\r\n }, [getNewPost, isMounted, isFirstRender, isDraftIdPresent, setNewPost, match.params.draftId, fetchDraftPost]);\r\n\r\n // effects of tag settings change\r\n useEffect(() => {\r\n if (tagSettings.shouldFetch || !tagSettings.tagGroups.length)\r\n getTagSettings();\r\n }, [getTagSettings, tagSettings.shouldFetch, tagSettings.tagGroups.length]);\r\n\r\n const redirectToManagePosts = React.useCallback(() => {\r\n redirectTo(`/${match.params.tenant}/admin/posts`);\r\n }, [match.params.tenant, redirectTo]);\r\n\r\n const backToManagePosts = React.useCallback(() => {\r\n props.changedSinceSaved\r\n ? setUnsavedChangesWarning(true)\r\n : redirectToManagePosts();\r\n }, [props.changedSinceSaved, redirectToManagePosts]);\r\n\r\n const onSaveDraftSuccess = React.useCallback((isSubmission: boolean = false) => {\r\n if (isMounted()) {\r\n const savedItem = isSubmission ? \"changes\" : \"as draft\";\r\n setSuccessMessage(`Successfully saved ${savedItem}.`);\r\n }\r\n }, [isMounted]);\r\n\r\n /**\r\n * Save post\r\n * @param draftSaveOnly flag whether we are only saving as a draft - controls whether we show a snackbar or not\r\n * @param preview preview query param for redirect\r\n * @param redirecToUrl url to redirect to after saving existing post\r\n * @param isSubmission flag if we want the post to be saved as a submission or not. If false, post is saved as a draft.\r\n * @returns boolean on whether we redirect or not\r\n */\r\n const savePost = React.useCallback(async (\r\n draftSaveOnly: boolean = true,\r\n preview: boolean = false,\r\n redirectToUrl: string = \"\",\r\n isSubmission: boolean = false,\r\n ): Promise => {\r\n let success = false;\r\n try {\r\n if (!(props.loading || props.saving || props.publishing)) {\r\n if (!isDraftIdPresent) {\r\n const draftId = await createNew();\r\n updateId(draftId);\r\n success = await save(isSubmission);\r\n\r\n redirectTo(`/${match.params.tenant}/admin/posts/edit/${draftId}?preview=${preview}`);\r\n\r\n return true;\r\n\r\n } else {\r\n success = await save(isSubmission);\r\n }\r\n }\r\n }\r\n finally {\r\n if (success && draftSaveOnly)\r\n onSaveDraftSuccess(isSubmission);\r\n\r\n if (redirectToUrl) {\r\n redirectTo(redirectToUrl);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n }, [match.params.tenant, props.loading, props.saving, props.publishing, isDraftIdPresent, createNew, updateId, save, redirectTo, onSaveDraftSuccess]);\r\n\r\n const publishPostConfirm = React.useCallback(async () => {\r\n if (props.changedSinceSaved)\r\n await savePost(false, false);\r\n\r\n // show confirm dialog for seeing available content analyses\r\n let getPreviewablePost = false;\r\n if (currentUser.showContentAnalysesDialog && analysisIndicator) {\r\n setConfirmAnalyticsDialogOpen(true);\r\n } else {\r\n getPreviewablePost = true;\r\n setOneLastCheckOpen(true);\r\n }\r\n\r\n if (!post.id) return undefined;\r\n\r\n // using api fetch instead of redux because redux clears the post from editor state\r\n // before then fetching which results in blank inputs for a sec\r\n const postOverview = getPreviewablePost ? await draftPostsApi.getDraftPost(post.id) : undefined;\r\n\r\n if (postOverview && isMounted())\r\n setPreviewPost({\r\n ...postOverview,\r\n author: { name: postOverview.author, email: postOverview.authorEmail, avatar: { color: \"#2196f3\" } },\r\n imageUrl: postOverview.image.url,\r\n });\r\n }, [isMounted, props.changedSinceSaved, currentUser.showContentAnalysesDialog, analysisIndicator, post.id, savePost]);\r\n\r\n const publishPost = React.useCallback(async () => {\r\n // show confirm dialog for re-publishing compliance posts\r\n if (post.postType === POST_TYPES.COMPLIANCE && post.isPreviouslyPublished) {\r\n setConfirmRepublishComplianceOpen(true);\r\n } else {\r\n await publishPostConfirm();\r\n }\r\n }, [post.postType, post.isPreviouslyPublished, publishPostConfirm]);\r\n\r\n const unsubmitPost = React.useCallback(async (postId: string, comments: string | undefined) => {\r\n try {\r\n setSaving(true);\r\n await submissionsApi.unsubmitSubmissionPost(postId, comments);\r\n }\r\n finally {\r\n setSaving(false);\r\n redirectToManagePosts();\r\n setChangedSinceSaved(false);\r\n }\r\n }, [setSaving, redirectToManagePosts, setChangedSinceSaved]);\r\n\r\n const publishConfirmed = async (): Promise => {\r\n let date = post.publishTime\r\n ? new Date(post.publishTime)\r\n : new Date();\r\n\r\n isContributor\r\n ? await props.submitPost(match.params.draftId)\r\n : await props.publishPost(match.params.draftId, date.toISOString());\r\n \r\n };\r\n\r\n /**\r\n * Set settings drawer open to a value or toggle it by leaving parameter undefined\r\n * @param open\r\n */\r\n const onToggleSettingsDrawer = useCallback((open: boolean | undefined): void => {\r\n if (!fullscreenEditor) {\r\n // toggle or set as parameter \"open\"\r\n setSettingsDrawerOpen(prev => {\r\n let newValue = !prev;\r\n if (open !== undefined)\r\n newValue = open;\r\n\r\n return newValue;\r\n });\r\n }\r\n }, [fullscreenEditor, setSettingsDrawerOpen]);\r\n\r\n const onPreview = React.useCallback(async () => {\r\n try {\r\n // save post - this will redirect if first save\r\n // otherwise, open previewer\r\n let redirecting = false;\r\n if (props.changedSinceSaved) redirecting = await savePost(false, true);\r\n\r\n // grab draft - TODO: merge our post models (PostOverview/Post etc) so we don't have to go to api here\r\n if (!redirecting) await setupPreviewPost();\r\n } catch (error) { }\r\n }, [props.changedSinceSaved, savePost, setupPreviewPost]);\r\n\r\n /**\r\n * Continue with publish\r\n * - try save dont show confirm next time\r\n * - grab post overview model\r\n * - show one last check\r\n */\r\n const onDenyAnalyticsDialog = async () => {\r\n setConfirmAnalyticsDialogOpen(false);\r\n\r\n await updateUserSettings();\r\n\r\n try {\r\n if (!post.id) return;\r\n\r\n // using api fetch instead of redux because redux clears the post from editor state\r\n let postOverview = await draftPostsApi.getDraftPost(post.id);\r\n if (isMounted())\r\n setPreviewPost({\r\n ...postOverview,\r\n author: { name: postOverview.author, email: postOverview.authorEmail, avatar: { color: \"#2196f3\" } },\r\n imageUrl: postOverview.image.url,\r\n });\r\n } catch (err) { }\r\n finally {\r\n if (isMounted())\r\n setOneLastCheckOpen(true);\r\n }\r\n };\r\n\r\n /**\r\n * Open up content analyses tab\r\n */\r\n const onConfirmAnalyticsDialog = async () => {\r\n setConfirmAnalyticsDialogOpen(false);\r\n setSettingsDrawerOpen(true);\r\n setSelectedSettingTab(POST_SETTINGS_TAB_VALUES.CONTENT_ANALYSES);\r\n\r\n await updateUserSettings();\r\n };\r\n\r\n const onChangeSettingsTab = async (event: React.ChangeEvent, newValue: number) => {\r\n setSelectedSettingTab(newValue);\r\n };\r\n\r\n const updateUserSettings = async (): Promise => {\r\n if (currentUser.showContentAnalysesDialog !== dontShowConfirmDialogAgainChecked) return true;\r\n\r\n let res = await props.saveUserSettings({ ...currentUser, showContentAnalysesDialog: !dontShowConfirmDialogAgainChecked });\r\n\r\n return res;\r\n };\r\n\r\n const onChangeAnalysisIndicator = (value: boolean) => setAnalysisIndicator(value);\r\n\r\n const getCommands = React.useMemo((): JSX.Element =>\r\n setConfirmDiscardPost(true),\r\n previewPost: onPreview,\r\n backToManagePosts,\r\n toggleSettingsDrawer: onToggleSettingsDrawer,\r\n publishPost,\r\n savePost,\r\n rejectSubmission: () => setConfirmRejectSubmission(true),\r\n openGuidelines: () => setOpenContentGuidelines(true)\r\n }}\r\n />, [isSubmission, isContributor, isDraftIdPresent, isValid, settingsDrawerOpen, backToManagePosts, onToggleSettingsDrawer, publishPost, onPreview, savePost]);\r\n\r\n const getDesktopPreview = () => (\r\n
    \r\n {previewPost &&\r\n t.enabled).map((t) => ({ ...t, order: t.sortIndex }))}\r\n reactionsEnabledOnTenant={tenantSettings.reactionsEnabled}\r\n commentsEnabledOnTenant={tenantSettings.commentsEnabled}\r\n post={previewPost}\r\n lcidMappings={props.lcidMappings}\r\n defaultLcid={props.defaultLang}\r\n />}\r\n
    \r\n );\r\n\r\n const getBackToManagePostsConfirm = (): JSX.Element => (\r\n setUnsavedChangesWarning(false)}\r\n onConfirm={() => setUnsavedChangesWarning(false)}\r\n onDeny={redirectToManagePosts}\r\n >\r\n
    \r\n
    \r\n You have unsaved changes to your post.
    \r\n
    \r\n
    Do you want to continue?
    \r\n
    \r\n \r\n );\r\n\r\n const getContentAnalysesConfirm = (): JSX.Element => (\r\n setConfirmAnalyticsDialogOpen(false)}\r\n onConfirm={onConfirmAnalyticsDialog}\r\n onDeny={onDenyAnalyticsDialog}\r\n >\r\n <>\r\n We analyzed your content and found recommendations that can help you improve its reach and engagement.\r\n
    \r\n
    \r\n Do you want to see the content analysis?\r\n
    \r\n
    \r\n setDontShowConfirmDialogAgainChecked(checked)} />}\r\n />\r\n \r\n \r\n );\r\n\r\n const getDiscardPostConfirm = (): JSX.Element => (\r\n setConfirmDiscardPost(false)}\r\n onConfirm={async () => {\r\n setConfirmDiscardPost(false);\r\n await savePost(false, false, `/${match.params.tenant}/admin/posts`);\r\n }}\r\n onDeny={() => {\r\n setConfirmDiscardPost(false);\r\n setChangedSinceSaved(false);\r\n redirectToManagePosts();\r\n }}\r\n >\r\n You have unsaved changes to your draft. Would you like to save these changes before exiting?\r\n \r\n );\r\n \r\n const getRejectSubmissionConfirm = (): JSX.Element =>\r\n await savePost(false, false, \"\", true)}\r\n rejectSubmission={async (comments: string | undefined) => await unsubmitPost(match.params.draftId, comments)}/>\r\n\r\n const getConfirmRepublishCompliancePost = (): JSX.Element =>\r\n setConfirmRepublishComplianceOpen(false)}\r\n onDeny={() => setConfirmRepublishComplianceOpen(false)}\r\n onConfirm={async () => {\r\n setConfirmRepublishComplianceOpen(false);\r\n await publishPostConfirm();\r\n }}\r\n />;\r\n\r\n const getPreviewOpenAction = (): (() => void) | undefined => {\r\n return previewPost?.previouslyPublishedPostId ?\r\n () => openPostInPortal(tenantId, previewPost.previouslyPublishedPostId) :\r\n undefined;\r\n };\r\n\r\n const getPreviewPublishLabel = (): string | undefined => {\r\n if (!previewPost) return;\r\n\r\n let publishLabel: string | undefined;\r\n\r\n if (isContributor && isSubmission)\r\n publishLabel = CONTRIBUTOR_REPUBLISH_TEXT;\r\n else if (isContributor)\r\n publishLabel = CONTRIBUTOR_PUBLISH_TEXT;\r\n else if (!isContributor && previewPost.isSubmission)\r\n publishLabel = SUBMISSION_PUBLISH_TEXT;\r\n else if (!isContributor && !previewPost.isSubmission)\r\n publishLabel = DFLT_PUBLISH_TEXT;\r\n\r\n return publishLabel;\r\n };\r\n\r\n const contentGuidelinePreview = React.useMemo(() => {\r\n return setOpenContentGuidelines(false)}\r\n isAuthoring={true}\r\n hintType={HintType.Post}\r\n />;\r\n }, [openContentGuidelines]);\r\n\r\n return (\r\n <>\r\n {isLoading || fetchingCustomCss\r\n ? \r\n : \r\n \r\n \r\n : \r\n }\r\n actions={getCommands}\r\n contentGuidelinesOpen={openContentGuidelines}\r\n />\r\n <>\r\n
    \r\n \r\n {\r\n setFullscreenEditor(prev => !prev);\r\n setSettingsDrawerOpen(false);\r\n }}\r\n selectedTab={selectedSettingsTab}\r\n onChangeTab={onChangeSettingsTab}\r\n onToggleSettingsDrawer={onToggleSettingsDrawer}\r\n settingsDrawerOpen={settingsDrawerOpen}\r\n isContributor={isContributor}\r\n analysisIndicator={analysisIndicator}\r\n onChangeAnalysisIndicator={onChangeAnalysisIndicator}\r\n isTenantNotifsEnabled={isTenantNotifsEnabled}\r\n />\r\n \r\n \r\n
    \r\n
    \r\n \r\n
    }\r\n setSuccessMessage(\"\")}\r\n />\r\n tag.id)}\r\n open={oneLastCheckOpen}\r\n publishTime={post.publishTime}\r\n expiryTime={post.expiryTime}\r\n featuredTime={post.featuredTime}\r\n breakingTime={post.breakingTime}\r\n tenantSettings={tenantSettings}\r\n tenantNotificationSettings={notificationSettings}\r\n onClose={() => setOneLastCheckOpen(false)}\r\n onPublish={publishConfirmed}\r\n notifications={post.notifications}\r\n commentsEnabledOnContent={post.commentingEnabled}\r\n reactionsEnabledOnContent={post.reactingEnabled}\r\n commentType={post.commentingType}\r\n isPreviouslyPublished={post.isPreviouslyPublished}\r\n disableKeepEditing={props.publishing}\r\n isContributor={isContributor}\r\n publishBtnName={getPublishBtnName(isContributor, isSubmission, isDraftIdPresent)}\r\n >\r\n
    \r\n {previewPost &&\r\n t.enabled).map((t) => ({ ...t, order: t.sortIndex }))}\r\n reactionsEnabledOnTenant={tenantSettings.reactionsEnabled}\r\n commentsEnabledOnTenant={tenantSettings.commentsEnabled}\r\n post={previewPost}\r\n lcidMappings={props.lcidMappings}\r\n defaultLcid={props.defaultLang}\r\n />}\r\n
    \r\n \r\n setPreviewOpen(false)}\r\n previews={[{ type: PreviewType.Desktop, label: \"DESKTOP\", component: getDesktopPreview() }]}\r\n publishLabel={getPreviewPublishLabel()}\r\n publishAction={publishConfirmed}\r\n isLoading={props.publishing || props.submitting}\r\n disablePublish={!isValid}\r\n openAction={getPreviewOpenAction()}\r\n openLabel=\"VIEW PUBLISHED VERSION\"\r\n />\r\n {getContentAnalysesConfirm()}\r\n {getBackToManagePostsConfirm()}\r\n {getDiscardPostConfirm()}\r\n {getConfirmRepublishCompliancePost()}\r\n {getRejectSubmissionConfirm()}\r\n {contentGuidelinePreview}\r\n \r\n );\r\n};\r\n\r\ninterface RouteParams {\r\n tenant: string;\r\n draftId: string;\r\n}\r\n\r\ninterface ComponentProps {\r\n intl: IntlShape;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n currentUser: state.settings.currentUser,\r\n notificationSettings: state.settings.notificationSettings,\r\n tenantSettings: state.settings.tenantSettings,\r\n post: state.posts.editor.post,\r\n saving: state.posts.editor.saving,\r\n loading: state.posts.editor.fetching,\r\n publishing: state.posts.publishing,\r\n submitting: state.posts.submitting,\r\n changedSinceSaved: state.posts.editor.changedSinceSaved,\r\n publishValidationErrors: Object.keys(state.posts.publishValidationErrors.errors),\r\n lcidMappings: state.resources.lcidMappings,\r\n defaultLang: state.settings.tenantSettings ? state.settings.tenantSettings.defaultLCID : \"en-us\",\r\n isCompliance: !!state.posts.editor.post?.postType && state.posts.editor.post?.postType.toLowerCase() === \"compliance\",\r\n isValid: state.posts.editor.isValid,\r\n tagSettings: state.settings.tagSettings,\r\n tenantId: state.tenant.id,\r\n }),\r\n {\r\n createNew: postActions.createNewDraftPost,\r\n save: postActions.saveDraft,\r\n redirectTo: push,\r\n fetchDraftPost: postActions.fetchDraftPost,\r\n getTagSettings: settingsActions.getTagSettings,\r\n publishPost: postActions.publishPost,\r\n submitPost: postActions.submitPost,\r\n publishSuccess: postActions.publishSuccess,\r\n setChangedSinceSaved: postActions.SetChangedSinceSaved,\r\n setSaving: postActions.SetSaving,\r\n setNewPost: postActions.setNewDraftPost,\r\n updateId: postActions.updateField(\"id\"),\r\n updatePostContent: postActions.updateField(\"translatedContent\"),\r\n saveUserSettings: userActions.saveUserSettings,\r\n setShouldDisplayNav\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default injectIntl(withRouter(connector(PostCreation)));\r\n","import { CONTRIBUTOR_PUBLISH_TEXT, CONTRIBUTOR_REPUBLISH_TEXT, DFLT_PUBLISH_TEXT, SUBMISSION_PUBLISH_TEXT } from \"modules/common/components/authoring/constants\";\r\n\r\n/**\r\n * Computes the name of the label for the publish button. This varies depending on\r\n * the state of the draft and the permissions of the user viewing the draft. \r\n * @param isContributor boolean, if the current user is contributor\r\n * @param isSubmission boolean, if the current draft was marked as a submission\r\n * @param isDraftIdPresent boolean, if the current draft has an id\r\n * @returns string, the label for the publish button in the post creation page\r\n */\r\nexport const getPublishBtnName = (\r\n isContributor: boolean,\r\n isSubmission: boolean,\r\n isDraftIdPresent: boolean | string\r\n ): string => {\r\n if (isContributor){\r\n return (isDraftIdPresent && isSubmission) ? CONTRIBUTOR_REPUBLISH_TEXT : CONTRIBUTOR_PUBLISH_TEXT\r\n } \r\n else {\r\n return isSubmission ? SUBMISSION_PUBLISH_TEXT : DFLT_PUBLISH_TEXT;\r\n }\r\n};\r\n","import React from \"react\";\r\nimport { Typography } from \"@mui/material\";\r\n\r\nimport { AuthoringAppBarAction, AuthoringAppBarActions, IAuthoringAppBarAction } from \"modules/common/components/authoring/authoringAppBarActions\";\r\nimport { useContentGuidelines } from \"modules/common/hooks/data/useContentGuidelines\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { DRAFT_CHANGED_BTN_TEXT, DRAFT_MOVE_BTN_TEXT, DRAFT_SAVE_BTN_TEXT } from \"../../../../common/components/authoring/constants\";\r\nimport { getPublishBtnName } from \"../../../../common/components/authoring/utils\";\r\n\r\nimport \"../../../../common/components/authoring/styles/authoringAppBar.sass\";\r\n\r\ninterface IPostAuthoringActionsProps {\r\n appBarState: PostAppBarState;\r\n draftState: PostDraftActionState;\r\n actions: PostAppBarActions;\r\n}\r\n\r\ninterface PostAppBarState {\r\n isSubmission: boolean;\r\n isContributor: boolean;\r\n isDraftIdPresent: boolean | string;\r\n}\r\n\r\ninterface PostDraftActionState {\r\n isValidDraft: boolean;\r\n isSettingsDrawerOpen: boolean;\r\n}\r\n\r\ninterface PostAppBarActions {\r\n discardPost: () => void;\r\n previewPost: () => void;\r\n backToManagePosts: () => void;\r\n toggleSettingsDrawer: (open: boolean | undefined) => void;\r\n publishPost: () => Promise;\r\n savePost: (draftSaveOnly?: boolean, preview?: boolean, redirectTo?: string, isSubmission?: boolean) => Promise;\r\n rejectSubmission: () => void;\r\n openGuidelines: () => void;\r\n}\r\n\r\nconst PostAuthoringActions: React.FunctionComponent = (props) => {\r\n const {\r\n appBarState: state,\r\n draftState,\r\n actions,\r\n changedSinceSaved,\r\n } = props;\r\n const isSubmissionMode = (state.isContributor && !state.isDraftIdPresent) || state.isSubmission;\r\n const isReviewMode = state.isSubmission && !state.isContributor;\r\n\r\n const { isEmpty: isGuidelineEmpty } = useContentGuidelines();\r\n\r\n const getSaveLabel = () => {\r\n if (!state.isSubmission) return DRAFT_SAVE_BTN_TEXT;\r\n return state.isContributor ? DRAFT_MOVE_BTN_TEXT : DRAFT_CHANGED_BTN_TEXT;\r\n }\r\n\r\n const onSavePost = async () => {\r\n isReviewMode\r\n ? await actions.savePost(true, false, \"\", true)\r\n : await actions.savePost(true, false);\r\n }\r\n\r\n const allActions: Record = {\r\n [AuthoringAppBarAction.Discard]: {\r\n onClick: actions.discardPost,\r\n disabled: !state.isDraftIdPresent\r\n },\r\n [AuthoringAppBarAction.Preview]: {\r\n onClick: actions.previewPost,\r\n disabled: false\r\n },\r\n [AuthoringAppBarAction.Back]: {\r\n onClick: actions.backToManagePosts,\r\n disabled: false\r\n },\r\n [AuthoringAppBarAction.ToggleSettingsPanel]: {\r\n onClick: () => actions.toggleSettingsDrawer(undefined),\r\n disabled: !draftState.isSettingsDrawerOpen,\r\n label: \"Post settings\"\r\n },\r\n [AuthoringAppBarAction.Publish]: {\r\n onClick: async () => await actions.publishPost(),\r\n disabled: !draftState.isValidDraft,\r\n label: getPublishBtnName(state.isContributor, state.isSubmission, state.isDraftIdPresent)\r\n },\r\n [AuthoringAppBarAction.Save]: {\r\n onClick: onSavePost,\r\n disabled: !changedSinceSaved,\r\n label: getSaveLabel()\r\n },\r\n [AuthoringAppBarAction.Reject]: {\r\n onClick: actions.rejectSubmission,\r\n disabled: false,\r\n },\r\n [AuthoringAppBarAction.OpenGuidelines]: {\r\n onClick: actions.openGuidelines,\r\n disabled: isGuidelineEmpty\r\n }\r\n };\r\n\r\n const getActions = () => {\r\n if (!isReviewMode) {\r\n allActions[AuthoringAppBarAction.Reject] = undefined;\r\n }\r\n\r\n if (isGuidelineEmpty) allActions[AuthoringAppBarAction.OpenGuidelines] = undefined;\r\n\r\n return allActions;\r\n };\r\n\r\n return (\r\n \r\n {\r\n isSubmissionMode &&\r\n
    \r\n \r\n \r\n {state.isContributor ? 'Needs Review' : 'Submission'}\r\n \r\n
    \r\n }\r\n \r\n
    \r\n );\r\n};\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IPostAuthoringActionsProps) => ({\r\n ...ownProps,\r\n changedSinceSaved: state.posts.editor.changedSinceSaved\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(PostAuthoringActions);\r\n","import MenuItem from \"@mui/material/MenuItem\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport ConfirmDialog from \"modules/common/components/dialogs/confirmDialog\";\r\nimport React, { useEffect, useState } from \"react\";\r\n\r\nconst STRD_REJECTION_TEXT = \"You’re about to reject this submission and return it to drafts. \"\r\n + \"This will also notify the original author. \"\r\n + \"Leave any comments or feedback below.\";\r\n\r\nconst SAVE_CHANGES_TEXT = \"You also made changes to this submission. \"\r\n + \"Would you like to save your changes before proceeding?\";\r\n\r\nconst DEFAULT_COMMENT = \"Enter comments or feedback (Optional)\";\r\n\r\nconst NUM_TEXT_ROWS = 8;\r\n\r\nconst saveChangesOptions = [\r\n \"Yes, save my changes before rejecting and returning it\",\r\n \"No, discard my changes\"\r\n];\r\n\r\nconst RejectSubmissionDialog: React.FunctionComponent = (props) => {\r\n const [saveOption, setSaveOption] = useState(undefined);\r\n const [comments, setComments] = useState(undefined);\r\n\r\n useEffect(() => {\r\n if (props.unsavedChanges) setSaveOption(0); // default\r\n }, [props.unsavedChanges])\r\n\r\n const onClose = () => props.setOpen(false);\r\n\r\n const isSaving = () => saveOption === 0;\r\n\r\n const selectOption = (ev: React.ChangeEvent) => {\r\n const newValue = parseInt(ev.target.value);\r\n setSaveOption(newValue);\r\n };\r\n\r\n const changeComments = (ev: React.ChangeEvent) => setComments(ev.target.value)\r\n\r\n const onReject = async () => {\r\n onClose();\r\n\r\n if (isSaving()) await props.saveProgress();\r\n \r\n await props.rejectSubmission(comments);\r\n };\r\n\r\n const getSaveChangesSection = () => {\r\n return (\r\n \r\n {SAVE_CHANGES_TEXT}\r\n\r\n
    \r\n
    \r\n\r\n \r\n {saveChangesOptions.map((option, n) => (\r\n {option} \r\n ))}\r\n \r\n
    \r\n );\r\n };\r\n\r\n return (\r\n \r\n {STRD_REJECTION_TEXT}\r\n\r\n
    \r\n
    \r\n\r\n \r\n\r\n
    \r\n
    \r\n\r\n {props.unsavedChanges && getSaveChangesSection()}\r\n \r\n );\r\n};\r\n\r\ninterface IRejectSubmissionDialogProps {\r\n open: boolean;\r\n unsavedChanges: boolean;\r\n setOpen: (open: boolean) => void;\r\n rejectSubmission: (comments : string | undefined) => Promise;\r\n saveProgress: () => Promise;\r\n}\r\n\r\nexport default RejectSubmissionDialog;","import { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { useEffect, useState } from \"react\"\r\nimport { useSelector } from \"react-redux\";\r\n\r\ntype UseOpenContentGuidelinesReturnType = {\r\n openContentGuidelines: boolean;\r\n setOpenContentGuidelines: (value: boolean) => void;\r\n}\r\n\r\nexport const useOpenContentGuidelines = (): UseOpenContentGuidelinesReturnType => {\r\n const [openContentGuidelines, setOpenContentGuidelines] = useState(false);\r\n const [isFirstOpenGuidelines, setIsFirstOpenGuidelines] = useState(true);\r\n\r\n const { guidelines, isEmpty } = useSelector((state: GlobalApplicationState) => state.guidelines);\r\n const { hideContentGuidelines } = useSelector((state: GlobalApplicationState) => state.settings.currentUser);\r\n \r\n useEffect(() => {\r\n if (guidelines && !isEmpty && !hideContentGuidelines && isFirstOpenGuidelines) {\r\n setOpenContentGuidelines(true);\r\n setIsFirstOpenGuidelines(false);\r\n }\r\n }, [guidelines, isEmpty, hideContentGuidelines, isFirstOpenGuidelines]);\r\n\r\n return {\r\n openContentGuidelines,\r\n setOpenContentGuidelines\r\n };\r\n}","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport { EventFilterValues, EventListingPage } from \"../../models\";\r\n\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport EventList from \"./eventList\";\r\n\r\nimport Tabs from \"pages/common/tabs\";\r\nimport { SortStyle } from \"utils/managementUtils\";\r\nimport { tagsApi } from \"api/instances\";\r\nimport { TenantSettingsTagGroup } from \"modules/settings\";\r\nimport SuccessSnackbar from \"modules/common/components/snackbars/successSnackbar\";\r\nimport CreatedByFilter, { CreatedBySelectValues } from \"modules/common/components/authoring/createdByFilter\";\r\nimport { ContentType } from \"modules/common/models\";\r\nimport PublishedEventDialog from \"./publishedEventDialog\";\r\nimport { DraftAction } from \"modules/common/components/authoring/models\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport { getHighestRole } from \"utils/userRoleUtils\";\r\n\r\nenum TAB_IDS {\r\n DRAFTS,\r\n SUBMISSIONS,\r\n SCHEDULED,\r\n PUBLISHED,\r\n ALL,\r\n}\r\n\r\nclass EventListing extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n selectedTab: 0,\r\n showFilters: false,\r\n availableTopics: [],\r\n showMyEventsOnly: false\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n if (this.props.isInitialLoad || this.props.shouldFetch) {\r\n this.fetchLists();\r\n this.getTags();\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.shouldFetch && (this.props.shouldFetch !== prevProps.shouldFetch)) {\r\n this.fetchLists();\r\n }\r\n\r\n if (this.props.successMessage.action === DraftAction.Submit && this.state.selectedTab !== TAB_IDS.SUBMISSIONS)\r\n this.onSelectTab(TAB_IDS.SUBMISSIONS)\r\n }\r\n\r\n public componentWillUnmount() {\r\n this.props.setToDefaultState();\r\n }\r\n\r\n public render() {\r\n const { selectedTab } = this.state;\r\n\r\n return (\r\n \r\n
    \r\n \r\n \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n {this.props.showPublishDialog && }\r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n\r\n private onSelectCreatedBy = (selection: CreatedBySelectValues) => this.setState({showMyEventsOnly: selection === CreatedBySelectValues.VIEW_MY});\r\n\r\n private fetchLists = () => {\r\n this.fetchAllEventList(1, { sortType: SortStyle.startDesc });\r\n this.fetchDrafts(1, { sortType: SortStyle.modifiedDesc });\r\n this.fetchSubmissions(1, { sortType: SortStyle.startDesc });\r\n this.fetchPublished(1, { sortType: SortStyle.startDesc });\r\n this.fetchScheduled(1, { sortType: SortStyle.startDesc });\r\n this.props.clearShouldFetch();\r\n }\r\n\r\n private fetchDrafts = (pageNumber: number, filters: Partial, pageAmount?: number) => {\r\n !this.props.drafts.isFetching &&\r\n this.props.getDrafts(pageNumber, filters, pageAmount);\r\n }\r\n\r\n private fetchSubmissions = (pageNumber: number, filters: Partial, pageAmount?: number) => {\r\n !this.props.submissions.isFetching &&\r\n this.props.getSubmissions(pageNumber, filters, pageAmount);\r\n }\r\n\r\n private fetchPublished = (pageNumber: number, filters: Partial, pageAmount?: number) => {\r\n !this.props.published.isFetching &&\r\n this.props.getPublished(pageNumber, filters, pageAmount);\r\n }\r\n\r\n private fetchScheduled = (pageNumber: number, filters: Partial, pageAmount?: number) => {\r\n !this.props.scheduled.isFetching &&\r\n this.props.getScheduled(pageNumber, filters, pageAmount);\r\n }\r\n\r\n private fetchAllEventList = (pageNumber: number, filters: Partial, pageAmount?: number) => {\r\n !this.props.allEventsList.isFetching &&\r\n this.props.getAllEvents(pageNumber, filters, pageAmount);\r\n }\r\n\r\n private getTabLabel = (label: string, page: EventListingPage): string => {\r\n if (!!page.currentPage)\r\n return `${label} (${page.totalEvents})`;\r\n return label;\r\n }\r\n\r\n private onSelectTab = (tabIndex: number) => {\r\n this.setState({ ...this.state, selectedTab: tabIndex });\r\n }\r\n\r\n private getTags = async () => {\r\n let tagsToSet: TenantSettingsTagGroup[] = [];\r\n\r\n try {\r\n tagsToSet = await tagsApi.getUserTags();\r\n } catch (err) {\r\n tagsToSet = [];\r\n } finally {\r\n this.setState({ availableTopics: tagsToSet });\r\n }\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\ninterface ComponentState {\r\n selectedTab: number;\r\n showFilters: boolean;\r\n availableTopics: TenantSettingsTagGroup[];\r\n showMyEventsOnly: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n drafts: state.events.drafts,\r\n submissions: state.events.submissions,\r\n allEventsList: state.events.allEventsList,\r\n published: state.events.published,\r\n scheduled: state.events.scheduled,\r\n errorMessage: state.events.errorMessage,\r\n successMessage: state.events.successMessage,\r\n isDeleting: state.events.isDeleting,\r\n isFetching: state.events.isFetching,\r\n isInitialLoad: state.events.isInitialLoad,\r\n isSaving: state.events.isSaving,\r\n showPublishDialog: state.events.shouldShowDialog,\r\n shouldFetch: state.events.shouldFetch,\r\n tenantSettings: state.settings.tenantSettings,\r\n tenant: state.tenant.id,\r\n user: state.settings.currentUser\r\n }),\r\n {\r\n clearErrorMessage: actions.clearErrorMessage,\r\n clearSuccessMessage: actions.clearSuccessMessage,\r\n clearShouldFetch: actions.clearShouldFetch,\r\n getAllEvents: actions.getAllEvents,\r\n getDrafts: actions.getDrafts,\r\n getSubmissions: actions.getSubmissions,\r\n getPublished: actions.getPublished,\r\n getScheduled: actions.getScheduled,\r\n redirectTo: push,\r\n setToDefaultState: actions.setEventsFeedToDefault\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(EventListing);\r\n","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\n\r\n\r\nconst NewEvent: React.FunctionComponent = props => {\r\n return (\r\n }\r\n onClick={() => props.redirectTo(\"/\" + props.tenant + \"/admin/events/edit/new\")\r\n }>\r\n New Event\r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenant: state.tenant.id\r\n }),\r\n {\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(NewEvent);","import * as React from \"react\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogContentText from \"@mui/material/DialogContentText\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\n\r\n\r\nclass DeleteEvent extends React.Component {\r\n public render() {\r\n return (\r\n \r\n {this.props.multiple ? \"Delete events\" : \"Delete event\"}\r\n \r\n {this.props.multiple ? \"Are you sure you want to delete these events?\" : \"Are you sure you want to delete this event?\"}\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private onConfirm = () => {\r\n this.props.onConfirm();\r\n }\r\n\r\n private onCancel = () => {\r\n this.props.onCancel();\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n multiple?: boolean;\r\n onConfirm: () => void;\r\n onCancel: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n}\r\n\r\nexport default DeleteEvent;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { EventFilterValues } from \"../../models\";\r\n\r\nimport AuthoringFilter from \"modules/common/components/filters/authoringFilter\";\r\nimport AuthoringSearch from \"modules/common/components/filters/authoringSearch\";\r\nimport FilterContainer from \"modules/common/components/filters/filterContainer\";\r\nimport FilterDropdown from \"modules/common/components/filters/filterDropdown\";\r\n\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Chip from \"@mui/material/Chip\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport { TenantSettingsTagGroup } from \"modules/settings\";\r\nimport { DatePicker } from \"@mui/x-date-pickers/DatePicker\";\r\nimport { PickerLocalization } from \"modules/common/components/pickerLocalization\";\r\n\r\nimport moment from \"moment\";\r\nimport { SelectOption } from \"modules/common/models\";\r\nimport TopicDropdown from \"modules/common/components/topicDropdown\";\r\nimport { availableContentStates, ContentState, contentStateLabels } from \"utils/managementUtils\";\r\nimport { ListItemButton } from \"@mui/material\";\r\n\r\n\r\nconst availableEventTypes: SelectOption[] = [\r\n { key: \"standard\", text: \"Standard\", type: \"item\" },\r\n { key: \"mandatory\", text: \"Mandatory\", type: \"item\" },\r\n { key: \"informational\", text: \"Informational\", type: \"item\" }\r\n];\r\n\r\nclass EventFilters extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n canSearch: !this.hasNoCurrentFilters(),\r\n lcidToSearch: props.filters.lcidToSearch || \"\",\r\n textToSearch: props.filters.textToSearch || \"\"\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.filters.lcidToSearch !== prevProps.filters.lcidToSearch)\r\n this.setState({ lcidToSearch: this.props.filters.lcidToSearch || \"\" });\r\n\r\n if (this.props.filters.textToSearch !== prevProps.filters.textToSearch)\r\n this.setState({ textToSearch: this.props.filters.textToSearch || \"\" });\r\n }\r\n\r\n private getFilterByState = (): JSX.Element => {\r\n return \r\n \r\n {availableContentStates.map((availableEventState) => (\r\n this.onChangeEventStates(availableEventState)}>\r\n \r\n \r\n \r\n \r\n \r\n )\r\n )}\r\n \r\n \r\n }\r\n\r\n private getFilterByDateTime = (): JSX.Element => {\r\n const { filters } = this.props;\r\n const label = this.props.pageId === \"submissions\"\r\n ? \"Submitted between\"\r\n : \"Published between\"\r\n\r\n return \r\n \r\n
    \r\n
    \r\n
    From
    \r\n \r\n
    \r\n
    \r\n
    To
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n };\r\n\r\n private getFilterByType = (): JSX.Element => \r\n \r\n {availableEventTypes.map((availableEventType) => (\r\n this.onChangeEventTypes(availableEventType.key)}>\r\n \r\n selectedEventType === availableEventType.key)}\r\n />\r\n \r\n \r\n \r\n )\r\n )}\r\n \r\n \r\n\r\n public render() {\r\n const { filters } = this.props;\r\n const tagSelected = (filters.tags?.length ?? [].length) > 0;\r\n\r\n return (\r\n \r\n \r\n {this.props.pageId === \"all\" && this.getFilterByState()}\r\n\r\n {this.props.pageId !== \"drafts\" && this.getFilterByDateTime()}\r\n\r\n \r\n\r\n {\r\n this.props.pageId !== \"drafts\"\r\n && this.props.pageId !== \"submissions\"\r\n && this.getFilterByType()\r\n }\r\n
    \r\n }\r\n onChangeTextToSearch={this.onChangeTextToSearch}\r\n onUpdateTextToSearch={this.onUpdateTextToSearch}\r\n />\r\n
    \r\n }\r\n filterCommands={\r\n \r\n }\r\n filterSelection={this.getFilterSelection()}\r\n />\r\n );\r\n }\r\n\r\n private onChangeFromDate = (date) => {\r\n let dateToUse = new Date(date);\r\n let timeNow = new Date();\r\n\r\n if (this.props.onlyNewer) {\r\n if (moment(date).dayOfYear() === moment().dayOfYear()) {\r\n dateToUse.setHours(timeNow.getHours(), timeNow.getMinutes(), timeNow.getSeconds());\r\n }\r\n }\r\n\r\n this.onChangeFilters({ newerThan: moment(date).toISOString() });\r\n }\r\n\r\n private onChangeToDate = (date) => {\r\n let dateToUse = new Date(date);\r\n let timeNow = new Date();\r\n\r\n if (this.props.onlyOlder) {\r\n if (moment(date).dayOfYear() === moment().dayOfYear()) {\r\n dateToUse.setHours(timeNow.getHours(), timeNow.getMinutes(), timeNow.getSeconds());\r\n }\r\n }\r\n\r\n this.onChangeFilters({ olderThan: moment(date).toISOString() });\r\n }\r\n\r\n private getFilterSelection = (): JSX.Element | undefined => {\r\n const { filters } = this.props;\r\n\r\n if (!filters.textToSearch && !filters.tags!.length && !filters.eventTypes!.length && !filters.newerThan && !filters.olderThan && !filters.eventStates!.length)\r\n return undefined;\r\n\r\n const availableTags: SelectOption[] = this.getAvailableTags();\r\n\r\n return (\r\n \r\n {!!filters.textToSearch &&\r\n }\r\n />\r\n }\r\n {(!!filters.newerThan || !!filters.olderThan) &&\r\n }\r\n />\r\n }\r\n {filters.eventStates!.map((selectedEventState) =>\r\n this.onClearEventState(selectedEventState)}\r\n deleteIcon={}\r\n />\r\n )}\r\n {filters.tags!.map((selectedTag) =>\r\n tag.key === selectedTag)!.text}\r\n onDelete={() => this.onClearTag(selectedTag)}\r\n deleteIcon={}\r\n />\r\n )}\r\n {filters.eventTypes!.map((selectedEventType) =>\r\n eventType.key === selectedEventType)!.text}\r\n onDelete={() => this.onClearEventType(selectedEventType)}\r\n deleteIcon={}\r\n />\r\n )}\r\n \r\n );\r\n }\r\n\r\n private getAvailableTags = (): SelectOption[] => {\r\n if (!this.props.tenantSettings)\r\n return [];\r\n\r\n let availableTags: SelectOption[] = [];\r\n this.props.availableTopics.map((tagGroup) => {\r\n if (!!tagGroup.tags.length && !tagGroup.deleted && !tagGroup.disabled) {\r\n availableTags.push({ key: tagGroup.id, text: tagGroup.name, type: \"header\" });\r\n tagGroup.tags.map((tag) => {\r\n if (!tag.deleted && !tag.disabled)\r\n availableTags.push({ key: tag.id, text: tag.name, type: \"item\" });\r\n return tag;\r\n });\r\n }\r\n return tagGroup;\r\n });\r\n return availableTags;\r\n }\r\n\r\n\r\n private onChangeFilters = (value: Partial) => {\r\n this.props.onChangeFilters({ ...this.props.filters, lcidToSearch: this.state.lcidToSearch, textToSearch: this.state.textToSearch, ...value });\r\n this.setCanSearch();\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.clearCanSearch();\r\n this.props.onClearFilters();\r\n }\r\n\r\n\r\n private onChangeEventTypes = (currentEventType: string) => {\r\n const hasSelectedEventType: boolean = !!this.props.filters.eventTypes!.find((selectedEventType) => selectedEventType === currentEventType);\r\n if (hasSelectedEventType)\r\n this.onChangeFilters({ eventTypes: this.props.filters.eventTypes!.filter((selectedEventType) => selectedEventType !== currentEventType) });\r\n else\r\n this.onChangeFilters({ eventTypes: this.props.filters.eventTypes!.concat([currentEventType]) });\r\n }\r\n\r\n private onChangeEventStates = (currentEventState: ContentState) => {\r\n const hasSelectedEventState: boolean = this.props.filters.eventStates?.includes(currentEventState) ?? false;\r\n\r\n if (hasSelectedEventState)\r\n this.onChangeFilters({ eventStates: this.props.filters.eventStates?.filter((selectedEventState) => selectedEventState !== currentEventState) });\r\n else\r\n this.onChangeFilters({ eventStates: this.props.filters.eventStates?.concat([currentEventState]) });\r\n }\r\n\r\n private onChangeLcidToSearch = (lcidToSearch: string) => {\r\n this.onChangeFilters({ lcidToSearch });\r\n }\r\n\r\n private onChangeTags = (currentTag: string) => {\r\n const hasSelectedTag: boolean = !!this.props.filters.tags!.find((selectedTag) => selectedTag === currentTag);\r\n if (hasSelectedTag)\r\n this.onChangeFilters({ tags: this.props.filters.tags!.filter((selectedTag) => selectedTag !== currentTag) });\r\n else\r\n this.onChangeFilters({ tags: this.props.filters.tags!.concat([currentTag]) });\r\n }\r\n\r\n private onChangeTextToSearch = () => {\r\n this.onChangeFilters({ textToSearch: this.state.textToSearch });\r\n }\r\n\r\n private onClearEventType = (eventType: string) => {\r\n this.onChangeFilters({ eventTypes: this.props.filters.eventTypes!.filter((selectedEventType) => selectedEventType !== eventType) });\r\n }\r\n\r\n private onClearEventState = (eventState: ContentState) => {\r\n this.onChangeFilters({ eventStates: this.props.filters.eventStates!.filter((selectedEventState) => selectedEventState !== eventState) });\r\n }\r\n\r\n private onClearTag = (tag: string) => {\r\n this.onChangeFilters({ tags: this.props.filters.tags!.filter((selectedTag) => selectedTag !== tag) });\r\n }\r\n\r\n private onClearPublishedTime = () => {\r\n this.onChangeFilters({ newerThan: \"\", olderThan: \"\" });\r\n }\r\n\r\n private onClearTextToSearch = () => {\r\n this.onChangeFilters({ textToSearch: \"\" });\r\n }\r\n\r\n private onUpdateLcidToSearch = (event) => {\r\n this.setState({ lcidToSearch: event.target.value });\r\n if (!!this.props.filters.textToSearch)\r\n this.onChangeLcidToSearch(event.target.value);\r\n }\r\n\r\n private onUpdateTextToSearch = (event) => {\r\n this.setState({ textToSearch: event.target.value });\r\n if (event.target.value && event.target.value !== \"\") {\r\n this.setCanSearch();\r\n }\r\n else if (this.hasNoCurrentFilters()) {\r\n this.clearCanSearch();\r\n }\r\n }\r\n\r\n private hasNoCurrentFilters = () => {\r\n let filters = this.props.filters;\r\n\r\n return (!filters.tags || filters.tags.length === 0)\r\n && filters.textToSearch === \"\"\r\n && (!filters.eventTypes || filters.eventTypes.length === 0)\r\n && !filters.newerThan && !filters.olderThan\r\n && filters.eventStates!.length === 0;\r\n }\r\n\r\n private clearCanSearch = () => {\r\n this.setState({ canSearch: false });\r\n }\r\n\r\n private setCanSearch = () => {\r\n this.setState({ canSearch: true });\r\n }\r\n\r\n private checkGroupSelected = (tagGroup: TenantSettingsTagGroup) => \r\n tagGroup.tags\r\n .every(tag => this.props.filters.tags!.includes(tag.id))\r\n\r\n private handleTagGroupClick = (tagGroup: TenantSettingsTagGroup) => {\r\n let isCurrentlyChecked = this.checkGroupSelected(tagGroup);\r\n\r\n if (isCurrentlyChecked) {\r\n this.deselectTagGroup(tagGroup);\r\n }\r\n else {\r\n this.selectTagGroup(tagGroup);\r\n }\r\n }\r\n\r\n private selectTagGroup = (tagGroup: TenantSettingsTagGroup) => {\r\n let currentTags = this.props.filters.tags ?? [];\r\n\r\n tagGroup.tags.forEach(tag => {\r\n if (!currentTags.includes(tag.id)) {\r\n currentTags.push(tag.id);\r\n }\r\n })\r\n\r\n let newFilters = this.props.filters;\r\n newFilters.tags = currentTags;\r\n this.onChangeFilters(newFilters);\r\n }\r\n\r\n private deselectTagGroup = (tagGroup: TenantSettingsTagGroup) => {\r\n let currentTags = this.props.filters.tags ?? [];\r\n let tagsToRemove = tagGroup.tags.map(t => t.id);\r\n\r\n currentTags = currentTags.filter(currentTag => !tagsToRemove.includes(currentTag));\r\n\r\n let newFilters = this.props.filters;\r\n newFilters.tags = currentTags;\r\n this.onChangeFilters(newFilters);\r\n }\r\n\r\n private onHandleAllTags = (tagSelected: boolean) => {\r\n let newFilters = this.props.filters;\r\n\r\n if (tagSelected) {\r\n newFilters.tags = [];\r\n this.onChangeFilters(newFilters);\r\n }\r\n else {\r\n let currentTags = this.props.filters.tags ?? [];\r\n let tagGroups = this.props.availableTopics;\r\n\r\n tagGroups.forEach(tagGroup => {\r\n tagGroup.tags.forEach(tag => {\r\n if (!currentTags.includes(tag.id)) {\r\n currentTags.push(tag.id);\r\n }\r\n });\r\n });\r\n newFilters.tags = currentTags;\r\n }\r\n\r\n this.onChangeFilters(newFilters);\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n filters: Partial;\r\n onChangeFilters: (filters: Partial) => void;\r\n onClearFilters: () => void;\r\n pageId: string;\r\n availableTopics: TenantSettingsTagGroup[];\r\n onlyOlder?: boolean;\r\n onlyNewer?: boolean;\r\n}\r\n\r\ninterface ComponentState {\r\n canSearch: boolean;\r\n lcidToSearch: string;\r\n textToSearch: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantSettings: state.settings.tenantSettings\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(EventFilters);\r\n","import * as React from \"react\";\r\n\r\nimport moment from \"moment\";\r\n\r\n\r\nconst FullStartDate: React.FunctionComponent = props => {\r\n moment.locale(\"en\");\r\n \r\n const day: string = moment(props.eventStartTime).format(\"MMM D\");\r\n const isAllDay: boolean = props.eventStartTime === props.eventEndTime;\r\n const time: string = isAllDay\r\n ? `, All Day`\r\n : `, ${moment(props.eventStartTime).format(\"h:mmA\")}`;\r\n const startDate: string = day + time;\r\n\r\n return (\r\n
    \r\n {startDate}\r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n eventStartTime: string;\r\n eventEndTime: string;\r\n}\r\n\r\nexport default FullStartDate;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\n\r\nimport \"./typeBanner.sass\";\r\nimport FullStartDate from \"modules/events/components/event-feed/components/dates/FullStartDate\";\r\n\r\n\r\nconst icoRestricted: string = \"/images/icons/restricted_ico.svg\";\r\n\r\n\r\ninterface IBanner {\r\n color: string;\r\n icon: string;\r\n text: string;\r\n description: string;\r\n urlDescription?: string;\r\n}\r\n\r\ntype BannerTypes = \"restricted\";\r\n\r\ntype Banners = { [bannerType in BannerTypes]: IBanner; };\r\n\r\nconst BannerText: React.FunctionComponent<{full?: boolean, expanded: boolean, onClick: (e: any) => void, style?: React.CSSProperties}> = (props) => {\r\n return (\r\n
    \r\n
    \r\n {props.children}\r\n {props.full &&\r\n \r\n }\r\n
    \r\n
    \r\n );\r\n};\r\n\r\nconst ExpandIcon: React.FunctionComponent<{full?: boolean, expanded: boolean, onClick: (e: any) => void, style?: React.CSSProperties}> = (props) => {\r\n return (\r\n
    \r\n {props.children}\r\n {props.full &&\r\n \r\n }\r\n
    \r\n );\r\n};\r\n\r\nconst TypeBanner: React.FunctionComponent<{className?: string}> = (props) => {\r\n return (\r\n
    \r\n {props.children}\r\n
    \r\n );\r\n};\r\n\r\n\r\nconst Banner: React.FunctionComponent<{banner: IBanner, full?: boolean, description?: JSX.Element, expanded: boolean, onClick: (e: any) => void, className?: string}> = (props) => {\r\n const { banner, full, description, expanded, onClick, className } = props;\r\n\r\n return (\r\n \r\n \r\n \"event\r\n \r\n \r\n
    \r\n {!full\r\n ? banner.text\r\n : description || banner.description\r\n }\r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\n\r\nclass EventTypeBanner extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n expandRestricted: false\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n this.onSetBannerExpansions();\r\n }\r\n\r\n public render() {\r\n if (!this.props.settings) return (null);\r\n\r\n const { settings } = this.props;\r\n const { specialtyPostColors } = settings;\r\n\r\n const banners: Banners = {\r\n restricted: {\r\n color: (specialtyPostColors && specialtyPostColors.restricted) || \"#b72026\",\r\n icon: icoRestricted,\r\n text: this.onGetTranslatedText(\"restrictedContent\") || \"Restricted\",\r\n description: this.onGetTranslatedText(\"restrictedBannerDescription\") || \"This event is exclusive to specific audiences.\"\r\n }\r\n };\r\n\r\n return (\r\n
    \r\n {this.getRestrictedBanner(banners.restricted)}\r\n {this.getStartDate()}\r\n
    \r\n );\r\n }\r\n\r\n private getStartDate = (): JSX.Element => {\r\n const times = this.props.eventTime;\r\n if (!times) return <>;\r\n\r\n return
    \r\n {\"Starts\"} \r\n
    ;\r\n }\r\n\r\n private getRestrictedBanner = (banner: IBanner) => {\r\n if (!this.props.isRestricted || !this.props.settings.bannerVisibility.showRestrictedBanner) {\r\n return (null);\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n private onGetTranslatedText = (field: string, defaultLCID: string = \"en-us\") => {\r\n const { settings, lcid } = this.props;\r\n const { translatedContent } = settings;\r\n\r\n if (!translatedContent || (!translatedContent[lcid] && !translatedContent[defaultLCID]))\r\n return \"\";\r\n \r\n return translatedContent[lcid] ? translatedContent[lcid][field] : translatedContent[defaultLCID][field];\r\n }\r\n\r\n private onSetBannerExpansions = () => {\r\n const expandRestricted: boolean = this.props.settings.bannerVisibility.showRestrictedBanner && !!this.props.isRestricted;\r\n\r\n this.setState({\r\n expandRestricted\r\n });\r\n }\r\n\r\n private onToggleExpandRestricted = (e: any) => {\r\n e.stopPropagation();\r\n if (this.state.expandRestricted)\r\n this.setState({ expandRestricted: false });\r\n else\r\n this.setState({\r\n expandRestricted: true\r\n });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n lcid: string;\r\n eventType: string;\r\n full?: boolean;\r\n isRestricted?: boolean;\r\n eventTime?: IEventDateTime;\r\n}\r\n\r\ninterface IEventDateTime {\r\n startTime: string;\r\n endTime: string;\r\n}\r\n\r\ninterface ComponentState {\r\n expandRestricted: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n lcidMappings: state.resources.lcidMappings,\r\n settings: !!state.settings.clientSettings.id ? state.settings.clientSettings : state.settings.tenantSettings // Allow preview from authoring\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\nexport default connector(EventTypeBanner);","import * as React from \"react\";\r\nimport moment from \"moment\";\r\n\r\nimport { Paper } from \"@mui/material\";\r\nimport { Theme } from \"@mui/material/styles\";\r\nimport { createStyles } from \"@mui/styles\";\r\nimport { makeStyles } from \"@mui/styles\";\r\n\r\nimport { EventTimes } from \"../../models\";\r\n\r\nimport \"../../styles/dateBlock.sass\";\r\nimport { useDefaultLocale } from \"modules/common/hooks/useDefaultLocale\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n dateBlock: {\r\n backgroundColor: theme.palette.background.default,\r\n },\r\n })\r\n);\r\n\r\nconst DateBlock: React.FunctionComponent = (props) => {\r\n const classes = useStyles();\r\n\r\n const { monthFormat = \"MMMM\", showMultiBlocks = true } = props;\r\n\r\n const eventStartTimes: string[] = !!props.eventTimes ? Object.keys(props.eventTimes) : [];\r\n const localDate = props.isAllDayEvent ? moment.utc(props.eventStartTime).startOf(\"day\") : moment(props.eventStartTime);\r\n\r\n useDefaultLocale();\r\n\r\n const getNextEventStartTime = (eventStartTimes: string[]): string => {\r\n let eventStartTime: string = eventStartTimes[0];\r\n\r\n if (moment(eventStartTime) < moment()) {\r\n for (let i = 1; i < eventStartTimes.length; i++) {\r\n if (moment(eventStartTimes[i]) >= moment()) {\r\n eventStartTime = eventStartTimes[i];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return eventStartTime;\r\n };\r\n\r\n const renderDateBlock = (localDate: moment.Moment, eventStartTime: string, eventStartTimes: string[], isAllDayEvent: boolean) => {\r\n return (\r\n \r\n \r\n
    {moment(localDate).format(\"D\")}
    \r\n
    {moment(localDate).format(monthFormat)}
    \r\n
    \r\n {!props.eventTimes![eventStartTime] ||\r\n eventStartTime === props.eventTimes![eventStartTime] ||\r\n isAllDayEvent === true\r\n ? `All Day`\r\n : moment(eventStartTime).format(\"h:mmA\")}\r\n
    \r\n
    \r\n {showMultiBlocks &&\r\n eventStartTimes\r\n .slice(1, 3)\r\n .map((_, index) => (\r\n \r\n ))}\r\n
    \r\n );\r\n };\r\n\r\n if (eventStartTimes.length > 1) {\r\n const eventStartTime = getNextEventStartTime(eventStartTimes);\r\n return renderDateBlock(localDate, eventStartTime, eventStartTimes, props.isAllDayEvent!);\r\n }\r\n\r\n return (\r\n \r\n
    {localDate.format(\"D\")}
    \r\n
    {localDate.format(monthFormat)}
    \r\n
    \r\n {!props.eventEndTime || props.eventStartTime === props.eventEndTime || props.isAllDayEvent === true\r\n ? `All Day`\r\n : moment(props.eventStartTime).format(\"h:mmA\")}\r\n
    \r\n
    \r\n );\r\n};\r\n\r\nexport interface IDateBlockProps {\r\n eventStartTime: string;\r\n eventEndTime: string | null;\r\n eventTimes?: EventTimes;\r\n isAllDayEvent?: boolean;\r\n monthFormat?: \"M\" | \"Mo\" | \"MM\" | \"MMM\" | \"MMMM\";\r\n showMultiBlocks?: boolean;\r\n}\r\n\r\nexport default DateBlock;\r\n","import * as React from \"react\";\r\n\r\nimport Divider from \"@mui/material/Divider\";\r\nimport Link from \"@mui/material/Link\";\r\n\r\n\r\nconst Author: React.FunctionComponent = props => {\r\n return (\r\n
    \r\n \r\n
    \r\n
    {props.author ? props.author[0] : \"\"}
    \r\n
    \r\n
    Organized By
    \r\n {props.authorEmail\r\n ? {props.author}\r\n :
    {props.author}
    \r\n }\r\n
    \r\n
    \r\n \r\n
    \r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n author: string;\r\n authorEmail: string | undefined;\r\n avatarColor?: string;\r\n}\r\n\r\nexport default Author;","import * as React from \"react\";\r\n\r\n\r\nclass Body extends React.Component {\r\n public render() {\r\n if (!this.props.body)\r\n return ;\r\n \r\n return (\r\n
    \r\n );\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n body: string;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nexport default Body;","import * as React from \"react\";\r\nimport moment from \"moment\";\r\n\r\nimport { EventType } from \"modules/events/models\";\r\n\r\nimport AccessTimeIcon from \"@mui/icons-material/AccessTime\";\r\n\r\n\r\nclass CutoffTime extends React.Component {\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public render() {\r\n if (!this.props.cutoffTime || this.props.eventType === \"informational\")\r\n return ;\r\n \r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n
    RSVP Deadline - {moment(this.props.cutoffTime).format(\"ddd, MMM D, YYYY, h:mm A\")}
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n cutoffTime: string | undefined;\r\n eventType: EventType;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nexport default CutoffTime;","import * as React from \"react\";\r\nimport moment from \"moment\";\r\n\r\nimport { EventTimes, TranslatedContent } from \"../../../models\";\r\n\r\nimport IconButton from \"@mui/material/IconButton\";\r\n\r\nimport EventIcon from \"@mui/icons-material/Event\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\n\r\n\r\nclass AddToCalendar extends React.Component {\r\n public render() {\r\n const {\r\n startTime\r\n } = this.props;\r\n const hasStartTime: boolean = !!startTime;\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private download = (content: string) => {\r\n const file = {\r\n name: `event-${new Date().toISOString()}.ics`,\r\n type: \"text/calendar;charset=utf-8;\"\r\n };\r\n new FileDownloader(file).downloadBlob(content);\r\n }\r\n\r\n private onAddToCalendar = () => {\r\n const { activeLcid, location, locationLink, locationLinkLabel, translatedContent } = this.props;\r\n \r\n const dateFormat = \"YYYYMMDDTHHmmss\";\r\n const allDayDateFormat = \"YYYYMMDD\";\r\n \r\n const body = translatedContent[activeLcid] ? `
    ${translatedContent[activeLcid].body.replace(/\\n/g, \"\")}
    ` : \"\";\r\n const title = translatedContent[activeLcid] ? translatedContent[activeLcid].title : \"\";\r\n\r\n const physicalLocation = location ?? \"\";\r\n const digitalLocation = this.fetchDigitalLocation(locationLink, locationLinkLabel);\r\n\r\n const locationLabel = `${physicalLocation} ${(physicalLocation.trim() !== \"\" && digitalLocation.trim() !== \"\") ? \" / \" : \"\"} ${digitalLocation}`\r\n const bodyAddition = locationLink && locationLink.trim() !== \"\" ? `${digitalLocation}` : \"\";\r\n\r\n const startTimes = !!this.props.startTime ? [this.props.startTime] : Object.keys(this.props.eventTimes);\r\n let calendarEventTimes = \"\";\r\n for (let startTime of startTimes) {\r\n const endTime = this.props.eventTimes[startTime];\r\n const isAllDay = !endTime;\r\n calendarEventTimes = [\r\n calendarEventTimes,\r\n 'BEGIN:VEVENT',\r\n `URL:${document.URL}`,\r\n `DTSTART:${isAllDay ? moment(startTime).utc().format(allDayDateFormat) : moment(startTime).format(dateFormat)}`,\r\n `DTEND:${isAllDay ? moment(startTime).utc().add({day: 1}).format(allDayDateFormat) : moment(endTime!).format(dateFormat)}`,\r\n `SUMMARY:${title}`,\r\n `X-ALT-DESC;FMTTYPE=text/html:${body}${bodyAddition}`,\r\n `LOCATION:${locationLabel}`,\r\n `BEGIN:VALARM`,\r\n `TRIGGER:-PT15M`,\r\n `ACTION:DISPLAY`,\r\n `DESCRIPTION:Upcoming event: ${title}`,\r\n `END:VALARM`,\r\n 'END:VEVENT'\r\n ].join(\"\\n\");\r\n }\r\n const calendar = [\r\n 'BEGIN:VCALENDAR',\r\n 'VERSION:2.0',\r\n calendarEventTimes,\r\n 'END:VCALENDAR'\r\n ].join(\"\\n\");\r\n\r\n this.download(calendar);\r\n }\r\n\r\n private fetchDigitalLocation = (locationLink?: string, locationLinkLabel?: string) => {\r\n if (locationLinkLabel && locationLinkLabel.trim() !== \"\") {\r\n return locationLinkLabel;\r\n }\r\n\r\n else if (locationLink && locationLink.trim() !== \"\") {\r\n return locationLink;\r\n }\r\n\r\n return \"\";\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n activeLcid: string;\r\n eventTimes: EventTimes;\r\n location?: string;\r\n locationLink?: string;\r\n locationLinkLabel?: string;\r\n respondingEnabled?: boolean;\r\n translatedContent: TranslatedContent;\r\n\r\n startTime?: string;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nexport default AddToCalendar;\r\n","import * as React from \"react\";\r\nimport moment from \"moment\";\r\n\r\nimport { CurrentUserResponse, EventTimes as IEventTimes, TranslatedContent } from \"../../../models\";\r\nimport AddToCalendar from \"./addToCalendar\";\r\n\r\nimport DateRangeOutlinedIcon from \"@mui/icons-material/DateRangeOutlined\";\r\nimport { formatDate, isAllDayEvent } from \"utils/dateFormatting\";\r\n\r\n\r\nclass EventTimes extends React.Component {\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public render() {\r\n const { showAddToCalendar, eventTimes } = this.props;\r\n const startTimes: string[] = Object.keys(eventTimes);\r\n const isMultiDay: boolean = startTimes.length > 1;\r\n const hasSpecificTimes: boolean = isMultiDay && startTimes.findIndex(startTime => !!eventTimes[startTime]) !== -1;\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n {startTimes.map((startTime, index) => {\r\n let isAllDay = isAllDayEvent(eventTimes, startTime);\r\n return (\r\n
    \r\n {`${isMultiDay ? `Day ${index + 1} - ` : \"\"}${isAllDay ? formatDate(new Date(startTime), isAllDay, true) : moment(startTime).format(\"ddd, MMM D, YYYY\")}, `}\r\n \r\n {!eventTimes[startTime]\r\n ? `All Day`\r\n : `${moment(startTime).format(\"h:mm A\")} - ${moment(eventTimes[startTime]!).format(\"h:mm A\")}`\r\n }\r\n \r\n {showAddToCalendar &&}\r\n
    \r\n );\r\n })}\r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n activeLcid: string;\r\n eventTimes: IEventTimes;\r\n isCurrentUserAttending?: boolean;\r\n location?: string;\r\n locationLink?: string;\r\n locationLinkLabel?: string;\r\n respondingEnabled?: boolean;\r\n translatedContent: TranslatedContent;\r\n currentUserResponse?: CurrentUserResponse;\r\n showAddToCalendar?: boolean;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nexport default EventTimes;","import * as React from \"react\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport { AttachedFile } from \"modules/gallery\";\r\n\r\n\r\nclass FileAttachments extends React.Component {\r\n public render() {\r\n if (!this.props.fileAttachments || !this.props.fileAttachments.length)\r\n return ;\r\n\r\n return (\r\n
    \r\n
    Documents ({this.props.fileAttachments.length})
    \r\n
    \r\n {this.props.fileAttachments.map((fileAttachment) =>\r\n \r\n )}\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n private openFile = (fileAttachment: AttachedFile) => {\r\n window.open(fileAttachment.fileUrl!);\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n fileAttachments: AttachedFile[] | undefined;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nexport default FileAttachments;\r\n","import * as React from \"react\";\r\n\r\nimport PublicIcon from '@mui/icons-material/Public';\r\nimport LocationOnOutlinedIcon from \"@mui/icons-material/LocationOnOutlined\";\r\nimport { Link } from \"@mui/material\";\r\n\r\n\r\nclass Location extends React.Component {\r\n public render() {\r\n if (!this.props.location && !this.props.locationLink && !this.props.locationLinkLabel)\r\n return ;\r\n\r\n return (\r\n \r\n {!!this.props.location &&\r\n
    \r\n
    \r\n \r\n
    \r\n
    {this.props.location}
    \r\n
    \r\n }\r\n \r\n {!!this.props.locationLinkLabel && !!!this.props.locationLink &&\r\n
    \r\n
    \r\n \r\n
    \r\n
    {this.props.locationLinkLabel}
    \r\n
    \r\n }\r\n\r\n {!!this.props.locationLink && !!!this.props.locationLinkLabel &&\r\n
    \r\n
    \r\n \r\n
    \r\n
    {{this.props.locationLink}}
    \r\n
    \r\n }\r\n\r\n {!!this.props.locationLink && !!this.props.locationLinkLabel &&\r\n
    \r\n
    \r\n \r\n
    \r\n
    {this.props.locationLinkLabel}
    \r\n
    \r\n }\r\n\r\n
    \r\n );\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n location: string | undefined;\r\n locationLink: string | undefined;\r\n locationLinkLabel: string | undefined;\r\n}\r\n\r\ninterface ComponentState { }\r\n\r\nexport default Location;","import * as React from \"react\";\r\n\r\nimport { Tag as ITag } from \"../../../models\";\r\n\r\nimport LocalOfferOutlinedIcon from \"@mui/icons-material/LocalOfferOutlined\";\r\n\r\n\r\nclass Tags extends React.Component {\r\n public render() {\r\n if (!this.props.tags || !this.props.tags.length)\r\n return ;\r\n \r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n
    {this.props.tags.map((tag) => tag.name).join(\", \")}
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n tags: ITag[] | undefined;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nexport default Tags;","import * as React from \"react\";\r\n\r\n\r\nclass Title extends React.Component {\r\n public render() {\r\n if (!this.props.title)\r\n return ;\r\n \r\n return (\r\n
    {this.props.title}
    \r\n );\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n title: string;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nexport default Title;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport moment from \"moment\";\r\n\r\nimport { draftEventsApi, insightsApi } from \"../../../../api/instances\";\r\n\r\nimport EventTypeBanner from \"modules/common/components/banners/eventTypeBanner\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { TagStats } from \"modules/insights\";\r\nimport { TenantSettingsTag } from \"modules/settings/models\";\r\nimport { Event, NotificationRange } from \"../../models\";\r\n\r\nimport DateBlock from \"../date-block/dateBlock\";\r\n\r\nimport Author from \"./components/author\";\r\nimport Body from \"./components/body\";\r\nimport CutoffTime from \"./components/cutoffTime\";\r\nimport EventTimes from \"./components/eventTimes\";\r\nimport FileAttachments from \"./components/fileAttachments\";\r\nimport Location from \"./components/location\";\r\nimport Tags from \"./components/tags\";\r\nimport { ReminderInfo, DelayType } from \"modules/common/components/authoring/models\";\r\nimport Title from \"./components/title\";\r\nimport { parseAnchors } from \"utils/htmlUtils\";\r\nimport HeroBanner from \"modules/common/components/heroBanner\";\r\nimport { CustomCss } from \"modules/common/components/customCss\";\r\nimport { SubmissionDisclaimer } from \"modules/common/components/authoring/dialogs/submissionDisclaimer\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport CheckIcon from \"@mui/icons-material/Check\";\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew';\r\n\r\nimport { RETURN_TO_EDITOR, SUBMISSION_PUBLISH_TEXT } from \"modules/common/components/authoring/constants\";\r\nimport { push } from \"react-router-redux\";\r\nimport TenantLink from \"modules/common/components/tenantLink\";\r\nimport { getPublishBtnName } from \"modules/common/components/authoring/utils\";\r\nimport { ContentType } from \"modules/common/models\";\r\nimport '../../../../styles/views.sass';\r\n\r\nclass EventPreview extends React.Component {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n const { lcidMappings } = props;\r\n\r\n const availableLcids: string[] = Object.keys(props.event.translatedContent!);\r\n const availableLanguages: Language[] = availableLcids.map((lcid) => ({ language: lcidMappings[lcid] ? lcidMappings[lcid].languageShort : lcid, lcid }));\r\n\r\n let reminders: ReminderInfo[] = this.onSetReminderInfo(props.event);\r\n\r\n this.state = {\r\n activeLcid: availableLcids[0],\r\n availableLanguages: availableLanguages,\r\n isFetching: true,\r\n reminders: reminders,\r\n sendNotification: true,\r\n tagStats: [],\r\n publishId: undefined\r\n };\r\n }\r\n\r\n public async componentDidMount() {\r\n moment.locale(\"en\");\r\n if (this.props.show && this.props.event.tags && this.props.event.tags.length) {\r\n this.fetchTagStats();\r\n }\r\n\r\n await this.fetchRedirectToPublished();\r\n }\r\n\r\n public async componentDidUpdate(prevProps: PropsWithRedux) {\r\n await this.fetchRedirectToPublished();\r\n\r\n if (this.props.show && (this.props.show !== prevProps.show)) {\r\n\r\n const { lcidMappings } = this.props;\r\n\r\n const availableLcids: string[] = Object.keys(this.props.event.translatedContent!);\r\n const availableLanguages: Language[] = availableLcids.map((lcid) => ({ language: lcidMappings[lcid] ? lcidMappings[lcid].languageShort : lcid, lcid }));\r\n\r\n let reminders: ReminderInfo[] = this.onSetReminderInfo(this.props.event);\r\n\r\n this.setState({ activeLcid: availableLcids[0], availableLanguages, reminders });\r\n\r\n if (!this.state.tagStats.length)\r\n this.fetchTagStats();\r\n }\r\n }\r\n\r\n private fetchRedirectToPublished = async () =>{\r\n if (this.props.show && this.isPublishedEvent() && !this.state.publishId) {\r\n try {\r\n const { data : publishId } = this.props.event.id\r\n ? await draftEventsApi.getPublishedFromDraftId(this.props.event.id)\r\n : { data: undefined };\r\n \r\n this.setState({ publishId });\r\n }\r\n catch {\r\n this.setState({ publishId : \"\" });\r\n }\r\n }\r\n }\r\n\r\n private getPrimaryAction = (): JSX.Element => {\r\n if (this.props.inEditor)\r\n return ;\r\n\r\n return <>\r\n {this.props.event.status?.toLowerCase() === \"submission\" && !this.props.isContributor && \r\n \r\n }\r\n ;\r\n };\r\n\r\n private isPublishedEvent = () : boolean => this.props.event.isPreviouslyPublished\r\n && this.props.event.publishTime ? new Date(this.props.event.publishTime) < new Date() : false;\r\n\r\n public render() {\r\n const { event } = this.props;\r\n return (\r\n <>\r\n \r\n \r\n \r\n
    \r\n {this.props.inEditor ? \"One last check!\" : \"Preview event\"}\r\n
    \r\n {this.isPublishedEvent() &&\r\n \r\n }>\r\n Open Event In Portal\r\n \r\n \r\n }\r\n \r\n {this.getPrimaryAction()}\r\n \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n
    Additional Details
    \r\n
    \r\n {this.getTimeDetails()}\r\n {this.getTagDetails()}\r\n {this.getNotificationDetails()}\r\n {this.getReminderDetails()}\r\n
    \r\n
    \r\n
    Event Preview
    \r\n
    Preview varies based on device and/or platform.
    \r\n
    \r\n \r\n {this.getTypeBanner()}\r\n \r\n \r\n
    \r\n
    \r\n \r\n </div>\r\n <Location location={event.location} locationLink={event.locationLink} locationLinkLabel={event.locationLinkLabel} />\r\n <EventTimes\r\n activeLcid={this.state.activeLcid}\r\n {...event}\r\n eventTimes={event.eventTimes!}\r\n translatedContent={event.translatedContent!}\r\n showAddToCalendar={false}\r\n />\r\n <CutoffTime cutoffTime={event.cutoffTime} eventType={event.eventType!} />\r\n <Tags tags={event.tags || []} />\r\n <Author author={event.author || \"\"} authorEmail={event.authorEmail} />\r\n {this.getAvailableLanguages()}\r\n <Body body={parseAnchors(event.translatedContent![this.state.activeLcid].body)} />\r\n <FileAttachments fileAttachments={event.fileAttachments} />\r\n </div>\r\n </div>\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n </>\r\n );\r\n }\r\n\r\n private fetchTagStats = () => {\r\n insightsApi.GetTagStats().then((tagStats) => {\r\n this.setState({ isFetching: false, tagStats });\r\n });\r\n };\r\n\r\n private getAvailableLanguages = (): JSX.Element => {\r\n if (this.state.availableLanguages.length < 2)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n return (\r\n <div className=\"available-languages\">\r\n <span className=\"emphasis\">Available In: </span>\r\n {this.state.availableLanguages\r\n .map<React.ReactNode>((language) =>\r\n <span key={language.lcid} onClick={() => this.onSelectLanguage(language)} className={language.lcid === this.state.activeLcid ? \"\" : \"inactive-language\"}>{language.language}</span>\r\n )\r\n .reduce((prev, curr) => [prev, \", \", curr])\r\n }\r\n </div>\r\n );\r\n };\r\n\r\n private getNotificationDetails = (): JSX.Element => {\r\n const { event, notificationSettings } = this.props;\r\n\r\n const allNotificationsDisabled = !notificationSettings.settings[\"eventPublishedEmailAttempt\"].toggle &&\r\n !notificationSettings.settings[\"eventPublishedTeamsAttempt\"].toggle &&\r\n !notificationSettings.settings[\"eventPublishedSMSAttempt\"].toggle &&\r\n !notificationSettings.settings[\"eventPublishedMobileAttempt\"].toggle;\r\n\r\n if (!event.notifications) return <React.Fragment></React.Fragment>;\r\n\r\n return (\r\n <React.Fragment>\r\n <div className=\"preview-header\">\r\n <div>Notifications</div>\r\n </div>\r\n {!allNotificationsDisabled\r\n ? <div className=\"preview-detail\">\r\n <div className=\"preview-label\">Upon Publishing</div>\r\n <div className=\"preview-detail-field\">\r\n {this.getNotificationStatus(\"MS Teams Chatbot\", event.notifications.teamsOnPublish, notificationSettings.settings[\"eventPublishedTeamsAttempt\"].toggle)}\r\n {this.getNotificationStatus(\"Mobile App\", event.notifications.mobileOnPublish, notificationSettings.settings[\"eventPublishedMobileAttempt\"].toggle)}\r\n {this.getNotificationStatus(\"Email\", event.notifications.emailOnPublish, notificationSettings.settings[\"eventPublishedEmailAttempt\"].toggle)}\r\n {this.getNotificationStatus(\"SMS\", event.notifications.smsOnPublish, notificationSettings.settings[\"eventPublishedSMSAttempt\"].toggle)}\r\n </div>\r\n </div>\r\n\r\n : <div style={{ marginBottom: '10px', marginLeft: '15px' }}>Your organization has disabled event publishing notifications.<br />Change this setting in Tenant Configurations.</div>}\r\n <Divider className=\"preview-detail-divider\" />\r\n </React.Fragment>\r\n );\r\n };\r\n\r\n private getNotificationStatus = (label: string, range: NotificationRange, notificationToggle: boolean = true) => {\r\n if (range === \"none\" || !notificationToggle)\r\n return <div className=\"unselected-notification\"><ClearIcon />{label}</div>;\r\n else\r\n return <div className=\"selected-notification\"><CheckIcon fontSize=\"small\" />{label}</div>;\r\n };\r\n\r\n private getReminderDetails = (): JSX.Element => {\r\n const { event, notificationSettings } = this.props;\r\n\r\n const allRemindersDisabled = !notificationSettings.settings[\"eventReminderEmailAttempt\"].toggle &&\r\n !notificationSettings.settings[\"eventReminderTeamsAttempt\"].toggle &&\r\n !notificationSettings.settings[\"eventReminderSMSAttempt\"].toggle &&\r\n !notificationSettings.settings[\"eventReminderMobileAttempt\"].toggle;\r\n\r\n if (!event.notifications || !event.notifications.reminders || !event.notifications.reminders.length)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n return (\r\n <React.Fragment>\r\n <div className=\"preview-header\">\r\n <div>Reminders</div>\r\n </div>\r\n {!allRemindersDisabled\r\n ? this.state.reminders.map((reminder, index) => {\r\n return (\r\n <div key={index} className=\"preview-detail\">\r\n <div className=\"preview-label\">Reminder {index + 1}</div>\r\n <div className=\"preview-detail-field\">\r\n <div>Send in {reminder.delay} {reminder.delayType} if unread</div>\r\n {this.getNotificationStatus(\"MS Teams Chatbot\", reminder.teamsRange, notificationSettings.settings[\"eventReminderTeamsAttempt\"].toggle)}\r\n {this.getNotificationStatus(\"Mobile App\", reminder.mobileRange, notificationSettings.settings[\"eventReminderMobileAttempt\"].toggle)}\r\n {this.getNotificationStatus(\"Email\", reminder.emailRange, notificationSettings.settings[\"eventReminderEmailAttempt\"].toggle)}\r\n {this.getNotificationStatus(\"SMS\", reminder.smsRange, notificationSettings.settings[\"eventReminderSMSAttempt\"].toggle)}\r\n </div>\r\n </div>\r\n );\r\n })\r\n\r\n : <div style={{ marginBottom: '10px', marginLeft: '15px' }} className=\"platform-disabled-warning\">Your organization has disabled event reminder notifications.<br />Change this setting in Tenant Configurations.</div>}\r\n <Divider className=\"preview-detail-divider\" />\r\n </React.Fragment>\r\n );\r\n };\r\n\r\n private getTagDetails = (): JSX.Element => {\r\n const { event } = this.props;\r\n\r\n if (!event.tags || !event.tags.length)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n if (this.state.isFetching)\r\n return (\r\n <React.Fragment>\r\n <Loading />\r\n <Divider className=\"preview-detail-divider\" />\r\n </React.Fragment>\r\n );\r\n\r\n let tags: TagStats[] = [];\r\n\r\n event.tags!.map((tag) => {\r\n const tagStatIndex: number = this.state.tagStats.findIndex(tagStat => tagStat.id === tag.id);\r\n if (tagStatIndex !== -1)\r\n tags.push(this.state.tagStats[tagStatIndex]);\r\n else\r\n tags.push({\r\n id: tag.id,\r\n groupName: \"\",\r\n name: tag.name,\r\n isMandatory: !!tag.mandatory,\r\n subscriberCount: 0,\r\n postCount: 0,\r\n viewCount: 0\r\n });\r\n return tag;\r\n });\r\n\r\n return (\r\n <React.Fragment>\r\n <div className=\"preview-detail\">\r\n <div className=\"preview-label\">Topic Subscribers</div>\r\n <div className=\"preview-detail-field\">\r\n {tags.map((tag) =>\r\n <div key={tag.id}>{tag.name} ({tag.subscriberCount})</div>\r\n )}\r\n </div>\r\n </div>\r\n <Divider className=\"preview-detail-divider\" />\r\n </React.Fragment>\r\n );\r\n };\r\n\r\n private getTimeDetails = (): JSX.Element => {\r\n const { event } = this.props;\r\n\r\n return (\r\n <div className=\"preview-detail-times\">\r\n <div className=\"preview-detail\">\r\n <div className=\"preview-label\">Publish on</div>\r\n <div className=\"preview-date\">{!!event.publishTime ? moment(event.publishTime).format(\"MMMM D, YYYY h:mm A (dddd)\") : \"Now\"}</div>\r\n </div>\r\n {!!event.expiryTime &&\r\n <div className=\"preview-detail\">\r\n <div className=\"preview-label\">Expires on</div>\r\n <div className=\"preview-date\">{moment(event.expiryTime).format(\"MMMM D, YYYY h:mm A (dddd)\")}</div>\r\n </div>\r\n }\r\n <Divider className=\"preview-detail-divider\" />\r\n </div>\r\n );\r\n };\r\n\r\n private getTypeBanner = (): JSX.Element => {\r\n const { event } = this.props;\r\n\r\n let tags: TenantSettingsTag[] = [];\r\n\r\n let availableTags: TenantSettingsTag[] = [];\r\n this.props.tagGroups.map(tagGroup => {\r\n availableTags = availableTags.concat(tagGroup.tags);\r\n return tagGroup;\r\n });\r\n\r\n event.tags!.map((tag) => {\r\n const tagIndex: number = availableTags.findIndex(tagStat => tagStat.id === tag.id);\r\n if (tagIndex !== -1)\r\n tags.push(availableTags[tagIndex]);\r\n return tag;\r\n });\r\n\r\n return (\r\n <EventTypeBanner eventType={event.eventType!} isRestricted={!!tags.find(tag => tag.restricted)} full lcid={this.state.activeLcid} />\r\n );\r\n };\r\n\r\n private onSelectLanguage = (language: Language) => {\r\n this.setState({ activeLcid: language.lcid });\r\n };\r\n\r\n private onSetReminderInfo = (event: Partial<Event>): ReminderInfo[] => {\r\n let reminders: ReminderInfo[] = [];\r\n if (!!event.notifications) {\r\n event.notifications.reminders.map((reminder, index) => {\r\n const delay: number = reminder.delay % 24 === 0 ? reminder.delay / 24 : reminder.delay;\r\n const delayType: DelayType = reminder.delay > 0 && reminder.delay % 24 === 0 ? \"days\" : \"hours\";\r\n\r\n if (reminder.channel === \"none\") {\r\n reminders.push({\r\n delay: delay,\r\n delayType: delayType,\r\n emailRange: \"none\",\r\n mobileRange: \"none\",\r\n smsRange: \"none\",\r\n teamsRange: \"none\"\r\n });\r\n } else if (reminder.channel === \"inherit\") {\r\n reminders.push({\r\n delay: delay,\r\n delayType: delayType,\r\n emailRange: event.notifications?.emailOnPublish || \"none\",\r\n mobileRange: event.notifications?.mobileOnPublish || \"none\",\r\n smsRange: event.notifications?.smsOnPublish || \"none\",\r\n teamsRange: event.notifications?.teamsOnPublish || \"none\"\r\n });\r\n } else {\r\n if (index > 0 && (reminders[reminders.length - 1].delay === delay && reminders[reminders.length - 1].delayType === delayType)) {\r\n if (reminder.channel === \"email\")\r\n reminders[reminders.length - 1].emailRange = reminder.range;\r\n else if (reminder.channel === \"mobile\")\r\n reminders[reminders.length - 1].mobileRange = reminder.range;\r\n else if (reminder.channel === \"sms\")\r\n reminders[reminders.length - 1].smsRange = reminder.range;\r\n else if (reminder.channel === \"teams\")\r\n reminders[reminders.length - 1].teamsRange = reminder.range;\r\n } else {\r\n reminders.push({\r\n delay: delay,\r\n delayType: delayType,\r\n emailRange: reminder.channel === \"email\" ? reminder.range : \"none\",\r\n mobileRange: reminder.channel === \"mobile\" ? reminder.range : \"none\",\r\n smsRange: reminder.channel === \"sms\" ? reminder.range : \"none\",\r\n teamsRange: reminder.channel === \"teams\" ? reminder.range : \"none\"\r\n });\r\n }\r\n }\r\n return reminder;\r\n });\r\n }\r\n\r\n return reminders;\r\n };\r\n\r\n\r\n private onEditDetails = () => {\r\n this.props.onEditDetails();\r\n };\r\n\r\n private onPublish = () => {\r\n this.props.onPublish!(this.state.sendNotification);\r\n };\r\n\r\n private onClose = () => {\r\n this.props.onClose();\r\n };\r\n}\r\n\r\ninterface Language {\r\n language: string;\r\n lcid: string;\r\n}\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n event: Partial<Event>;\r\n isContributor: boolean;\r\n inEditor: boolean;\r\n onEditDetails: () => void;\r\n onPublish?: (sendNotification: boolean) => void;\r\n onClose: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n activeLcid: string;\r\n availableLanguages: Language[];\r\n isFetching: boolean;\r\n reminders: ReminderInfo[];\r\n sendNotification: boolean;\r\n tagStats: TagStats[];\r\n publishId?: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n lcidMappings: state.resources.lcidMappings,\r\n notificationSettings: state.settings.notificationSettings,\r\n tagGroups: state.settings.tenantSettings.tagGroups,\r\n tenantSettings: state.settings.tenantSettings,\r\n redirectTo: push\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(EventPreview);\r\n","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport MoreOptionsIconButton from \"modules/common/components/buttons/moreOptionsIconButton\";\r\n\r\nimport Divider from \"@mui/material/Divider\";\r\nimport List from \"@mui/material/List\";\r\n\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\nimport { push } from \"react-router-redux\";\r\nimport { EventListItem } from \"modules/events/models\";\r\nimport { UserRoleWrapper } from \"routes/_layout/common/components/wrappers/UserRoleWrapper\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport { getHighestRole } from \"utils/userRoleUtils\";\r\n\r\n//TODO: Combine moreOptions components into a single one, rather than having multiple. \r\n\r\nconst MoreOptions: React.FunctionComponent<PropsWithRedux> = props => {\r\n let event = props.event;\r\n\r\n return (\r\n <MoreOptionsIconButton>\r\n <List disablePadding>\r\n <MoreOptionsItem\r\n text=\"Edit\"\r\n disabled={event.publishedTime !== null && event.eventType.toLowerCase() === \"compliance\"}\r\n onClick={() => props.onHandleEdit(event)}\r\n />\r\n <MoreOptionsItem\r\n text=\"Preview\"\r\n onClick={() => {\r\n props.onPreview(event);\r\n }}\r\n />\r\n\r\n <UserRoleWrapper userRole={UserRoleStrings.AUTHOR}>\r\n <Divider light />\r\n {\r\n event.status.toLowerCase() === \"published\" && \r\n <MoreOptionsItem\r\n text=\"Manage Participants\"\r\n disabled={event.eventType.toLowerCase() === \"informational\"}\r\n onClick={() => {\r\n props.redirectTo(\"/\" + props.tenant + \"/admin/events/attendance/\" + event.id);\r\n }}\r\n />\r\n }\r\n </UserRoleWrapper>\r\n\r\n <Divider light />\r\n\r\n <MoreOptionsItem\r\n text=\"Duplicate\"\r\n onClick={() => {\r\n props.onClone(event);\r\n }}\r\n buttonId=\"more-options-duplicate-button\"\r\n />\r\n\r\n <UserRoleWrapper userRole={UserRoleStrings.AUTHOR}>\r\n {\r\n event.status.toLowerCase() === \"published\" && <MoreOptionsItem\r\n text=\"Unpublish\"\r\n onClick={() => {\r\n props.onUnpublish(event);\r\n }}\r\n buttonId=\"more-options-unpublish-button\"\r\n />\r\n }\r\n </UserRoleWrapper>\r\n\r\n <MoreOptionsItem\r\n text=\"Delete\"\r\n textStyle={{color: \"#B72026\"}}\r\n onClick={() => {\r\n props.onDelete(event);\r\n }}\r\n disabled={getHighestRole(props.currentUser) === UserRoleStrings.CONTRIBUTOR && (event.status.toLowerCase() === \"published\" || event.status.toLowerCase() === \"scheduled\")}\r\n buttonId=\"more-options-delete-button\"\r\n />\r\n </List>\r\n </MoreOptionsIconButton>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n event: EventListItem;\r\n onHandleEdit: (eventToEdit?: EventListItem) => void;\r\n onPreview: (eventToPreview?: EventListItem) => void;\r\n onClone: (eventToClone?: EventListItem) => void;\r\n onDelete: (eventToDelete?: EventListItem) => void;\r\n onUnpublish: (eventToUnpublish?: EventListItem) => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenant: state.tenant.id,\r\n currentUser: state.settings.currentUser\r\n }),\r\n {\r\n redirectTo: push,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(MoreOptions);","import * as React from \"react\";\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport EditIcon from \"@mui/icons-material/Edit\";\r\nimport FileCopyIcon from \"@mui/icons-material/FileCopy\";\r\nimport SettingsIcon from \"@mui/icons-material/Settings\";\r\nimport VisibilityIcon from \"@mui/icons-material/Visibility\";\r\nimport { Box, Button } from \"@mui/material\";\r\n\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\nimport { EventListItem } from \"modules/events/models\";\r\nimport TabContentToolbar from \"pages/common/tabContentToolbar\";\r\nimport { actions } from \"modules/events\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\n\r\ninterface IEventActionToolbarProps {\r\n pageId: string;\r\n selectedItems: EventListItem[];\r\n actions: EventActions;\r\n isContributor: boolean;\r\n}\r\n\r\ninterface EventActions {\r\n onClearAll: () => void;\r\n onPreview: () => void;\r\n onEdit: () => void;\r\n onClone: () => void;\r\n}\r\n\r\nexport const EventActionToolbar: React.FunctionComponent<PropsWithRedux> = (props) => {\r\n const { pageId, selectedItems, actions } = props;\r\n\r\n const getToolbarIcon = (title: string, icon: React.ReactNode, onClick: () => void, isDisabled: boolean = false) => {\r\n return (\r\n <Button aria-label={title.toLowerCase()}\r\n color=\"primary\"\r\n startIcon={icon}\r\n onClick={() => onClick()}\r\n disabled={isDisabled}\r\n >\r\n {title}\r\n </Button>\r\n );\r\n }\r\n\r\n const onManageAttendance = () =>\r\n props.redirectTo(`/${props.tenantId}/admin/events/attendance/${selectedItems[0].id}`);\r\n\r\n const onDelete = async () => {\r\n const confirmationMessage: string = (selectedItems.length > 1)\r\n ? `You're about to permanently delete these ${selectedItems.length} events.`\r\n : `You're about to permanently delete '${selectedItems[0].title}.`;\r\n\r\n if (await confirm.show({\r\n title: `Delete Event`,\r\n text: (\r\n <div>\r\n <div>{`${confirmationMessage} You cannot undo this action.`}</div>\r\n <br />\r\n <div>Are you sure?</div>\r\n </div>\r\n ),\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\"\r\n })) {\r\n if (selectedItems.length === 1) {\r\n props.deleteEvents([selectedItems[0]]).then(() => {\r\n actions.onClearAll();\r\n });\r\n }\r\n else {\r\n props.deleteEvents(selectedItems).then(() => {\r\n actions.onClearAll();\r\n });\r\n }\r\n }\r\n }\r\n\r\n const getDeleteIcon = () :JSX.Element => {\r\n const anyPublishedOrScheduled = selectedItems\r\n .map(si => si.status?.toLowerCase())\r\n .some(status => status === \"published\" || status === \"scheduled\");\r\n const isDisabled = props.isContributor && anyPublishedOrScheduled;\r\n\r\n return isDisabled\r\n ? <HoverText\r\n underline={false}\r\n label={getToolbarIcon(\"Delete\", <DeleteIcon />, onDelete, isDisabled)}\r\n style={{width: \"fit-content\"}}\r\n >\r\n {\"Contact your administrator(s) to delete published or scheduled posts\"}\r\n </HoverText>\r\n : getToolbarIcon(\"Delete\", <DeleteIcon />, onDelete, isDisabled);\r\n }\r\n\r\n if (!selectedItems.length)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n return (\r\n <TabContentToolbar>\r\n {getToolbarIcon(`${selectedItems.length} selected`, <ClearIcon />, actions.onClearAll)}\r\n <Box flexDirection={\"row\"} display={\"flex\"}>\r\n {selectedItems.length === 1 &&\r\n <React.Fragment>\r\n {(pageId === \"published\" || pageId === \"all\") && selectedItems[0].eventType !== \"informational\" && selectedItems[0].publishedTime !== null &&\r\n getToolbarIcon(\"Manage Participants\", <SettingsIcon />, onManageAttendance)\r\n }\r\n {getToolbarIcon(\"Edit\", <EditIcon />, actions.onEdit)}\r\n {getToolbarIcon(\"Preview\", <VisibilityIcon />, () => actions.onPreview())}\r\n {getToolbarIcon(\"Duplicate\", <FileCopyIcon />, () => actions.onClone())}\r\n </React.Fragment>\r\n }\r\n {getDeleteIcon()}\r\n </Box>\r\n </TabContentToolbar>\r\n );\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IEventActionToolbarProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id,\r\n }),\r\n {\r\n deleteEvents: actions.deleteEvents,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(EventActionToolbar);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport { Epoch, Event as IEvent, EventFilterValues, EventListingPage, EventListItem } from \"../../models\";\r\nimport moment from \"moment\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport DeleteEventConfirmation from \"../confirmations/deleteEvent\";\r\nimport EventFilters from \"../event-filters/eventFilters\";\r\nimport EventPreview from \"../event-views/eventPreview\";\r\n\r\nimport TabContent from \"pages/common/tabContent\";\r\n\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableContainer from \"@mui/material/TableContainer\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport WarningIcon from '@mui/icons-material/Warning';\r\n\r\nimport ChipLabels from \"modules/common/components/chips/chipLabels\";\r\nimport Paging from \"modules/common/components/paging\";\r\nimport { ImageScale } from \"modules/posts/models\";\r\nimport Cookies from \"js-cookie\";\r\nimport ArrowDownward from \"@mui/icons-material/ArrowDownward\";\r\nimport ArrowUpward from \"@mui/icons-material/ArrowUpward\";\r\nimport MoreOptions from \"./moreOptions\";\r\nimport confirm from \"utils/notyPopups\";\r\nimport { SortStyle } from \"utils/managementUtils\";\r\nimport ManagementEmptyResults from \"modules/common/components/managementEmptyResults\";\r\nimport { TenantSettingsTagGroup } from \"modules/settings\";\r\nimport { ROWS_PER_PAGE_COOKIE_NAMES } from \"utils/cookie\";\r\nimport { formatDate } from \"utils/dateFormatting\";\r\nimport { contentBandsSlice } from \"modules/contentBands/reducer\";\r\nimport { isPinnedDeleted } from \"modules/common/hooks/data/useContentBands\";\r\nimport { getHighestRole } from \"utils/userRoleUtils\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport EventActionToolbar from \"./eventActionToolbar\";\r\nimport EditPublishedContentDialog from \"modules/common/components/authoring/dialogs/editPublishedContentDialog\";\r\nimport { ContentType } from \"modules/common/models\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\n\r\ninterface HeaderCell {\r\n id: string;\r\n label: string;\r\n ascValue?: SortStyle;\r\n descValue?: SortStyle;\r\n clickable?: boolean;\r\n}\r\n\r\nclass EventList extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n let initialFilters = this.getDefaultFilterValues();\r\n initialFilters.sortType = props.initialSort;\r\n initialFilters.myEventsOnly = props.showMyEventsOnly;\r\n\r\n this.state = {\r\n eventPreview: undefined,\r\n filters: initialFilters,\r\n hasFiltersApplied: false,\r\n isPagedLoad: false,\r\n selectedItems: [],\r\n showDeleteEventConfirmation: false,\r\n openEditPublishedEvent: false,\r\n showEventPreview: false,\r\n method: this.props.initialSort, //default ing on page load.\r\n isContributor: getHighestRole(this.props.user) === UserRoleStrings.CONTRIBUTOR\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n \r\n public componentDidUpdate(prevProps: PropsWithRedux, prevState: Readonly<ComponentState>): void {\r\n if (prevProps.showMyEventsOnly !== this.props.showMyEventsOnly) {\r\n this.onChangeFilters({myEventsOnly: this.props.showMyEventsOnly});\r\n }\r\n }\r\n\r\n private onPublishEvent = async (sendNotification: boolean) => {\r\n this.setState({selectedItems: []})\r\n this.onHideEventPreview();\r\n const draftId = this.state.eventPreview?.id;\r\n if (draftId){\r\n await this.props.publishEvent(draftId, sendNotification);\r\n }\r\n }\r\n\r\n public render() {\r\n const { page } = this.props;\r\n\r\n if (!this.props.show)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n if (page.isFetching && !this.state.isPagedLoad)\r\n return <div style={{ paddingTop: \"60px\" }}><Loading /></div>;\r\n\r\n return (\r\n <div>\r\n <EventActionToolbar\r\n pageId={page.id}\r\n selectedItems={this.state.selectedItems}\r\n actions={{\r\n onClearAll: this.onClearAllEvents,\r\n onPreview: this.onPreviewEvent,\r\n onEdit: this.onHandleEdit,\r\n onClone: this.onCloneEvent,\r\n }}\r\n isContributor={this.state.isContributor}\r\n />\r\n <TabContent>\r\n {this.getFilter()}\r\n {this.getList()}\r\n {this.state.eventPreview &&\r\n <EventPreview\r\n show={this.state.showEventPreview}\r\n event={this.state.eventPreview}\r\n isContributor={this.state.isContributor}\r\n onEditDetails={this.onHandleEdit}\r\n onClose={this.onHideEventPreview}\r\n onPublish={this.onPublishEvent}\r\n inEditor={false}\r\n />\r\n }\r\n <DeleteEventConfirmation show={this.state.showDeleteEventConfirmation} multiple={this.state.selectedItems.length > 1} onConfirm={this.onDeleteEvents} onCancel={this.onHideDeleteEventConfirmation} />\r\n </TabContent>\r\n </div>\r\n );\r\n }\r\n\r\n private formatEpochTime = (time?: Epoch): string => {\r\n if (time) {\r\n return moment(new Date(time.date)).format(\"MMM D, YYYY\");\r\n }\r\n return \"-\";\r\n }\r\n\r\n private formatEpochTimeFromNow = (time?: Epoch): string => {\r\n if (time) {\r\n return moment(new Date(time.date)).fromNow();\r\n }\r\n return \"-\";\r\n }\r\n\r\n private formatTime = (startTime: string, isAllDay?: boolean): string => {\r\n if (!startTime) return \"-\";\r\n if (isAllDay) return formatDate(new Date(startTime), true, false);\r\n return moment(new Date(startTime)).format(\"MMM D, YYYY\");\r\n }\r\n\r\n private getDefaultFilterValues = (): Partial<EventFilterValues> => {\r\n const filters: Partial<EventFilterValues> = {\r\n eventTypes: [],\r\n eventStates: [],\r\n lcidToSearch: \"en-us\",\r\n textToSearch: \"\",\r\n tags: []\r\n };\r\n return filters;\r\n }\r\n\r\n private getFilter = (): JSX.Element => {\r\n return (\r\n <EventFilters\r\n filters={this.state.filters}\r\n pageId={this.props.page.id}\r\n onChangeFilters={this.onChangeFilters}\r\n onClearFilters={this.onClearFilters}\r\n availableTopics={this.props.availableTopics}\r\n onlyNewer={this.props.page.id === 'scheduled'}\r\n onlyOlder={this.props.page.id === 'published'}\r\n />\r\n );\r\n }\r\n\r\n private getHeader = (): HeaderCell[] => {\r\n const { page } = this.props;\r\n\r\n let header: HeaderCell[] = [\r\n {\r\n id: \"title\",\r\n label: \"Event title\",\r\n ascValue: SortStyle.titleAsc,\r\n descValue: SortStyle.titleDesc,\r\n clickable: true\r\n },\r\n ];\r\n\r\n header.push({ id: \"options\", label: \"\" })\r\n if (page.id === \"submissions\")\r\n \t header.push({ id: \"submissionTime\", label: \"Submitted on\", ascValue: SortStyle.submittedAsc, descValue: SortStyle.submittedDesc, clickable: true });\r\n\r\n if (page.id === \"all\")\r\n\t header.push({ id: \"eventState\", label: \"State\", ascValue: SortStyle.stateAsc, descValue: SortStyle.stateDesc, clickable: true });\r\n\r\n \theader.push({ id: \"eventStartTime\", label: \"Start date\", ascValue: SortStyle.startAsc, descValue: SortStyle.startDesc, clickable: true });\r\n\r\n if (page.id !== \"drafts\" && page.id !== \"submissions\")\r\n\t header.push({ id: \"publishedTime\", label: \"Publish date\", ascValue: SortStyle.publishAsc, descValue: SortStyle.publishDesc, clickable: true });\r\n\r\n \theader.push({ id: \"modifiedTime\", label: \"Last modified\", ascValue: SortStyle.modifiedAsc, descValue: SortStyle.modifiedDesc, clickable: true });\r\n\r\n if (page.id !== \"submissions\")\r\n \t header.push({ id: \"eventType\", label: \"Type\", ascValue: SortStyle.typeAsc, descValue: SortStyle.typeDesc, clickable: true });\r\n\r\n \theader.push({ id: \"author\", label: \"Published by\", ascValue: SortStyle.authorAsc, descValue: SortStyle.authorDesc, clickable: true });\r\n\r\n if (page.id === \"published\" || page.id === \"all\")\r\n header.push({ id: \"rsvpCount\", label: \"RSVPs\"});\r\n\r\n header.push({ id: \"tags\", label: \"Topics\" });\r\n\r\n return header;\r\n }\r\n\r\n private getList = (): JSX.Element => {\r\n const { page } = this.props;\r\n const { selectedItems } = this.state;\r\n\r\n const rowCount = page.events.length || 10;\r\n\r\n if (page.isFetching)\r\n return <div style={{ paddingTop: \"60px\" }}><Loading /></div>;\r\n\r\n if (!page.events.length)\r\n return (\r\n \t<ManagementEmptyResults searchType={\"Events\"} hasFilters={this.state.hasFiltersApplied}/>\r\n );\r\n\r\n return (\r\n <React.Fragment>\r\n {this.state.hasFiltersApplied &&\r\n <Typography variant=\"h2\" className=\"filter-results\">Results</Typography>\r\n }\r\n <EditPublishedContentDialog\r\n content={ContentType.Event}\r\n open={this.state.openEditPublishedEvent}\r\n onEdit={this.onEditEvent}\r\n onClose={() => this.setState({openEditPublishedEvent: false})}\r\n />\r\n\t <TableContainer>\r\n <Table size=\"medium\" id=\"events-table\">\r\n <TableHead>\r\n <TableRow>\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n color=\"primary\"\r\n indeterminate={selectedItems.length > 0 && selectedItems.length < rowCount}\r\n checked={rowCount > 0 && selectedItems.length === rowCount}\r\n onChange={this.onSelectAllEvents}\r\n inputProps={{ \"aria-label\": \"select all events\" }}\r\n />\r\n </TableCell>\r\n {this.getHeader().map((headerCell) => (\r\n <TableCell\r\n key={headerCell.id}\r\n align={headerCell.id === \"title\" ? \"left\" : \"center\"}\r\n padding={headerCell.id === \"title\" ? \"none\" : \"normal\"}\r\n onClick={() => this.onClickHeader(headerCell.descValue, headerCell.ascValue)}\r\n >\r\n <div style={{ paddingBottom: this.state.method === headerCell.ascValue || this.state.method === headerCell.descValue ? \"8px\" : \"0px\", cursor: headerCell.clickable ? \"pointer\" : \"\" }}>\r\n {headerCell.label}\r\n {this.state.method === headerCell.ascValue && <ArrowUpward htmlColor=\"#7A7A7A\" style={{ position: \"relative\", top: \"8px\", paddingLeft: \"2px\" }} />}\r\n {this.state.method === headerCell.descValue && <ArrowDownward htmlColor=\"#7A7A7A\" style={{ position: \"relative\", top: \"8px\", paddingLeft: \"2px\" }} />}\r\n </div>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {page.events\r\n .map((event, index) => {\r\n const isEventSelected = this.isEventSelected(event);\r\n const labelId = `event-list-checkbox-${index}`;\r\n const colorToUse = event.status.toLowerCase() === \"published\"\r\n ? \"green\"\r\n : event.status.toLowerCase() === \"draft\" \r\n ? \"grey\"\r\n : event.status.toLowerCase() === \"scheduled\" ? \"yellow\" : \"red\"\r\n\r\n return (\r\n <TableRow\r\n hover\r\n onClick={() => this.handleEventClick(event)}\r\n role=\"checkbox\"\r\n aria-checked={isEventSelected}\r\n tabIndex={-1}\r\n key={event.id}\r\n selected={isEventSelected}\r\n style={{ cursor: \"pointer\" }}\r\n >\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n color=\"primary\"\r\n checked={isEventSelected}\r\n inputProps={{ \"aria-labelledby\": labelId }}\r\n onClick={(ev) => this.onSelectEvent(ev, event)}\r\n />\r\n </TableCell>\r\n <TableCell component=\"th\" id={labelId} scope=\"row\" padding=\"none\">\r\n <span style={{ display: \"flex\" }}>\r\n <span style={{ alignSelf: \"center\"}} id=\"event-title-span\">\r\n {event.title}\r\n </span>\r\n\r\n <span style={{ alignSelf: \"center\", marginLeft: \"15px\" }}>\r\n {this.state.isContributor && event.alertUnopened &&\r\n <HoverText label={<WarningIcon style={{ color: \"#e6911a\" }} />}>\r\n Event has been rejected or unpublished\r\n </HoverText>\r\n }\r\n </span>\r\n </span>\r\n </TableCell>\r\n <TableCell >\r\n <MoreOptions\r\n onPreview={this.onPreviewEvent}\r\n onClone={this.onCloneEvent}\r\n onDelete={this.onDeleteEvent}\r\n onUnpublish={this.onUnpublishEvent}\r\n onHandleEdit={this.onHandleEdit}\r\n event={event} />\r\n </TableCell>\r\n {page.id === \"submissions\" && <TableCell align=\"center\">{this.formatEpochTime(event.lastSubmittedTime)}</TableCell>}\r\n {page.id === \"all\" &&\r\n <TableCell align=\"center\" style={{ textTransform: \"capitalize\" }}>\r\n <span className={`item-state ${colorToUse}`}>{event.status?.toLowerCase() === \"submission\" ? \"needs review\" : event.status}</span>\r\n </TableCell>\r\n }\r\n <TableCell align=\"center\">{this.formatTime(event.eventStartTime, event.isAllDayEvent)}</TableCell>\r\n {page.id !== \"drafts\" && page.id !== \"submissions\" && <TableCell align=\"center\">{this.formatEpochTime(event.publishedTime)}</TableCell>}\r\n <TableCell align=\"center\">{this.formatEpochTimeFromNow(event.updatedTime)}</TableCell>\r\n {page.id !== \"submissions\" && <TableCell align=\"center\" style={{ textTransform: \"capitalize\" }}>{event.eventType}</TableCell>}\r\n <TableCell align=\"center\">{event.authorFullName ? event.authorFullName : event.author}</TableCell>\r\n {(page.id === \"published\" || page.id === \"all\") && <TableCell align=\"center\">{event.rsvpCount || \"-\"}</TableCell>}\r\n <TableCell align=\"center\"><ChipLabels chips={event.tags || []} emptyText=\"No tags selected\" /></TableCell>\r\n </TableRow>\r\n );\r\n })\r\n }\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n <Paging\r\n currentPage={page.currentPage}\r\n items={page.events}\r\n totalItems={page.totalEvents}\r\n totalPages={page.totalPages}\r\n onChangePage={this.onChangePage}\r\n resetSelection={this.resetSelection}\r\n />\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n /**\r\n * Removes content bands from redux when a pinned post\r\n * gets deleted. This will force a re-fetch if user goes to content bands\r\n * page during session and keeps their content up to date.\r\n */\r\n private getIsPinnedDeleted = (eventToDelete?: EventListItem): boolean => {\r\n const { contentBands, publishedContentBands } = this.props.contentBandsState;\r\n const selectedIds = this.state.selectedItems.map((event: EventListItem) => event.id);\r\n const idsToCheck = eventToDelete === undefined ? selectedIds : [eventToDelete.id];\r\n\r\n return isPinnedDeleted(contentBands, publishedContentBands, idsToCheck);\r\n };\r\n\r\n private onDeleteEvent = async (eventToDelete: EventListItem) => {\r\n const confirmationMessage: string = `You're about to permanently delete '${eventToDelete.title}'. You cannot undo this action.`;\r\n const isPinnedDeleted = this.getIsPinnedDeleted(eventToDelete);\r\n\r\n if (await confirm.show({\r\n title: `Delete Event`,\r\n text: (\r\n <div>\r\n <div>{confirmationMessage}</div>\r\n <br />\r\n <div>Are you sure?</div>\r\n </div>\r\n ),\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\"\r\n })) {\r\n if (isPinnedDeleted)\r\n this.props.clearContentBands();\r\n\r\n this.props.deleteEvents([eventToDelete]).then(() => {\r\n this.onClearAllEvents();\r\n });\r\n }\r\n }\r\n\r\n private onUnpublishEvent = async (eventToUnpublish: EventListItem) => {\r\n const confirmationMessage: string = `Unpublishing an event will reset its RSVP report, clearing the list of users who have submitted their RSVP and their response to any event questions.`;\r\n\r\n if (await confirm.show({\r\n title: `Unpublish Event`,\r\n text: (\r\n <div>\r\n <div>{confirmationMessage}</div>\r\n <br />\r\n <div>Would you like to proceed?</div>\r\n </div>\r\n ),\r\n yesColor: \"#3b78ab\",\r\n yesText: \"Unpublish\",\r\n noText: \"Cancel\"\r\n })) {\r\n this.props.unpublishEvent(eventToUnpublish.id).then(() => {\r\n this.onClearAllEvents();\r\n });\r\n }\r\n }\r\n\r\n private isEventSelected = (event: EventListItem): boolean => {\r\n return this.state.selectedItems.findIndex((selectedItem) => selectedItem.id === event.id) !== -1;\r\n }\r\n\r\n private onChangeFilters = (filters: Partial<EventFilterValues>) => {\r\n const updatedFilters = { ...this.state.filters, ...filters };\r\n this.setState({ filters: updatedFilters, hasFiltersApplied: true, isPagedLoad: true });\r\n this.props.fetchPage(1, updatedFilters);\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.setState({ hasFiltersApplied: false, filters: { ...this.getDefaultFilterValues() }, isPagedLoad: true });\r\n this.props.fetchPage(1, {});\r\n }\r\n\r\n\r\n private onClearAllEvents = () => this.setState({ selectedItems: [] });\r\n\r\n private onCloneEvent = (eventToClone?: EventListItem) => {\r\n let toPreview = (eventToClone === undefined) ? this.state.selectedItems[0] : eventToClone\r\n\r\n this.props.cloneEvent(toPreview.draftId).then((response) => {\r\n if (!!response) {\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/events/edit/\" + response.id);\r\n this.onClearAllEvents();\r\n }\r\n });\r\n }\r\n\r\n private handleEventClick = (event: EventListItem) => {\r\n if (event.publishedTime !== null) {\r\n this.onPreviewEvent(event);\r\n }\r\n else {\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/events/edit/\" + event.id);\r\n }\r\n }\r\n\r\n private onDeleteEvents = () => {\r\n this.onHideDeleteEventConfirmation();\r\n this.props.deleteEvents(this.state.selectedItems);\r\n this.onClearAllEvents();\r\n }\r\n\r\n private onHandleEdit = (eventSelected?: EventListItem) => {\r\n const toEdit = eventSelected ?? (this.state.selectedItems[0] ?? this.state.eventPreview);\r\n\r\n // special case: a contributor tries to edit an already published event\r\n this.state.isContributor && toEdit.publishedTime !== null && toEdit.status.toLowerCase() === \"published\"\r\n ? this.setState({openEditPublishedEvent: true, showEventPreview: false, selectedItems: [toEdit]})\r\n : this.onEditEvent(eventSelected);\r\n }\r\n\r\n private onEditEvent = (eventSelected?: EventListItem) => {\r\n let toViewId = eventSelected?.draftId ??\r\n (this.state.selectedItems[0]?.draftId ?? this.state.eventPreview?.id);\r\n this.props.redirectTo(`/${this.props.tenant}/admin/events/edit/${toViewId}`);\r\n }\r\n\r\n private onHideDeleteEventConfirmation = () => {\r\n this.setState({ showDeleteEventConfirmation: false });\r\n }\r\n\r\n private onHideEventPreview = () => {\r\n this.setState({ eventPreview: undefined, showEventPreview: false });\r\n }\r\n\r\n private onPreviewEvent = async (eventToDisplay?: EventListItem) => {\r\n const toPreview = (eventToDisplay === undefined) ? this.state.selectedItems[0] : eventToDisplay\r\n\r\n try {\r\n const draft = await this.props.getDraft(toPreview.draftId, ImageScale.Modal);\r\n this.setState({ eventPreview: {...draft, status: toPreview.status}, showEventPreview: true });\r\n } catch (error) {\r\n this.setState({ eventPreview: undefined, showEventPreview: false });\r\n }\r\n }\r\n\r\n private onSelectAllEvents = () => {\r\n if (this.state.selectedItems.length === this.props.page.events.length)\r\n this.setState({ selectedItems: [] });\r\n else\r\n this.setState({ selectedItems: this.props.page.events });\r\n }\r\n\r\n private onSelectEvent = (ev, event: EventListItem) => {\r\n let selectedItems = this.state.selectedItems.slice();\r\n ev.stopPropagation();\r\n\r\n if (selectedItems.findIndex((selectedItem) => selectedItem.id === event.id) === -1)\r\n selectedItems = selectedItems.concat([event]);\r\n else\r\n selectedItems = selectedItems.filter(selectedItem => selectedItem.id !== event.id);\r\n\r\n this.setState({ selectedItems });\r\n }\r\n\r\n //Default to descending, if currently descending make it ascending.\r\n private onClickHeader = (descValue: SortStyle | undefined, ascValue: SortStyle | undefined) => {\r\n const rowsPerPage = Cookies.get(ROWS_PER_PAGE_COOKIE_NAMES.DEFAULT);\r\n\r\n if (descValue === undefined || ascValue === undefined) {\r\n return;\r\n }\r\n\r\n if (this.state.method === descValue) {\r\n this.setState({ method: ascValue, filters: { ...this.state.filters, sortType: ascValue } }, () => {\r\n this.onChangePage(0, Number(rowsPerPage) ?? 10);\r\n });\r\n }\r\n else {\r\n this.setState({ method: descValue, filters: { ...this.state.filters, sortType: descValue } }, () => {\r\n this.onChangePage(0, Number(rowsPerPage) ?? 10);\r\n });\r\n }\r\n }\r\n\r\n private resetSelection = () => {\r\n this.setState({selectedItems: []});\r\n }\r\n\r\n private onChangePage = (page: number, rowsPerPage: number) => {\r\n this.setState({ isPagedLoad: true });\r\n this.props.fetchPage(page + 1, this.state.filters, rowsPerPage);\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n page: EventListingPage;\r\n fetchPage: (pageNumber: number, filters: Partial<EventFilterValues>, pageAmount?: number) => void;\r\n initialSort: SortStyle;\r\n availableTopics: TenantSettingsTagGroup[];\r\n showMyEventsOnly: boolean;\r\n}\r\n\r\ninterface ComponentState {\r\n eventPreview: IEvent | undefined;\r\n filters: Partial<EventFilterValues>;\r\n hasFiltersApplied: boolean;\r\n isPagedLoad: boolean;\r\n selectedItems: EventListItem[];\r\n showDeleteEventConfirmation: boolean;\r\n openEditPublishedEvent: boolean;\r\n showEventPreview: boolean;\r\n method: SortStyle;\r\n isContributor: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenant: state.tenant.id,\r\n contentBandsState: state.contentBands,\r\n user: state.settings.currentUser\r\n }),\r\n {\r\n cloneEvent: actions.cloneEvent,\r\n deleteEvents: actions.deleteEvents,\r\n publishEvent: actions.publishEvent,\r\n unpublishEvent: actions.unpublishEvent,\r\n getDraft: actions.getDraft,\r\n redirectTo: push,\r\n clearContentBands: contentBandsSlice.actions.CLEAR_BANDS\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(EventList);\r\n","import * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\n\r\nimport { draftEventsApi } from 'api/instances';\r\nimport { ContentType } from 'modules/common/models';\r\nimport PublishedContentDialog from '../../../common/components/authoring/dialogs/publishedContentDialog';\r\nimport { useRetryableRequest } from 'modules/common/hooks/useRetryableRequest';\r\n\r\nconst MAX_RETRY_COUNT = 3;\r\nconst PublishedEventDialog: React.FunctionComponent<PropsWithRedux> = (props: PropsWithRedux) => {\r\n\r\n const fetchEventId = async () => \r\n await draftEventsApi.getPublishedFromDraftId(props.draftId ?? \"\");\r\n \r\n const { response, isFailed } = useRetryableRequest<string>({\r\n asyncRequest: fetchEventId,\r\n maxRetry: MAX_RETRY_COUNT,\r\n requesting: !!props.draftId\r\n });\r\n\r\n return (\r\n <PublishedContentDialog\r\n content={ContentType.Event}\r\n expectedPublishTime={props.expectedPublishTime?.date.toString() ?? \"\"}\r\n contentId={response}\r\n hideFeedRedirect={isFailed}\r\n />\r\n );\r\n};\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n expectedPublishTime: state.events.pendingPublishing?.publishedTime,\r\n draftId: state.events.pendingPublishing?.draftId\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(PublishedEventDialog);","import React from \"react\";\r\n\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Button from \"@mui/material/Button\";\r\nimport Hidden, { HiddenProps } from \"@mui/material/Hidden\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\n\r\nimport MoreHorizIcon from \"@mui/icons-material/MoreHoriz\";\r\nimport AssignmentIcon from \"@mui/icons-material/Assignment\";\r\nimport AttachFileIcon from \"@mui/icons-material/AttachFile\";\r\nimport PersonIcon from \"@mui/icons-material/Person\";\r\nimport PhotoIcon from \"@mui/icons-material/Photo\";\r\nimport PlaylistAddIcon from \"@mui/icons-material/PlaylistAdd\";\r\n\r\nimport { EventType } from \"../../../models\";\r\nimport Menu from \"@mui/material/Menu\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport { ListItemIcon } from \"@mui/material\";\r\nimport RequireRole from \"modules/common/components/requireRole\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\n\r\ninterface IEventCommandBar {\r\n eventType?: EventType;\r\n actions: Record<EventCommandBarAction, IEventCommandBarAction>;\r\n};\r\n\r\nexport interface IEventCommandBarAction {\r\n onClick: () => void;\r\n disabled: boolean;\r\n startIcon?: JSX.Element;\r\n}\r\n\r\nexport enum EventCommandBarAction {\r\n ShowBanner,\r\n ShowSummary,\r\n AddOrganizer,\r\n AttachFiles,\r\n AddQuestion,\r\n}\r\n\r\ninterface IEventActionItem {\r\n key: string;\r\n action: IEventCommandBarAction;\r\n label: string;\r\n hiddenInBar?: HiddenProps;\r\n}\r\n\r\nexport const EventCommandBar: React.FunctionComponent<IEventCommandBar> = ({\r\n eventType,\r\n actions\r\n}) => {\r\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\r\n const showMoreActionsOpen = Boolean(anchorEl);\r\n\r\n const actionItems: IEventActionItem[] = [\r\n {\r\n key: \"banner-action\",\r\n action: { ...actions[EventCommandBarAction.ShowBanner], startIcon: <PhotoIcon /> },\r\n label: \"Insert Hero Banner\"\r\n },\r\n {\r\n key: \"summary-action\",\r\n action: { ...actions[EventCommandBarAction.ShowSummary], startIcon: <PlaylistAddIcon /> },\r\n label: \"Add Summary\",\r\n hiddenInBar: { mdDown: true },\r\n },\r\n {\r\n key: \"organizer-action\",\r\n action: { ...actions[EventCommandBarAction.AddOrganizer], startIcon: <PersonIcon /> },\r\n label: \"Custom Organizer\",\r\n hiddenInBar: { lgDown: true },\r\n },\r\n {\r\n key: \"files-action\",\r\n action: { ...actions[EventCommandBarAction.AttachFiles], startIcon: <AttachFileIcon /> },\r\n label: \"Attach Files\",\r\n hiddenInBar: { xlDown: true },\r\n },\r\n {\r\n key: \"question-action\",\r\n action: { ...actions[EventCommandBarAction.AddQuestion], startIcon: <AssignmentIcon /> },\r\n label: \"Add Question\",\r\n hiddenInBar: { xlDown: true },\r\n }\r\n ];\r\n\r\n const getCommandBar = (): (JSX.Element | undefined)[] => {\r\n return actionItems.map(item => {\r\n if (eventType === \"informational\" && item.key === \"question-action\") return undefined;\r\n\r\n return <RequireRole key={item.key} roleName={item.key === \"organizer-action\" ? UserRoleStrings.AUTHOR : UserRoleStrings.CONTRIBUTOR}>\r\n <Hidden {...item.hiddenInBar}>\r\n <Button variant=\"text\" color=\"primary\" {...item.action}>\r\n {item.label}\r\n </Button>\r\n </Hidden>\r\n </RequireRole>;\r\n }\r\n );\r\n };\r\n\r\n const onClickMoreActions = (event: React.MouseEvent<HTMLButtonElement>) => {\r\n setAnchorEl(event?.currentTarget);\r\n };\r\n\r\n const getMoreMenu = (): JSX.Element => {\r\n return <Menu\r\n open={showMoreActionsOpen}\r\n anchorEl={anchorEl}\r\n onClose={() => setAnchorEl(null)}\r\n >\r\n {\r\n actionItems\r\n .map(item => {\r\n if (eventType === \"informational\" && item.key === \"question-action\") return undefined;\r\n\r\n return <RequireRole key={item.key} roleName={item.key === \"organizer-action\" ? UserRoleStrings.AUTHOR : UserRoleStrings.CONTRIBUTOR}>\r\n <MenuItem\r\n key={item.key}\r\n disabled={item.action.disabled}\r\n onClick={() => {\r\n setAnchorEl(null);\r\n item.action.onClick();\r\n }}>\r\n <ListItemIcon>\r\n {item.action.startIcon}\r\n </ListItemIcon>\r\n <ListItemText primary={item.label} />\r\n </MenuItem>\r\n </RequireRole>;\r\n })\r\n }\r\n </Menu>;\r\n };\r\n\r\n return (\r\n <Paper square className=\"tab-root\">\r\n <div className=\"tab-commands\">\r\n {getCommandBar()}\r\n <Hidden xlUp>\r\n <IconButton onClick={onClickMoreActions} size=\"large\">\r\n <MoreHorizIcon color=\"primary\" />\r\n </IconButton>\r\n </Hidden>\r\n {getMoreMenu()}\r\n </div>\r\n </Paper>\r\n );\r\n};","import * as React from \"react\"\r\n\r\nimport NewEvent from \"./action-buttons/newEvent\";\r\nimport EventListing from \"./event-listing/eventListing\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Header from \"pages/common/header\";\r\nimport MainContent from \"pages/common/mainContent\";\r\n\r\n\r\nimport \"../styles/events.sass\";\r\n\r\nclass EventManagementPage extends React.Component<{}, {}> {\r\n public render() {\r\n return (\r\n <BasePage fullWidth>\r\n <Header\r\n title=\"Manage Events\"\r\n rightComponent={\r\n <NewEvent />\r\n }\r\n />\r\n <MainContent>\r\n <div className=\"authoring-page\">\r\n <EventListing />\r\n </div>\r\n </MainContent>\r\n </BasePage>\r\n );\r\n }\r\n}\r\n\r\nexport default EventManagementPage;\r\n","import * as React from \"react\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport BlockIcon from \"@mui/icons-material/Block\";\r\n\r\n\r\nclass Author extends React.Component<ComponentProps, ComponentState> {\r\n public render() {\r\n return (\r\n <Collapse in={this.props.show}>\r\n <Paper elevation={0} className=\"section-card\">\r\n <div className=\"optional-content-header\">\r\n <div></div>\r\n <div className=\"remove-optional-content\">\r\n <Button variant=\"text\" color=\"inherit\" startIcon={<BlockIcon />} onClick={this.props.onRemove}>Remove Custom {this.props.type}</Button>\r\n </div>\r\n </div>\r\n <div className=\"author\">\r\n <div className=\"custom-author-label\">\r\n {this.props.type}'s Name\r\n <TextField\r\n key={this.props.author}\r\n variant=\"outlined\"\r\n size=\"small\"\r\n placeholder=\"Enter name\"\r\n defaultValue={this.props.author || \"\"}\r\n fullWidth\r\n InputLabelProps={{\r\n shrink: true\r\n }}\r\n onBlur={this.onChangeAuthor}\r\n />\r\n </div>\r\n \r\n <div className=\"custom-author-label\">\r\n {this.props.type}'s Email Address\r\n <TextField\r\n key={this.props.authorEmail}\r\n variant=\"outlined\"\r\n size=\"small\"\r\n placeholder=\"Enter valid email address\"\r\n defaultValue={this.props.authorEmail || \"\"}\r\n fullWidth\r\n InputLabelProps={{\r\n shrink: true\r\n }}\r\n onBlur={this.onChangeAuthorEmail}\r\n />\r\n </div>\r\n </div>\r\n </Paper>\r\n </Collapse>\r\n );\r\n }\r\n\r\n private onChangeAuthor = (event) => {\r\n this.props.onChangeAuthor(event.target.value);\r\n }\r\n\r\n private onChangeAuthorEmail = (event) => {\r\n this.props.onChangeAuthorEmail(event.target.value);\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n author: string | undefined;\r\n authorEmail: string | undefined;\r\n type: \"Author\" | \"Organizer\";\r\n onChangeAuthor: (author: string) => void;\r\n onChangeAuthorEmail: (authorEmail: string) => void;\r\n onRemove: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n}\r\n\r\nexport default Author;","import * as React from \"react\";\r\n\r\n\r\nclass Video extends React.Component<ComponentProps, ComponentState> {\r\n private player;\r\n private videoRef: HTMLVideoElement;\r\n\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n isPlaying: false\r\n };\r\n }\r\n\r\n private getSourceType(src: string, fileName?: string): string | null {\r\n if (src.toLowerCase().includes(\"/manifest(format=m3u8-aapl\"))\r\n return \"application/x-mpegURL\";\r\n \r\n if (fileName) {\r\n const standardizedText = fileName.toLowerCase();\r\n if (standardizedText.includes(\".mp4\"))\r\n return \"video/mp4\";\r\n if (standardizedText.includes(\".ogg\"))\r\n return \"video/ogg\";\r\n if (standardizedText.includes(\".webm\"))\r\n return \"video/webm\";\r\n }\r\n return null;\r\n }\r\n\r\n private initialize(src: string, fileName?: string) {\r\n if (this.videoRef) {\r\n const type = this.getSourceType(src, fileName);\r\n\r\n const options = {\r\n ...this.props,\r\n html5: {\r\n nativeVideoTracks: false,\r\n nativeAudioTracks: false\r\n },\r\n sources: src\r\n ? [{ src: `${src.replace(\"http://\",\"https://\")}#t=0.1`, type: type }]\r\n : null\r\n };\r\n\r\n this.player = (window as any).videojs(this.videoRef, options);\r\n this.player\r\n .ready(() => {\r\n this.player.src(src);\r\n })\r\n .on(\"ended\", () => {\r\n this.player.pause().currentTime(0).trigger(\"loadstart\");\r\n })\r\n .on(\"loadeddata\", () => {\r\n if (this.player.paused()) this.player.bigPlayButton.el_.style.display = \"block\";\r\n })\r\n .on(\"pause\", () => {\r\n this.player.bigPlayButton.el_.style.display = \"block\";\r\n })\r\n .on(\"play\", () => {\r\n this.player.bigPlayButton.el_.style.display = \"none\";\r\n });\r\n } else {\r\n this.forceUpdate();\r\n }\r\n }\r\n\r\n public componentDidMount() {\r\n this.initialize(this.props.src, this.props.fileName);\r\n }\r\n\r\n public componentDidUpdate(prevProps: ComponentProps) {\r\n if (!!this.props.pauseVideo && (this.props.pauseVideo !== prevProps.pauseVideo))\r\n this.pauseVideo();\r\n }\r\n\r\n public componentWillUnmount() {\r\n if (this.player) {\r\n this.player.dispose();\r\n }\r\n }\r\n\r\n public render() {\r\n const { style, className } = this.props;\r\n const { isPlaying } = this.state;\r\n\r\n return (\r\n <div style={{ ...style, zIndex: isPlaying ? 1 : 0 }} className={className}>\r\n <div data-vjs-player>\r\n <video\r\n ref={ node => this.videoRef = node! }\r\n controls\r\n data-setup=\"{'fluid': true}\"\r\n crossOrigin=\"anonymous\"\r\n preload=\"metadata\"\r\n onPlay={() => this.setIsPlaying(true)}\r\n onPause={() => this.setIsPlaying(false)}\r\n className=\"video-js vjs-default-skin post-video-primary vjs-16-9 vjs-big-play-centered\">\r\n </video>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n private setIsPlaying = (isPlaying: boolean) => this.setState({ isPlaying });\r\n private pauseVideo = () => this.player.pause();\r\n}\r\n\r\ninterface ComponentProps {\r\n src: string;\r\n fileName?: string;\r\n pauseVideo: boolean;\r\n\r\n style?: React.CSSProperties;\r\n className?: string;\r\n}\r\n\r\ninterface ComponentState {\r\n isPlaying: boolean;\r\n}\r\n\r\nexport default Video;","import * as React from \"react\";\r\nimport * as galleryActions from \"modules/gallery/actionCreator\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport { Icons } from \"modules/common/icons\";\r\n\r\nimport { AttachedFile } from \"modules/gallery/models\";\r\nimport { CroppableImage } from \"../models\";\r\n\r\nimport Video from \"../video/video\";\r\nimport ImageCropper from \"../dialogs/imageCropper\";\r\nimport ImageGalleryDialog from \"../dialogs/imageGalleryDialog\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport Fab from \"@mui/material/Fab\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Paper from \"@mui/material/Paper\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport BlockIcon from \"@mui/icons-material/Block\";\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\nimport CropIcon from \"@mui/icons-material/Crop\";\r\nimport FiberManualRecordIcon from \"@mui/icons-material/FiberManualRecord\";\r\nimport KeyboardArrowLeftIcon from \"@mui/icons-material/KeyboardArrowLeft\";\r\nimport KeyboardArrowRightIcon from \"@mui/icons-material/KeyboardArrowRight\";\r\nimport CanvasPreviewImage from \"../../canvasPreviewImage\";\r\nimport { CONTENT_MODAL_WIDTH, HERO_IMG_HEIGHT } from \"utils/generalConstants\";\r\nimport PortraitImage from \"../../paddedImage\";\r\n\r\n\r\nclass HeroBanner extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n includeVideos: false,\r\n multiSelect: false,\r\n pauseVideo: false,\r\n selectedCarouselIndex: 0,\r\n selectedImage: undefined,\r\n showImageCropper: false,\r\n showImageGallery: false\r\n };\r\n }\r\n\r\n public render() {\r\n const hasCarousel: boolean = !!(this.props.attachedContent || []).length;\r\n const carouselLength: number = hasCarousel ? this.props.attachedContent!.length : 0;\r\n\r\n const { selectedCarouselIndex } = this.state;\r\n\r\n return (\r\n <Collapse in={this.props.show}>\r\n <Paper elevation={0} className=\"section-card\">\r\n <div className=\"optional-content-header\">\r\n <div>Hero Banner</div>\r\n {!!this.props.optional &&\r\n <div className=\"remove-optional-content\">\r\n <Button variant=\"text\" color=\"inherit\" startIcon={<BlockIcon />} onClick={this.props.onRemove}>Remove Banner</Button>\r\n </div>\r\n }\r\n </div>\r\n <div style={{ maxWidth: 800, margin: \"auto\" }}>\r\n <div className=\"hero-banner\" style={{ display: \"flex\" }}>\r\n <div className=\"hero-banner-images\">\r\n {(!this.props.image || !this.props.image.id)\r\n ? <p onClick={this.onSelectAnImage} className=\"empty-image-target\">\r\n <Icons.AddImage width=\"60px\" height=\"60px\" />\r\n <span className=\"instruction\">Select an image</span>\r\n </p>\r\n : <div style={{ transform: `translateX(${selectedCarouselIndex * - 100}%)` }} className=\"hero-banner-image\">\r\n {this.props.image.transforms && this.props.image.transforms.points.length !== 0 && this.props.image.transforms.zoom\r\n ? <CanvasPreviewImage height={450} width={800} src={this.props.image.url} cropPoints={this.props.image.transforms.points} />\r\n : <PortraitImage \r\n src={this.props.image.url}\r\n height=\"450px\"\r\n width=\"800px\"\r\n backgroundColor=\"#DDE1E5\"\r\n />\r\n }\r\n <div className=\"image-preview-options\">\r\n <Fab size=\"small\" title=\"Crop image\" onClick={this.onShowImageCropper}>\r\n <CropIcon />\r\n </Fab>\r\n <Fab size=\"small\" title=\"Remove\" onClick={this.onRemoveImage}>\r\n <ClearIcon />\r\n </Fab>\r\n </div>\r\n </div>\r\n }\r\n {hasCarousel && this.props.attachedContent!.map((attachedImage) =>\r\n attachedImage.fileType === \"image\"\r\n ? <div key={attachedImage.ospreyId} style={{ backgroundImage: \"url('\" + attachedImage.fileUrl + \"')\", transform: `translateX(${selectedCarouselIndex * - 100}%)`, backgroundSize: \"contain\", backgroundColor: \"#DDE1E5\" }} className=\"hero-banner-image\">\r\n <div className=\"image-preview-options\">\r\n <Fab size=\"small\" title=\"Remove\" onClick={() => this.onRemoveAttachedContent(attachedImage)}>\r\n <ClearIcon />\r\n </Fab>\r\n </div>\r\n </div>\r\n : <div key={attachedImage.ospreyId} style={{ backgroundImage: \"url('\" + attachedImage.fileUrl + \"')\", transform: `translateX(${selectedCarouselIndex * - 100}%)` }} className=\"hero-banner-image\">\r\n <Video key={attachedImage.ospreyId} src={attachedImage.fileUrl!} fileName={attachedImage.fileName} pauseVideo={this.state.pauseVideo} />\r\n <div className=\"image-preview-options\">\r\n <Fab size=\"small\" title=\"Remove\" onClick={() => this.onRemoveAttachedContent(attachedImage)}>\r\n <ClearIcon />\r\n </Fab>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n {hasCarousel &&\r\n <React.Fragment>\r\n <IconButton\r\n color=\"primary\"\r\n disabled={selectedCarouselIndex === 0}\r\n onClick={this.onGoToPreviousImage}\r\n className=\"hero-banner-arrow left-arrow\"\r\n size=\"large\">\r\n <KeyboardArrowLeftIcon fontSize=\"inherit\" />\r\n </IconButton>\r\n <div className=\"hero-banner-counter\">\r\n {selectedCarouselIndex === 0\r\n ? <span>Banner Image</span>\r\n : <span>{selectedCarouselIndex} of {carouselLength}</span>\r\n }\r\n </div>\r\n <IconButton\r\n color=\"primary\"\r\n disabled={selectedCarouselIndex === carouselLength}\r\n onClick={this.onGoToNextImage}\r\n className=\"hero-banner-arrow right-arrow\"\r\n size=\"large\">\r\n <KeyboardArrowRightIcon fontSize=\"inherit\" />\r\n </IconButton>\r\n </React.Fragment>\r\n }\r\n </div>\r\n </div>\r\n {hasCarousel &&\r\n <div className=\"hero-banner-steps\">\r\n <IconButton color={selectedCarouselIndex === 0 ? \"primary\" : \"inherit\"} size=\"small\" onClick={() => this.onSelectStep(0)}><FiberManualRecordIcon /></IconButton>\r\n {this.props.attachedContent!.map((_, index) =>\r\n <IconButton key={index} color={selectedCarouselIndex === index + 1 ? \"primary\" : \"inherit\"} size=\"small\" onClick={() => this.onSelectStep(index + 1)}><FiberManualRecordIcon fontSize=\"small\" /></IconButton>\r\n )}\r\n </div>\r\n }\r\n <Button variant=\"text\" color=\"primary\" size=\"small\" startIcon={<AddIcon fontSize=\"small\" />} onClick={this.onShowImageGallery} className=\"add-new-item\">Add Media</Button>\r\n <ImageCropper\r\n show={this.state.showImageCropper}\r\n images={[ this.state.selectedImage! ]}\r\n onPageChange={this.onApplyImageTransforms}\r\n onClose={this.onHideImageCropper}\r\n cropBoundary={{ height: HERO_IMG_HEIGHT, width: CONTENT_MODAL_WIDTH }}\r\n />\r\n <ImageGalleryDialog\r\n {...this.props}\r\n show={this.state.showImageGallery}\r\n attachedContent={this.props.attachedContent}\r\n includeVideos={this.state.includeVideos}\r\n multiSelect={this.state.multiSelect}\r\n onApply={this.onApplyImageChanges}\r\n onClose={this.onHideImageGallery}\r\n />\r\n <LoadingOverlay absolute={true} show={this.props.isFetching} />\r\n </Paper>\r\n </Collapse>\r\n );\r\n }\r\n\r\n private onApplyImageChanges = (selectedImages: AttachedFile[]) => {\r\n if (this.state.multiSelect)\r\n this.onChangeAttachedContent(selectedImages);\r\n else\r\n this.onChangeImage(selectedImages);\r\n }\r\n\r\n private onApplyImageTransforms = (image: CroppableImage, finished: boolean) => {\r\n this.props.onChangeImage(image);\r\n\r\n if (finished)\r\n this.onHideImageCropper();\r\n }\r\n\r\n private onChangeAttachedContent = (selectedImages: AttachedFile[]) => {\r\n Promise.all(selectedImages.map((selectedImage) => {\r\n if (selectedImage.fileType === \"video\") {\r\n return this.props.getVideo(selectedImage.ospreyId).then((url) => {\r\n return {\r\n ...selectedImage,\r\n fileUrl: url\r\n }\r\n });\r\n } else {\r\n // grab the original image so we are not stretching gallery size into 800px wide\r\n return this.props.getImage(selectedImage.ospreyId).then((selectedImage: AttachedFile) => {\r\n return {\r\n ...selectedImage\r\n };\r\n })\r\n }\r\n })).then((selection) => {\r\n this.props.getVideosComplete();\r\n this.props.onChangeAttachedContent(selection);\r\n });\r\n }\r\n\r\n private onChangeImage = (selectedImages: AttachedFile[]) => {\r\n this.props.getImage(selectedImages[0].ospreyId).then((selectedImage) => {\r\n this.setState({\r\n ...this.state,\r\n includeVideos: false,\r\n selectedImage: { id: selectedImage.ospreyId, url: selectedImage.fileUrl!, transforms: { points: [], zoom: 0 } },\r\n showImageCropper: true\r\n });\r\n });\r\n }\r\n\r\n private onGoToNextImage = () => {\r\n this.pauseVideo();\r\n this.setState({ selectedCarouselIndex: this.state.selectedCarouselIndex + 1 });\r\n }\r\n\r\n private onGoToPreviousImage = () => {\r\n this.pauseVideo();\r\n this.setState({ selectedCarouselIndex: this.state.selectedCarouselIndex - 1 });\r\n }\r\n\r\n private onHideImageCropper = () => {\r\n this.setState({ selectedImage: undefined, showImageCropper: false });\r\n }\r\n\r\n private onHideImageGallery = () => {\r\n this.setState({ includeVideos: false, showImageGallery: false });\r\n }\r\n\r\n private onRemoveAttachedContent = (attachedContentToRemove: AttachedFile) => {\r\n this.pauseVideo();\r\n if (this.state.selectedCarouselIndex === this.props.attachedContent!.length)\r\n this.onGoToPreviousImage();\r\n this.props.onChangeAttachedContent(this.props.attachedContent!.filter((attachedImage) => attachedImage.ospreyId !== attachedContentToRemove.ospreyId));\r\n }\r\n\r\n private onRemoveImage = () => {\r\n this.pauseVideo();\r\n this.props.onRemoveImage();\r\n }\r\n\r\n private onSelectAnImage = () => {\r\n this.setState({ includeVideos: false, multiSelect: false, showImageGallery: true });\r\n }\r\n\r\n private onSelectStep = (index: number) => {\r\n this.pauseVideo();\r\n this.setState({ selectedCarouselIndex: index });\r\n }\r\n\r\n private onShowImageCropper = () => {\r\n this.setState({ selectedImage: this.props.image, showImageCropper: true });\r\n }\r\n\r\n private onShowImageGallery = () => {\r\n this.pauseVideo();\r\n this.setState({ includeVideos: true, multiSelect: true, showImageGallery: true });\r\n }\r\n\r\n private pauseVideo = () => {\r\n this.setState({ pauseVideo: true }, () => this.setState({ pauseVideo: false }));\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n attachedContent: AttachedFile[] | undefined;\r\n image: CroppableImage | undefined;\r\n optional?: boolean;\r\n onChangeAttachedContent: (selectedImages: AttachedFile[]) => void;\r\n onChangeImage: (image: CroppableImage) => void;\r\n onRemove: () => void;\r\n onRemoveImage: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n includeVideos: boolean;\r\n multiSelect: boolean;\r\n pauseVideo: boolean;\r\n selectedCarouselIndex: number;\r\n selectedImage: CroppableImage | undefined;\r\n showImageCropper: boolean;\r\n showImageGallery: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n isFetching: state.gallery.isFetching\r\n }), {\r\n getImage: galleryActions.getImage,\r\n getVideo: galleryActions.getVideo,\r\n getVideosComplete: galleryActions.getVideosComplete\r\n}\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(HeroBanner);\r\n","export const CONTENT_MODAL_WIDTH = 800;\r\nexport const HERO_IMG_HEIGHT = 450; // this should keep a 16:9 aspect ration with the above value\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { Tag } from \"./models\";\r\n\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport Disclaimer from \"../disclaimer\";\r\nimport { tagsApi } from \"api/instances\";\r\n\r\ninterface TagList {\r\n id: string;\r\n name: string;\r\n tags: Tag[];\r\n}\r\n\r\nclass AuthoringWarnings extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n showTagsList: false,\r\n tagsList: this.getTagsList(),\r\n onlyRestricted: false\r\n };\r\n }\r\n\r\n public render() {\r\n const hasMixedRestrictions: boolean = this.hasMixedRestrictions();\r\n const hasMentionWarning: boolean = this.needsMentionWarning();\r\n\r\n return (\r\n <React.Fragment>\r\n <div className=\"section-card-heading\">Topics</div>\r\n {hasMixedRestrictions &&\r\n <Disclaimer\r\n icon={<InfoOutlinedIcon />}\r\n text={\r\n <React.Fragment>\r\n <span className=\"mixed-restrictions-warning\">\r\n Selecting both a restricted and a non-restricted topic could make the content available to unintended users.\r\n </span>\r\n </React.Fragment>\r\n }\r\n />\r\n }\r\n {hasMentionWarning &&\r\n <Disclaimer\r\n icon={<InfoOutlinedIcon />}\r\n text={\r\n <React.Fragment>\r\n <span className=\"mixed-restrictions-warning\">\r\n @Mentioning someone in a restricted post will not send a notification to the user if they do not have access to the restricted topic.\r\n </span>\r\n </React.Fragment>\r\n }\r\n />\r\n }\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private getTagsList = (): TagList[] => {\r\n let tagsList: TagList[] = [];\r\n\r\n tagsApi.getUserTags(true).then(tagGroups => {\r\n tagGroups.map(tagGroup => {\r\n const tags: Tag[] = tagGroup.tags.filter((tag) => !tag.disabled);\r\n if (!!tags.length) {\r\n tagsList.push({\r\n id: tagGroup.id,\r\n name: tagGroup.name,\r\n tags: tags\r\n });\r\n }\r\n return tagGroup;\r\n });\r\n }).catch((_) => {\r\n tagsList = [];\r\n });\r\n\r\n return tagsList;\r\n }\r\n\r\n /*\r\n * Indicates when the selected topics are a mixture of both restricted and unrestricted topics.\r\n * returns: boolean, true if there's a mixture.\r\n */\r\n private hasMixedRestrictions = (): boolean => {\r\n if (!this.props.tags || !this.props.tags.length) return false;\r\n\r\n const selectedTopicIds = this.props.tags.map((topic: Tag) => topic.id);\r\n\r\n const hasRestricted = this.state.tagsList.flatMap((topicGroup: TagList) => topicGroup.tags)\r\n .some((topic: Tag) => selectedTopicIds.includes(topic.id) && topic.restricted);\r\n\r\n const hasNonRestricted = this.state.tagsList.flatMap((topicGroup: TagList) => topicGroup.tags)\r\n .some((topic: Tag) => selectedTopicIds.includes(topic.id) && !topic.restricted);\r\n\r\n return hasRestricted && hasNonRestricted;\r\n }\r\n\r\n /*\r\n * Indicates when a warning due to mentions should be shown.\r\n * returns: boolean, true if there's a mention in the text and there's ONLY restricted tags.\r\n */\r\n private needsMentionWarning = (): boolean => {\r\n if (!this.props.tags || !this.props.tags.length) return false;\r\n \r\n const selectedTopicIds = this.props.tags.map((topic: Tag) => topic.id);\r\n\r\n const isOnlyRestricted = this.state.tagsList\r\n .flatMap((topicGroup: TagList) => topicGroup.tags)\r\n .every( (topic: Tag) => !selectedTopicIds.includes(topic.id) || topic.restricted )\r\n\r\n return isOnlyRestricted && this.props.hasMention;\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n tags: Tag[];\r\n onChange: (tags: Tag[]) => void;\r\n hasMention: boolean;\r\n}\r\n\r\ninterface ComponentState {\r\n showTagsList: boolean;\r\n tagsList: TagList[];\r\n onlyRestricted: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tagSettings: state.settings.tagSettings\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(AuthoringWarnings);","import * as React from \"react\";\r\n\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport { ContentAnalysis as IContentAnalysis } from \"../models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport NavigationIcon from \"@mui/icons-material/Navigation\";\r\n\r\n\r\ntype SentimentScale = 1 | 2 | 3 | 4 | 5;\r\n\r\n\r\nclass ContentAnalysis extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n contentAnalysis: undefined\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: ComponentProps) {\r\n if (this.props.show && !prevProps.show) {\r\n this.getContentAnalysis();\r\n }\r\n }\r\n\r\n public render() {\r\n const { contentAnalysis } = this.state;\r\n\r\n const sentiment: SentimentScale = this.getSentimentNumber();\r\n const sentimentColor = this.getSentimentColor(sentiment);\r\n\r\n return (\r\n <Dialog open={this.props.show} maxWidth={false} onClose={this.onClose}>\r\n <DialogTitle className=\"events-dialog-header\">\r\n <div className=\"events-dialog-header-title\">\r\n <Typography variant=\"h2\">Content Analysis</Typography>\r\n <IconButton onClick={this.onClose} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent dividers className=\"content-analysis-content\">\r\n {!this.state.contentAnalysis\r\n ? <Loading padding={12} />\r\n : <div>\r\n <div className=\"analysis-columns\">\r\n <div className=\"analysis-column\">\r\n <div>\r\n <Typography variant=\"subtitle1\">Word Count</Typography>\r\n <div className=\"analysis-number-stat\">{contentAnalysis!.wordCount}</div>\r\n </div>\r\n <div>\r\n <Typography variant=\"subtitle1\">Estimated Reading Time</Typography>\r\n <div className=\"analysis-read-time\">\r\n <div className=\"analysis-number-stat\">{this.formatReadTime(contentAnalysis!.readingTime) === \"min\" ? contentAnalysis!.readingTime : (contentAnalysis!.readingTime.split(\":\"))[1]}</div>\r\n <div className=\"analysis-read-text\">{this.formatReadTime(contentAnalysis!.readingTime) === \"min\" ? \"minutes\" : \"seconds\"}</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"analysis-column\">\r\n <div>\r\n <Typography variant=\"subtitle1\">Tone</Typography>\r\n <div className=\"analysis-word-stat\">{contentAnalysis!.tone}</div>\r\n </div>\r\n <div>\r\n <Typography variant=\"subtitle1\">Sentiment</Typography>\r\n <div className=\"analysis-bar-wrapper\">\r\n <div className=\"analysis-sentiment-bar\">{this.getSentimentBar(sentiment, sentimentColor)}</div>\r\n <div style={{ color: sentimentColor }}>{`${this.getSentimentVerb(sentiment)}`}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"analysis-columns\">\r\n <div>\r\n <Typography variant=\"subtitle1\">English Proficiency Required</Typography>\r\n <div className=\"analysis-bar-wrapper\">\r\n <div className=\"analysis-proficiency-bar\">{this.getProficiencyBar(contentAnalysis!.ieltsScoreText, contentAnalysis!.ieltsScore)}</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"analysis-columns\">\r\n <div>\r\n <Typography variant=\"subtitle1\">Education Level for Easy Comprehension</Typography>\r\n <div className=\"analysis-word-stat\">\r\n {(contentAnalysis!.fogScoreText.split(\"(\"))[0]}\r\n <div className=\"ideal\">{this.isIdealScore()}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </DialogContent>\r\n <DialogActions className=\"events-dialog-footer\">\r\n <div className=\"events-dialog-disclaimer\">*Analytics are provided for English content only.</div>\r\n <Button variant=\"text\" onClick={this.onClose}>Close</Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n }\r\n\r\n private getContentAnalysis = () => {\r\n this.props.getContentAnalysis(this.props.id || \"00000000-0000-7368-6172-65706f696e74\", this.props.body).then((contentAnalysis) => {\r\n this.setState({ ...this.state, contentAnalysis });\r\n });\r\n }\r\n\r\n private getProficiencyBar = (scoreText: string, score: string): JSX.Element => {\r\n return (\r\n <React.Fragment>\r\n <div className=\"analysis-label-wrapper\">\r\n <div>Common (Ideal)</div>\r\n <div>Expert (Highly Academic)</div>\r\n </div>\r\n <div>\r\n {Array.apply(null, Array(3)).map((_, index) =>\r\n <div key={index} style={{ backgroundColor: this.getProficiencyColor(index) }} className=\"analysis-bar-section\"></div>)\r\n }\r\n </div>\r\n <div className=\"analysis-score-wrapper\">\r\n <NavigationIcon style={{ paddingLeft: this.getScoreLocation(score) }} />\r\n </div>\r\n <div className=\"analysis-score-text\">{scoreText}</div>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private getProficiencyColor = (index: number): string => {\r\n if (index === 2)\r\n return \"#E23030\";\r\n else if (index === 1)\r\n return \"#FFC327\";\r\n else\r\n return \"#5C9A26\";\r\n }\r\n\r\n private getScoreLocation = (score: string): string => {\r\n return `${(parseFloat(score) - 5) * (100 / 3)}%`;\r\n }\r\n\r\n private getSentimentBar = (sentiment: SentimentScale, backgroundColor: string): JSX.Element => {\r\n return (\r\n <React.Fragment>\r\n {Array.apply(null, Array(5)).map((_, index) => <div key={index} style={index < sentiment ? { backgroundColor } : {}} className=\"analysis-bar-section\"></div>)}\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private getSentimentColor = (sentiment: SentimentScale): string => {\r\n if (sentiment === 5)\r\n return \"#5c9a26\";\r\n else if (sentiment === 4)\r\n return \"#8bc34a\";\r\n else if (sentiment === 3)\r\n return \"#cddc39\";\r\n else if (sentiment === 2)\r\n return \"#ffc327\";\r\n\r\n return \"#e23030\";\r\n }\r\n\r\n private getSentimentNumber = (): SentimentScale => {\r\n if (!this.state.contentAnalysis)\r\n return 1;\r\n\r\n const sentiment: number = this.state.contentAnalysis.uiSentimentScore;\r\n\r\n if (sentiment >= 0.7)\r\n return 5;\r\n else if (sentiment > 0.3)\r\n return 4;\r\n else if (sentiment > -0.3)\r\n return 3;\r\n else if (sentiment > -0.7)\r\n return 2;\r\n\r\n return 1;\r\n }\r\n\r\n private getSentimentVerb = (sentiment: SentimentScale): string => {\r\n if (sentiment === 5)\r\n return \"Positive\";\r\n else if (sentiment === 4)\r\n return \"Slightly Positive\";\r\n else if (sentiment === 3)\r\n return \"Neutral\";\r\n else if (sentiment === 2)\r\n return \"Slightly Negative\";\r\n\r\n return \"Negative\";\r\n }\r\n\r\n private isIdealScore = (): string => {\r\n if (this.state.contentAnalysis!.fogScoreText.indexOf(\"(\") >= 0)\r\n return \"(Ideal)\";\r\n return \"\";\r\n\r\n }\r\n\r\n private formatReadTime = (time: string): string => {\r\n if ((time.split(\":\"))[0] === \"0\") {\r\n return \"sec\";\r\n }\r\n return \"min\";\r\n }\r\n\r\n private onClose = () => {\r\n this.setState({ ...this.state, contentAnalysis: undefined });\r\n this.props.onClose();\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n body: string;\r\n id?: string;\r\n getContentAnalysis: (id: string, text: string) => Promise<IContentAnalysis>;\r\n onClose: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n contentAnalysis: IContentAnalysis | undefined;\r\n}\r\n\r\nexport default ContentAnalysis;","import React from \"react\";\r\n\r\nimport ImageGalleryDialog from \"./dialogs/imageGalleryDialog\";\r\nimport IntenseEmphasis from \"./dialogs/intenseEmphasis\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from 'modules/posts/actionCreator';\r\nimport * as galleryActions from \"modules/gallery/actionCreator\";\r\nimport { AuthoringTinyEditor } from \"./authoringTinyMce\";\r\nimport { useTinyMceAuthoringLogic } from \"modules/common/hooks/useTinyMceAuthoringLogic\";\r\nimport * as adminLayoutActions from \"modules/adminLayout/actionCreator\";\r\nimport { ICustomCssModelv1 } from \"api/files\";\r\n\r\nimport \"./styles/body.sass\";\r\n\r\n/**\r\n * v1 authoring component\r\n */\r\n\r\nconst BodyComponent: React.FunctionComponent<PropsWithRedux> = ({\r\n body,\r\n defaultLcid,\r\n lcid,\r\n livePreview,\r\n floatingToolbar,\r\n customCss,\r\n changedSinceSaved,\r\n onChange,\r\n grabMentionUsers,\r\n getImage,\r\n setMainStyle,\r\n setHeaderStyle\r\n}) => {\r\n const {\r\n editorRef,\r\n intenseEmphasisDialogOpen,\r\n inlineImageDialogOpen,\r\n onShowInlineImageDialog,\r\n onShowIntenseEmphasisDialog,\r\n onApplyInlineImage,\r\n onApplyIntenseEmphasis,\r\n onHideInlineImageDialog,\r\n onHideIntenseEmphasisDialog\r\n } = useTinyMceAuthoringLogic(getImage);\r\n\r\n const onFullscreen = (isFullscreen?: boolean) => {\r\n if (isFullscreen) {\r\n // one more than side nav bar\r\n setMainStyle({ zIndex: 3 });\r\n setHeaderStyle({ display: \"none\" });\r\n } else {\r\n setMainStyle(undefined);\r\n setHeaderStyle(undefined);\r\n }\r\n }\r\n\r\n return (\r\n <div className=\"multilingual-editor-field\">\r\n <AuthoringTinyEditor\r\n customCss={customCss}\r\n value={body}\r\n activeLcid={lcid}\r\n defaultLcid={defaultLcid}\r\n livePreview={livePreview}\r\n floatingToolbar={floatingToolbar}\r\n editorRef={editorRef}\r\n changedSinceSaved={changedSinceSaved}\r\n onShowInlineImageDialog={onShowInlineImageDialog}\r\n onShowIntenseEmphasisDialog={onShowIntenseEmphasisDialog}\r\n grabMentionUsers={grabMentionUsers}\r\n onChange={onChange}\r\n onFullscreen={onFullscreen}\r\n initOptions={{\r\n max_height: 800,\r\n min_height: 350,\r\n }}\r\n />\r\n <ImageGalleryDialog show={inlineImageDialogOpen} allowLink onApply={onApplyInlineImage} onClose={onHideInlineImageDialog} />\r\n <IntenseEmphasis show={intenseEmphasisDialogOpen} onApply={onApplyIntenseEmphasis} onClose={onHideIntenseEmphasisDialog} />\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n body: string;\r\n livePreview?: boolean;\r\n floatingToolbar?: boolean;\r\n lcid: string;\r\n customCss?: ICustomCssModelv1;\r\n onChange: (body: string) => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n defaultLcid: state.settings.tenantSettings.defaultLCID,\r\n activeLanguage: state.settings.activeLanguageLCID,\r\n adminLayout: state.adminLayout,\r\n changedSinceSaved: state.posts.editor.changedSinceSaved\r\n }),\r\n {\r\n grabMentionUsers: actions.getMentionsUsers,\r\n getImage: galleryActions.getImage,\r\n setMainStyle: adminLayoutActions.setMainStyle,\r\n setHeaderStyle: adminLayoutActions.setHeaderStyle\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport const Body = connector(BodyComponent);\r\n","import * as React from \"react\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport BlockIcon from \"@mui/icons-material/Block\";\r\nimport FilledInput from \"../forms/inputs/filledInput\";\r\n\r\n\r\nclass Summary extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n oldSummary: \"\",\r\n };\r\n }\r\n\r\n public render() {\r\n const { summary } = this.props;\r\n\r\n return (\r\n <Collapse in={this.props.show}>\r\n <div className=\"multilingual-editor-field summary\">\r\n <FilledInput\r\n refreshable\r\n label={\"Summary\"}\r\n value={summary}\r\n characterCount\r\n maxCount={300}\r\n inputProps={{\r\n placeholder: \"Provide a short summary.\",\r\n style: {\r\n fontSize: \"1rem\",\r\n minHeight: \"auto\",\r\n padding: \"8.5px 14px\",\r\n },\r\n onFocus: this.onFocusSummary,\r\n onBlur: this.onBlurSummary\r\n }}\r\n style={{\r\n borderRadius: \"4px\",\r\n minHeight: \"auto\",\r\n padding: \"unset\",\r\n }}\r\n />\r\n <div className=\"remove-optional-content\">\r\n <Button variant=\"text\" color=\"inherit\" size=\"small\" startIcon={<BlockIcon fontSize=\"small\" />} onClick={this.props.onRemove}>Remove Summary</Button>\r\n </div>\r\n </div>\r\n </Collapse>\r\n );\r\n }\r\n\r\n private onChangeSummary = (newSummary: string) => {\r\n this.props.onChange(newSummary);\r\n }\r\n\r\n private onFocusSummary = (event: React.FocusEvent<HTMLInputElement>) => {\r\n let oldSummary = event.target.value;\r\n this.setState({ oldSummary });\r\n }\r\n\r\n private onBlurSummary = (event: React.FocusEvent<HTMLInputElement>) => {\r\n const newSummary = event.target.value as string;\r\n if (newSummary && this.state.oldSummary !== newSummary) {\r\n this.onChangeSummary(newSummary);\r\n }\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n summary: string;\r\n onChange: (summary: string) => void;\r\n onRemove: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n oldSummary: string;\r\n}\r\n\r\nexport default Summary;","import * as React from \"react\";\r\nimport FilledInput from \"../forms/inputs/filledInput\";\r\n\r\n\r\nclass Title extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n oldTitle: \"\",\r\n };\r\n }\r\n public render() {\r\n return (\r\n <div className=\"multilingual-editor-field\">\r\n <FilledInput\r\n refreshable\r\n label={\"Title\"}\r\n required\r\n value={this.props.title}\r\n characterCount\r\n maxCount={100}\r\n inputProps={{\r\n placeholder: `Enter ${this.props.type} title`,\r\n onFocus: this.onFocusTitle,\r\n onBlur: this.onBlurTitle,\r\n style: {\r\n fontSize: \"1rem\",\r\n minHeight: \"auto\",\r\n padding: \"8.5px 14px\",\r\n }\r\n }}\r\n style={{\r\n borderRadius: \"4px\",\r\n minHeight: \"auto\",\r\n padding: \"unset\",\r\n }}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n private onChangeTitle = (newTitle: string) => {\r\n this.props.onChange(newTitle);\r\n }\r\n\r\n private onFocusTitle = (event: React.FocusEvent<HTMLInputElement>) => {\r\n let oldTitle = event.target.value;\r\n this.setState({ oldTitle });\r\n }\r\n\r\n private onBlurTitle = (event: React.FocusEvent<HTMLInputElement>) => {\r\n let newTitle = event.target.value as string;\r\n if (this.state.oldTitle !== newTitle) {\r\n this.onChangeTitle(newTitle);\r\n }\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n title: string;\r\n type: \"post\" | \"event\";\r\n onChange: (title: string) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n oldTitle: string;\r\n}\r\n\r\nexport default Title;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { ContentAnalysis as IContentAnalysis, TranslatedContent as ITranslatedContent, TranslatableContent } from \"./models\";\r\nimport ContentAnalysis from \"./dialogs/contentAnalysis\";\r\nimport { Body } from \"./body\";\r\nimport Summary from \"./summary\";\r\nimport Title from \"./title\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport ClickAwayListener from \"@mui/material/ClickAwayListener\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport TimelineIcon from \"@mui/icons-material/Timeline\";\r\nimport TranslateIcon from \"@mui/icons-material/Translate\";\r\nimport { ILanguage } from \"modules/localization/models\";\r\nimport TranslateContentConfirmation from \"./dialogs/translateContentConfirmation\";\r\nimport { ICustomCssModelv1 } from \"api/files\";\r\n\r\nclass TranslatedContent extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n const availableLanguages: ILanguage[] = this.getAvailableLanguages();\r\n\r\n this.state = {\r\n activeLcid: props.tenantSettings ? props.tenantSettings.defaultLCID : \"en-us\",\r\n availableLanguages: availableLanguages,\r\n displayedLanguages: availableLanguages.filter((availableLanguage) => availableLanguage.visible),\r\n showAddLanguagesList: false,\r\n showContentAnalysis: false,\r\n showTranslationDialog: false,\r\n translatableLanguagesWithText: [],\r\n checkIfAnyTranslabableContent: false,\r\n };\r\n }\r\n\r\n componentWillMount() {\r\n this.setLanguageAvailability();\r\n }\r\n\r\n componentDidUpdate(prevProps: PropsWithRedux, prevState: ComponentState) {\r\n if ((!prevProps.lcidMappings && !!this.props.lcidMappings) || (!prevProps.tenantSettings && !!this.props.tenantSettings)) {\r\n const availableLanguages: ILanguage[] = this.getAvailableLanguages();\r\n\r\n this.setState({\r\n ...this.state,\r\n availableLanguages: availableLanguages,\r\n displayedLanguages: availableLanguages.filter((availableLanguage) => availableLanguage.visible),\r\n });\r\n }\r\n\r\n if (prevProps.translatedContent !== this.props.translatedContent) {\r\n this.setLanguageAvailability();\r\n }\r\n }\r\n\r\n public render() {\r\n if (!this.props.lcidMappings || !this.props.tenantSettings) return null;\r\n\r\n const { activeLcid } = this.state;\r\n const translatedContent: ITranslatedContent = this.props.translatedContent || {\r\n [activeLcid]: { body: \"\", description: \"\", title: \"\" },\r\n };\r\n const content: TranslatableContent = translatedContent[activeLcid] || { body: \"\", description: \"\", title: \"\" };\r\n\r\n const addLanguagesAvailable: boolean = this.state.displayedLanguages.length !== this.state.availableLanguages.length;\r\n\r\n return (\r\n <div>\r\n <div className=\"language-tabs\">\r\n <div>\r\n {this.state.displayedLanguages.map((displayedLanguage, index) => {\r\n const isActiveTab: boolean = activeLcid === displayedLanguage.lcid;\r\n const text: string = `${displayedLanguage.language} (${displayedLanguage.lcid})`;\r\n return (\r\n <div\r\n key={displayedLanguage.lcid}\r\n onClick={() => this.onSelectTab(displayedLanguage)}\r\n className={`language-tab${isActiveTab ? \" active-tab\" : \"\"}`}\r\n >\r\n <Typography key={displayedLanguage.lcid} data-text={text} className=\"language-tab-text\">\r\n {text}\r\n </Typography>\r\n {!!index && (\r\n <IconButton\r\n size=\"small\"\r\n onClick={(ev) => this.onShowRemoveContentConfirmation(ev, displayedLanguage)}\r\n className=\"delete-language-tab\"\r\n >\r\n <DeleteIcon fontSize=\"small\" />\r\n </IconButton>\r\n )}\r\n </div>\r\n );\r\n })}\r\n {addLanguagesAvailable && (\r\n <ClickAwayListener onClickAway={this.onHideAddLanguagesList}>\r\n <div className=\"add-language\">\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n size=\"small\"\r\n startIcon={<AddIcon />}\r\n onClick={this.onToggleAddLanguagesList}\r\n >\r\n Add Language\r\n </Button>\r\n {this.state.showAddLanguagesList && (\r\n <List className=\"add-languages-list\">\r\n {this.state.availableLanguages\r\n .filter((availableLanguage) => !availableLanguage.visible)\r\n .map((availableLanguage) => (\r\n <ListItem\r\n key={availableLanguage.lcid}\r\n button\r\n onClick={() => this.onAddLanguage(availableLanguage)}\r\n >\r\n <ListItemText\r\n primary={`${availableLanguage.language} (${availableLanguage.lcid})`}\r\n className=\"add-languages-list-item\"\r\n />\r\n </ListItem>\r\n ))}\r\n </List>\r\n )}\r\n </div>\r\n </ClickAwayListener>\r\n )}\r\n </div>\r\n {this.state.activeLcid === \"en-us\" && !!content.body && (\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n size=\"small\"\r\n startIcon={<TimelineIcon />}\r\n onClick={this.onShowContentAnalysis}\r\n >\r\n Analyze Content\r\n </Button>\r\n )}\r\n\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n size=\"small\"\r\n startIcon={<TranslateIcon />}\r\n disabled={this.state.checkIfAnyTranslabableContent}\r\n onClick={this.onShowTranslationDialog}\r\n >\r\n Translate\r\n </Button>\r\n </div>\r\n {this.state.showTranslationDialog && (\r\n <TranslateContentConfirmation\r\n show={this.state.showTranslationDialog}\r\n onConfirm={this.onConfirmDialog}\r\n onCancel={this.onCloseTranslationDialog}\r\n currentLanguagesWithText={this.state.translatableLanguagesWithText}\r\n />\r\n )}\r\n <Paper elevation={0} className=\"section-card\">\r\n <div className=\"multilingual-editor\">\r\n <Title\r\n title={content.title}\r\n type={this.props.type}\r\n onChange={this.onChangeTitle}\r\n />\r\n <Summary\r\n show={this.props.showSummary}\r\n summary={content.description}\r\n onChange={this.onChangeSummary}\r\n onRemove={this.onRemoveSummary}\r\n />\r\n <Body\r\n customCss={this.props.customCss}\r\n body={content.body}\r\n lcid={this.state.activeLcid}\r\n onChange={this.onChangeBody}\r\n />\r\n </div>\r\n </Paper>\r\n <ContentAnalysis\r\n show={this.state.showContentAnalysis}\r\n id={this.props.id}\r\n body={content.body}\r\n getContentAnalysis={this.props.getContentAnalysis}\r\n onClose={this.onHideContentAnalysis}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n private getAvailableLanguages = (): ILanguage[] => {\r\n if (!this.props.lcidMappings || !this.props.tenantSettings) return [];\r\n\r\n const defaultLcid: string = this.props.tenantSettings.defaultLCID;\r\n const lcids: string[] = Object.keys(this.props.tenantSettings.translatedContent);\r\n let languages: ILanguage[] = [];\r\n\r\n languages.push({\r\n availableForTranslation: false,\r\n language: this.props.lcidMappings[defaultLcid][\"languageShort\"] || this.props.lcidMappings[defaultLcid].language.split(\" \")[0],\r\n lcid: defaultLcid,\r\n translateAs: defaultLcid,\r\n visible: true,\r\n });\r\n\r\n lcids.map((lcid) => {\r\n if (lcid !== defaultLcid) {\r\n const currentMapping = this.props.lcidMappings[lcid];\r\n\r\n if (!currentMapping) return lcid;\r\n\r\n languages.push({\r\n availableForTranslation: currentMapping[\"availableForTranslation\"],\r\n language: currentMapping[\"languageShort\"] || currentMapping.language.split(\" \")[0],\r\n lcid: lcid,\r\n translateAs: currentMapping[\"translateAs\"],\r\n visible: !!this.props.translatedContent && !!this.props.translatedContent[lcid],\r\n });\r\n }\r\n return lcid;\r\n });\r\n return languages;\r\n };\r\n\r\n private getDraftTranslation = (inputLanguage: string) => {\r\n const outputLanguage: ILanguage = this.state.displayedLanguages.find((language) => language.lcid === this.state.activeLcid)!;\r\n\r\n this.props\r\n .getDraftTranslation(\r\n this.props.id || \"00000000-0000-7368-6172-65706f696e74\",\r\n this.props.translatedContent![inputLanguage],\r\n outputLanguage.translateAs\r\n )\r\n .then((content) => {\r\n this.props.onChange({\r\n ...this.props.translatedContent,\r\n [this.state.activeLcid]: {\r\n ...content,\r\n body: `<p><em>[${this.props.lcidMappings[this.state.activeLcid].autoTranslateText}]</em></p>${content.body}`,\r\n },\r\n });\r\n });\r\n };\r\n\r\n private onAddLanguage = (language: ILanguage) => {\r\n const availableLanguages: ILanguage[] = this.state.availableLanguages.map((availableLanguage) => {\r\n if (availableLanguage.lcid === language.lcid) return { ...availableLanguage, visible: true };\r\n return availableLanguage;\r\n });\r\n const displayedLanguages: ILanguage[] = this.state.displayedLanguages.concat([language]);\r\n\r\n this.props.onChange({ ...this.props.translatedContent, [language.lcid]: { body: \"\", description: \"\", title: \"\" } });\r\n\r\n this.setState({ ...this.state, activeLcid: language.lcid, availableLanguages, displayedLanguages, showAddLanguagesList: false });\r\n };\r\n\r\n private onChangeBody = (body: string) => {\r\n this.props.onChange({\r\n ...this.props.translatedContent,\r\n [this.state.activeLcid]: {\r\n ...this.props.translatedContent![this.state.activeLcid],\r\n body,\r\n },\r\n });\r\n };\r\n\r\n private onChangeSummary = (summary: string) => {\r\n this.props.onChange({\r\n ...this.props.translatedContent,\r\n [this.state.activeLcid]: {\r\n ...this.props.translatedContent![this.state.activeLcid],\r\n description: summary,\r\n },\r\n });\r\n };\r\n\r\n private onChangeTitle = (title: string) => {\r\n this.props.onChange({\r\n ...this.props.translatedContent,\r\n [this.state.activeLcid]: {\r\n ...this.props.translatedContent![this.state.activeLcid],\r\n title: title,\r\n },\r\n });\r\n };\r\n\r\n private onHideAddLanguagesList = () => {\r\n this.setState({ ...this.state, showAddLanguagesList: false });\r\n };\r\n\r\n private onHideContentAnalysis = () => {\r\n this.setState({ ...this.state, showContentAnalysis: false });\r\n };\r\n\r\n private onRemoveLanguage = (language: ILanguage) => {\r\n const languageToRemove: ILanguage = language;\r\n\r\n const availableLanguages: ILanguage[] = this.state.availableLanguages.map((availableLanguage) => {\r\n if (availableLanguage.lcid === languageToRemove.lcid) return { ...availableLanguage, visible: false };\r\n return availableLanguage;\r\n });\r\n const displayedLanguages: ILanguage[] = this.state.displayedLanguages.filter(\r\n (displayedLanguage) => displayedLanguage.lcid !== languageToRemove.lcid\r\n );\r\n const activeLcid: string =\r\n this.state.activeLcid !== languageToRemove.lcid\r\n ? this.state.activeLcid\r\n : displayedLanguages[displayedLanguages.length - 1].lcid;\r\n\r\n this.setState({ ...this.state, activeLcid, availableLanguages, displayedLanguages });\r\n\r\n let translatedContent: ITranslatedContent = this.props.translatedContent!;\r\n delete translatedContent[languageToRemove.lcid];\r\n\r\n this.props.onChange({ ...translatedContent });\r\n };\r\n\r\n private onRemoveSummary = () => {\r\n this.props.onRemoveSummary();\r\n this.onChangeSummary(\"\");\r\n };\r\n\r\n private onSelectTab = (language: ILanguage) => {\r\n this.setState({ ...this.state, activeLcid: language.lcid });\r\n };\r\n\r\n private onShowContentAnalysis = () => {\r\n this.setState({ ...this.state, showContentAnalysis: true });\r\n };\r\n\r\n private onShowRemoveContentConfirmation = async (ev, language: ILanguage) => {\r\n ev.stopPropagation();\r\n\r\n if (\r\n !!this.props.translatedContent![language.lcid].body ||\r\n !!this.props.translatedContent![language.lcid].description ||\r\n !!this.props.translatedContent![language.lcid].title\r\n ) {\r\n if (\r\n await confirm.show({\r\n text: \"Are you sure you want to remove this content? You may lose some of your work.\",\r\n title: `Remove ${language.language}`,\r\n })\r\n )\r\n this.onRemoveLanguage(language);\r\n } else {\r\n this.onRemoveLanguage(language);\r\n }\r\n };\r\n\r\n private onShowReplaceContentConfirmation = async (inputLanguage: string) => {\r\n if (!!this.props.translatedContent![this.state.activeLcid].body || !!this.props.translatedContent![this.state.activeLcid].title) {\r\n if (await confirm.show({ text: \"Are you sure you want to replace the existing content?\", title: \"Replace content\" }))\r\n this.getDraftTranslation(inputLanguage);\r\n } else {\r\n this.getDraftTranslation(inputLanguage);\r\n }\r\n };\r\n\r\n private onToggleAddLanguagesList = () => {\r\n this.setState({ ...this.state, showAddLanguagesList: !this.state.showAddLanguagesList });\r\n };\r\n\r\n /**\r\n * Handles setting the language availabilitys in the state.\r\n */\r\n private setLanguageAvailability = () => {\r\n let currentAvailableTranslations = { ...this.props.translatedContent };\r\n let languagesWithText: ILanguage[] = [];\r\n let allAddedLanguages: ILanguage[] = [];\r\n\r\n Object.keys(currentAvailableTranslations).forEach((nextLanguage) => {\r\n if (this.state.availableLanguages && this.props.translatedContent && (this.props.translatedContent[nextLanguage].body && this.props.translatedContent[nextLanguage].title)) {\r\n let matchingLang = this.state.availableLanguages.find((l) => l.lcid === nextLanguage);\r\n\r\n if (matchingLang) {\r\n languagesWithText.push(matchingLang);\r\n }\r\n }\r\n if (this.state.availableLanguages && this.props.translatedContent) {\r\n let matchingLang = this.state.availableLanguages.find((l) => l.lcid === nextLanguage);\r\n\r\n if (matchingLang) {\r\n allAddedLanguages.push(matchingLang);\r\n }\r\n }\r\n });\r\n\r\n if (languagesWithText.length >= 1 && allAddedLanguages.length > 1) {\r\n this.setState({\r\n ...this.state,\r\n checkIfAnyTranslabableContent: false,\r\n translatableLanguagesWithText: languagesWithText,\r\n });\r\n }\r\n else {\r\n this.setState({\r\n ...this.state,\r\n checkIfAnyTranslabableContent: true,\r\n translatableLanguagesWithText: languagesWithText,\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Handle showing the translation dialog\r\n */\r\n private onShowTranslationDialog = () => {\r\n this.setState({ ...this.state, showTranslationDialog: true });\r\n };\r\n\r\n /**\r\n * Handle closing the translation dialog\r\n */\r\n private onCloseTranslationDialog = () => {\r\n this.setState({ ...this.state, showTranslationDialog: false });\r\n };\r\n\r\n /**\r\n * Handle dialog selection for the translation dialog\r\n */\r\n private onConfirmDialog = (inputLanguage: string) => {\r\n this.setState({ ...this.state, showTranslationDialog: false });\r\n this.onShowReplaceContentConfirmation(inputLanguage);\r\n };\r\n}\r\n\r\ninterface ComponentProps {\r\n showSummary: boolean;\r\n id: string | undefined;\r\n translatedContent: ITranslatedContent | undefined;\r\n customCss?: ICustomCssModelv1;\r\n type: \"post\" | \"event\";\r\n getContentAnalysis: (id: string, text: string) => Promise<IContentAnalysis>;\r\n getDraftTranslation: (id: string, content: TranslatableContent, outputLCID: string) => Promise<TranslatableContent>;\r\n onChange: (translatedContent: ITranslatedContent) => void;\r\n onRemoveSummary: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n activeLcid: string;\r\n availableLanguages: ILanguage[];\r\n displayedLanguages: ILanguage[];\r\n showAddLanguagesList: boolean;\r\n showContentAnalysis: boolean;\r\n showTranslationDialog: boolean;\r\n translatableLanguagesWithText: ILanguage[];\r\n checkIfAnyTranslabableContent: boolean;\r\n}\r\n\r\nconst connector = connect((state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n lcidMappings: state.resources.lcidMappings,\r\n tenantSettings: state.settings.tenantSettings,\r\n}));\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(TranslatedContent);\r\n","import * as React from \"react\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogContentText from \"@mui/material/DialogContentText\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\n\r\n\r\nclass UpdateInPersonCapacity extends React.Component<ComponentProps, ComponentState> {\r\n public render() {\r\n return (\r\n <Dialog open={this.props.show} onClose={this.props.onCancel}>\r\n <DialogTitle>Accept RSVPs</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText>You removed the in-person location. Do you want to continue accepting In-person RSVPs?</DialogContentText>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onConfirm}>No</Button>\r\n <Button variant=\"contained\" color=\"primary\" autoFocus onClick={this.onCancel}>Yes</Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n }\r\n\r\n private onConfirm = () => {\r\n this.props.onConfirm();\r\n }\r\n\r\n private onCancel = () => {\r\n this.props.onCancel();\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n title?: string;\r\n onConfirm: () => void;\r\n onCancel: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n}\r\n\r\nexport default UpdateInPersonCapacity;","import * as React from \"react\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogContentText from \"@mui/material/DialogContentText\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\n\r\n\r\nclass UpdateOnlineCapacity extends React.Component<ComponentProps, ComponentState> {\r\n public render() {\r\n return (\r\n <Dialog open={this.props.show} onClose={this.props.onCancel}>\r\n <DialogTitle>Accept RSVPs</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText>You removed the online location. Do you want to continue accepting Online RSVPs?</DialogContentText>\r\n </DialogContent>\r\n <DialogActions>\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onConfirm}>No</Button>\r\n <Button variant=\"contained\" color=\"primary\" autoFocus onClick={this.onCancel}>Yes</Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n }\r\n\r\n private onConfirm = () => {\r\n this.props.onConfirm();\r\n }\r\n\r\n private onCancel = () => {\r\n this.props.onCancel();\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n title?: string;\r\n onConfirm: () => void;\r\n onCancel: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n}\r\n\r\nexport default UpdateOnlineCapacity;","import * as React from \"react\";\r\n\r\nimport { Capacity as ICapacity } from \"../../../models\";\r\n\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport InputAdornment from \"@mui/material/InputAdornment\";\r\nimport OutlinedInput from \"@mui/material/OutlinedInput\";\r\nimport Switch from \"@mui/material/Switch\";\r\n\r\n\r\nclass Capacity extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {};\r\n }\r\n\r\n public render() {\r\n const { capacity } = this.props;\r\n \r\n return (\r\n <div className=\"capacities\">\r\n <div className=\"section-card-subheading\">Capacity</div>\r\n <div className=\"capacity\">\r\n <div className=\"capacity-label\">In-person</div>\r\n <div className=\"capacity-input\">\r\n <Switch\r\n color=\"primary\"\r\n checked={capacity.InPerson !== 0}\r\n onChange={this.onToggleInPerson}\r\n />\r\n <FormControl size=\"small\">\r\n <OutlinedInput\r\n value={capacity.InPerson > -1 ? capacity.InPerson : \"\"}\r\n placeholder=\"Unlimited\"\r\n type=\"number\"\r\n disabled={this.props.disabled || capacity.InPerson === 0}\r\n fullWidth\r\n endAdornment={\r\n <InputAdornment position=\"end\">Pax.</InputAdornment>\r\n }\r\n inputProps={{ min: 0 }}\r\n onChange={this.onChangeInPerson}\r\n />\r\n </FormControl>\r\n </div>\r\n </div>\r\n <div className=\"capacity\">\r\n <div className=\"capacity-label\">Online</div>\r\n <div className=\"capacity-input\">\r\n <Switch\r\n color=\"primary\"\r\n checked={capacity.Online !== 0}\r\n onChange={this.onToggleOnline}\r\n />\r\n <FormControl size=\"small\">\r\n <OutlinedInput\r\n value={capacity.Online > -1 ? capacity.Online : \"\"}\r\n placeholder=\"Unlimited\"\r\n type=\"number\"\r\n disabled={this.props.disabled || capacity.Online === 0}\r\n fullWidth\r\n endAdornment={\r\n <InputAdornment position=\"end\">Pax.</InputAdornment>\r\n }\r\n inputProps={{ min: 0 }}\r\n onChange={this.onChangeOnline}\r\n />\r\n </FormControl>\r\n </div>\r\n </div>\r\n <div className=\"capacity\">\r\n <div className=\"capacity-label\">Waitlist</div>\r\n <div className=\"capacity-input\">\r\n <Switch\r\n color=\"primary\"\r\n checked={capacity.Waitlist !== 0}\r\n onChange={this.onToggleWaitlist}\r\n />\r\n <FormControl size=\"small\">\r\n <OutlinedInput\r\n value={capacity.Waitlist > -1 ? capacity.Waitlist : \"\"}\r\n placeholder=\"Unlimited\"\r\n type=\"number\"\r\n disabled={this.props.disabled || capacity.Waitlist === 0}\r\n fullWidth\r\n endAdornment={\r\n <InputAdornment position=\"end\">Pax.</InputAdornment>\r\n }\r\n inputProps={{ min: 0 }}\r\n onChange={this.onChangeWaitlist}\r\n />\r\n </FormControl>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n private onChangeInPerson = (event) => {\r\n if (event.target.value !== \"\")\r\n this.props.onChange({ ...this.props.capacity, InPerson: event.target.value });\r\n else\r\n this.props.onChange({ ...this.props.capacity, InPerson: -1 });\r\n }\r\n\r\n private onChangeOnline = (event) => {\r\n if (event.target.value !== \"\")\r\n this.props.onChange({ ...this.props.capacity, Online: event.target.value });\r\n else\r\n this.props.onChange({ ...this.props.capacity, Online: -1 });\r\n }\r\n\r\n private onChangeWaitlist = (event) => {\r\n if (event.target.value !== \"\")\r\n this.props.onChange({ ...this.props.capacity, Waitlist: event.target.value });\r\n else\r\n this.props.onChange({ ...this.props.capacity, Waitlist: -1 });\r\n }\r\n\r\n private onToggleInPerson = (ev, checked: boolean) => {\r\n if (checked)\r\n this.props.onChange({ ...this.props.capacity, InPerson: -1 });\r\n else\r\n this.props.onChange({ ...this.props.capacity, InPerson: 0 });\r\n }\r\n\r\n private onToggleOnline = (ev, checked: boolean) => {\r\n if (checked)\r\n this.props.onChange({ ...this.props.capacity, Online: -1 });\r\n else\r\n this.props.onChange({ ...this.props.capacity, Online: 0 });\r\n }\r\n\r\n private onToggleWaitlist = (ev, checked: boolean) => {\r\n if (checked)\r\n this.props.onChange({ ...this.props.capacity, Waitlist: -1 });\r\n else\r\n this.props.onChange({ ...this.props.capacity, Waitlist: 0 });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n capacity: ICapacity;\r\n disabled?: boolean;\r\n onChange: (capacity: ICapacity) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n}\r\n\r\nexport default Capacity;","import * as React from \"react\";\r\n\r\nimport { EventType } from \"../../../models\";\r\n\r\nimport TextField from \"@mui/material/TextField\";\r\nimport { DatePicker } from \"@mui/x-date-pickers/DatePicker\";\r\n\r\nimport moment from \"moment\";\r\n\r\n\r\nclass CutoffTime extends React.Component<ComponentProps, ComponentState> {\r\n public render() {\r\n const { eventType } = this.props;\r\n const cutoffTime = eventType === \"informational\" ? null : this.props.cutoffTime;\r\n \r\n return (\r\n <div className=\"cutoff-time\">\r\n <div className=\"cutoff-time-field\">\r\n <div className=\"cutoff-time-label\">RSVP Deadline</div>\r\n <div className=\"cutoff-time-input\">\r\n <DatePicker\r\n format=\"MMM dd yyyy\"\r\n value={cutoffTime ? Date.parse(cutoffTime) : null}\r\n slotProps={{ \r\n textField: { size: \"small\", placeholder: \"Select date\", inputProps: { readOnly: true }},\r\n openPickerIcon: { color: \"primary\" }\r\n }}\r\n onChange={this.onChangeCutoffDay}\r\n disabled={this.props.disabled}\r\n className=\"date-picker\"\r\n />\r\n </div>\r\n </div>\r\n <div className=\"cutoff-time-field\">\r\n <div className=\"cutoff-time-label\">Time</div>\r\n <div>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n color=\"primary\"\r\n type=\"time\"\r\n value={!!cutoffTime ? moment(cutoffTime).format(\"HH:mm\") : \"\"}\r\n disabled={this.props.disabled || !cutoffTime}\r\n inputProps={{\r\n step: 900\r\n }}\r\n onChange={this.onChangeCutoffTime}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n private onChangeCutoffDay = (date) => {\r\n const cutoffTime: string = !!this.props.cutoffTime\r\n ? moment(date).toISOString()\r\n : moment(date).startOf(\"hour\").add(1, \"hour\").toISOString();\r\n this.props.onChange(cutoffTime);\r\n }\r\n\r\n private onChangeCutoffTime = (event) => {\r\n const times: number[] = event.target.value.split(\":\");\r\n const cutoffTime: string = moment(this.props.cutoffTime).set(\"hour\", times[0]).set(\"minutes\", times[1]).toISOString();\r\n this.props.onChange(cutoffTime);\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n cutoffTime: string | undefined;\r\n eventType: EventType | undefined;\r\n disabled?: boolean;\r\n onChange: (cutoffTime: string) => void;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nexport default CutoffTime;","import * as React from \"react\";\r\nimport moment from \"moment\";\r\n\r\nimport { EventTimes as IEventTimes } from \"../../../models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Switch from \"@mui/material/Switch\";\r\nimport { DatePicker, TimePicker } from \"@mui/x-date-pickers\"\r\nimport { PickerLocalization } from \"modules/common/components/pickerLocalization\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport { Grid } from \"@mui/material\";\r\nimport { formatDate, isAllDayEvent } from \"utils/dateFormatting\";\r\n\r\nclass EventTimes extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n showNewEventTime: false,\r\n };\r\n }\r\n\r\n public render() {\r\n const eventStartTimes: string[] = this.props.eventTimes ? Object.keys(this.props.eventTimes) : [];\r\n const eventStartTime: string | null = eventStartTimes[0] || null;\r\n const eventEndTime: string | null = this.props.eventTimes && eventStartTime ? this.props.eventTimes[eventStartTime] : null;\r\n\r\n return (\r\n <div className=\"event-times\">\r\n {this.getEventTime(eventStartTime, eventEndTime, 0)}\r\n {eventStartTimes.length > 1 && eventStartTimes.slice(1).map((startTime, index) =>\r\n <Collapse key={index} appear={true} in={true}>\r\n <div>\r\n {this.getEventDayLabel(index + 2, () => this.deleteEventDay(startTime))}\r\n {this.getEventTime(startTime, this.props.eventTimes![startTime], index + 1)}\r\n </div>\r\n </Collapse>\r\n )}\r\n {!!eventStartTime &&\r\n <Button variant=\"text\" color=\"primary\" size=\"small\" startIcon={<AddIcon fontSize=\"small\" />} onClick={this.addEventDay} className=\"add-event-time\">Add Event Day</Button>\r\n }\r\n </div>\r\n );\r\n }\r\n\r\n private addEventDay = () => {\r\n const recentStartTime: string = Object.keys(this.props.eventTimes!)[Object.keys(this.props.eventTimes!).length - 1];\r\n const recentEndTime: string | null = this.props.eventTimes![recentStartTime];\r\n\r\n const newStartTime: string = moment(recentStartTime).add(1, \"day\").toISOString();\r\n const newEndTime: string | null = !recentEndTime\r\n ? null\r\n : moment(recentEndTime).set(\"date\", moment(newStartTime).get(\"date\")).toISOString();\r\n\r\n this.props.onChange({ ...this.props.eventTimes, [newStartTime]: newEndTime });\r\n };\r\n\r\n private deleteEventDay = (startTime: string) => {\r\n let eventTimes: IEventTimes = {};\r\n\r\n Object.keys(this.props.eventTimes!)\r\n .filter((eventTime) => eventTime !== startTime)\r\n .map((eventTime) => {\r\n eventTimes[eventTime] = this.props.eventTimes![eventTime];\r\n return eventTime;\r\n });\r\n \r\n this.props.onChange(eventTimes);\r\n };\r\n\r\n private getEventDayLabel = (dayNumber: number, onDelete: () => void) => {\r\n return (\r\n <div className=\"event-time-day-label\">\r\n <div>Day {dayNumber}</div>\r\n <IconButton size=\"small\" onClick={onDelete}><DeleteIcon fontSize=\"small\" /></IconButton>\r\n </div>\r\n );\r\n };\r\n\r\n /**\r\n * Used to parse the date to a epoch time in either local time or UTC depending if the event is a all day event or not.\r\n * @param eventStartTime\r\n * @param eventEndTime\r\n * @returns\r\n */\r\n private getEventStartTimeInEpoch = (eventStartTime: string, eventEndTime: string | null) => {\r\n const eventTimes = {\r\n [eventStartTime]: eventEndTime\r\n };\r\n \r\n if (isAllDayEvent(eventTimes, eventStartTime)) {\r\n const dateTime = new Date(eventStartTime);\r\n const date = formatDate(dateTime, true);\r\n return new Date(date).getTime();\r\n } else {\r\n return Date.parse(eventStartTime);\r\n }\r\n };\r\n\r\n private getEventTime = (eventStartTime: string | null, eventEndTime: string | null, index: number) => {\r\n const minDate = !!index ? Object.keys(this.props.eventTimes!)[index - 1] : null;\r\n\r\n return (\r\n <div className=\"event-time-day-content\">\r\n <div className=\"date-and-location-field\">\r\n <Grid container>\r\n <Grid item xs={2}>\r\n <div className=\"date-and-location-label\">Date</div>\r\n </Grid>\r\n <Grid item xs={10}>\r\n <div>\r\n <PickerLocalization>\r\n <DatePicker\r\n format=\"MMM dd yyyy\"\r\n value={eventStartTime ? this.getEventStartTimeInEpoch(eventStartTime, eventEndTime) : null}\r\n minDate={minDate ? Date.parse(moment(minDate).add(1, \"day\").toISOString()) : undefined}\r\n slotProps={{\r\n textField: { size: \"small\", placeholder: \"\", fullWidth: true, inputProps: { readOnly: true } },\r\n openPickerIcon: { color: \"primary\" },\r\n }}\r\n onChange={(ev) => this.onChangeEventTime(ev, eventStartTime)}\r\n className=\"date-picker\"\r\n />\r\n </PickerLocalization>\r\n </div>\r\n </Grid>\r\n </Grid>\r\n </div>\r\n <div className=\"date-and-location-time-field\">\r\n <Grid container>\r\n <Grid item xs={2}>\r\n <div className=\"date-and-location-label\">Time</div>\r\n </Grid>\r\n {!!eventStartTime && eventEndTime && (\r\n <>\r\n <Grid item xs={4.5}>\r\n <TimePicker\r\n value={eventStartTime ? moment(eventStartTime).toDate() : undefined}\r\n disabled={!eventStartTime || !eventEndTime}\r\n onChange={(ev: Date) => this.onChangeEventStartTime(ev, eventStartTime!)}\r\n slotProps={{ textField: { size: \"small\", fullWidth: true } }}\r\n />\r\n </Grid>\r\n <Grid item xs={1} textAlign=\"center\" alignItems=\"center\" justifyContent=\"center\" display=\"flex\">\r\n to\r\n </Grid>\r\n <Grid item xs={4.5}>\r\n <TimePicker\r\n value={eventEndTime ? moment(eventEndTime).toDate() : undefined}\r\n disabled={!eventStartTime || !eventEndTime}\r\n onChange={(ev: Date) => this.onChangeEventEndTime(ev, eventStartTime!)}\r\n minTime={eventStartTime ? moment(eventStartTime).toDate() : undefined}\r\n skipDisabled={true}\r\n slotProps={{ textField: { size: \"small\", fullWidth: true } }}\r\n />\r\n </Grid>\r\n <Grid item xs={2} />\r\n </>\r\n )}\r\n <Grid item xs={10}>\r\n <FormControlLabel\r\n control={\r\n <Switch\r\n color=\"primary\"\r\n checked={!!eventStartTime && !eventEndTime}\r\n disabled={!eventStartTime}\r\n onChange={(ev, checked) => this.onToggleAllDay(ev, checked, eventStartTime!)}\r\n />\r\n }\r\n label=\"All-day event\"\r\n />\r\n </Grid>\r\n </Grid>\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n private onChangeEventEndTime = (event: Date, startTime: string) =>\r\n this.props.onChange({ ...this.props.eventTimes, [startTime]: event.toISOString() });\r\n\r\n private onChangeEventStartTime = (startTime: Date, startDate: string) =>\r\n this.setNewEventStartTime(startDate, startTime.toISOString(), this.props.eventTimes![startDate]);\r\n\r\n private onChangeEventTime = (date, startTime: string | null) => {\r\n if (!startTime) this.onHideNewEventTime();\r\n\r\n const eventStartTime: string = !!startTime ? moment(date).toISOString() : moment(date).startOf(\"hour\").add(1, \"hour\").toISOString();\r\n const eventEndTime: string | null = !!startTime\r\n ? !!this.props.eventTimes![startTime]\r\n ? moment(this.props.eventTimes![startTime]!)\r\n .set(\"dayOfYear\", moment(date).get(\"dayOfYear\"))\r\n .set(\"year\", moment(date).get(\"year\"))\r\n .toISOString()\r\n : null\r\n : moment(eventStartTime).add(30, \"minutes\").toISOString();\r\n\r\n this.setNewEventStartTime(startTime, eventStartTime, eventEndTime);\r\n };\r\n\r\n private onHideNewEventTime = () => {\r\n this.setState({ showNewEventTime: false });\r\n };\r\n\r\n private onToggleAllDay = (event, checked: boolean, startTime: string) => {\r\n const eventStartTime: string = moment(startTime).startOf(\"day\").toISOString();\r\n const eventEndTime: string | null = checked ? null : moment(eventStartTime).add(30, \"minutes\").toISOString();\r\n\r\n this.setNewEventStartTime(startTime, eventStartTime, eventEndTime);\r\n };\r\n\r\n private setNewEventStartTime = (prevStartTime: string | null, nextStartTime: string, endTime: string | null) => {\r\n let eventTimes: IEventTimes = {};\r\n\r\n if (!!prevStartTime) {\r\n Object.keys(this.props.eventTimes!).map((eventTime) => {\r\n if (eventTime === prevStartTime) eventTimes[nextStartTime] = endTime;\r\n else eventTimes[eventTime] = this.props.eventTimes![eventTime];\r\n\r\n return eventTime;\r\n });\r\n } else {\r\n eventTimes = { ...this.props.eventTimes, [nextStartTime]: endTime };\r\n }\r\n\r\n this.props.onChange(eventTimes);\r\n };\r\n}\r\n\r\n\r\n interface ComponentProps {\r\n eventTimes: IEventTimes | undefined;\r\n onChange: (eventTimes: IEventTimes) => void;\r\n }\r\n\r\n interface ComponentState {\r\n }\r\n\r\n export default EventTimes;","import * as React from \"react\";\r\n\r\nimport { EventType as IEventType } from \"../../../models\";\r\n\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Select from \"@mui/material/Select\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport RequireRole from \"modules/common/components/requireRole\";\r\n\r\n\r\nclass EventType extends React.Component<ComponentProps, ComponentState> {\r\n public render() {\r\n return (\r\n <RequireRole roleName={UserRoleStrings.AUTHOR}>\r\n <div className=\"type\">\r\n <div className=\"section-card-heading\">\r\n <div>Event Type</div>\r\n <FormControl size=\"small\">\r\n <Select\r\n variant=\"outlined\"\r\n value={this.props.eventType}\r\n onChange={this.onChangeEventType}\r\n className=\"type-select\"\r\n >\r\n <MenuItem value=\"informational\">Informational</MenuItem>\r\n <MenuItem value=\"standard\">Standard RSVP</MenuItem>\r\n <MenuItem value=\"mandatory\">Mandatory RSVP</MenuItem>\r\n </Select>\r\n </FormControl>\r\n </div>\r\n </div>\r\n </RequireRole>\r\n );\r\n }\r\n\r\n private onChangeEventType = (event) => {\r\n this.props.onChange(event.target.value);\r\n };\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n eventType: IEventType | undefined;\r\n onChange: (eventType: string) => void;\r\n}\r\n\r\ninterface ComponentState { }\r\n\r\nexport default EventType;","import * as React from \"react\";\r\n\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport LinkIcon from \"@mui/icons-material/Link\";\r\nimport PublicIcon from '@mui/icons-material/Public';\r\nimport LocationOnIcon from \"@mui/icons-material/LocationOn\";\r\n\r\n\r\nclass Location extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n showLocation: !!props.location,\r\n showLocationLink: !!props.locationLink || !!props.locationLinkLabel\r\n };\r\n }\r\n\r\n public render() {\r\n return (\r\n <div className=\"location\">\r\n <div className=\"location-options\">\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n checked={this.state.showLocation}\r\n color=\"primary\"\r\n onChange={this.onToggleLocation}\r\n />\r\n }\r\n label=\"In-Person\"\r\n className=\"location-option\"\r\n />\r\n <FormControlLabel\r\n control={\r\n \r\n <Checkbox\r\n checked={this.state.showLocationLink}\r\n color=\"primary\"\r\n onChange={this.onToggleLocationLink}\r\n />\r\n }\r\n label=\"Online\"\r\n className=\"location-option\"\r\n />\r\n </div>\r\n <Collapse in={this.state.showLocation}>\r\n <div className=\"location-field\">\r\n <LocationOnIcon color=\"primary\" className=\"location-icon\" />\r\n <TextField\r\n key={this.props.location}\r\n variant=\"outlined\"\r\n size=\"small\"\r\n placeholder=\"Enter address\"\r\n defaultValue={this.props.location}\r\n fullWidth\r\n onBlur={this.onChangeLocation}\r\n />\r\n </div>\r\n </Collapse>\r\n <Collapse in={this.state.showLocationLink}>\r\n <div className=\"location-field\">\r\n <PublicIcon color=\"primary\" className=\"location-icon\" />\r\n <TextField\r\n key={this.props.locationLinkLabel}\r\n variant=\"outlined\"\r\n size=\"small\"\r\n placeholder=\"Enter online location (Ex. MS Teams)\"\r\n defaultValue={this.props.locationLinkLabel}\r\n fullWidth\r\n onBlur={this.onChangeLocationLinkLabel}\r\n />\r\n </div>\r\n <div className=\"location-field\">\r\n <LinkIcon color=\"primary\" className=\"location-icon\" />\r\n <TextField\r\n key={this.props.locationLink}\r\n variant=\"outlined\"\r\n size=\"small\"\r\n placeholder=\"Enter online URL\"\r\n defaultValue={this.props.locationLink}\r\n fullWidth\r\n onBlur={this.onChangeLocationLink}\r\n />\r\n </div>\r\n </Collapse>\r\n </div>\r\n );\r\n }\r\n\r\n private onChangeLocation = (event) => {\r\n this.props.onChangeLocation(event.target.value);\r\n }\r\n\r\n private onChangeLocationLink = (event) => {\r\n this.props.onChangeLocationLink(event.target.value);\r\n }\r\n\r\n private onChangeLocationLinkLabel = (event) => {\r\n this.props.onChangeLocationLinkLabel(event.target.value);\r\n }\r\n\r\n private onToggleLocation = (event, checked: boolean) => {\r\n this.setState({ ...this.state, showLocation: checked });\r\n if (!checked)\r\n this.props.onChangeLocation(\"\");\r\n }\r\n\r\n private onToggleLocationLink = (event, checked: boolean) => {\r\n this.setState({ ...this.state, showLocationLink: checked });\r\n if (!checked)\r\n {\r\n this.props.clearLocationLink();\r\n }\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n location: string | undefined;\r\n locationLink: string | undefined;\r\n locationLinkLabel: string | undefined;\r\n onChangeLocation: (location: string) => void;\r\n onChangeLocationLink: (locationLink: string) => void;\r\n onChangeLocationLinkLabel: (locationLink: string) => void;\r\n clearLocationLink: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n showLocation: boolean;\r\n showLocationLink: boolean;\r\n}\r\n\r\nexport default Location;","import * as React from \"react\";\r\n\r\nimport { Questions as IQuestions } from \"../../../models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport BlockIcon from \"@mui/icons-material/Block\";\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport DoneIcon from \"@mui/icons-material/Done\";\r\n\r\n\r\nclass Questions extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n newQuestion: \"\",\r\n requireNewQuestion: false,\r\n showNewQuestion: false\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: ComponentProps) {\r\n if (!prevProps.show && this.props.show) {\r\n this.setState({ ...this.state, newQuestion: \"\", requireNewQuestion: false, showNewQuestion: false });\r\n }\r\n }\r\n\r\n public render() {\r\n const { questions } = this.props;\r\n const questionNumbers: string[] = !!questions ? Object.keys(questions) : [];\r\n\r\n return (\r\n <Collapse in={this.props.show}>\r\n <Paper id=\"questions\" elevation={0} className=\"section-card\">\r\n <div className=\"optional-content-header\">\r\n <div>Questions</div>\r\n <div className=\"remove-optional-content\">\r\n <Button variant=\"text\" color=\"inherit\" size=\"small\" startIcon={<BlockIcon fontSize=\"small\" />} onClick={this.props.onRemove}>Remove All Questions</Button>\r\n </div>\r\n </div>\r\n {!!questionNumbers.length && questionNumbers.map((questionNumber) =>\r\n <Paper key={questionNumber} elevation={1} className=\"question\">\r\n <div>{questions![questionNumber].body}</div>\r\n <div>\r\n {questions![questionNumber].isRequired && <div className=\"question-required\">*Response required</div>}\r\n <IconButton size=\"small\" onClick={() => this.onRemoveQuestion(questionNumber)}><DeleteIcon /></IconButton>\r\n </div>\r\n </Paper>\r\n )}\r\n <div className={`new-question${this.state.showNewQuestion ? \" expanded\" : \"\"}`}>\r\n <div>\r\n <TextField variant=\"outlined\" size=\"small\" value={this.state.newQuestion} placeholder=\"Enter a question\" fullWidth onKeyUp={this.onKeyUp} onChange={this.onChangeNewQuestion} />\r\n <IconButton color=\"primary\" size=\"small\" onClick={this.onAddNewQuestion}><DoneIcon /></IconButton>\r\n <IconButton size=\"small\" onClick={this.onHideNewQuestion}><ClearIcon /></IconButton>\r\n </div>\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n checked={this.state.requireNewQuestion}\r\n onChange={this.onChangeRequireNewQuestion}\r\n color=\"primary\"\r\n />\r\n }\r\n label=\"Require response to this question\"\r\n className=\"new-question-required\"\r\n />\r\n </div>\r\n {!this.state.showNewQuestion && questionNumbers.length < 3 &&\r\n <Button variant=\"text\" color=\"primary\" size=\"small\" startIcon={<AddIcon fontSize=\"small\" />} onClick={this.onShowNewQuestion} className=\"add-new-item\">Add Question</Button>\r\n }\r\n <div className=\"optional-content-disclaimer\">Note: Questions can be answered with text responses only</div>\r\n </Paper>\r\n </Collapse>\r\n );\r\n }\r\n\r\n private onAddNewQuestion = () => {\r\n const { questions } = this.props;\r\n const newQuestion: string = this.state.newQuestion.trim();\r\n const newQuestionKey: number = !!questions ? Object.keys(questions).length + 1 : 1;\r\n\r\n if (!!newQuestion) {\r\n this.props.onChange({\r\n ...questions,\r\n [newQuestionKey]: {\r\n body: newQuestion, isRequired: this.state.requireNewQuestion\r\n }\r\n });\r\n }\r\n \r\n this.onHideNewQuestion();\r\n }\r\n\r\n private onChangeNewQuestion = (event) => {\r\n this.setState({ ...this.state, newQuestion: event.target.value });\r\n }\r\n\r\n private onChangeRequireNewQuestion = (event, checked: boolean) => {\r\n this.setState({ ...this.state, requireNewQuestion: checked });\r\n }\r\n\r\n private onHideNewQuestion = () => {\r\n this.setState({ ...this.state, newQuestion: \"\", requireNewQuestion: false, showNewQuestion: false });\r\n }\r\n\r\n private onKeyUp = (event) => {\r\n if (event.keyCode === 13)\r\n this.onAddNewQuestion();\r\n }\r\n\r\n private onRemoveQuestion = (questionNumber: string) => {\r\n const remainingQuestions: string[] = Object.keys(this.props.questions!).filter(question => question !== questionNumber);\r\n let questions: IQuestions = {};\r\n remainingQuestions.map((remainingQuestion, index) => {\r\n questions[index + 1] = { ...this.props.questions![remainingQuestion] };\r\n return remainingQuestion;\r\n });\r\n this.props.onChange(questions);\r\n }\r\n\r\n private onShowNewQuestion = () => {\r\n this.setState({ ...this.state, showNewQuestion: true });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n questions: IQuestions | undefined;\r\n onChange: (questions: IQuestions) => void;\r\n onRemove: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n newQuestion: string;\r\n requireNewQuestion: boolean;\r\n showNewQuestion: boolean;\r\n}\r\n\r\nexport default Questions;","import { Button, Checkbox, Chip, List, ListItem, TextField } from '@mui/material';\r\n\r\nimport { DatePicker } from \"@mui/x-date-pickers/DatePicker\";\r\n\r\nimport MoreOptionsButton from 'modules/common/components/buttons/moreOptionsButton';\r\nimport MoreOptionsItem from 'modules/common/components/moreOptionsItem';\r\nimport moment, { Moment } from 'moment';\r\nimport * as React from 'react';\r\nimport \"./insightFilters.sass\";\r\nimport { dateOptions } from 'utils/dateFormatting';\r\nimport { MultiSelectTopic, TenantSettings, TenantSettingsTagGroup } from 'modules/settings';\r\nimport Loading from 'modules/common/components/loading';\r\n\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport EventIcon from \"@mui/icons-material/Event\";\r\nimport { ALL_TIME, AnalyticsReportFilters, CUSTOM_RANGE, LAST_30_DAYS, LAST_3_MONTHS, LAST_6_MONTHS, LAST_MONTH, LAST_WEEK, THIS_MONTH } from '../models';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport { Audience } from 'modules/audiences';\r\nimport FilterMoreOptionsButton from 'modules/common/components/buttons/filterMoreOptionsButton';\r\nimport LoadingCircle from 'modules/common/components/loadingCircle';\r\nimport FilterContainer from 'modules/common/components/filters/filterContainer';\r\nimport { SelectOption } from 'modules/common/models';\r\nimport { PickerLocalization } from 'modules/common/components/pickerLocalization';\r\nimport MultiSelectCalloutWithSearch from 'modules/common/components/forms/inputs/multiSelectCalloutWithSearch';\r\nimport ArrowDropDownIcon from \"@mui/icons-material/ArrowDropDown\";\r\n\r\n//Update when more options are added.\r\nenum filterOptions {\r\n \"Last 30 days\" = 0,\r\n \"This month\" = 1,\r\n \"Last week\" = 2,\r\n \"Last month\" = 3,\r\n \"Last 3 months\" = 4,\r\n \"Last 6 months\" = 5,\r\n \"All time\" = 6,\r\n \"Custom range\" = 7,\r\n}\r\n\r\nconst FILTER_BY_AUDIENCES = \"Audiences\";\r\nconst FILTER_BY_TOPICS = \"Topics\";\r\nconst FILTER_BY_CUSTOM_AUDIENCES = \"Custom Audiences\";\r\nconst FILTER_BY_CUSTOM_TOPICS = \"Custom Topics\";\r\n\r\nclass InsightFilters extends React.Component<PropsWithRedux, ComponentState> {\r\n\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n selectedValue: 0,\r\n customStart: moment(new Date()).subtract(30, \"days\"),\r\n customEnd: moment(new Date()),\r\n fromText: moment().subtract(30, \"days\").format(dateOptions.basicFormatting),\r\n toText: moment().format(dateOptions.basicFormatting),\r\n filterBy: \"\",\r\n audienceSearchText: \"\",\r\n topicSearchText: \"\",\r\n audiences: [],\r\n tagGroups: [],\r\n audienceDropdownText: FILTER_BY_AUDIENCES,\r\n topicsDropdownText: FILTER_BY_TOPICS,\r\n selectedTopics: [],\r\n };\r\n }\r\n\r\n public render() {\r\n return (\r\n <FilterContainer\r\n filters={this.getFilters()\r\n }\r\n filterCommands={\r\n <React.Fragment>\r\n </React.Fragment>\r\n }\r\n filterSelection={this.getFilterSelection()}\r\n >\r\n </FilterContainer>\r\n )\r\n }\r\n\r\n private onChangeFilters = (filters: Partial<AnalyticsReportFilters>) => {\r\n\r\n this.props.onChangeFilters({ ...filters });\r\n this.setAudienceFilterText(this.props.filters.audiences);\r\n this.setTopicsFilterText(this.props.filters.topics);\r\n }\r\n\r\n private fetchLoadingIcon = () => {\r\n return <Loading size={16} />\r\n }\r\n\r\n private onClearFilters = () => {\r\n const startDateToSet = moment(new Date()).startOf(\"day\").subtract(30, \"days\");\r\n const endDatetoSet = moment(new Date()).endOf(\"day\");\r\n const startDate = startDateToSet.format(dateOptions.basicWithHours);\r\n const endDate = endDatetoSet.format(dateOptions.basicWithHours);\r\n\r\n this.setState({ filterBy: \"\" });\r\n this.onFromDateChange(startDateToSet, startDateToSet.format(dateOptions.basicFormatting), false);\r\n this.onToDateChange(endDatetoSet, endDatetoSet.format(dateOptions.basicFormatting), false);\r\n this.setState({ selectedValue: 0 });\r\n this.setState({ selectedTopics: []});\r\n\r\n this.onChangeFilters({\r\n startDate, endDate, rangeString: LAST_30_DAYS, topics: [], audiences: []\r\n });\r\n }\r\n\r\n private onAudienceTopicFilterChange = (filter) => {\r\n this.onChangeFilters({ topics: [], audiences: [] });\r\n\r\n if (filter === FILTER_BY_AUDIENCES) {\r\n this.setState({ audiences: this.props.audiences });\r\n } else if (filter === FILTER_BY_TOPICS) {\r\n this.setState({ tagGroups: this.props.tenantSettings.tagGroups })\r\n }\r\n\r\n this.setState({ filterBy: filter, audienceSearchText: '', topicSearchText: '' })\r\n }\r\n private setFilterToCustom = () => {\r\n if (this.state.selectedValue !== filterOptions[\"Custom range\"]) {\r\n this.setState({ selectedValue: filterOptions[\"Custom range\"] });\r\n }\r\n }\r\n\r\n private onFromDateChange = (date, value, setToCustom) => {\r\n this.setState({ fromText: value });\r\n this.setState({ customStart: date });\r\n let startDate = moment();\r\n\r\n //If date is null go back extremely far.\r\n if (date) {\r\n startDate = moment(date).startOf(\"day\");\r\n }\r\n else {\r\n startDate = moment(new Date()).set(\"year\", 2017).set(\"month\", 0).startOf(\"month\");\r\n }\r\n\r\n let endDate = this.state.customEnd ? moment(this.state.customEnd).endOf(\"day\") : moment().endOf(\"day\");\r\n\r\n if (setToCustom) {\r\n this.setFilterToCustom();\r\n }\r\n this.onChangeFilters({ startDate: startDate.format(dateOptions.basicWithHours), endDate: endDate.format(dateOptions.basicWithHours), rangeString: filterOptions[7] });\r\n }\r\n\r\n private onToDateChange = (date, value, setToCustom) => {\r\n this.setState({ toText: value });\r\n this.setState({ customEnd: date });\r\n let endDate = moment();\r\n\r\n //If date is null go back extremely far.\r\n if (date) {\r\n endDate = moment(date).endOf(\"day\");\r\n }\r\n else {\r\n endDate = moment(new Date()).endOf(\"day\");\r\n }\r\n\r\n let startDate = this.state.customStart ? moment(this.state.customStart).startOf(\"day\") : moment(new Date()).set(\"year\", 2017).set(\"month\", 0).startOf(\"month\");\r\n\r\n if (setToCustom) {\r\n this.setFilterToCustom();\r\n }\r\n this.onChangeFilters({ startDate: startDate.format(dateOptions.basicWithHours), endDate: endDate.format(dateOptions.basicWithHours), rangeString: filterOptions[7] });\r\n }\r\n\r\n private selectValue = (valueToSet: filterOptions) => {\r\n this.setState({ selectedValue: valueToSet });\r\n let startDate = \"\";\r\n let endDate = \"\";\r\n let startDateToSet = moment();\r\n let endDatetoSet = moment();\r\n\r\n switch (valueToSet) {\r\n case (filterOptions[LAST_30_DAYS]):\r\n startDateToSet = moment(new Date()).subtract(30, \"days\").startOf(\"day\");\r\n endDatetoSet = moment(new Date()).endOf(\"day\");\r\n\r\n startDate = startDateToSet.format(dateOptions.basicWithHours);\r\n endDate = endDatetoSet.format(dateOptions.basicWithHours);\r\n break;\r\n\r\n case (filterOptions[THIS_MONTH]):\r\n startDateToSet = moment(new Date()).startOf('month');\r\n endDatetoSet = moment(new Date()).endOf(\"day\");\r\n\r\n startDate = startDateToSet.startOf('month').format(dateOptions.basicWithHours);\r\n endDate = endDatetoSet.format(dateOptions.basicWithHours)\r\n break;\r\n\r\n case (filterOptions[LAST_WEEK]):\r\n startDateToSet = moment(new Date()).startOf('week').subtract(1, \"week\").startOf(\"day\");\r\n endDatetoSet = moment(new Date()).startOf('week').subtract(1, \"week\").add(6, \"days\").endOf(\"day\");\r\n\r\n startDate = startDateToSet.format(dateOptions.basicWithHours);\r\n endDate = endDatetoSet.format(dateOptions.basicWithHours);\r\n break;\r\n\r\n case (filterOptions[LAST_MONTH]):\r\n startDateToSet = moment(new Date()).subtract(1, \"month\").startOf(\"month\");\r\n endDatetoSet = moment(new Date()).subtract(1, \"month\").endOf(\"month\");\r\n\r\n startDate = startDateToSet.format(dateOptions.basicWithHours);\r\n endDate = endDatetoSet.format(dateOptions.basicWithHours);\r\n break;\r\n\r\n case (filterOptions[LAST_3_MONTHS]):\r\n startDateToSet = moment(new Date()).subtract(3, \"month\").startOf(\"month\");\r\n endDatetoSet = moment(new Date()).subtract(1, \"month\").endOf(\"month\");\r\n\r\n startDate = startDateToSet.format(dateOptions.basicWithHours);\r\n endDate = endDatetoSet.format(dateOptions.basicWithHours);\r\n break;\r\n\r\n case (filterOptions[LAST_6_MONTHS]):\r\n startDateToSet = moment(new Date()).subtract(6, \"month\").startOf(\"month\");\r\n endDatetoSet = moment(new Date()).subtract(1, \"month\").endOf(\"month\");\r\n\r\n startDate = startDateToSet.format(dateOptions.basicWithHours);\r\n endDate = endDatetoSet.format(dateOptions.basicWithHours);\r\n break;\r\n\r\n case (filterOptions[ALL_TIME]):\r\n startDateToSet = moment(new Date()).set(\"year\", 2017).set(\"month\", 0).startOf(\"month\");\r\n endDatetoSet = moment(new Date()).endOf(\"day\");\r\n\r\n startDate = startDateToSet.format(dateOptions.basicWithHours);\r\n endDate = endDatetoSet.format(dateOptions.basicWithHours);\r\n\r\n this.onFromDateChange(null, null, false);\r\n this.onToDateChange(endDatetoSet, endDatetoSet.format(dateOptions.basicFormatting), false);\r\n this.onChangeFilters({ startDate, endDate, rangeString: filterOptions[valueToSet] });\r\n return;\r\n\r\n case (filterOptions[CUSTOM_RANGE]):\r\n startDateToSet = moment(new Date()).set(\"year\", 2017).set(\"month\", 0).startOf(\"month\");\r\n endDatetoSet = moment(new Date());\r\n\r\n startDate = startDateToSet.format(dateOptions.basicWithHours);\r\n endDate = endDatetoSet.format(dateOptions.basicWithHours);\r\n\r\n //Empty filters but don't query.\r\n this.setState({ fromText: \"\" });\r\n this.setState({ customStart: null });\r\n this.setState({ toText: \"\" });\r\n this.setState({ customEnd: null });\r\n return;\r\n }\r\n\r\n this.onFromDateChange(startDateToSet, startDateToSet.format(dateOptions.basicFormatting), false);\r\n this.onToDateChange(endDatetoSet, endDatetoSet.format(dateOptions.basicFormatting), false);\r\n this.onChangeFilters({ startDate, endDate, rangeString: filterOptions[valueToSet] });\r\n }\r\n\r\n private getLoader = () => {\r\n return <LoadingCircle size={16} style={{ margin: \"0px 10px\" }} />\r\n }\r\n\r\n private getAudienceSearchBox = () => {\r\n return <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n fullWidth\r\n value={this.state.audienceSearchText}\r\n placeholder=\"Search audience\"\r\n InputProps={{\r\n startAdornment: <SearchIcon className=\"search-icon\" />\r\n }}\r\n onChange={this.onUpdateAudienceTextToSearch}\r\n className=\"text-to-search\" />\r\n }\r\n\r\n private getAudienceFilterFooter = () => {\r\n const audienceSelected = (this.props.filters.audiences?.length ?? [].length) > 0;\r\n return <Button color=\"primary\" style={{ float: \"right\" }} onClick={() => this.onHandleAllAudience(audienceSelected)}>\r\n {audienceSelected ? \"Unselect\" : \"Select\"} All\r\n </Button>\r\n }\r\n\r\n private cleanupDate = (toConvert: Date | Moment | null) => {\r\n let sanitizedDate: Date | null = null;\r\n\r\n if (moment.isMoment(toConvert)) {\r\n sanitizedDate = toConvert?.toDate();\r\n }\r\n else {\r\n sanitizedDate = toConvert;\r\n }\r\n\r\n return sanitizedDate;\r\n }\r\n\r\n private getDatePickerFilter = () => {\r\n let sanitizedStartDate = this.cleanupDate(this.state.customStart);\r\n let sanitizedEndDate = this.cleanupDate(this.state.customEnd);\r\n\r\n return <PickerLocalization>\r\n <div className=\"calendar-section\">\r\n <div className=\"calendar-element\">\r\n <DatePicker\r\n format={dateOptions.datePickerFormatting}\r\n disableFuture\r\n maxDate={sanitizedEndDate ?? null}\r\n value={sanitizedStartDate ?? null}\r\n slotProps={{\r\n textField: { size: \"small\", placeholder: \"Select start date\", inputProps: { readOnly: true, style: { color: \"black\", backgroundColor: \"white\" } } },\r\n openPickerIcon: { color: \"primary\" }\r\n }}\r\n slots={{\r\n openPickerIcon: this.props.isLoading ? this.fetchLoadingIcon : EventIcon\r\n }}\r\n disabled={this.props.isLoading}\r\n onChange={(date, value) => this.onFromDateChange(date, value, true)}\r\n className=\"date-picker\"\r\n />\r\n </div>\r\n <div className=\"calendar-text\">\r\n to\r\n </div>\r\n <div className=\"calendar-element\">\r\n <DatePicker\r\n format={dateOptions.datePickerFormatting}\r\n disableFuture\r\n minDate={sanitizedStartDate}\r\n value={sanitizedEndDate}\r\n slotProps={{\r\n textField: { size: \"small\", placeholder: \"Select end date\", inputProps: { readOnly: true, style: { color: \"black\", backgroundColor: \"white\" } } },\r\n openPickerIcon: { color: \"primary\" }\r\n }}\r\n slots={{\r\n openPickerIcon: this.props.isLoading ? this.fetchLoadingIcon : EventIcon\r\n }}\r\n disabled={this.props.isLoading}\r\n onChange={(date, value) => this.onToDateChange(date, value, true)}\r\n\r\n className=\"date-picker\"\r\n />\r\n </div>\r\n </div>\r\n </PickerLocalization>\r\n }\r\n\r\n private getDateRangeSelectFilter = () => {\r\n return <MoreOptionsButton text={filterOptions[this.state.selectedValue]} className=\"moreOptionsButton\">\r\n <List disablePadding>\r\n <MoreOptionsItem\r\n text={LAST_30_DAYS}\r\n onClick={() => this.selectValue(filterOptions[LAST_30_DAYS])} />\r\n\r\n <MoreOptionsItem\r\n text={THIS_MONTH}\r\n onClick={() => this.selectValue(filterOptions[THIS_MONTH])} />\r\n\r\n <MoreOptionsItem\r\n text={LAST_WEEK}\r\n onClick={() => this.selectValue(filterOptions[LAST_WEEK])} />\r\n\r\n <MoreOptionsItem\r\n text={LAST_MONTH}\r\n onClick={() => this.selectValue(filterOptions[LAST_MONTH])} />\r\n\r\n <MoreOptionsItem\r\n text={LAST_3_MONTHS}\r\n onClick={() => this.selectValue(filterOptions[LAST_3_MONTHS])} />\r\n\r\n <MoreOptionsItem\r\n text={LAST_6_MONTHS}\r\n onClick={() => this.selectValue(filterOptions[LAST_6_MONTHS])} />\r\n\r\n <MoreOptionsItem\r\n text={ALL_TIME}\r\n onClick={() => this.selectValue(filterOptions[ALL_TIME])} />\r\n\r\n <MoreOptionsItem\r\n text={CUSTOM_RANGE}\r\n onClick={() => this.selectValue(filterOptions[CUSTOM_RANGE])} />\r\n </List>\r\n </MoreOptionsButton>\r\n }\r\n\r\n private GetFilterBySelectOption = () => {\r\n return <MoreOptionsButton text=\"FILTER BY\" className=\"moreOptionsButton\">\r\n <List disablePadding>\r\n <MoreOptionsItem\r\n text=\"All audiences & topics\"\r\n onClick={() => this.onAudienceTopicFilterChange(\"\")} />\r\n\r\n <MoreOptionsItem\r\n text=\"Audiences\"\r\n onClick={() => this.onAudienceTopicFilterChange(FILTER_BY_AUDIENCES)} />\r\n\r\n <MoreOptionsItem\r\n text=\"Topics\"\r\n onClick={() => this.onAudienceTopicFilterChange(FILTER_BY_TOPICS)} />\r\n </List>\r\n </MoreOptionsButton>\r\n }\r\n\r\n private getTopicsFilter = () => {\r\n return <MultiSelectCalloutWithSearch\r\n defaultOptions={this.props.tenantSettings.tagGroups.map(opt => ({id: opt.id, name: opt.name, children: opt.tags}))}\r\n selectedOptions={this.state.selectedTopics}\r\n onChange={this.onChangeSelectedTopics}\r\n buttonStyle={{\r\n buttonClassName:\"moreOptionsButton moreOptionsButton-ml\",\r\n buttonText: this.state.topicsDropdownText,\r\n buttonVariant:\"outlined\",\r\n endIcon:<ArrowDropDownIcon/>\r\n }}\r\n nestingAllowed\r\n buttonId=\"topics-filter-button\"\r\n />;\r\n }\r\n\r\n private onChangeSelectedTopics = (topics: MultiSelectTopic[]) => {\r\n let topicIds: string[] = topics.map((topic) => topic.id);\r\n this.props.onChangeFilters({ topics: topicIds });\r\n this.setTopicsFilterText(topicIds);\r\n this.setState({ selectedTopics: topics });\r\n }\r\n\r\n private getAudienceFilter = () => {\r\n return <FilterMoreOptionsButton text={this.state.audienceDropdownText} header={this.getAudienceSearchBox()} footer={this.getAudienceFilterFooter()}\r\n className=\"moreOptionsButton moreOptionsButton-ml\">\r\n <div style={{ height: \"254px\", width: \"350px\" }}>\r\n <List disablePadding>\r\n {this.state.audiences.map(audience => {\r\n return (\r\n <React.Fragment key={audience.id}>\r\n <ListItem button onClick={() => this.onChangeAudience(audience.id)} className=\"select-popover-group-header-clickable\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!this.props.filters.audiences!.find((selectedAudience) => selectedAudience === audience.id)}\r\n />\r\n {audience.displayName}\r\n </ListItem>\r\n </React.Fragment>\r\n )\r\n })}\r\n </List>\r\n </div>\r\n </FilterMoreOptionsButton>\r\n }\r\n\r\n private onHandleAllAudience = (audienceSelected: boolean) => {\r\n let newFilters = { ...this.props.filters };\r\n\r\n if (audienceSelected) {\r\n newFilters.audiences = [];\r\n }\r\n else {\r\n let currentAudiences = this.props.filters.audiences ?? [];\r\n let audiences = this.props.audiences;\r\n audiences.forEach(audience => {\r\n if (!currentAudiences.includes(audience.id)) {\r\n currentAudiences.push(audience.id);\r\n }\r\n });\r\n newFilters.audiences = currentAudiences;\r\n }\r\n this.props.onChangeFilters(newFilters);\r\n\r\n this.setAudienceFilterText(newFilters.audiences);\r\n }\r\n\r\n private onChangeAudience = (currentAudience: string) => {\r\n const hasSelectedTag: boolean = !!this.props.filters.audiences!.find((selecteAudience) => selecteAudience === currentAudience);\r\n let audiences: string[];\r\n\r\n if (hasSelectedTag)\r\n audiences = this.props.filters.audiences!.filter((selecteAudience) => selecteAudience !== currentAudience);\r\n else\r\n audiences = this.props.filters.audiences!.concat([currentAudience]);\r\n\r\n this.props.onChangeFilters({ audiences: audiences });\r\n this.setAudienceFilterText(audiences);\r\n }\r\n\r\n private onUpdateAudienceTextToSearch = (ev: any) => {\r\n this.setState({audienceSearchText: ev.target.value});\r\n this.setState({audiences: this.props.audiences.filter(c => c.displayName.toLowerCase().includes(ev.target.value.toLowerCase()))});\r\n }\r\n\r\n private getFilters() {\r\n return <div className=\"filters-display\">\r\n <div>\r\n {this.getDateRangeSelectFilter()}\r\n </div>\r\n <div style={{ height: \"20px\" }}>\r\n {this.getDatePickerFilter()}\r\n </div>\r\n <div>\r\n {this.GetFilterBySelectOption()}\r\n </div>\r\n {this.state.filterBy === \"\" &&\r\n <div>\r\n <MoreOptionsButton text=\"All Audiences & Topics\"\r\n className=\"moreOptionsButton moreOptionsButton-ml\" disabled>\r\n </MoreOptionsButton>\r\n </div>}\r\n {this.state.filterBy === FILTER_BY_AUDIENCES &&\r\n <div>\r\n {this.getAudienceFilter()}\r\n </div>}\r\n {this.state.filterBy === FILTER_BY_TOPICS &&\r\n <div>\r\n {this.getTopicsFilter()}\r\n </div>}\r\n\r\n <div style={{ marginLeft: \"auto\" }}>\r\n {this.props.filters.audiences!.length > 0 &&\r\n <span className=\"totalSubscribers\">\r\n Users in selected audiences: {this.props.isLoading ? this.getLoader() : <b>{this.props.totalSubscribers}</b>}\r\n </span>}\r\n {this.props.filters.topics!.length > 0 &&\r\n <span className=\"totalSubscribers\">\r\n Subscribers in selected topics: {this.props.isLoading ? this.getLoader() : <b>{this.props.totalSubscribers}</b>}\r\n </span>}\r\n <Button\r\n color=\"primary\"\r\n onClick={() => this.onClearFilters()}\r\n style={{ marginLeft: \"10px\" }}\r\n disabled={this.state.selectedValue === filterOptions[LAST_30_DAYS] && this.props.filters.topics!.length === 0 && this.props.filters.audiences!.length === 0}\r\n >Reset</Button>\r\n </div>\r\n </div>;\r\n }\r\n\r\n private getFilterSelection = (): JSX.Element | undefined => {\r\n const { filters } = this.props;\r\n\r\n if (!filters.topics?.length && !filters.audiences?.length)\r\n return undefined;\r\n\r\n const availableTopics: SelectOption[] = this.getAvailableTags();\r\n\r\n return (\r\n <React.Fragment>\r\n {filters.topics!.map((selectedTopic) =>\r\n <Chip\r\n key={selectedTopic}\r\n label={availableTopics.find((topic) => topic.key === selectedTopic)?.text}\r\n onDelete={() => this.onClearTopic(selectedTopic)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n {filters.audiences!.map((selectedAudience) =>\r\n <Chip\r\n key={selectedAudience}\r\n label={this.state.audiences.find((audience) => audience.id === selectedAudience)!.displayName}\r\n onDelete={() => this.onClearAudience(selectedAudience)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private onClearTopic = (topic: string) => {\r\n const topics = this.props.filters.topics!.filter((selectedTopic) => selectedTopic !== topic);\r\n const selectedTopicsToSet = this.state.selectedTopics.filter(t => topics.includes(t.id));\r\n this.onChangeFilters({ topics: topics });\r\n this.setTopicsFilterText(topics);\r\n this.setState({selectedTopics: selectedTopicsToSet});\r\n }\r\n\r\n private onClearAudience = (audience: string) => {\r\n const audiences = this.props.filters.audiences!.filter((selectedAudience) => selectedAudience !== audience);\r\n this.props.onChangeFilters({ audiences: audiences });\r\n this.setAudienceFilterText(audiences);\r\n }\r\n\r\n\r\n private getAvailableTags = (): SelectOption[] => {\r\n if (!this.props.tenantSettings)\r\n return [];\r\n\r\n let availableTags: SelectOption[] = [];\r\n this.props.tenantSettings.tagGroups.map((tagGroup) => {\r\n if (!!tagGroup.tags.length && !tagGroup.deleted && !tagGroup.disabled) {\r\n availableTags.push({ key: tagGroup.id, text: tagGroup.name, type: \"header\" });\r\n tagGroup.tags.map((tag) => {\r\n if (!tag.deleted && !tag.disabled)\r\n availableTags.push({ key: tag.id, text: tag.name, type: \"item\" });\r\n return tag;\r\n });\r\n }\r\n return tagGroup;\r\n });\r\n return availableTags;\r\n }\r\n\r\n private setAudienceFilterText(audiences?: string[]) {\r\n if ((audiences != null && audiences.length > 0)) {\r\n this.setState({ audienceDropdownText: FILTER_BY_CUSTOM_AUDIENCES });\r\n } else {\r\n this.setState({ audienceDropdownText: FILTER_BY_AUDIENCES });\r\n }\r\n }\r\n\r\n private setTopicsFilterText(topics?: string[]) {\r\n if ((topics != null && topics.length > 0)) {\r\n this.setState({ topicsDropdownText: FILTER_BY_CUSTOM_TOPICS });\r\n } else {\r\n this.setState({ topicsDropdownText: FILTER_BY_TOPICS });\r\n }\r\n }\r\n}\r\n\r\ninterface ComponentState {\r\n selectedValue: filterOptions;\r\n customStart: Moment | null;\r\n customEnd: Moment | null;\r\n fromText: string;\r\n toText: string;\r\n filterBy: string;\r\n audienceSearchText: string;\r\n topicSearchText: string;\r\n audiences: Audience[];\r\n tagGroups: TenantSettingsTagGroup[];\r\n audienceDropdownText: string;\r\n topicsDropdownText: string;\r\n selectedTopics: MultiSelectTopic[];\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n filters: Partial<AnalyticsReportFilters>;\r\n onChangeFilters: (filters: Partial<AnalyticsReportFilters>) => void;\r\n isLoading: boolean;\r\n tenantSettings: TenantSettings;\r\n audiences: Audience[];\r\n totalSubscribers: number;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n lcidMappings: state.resources.lcidMappings,\r\n tenantSettings: state.settings.tenantSettings,\r\n tenant: state.tenant.id\r\n })\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(InsightFilters);\r\n","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport moment from \"moment\";\r\n\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport { \r\n Capacity as ICapacity, \r\n Event, \r\n EventTimes as IEventTimes, \r\n EventType as IEventType, \r\n Notifications as INotifications, \r\n Questions as IQuestions, \r\n Tag, \r\n TranslatedContent as ITranslatedContent, \r\n ValidationChecks \r\n} from \"../../models\";\r\n\r\nimport Author from \"modules/common/components/authoring/author\";\r\nimport ExpiryTime from \"modules/common/components/authoring/expiryTime\";\r\nimport FileAttachments from \"modules/common/components/authoring/fileAttachments\";\r\nimport HeroBanner from \"modules/common/components/authoring/heroBanner/heroBanner\";\r\nimport Notifications from \"modules/common/components/authoring/notifications\";\r\nimport PublishTime from \"modules/common/components/authoring/publishTime\";\r\nimport Reminders from \"modules/common/components/authoring/reminders\";\r\nimport AuthoringWarnings from \"modules/common/components/authoring/authoringWarnings\";\r\nimport TranslatedContent from \"modules/common/components/authoring/translatedContent\";\r\nimport Validator from \"modules/common/components/authoring/validator\";\r\n\r\nimport UpdateInPersonCapacityConfirmation from \"../confirmations/updateInPersonCapacity\";\r\nimport UpdateOnlineCapacityConfirmation from \"../confirmations/updateOnlineCapacity\";\r\n\r\nimport Capacity from \"./components/capacity\";\r\nimport CutoffTime from \"./components/cutoffTime\";\r\nimport EventTimes from \"./components/eventTimes\";\r\nimport EventType from \"./components/eventType\";\r\nimport Location from \"./components/location\";\r\nimport Questions from \"./components/questions\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport Switch from \"@mui/material/Switch\";\r\n\r\nimport ExpandLessIcon from \"@mui/icons-material/ExpandLess\";\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport { AttachedFile } from \"modules/gallery\";\r\nimport { CroppableImage } from \"modules/common/components/authoring/models\";\r\nimport { \r\n getDefaultNotificationSetting, \r\n isAnyTenantEventNotificationsEnabled, \r\n isAnyTenantRemindersEnabled \r\n} from \"utils/notificationsHelper\";\r\nimport { NotificationEvents } from \"modules/messaging\";\r\nimport { ICustomCssModelv1 } from \"api/files\";\r\nimport { mentionCheck } from \"utils/regexUserValidation\";\r\nimport { EventCommandBar, EventCommandBarAction, IEventCommandBarAction } from \"./components/eventCommandBar\";\r\nimport { MultiSelectTopic, MultiSelectTopicGroup, TenantSettingsTag, TenantSettingsTagGroup } from \"modules/settings\";\r\nimport MultiselectAndChipsWithSearch from \"modules/common/components/forms/inputs/multiSelectAndChipsWithSearch\";\r\n\r\nclass EventEditor extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n const { currentUser, event } = props;\r\n const availableLcids: string[] = !!event.translatedContent ? Object.keys(event.translatedContent) : [];\r\n\r\n this.state = {\r\n hasNotifications: !!event.notifications && (event.notifications.emailOnPublish !== \"none\" || event.notifications.mobileOnPublish !== \"none\" || event.notifications.smsOnPublish !== \"none\" || event.notifications.teamsOnPublish !== \"none\"),\r\n hasReminders: !!event.notifications && !!event.notifications.reminders && !!event.notifications.reminders.length,\r\n showAttachedFiles: !!event.fileAttachments && !!event.fileAttachments.length,\r\n showAuthor: !!currentUser && ((event.author !== `${currentUser.firstName} ${currentUser.lastName}`) || (event.authorEmail !== currentUser.email) || !(/^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/).test(event.authorEmail ?? \"\")),\r\n showHeroBanner: (!!event.image && !!event.image.id) || (!!event.attachedContent && !!event.attachedContent.length),\r\n showMoreOptions: false,\r\n showQuestions: !!event.questions && !!Object.keys(event.questions).length,\r\n showSummary: !!availableLcids.find((lcid) => !!event.translatedContent![lcid].description),\r\n showUpdateInPersonCapacityConfirmation: false,\r\n showUpdateOnlineCapacityConfirmation: false,\r\n hasMention: false,\r\n selectedTopics: this.getSelectedTopicDetails(this.props.event.tags)\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (prevProps.event.tags?.length === 0 && this.props.event.tags?.length !== 0) {\r\n this.setState({selectedTopics: this.getSelectedTopicDetails(this.props.event.tags)})\r\n }\r\n }\r\n \r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n \r\n private getSelectedTopicDetails = (selectedTopics?: Tag[]): MultiSelectTopic[] => {\r\n return this.props.topicGroups\r\n .flatMap((group: TenantSettingsTagGroup) => group.tags)\r\n .filter((topic: TenantSettingsTag) => (selectedTopics?.map((postTag: Tag) => postTag.id) || []).includes(topic.id))\r\n .map((topic) => ({...topic}))\r\n ?? [];\r\n }\r\n\r\n /**\r\n * Remove disabled topics and empty topic groups before rendering\r\n */\r\n private filterTopicGroups = () : MultiSelectTopicGroup[] => {\r\n return this.props.topicGroups.map((group: TenantSettingsTagGroup) => ({\r\n ...group,\r\n children: group.tags.filter((tag: TenantSettingsTag) => !tag.disabled)\r\n })).filter((group: TenantSettingsTagGroup) => group.tags.length > 0);\r\n }\r\n \r\n public render() {\r\n const { event, notificationSettings } = this.props;\r\n\r\n const notificationSettingsEnabled = !!event.notifications && isAnyTenantEventNotificationsEnabled(notificationSettings)\r\n const reminderSettingsEnabled = !!event.notifications && !!event.notifications.reminders && isAnyTenantRemindersEnabled(notificationSettings);\r\n\r\n return (\r\n <div>\r\n <EventCommandBar\r\n eventType={event.eventType}\r\n actions={this.getEventCommandBarActions()}\r\n />\r\n <div className=\"editors-container\">\r\n <div className=\"main-editor\">\r\n <HeroBanner\r\n show={this.state.showHeroBanner}\r\n attachedContent={event.attachedContent}\r\n image={event.image}\r\n optional\r\n onChangeAttachedContent={this.onChangeAttachedContent}\r\n onChangeImage={this.onChangeImage}\r\n onRemove={this.onRemoveHeroBanner}\r\n onRemoveImage={this.onRemoveImage}\r\n />\r\n <Author\r\n show={this.state.showAuthor}\r\n author={event.author}\r\n authorEmail={event.authorEmail}\r\n type=\"Organizer\"\r\n onChangeAuthor={this.onChangeAuthor}\r\n onChangeAuthorEmail={this.onChangeAuthorEmail}\r\n onRemove={this.onRemoveAuthor}\r\n />\r\n <TranslatedContent\r\n customCss={this.props.customCss}\r\n showSummary={this.state.showSummary}\r\n id={event.id}\r\n translatedContent={event.translatedContent}\r\n type=\"event\"\r\n getContentAnalysis={this.props.getContentAnalysis}\r\n getDraftTranslation={this.props.getDraftTranslation}\r\n onChange={this.onChangeTranslatedContent}\r\n onRemoveSummary={this.onRemoveSummary}\r\n />\r\n <FileAttachments\r\n show={this.state.showAttachedFiles} \r\n fileAttachments={event.fileAttachments}\r\n onChange={this.onChangeFileAttachments}\r\n onRemove={this.onRemoveAttachedFiles}\r\n itemCloseIcon={<DeleteIcon />}\r\n buttonLabel=\"ADD FILE\"\r\n removeLabel=\"Remove All Attachments\"\r\n isGreyPaper\r\n />\r\n <Questions show={this.state.showQuestions} questions={event.questions} onChange={this.onChangeQuestion} onRemove={this.onRemoveQuestions} />\r\n </div>\r\n <div className=\"settings-editor\">\r\n <Paper elevation={0} className=\"section-card\">\r\n <Validator validationChecks={this.props.validationChecks}>\r\n {event.eventType === \"informational\" &&\r\n <div className=\"progress-list-info\">\r\n <span className=\"emphasis\">Event Type (Informational)</span> is set to default. Change this setting below.\r\n </div>\r\n }\r\n {!!event.publishTime && (moment(event.publishTime) < moment()) &&\r\n <div className=\"progress-list-info\">\r\n Take note that the <span className=\"emphasis\">Publish on</span> date is set to a past date.\r\n </div>\r\n }\r\n </Validator>\r\n </Paper>\r\n <Paper elevation={0} className=\"section-card\">\r\n <EventType eventType={event.eventType} onChange={this.onChangeEventType} />\r\n <div className=\"section-card-subcontent\">\r\n <Collapse in={event.eventType !== \"informational\"}>\r\n <CutoffTime cutoffTime={event.cutoffTime} eventType={event.eventType} disabled={!event.respondingEnabled} onChange={this.onChangeCutoffTime} />\r\n <Capacity capacity={event.capacity!} disabled={!event.respondingEnabled} onChange={this.onChangeCapacity} />\r\n </Collapse>\r\n </div>\r\n </Paper>\r\n <Paper elevation={0} className=\"section-card\">\r\n <AuthoringWarnings tags={event.tags!} onChange={this.onChangeTags} hasMention={this.state.hasMention} />\r\n\r\n <MultiselectAndChipsWithSearch\r\n containerClassName=\"detail-input\"\r\n buttonText=\"Add/Edit Topics\"\r\n selectedOptions={this.state.selectedTopics}\r\n onChange={this.onChangeTags}\r\n defaultOptions={this.filterTopicGroups()}\r\n buttonId=\"add-edit-topics-button\"\r\n />\r\n </Paper>\r\n <Paper elevation={0} className=\"section-card date-and-location\">\r\n <div className=\"section-card-heading\">Event Date</div>\r\n <div className=\"section-card-subcontent\">\r\n <EventTimes eventTimes={event.eventTimes} onChange={this.onChangeEventTimes} />\r\n </div>\r\n <div className=\"section-card-heading\">Event Location</div>\r\n <div className=\"section-card-subcontent\">\r\n <Location location={event.location} locationLink={event.locationLink} locationLinkLabel={event.locationLinkLabel} onChangeLocation={this.onChangeLocation} onChangeLocationLink={this.onChangeLocationLink} onChangeLocationLinkLabel={this.onChangeLocationLinkLabel} clearLocationLink={this.clearLocationLink} />\r\n </div>\r\n </Paper>\r\n <Paper elevation={0} className=\"section-card\">\r\n {this.state.showMoreOptions\r\n ? <Button variant=\"text\" color=\"primary\" endIcon={<ExpandLessIcon />} onClick={this.onShowLessOptions}>\r\n Show less options\r\n </Button>\r\n : <Button variant=\"text\" color=\"primary\" endIcon={<ExpandMoreIcon />} onClick={this.onShowMoreOptions}>\r\n Show more options\r\n </Button>\r\n }\r\n </Paper>\r\n <Collapse in={this.state.showMoreOptions}>\r\n {notificationSettingsEnabled &&\r\n <Paper elevation={0} className=\"section-card\">\r\n <div className=\"section-card-heading\">\r\n <div>Notify subscribers upon publishing</div>\r\n <Switch\r\n color=\"primary\"\r\n checked={this.state.hasNotifications}\r\n onChange={this.onSetNotifications}\r\n />\r\n </div>\r\n <Collapse in={this.state.hasNotifications}>\r\n <Button variant=\"text\" color=\"primary\" disableRipple onClick={this.onShowNotificationSettings} className=\"notification-options\">Edit notification upon publishing</Button>\r\n </Collapse>\r\n </Paper>\r\n }\r\n {reminderSettingsEnabled &&\r\n <Paper elevation={0} className=\"section-card\">\r\n <div className=\"section-card-heading\">\r\n <div>Send reminder if event is unread</div>\r\n <Switch\r\n color=\"primary\"\r\n checked={this.state.hasReminders}\r\n onChange={this.onToggleReminderSettings}\r\n />\r\n </div>\r\n <Collapse in={this.state.hasReminders}>\r\n <Button variant=\"text\" color=\"primary\" disableRipple onClick={() => this.props.onShowReminderSettings(true)} className=\"notification-options\">Edit reminders</Button>\r\n </Collapse>\r\n </Paper>\r\n }\r\n <Paper elevation={0} className=\"section-card\">\r\n <PublishTime publishTime={event.publishTime} onChange={this.onChangePublishTime} />\r\n <ExpiryTime expiryTime={event.expiryTime} onChange={this.onChangeExpiryTime} />\r\n </Paper>\r\n </Collapse>\r\n </div>\r\n </div>\r\n <Notifications show={this.props.showNotificationSettings} isPreviouslyPublished={!!event.isPreviouslyPublished} notifications={event.notifications} type=\"event\" onChangeNotifications={this.onChangeNotifications} onClose={() => this.props.onShowNotificationSettings(false)} />\r\n <Reminders show={this.props.showReminderSettings} isPreviouslyPublished={!!event.isPreviouslyPublished} notifications={event.notifications} type=\"event\" onChangeNotifications={this.onChangeNotifications} onClose={() => this.props.onShowReminderSettings(false)} />\r\n <UpdateInPersonCapacityConfirmation show={this.state.showUpdateInPersonCapacityConfirmation} onConfirm={this.onRemoveInPersonCapacity} onCancel={this.onHideUpdateInPersonCapacityConfirmation} />\r\n <UpdateOnlineCapacityConfirmation show={this.state.showUpdateOnlineCapacityConfirmation} onConfirm={this.onRemoveOnlineCapacity} onCancel={this.onHideUpdateOnlineCapacityConfirmation} />\r\n <LoadingOverlay absolute={true} show={this.props.isFetching} />\r\n </div>\r\n );\r\n }\r\n\r\n private getEventCommandBarActions = () : Record<EventCommandBarAction, IEventCommandBarAction> => {\r\n return {\r\n [EventCommandBarAction.AddOrganizer] : { onClick: this.onShowAuthor, disabled: this.state.showAuthor },\r\n [EventCommandBarAction.AddQuestion] : { onClick: this.onShowQuestions, disabled: this.state.showQuestions },\r\n [EventCommandBarAction.AttachFiles] : { onClick: this.onShowAttachedFiles, disabled: this.state.showAttachedFiles },\r\n [EventCommandBarAction.ShowBanner] : { onClick: this.onShowHeroBanner, disabled: this.state.showHeroBanner },\r\n [EventCommandBarAction.ShowSummary] : { onClick: this.onShowSummary, disabled: this.state.showSummary },\r\n };\r\n }\r\n\r\n private onChangeEvent = (value: Partial<Event>) => {\r\n this.props.onChangeEvent(value);\r\n }\r\n\r\n\r\n private onChangeAttachedContent = (attachedContent: AttachedFile[]) => {\r\n this.onChangeEvent({ attachedContent });\r\n }\r\n\r\n private onChangeAuthor = (author: string) => {\r\n this.onChangeEvent({ author });\r\n }\r\n\r\n private onChangeAuthorEmail = (authorEmail: string) => {\r\n this.onChangeEvent({ authorEmail });\r\n }\r\n\r\n private onChangeCapacity = (capacity: ICapacity) => {\r\n this.onChangeEvent({ capacity });\r\n }\r\n\r\n private onChangeCutoffTime = (cutoffTime: string) => {\r\n this.onChangeEvent({ cutoffTime });\r\n }\r\n\r\n private onChangeEventTimes = (eventTimes: IEventTimes) => {\r\n this.onChangeEvent({ eventTimes });\r\n }\r\n\r\n private onChangeEventType = (eventType: IEventType) => {\r\n if (eventType === \"informational\") {\r\n this.onChangeEvent({\r\n capacity: { InPerson: -1, Online: -1, Waitlist: -1, NotAttending: -1 },\r\n cutoffTime: undefined,\r\n eventType,\r\n questions: undefined,\r\n respondingEnabled: false\r\n });\r\n this.setState({ showQuestions: false });\r\n } else {\r\n const eventStartTime: string = Object.keys(this.props.event.eventTimes!)[0];\r\n const cutoffTime: string = moment(eventStartTime).startOf(\"day\").toISOString();\r\n this.onChangeEvent({ eventType, cutoffTime, respondingEnabled: true });\r\n }\r\n }\r\n\r\n private onChangeExpiryTime = (expiryTime: string) => {\r\n this.onChangeEvent({ expiryTime });\r\n }\r\n\r\n private onChangeFileAttachments = (fileAttachments: AttachedFile[]) => {\r\n this.onChangeEvent({ fileAttachments });\r\n }\r\n\r\n private onChangeImage = (image: CroppableImage) => {\r\n this.onChangeEvent({ image });\r\n }\r\n\r\n private onChangeLocation = (location: string) => {\r\n const { event } = this.props;\r\n const showConfirmation: boolean = !!event.location && !location && event.eventType !== \"informational\" && !!event.capacity && event.capacity.InPerson !== 0;\r\n this.onChangeEvent({ location });\r\n if (showConfirmation)\r\n this.setState({ showUpdateInPersonCapacityConfirmation: true });\r\n }\r\n\r\n private onChangeLocationLink = (locationLink: string) => {\r\n const { event } = this.props;\r\n const showConfirmation: boolean = !!event.locationLink && !locationLink && event.eventType !== \"informational\" && !!event.capacity && event.capacity.Online !== 0;\r\n this.onChangeEvent({ locationLink });\r\n if (showConfirmation)\r\n this.setState({ showUpdateOnlineCapacityConfirmation: true });\r\n }\r\n\r\n private onChangeLocationLinkLabel = (locationLinkLabel: string) => {\r\n const { event } = this.props;\r\n const showConfirmation: boolean = !!event.locationLinkLabel && !locationLinkLabel && event.eventType !== \"informational\" && !!event.capacity && event.capacity.Online !== 0;\r\n this.onChangeEvent({ locationLinkLabel });\r\n if (showConfirmation)\r\n this.setState({ showUpdateOnlineCapacityConfirmation: true });\r\n }\r\n\r\n private clearLocationLink = () => {\r\n this.onChangeEvent({ locationLinkLabel: \"\", locationLink: \"\" });\r\n }\r\n\r\n private onChangeNotifications = (notifications: INotifications) => {\r\n this.onChangeEvent({ notifications });\r\n\r\n this.setState({\r\n hasNotifications: !(notifications.emailOnPublish === \"none\" && notifications.mobileOnPublish === \"none\" && notifications.smsOnPublish === \"none\" && notifications.teamsOnPublish === \"none\"),\r\n hasReminders: !!notifications.reminders && !!notifications.reminders.length\r\n });\r\n }\r\n\r\n private onChangePublishTime = (publishTime: string) => {\r\n this.onChangeEvent({ publishTime });\r\n }\r\n\r\n private onChangeQuestion = (questions: IQuestions) => {\r\n this.onChangeEvent({ questions });\r\n }\r\n\r\n private onChangeTags = (topics: Tag[]) => {\r\n this.onChangeEvent({ tags: topics });\r\n const newTopics = this.getSelectedTopicDetails(topics)\r\n this.setState({selectedTopics: newTopics});\r\n }\r\n\r\n private onChangeTranslatedContent = (translatedContent: ITranslatedContent) => {\r\n var toTest = JSON.stringify(translatedContent);\r\n this.setState({ hasMention: mentionCheck.test(toTest) });\r\n\r\n this.onChangeEvent({ translatedContent });\r\n }\r\n\r\n private onHideUpdateInPersonCapacityConfirmation = () => {\r\n this.setState({ showUpdateInPersonCapacityConfirmation: false });\r\n }\r\n\r\n private onHideUpdateOnlineCapacityConfirmation = () => {\r\n this.setState({ showUpdateOnlineCapacityConfirmation: false });\r\n }\r\n\r\n private onRemoveAttachedFiles = () => {\r\n this.setState({ showAttachedFiles: false });\r\n this.onChangeEvent({ fileAttachments: [] });\r\n }\r\n\r\n private onRemoveAuthor = () => {\r\n const { currentUser } = this.props;\r\n\r\n this.setState({ showAuthor: false });\r\n this.onChangeEvent({ author: currentUser ? `${currentUser.firstName} ${currentUser.lastName}` : \"\", authorEmail: currentUser ? currentUser.email : \"\" });\r\n }\r\n\r\n private onRemoveHeroBanner = () => {\r\n this.setState({ showHeroBanner: false });\r\n this.onChangeEvent({ attachedContent: [], image: undefined });\r\n }\r\n\r\n private onRemoveImage = () => {\r\n this.onChangeEvent({ image: undefined });\r\n }\r\n\r\n private onRemoveInPersonCapacity = () => {\r\n this.onHideUpdateInPersonCapacityConfirmation();\r\n this.onChangeEvent({ capacity: { ...this.props.event.capacity!, InPerson: 0 } });\r\n }\r\n\r\n private onRemoveOnlineCapacity = () => {\r\n this.onHideUpdateOnlineCapacityConfirmation();\r\n this.onChangeEvent({ capacity: { ...this.props.event.capacity!, Online: 0 } });\r\n }\r\n\r\n private onRemoveQuestions = () => {\r\n this.setState({ showQuestions: false });\r\n this.onChangeEvent({ questions: undefined });\r\n }\r\n\r\n private onRemoveSummary = () => {\r\n this.setState({ showSummary: false });\r\n }\r\n\r\n private onSetNotifications = (ev, checked: boolean) => {\r\n if (!checked) {\r\n this.onChangeEvent({\r\n notifications: {\r\n ...this.props.event.notifications!,\r\n emailOnPublish: \"none\",\r\n mobileOnPublish: \"none\",\r\n smsOnPublish: \"none\",\r\n teamsOnPublish: \"none\"\r\n }\r\n });\r\n this.setState({ hasNotifications: false });\r\n } else {\r\n this.onChangeEvent({\r\n notifications: {\r\n ...this.props.event.notifications!,\r\n emailOnPublish: getDefaultNotificationSetting(NotificationEvents.EventPublishedEmail, this.props.notificationSettings),\r\n mobileOnPublish: getDefaultNotificationSetting(NotificationEvents.EventPublishedMobile, this.props.notificationSettings),\r\n smsOnPublish: getDefaultNotificationSetting(NotificationEvents.EventPublishedSMS, this.props.notificationSettings),\r\n teamsOnPublish: getDefaultNotificationSetting(NotificationEvents.EventPublishedTeams, this.props.notificationSettings)\r\n }\r\n });\r\n this.setState({ hasNotifications: true });\r\n this.onShowNotificationSettings();\r\n }\r\n }\r\n\r\n private onShowAttachedFiles = () => {\r\n this.setState({ showAttachedFiles: true });\r\n }\r\n\r\n private onShowAuthor = () => {\r\n this.setState({ showAuthor: true });\r\n }\r\n\r\n private onShowHeroBanner = () => {\r\n this.setState({ showHeroBanner: true });\r\n }\r\n\r\n private onShowLessOptions = () => {\r\n this.setState({ showMoreOptions: false });\r\n }\r\n\r\n private onShowMoreOptions = () => {\r\n this.setState({ showMoreOptions: true });\r\n }\r\n\r\n private onShowNotificationSettings = () => this.props.onShowNotificationSettings(true);\r\n\r\n private onShowQuestions = () => {\r\n this.setState({ showQuestions: true });\r\n }\r\n\r\n private onShowSummary = () => {\r\n this.setState({ showSummary: true });\r\n }\r\n\r\n private onToggleReminderSettings = (ev, checked: boolean) => {\r\n if (!checked) {\r\n this.onChangeEvent({\r\n notifications: {\r\n ...this.props.event.notifications!,\r\n reminders: []\r\n }\r\n });\r\n this.setState({ hasReminders: false });\r\n } else {\r\n this.onChangeEvent({\r\n notifications: {\r\n ...this.props.event.notifications!,\r\n reminders: this.props.notificationSettings.defaultEventSettings?.reminders || [{ channel: \"inherit\", delay: this.props.notificationSettings.defaultPostReminder || 0, range: \"subscribers\" }]\r\n }\r\n });\r\n this.setState({ hasReminders: true });\r\n this.props.onShowReminderSettings(true);\r\n }\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n event: Partial<Event>;\r\n onChangeEvent: (value: Partial<Event>) => void;\r\n isValid: boolean;\r\n showNotificationSettings: boolean;\r\n showReminderSettings: boolean;\r\n validationChecks: ValidationChecks;\r\n onShowNotificationSettings: (value: boolean) => void;\r\n onShowReminderSettings: (value: boolean) => void;\r\n customCss?: ICustomCssModelv1;\r\n}\r\n\r\ninterface ComponentState {\r\n hasNotifications: boolean;\r\n hasReminders: boolean;\r\n showAttachedFiles: boolean;\r\n showAuthor: boolean;\r\n showHeroBanner: boolean;\r\n showMoreOptions: boolean;\r\n showQuestions: boolean;\r\n showSummary: boolean;\r\n showUpdateInPersonCapacityConfirmation: boolean;\r\n showUpdateOnlineCapacityConfirmation: boolean;\r\n hasMention: boolean;\r\n selectedTopics: MultiSelectTopic[];\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n isFetching: state.events.isFetching,\r\n lcidMappings: state.resources.lcidMappings,\r\n currentUser: state.settings.currentUser,\r\n documentGallery: state.events.documentGallery,\r\n imageGallery: state.events.imageGallery,\r\n notificationSettings: state.settings.notificationSettings,\r\n tenantSettings: state.settings.tenantSettings,\r\n tenant: state.tenant.id,\r\n topicGroups: state.settings.tenantSettings.tagGroups,\r\n }),\r\n {\r\n getContentAnalysis: actions.getContentAnalysis,\r\n getDraftTranslation: actions.getDraftTranslation,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(EventEditor);\r\n","import moment from \"moment\";\r\n\r\nimport { Event, ValidationChecks } from \"../../models\";\r\nimport isValidEmail from \"utils/isValidEmail\";\r\n\r\n\r\nclass Validation {\r\n public isValid = (validationChecks: ValidationChecks): boolean => {\r\n const invalidChecks = validationChecks.checks.filter((check) => {\r\n if (check.skip)\r\n return false;\r\n return !check.isValid;\r\n });\r\n return !invalidChecks.length;\r\n };\r\n\r\n public getValidationChecks = (event: Partial<Event>): ValidationChecks => {\r\n const validation: ValidationChecks = {\r\n checks: [\r\n { key: \"title\", description: \"Create a title for each selected language\", isValid: this.isTitleValid(event), link: \"#title\" },\r\n { key: \"body\", description: \"Create body content for each selected language\", isValid: this.isBodyValid(event), link: \"#body\" },\r\n { key: \"author\", description: \"Set an organizer name\", isValid: this.isAuthorValid(event), link: \"#author\", skip: !!event.author },\r\n { key: \"email\", description: \"Set a proper email for the organizer\", isValid: isValidEmail(event.authorEmail || \"\"), link: \"#email\", skip: isValidEmail(event.authorEmail || \"\")},\r\n { key: \"cutoffTime\", description: \"The RSVP deadline must be set after the publish date and before the expiry date\", isValid: this.isCutoffTimeValid(event), link: \"#cutoff-time\", skip: !event.cutoffTime || event.eventType === \"informational\" },\r\n { key: \"tags\", description: \"Select topics to categorize event\", isValid: this.isTagsValid(event), link: \"#tags\" },\r\n { key: \"expiryTime\", description: \"The expiry date must be set after the publish date\", isValid: this.isExpiryTimeValid(event), link: \"#expiry-date\", skip: !event.expiryTime },\r\n { key: \"time\", description: \"Event date(s) must be valid\", isValid: this.isDateTimeValid(event), skip: !event.eventTimes}\r\n ]\r\n };\r\n\r\n return validation;\r\n }\r\n\r\n private isAuthorValid = (event: Partial<Event>): boolean => {\r\n return !!event.author;\r\n }\r\n\r\n private isBodyValid = (event: Partial<Event>): boolean => {\r\n if (!event.translatedContent) {\r\n return false;\r\n }\r\n\r\n const invalid = !!Object.keys(event.translatedContent).filter((lcid) => {\r\n const body = event.translatedContent![lcid].body;\r\n return !body || !body.trim().length;\r\n }).length;\r\n return !invalid;\r\n }\r\n\r\n private isCutoffTimeValid = (event: Partial<Event>): boolean => {\r\n const { cutoffTime, expiryTime, publishTime } = event;\r\n\r\n if (!cutoffTime)\r\n return true;\r\n \r\n if (!publishTime && moment(cutoffTime) < moment())\r\n return false;\r\n if (!!publishTime && moment(cutoffTime) < moment(publishTime))\r\n return false;\r\n if (!!expiryTime && moment(cutoffTime) > moment(expiryTime))\r\n return false;\r\n \r\n return true;\r\n }\r\n\r\n private isStartAfterEnd = (startDate: string, endDate: string) => \r\n moment(endDate).format('HH:mm') < moment(startDate).format('HH:mm')\r\n\r\n private isDateTimeValid = (event: Partial<Event>): boolean => {\r\n const { eventTimes } = event\r\n\r\n if (!eventTimes) return true\r\n\r\n const hasInvalidDate = ([startTime, endTime]) => endTime? this.isStartAfterEnd(startTime, endTime) : false\r\n return !Object.entries(eventTimes).some(hasInvalidDate)\r\n }\r\n\r\n private isExpiryTimeValid = (event: Partial<Event>): boolean => {\r\n const { expiryTime, publishTime } = event;\r\n\r\n if (!expiryTime)\r\n return true;\r\n \r\n if (!publishTime && moment(expiryTime) < moment())\r\n return false;\r\n if (!!publishTime && moment(expiryTime) < moment(publishTime))\r\n return false;\r\n \r\n return true;\r\n }\r\n\r\n private isTagsValid = (event: Partial<Event>): boolean => {\r\n return !!event.tags && !!event.tags.length;\r\n }\r\n\r\n private isTitleValid = (event: Partial<Event>): boolean => {\r\n if (!event.translatedContent) {\r\n return false;\r\n }\r\n\r\n const invalid = !!Object.keys(event.translatedContent).filter((lcid) => {\r\n const title = event.translatedContent![lcid].title;\r\n return !title || !title.trim().length;\r\n }).length;\r\n return !invalid;\r\n }\r\n}\r\n\r\nexport default Validation;","import React from \"react\";\r\n\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport { AuthoringAppBarAction, AuthoringAppBarActions, IAuthoringAppBarAction } from \"modules/common/components/authoring/authoringAppBarActions\";\r\nimport { useContentGuidelines } from \"modules/common/hooks/data/useContentGuidelines\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport { getHighestRole } from \"utils/userRoleUtils\";\r\nimport { DRAFT_CHANGED_BTN_TEXT, DRAFT_MOVE_BTN_TEXT, DRAFT_SAVE_BTN_TEXT } from \"modules/common/components/authoring/constants\";\r\n\r\nimport \"../../../../common/components/authoring/styles/authoringAppBar.sass\";\r\nimport { getPublishBtnName } from \"modules/common/components/authoring/utils\";\r\ninterface IEventAuthoringActionsProps {\r\n appBarState: EventAppBarState;\r\n actions: EventAppBarActions;\r\n}\r\n\r\ninterface EventAppBarState {\r\n isValidDraft: boolean;\r\n hasDraft: boolean;\r\n isSubmission: boolean;\r\n isPublished: boolean;\r\n}\r\n\r\ninterface EventAppBarActions {\r\n discardEvent: () => void;\r\n publishEvent: () => void;\r\n saveEvent: () => void;\r\n openGuidelines: () => void;\r\n rejectSubmission: () => void;\r\n}\r\n\r\nconst EventAuthoringActions: React.FunctionComponent<PropsWithRedux> = (props) => {\r\n const {\r\n appBarState: state,\r\n actions,\r\n } = props;\r\n\r\n const { isEmpty: isGuidelineEmpty } = useContentGuidelines();\r\n const isContributor = getHighestRole(props.currentUser) === UserRoleStrings.CONTRIBUTOR;\r\n const isReview = props.appBarState.isSubmission && props.currentUser.roles.includes(UserRoleStrings.AUTHOR);\r\n\r\n const getSaveLabel = () => {\r\n if (!state.isSubmission) return DRAFT_SAVE_BTN_TEXT;\r\n return isContributor ? DRAFT_MOVE_BTN_TEXT : DRAFT_CHANGED_BTN_TEXT;\r\n };\r\n\r\n const allActions: Record<AuthoringAppBarAction, IAuthoringAppBarAction | undefined> = {\r\n [AuthoringAppBarAction.Discard]: {\r\n onClick: actions.discardEvent,\r\n disabled: !state.hasDraft\r\n },\r\n [AuthoringAppBarAction.Publish]: {\r\n onClick: async () => actions.publishEvent(),\r\n disabled: !state.isValidDraft,\r\n label: getPublishBtnName(isContributor, state.isSubmission, state.isValidDraft)\r\n },\r\n [AuthoringAppBarAction.Save]: {\r\n onClick: async () => actions.saveEvent(),\r\n disabled: !state.hasDraft && !props.changedSinceSaved,\r\n label: getSaveLabel()\r\n },\r\n [AuthoringAppBarAction.OpenGuidelines]: {\r\n onClick: actions.openGuidelines,\r\n disabled: isGuidelineEmpty\r\n },\r\n [AuthoringAppBarAction.Reject]: {\r\n onClick: actions.rejectSubmission,\r\n disabled: !isReview\r\n },\r\n [AuthoringAppBarAction.Back]: undefined,\r\n [AuthoringAppBarAction.Preview]: undefined,\r\n [AuthoringAppBarAction.ToggleSettingsPanel]: undefined,\r\n };\r\n\r\n const eventActions = React.useMemo(\r\n (): Record<AuthoringAppBarAction, IAuthoringAppBarAction | undefined> => {\r\n if (!isReview) {\r\n allActions[AuthoringAppBarAction.Reject] = undefined;\r\n }\r\n\r\n if (isGuidelineEmpty) allActions[AuthoringAppBarAction.OpenGuidelines] = undefined;\r\n return allActions;\r\n }, [allActions, isGuidelineEmpty, isReview]\r\n );\r\n\r\n return <React.Fragment>\r\n {\r\n props.appBarState.isSubmission && !props.appBarState.isPublished &&\r\n <div className=\"needs-review-div\">\r\n <span className=\"needs-review-dot\" />\r\n <Typography fontSize={\"15px\"}>\r\n {isContributor ? 'Needs Review' : 'Submission'}\r\n </Typography>\r\n </div>\r\n }\r\n <AuthoringAppBarActions actions={eventActions} />\r\n </React.Fragment>\r\n \r\n};\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IEventAuthoringActionsProps) => ({\r\n ...ownProps,\r\n changedSinceSaved: state.events.changedSinceSaved,\r\n currentUser: state.settings.currentUser,\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(EventAuthoringActions);\r\n","import React, { useCallback, useEffect, useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport * as settingsActions from \"modules/settings/actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport moment from \"moment\";\r\n\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Breadcrumb from \"pages/common/breadcrumb\";\r\nimport MainContent from \"pages/common/mainContent\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport { Event, NotificationRange, Reminder, ValidationChecks } from \"../../models\";\r\nimport EventPreview from \"../event-views/eventPreview\";\r\nimport EventEditor from \"./eventEditor\";\r\nimport Validation from \"./validation\";\r\n\r\nimport { PickerLocalization } from \"modules/common/components/pickerLocalization\";\r\n\r\nimport \"modules/common/components/authoring/authoring.sass\";\r\nimport { ImageScale } from \"modules/posts/models\";\r\nimport { adminFilesApi, submissionsApi } from \"api/instances\";\r\nimport { ICustomCssModelv1 } from \"api/files\";\r\nimport ContentGuidelinePreview from \"modules/settings/components/content/guidelines/contentGuidelinePreview\";\r\nimport EventAuthoringActionsAppBar from \"./components/eventAuthoringActionsAppBar\";\r\nimport { HintType } from \"modules/common/components/authoring/dialogs/guidelineHint\";\r\nimport { getHighestRole } from \"utils/userRoleUtils\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport RejectSubmissionDialog from \"modules/common/components/authoring/dialogs/rejectSubmissionDialog\";\r\nimport DraftHistoryButton from \"modules/common/components/authoring/draftLog/draftHistoryButton\";\r\nimport { useDefaultLocale } from \"modules/common/hooks/useDefaultLocale\";\r\nimport { useOpenContentGuidelines } from \"modules/common/hooks/useOpenContentGuidelines\";\r\n\r\nconst EventCreation: React.FunctionComponent<PropsWithRedux> = (props) => {\r\n const getNewEvent = React.useMemo((): Partial<Event> => {\r\n const author: string = props.currentUser\r\n ? (props.currentUser.preferredName\r\n ? `${props.currentUser.preferredName} ${props.currentUser.lastName}`\r\n : `${props.currentUser.firstName} ${props.currentUser.lastName}`)\r\n : \"\";\r\n const authorEmail: string = props.currentUser ? props.currentUser.email : \"\";\r\n const bannerColor: string = (props.tenantSettings && props.tenantSettings.themeSettings && props.tenantSettings.themeSettings.color) || \"#2196f3\";\r\n const lcid: string = props.tenantSettings ? props.tenantSettings.defaultLCID : \"en-us\";\r\n const eventStartTime: string = moment(new Date()).startOf(\"hour\").add(1, \"hour\").add(1, \"day\").toISOString();\r\n const eventEndTime: string = moment(eventStartTime).add(30, \"minutes\").toISOString();\r\n\r\n const newEvent: Partial<Event> = {\r\n id: \"\",\r\n attachedContent: [],\r\n author: author,\r\n authorEmail: authorEmail,\r\n bannerColor: bannerColor,\r\n capacity: {\r\n InPerson: -1,\r\n NotAttending: -1,\r\n Online: -1,\r\n Waitlist: -1\r\n },\r\n commentingEnabled: false,\r\n eventTimes: {\r\n [eventStartTime]: eventEndTime\r\n },\r\n eventType: \"informational\",\r\n fileAttachments: [],\r\n locationLink: \"\",\r\n locationLinkLabel: \"\",\r\n notifications: {\r\n emailOnPublish: props.notificationSettings.defaultEventSettings?.emailOnPublish as NotificationRange || \"none\",\r\n mobileOnPublish: props.notificationSettings.defaultEventSettings?.mobileOnPublish as NotificationRange || \"subscribers\",\r\n reminders: props.notificationSettings.defaultEventSettings?.reminders as Reminder[] || [],\r\n smsOnPublish: props.notificationSettings.defaultEventSettings?.smsOnPublish as NotificationRange || \"none\",\r\n teamsOnPublish: props.notificationSettings.defaultEventSettings?.teamsOnPublish as NotificationRange || \"subscribers\"\r\n },\r\n respondingEnabled: false,\r\n tags: [],\r\n translatedContent: {\r\n [lcid]: {\r\n body: \"\",\r\n description: \"\",\r\n title: \"\"\r\n }\r\n }\r\n };\r\n return newEvent;\r\n\r\n }, [props.tenantSettings, props.notificationSettings, props.currentUser]);\r\n\r\n const validation = new Validation();\r\n const [event, setEvent] = useState<Partial<Event> | undefined>(undefined);\r\n\r\n const [hasError, setHasError] = useState<boolean>(false);\r\n const [isFetching, setIsFetching] = useState<boolean>(true);\r\n const [validationChecks, setValidationChecks] = useState<ValidationChecks>(validation.getValidationChecks(getNewEvent));\r\n const [isValid, setIsValid] = useState<boolean>(validation.isValid(validationChecks));\r\n const [showNotificationSettings, setShowNotificationSettings] = useState<boolean>(false);\r\n const [showPreview, setShowPreview] = useState<boolean>(false);\r\n const [showReminderSettings, setShowReminderSettings] = useState<boolean>(false);\r\n const [showRejectSubmissionDialog, setShowRejectSubmissionDialog] = useState<boolean>(false);\r\n const [customCss, setCustomCss] = useState<ICustomCssModelv1 | undefined>(undefined);\r\n\r\n const { openContentGuidelines, setOpenContentGuidelines } = useOpenContentGuidelines();\r\n\r\n const isContributor = getHighestRole(props.currentUser) === UserRoleStrings.CONTRIBUTOR;\r\n const draftId = props.match.params.draftId;\r\n\r\n useDefaultLocale();\r\n\r\n const {\r\n getDraft,\r\n clearChangedSinceSaved,\r\n updateUrlComplete,\r\n getTagSettings,\r\n publishEvent,\r\n submitEvent,\r\n saveEvent,\r\n redirectTo,\r\n updateUrl\r\n } = props;\r\n\r\n useEffect(() => {\r\n const currValidation = new Validation();\r\n\r\n const onGetDraft = async (draftId: string) => {\r\n try {\r\n const draftEvent = await getDraft(draftId, ImageScale.Unprocessed);\r\n if (!!draftEvent) {\r\n setEvent(draftEvent);\r\n const checks = currValidation.getValidationChecks(draftEvent);\r\n setValidationChecks(checks);\r\n setIsValid(currValidation.isValid(checks));\r\n setHasError(false);\r\n }\r\n else {\r\n setHasError(true);\r\n }\r\n }\r\n catch {\r\n setHasError(true);\r\n }\r\n finally {\r\n setIsFetching(false);\r\n }\r\n };\r\n\r\n if (!!draftId) {\r\n clearChangedSinceSaved();\r\n\r\n if (draftId === \"new\") {\r\n setEvent({ ...getNewEvent });\r\n\r\n const checks = currValidation.getValidationChecks(getNewEvent);\r\n setValidationChecks(checks);\r\n\r\n setHasError(false);\r\n setIsFetching(false);\r\n setIsValid(currValidation.isValid(checks));\r\n } else {\r\n onGetDraft(draftId);\r\n }\r\n }\r\n }, [draftId, getNewEvent, getDraft, clearChangedSinceSaved]);\r\n\r\n useEffect(() => {\r\n if (!!draftId) {\r\n if (props.isUpdatingUrl) {\r\n setEvent({ ...event, id: draftId });\r\n updateUrlComplete();\r\n }\r\n }\r\n }, [props.isUpdatingUrl, event, draftId, updateUrlComplete]);\r\n\r\n useEffect(() => {\r\n if (props.tagSettings.shouldFetch || !props.tagSettings.tagGroups.length)\r\n getTagSettings();\r\n }, [props.tagSettings.shouldFetch, props.tagSettings.tagGroups.length, getTagSettings]);\r\n\r\n useEffect(() => {\r\n const fetchAndSetCustomCss = async () => {\r\n const res = await adminFilesApi.getCustomTinyMceCss();\r\n setCustomCss(res);\r\n };\r\n\r\n try {\r\n if (!props.tenantSettings.showFeatures.tinyMceCustomCssEnabled) return;\r\n\r\n setIsFetching(true);\r\n fetchAndSetCustomCss();\r\n }\r\n finally {\r\n setIsFetching(false);\r\n }\r\n }, [props.tenantSettings.showFeatures.tinyMceCustomCssEnabled]);\r\n\r\n const onHidePreview = () => setShowPreview(false);\r\n\r\n const redirectToManageEvents = useCallback(() => {\r\n redirectTo(`/${props.match.params.tenant}/admin/events`);\r\n }, [props.match.params.tenant, redirectTo]);\r\n\r\n const onPublishEvent = useCallback((sendNotification: boolean) => {\r\n const triggerPublish = async () => {\r\n const succeeded = isContributor\r\n ? await submitEvent(draftId)\r\n : await publishEvent(draftId, sendNotification);\r\n\r\n if (succeeded) redirectToManageEvents();\r\n }\r\n \r\n onHidePreview();\r\n triggerPublish();\r\n }, [isContributor, redirectToManageEvents, publishEvent, draftId, submitEvent]);\r\n\r\n const eventPreview = React.useMemo(() => !!event && <EventPreview\r\n show={showPreview}\r\n event={event}\r\n onEditDetails={onHidePreview}\r\n onPublish={onPublishEvent}\r\n onClose={onHidePreview}\r\n isContributor={isContributor}\r\n inEditor\r\n />, [showPreview, event, onPublishEvent, isContributor]);\r\n\r\n const contentGuidelinePreview = React.useMemo(() => \r\n {\r\n return <ContentGuidelinePreview\r\n showPreview={openContentGuidelines}\r\n onClose={() => setOpenContentGuidelines(false)}\r\n isAuthoring\r\n hintType={HintType.Event}\r\n />\r\n }\r\n , [openContentGuidelines]);\r\n\r\n const backToManageEvents = async () => {\r\n if (!props.changedSinceSaved) return redirectToManageEvents();\r\n\r\n if (await confirm.show({\r\n title: \"Back to Manage Events\",\r\n yesColor: \"#3b78ab\",\r\n noColor: \"#888888\",\r\n text: (\r\n <React.Fragment>\r\n <div className=\"emphasis\">Your changes will not be saved.</div>\r\n <br />\r\n <div>Do you want to continue?</div>\r\n </React.Fragment>\r\n )\r\n })) {\r\n props.clearChangedSinceSaved();\r\n redirectToManageEvents();\r\n }\r\n };\r\n\r\n const discardEvent = useCallback(() => {\r\n clearChangedSinceSaved();\r\n redirectToManageEvents();\r\n }, [clearChangedSinceSaved, redirectToManageEvents]);\r\n\r\n const onSave = useCallback(async (redirect: boolean = true) => {\r\n if (!event?.id) updateUrl();\r\n\r\n // a contributor moving a submission back to drafts\r\n const toSave = event?.isSubmission && isContributor ? {...event, isSubmission: false} : event\r\n\r\n const response = toSave && await saveEvent(toSave)\r\n if (response?.id && redirect)\r\n redirectTo(`/${props.match.params.tenant}/admin/events/edit/${response.id}`);\r\n\r\n return response?.id;\r\n }, [props.match.params.tenant, redirectTo, saveEvent, event, updateUrl, isContributor])\r\n\r\n const previewEvent = useCallback(async () => {\r\n const draftId = await onSave();\r\n if (draftId) setShowPreview(true);\r\n }, [onSave]);\r\n\r\n const commands = React.useMemo(() => <EventAuthoringActionsAppBar\r\n actions={{\r\n discardEvent: discardEvent,\r\n publishEvent: previewEvent,\r\n saveEvent: onSave,\r\n openGuidelines: () => setOpenContentGuidelines(true),\r\n rejectSubmission: () => setShowRejectSubmissionDialog(true)\r\n }}\r\n appBarState={{\r\n hasDraft: Boolean(event?.id),\r\n isValidDraft: isValid,\r\n isSubmission: event?.isSubmission ?? false,\r\n isPublished: event?.publishTime ? new Date(event.publishTime) < new Date() : false,\r\n }}\r\n />, [isValid, event, discardEvent, previewEvent, onSave]);\r\n\r\n const onChangeEvent = (value: Partial<Event>) => {\r\n const changedEvent = { ...event, ...value };\r\n setEvent(changedEvent);\r\n\r\n const checks = validation.getValidationChecks(changedEvent);\r\n setValidationChecks(checks);\r\n setIsValid(validation.isValid(checks));\r\n\r\n props.hasChangedSinceSaved();\r\n };\r\n\r\n const onRejectSubmission = async (comments?: string) => {\r\n try {\r\n await submissionsApi.unsubmitEvent(draftId, comments);\r\n }\r\n finally {\r\n props.clearChangedSinceSaved();\r\n redirectToManageEvents();\r\n }\r\n }\r\n\r\n const getRejectionDialog = (): JSX.Element =>\r\n <RejectSubmissionDialog\r\n unsavedChanges={props.changedSinceSaved}\r\n open={showRejectSubmissionDialog}\r\n setOpen={setShowRejectSubmissionDialog} \r\n saveProgress={async () => !!(await onSave(false)) }\r\n rejectSubmission={onRejectSubmission}\r\n />\r\n\r\n return (\r\n <BasePage fullWidth>\r\n <Breadcrumb\r\n items={[\r\n { title: \"Events\", onClick: backToManageEvents },\r\n { title: draftId === \"new\" ? \"Create new event\" : \"Edit event\" }\r\n ]}\r\n backItem={{ title: \"Back to Manage Events\", onClick: backToManageEvents }}\r\n middleComponent={<DraftHistoryButton otherPopoutsClosed={!openContentGuidelines}/>}\r\n rightComponent={commands}\r\n isFlex\r\n />\r\n <MainContent>\r\n <div className=\"authoring-page\">\r\n {isFetching || !event\r\n ? <Loading />\r\n : hasError\r\n ? <div className=\"no-event-data\">This event could not be loaded.</div>\r\n : <PickerLocalization>\r\n <EventEditor\r\n customCss={customCss}\r\n event={event}\r\n onChangeEvent={onChangeEvent}\r\n isValid={isValid}\r\n showNotificationSettings={showNotificationSettings}\r\n showReminderSettings={showReminderSettings}\r\n onShowNotificationSettings={setShowNotificationSettings}\r\n onShowReminderSettings={setShowReminderSettings}\r\n validationChecks={validationChecks}\r\n />\r\n </PickerLocalization>\r\n }\r\n {eventPreview}\r\n {contentGuidelinePreview}\r\n {getRejectionDialog()}\r\n <ErrorSnackbar\r\n errorMessage={props.errorMessage}\r\n clearErrorMessage={props.clearErrorMessage}\r\n />\r\n <LoadingOverlay absolute={true} show={props.isSaving} />\r\n </div>\r\n </MainContent>\r\n </BasePage>\r\n );\r\n};\r\n\r\ninterface RouteParams {\r\n tenant: string;\r\n draftId: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: RouteComponentProps<RouteParams>) => ({\r\n ...ownProps,\r\n changedSinceSaved: state.events.changedSinceSaved,\r\n errorMessage: state.events.errorMessage,\r\n isSaving: state.events.isSaving,\r\n isUpdatingUrl: state.events.isUpdatingUrl,\r\n currentUser: state.settings.currentUser,\r\n notificationSettings: state.settings.notificationSettings,\r\n tagSettings: state.settings.tagSettings,\r\n tenantSettings: state.settings.tenantSettings,\r\n }),\r\n {\r\n clearChangedSinceSaved: actions.clearChangedSinceSaved,\r\n hasChangedSinceSaved: actions.hasChangedSinceSaved,\r\n clearErrorMessage: actions.clearErrorMessage,\r\n getDraft: actions.getDraft,\r\n getTagSettings: settingsActions.getTagSettings,\r\n publishEvent: actions.publishEvent,\r\n submitEvent: actions.submitEvent,\r\n saveEvent: actions.saveEvent,\r\n updateUrl: actions.updateUrl,\r\n updateUrlComplete: actions.updateUrlComplete,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(EventCreation);\r\n","import * as React from \"react\";\r\n\r\nimport { AttendanceType, Attendee } from \"../../models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Select from \"@mui/material/Select\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\nimport \"../../styles/dialogs.sass\";\r\n\r\n\r\nclass ChangeRSVPStatus extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n attendanceType: \"\"\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: ComponentProps) {\r\n if (this.props.show && !prevProps.show)\r\n this.setState({\r\n attendanceType: \"\"\r\n });\r\n }\r\n\r\n public render() {\r\n if (!this.props.attendees || (this.props.attendees.length < 2))\r\n return <React.Fragment></React.Fragment>;\r\n\r\n return (\r\n <Dialog open={this.props.show} maxWidth={false} onClose={this.onClose}>\r\n <DialogTitle className=\"events-dialog-header\">\r\n <div className=\"events-dialog-header-title\">\r\n <div>\r\n <Typography variant=\"h2\">Change RSVP Status</Typography>\r\n <Typography variant=\"subtitle2\">{this.props.attendees.length} Selected Participants</Typography>\r\n </div>\r\n <IconButton onClick={this.onClose} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent className=\"manage-attendance-content\">\r\n <div>\r\n <div className=\"emphasis\">Change RSVP status to:</div>\r\n <div>\r\n <Select\r\n variant=\"outlined\"\r\n value={this.state.attendanceType || \"\"}\r\n fullWidth\r\n onChange={this.onChangeAttendanceType}\r\n >\r\n <MenuItem value=\"InPerson\">Attending in-person</MenuItem>\r\n <MenuItem value=\"Online\">Attending online</MenuItem>\r\n <MenuItem value=\"Waitlist\">Waitlist</MenuItem>\r\n <MenuItem value=\"NotAttending\">Not Attending</MenuItem>\r\n </Select>\r\n </div>\r\n </div>\r\n </DialogContent>\r\n <DialogActions className=\"events-dialog-footer\">\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onClose}>Cancel</Button>\r\n <Button variant=\"contained\" color=\"primary\" disabled={!this.state.attendanceType || (this.state.attendanceType === \"Undecided\")} onClick={this.onApply}>Save</Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n }\r\n\r\n private onApply = () => {\r\n this.props.onApply(this.state.attendanceType as AttendanceType);\r\n }\r\n\r\n private onChangeAttendanceType = (event) => {\r\n this.setState({ attendanceType: event.target.value });\r\n }\r\n\r\n private onClose = () => {\r\n this.props.onClose();\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n attendees: Attendee[];\r\n onApply: (attendanceType: AttendanceType) => void;\r\n onClose: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n attendanceType: AttendanceType | \"\";\r\n}\r\n\r\nexport default ChangeRSVPStatus;","import * as React from \"react\";\r\nimport moment from \"moment\";\r\n\r\nimport { Answers, AttendanceType, Attendee, Questions } from \"../../models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Select from \"@mui/material/Select\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\nimport \"../../styles/dialogs.sass\";\r\n\r\n\r\nclass EditResponse extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n answers: props.attendee ? props.attendee.answers : {},\r\n attendanceType: props.attendee ? props.attendee.attendanceType : \"\"\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n componentDidUpdate(prevProps: ComponentProps) {\r\n if (this.props.show && !prevProps.show)\r\n this.setState({\r\n answers: this.props.attendee!.answers,\r\n attendanceType: this.props.attendee!.attendanceType\r\n });\r\n }\r\n\r\n public render() {\r\n if (!this.props.attendee)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n return (\r\n <Dialog open={this.props.show} maxWidth={false} onClose={this.onClose}>\r\n <DialogTitle className=\"events-dialog-header\">\r\n <div className=\"events-dialog-header-title\">\r\n <div>\r\n <Typography variant=\"h2\">Edit Response</Typography>\r\n <Typography variant=\"subtitle2\">Event: {this.props.title}, {moment(this.props.eventStartTime).format(\"MMM D, YYYY\")}</Typography>\r\n </div>\r\n <IconButton onClick={this.onClose} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent className=\"manage-attendance-content\">\r\n <div>\r\n <div>Participant</div>\r\n <div className=\"emphasis\">{this.props.attendee.name}</div>\r\n </div>\r\n <div>\r\n <div className=\"emphasis\">RSVP Status</div>\r\n <Select\r\n variant=\"outlined\"\r\n value={this.state.attendanceType}\r\n fullWidth\r\n onChange={this.onChangeAttendanceType}\r\n >\r\n <MenuItem value=\"InPerson\">Attending in-person</MenuItem>\r\n <MenuItem value=\"Online\">Attending online</MenuItem>\r\n <MenuItem value=\"Waitlist\">Waitlist</MenuItem>\r\n <MenuItem value=\"NotAttending\">Not Attending</MenuItem>\r\n </Select>\r\n </div>\r\n {!!Object.keys(this.props.questions).length &&\r\n Object.keys(this.props.questions).map((questionNumber, index) =>\r\n <div key={questionNumber}>\r\n <div>Question {index + 1}:</div>\r\n <div className=\"emphasis\">{this.props.questions[questionNumber].body}</div>\r\n <TextField\r\n variant=\"outlined\"\r\n value={this.state.answers ? this.state.answers[questionNumber] || \"\" : \"\"}\r\n autoComplete=\"off\"\r\n fullWidth\r\n onChange={(ev) => this.onChangeAnswers(ev, questionNumber)}\r\n />\r\n </div>\r\n )\r\n }\r\n </DialogContent>\r\n <DialogActions className=\"events-dialog-footer\">\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onClose}>Cancel</Button>\r\n <Button variant=\"contained\" color=\"primary\" disabled={!this.state.attendanceType || (this.state.attendanceType === \"Undecided\")} onClick={this.onApply}>Save</Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n }\r\n\r\n private onApply = () => {\r\n this.props.onApply(this.state.attendanceType as AttendanceType, this.state.answers);\r\n }\r\n\r\n private onChangeAnswers = (event, questionNumber: string) => {\r\n this.setState({\r\n answers: {\r\n ...this.state.answers,\r\n [questionNumber]: event.target.value\r\n }\r\n });\r\n }\r\n\r\n private onChangeAttendanceType = (event) => {\r\n this.setState({ attendanceType: event.target.value });\r\n }\r\n\r\n private onClose = () => {\r\n this.props.onClose();\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n attendee?: Attendee;\r\n eventStartTime: string;\r\n questions: Questions;\r\n title: string;\r\n onApply: (attendanceType: AttendanceType, answers: Answers) => void;\r\n onClose: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n answers: Answers;\r\n attendanceType: AttendanceType | \"\";\r\n}\r\n\r\nexport default EditResponse;","import * as React from \"react\";\r\n\r\nimport { AttendanceFilterValues } from \"../../models\";\r\n\r\nimport AuthoringSearch from \"modules/common/components/filters/authoringSearch\";\r\nimport FilterContainer from \"modules/common/components/filters/filterContainer\";\r\n\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\n\r\nclass AttendanceFilters extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n canSearch: false\r\n };\r\n }\r\n\r\n public render() {\r\n const { filters } = this.props;\r\n\r\n return (\r\n <FilterContainer\r\n filters={\r\n <React.Fragment>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={filters.name}\r\n placeholder=\"Search names\"\r\n onChange={this.onChangeName}\r\n onKeyUp={this.onKeyUp}\r\n className=\"text-to-search\"\r\n />\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={filters.email}\r\n placeholder=\"Search e-mails\"\r\n onChange={this.onChangeEmail}\r\n onKeyUp={this.onKeyUp}\r\n className=\"text-to-search\"\r\n />\r\n </React.Fragment>\r\n }\r\n filterCommands={\r\n <React.Fragment>\r\n <AuthoringSearch\r\n canSearch={this.state.canSearch}\r\n onApplyFilters={this.onApplyFilters}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n </React.Fragment>\r\n }\r\n />\r\n );\r\n }\r\n\r\n\r\n private onApplyFilters = () => {\r\n this.props.onApplyFilters();\r\n this.setCanSearch();\r\n }\r\n\r\n private onChangeFilters = (value: Partial<AttendanceFilterValues>) => {\r\n this.props.onChangeFilters({ ...this.props.filters, ...value });\r\n this.setCanSearch();\r\n }\r\n\r\n private onChangeEmail = (event) => {\r\n this.onChangeFilters({ email: event.target.value });\r\n }\r\n\r\n private onChangeName = (event) => {\r\n this.onChangeFilters({ name: event.target.value });\r\n }\r\n \r\n private onKeyUp = (key) => {\r\n if (key.keyCode === 13)\r\n this.onApplyFilters();\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.clearCanSearch();\r\n this.props.onClearFilters();\r\n }\r\n\r\n\r\n private clearCanSearch = () => {\r\n this.setState({ canSearch: false });\r\n }\r\n\r\n private setCanSearch = () => {\r\n this.setState({ canSearch: true });\r\n }\r\n}\r\n \r\n\r\ninterface ComponentProps {\r\n filters: Partial<AttendanceFilterValues>;\r\n onApplyFilters: () => void;\r\n onChangeFilters: (filters: Partial<AttendanceFilterValues>) => void;\r\n onClearFilters: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n canSearch: boolean;\r\n}\r\n\r\nexport default AttendanceFilters;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport { Answers, Attendee, AttendanceFilterValues, AttendanceListingPage, AttendanceType } from \"../../models\";\r\nimport moment from \"moment\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport ChangeRSVPStatusDialog from \"../dialogs/changeRSVPStatus\";\r\nimport EditResponseDialog from \"../dialogs/editResponse\";\r\nimport AttendanceFilters from \"../event-filters/attendanceFilters\";\r\n\r\nimport TabContent from \"pages/common/tabContent\";\r\nimport TabContentToolbar from \"pages/common/tabContentToolbar\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableContainer from \"@mui/material/TableContainer\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TablePagination from \"@mui/material/TablePagination\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\nimport EditIcon from \"@mui/icons-material/Edit\";\r\nimport UndoIcon from \"@mui/icons-material/Undo\";\r\n\r\n\r\ninterface HeaderCell {\r\n id: string;\r\n label: string;\r\n}\r\n\r\n\r\nclass AttendanceList extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n filters: { ...this.getDefaultFilterValues() },\r\n hasFiltersApplied: false,\r\n isPagedLoad: false,\r\n selectedItems: [],\r\n showChangeRSVPStatusDialog: false,\r\n showEditResponseDialog: false\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public render() {\r\n const { page } = this.props;\r\n const { selectedItems } = this.state;\r\n\r\n if (!this.props.show)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n if (page.isFetching && !this.state.isPagedLoad)\r\n return <Loading />;\r\n \r\n if (page.hasError)\r\n return <div>Could not load participants.</div>\r\n\r\n return (\r\n <div>\r\n {this.getToolbar()}\r\n <TabContent>\r\n {this.getFilter()}\r\n {this.getList()}\r\n <ChangeRSVPStatusDialog show={this.state.showChangeRSVPStatusDialog} attendees={selectedItems} onApply={this.onChangeRSVPStatus} onClose={this.onHideChangeRSVPDialog} />\r\n <EditResponseDialog show={this.state.showEditResponseDialog} attendee={!!selectedItems.length ? selectedItems[0] : undefined} eventStartTime={page.eventStartTime} questions={page.questions} title={page.title} onApply={this.onEditResponse} onClose={this.onHideEditResponseDialog} />\r\n <LoadingOverlay absolute={true} show={this.props.isSaving} />\r\n </TabContent>\r\n </div>\r\n );\r\n }\r\n\r\n\r\n private formatAttendanceType = (attendanceType: AttendanceType): string => {\r\n if (attendanceType === \"InPerson\")\r\n return \"In-Person\";\r\n else if (attendanceType === \"NotAttending\")\r\n return \"Not Attending\";\r\n return attendanceType;\r\n }\r\n\r\n private formatTime = (time?: string): string => {\r\n if (time) {\r\n return moment(new Date(time)).format(\"MMM D, YYYY\");\r\n }\r\n return \"-\";\r\n }\r\n\r\n\r\n private getDefaultFilterValues = (): Partial<AttendanceFilterValues> => {\r\n const filters: Partial<AttendanceFilterValues> = {\r\n email: \"\",\r\n name: \"\"\r\n };\r\n return filters;\r\n }\r\n\r\n private getFilter = (): JSX.Element => {\r\n return (\r\n <AttendanceFilters\r\n filters={this.state.filters}\r\n onApplyFilters={this.onApplyFilters}\r\n onChangeFilters={this.onChangeFilters}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n );\r\n }\r\n\r\n private getHeader = (): HeaderCell[] => {\r\n let header: HeaderCell[] = [\r\n { id: \"name\", label: \"Name\" },\r\n { id: \"email\", label: \"E-mail\" },\r\n { id: \"attendanceType\", label: \"RSVP Status\" },\r\n { id: \"rsvpTime\", label: \"RSVP Time\" }\r\n ];\r\n\r\n return header;\r\n }\r\n\r\n private getList = (): JSX.Element => {\r\n const { page } = this.props;\r\n const { selectedItems } = this.state;\r\n\r\n const rowCount = page.attendees.length || 10;\r\n\r\n if (page.isFetching)\r\n return <Loading />;\r\n\r\n if (!page.attendees.length)\r\n return <div>No participants were found.</div>;\r\n\r\n return (\r\n <React.Fragment>\r\n {this.state.hasFiltersApplied &&\r\n <Typography variant=\"h2\" className=\"filter-results\">Results</Typography>\r\n }\r\n <TableContainer>\r\n <Table size=\"medium\">\r\n <TableHead>\r\n <TableRow>\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n color=\"primary\"\r\n indeterminate={selectedItems.length > 0 && selectedItems.length < rowCount}\r\n checked={rowCount > 0 && selectedItems.length === rowCount}\r\n onChange={this.onSelectAllAttendees}\r\n inputProps={{ \"aria-label\": \"select all attendees\" }}\r\n />\r\n </TableCell>\r\n {this.getHeader().map((headerCell) => (\r\n <TableCell\r\n key={headerCell.id}\r\n align={headerCell.id === \"name\" ? \"left\" : \"center\"}\r\n padding={headerCell.id === \"name\" ? \"none\" : \"normal\"}\r\n >\r\n {headerCell.label}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {page.attendees\r\n .map((attendee, index) => {\r\n const isAttendeeSelected = this.isAttendeeSelected(attendee);\r\n const labelId = `event-list-checkbox-${index}`;\r\n\r\n return (\r\n <TableRow\r\n hover\r\n onClick={(ev) => this.onSelectAttendee(ev, attendee)}\r\n role=\"checkbox\"\r\n aria-checked={isAttendeeSelected}\r\n tabIndex={-1}\r\n key={attendee.id}\r\n selected={isAttendeeSelected}\r\n >\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n color=\"primary\"\r\n checked={isAttendeeSelected}\r\n inputProps={{ \"aria-labelledby\": labelId }}\r\n />\r\n </TableCell>\r\n <TableCell component=\"th\" id={labelId} scope=\"row\" padding=\"none\">\r\n {attendee.name}\r\n </TableCell>\r\n <TableCell align=\"center\">{attendee.email}</TableCell>\r\n <TableCell align=\"center\">{this.formatAttendanceType(attendee.attendanceType)}</TableCell>\r\n <TableCell align=\"center\">{this.formatTime(attendee.rsvpTime)}</TableCell>\r\n </TableRow>\r\n );\r\n })\r\n }\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n {page.currentPage > 0 && page.totalPages > 1 &&\r\n <TablePagination\r\n rowsPerPageOptions={[10]}\r\n component=\"div\"\r\n backIconButtonProps={{ color: \"primary\" }}\r\n nextIconButtonProps={{ color: \"primary\" }}\r\n count={page.totalAttendees}\r\n rowsPerPage={10}\r\n page={page.currentPage - 1}\r\n onPageChange={this.onChangePage}\r\n />\r\n }\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private getToolbar = (): JSX.Element => {\r\n const { selectedItems } = this.state;\r\n\r\n if (!selectedItems.length)\r\n return <React.Fragment></React.Fragment>;\r\n \r\n return (\r\n <TabContentToolbar>\r\n <div>\r\n {this.getToolbarIcon(`${selectedItems.length} selected`, <ClearIcon />, this.onClearAllAttendees)}\r\n </div>\r\n <div>\r\n {selectedItems.length === 1 &&\r\n this.getToolbarIcon(\"Edit Response\", <EditIcon />, this.onShowEditResponse)\r\n }\r\n {selectedItems.length > 1 &&\r\n this.getToolbarIcon(\"Change RSVP Status\", <UndoIcon />, this.onShowChangeRSVPStatusDialog)\r\n }\r\n </div>\r\n </TabContentToolbar>\r\n );\r\n }\r\n\r\n private getToolbarIcon = (title: string, icon: React.ReactNode, onClick: () => void) => {\r\n return (\r\n <Button aria-label={title.toLowerCase()} color=\"primary\" startIcon={icon} onClick={onClick}>\r\n {title}\r\n </Button>\r\n );\r\n }\r\n\r\n\r\n private isAttendeeSelected = (attendee: Attendee): boolean => {\r\n return this.state.selectedItems.findIndex((selectedItem) => selectedItem.id === attendee.id) !== -1;\r\n }\r\n\r\n\r\n private onApplyFilters = () => {\r\n this.setState({ hasFiltersApplied: true, isPagedLoad: true });\r\n this.props.fetchPage(1, this.state.filters);\r\n }\r\n\r\n private onChangeFilters = (filters: Partial<AttendanceFilterValues>) => {\r\n this.setState({ filters: { ...this.state.filters, ...filters }});\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.setState({ filters: { ...this.getDefaultFilterValues() }, hasFiltersApplied: false, isPagedLoad: true });\r\n this.props.fetchPage(1, {});\r\n }\r\n\r\n\r\n private onClearAllAttendees = () => {\r\n this.setState({ selectedItems: [] });\r\n }\r\n\r\n\r\n private onChangeRSVPStatus = (attendanceType: AttendanceType) => {\r\n this.onHideChangeRSVPDialog();\r\n this.props.changeRSVPStatus(this.props.eventId, this.state.selectedItems.map(selectedItem => selectedItem.id), attendanceType).then((response) => {\r\n if (response) {\r\n this.onClearAllAttendees();\r\n }\r\n });\r\n }\r\n\r\n private onEditResponse = (attendanceType: AttendanceType, answers: Answers) => {\r\n this.onHideEditResponseDialog();\r\n this.props.editResponse(this.props.eventId, this.state.selectedItems[0].id, attendanceType, answers).then((response) => {\r\n if (response) {\r\n this.onClearAllAttendees();\r\n }\r\n });\r\n }\r\n\r\n\r\n private onHideChangeRSVPDialog = () => {\r\n this.setState({ showChangeRSVPStatusDialog: false });\r\n }\r\n\r\n private onHideEditResponseDialog = () => {\r\n this.setState({ showEditResponseDialog: false });\r\n }\r\n\r\n\r\n private onSelectAllAttendees = () => {\r\n if (this.state.selectedItems.length === this.props.page.attendees.length)\r\n this.setState({ selectedItems: [] });\r\n else\r\n this.setState({ selectedItems: this.props.page.attendees });\r\n }\r\n\r\n private onSelectAttendee = (ev, attendee: Attendee) => {\r\n let selectedItems = this.state.selectedItems.slice();\r\n\r\n if (selectedItems.findIndex((selectedItem) => selectedItem.id === attendee.id) === -1)\r\n selectedItems = selectedItems.concat([attendee]);\r\n else\r\n selectedItems = selectedItems.filter(selectedItem => selectedItem.id !== attendee.id);\r\n\r\n this.setState({ selectedItems });\r\n }\r\n\r\n\r\n private onShowChangeRSVPStatusDialog = () => {\r\n this.setState({ showChangeRSVPStatusDialog: true });\r\n }\r\n\r\n private onShowEditResponse = () => {\r\n this.setState({ showEditResponseDialog: true });\r\n }\r\n\r\n\r\n private onChangePage = (ev, page: number) => {\r\n this.setState({ isPagedLoad: true });\r\n this.props.fetchPage(page + 1, this.state.filters);\r\n }\r\n}\r\n \r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n eventId: string;\r\n page: AttendanceListingPage;\r\n fetchPage: (pageNumber: number, filters: Partial<AttendanceFilterValues>) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n filters: Partial<AttendanceFilterValues>;\r\n hasFiltersApplied: boolean;\r\n isPagedLoad: boolean;\r\n selectedItems: Attendee[];\r\n showChangeRSVPStatusDialog: boolean;\r\n showEditResponseDialog: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n isSaving: state.events.isSaving,\r\n tenant: state.tenant.id\r\n }),\r\n {\r\n changeRSVPStatus: actions.changeRSVPStatus,\r\n editResponse: actions.editResponse,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(AttendanceList);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport { AttendanceFilterValues, AttendanceListingPage, Attendee } from \"../../models\";\r\n\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Breadcrumb from \"pages/common/breadcrumb\";\r\nimport MainContent from \"pages/common/mainContent\";\r\nimport Tabs from \"pages/common/tabs\";\r\n\r\nimport AttendanceList from \"./attendanceList\";\r\n\r\nimport IconButton from \"@mui/material/IconButton\";\r\n\r\nimport GetAppIcon from \"@mui/icons-material/GetApp\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\n\r\n\r\nconst allTab: number = 0;\r\nconst attendingTab: number = 1;\r\nconst notAttendingTab: number = 2;\r\nconst undecidedTab: number = 3;\r\nconst waitlistedTab: number = 4;\r\n\r\n\r\nclass AttendanceListing extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n all: { ...this.getDefaultPageValues(), id: \"all\" },\r\n attending: { ...this.getDefaultPageValues(), id: \"attending\" },\r\n notAttending: { ...this.getDefaultPageValues(), id: \"notAttending\" },\r\n undecided: { ...this.getDefaultPageValues(), id: \"undecided\" },\r\n waitlist: { ...this.getDefaultPageValues(), id: \"waitlist\" },\r\n\r\n selectedItems: [],\r\n selectedTab: 0,\r\n showFilters: false\r\n };\r\n }\r\n\r\n public componentWillMount() {\r\n const eventId = this.props.match.params.eventId;\r\n if (!!eventId) {\r\n this.fetchLists();\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if ((!!this.props.match.params.eventId && (this.props.match.params.eventId !== prevProps.match.params.eventId)) ||\r\n (this.props.shouldFetch && (this.props.shouldFetch !== prevProps.shouldFetch))) {\r\n this.fetchLists();\r\n }\r\n }\r\n\r\n public render() {\r\n const { selectedTab } = this.state;\r\n\r\n return (\r\n <BasePage fullWidth>\r\n <Breadcrumb\r\n items={[\r\n { title: \"Events\", link: \"~/admin/events\" },\r\n { title: this.getEventTitle() },\r\n { title: \"Manage participants\" }\r\n ]}\r\n backItem={{ title: \"Back to Manage Events\", link: \"~/admin/events\" }}\r\n />\r\n <MainContent>\r\n <div className=\"authoring-page\">\r\n <div>\r\n <Tabs\r\n tabs={[\r\n { label: this.getTabLabel(\"All\", this.state.all), id: \"all-attendance-tab\" },\r\n { label: this.getTabLabel(\"Attending\", this.state.attending), id: \"attending-attendance-tab\" },\r\n { label: this.getTabLabel(\"Not Attending\", this.state.notAttending), id: \"not-attending-attendance-tab\" },\r\n { label: this.getTabLabel(\"Undecided\", this.state.undecided), id: \"undecided-attendance-tab\" },\r\n { label: this.getTabLabel(\"Waitlist\", this.state.waitlist), id: \"waitlist-attendance-tab\" }\r\n ]}\r\n tabOptions={\r\n <IconButton onClick={this.downloadAttendanceListing} size=\"large\"><GetAppIcon /></IconButton>\r\n }\r\n selectedTab={selectedTab}\r\n onSelectTab={this.onSelectTab}\r\n />\r\n <AttendanceList show={selectedTab === allTab} eventId={this.props.match.params.eventId} page={this.state.all} fetchPage={this.fetchAll} />\r\n <AttendanceList show={selectedTab === attendingTab} eventId={this.props.match.params.eventId} page={this.state.attending} fetchPage={this.fetchAttending} />\r\n <AttendanceList show={selectedTab === notAttendingTab} eventId={this.props.match.params.eventId} page={this.state.notAttending} fetchPage={this.fetchNotAttending} />\r\n <AttendanceList show={selectedTab === undecidedTab} eventId={this.props.match.params.eventId} page={this.state.undecided} fetchPage={this.fetchUndecided} />\r\n <AttendanceList show={selectedTab === waitlistedTab} eventId={this.props.match.params.eventId} page={this.state.waitlist} fetchPage={this.fetchWaitlist} /> \r\n </div>\r\n <ErrorSnackbar errorMessage={this.props.errorMessage} clearErrorMessage={this.props.clearErrorMessage} />\r\n <LoadingOverlay absolute={true} show={this.props.isFetching} />\r\n </div>\r\n </MainContent>\r\n </BasePage>\r\n );\r\n }\r\n\r\n\r\n private downloadAttendanceListing = () => {\r\n const file = {\r\n name: `participants-${new Date().toISOString()}.csv`\r\n };\r\n this.props.getAttendanceCSV(this.props.match.params.eventId)\r\n .then((data) => {\r\n if (!!data) new FileDownloader(file).downloadBlob(data)\r\n });\r\n }\r\n\r\n\r\n private fetchLists = () => {\r\n this.fetchAll(1, {});\r\n this.fetchAttending(1, {});\r\n this.fetchNotAttending(1, {});\r\n this.fetchUndecided(1, {});\r\n this.fetchWaitlist(1, {});\r\n }\r\n\r\n\r\n private fetchAll = (pageNumber: number, filters: Partial<AttendanceFilterValues>) => {\r\n this.setState({ all: { ...this.getDefaultPageValues(), id: \"all\" } });\r\n this.props.getAttendance(this.props.match.params.eventId, [], pageNumber, filters).then((response) => {\r\n if (response)\r\n this.setState({ all: { ...response, isFetching: false } });\r\n else\r\n this.setState({ all: { ...this.state.all, hasError: true, isFetching: false } });\r\n });\r\n }\r\n\r\n private fetchAttending = (pageNumber: number, filters: Partial<AttendanceFilterValues>) => {\r\n this.setState({ attending: { ...this.getDefaultPageValues(), id: \"attending\" } });\r\n this.props.getAttendance(this.props.match.params.eventId, [\"InPerson\", \"Online\"], pageNumber, filters).then((response) => {\r\n if (response)\r\n this.setState({ attending: { ...response, isFetching: false } });\r\n else\r\n this.setState({ attending: { ...this.state.attending, hasError: true, isFetching: false } });\r\n });\r\n }\r\n\r\n private fetchNotAttending = (pageNumber: number, filters: Partial<AttendanceFilterValues>) => {\r\n this.setState({ notAttending: { ...this.getDefaultPageValues(), id: \"notAttending\" } });\r\n this.props.getAttendance(this.props.match.params.eventId, [\"NotAttending\"], pageNumber, filters).then((response) => {\r\n if (response)\r\n this.setState({ notAttending: { ...response, isFetching: false } });\r\n else\r\n this.setState({ notAttending: { ...this.state.notAttending, hasError: true, isFetching: false } });\r\n });\r\n }\r\n\r\n private fetchUndecided = (pageNumber: number, filters: Partial<AttendanceFilterValues>) => {\r\n this.setState({ undecided: { ...this.getDefaultPageValues(), id: \"undecided\" } });\r\n this.props.getAttendance(this.props.match.params.eventId, [\"Undecided\"], pageNumber, filters).then((response) => {\r\n if (response)\r\n this.setState({ undecided: { ...response, isFetching: false } });\r\n else\r\n this.setState({ undecided: { ...this.state.undecided, hasError: true, isFetching: false } });\r\n });\r\n }\r\n\r\n private fetchWaitlist = (pageNumber: number, filters: Partial<AttendanceFilterValues>) => {\r\n this.setState({ waitlist: { ...this.getDefaultPageValues(), id: \"waitlist\" } });\r\n this.props.getAttendance(this.props.match.params.eventId, [\"Waitlist\"], pageNumber, filters).then((response) => {\r\n if (response)\r\n this.setState({ waitlist: { ...response, isFetching: false } });\r\n else\r\n this.setState({ waitlist: { ...this.state.waitlist, hasError: true, isFetching: false } });\r\n });\r\n }\r\n\r\n\r\n private getDefaultPageValues = (): AttendanceListingPage => {\r\n return {\r\n id: \"\",\r\n attendees: [],\r\n currentPage: 0,\r\n eventEndTime: \"\",\r\n eventStartTime: \"\",\r\n eventType: \"standard\",\r\n questions: {},\r\n title: \"\",\r\n totalAttendees: 0,\r\n totalPages: 0,\r\n hasError: false,\r\n isFetching: true\r\n };\r\n }\r\n\r\n\r\n private getEventTitle = (): string => {\r\n return this.state.all.title || this.state.attending.title || this.state.notAttending.title || this.state.undecided.title || this.state.waitlist.title || \"\";\r\n }\r\n\r\n private getTabLabel = (label: string, page: AttendanceListingPage): string => {\r\n if (!!page.currentPage)\r\n return `${label} (${page.totalAttendees})`;\r\n return label;\r\n }\r\n\r\n\r\n private onSelectTab = (tabIndex: number) => {\r\n this.setState({ ...this.state, selectedTab: tabIndex });\r\n }\r\n}\r\n \r\ninterface RouteParams {\r\n tenant: string;\r\n eventId: string;\r\n}\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\ninterface ComponentState {\r\n all: AttendanceListingPage;\r\n attending: AttendanceListingPage;\r\n notAttending: AttendanceListingPage;\r\n undecided: AttendanceListingPage;\r\n waitlist: AttendanceListingPage;\r\n\r\n selectedItems: Attendee[];\r\n selectedTab: number;\r\n showFilters: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps<RouteParams>) => ({\r\n ...ownProps,\r\n errorMessage: state.events.errorMessage,\r\n isFetching: state.events.isFetching,\r\n shouldFetch: state.events.shouldFetch,\r\n tenant: state.tenant.id\r\n }),\r\n {\r\n clearErrorMessage: actions.clearErrorMessage,\r\n getAttendance: actions.getAttendance,\r\n getAttendanceCSV: actions.getAttendanceCSV,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(AttendanceListing);","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\n\r\n\r\nconst NewDocument: React.FunctionComponent<PropsWithRedux> = props => {\r\n return (\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n startIcon={<AddIcon />}\r\n onClick={() => props.redirectTo(\"/\" + props.tenant + \"/admin/documents/upload\")\r\n }>\r\n New Document\r\n </Button>\r\n );\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenant: state.tenant.id\r\n }),\r\n {\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(NewDocument);","import * as React from \"react\";\r\n\r\nimport { Audience } from \"modules/audiences/models\";\r\n\r\nimport Chip from \"@mui/material/Chip\";\r\n\r\n\r\nimport \"./chips.sass\";\r\n\r\n\r\nconst AudienceChipLabels: React.FunctionComponent<ComponentProps> = props => {\r\n if (!props.audienceIds || !props.audienceIds.length)\r\n return (\r\n <div className=\"audience-chip-labels\">\r\n <Chip\r\n label={props.emptyText ? props.emptyText : \"All users\"}\r\n disabled={true}\r\n className=\"all-users-audience\"\r\n />\r\n </div>\r\n );\r\n\r\n const matchedAudiences: Audience[] = props.audienceIds.map((audienceId) => {\r\n const matchedAudience = props.audiences.find((audience) => audience.id === audienceId);\r\n if (!matchedAudience)\r\n return {\r\n id: \"\",\r\n displayName: \"\",\r\n description: \"\",\r\n enabled: false,\r\n type: \"\"\r\n };\r\n return matchedAudience;\r\n }).filter((audience) => !!audience.id);\r\n\r\n return (\r\n <div title={matchedAudiences.map((audience) => audience.displayName).join(\", \")} className=\"audience-chip-labels\">\r\n {matchedAudiences.slice(0,2).map((audience) => (\r\n <Chip\r\n key={audience.id}\r\n label={audience.displayName}\r\n disabled={!audience.enabled}\r\n />\r\n ))}\r\n {matchedAudiences.length > 2 &&\r\n (matchedAudiences.length === 3\r\n ? <Chip\r\n key={matchedAudiences[2].id}\r\n label={matchedAudiences[2].displayName}\r\n disabled={!matchedAudiences[2].enabled}\r\n />\r\n : <Chip\r\n key=\"more\"\r\n label={`+${matchedAudiences.length - 2}`}\r\n />\r\n )\r\n }\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n audienceIds: string[] | undefined;\r\n audiences: Audience[];\r\n emptyText?: string;\r\n}\r\n\r\nexport default AudienceChipLabels;","import * as React from \"react\";\r\n\r\nimport Chip from \"@mui/material/Chip\";\r\n\r\n\r\nimport \"./chips.sass\";\r\n\r\n\r\ninterface CategoryTag {\r\n id: string;\r\n enabled?: boolean;\r\n name: string;\r\n}\r\n\r\nconst CategoryTagChipLabels: React.FunctionComponent<ComponentProps> = props => {\r\n const { tags } = props;\r\n\r\n if (!tags || !tags.length)\r\n return (\r\n <div className=\"category-tag-chip-labels\">\r\n <Chip\r\n label=\"Uncategorized\"\r\n disabled={true}\r\n className=\"uncategorized-tag\"\r\n />\r\n </div>\r\n );\r\n\r\n return (\r\n <div title={tags.map((tag) => tag.name).join(\", \")} className=\"category-tag-chip-labels\">\r\n {tags.slice(0,2).map((tag) => (\r\n <Chip\r\n key={tag.id}\r\n label={tag.name}\r\n disabled={!tag.enabled}\r\n />\r\n ))}\r\n {tags.length > 2 &&\r\n (tags.length === 3\r\n ? <Chip\r\n key={tags[2].id}\r\n label={tags[2].name}\r\n disabled={!tags[2].enabled}\r\n />\r\n : <Chip\r\n key=\"more\"\r\n label={`+${tags.length - 2}`}\r\n />\r\n )\r\n }\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n tags: CategoryTag[];\r\n}\r\n\r\nexport default CategoryTagChipLabels;","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { Document } from \"../../models\";\r\n\r\nimport MoreOptionsIconButton from \"modules/common/components/buttons/moreOptionsIconButton\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport Divider from \"@mui/material/Divider\";\r\nimport List from \"@mui/material/List\";\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\n\r\n\r\nconst MoreDocumentOptions: React.FunctionComponent<PropsWithRedux> = props => {\r\n const { document } = props;\r\n\r\n return (\r\n <MoreOptionsIconButton>\r\n <List disablePadding>\r\n <MoreOptionsItem\r\n text=\"Download file\"\r\n onClick={() => {\r\n props.onDownloadDocument();\r\n }}\r\n />\r\n <MoreOptionsItem\r\n text=\"Edit/replace document\"\r\n onClick={() => {\r\n props.showEditor(document);\r\n }}\r\n />\r\n {(document.fileType === \"jpeg\" || document.fileType === \"jpg\" || document.fileType === \"pdf\" || document.fileType === \"png\" || document.fileType === \"txt\") &&\r\n <React.Fragment>\r\n <Divider light />\r\n <MoreOptionsItem\r\n text=\"Preview\"\r\n onClick={() => {\r\n props.onPreviewDocument();\r\n props.onSelection();\r\n }}\r\n />\r\n </React.Fragment>\r\n }\r\n <Divider light />\r\n {document.state === \"enabled\" &&\r\n <MoreOptionsItem\r\n text=\"Disable\"\r\n onClick={() => {\r\n props.disableDocument(document.id);\r\n props.onSelection();\r\n }}\r\n />\r\n }\r\n {document.state !== \"enabled\" &&\r\n <MoreOptionsItem\r\n text=\"Enable\"\r\n onClick={() => {\r\n props.enableDocument(document.id);\r\n props.onSelection();\r\n }}\r\n />\r\n }\r\n <MoreOptionsItem\r\n text=\"Delete\"\r\n textStyle={{color: \"#B72026\"}}\r\n onClick={async () => {\r\n let functionalTitle = document.title === \"\" ? `${document.fileName}.${document.fileType}` : document.title;\r\n if (await confirm.show({ text: `You're about to permanently delete '${functionalTitle}'. You cannot undo this action. Are you sure?`,\r\n title: \"Delete Document\",\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\" })) {\r\n props.deleteDocument(document.id);\r\n props.onSelection();\r\n }\r\n }}\r\n />\r\n </List>\r\n </MoreOptionsIconButton>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n document: Document;\r\n onDownloadDocument: () => void;\r\n onPreviewDocument: () => void;\r\n onSelection: () => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n deleteDocument: actions.deleteDocument,\r\n disableDocument: actions.disableDocument,\r\n enableDocument: actions.enableDocument,\r\n redirectTo: push,\r\n showEditor: actions.showEditor\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(MoreDocumentOptions);","import { DocumentFileType } from \"../models\";\r\n\r\nexport const getMimeType = (fileType: DocumentFileType): string | \"\" => {\r\n if (fileType === \"docx\")\r\n return \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\r\n if (fileType === \"jpeg\" || fileType === \"jpg\")\r\n return \"image/jpeg\";\r\n if (fileType === \"pdf\")\r\n return \"application/pdf\";\r\n if (fileType === \"png\")\r\n return \"image/png\";\r\n if (fileType === \"pptx\")\r\n return \"application/vnd.openxmlformats-officedocument.presentationml.presentation\";\r\n if (fileType === \"txt\")\r\n return \"text/plain\";\r\n if (fileType === \"xlsx\")\r\n return \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\";\r\n return \"\";\r\n}\r\n\r\nexport const getStringFromMimeType = (fileType: string) => {\r\n if (fileType === \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\")\r\n return \"docx\";\r\n if (fileType === \"image/jpeg\")\r\n return \"jpeg\";\r\n if (fileType === \"application/pdf\")\r\n return \"pdf\";\r\n if (fileType === \"image/png\")\r\n return \"png\";\r\n if (fileType === \"application/vnd.openxmlformats-officedocument.presentationml.presentation\")\r\n return \"pptx\";\r\n if (fileType === \"text/plain\")\r\n return \"txt\";\r\n if (fileType === \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\")\r\n return \"xlsx\";\r\n return \"\";\r\n}","import React, { useState } from \"react\";\r\n\r\nimport Popover from \"@mui/material/Popover\";\r\n\r\n\r\nconst SupportedFileTypes: React.FunctionComponent<ComponentProps> = props => {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n\r\n return (\r\n <React.Fragment>\r\n <div\r\n onMouseEnter={(event: any) => setAnchorEl(event.currentTarget)}\r\n onMouseLeave={() => setAnchorEl(null)}\r\n className=\"supported-file-types\"\r\n >\r\n What are the supported file types?\r\n </div>\r\n <Popover\r\n open={!!anchorEl}\r\n anchorEl={anchorEl}\r\n anchorOrigin={{\r\n vertical: \"bottom\",\r\n horizontal: \"left\"\r\n }}\r\n transformOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"left\"\r\n }}\r\n PaperProps={{\r\n style: {\r\n maxWidth: 200\r\n }\r\n }}\r\n style={{ pointerEvents: \"none\" }}\r\n onClose={() => setAnchorEl(null)}\r\n classes={{\r\n paper: \"supported-file-types-description\"\r\n }}\r\n >\r\n Sparrow Documents support DOCX, XLSX, PPTX, JPEG, PNG, PDF and TXT files only.\r\n </Popover>\r\n </React.Fragment>\r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {}\r\n\r\nexport default SupportedFileTypes;","import * as React from \"react\";\r\nimport moment from \"moment\";\r\n\r\nimport { Document } from \"../../../models\";\r\n\r\nimport Uploader from \"modules/common/components/authoring/uploader/uploader\";\r\nimport SupportedFileTypes from \"./supportedFileTypes\";\r\n\r\n\r\nimport \"../../../styles/documentCreation.sass\";\r\n\r\n\r\nclass DocumentUploader extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n isUploading: false\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public render() {\r\n return (\r\n <div className=\"document-creation\">\r\n <div className=\"document-uploader\">\r\n <Uploader\r\n message={this.props.message}\r\n maxUploadable={1}\r\n uploading={this.state.isUploading}\r\n setUploading={this.onSetUploading}\r\n upload={this.props.onUpload}\r\n attachmentType=\"files\"\r\n acceptedFiles={this.props.acceptedFiles}\r\n />\r\n </div>\r\n {this.props.showSupportedFileTypes &&\r\n <SupportedFileTypes />\r\n }\r\n </div>\r\n );\r\n }\r\n\r\n private onSetUploading = (isUploading: boolean) => {\r\n this.setState({ isUploading });\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n acceptedFiles: string;\r\n message: string;\r\n showSupportedFileTypes?: boolean;\r\n onUpload: (file: File, onProgress, onLoad, onError, onAbort) => Promise<Document>;\r\n}\r\n\r\ninterface ComponentState {\r\n isUploading: boolean;\r\n}\r\n\r\nexport default DocumentUploader;","import * as React from \"react\";\r\n\r\nimport { Audience } from \"modules/audiences/models\";\r\n\r\nimport Chip from \"@mui/material/Chip\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\n\r\nimport \"./chips.sass\";\r\n\r\n\r\nconst AudienceChips: React.FunctionComponent<ComponentProps> = props => {\r\n if (!props.audienceIds || !props.audienceIds.length) {\r\n if (props.hideAll)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n return (\r\n <div className=\"audience-chips\">\r\n <Chip\r\n label=\"All users\"\r\n disabled={true}\r\n className=\"all-users-audience\"\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n const matchedAudiences: Audience[] = props.audienceIds.map((audienceId) => {\r\n const matchedAudience = props.audiences.find((audience) => audience.id === audienceId);\r\n if (!matchedAudience)\r\n return {\r\n id: \"\",\r\n displayName: \"\",\r\n description: \"\",\r\n enabled: false,\r\n type: \"\"\r\n };\r\n return matchedAudience;\r\n }).filter((audience) => !!audience.id);\r\n\r\n return (\r\n <div className=\"audience-chips\">\r\n {matchedAudiences.map((audience) => (\r\n <Chip\r\n key={audience.id}\r\n label={`${audience.displayName}${audience.enabled ? \"\" : \" (disabled)\"}`}\r\n onDelete={() => props.onDelete(audience.id)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n audienceIds: string[] | undefined;\r\n audiences: Audience[];\r\n hideAll?: boolean;\r\n onDelete: (audienceId: string) => void;\r\n}\r\n\r\nexport default AudienceChips;","import React, { useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport AudienceChips from \"modules/common/components/chips/audienceChips\";\r\nimport Callout from \"modules/common/components/callout\";\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\n\r\n\r\nconst AccessibleAudiences: React.FunctionComponent<PropsWithRedux> = props => {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const [accessibleAudiences, setAccessibleAudiences] = useState(props.accessibleAudiences);\r\n const [calloutOpen, setCalloutOpen] = useState(false);\r\n\r\n return (\r\n <div>\r\n <div>\r\n <span>Accessible to</span>\r\n <InfoHover>Audiences who can access and view the file from the company portal and/or app.</InfoHover>\r\n </div>\r\n <div>\r\n <AudienceChips\r\n audienceIds={props.accessibleAudiences}\r\n audiences={props.audiences}\r\n onDelete={(audienceId) => props.onChange(props.accessibleAudiences.filter((selectedAudience) => selectedAudience !== audienceId))}\r\n />\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n startIcon={<AddIcon />}\r\n onClick={(event: any) => {\r\n setAccessibleAudiences(props.accessibleAudiences);\r\n setAnchorEl(event.currentTarget);\r\n setCalloutOpen(true);\r\n }}\r\n >\r\n Edit audiences\r\n </Button>\r\n <Callout\r\n anchorEl={anchorEl}\r\n open={calloutOpen}\r\n setOpen={(toSet) => {\r\n props.onChange(accessibleAudiences);\r\n setCalloutOpen(toSet);\r\n }}\r\n footer={\r\n <div>\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n onClick={() => {\r\n props.onChange([]);\r\n setAnchorEl(null);\r\n }}\r\n >\r\n Clear all\r\n </Button>\r\n </div>\r\n }\r\n >\r\n <List disablePadding className=\"audiences\">\r\n {props.audiences.map((audience) =>\r\n <ListItem key={audience.id} dense button onClick={() => {\r\n const hasSelectedAudience: boolean = accessibleAudiences.findIndex((selectedAudience) => selectedAudience === audience.id) !== -1;\r\n if (hasSelectedAudience)\r\n setAccessibleAudiences(accessibleAudiences.filter((selectedAudience) => selectedAudience !== audience.id));\r\n else\r\n setAccessibleAudiences(accessibleAudiences.concat([audience.id]));\r\n }}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={accessibleAudiences.findIndex((selectedAudience) => selectedAudience === audience.id) !== -1}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={`${audience.displayName || \"\"}${audience.enabled ? \"\" : \" (disabled)\"}`} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </Callout>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n accessibleAudiences: string[];\r\n onChange: (accessibleAudiences: string[]) => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(AccessibleAudiences);","import * as React from \"react\";\r\n\r\nimport { DocumentAvailability } from \"../../../models\";\r\n\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Select from \"@mui/material/Select\";\r\n\r\n\r\nconst Availability: React.FunctionComponent<ComponentProps> = props => {\r\n return (\r\n <div>\r\n <div>Availability</div>\r\n <FormControl size=\"small\" fullWidth>\r\n <Select\r\n variant=\"outlined\"\r\n fullWidth\r\n value={props.availability}\r\n onChange={(event) => props.onChange(event.target.value as DocumentAvailability)}\r\n >\r\n <MenuItem value=\"onlineOnly\">Online only</MenuItem>\r\n <MenuItem value=\"attachmentOnly\">Attachment only</MenuItem>\r\n </Select>\r\n </FormControl>\r\n </div>\r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n availability: DocumentAvailability;\r\n onChange: (availability: DocumentAvailability) => void;\r\n}\r\n\r\nexport default Availability;","import * as React from \"react\";\r\n\r\nimport Chip from \"@mui/material/Chip\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\n\r\nimport \"./chips.sass\";\r\n\r\n\r\ninterface CategoryTag {\r\n id: string;\r\n enabled?: boolean;\r\n name: string;\r\n}\r\n\r\nconst CategoryTagChips: React.FunctionComponent<ComponentProps> = props => {\r\n if (!props.tagIds || !props.tagIds.length) {\r\n if (props.hideAll)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n return (\r\n <div className=\"category-tag-chips\">\r\n <Chip\r\n label=\"Uncategorized\"\r\n disabled={true}\r\n className=\"uncategorized-tag\"\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n const matchedTags: CategoryTag[] = props.tagIds.map((tagId) => {\r\n const matchedTag = props.tags.find((tag) => tag.id === tagId);\r\n if (!matchedTag)\r\n return {\r\n id: tagId,\r\n name: \"(disabled or deleted)\",\r\n enabled: false\r\n };\r\n return matchedTag;\r\n }).filter((tag) => !!tag.id);\r\n\r\n return (\r\n <div className=\"category-tag-chips\">\r\n {matchedTags.map((tag) => (\r\n <Chip\r\n key={tag.id}\r\n label={tag.name}\r\n onDelete={() => props.onDelete(tag.id)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n tagIds: string[] | undefined;\r\n tags: CategoryTag[];\r\n hideAll?: boolean;\r\n onDelete: (audienceId: string) => void;\r\n}\r\n\r\nexport default CategoryTagChips;","import React, { useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport CategoryTagChips from \"modules/common/components/chips/categoryTagChips\";\r\nimport Callout from \"modules/common/components/callout\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\n\r\n\r\nconst CategoryTags: React.FunctionComponent<PropsWithRedux> = props => {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const [tags, setTags] = useState(props.tags);\r\n const [calloutOpen, setCalloutOpen] = useState(false);\r\n let effectiveCategoryTags = props.categoryTags.filter(t => t.name.toLowerCase() !== \"uncategorized\");\r\n\r\n return (\r\n <div>\r\n <div>Category tags</div>\r\n <div>\r\n <CategoryTagChips\r\n tagIds={props.tags}\r\n tags={props.categoryTags}\r\n onDelete={(tagId) => props.onChange(props.tags.filter((selectedTag) => selectedTag !== tagId))}\r\n />\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n startIcon={<AddIcon />}\r\n onClick={(event: any) => {\r\n setTags(props.tags);\r\n setAnchorEl(event.currentTarget);\r\n setCalloutOpen(true);\r\n }}\r\n >\r\n Edit category tags\r\n </Button>\r\n <Callout\r\n anchorEl={anchorEl}\r\n open={calloutOpen}\r\n setOpen={(toSet) => {\r\n props.onChange(tags);\r\n setCalloutOpen(toSet);\r\n }}\r\n footer={\r\n <div>\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n onClick={() => {\r\n props.onChange([]);\r\n setAnchorEl(null);\r\n }}\r\n >\r\n Clear all\r\n </Button>\r\n </div>\r\n }\r\n >\r\n <List disablePadding className=\"tags\">\r\n {effectiveCategoryTags.map((tag) =>\r\n <ListItem key={tag.id} dense button onClick={() => {\r\n const hasSelectedTag: boolean = tags.findIndex((selectedTag) => selectedTag === tag.id) !== -1;\r\n if (hasSelectedTag)\r\n setTags(tags.filter((selectedTag) => selectedTag !== tag.id));\r\n else\r\n setTags(tags.concat([tag.id]));\r\n }}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={tags.findIndex((selectedTag) => selectedTag === tag.id) !== -1}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={tag.name} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </Callout>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n tags: string[];\r\n onChange: (tags: string[]) => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n categoryTags: state.categoryTags.userCategoryTags\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(CategoryTags);","import * as React from \"react\";\r\n\r\nimport { DocumentFileType } from \"../../../models\";\r\n\r\n\r\nconst FileName: React.FunctionComponent<ComponentProps> = props => {\r\n return (\r\n <div>\r\n <div>\r\n {props.revisions < 2\r\n ? \"File name\"\r\n : \"Original file name\"\r\n }\r\n </div>\r\n <div className=\"file-name\">{props.fileName}.{props.fileType}</div>\r\n </div>\r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n fileName: string;\r\n fileType: DocumentFileType;\r\n revisions: number;\r\n}\r\n\r\nexport default FileName;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\n\r\nimport { DocumentAvailability } from \"../../../models\";\r\n\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Select from \"@mui/material/Select\";\r\n\r\n\r\ninterface MenuItem {\r\n value: string;\r\n text: string;\r\n}\r\n\r\nconst Language: React.FunctionComponent<PropsWithRedux> = props => {\r\n const getAvailableLanguages = () => {\r\n if (!props.tenantSettings || !props.lcidMappings)\r\n return [];\r\n\r\n let availableLanguages: MenuItem[] = [];\r\n Object.keys(props.tenantSettings.translatedContent).map((lcid) => {\r\n if (!!props.lcidMappings[lcid])\r\n availableLanguages.push({ value: lcid, text: props.lcidMappings[lcid].language });\r\n return lcid;\r\n });\r\n return availableLanguages;\r\n }\r\n \r\n const availableLanguages = getAvailableLanguages();\r\n\r\n if (availableLanguages.length <= 1)\r\n return <React.Fragment></React.Fragment>;\r\n \r\n return (\r\n <div>\r\n <div>\r\n <span>Language</span>\r\n <InfoHover>Helps you look for and filter documents by language.</InfoHover>\r\n </div>\r\n <FormControl size=\"small\" fullWidth>\r\n <Select\r\n variant=\"outlined\"\r\n displayEmpty\r\n fullWidth\r\n value={props.lcid}\r\n onChange={(event) => props.onChange(event.target.value as DocumentAvailability)}\r\n >\r\n <MenuItem value=\"\"><div style={{ color: \"rgba(0, 0, 0, 0.4)\" }}>Select a language</div></MenuItem>\r\n {availableLanguages.map(availableLanguage => (\r\n <MenuItem key={availableLanguage.value} value={availableLanguage.value}>{availableLanguage.text}</MenuItem>\r\n ))}\r\n </Select>\r\n </FormControl>\r\n </div>\r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n lcid: string;\r\n onChange: (lcid: string) => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantSettings: state.settings.tenantSettings,\r\n lcidMappings: state.resources.lcidMappings\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(Language);","import * as React from \"react\";\r\n\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\n\r\nconst Description: React.FunctionComponent<ComponentProps> = props => {\r\n return (\r\n <div>\r\n <div>Description</div>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n placeholder=\"Enter description (optional)\"\r\n value={props.description}\r\n fullWidth\r\n inputProps={{\r\n maxLength: 100\r\n }}\r\n onChange={(event) => props.onChange(event.target.value)}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n description: string;\r\n onChange: (description: string) => void;\r\n}\r\n\r\nexport default Description;","import * as React from \"react\";\r\n\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\n\r\n\r\nconst Revision: React.FunctionComponent<ComponentProps> = props => {\r\n if (!props.revisions)\r\n return <React.Fragment></React.Fragment>;\r\n \r\n return (\r\n <div>\r\n <div>\r\n <span>Version no.</span>\r\n <InfoHover>No. of times the file has been replaced. Version 1 is the initial file uploaded.</InfoHover>\r\n </div>\r\n <div className=\"revisions\">{props.revisions}</div>\r\n </div>\r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n revisions: number;\r\n}\r\n\r\nexport default Revision;","import React from \"react\";\r\n\r\nimport { DocumentState } from \"../../../models\";\r\n\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Select from \"@mui/material/Select\";\r\nimport { DatePicker } from \"@mui/x-date-pickers\";\r\n\r\nimport moment from \"moment\";\r\n\r\n\r\nclass State extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n moment.locale(\"en\");\r\n\r\n this.state = {\r\n state: props.enabled\r\n ? moment(props.publishingTime) > moment()\r\n ? \"scheduled\"\r\n : \"enabled\"\r\n : \"disabled\"\r\n };\r\n }\r\n\r\n public render() {\r\n const showScheduledOption: boolean = this.props.isUnpublished || (this.props.enabled && moment(this.props.publishingTime) >= moment());\r\n\r\n return (\r\n <div>\r\n <div>State</div>\r\n <FormControl size=\"small\" fullWidth className={showScheduledOption ? \"document-state\" : \"\"}>\r\n <Select\r\n variant=\"outlined\"\r\n fullWidth\r\n value={this.state.state}\r\n onChange={this.onChangeState}\r\n >\r\n <MenuItem value=\"enabled\">Enabled</MenuItem>\r\n <MenuItem value=\"disabled\">Disabled</MenuItem>\r\n {showScheduledOption &&\r\n <MenuItem value=\"scheduled\">Scheduled to enable on:</MenuItem>\r\n }\r\n </Select>\r\n {showScheduledOption &&\r\n <DatePicker\r\n format=\"MMM dd yyyy\"\r\n disablePast\r\n value={this.props.publishingTime ? Date.parse(this.props.publishingTime) : null}\r\n slotProps={{ \r\n textField: { size: \"small\", placeholder: \"Choose date\", inputProps: { readOnly: true }},\r\n openPickerIcon: { color: \"primary\" }\r\n }}\r\n disabled={this.state.state !== \"scheduled\"}\r\n onChange={this.onChangePublishingTime}\r\n className=\"date-picker\"\r\n />\r\n }\r\n </FormControl>\r\n </div>\r\n );\r\n }\r\n\r\n private onChangePublishingTime = (date) => {\r\n this.props.onChangePublishingTime(moment(date).toISOString());\r\n }\r\n\r\n private onChangeState = (event) => {\r\n const state: DocumentState = event.target.value;\r\n const publishingTime: string = state === \"scheduled\"\r\n ? moment().toISOString()\r\n : \"\";\r\n this.setState({ state });\r\n this.props.onChangeState(state !== \"disabled\", publishingTime);\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n enabled: boolean;\r\n publishingTime: string;\r\n isUnpublished?: boolean;\r\n onChangePublishingTime: (publishingTime: string) => void;\r\n onChangeState: (enabled: boolean, publishingTime: string) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n state: DocumentState;\r\n}\r\n\r\nexport default State;","import * as React from \"react\";\r\n\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\n\r\nconst Title: React.FunctionComponent<ComponentProps> = props => {\r\n return (\r\n <div>\r\n <div>Document title</div>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n placeholder=\"Enter title (optional)\"\r\n value={props.title}\r\n fullWidth\r\n inputProps={{\r\n maxLength: 50\r\n }}\r\n onChange={(event) => props.onChange(event.target.value)}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n title: string;\r\n onChange: (title: string) => void;\r\n}\r\n\r\nexport default Title;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as audiencesActions from \"modules/audiences/actionCreator\";\r\nimport * as categoryTagsActions from \"modules/categorytags/actionCreator\";\r\nimport * as documentAction from \"modules/documents/actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport moment from \"moment\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport { Document, DocumentAvailability, DocumentProperties as IDocumentProperties } from \"../../models\";\r\n\r\nimport AccessibleAudiences from \"./components/accessibleAudiences\";\r\nimport Availability from \"./components/availability\";\r\nimport CategoryTags from \"./components/categoryTags\";\r\nimport FileName from \"./components/fileName\";\r\nimport Language from \"./components/language\";\r\nimport Description from \"./components/description\";\r\n// import NotifiedAudiences from \"./components/notifiedAudiences\";\r\nimport Revision from \"./components/revision\";\r\nimport State from \"./components/state\";\r\nimport Title from \"./components/title\";\r\n\r\nimport \"../../styles/documentCreation.sass\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport { PickerLocalization } from \"modules/common/components/pickerLocalization\";\r\n\r\n\r\nclass DocumentProperties extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n this.state = {\r\n isFetching: false,\r\n categoryTagsTotal: []\r\n };\r\n}\r\n\r\n componentDidMount() {\r\n moment.locale(\"en\");\r\n\r\n if (!this.props.audiences.length)\r\n this.props.getAudiences();\r\n\r\n if (!this.props.categoryTags.length)\r\n this.props.getCategoryTags();\r\n }\r\n\r\n public render() {\r\n const { document, documentProperties } = this.props;\r\n\r\n if (!document.id)\r\n return (\r\n <div className=\"document-creation\">\r\n <div className=\"no-details\">No details to display</div>\r\n </div>\r\n );\r\n\r\n return (\r\n <PickerLocalization>\r\n \r\n <div className=\"document-creation\">\r\n <div className=\"document-properties\">\r\n <FileName fileName={document.fileName || \"\"} fileType={document.fileType || \"pdf\"} revisions={document.revisions || 0} />\r\n {!this.props.isUnpublished &&\r\n <Revision revisions={document.revisions || 0} />\r\n }\r\n <Title title={documentProperties.title || \"\"} onChange={this.onChangeTitle} />\r\n <Description description={documentProperties.description || \"\"} onChange={this.onChangeDescription} />\r\n <Language lcid={documentProperties.lcid || \"\"} onChange={this.onChangeLanguage} />\r\n <Availability availability={documentProperties.availability || \"onlineOnly\"} onChange={this.onChangeAvailability} />\r\n <State enabled={!!documentProperties.enabled} publishingTime={documentProperties.publishingTime || \"\"} isUnpublished={this.props.isUnpublished} onChangePublishingTime={this.onChangePublishingTime} onChangeState={this.onChangeState} />\r\n <CategoryTags tags={documentProperties.tags || []} onChange={this.onChangeCategoryTags} />\r\n <AccessibleAudiences accessibleAudiences={documentProperties.accessibleAudiences || []} onChange={this.onChangeAccessibleAudiences} />\r\n\r\n {/* <NotifiedAudiences accessibleAudiences={documentProperties.accessibleAudiences || []} notifiedAudiences={documentProperties.notifiedAudiences || []} onChange={this.onChangeNotifiedAudiences} /> */}\r\n </div>\r\n </div>\r\n { <LoadingOverlay show={this.state.isFetching}/> }\r\n </PickerLocalization>\r\n \r\n );\r\n }\r\n\r\n private onChange = (documentProperties: Partial<IDocumentProperties>) => {\r\n this.props.onChange(documentProperties);\r\n }\r\n\r\n private onChangeAccessibleAudiences = (accessibleAudiences: string[]) => {\r\n let notifiedAudiences = this.props.documentProperties.notifiedAudiences;\r\n if (!!notifiedAudiences && !!notifiedAudiences.length)\r\n notifiedAudiences = notifiedAudiences.filter((notifiedAudience) => accessibleAudiences.includes(notifiedAudience));\r\n\r\n this.onChange({ accessibleAudiences, notifiedAudiences });\r\n }\r\n\r\n private onChangeAvailability = async (availability: DocumentAvailability) => {\r\n if (availability === \"attachmentOnly\") {\r\n if (await confirm.show(({ text: \"You are about to make this document available as an attachment only. This will hide the document in all document feeds and will make it accessible only if it is attached in a post, event or survey.<br /><br />Do you want to continue?\", title: \"Set as Attachment Only\" })))\r\n this.onChange({ availability });\r\n } else {\r\n this.onChange({ availability });\r\n }\r\n }\r\n\r\n private onChangeCategoryTags = async (tags: string[]) => {\r\n\r\n if(tags.length > this.state.categoryTagsTotal.length) {\r\n this.setState({\r\n isFetching: true\r\n });\r\n\r\n await this.onChangeTagsHaveAudience(tags);\r\n\r\n }\r\n this.setState({\r\n isFetching: false,\r\n categoryTagsTotal: tags\r\n });\r\n this.onChange({ tags });\r\n }\r\n\r\n private onChangeTagsHaveAudience = async (tagsCategory: string[]) => {\r\n var audienceTags: string[] = [];\r\n var removeDuplicates: string[] = [];\r\n\r\n for(var i = 0; i < tagsCategory.length; i++) {\r\n var tag = await this.props.getCategoryTagsById(tagsCategory[i]);\r\n if(tag.defaultAudienceAccess.length >= 1) {\r\n audienceTags = audienceTags.concat(tag.defaultAudienceAccess);\r\n }\r\n }\r\n if(audienceTags.length > 1) {\r\n\r\n removeDuplicates = audienceTags.filter(function(elem, pos) {\r\n return audienceTags.indexOf(elem) === pos; });\r\n\r\n }\r\n\r\n this.onChangeAccessibleAudiences(removeDuplicates);\r\n }\r\n\r\n private onChangeDescription = (description: string) => {\r\n this.onChange({ description });\r\n }\r\n\r\n private onChangeLanguage = (lcid: string) => {\r\n this.onChange({ lcid });\r\n }\r\n\r\n private onChangeNotifiedAudiences = (notifiedAudiences: string[]) => {\r\n this.onChange({ notifiedAudiences });\r\n }\r\n\r\n private onChangePublishingTime = (publishingTime: string) => {\r\n this.onChange({ publishingTime });\r\n }\r\n\r\n private onChangeState = (enabled: boolean, publishingTime: string) => {\r\n this.onChange({ enabled, publishingTime });\r\n }\r\n\r\n private onChangeTitle = (title: string) => {\r\n this.onChange({ title });\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n document: Partial<Document>;\r\n documentProperties: Partial<IDocumentProperties>;\r\n isUnpublished?: boolean;\r\n onChange: (documentProperties: Partial<IDocumentProperties>) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n isFetching: boolean,\r\n categoryTagsTotal: string[]\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences,\r\n categoryTags: state.categoryTags.userCategoryTags\r\n }),\r\n {\r\n getAudiences: audiencesActions.getAudiences,\r\n getCategoryTags: categoryTagsActions.getUserCategoryTags,\r\n getCategoryTagsById: documentAction.getCategoryTagById\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(DocumentProperties);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Loading from \"modules/common/components/loading\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport { getMimeType, getStringFromMimeType } from \"../../utilities/getMimeType\";\r\nimport { Document, DocumentProperties } from \"../../models\";\r\nimport DocumentUploader from \"./components/documentUploader\";\r\nimport DocumentPropertiesEditor from \"./documentProperties\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport ArrowBackIcon from \"@mui/icons-material/ArrowBack\";\r\n\r\nimport \"modules/common/components/authoring/authoring.sass\";\r\nimport SnackbarWrapper from \"modules/common/components/snackbars/snackbarWrapper\";\r\n\r\nclass DocumentEditor extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n documentProperties: {},\r\n hasError: false,\r\n isFetching: false,\r\n showNotificationSettings: false,\r\n uploadFail: false,\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.editableDocument && this.props.editableDocument.id && this.props.showEditor && !prevProps.showEditor)\r\n this.onGetDocumentProperties(this.props.editableDocument);\r\n }\r\n\r\n public render() {\r\n if (!this.props.editableDocument || !this.props.editableDocument.id)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n return (\r\n <Dialog open={this.props.showEditor} maxWidth={false} scroll=\"paper\" onClose={this.onClose} classes={{ paper: \"document-editor\" }}>\r\n <DialogTitle className=\"document-editor-title\">\r\n <div>\r\n <IconButton\r\n style={{ margin: \"-12px 0 -10px -16px\" }}\r\n onClick={this.onClose}\r\n size=\"large\">\r\n <ArrowBackIcon />\r\n </IconButton>\r\n <span>Edit or replace document</span>\r\n </div>\r\n <Button variant=\"contained\" color=\"primary\" disabled={!this.props.changedSinceSaved} onClick={this.publishDocument}>Publish changes</Button>\r\n </DialogTitle>\r\n <DialogContent>\r\n <div className=\"authoring-page\">\r\n {this.state.isFetching\r\n ? <Loading />\r\n : this.state.hasError\r\n ? <div className=\"no-event-data\">This document could not be loaded.</div>\r\n : <React.Fragment>\r\n <DocumentPropertiesEditor\r\n document={this.props.editableDocument}\r\n documentProperties={this.state.documentProperties}\r\n onChange={this.onChangeDocumentProperties}\r\n />\r\n <Divider />\r\n <DocumentUploader\r\n acceptedFiles={getMimeType(this.props.editableDocument.fileType)}\r\n message={`Choose or drag a ${this.props.editableDocument.fileType.toUpperCase()} file here to replace this version`}\r\n onUpload={this.onUpload}\r\n />\r\n </React.Fragment>\r\n }\r\n </div>\r\n <SnackbarWrapper open={!!this.props.successMessage} message={this.props.successMessage} severity=\"success\" onClose={this.props.clearSuccessMessage} />\r\n <SnackbarWrapper open={!!this.props.errorMessage} severity=\"error\" onClose={this.props.clearErrorMessage} message={this.props.errorMessage} />\r\n <SnackbarWrapper open={this.state.uploadFail} severity=\"error\" onClose={this.onCloseUploadFail} message={\"Invalid file type, cannot replace file.\"} />\r\n </DialogContent>\r\n <LoadingOverlay show={this.props.isSaving || this.props.isUploading} styles={{ paddingTop: 150 }} />\r\n </Dialog>\r\n );\r\n }\r\n\r\n private onChangeDocumentProperties = (value: Partial<DocumentProperties>) => {\r\n const documentProperties = { ...this.state.documentProperties, ...value };\r\n this.setState({\r\n documentProperties: documentProperties\r\n });\r\n this.props.hasChangedSinceSaved();\r\n }\r\n\r\n private onClose = () => {\r\n this.props.hideEditor();\r\n }\r\n\r\n private onCloseUploadFail = () => {\r\n this.setState({uploadFail: false});\r\n }\r\n\r\n private onGetDocumentProperties = (document: Document) => {\r\n const documentProperties: Partial<DocumentProperties> = {\r\n accessibleAudiences: document.audiences.map(audience => audience.id),\r\n availability: document.availability,\r\n description: document.description,\r\n enabled: document.state !== \"disabled\",\r\n lcid: document.lcid,\r\n notifications: document.notifications,\r\n notifiedAudiences: [],\r\n publishingTime: document.state === \"scheduled\" ? document.published.date : \"\",\r\n tags: document.tags.map(tag => tag.id),\r\n title: document.title\r\n };\r\n this.setState({ documentProperties });\r\n }\r\n\r\n private onUpload = (file: File, onProgress, onLoad, onError, onAbort): Promise<Document> => {\r\n var newFileType = getStringFromMimeType(file.type);\r\n\r\n if(this.props.editableDocument !== undefined && (this.props.editableDocument.fileType !== newFileType || (newFileType === \"jpeg\" && this.props.editableDocument?.fileType === \"jpg\")))\r\n {\r\n this.setState({uploadFail: true})\r\n return Promise.reject();\r\n }\r\n\r\n return this.props.replaceFile(this.props.editableDocument!.id!, file, onProgress, onLoad, onError, onAbort).then((document) => {\r\n return document;\r\n });\r\n }\r\n\r\n private publishDocument = () => {\r\n if(!this.state.documentProperties.tags || this.state.documentProperties.tags?.length === 0) {\r\n let uncategorizedTag = this.props.categoryTags.find(t => t.name === \"Uncategorized\");\r\n let newProperties = this.state.documentProperties;\r\n newProperties.tags = [uncategorizedTag!.id];\r\n this.setState({documentProperties: newProperties});\r\n }\r\n this.props.updateDocumentProperties(this.props.editableDocument!.id!, this.state.documentProperties).then((succeeded) => {\r\n if (succeeded) {\r\n this.props.onSuccess();\r\n this.onClose();\r\n }\r\n });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n onSuccess: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n documentProperties: Partial<DocumentProperties>;\r\n hasError: boolean;\r\n isFetching: boolean;\r\n showNotificationSettings: boolean;\r\n uploadFail: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n changedSinceSaved: state.documents.changedSinceSaved,\r\n editableDocument: state.documents.editableDocument,\r\n errorMessage: state.documents.errorMessage,\r\n isSaving: state.documents.isSaving,\r\n isUploading: state.documents.isUploading,\r\n showEditor: state.documents.showEditor,\r\n successMessage: state.documents.successMessage,\r\n categoryTags: state.categoryTags.userCategoryTags\r\n }),\r\n {\r\n clearErrorMessage: actions.clearErrorMessage,\r\n clearSuccessMessage: actions.clearSuccessMessage,\r\n hasChangedSinceSaved: actions.hasChangedSinceSaved,\r\n hideEditor: actions.hideEditor,\r\n replaceFile: actions.replaceFile,\r\n updateDocumentProperties: actions.updateDocumentProperties\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(DocumentEditor);\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport AuthoringSearch from \"modules/common/components/filters/authoringSearch\";\r\nimport FilterContainer from \"modules/common/components/filters/filterContainer\";\r\nimport FilterDropdown from \"modules/common/components/filters/filterDropdown\";\r\n\r\nimport { Audience } from \"modules/audiences/models\";\r\nimport { CategoryTag, DocumentAvailability, DocumentsFilterValues, DocumentState } from \"../../models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Chip from \"@mui/material/Chip\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport { DatePicker } from \"@mui/x-date-pickers/DatePicker\";\r\nimport { PickerLocalization } from \"modules/common/components/pickerLocalization\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\n\r\n\r\nimport moment from \"moment\";\r\n\r\n\r\ninterface Option {\r\n id: string;\r\n text: string;\r\n}\r\n\r\nconst Availabilities: Option[] = [\r\n { id: \"onlineOnly\", text: \"Online only\" },\r\n { id: \"attachmentOnly\", text: \"Attachment only\" }\r\n];\r\n\r\nconst States: Option[] = [\r\n { id: \"enabled\", text: \"Enabled\" },\r\n { id: \"scheduled\", text: \"Scheduled\" },\r\n { id: \"disabled\", text: \"Disabled\" }\r\n];\r\n\r\nclass DocumentFilters extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n canSearch: !!props.filters.audiences!.length || !!props.filters.availabilities!.length || !!props.filters.lcids!.length || !!props.filters.tags!.length || !!props.filters.states!.length || !!props.filters.newerThan || !!props.filters.olderThan || !!props.filters.textToSearch,\r\n textToSearch: props.filters.textToSearch || \"\"\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.filters.textToSearch !== prevProps.filters.textToSearch)\r\n this.setState({ textToSearch: this.props.filters.textToSearch || \"\" });\r\n }\r\n\r\n public render() {\r\n const { filters } = this.props;\r\n\r\n const availableLanguages: Option[] = this.getAvailableLanguages();\r\n\r\n return (\r\n <FilterContainer\r\n filters={\r\n <React.Fragment>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.state.textToSearch}\r\n placeholder=\"Search title, key words or author\"\r\n InputProps={{\r\n startAdornment: <SearchIcon className=\"search-icon\" />\r\n }}\r\n onChange={this.onUpdateTextToSearch}\r\n onKeyUp={this.onKeyUp}\r\n className=\"text-to-search\"\r\n />\r\n <div className=\"filter-options-group\">\r\n {this.props.id === \"all\" &&\r\n <FilterDropdown text=\"State\">\r\n <List disablePadding>\r\n {States.map((state) =>\r\n <ListItem key={state.id} dense button onClick={() => this.onChangeState(state.id as DocumentState)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!filters.states!.find((selectedState) => selectedState === state.id)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={state.text} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </FilterDropdown>\r\n }\r\n <FilterDropdown\r\n text={this.props.id === \"scheduled\"\r\n ? \"Scheduled for\"\r\n : this.props.id === \"disabled\"\r\n ? \"Disabled between\"\r\n : \"Published between\"\r\n }\r\n >\r\n <PickerLocalization>\r\n <div className=\"published-time\">\r\n <div>\r\n <div>From</div>\r\n <DatePicker\r\n format=\"MMM dd yyyy\"\r\n value={filters.newerThan ? Date.parse(filters.newerThan) : null}\r\n slotProps={{ \r\n textField: { size: \"small\", placeholder: \"\", inputProps: { readOnly: true }},\r\n openPickerIcon: { color: \"primary\" }\r\n }}\r\n onChange={this.onChangePublishedFromDate}\r\n className=\"date-picker\"\r\n />\r\n </div>\r\n <div>\r\n <div>To</div>\r\n <DatePicker\r\n format=\"MMM dd yyyy\"\r\n value={filters.olderThan ? Date.parse(filters.olderThan) : null}\r\n slotProps={{ \r\n textField: { size: \"small\", placeholder: \"\", inputProps: { readOnly: true }},\r\n openPickerIcon: { color: \"primary\" }\r\n }}\r\n onChange={this.onChangePublishedToDate}\r\n className=\"date-picker\"\r\n />\r\n </div>\r\n </div>\r\n </PickerLocalization>\r\n </FilterDropdown>\r\n {availableLanguages.length > 1 &&\r\n <FilterDropdown text=\"Language\">\r\n <List disablePadding>\r\n {availableLanguages.map((language) =>\r\n <ListItem key={language.id} dense button onClick={() => this.onChangeLcids(language.id)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!filters.lcids!.find((lcid) => lcid === language.id)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={language.text} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </FilterDropdown>\r\n }\r\n {this.props.categoryTags.length > 0 &&\r\n <FilterDropdown\r\n text=\"Category tags\"\r\n footer={\r\n <div>\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onClearCategoryTags}>Clear all</Button>\r\n </div>\r\n }\r\n >\r\n <List disablePadding className=\"category-tags\">\r\n {this.props.categoryTags.map((tag) =>\r\n <ListItem key={tag.id} dense button onClick={() => this.onChangeCategoryTags(tag)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!filters.tags!.find((selectedTag) => selectedTag === tag.id)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={tag.name} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </FilterDropdown>\r\n }\r\n <FilterDropdown\r\n text=\"Accessible to\"\r\n footer={\r\n <div>\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onClearAudiences}>Clear all</Button>\r\n </div>\r\n }\r\n >\r\n <List disablePadding className=\"audiences\">\r\n {this.props.audiences.map((audience) =>\r\n <ListItem key={audience.id} dense button onClick={() => this.onChangeAudiences(audience)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!filters.audiences!.find((selectedAudience) => selectedAudience === audience.id)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={audience.displayName} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </FilterDropdown>\r\n <FilterDropdown text=\"Availability\">\r\n <List disablePadding>\r\n {Availabilities.map((availability) =>\r\n <ListItem key={availability.id} dense button onClick={() => this.onChangeAvailability(availability.id as DocumentAvailability)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!filters.availabilities!.find((selectedAvailability) => selectedAvailability === availability.id)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={availability.text} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </FilterDropdown>\r\n </div>\r\n </React.Fragment>\r\n }\r\n filterCommands={\r\n <AuthoringSearch\r\n canSearch={this.state.canSearch}\r\n onApplyFilters={this.onChangeTextToSearch}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n }\r\n filterSelection={this.getFilterSelection()}\r\n />\r\n );\r\n }\r\n\r\n\r\n private getAvailableLanguages = (): Option[] => {\r\n if (!this.props.tenantSettings || !this.props.lcidMappings)\r\n return [];\r\n\r\n let availableLanguages: Option[] = [];\r\n Object.keys(this.props.tenantSettings.translatedContent).map((lcid) => {\r\n if (!!this.props.lcidMappings[lcid])\r\n availableLanguages.push({ id: lcid, text: this.props.lcidMappings[lcid].language });\r\n return lcid;\r\n });\r\n return availableLanguages;\r\n }\r\n\r\n private getFilterSelection = (): JSX.Element | undefined => {\r\n const { audiences, categoryTags, filters, lcidMappings } = this.props;\r\n\r\n if (!filters.textToSearch && !filters.states!.length && !filters.newerThan && !filters.olderThan && !filters.lcids!.length && !filters.tags!.length && !filters.audiences!.length && !filters.availabilities!.length)\r\n return undefined;\r\n\r\n return (\r\n <React.Fragment>\r\n {!!filters.textToSearch &&\r\n <Chip\r\n key=\"search-text\"\r\n label={`\"${filters.textToSearch}\"`}\r\n onDelete={this.onClearTextToSearch}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n }\r\n {filters.states!.map((selectedState) =>\r\n <Chip\r\n key={selectedState}\r\n label={States.find((state) => state.id === selectedState)!.text}\r\n onDelete={() => this.onClearState(selectedState)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n {(!!filters.newerThan || !!filters.olderThan) &&\r\n <Chip\r\n key=\"published-time\"\r\n label={`Released${!!filters.newerThan ? ` from ${moment(filters.newerThan).format(\"MMM D, YYYY\")}` : \"\"}${!!filters.olderThan ? ` up to ${moment(filters.olderThan).format(\"MMM D, YYYY\")}` : \"\"}`}\r\n onDelete={this.onClearPublishedTime}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n }\r\n {filters.lcids!.map((selectedLcid) =>\r\n <Chip\r\n key={selectedLcid}\r\n label={lcidMappings[selectedLcid].language}\r\n onDelete={() => this.onClearLcid(selectedLcid)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n {filters.tags!.map((selectedTag) =>\r\n <Chip\r\n key={selectedTag}\r\n label={categoryTags.find((tag) => tag.id === selectedTag)!.name}\r\n onDelete={() => this.onClearCategoryTag(selectedTag)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n {filters.audiences!.map((selectedAudience) =>\r\n <Chip\r\n key={selectedAudience}\r\n label={audiences.find((audience) => audience.id === selectedAudience)!.displayName}\r\n onDelete={() => this.onClearAudience(selectedAudience)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n {filters.availabilities!.map((selectedAvailability) =>\r\n <Chip\r\n key={selectedAvailability}\r\n label={Availabilities.find((availability) => availability.id === selectedAvailability)!.text}\r\n onDelete={() => this.onClearAvailability(selectedAvailability)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n\r\n private onChangeAudiences = (audience: Audience) => {\r\n const hasSelectedAudience: boolean = !!this.props.filters.audiences!.find((selectedAudience) => selectedAudience === audience.id);\r\n if (hasSelectedAudience)\r\n this.onChangeFilters({ audiences: this.props.filters.audiences!.filter((selectedAudience) => selectedAudience !== audience.id) });\r\n else\r\n this.onChangeFilters({ audiences: this.props.filters.audiences!.concat([audience.id]) });\r\n }\r\n\r\n private onChangeAvailability = (availability: DocumentAvailability) => {\r\n const hasSelectedAvailability: boolean = !!this.props.filters.availabilities!.find((selectedAvailability) => selectedAvailability === availability);\r\n if (hasSelectedAvailability)\r\n this.onChangeFilters({ availabilities: this.props.filters.availabilities!.filter((selectedAvailability) => selectedAvailability !== availability) });\r\n else\r\n this.onChangeFilters({ availabilities: this.props.filters.availabilities!.concat([availability]) });\r\n }\r\n\r\n private onChangeCategoryTags = (tag: CategoryTag) => {\r\n const hasTag: boolean = !!this.props.filters.tags!.find((selectedTag) => selectedTag === tag.id);\r\n if (hasTag)\r\n this.onChangeFilters({ tags: this.props.filters.tags!.filter((selectedTag) => selectedTag !== tag.id) });\r\n else\r\n this.onChangeFilters({ tags: this.props.filters.tags!.concat([tag.id]) });\r\n }\r\n\r\n private onChangeFilters = (value: Partial<DocumentsFilterValues>) => {\r\n this.props.onChangeFilters({ ...this.props.filters, textToSearch: this.state.textToSearch, ...value });\r\n this.setCanSearch();\r\n }\r\n\r\n private onChangeLcids = (lcid: string) => {\r\n const hasSelectedLcid: boolean = !!this.props.filters.lcids!.find((selectedLcid) => selectedLcid === lcid);\r\n if (hasSelectedLcid)\r\n this.onChangeFilters({ lcids: this.props.filters.lcids!.filter((selectedLcid) => selectedLcid !== lcid) });\r\n else\r\n this.onChangeFilters({ lcids: this.props.filters.lcids!.concat([lcid]) });\r\n }\r\n\r\n private onChangePublishedFromDate = (date) => {\r\n this.onChangeFilters({ newerThan: moment(date).toISOString() });\r\n }\r\n\r\n private onChangePublishedToDate = (date) => {\r\n this.onChangeFilters({ olderThan: moment(date).toISOString() });\r\n }\r\n\r\n private onChangeState = (state: DocumentState) => {\r\n const hasSelectedState: boolean = !!this.props.filters.states!.find((selectedState) => selectedState === state);\r\n if (hasSelectedState)\r\n this.onChangeFilters({ states: this.props.filters.states!.filter((selectedState) => selectedState !== state) });\r\n else\r\n this.onChangeFilters({ states: this.props.filters.states!.concat([state]) });\r\n }\r\n \r\n private onChangeTextToSearch = () => {\r\n this.onChangeFilters({ textToSearch: this.state.textToSearch });\r\n }\r\n\r\n private onClearAudience = (audience: string) => {\r\n this.onChangeFilters({ audiences: this.props.filters.audiences!.filter((selectedAudience) => selectedAudience !== audience) });\r\n }\r\n\r\n private onClearAudiences = () => {\r\n this.onChangeFilters({ audiences: [] });\r\n }\r\n\r\n private onClearAvailability = (availability: string) => {\r\n this.onChangeFilters({ availabilities: this.props.filters.availabilities!.filter((selectedAvailability) => selectedAvailability !== availability) });\r\n }\r\n\r\n private onClearCategoryTag = (tag: string) => {\r\n this.onChangeFilters({ tags: this.props.filters.tags!.filter((selectedTag) => selectedTag !== tag) });\r\n }\r\n\r\n private onClearCategoryTags = () => {\r\n this.onChangeFilters({ tags: [] });\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.clearCanSearch();\r\n this.props.onClearFilters();\r\n }\r\n\r\n private onClearLcid = (lcid: string) => {\r\n this.onChangeFilters({ lcids: this.props.filters.lcids!.filter((selectedLcid) => selectedLcid !== lcid) });\r\n }\r\n\r\n private onClearPublishedTime = () => {\r\n this.onChangeFilters({ newerThan: \"\", olderThan: \"\" });\r\n }\r\n\r\n private onClearState = (state: DocumentState) => {\r\n this.onChangeFilters({ states: this.props.filters.states!.filter((selectedState) => selectedState !== state) });\r\n }\r\n\r\n private onClearTextToSearch = () => {\r\n this.onChangeFilters({ textToSearch: \"\" });\r\n }\r\n \r\n private onKeyUp = (key) => {\r\n if (key.keyCode === 13)\r\n this.onChangeTextToSearch();\r\n }\r\n\r\n private onUpdateTextToSearch = (event) => {\r\n this.setState({ textToSearch: event.target.value });\r\n if(event.target.value && event.target.value !== \"\") {\r\n this.setCanSearch();\r\n }\r\n else if(this.hasNoCurrentFilters()){\r\n this.clearCanSearch();\r\n }\r\n }\r\n\r\n private clearCanSearch = () => {\r\n this.setState({ canSearch: false });\r\n }\r\n\r\n private setCanSearch = () => {\r\n this.setState({ canSearch: true });\r\n }\r\n\r\n private hasNoCurrentFilters = () => {\r\n let filters = this.props.filters;\r\n\r\n return (!filters.tags || filters.tags.length === 0) \r\n && filters.textToSearch === \"\" \r\n && (!filters.states || filters.states.length === 0)\r\n && !filters.newerThan && !filters.olderThan\r\n && (!filters.tags || filters.tags.length === 0)\r\n && (!filters.audiences || filters.audiences.length === 0)\r\n && (!filters.availabilities || filters.availabilities.length === 0);\r\n }\r\n}\r\n \r\n\r\ninterface ComponentProps {\r\n id: \"\" | \"all\" | \"enabled\" | \"scheduled\" | \"disabled\" ;\r\n filters: Partial<DocumentsFilterValues>;\r\n onChangeFilters: (filters: Partial<DocumentsFilterValues>) => void;\r\n onClearFilters: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n canSearch: boolean;\r\n textToSearch: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences,\r\n categoryTags: state.categoryTags.userCategoryTags,\r\n lcidMappings: state.resources.lcidMappings,\r\n tenantSettings: state.settings.tenantSettings\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(DocumentFilters);","import React from \"react\";\r\n\r\nimport { DocumentPreview } from \"../../../models\";\r\n\r\nimport PersonIcon from \"@mui/icons-material/Person\";\r\nimport VisibilityOutlinedIcon from \"@mui/icons-material/VisibilityOutlined\";\r\n\r\n\r\nconst DocumentPreviewInfo: React.FunctionComponent<ComponentProps> = props => {\r\n const { preview } = props;\r\n\r\n return (\r\n <div>\r\n <div className=\"document-title\">{preview.title || `${preview.fileName}.${preview.fileType}`}</div>\r\n {(!!preview.totalDownloads || !!preview.uniqueDownloads) &&\r\n <div className=\"document-views\">\r\n <div>\r\n <PersonIcon fontSize=\"small\" />\r\n <span>{preview.uniqueDownloads} unique view(s)</span>\r\n </div>\r\n <div>\r\n <VisibilityOutlinedIcon fontSize=\"small\" />\r\n <span>{preview.totalDownloads} total view(s)</span>\r\n </div>\r\n </div>\r\n }\r\n {preview.tags.length > 0 &&\r\n <div>\r\n <span>Category tags: </span>\r\n {preview.tags.slice(0, 3).map(tag => tag.name).join(\", \")}{preview.tags.length > 3 ? `, ... +${preview.tags.length - 3}` : \"\"}\r\n </div>\r\n }\r\n <div>\r\n {preview.availability === \"attachmentOnly\"\r\n ? \"Available as an attachment only\"\r\n : \"Available online only\"\r\n }\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n preview: DocumentPreview;\r\n}\r\n\r\nexport default DocumentPreviewInfo;","import React, { useEffect, useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { AttachedArticle, DocumentPreview } from \"../../../models\";\r\n\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\n\r\nimport Divider from \"@mui/material/Divider\";\r\n\r\n\r\nconst DocumentPreviewMoreInfo: React.FunctionComponent<PropsWithRedux> = props => {\r\n const { getAttachedArticles, preview } = props;\r\n\r\n const [attachedPosts, setAttachedPosts] = useState([] as AttachedArticle[]);\r\n const [attachedEvents, setAttachedEvents] = useState([] as AttachedArticle[]);\r\n\r\n useEffect(() => {\r\n getAttachedArticles(preview.id).then((attachedArticles) => {\r\n if (!!attachedArticles.totalArticles) {\r\n setAttachedPosts(attachedArticles.articles.filter(article => article.articleType === \"post\"));\r\n setAttachedEvents(attachedArticles.articles.filter(article => article.articleType === \"event\"));\r\n }\r\n });\r\n }, [getAttachedArticles, preview]);\r\n\r\n return (\r\n <div>\r\n <div className=\"document-title\">{preview.title || `${preview.fileName}.${preview.fileType}`}</div>\r\n {(!!preview.description || !!preview.lcid) &&\r\n <React.Fragment>\r\n <div className=\"document-info-properties\">\r\n {!!preview.description &&\r\n <div>\r\n <div>Description</div>\r\n <div>{preview.description}</div>\r\n </div>\r\n }\r\n {!!preview.lcid &&\r\n <div>\r\n <div>Language</div>\r\n <div>{props.lcidMappings[preview.lcid].language}</div>\r\n </div>\r\n }\r\n </div>\r\n <Divider />\r\n </React.Fragment>\r\n }\r\n <div className=\"document-info-properties\">\r\n <div>\r\n <div>Original file name</div>\r\n <div>{preview.fileName}.{preview.fileType}</div>\r\n </div>\r\n <div>\r\n <div className=\"revision\">\r\n <span>Version no.</span>\r\n <InfoHover>No. of times the file has been replaced. Version 1 is the initial file uploaded.</InfoHover>\r\n </div>\r\n <div>{preview.revisions}</div>\r\n </div>\r\n </div>\r\n <Divider />\r\n <div className=\"document-info-properties\">\r\n <div>\r\n <div>Availability</div>\r\n <div>\r\n {preview.availability === \"attachmentOnly\"\r\n ? \"Attachment only\"\r\n : \"Online only\"\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n {((!!preview.audiences && !!preview.audiences.length) || (!!preview.tags && !!preview.tags.length)) &&\r\n <React.Fragment>\r\n <Divider />\r\n {!!preview.tags && !!preview.tags.length &&\r\n <div className=\"document-info-properties\">\r\n <div>\r\n <div>Category tags</div>\r\n <div className=\"category-tags\">\r\n {preview.tags.map(tag => tag.name).join(\", \")}\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n {!!preview.audiences && !!preview.audiences.length &&\r\n <div className=\"document-info-properties\">\r\n <div>\r\n <div>Access audiences</div>\r\n <div className=\"access-audiences\">\r\n {preview.audiences.map(audience => audience.name).join(\", \")}\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </React.Fragment>\r\n }\r\n {(!!attachedPosts.length || !!attachedEvents.length) &&\r\n <div className=\"document-info-properties\">\r\n <div>\r\n <div>Uses</div>\r\n <div>\r\n {!!attachedPosts.length &&\r\n <div>\r\n <span>{attachedPosts.length} Post(s) </span>\r\n <span>\r\n (\r\n {attachedPosts.map((attachedPost, index) =>\r\n <React.Fragment key={index}>\r\n {index !== 0 &&\r\n <span>, </span>\r\n }\r\n <span\r\n onClick={() => {\r\n const location: string = window.location.href;\r\n const segments: string[] = location.split(props.tenant);\r\n window.open(`${segments[0]}${props.tenant}/admin/${attachedPost.articleType}s/${attachedPost.id}`);\r\n }}\r\n className=\"attached-post\"\r\n >\r\n {attachedPost.title}\r\n </span>\r\n </React.Fragment>\r\n )}\r\n )\r\n </span>\r\n </div>\r\n }\r\n {!!attachedEvents.length &&\r\n <div>\r\n <span>{attachedEvents.length} Event(s) </span>\r\n <span>\r\n (\r\n {attachedEvents.map((attachedEvent, index) =>\r\n <React.Fragment key={index}>\r\n {index !== 0 &&\r\n <span>, </span>\r\n }\r\n <span className=\"attached-event\">{attachedEvent.title}</span>\r\n </React.Fragment>\r\n )}\r\n )\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n preview: DocumentPreview;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n lcidMappings: state.resources.lcidMappings,\r\n tenant: state.tenant.id\r\n }),\r\n {\r\n getAttachedArticles: actions.getAttachedArticles\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(DocumentPreviewMoreInfo);","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport MoreOptionsButton from \"modules/common/components/buttons/moreOptionsButton\";\r\n\r\nimport { DocumentPreview } from \"../../models\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport Divider from \"@mui/material/Divider\";\r\nimport List from \"@mui/material/List\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n moreOptions: {\r\n backgroundColor: \"#ffffff\",\r\n boxShadow: \"0px 3px 1px -2px rgb(0 0 0 / 20%), 0px 2px 2px 0px rgb(0 0 0 / 14%), 0px 1px 5px 0px rgb(0 0 0 / 12%)\",\r\n \"&:hover\": {\r\n backgroundColor: \"#ffffff\"\r\n }\r\n }\r\n })\r\n);\r\n\r\n\r\nconst PreviewOptions: React.FunctionComponent<PropsWithRedux> = props => {\r\n const classes = useStyles();\r\n\r\n const onSelect = () => {\r\n props.hidePreview();\r\n props.onSuccess();\r\n }\r\n\r\n const { preview } = props;\r\n\r\n return (\r\n <div>\r\n <MoreOptionsButton text=\"Actions\" className={classes.moreOptions}>\r\n <List disablePadding>\r\n <MoreOptionsItem\r\n text=\"Edit/replace document\"\r\n onClick={() => {\r\n onSelect();\r\n props.showEditor(preview);\r\n }}\r\n />\r\n <Divider light />\r\n {preview.state === \"enabled\" &&\r\n <MoreOptionsItem\r\n text=\"Disable\"\r\n onClick={() => {\r\n onSelect();\r\n props.disableDocument(preview.id);\r\n }}\r\n />\r\n }\r\n {preview.state !== \"enabled\" &&\r\n <MoreOptionsItem\r\n text=\"Enable\"\r\n onClick={() => {\r\n onSelect();\r\n props.enableDocument(preview.id);\r\n }}\r\n />\r\n }\r\n <MoreOptionsItem\r\n text=\"Delete\"\r\n onClick={async () => {\r\n if (await confirm.show({ text: \"Are you sure you want to delete this document?\", title: \"Delete document\" })) {\r\n onSelect();\r\n props.deleteDocument(preview.id);\r\n }\r\n }}\r\n />\r\n </List>\r\n </MoreOptionsButton>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n preview: DocumentPreview;\r\n onSuccess: () => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps\r\n }),\r\n {\r\n deleteDocument: actions.deleteDocument,\r\n disableDocument: actions.disableDocument,\r\n enableDocument: actions.enableDocument,\r\n hidePreview: actions.hidePreview,\r\n showEditor: actions.showEditor\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(PreviewOptions);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport DocumentPreviewInfo from \"./components/documentPreviewInfo\";\r\nimport DocumentPreviewMoreInfo from \"./components/documentPreviewMoreInfo\";\r\nimport PreviewOptions from \"../action-buttons/previewOptions\";\r\n\r\nimport { getMimeType } from \"../../utilities/getMimeType\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Link from \"@mui/material/Link\";\r\nimport Snackbar from \"@mui/material/Snackbar\";\r\n\r\nimport ArrowBackIcon from \"@mui/icons-material/ArrowBack\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport SaveAltIcon from \"@mui/icons-material/SaveAlt\";\r\n\r\nimport Alert from '@mui/material/Alert';\r\n\r\n\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\nimport { DialogContent, DialogTitle } from \"@mui/material\";\r\n\r\nimport \"../../styles/documentViews.sass\";\r\n\r\nclass DocumentPreview extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n showMoreInfo: false\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.showPreview && !prevProps.showPreview)\r\n this.setState({ showMoreInfo: false });\r\n }\r\n\r\n public render() {\r\n if (!this.props.preview || !this.props.preview.fileUrl)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n return (\r\n <Dialog\r\n open={this.props.showPreview}\r\n onClose={this.onClose}\r\n maxWidth=\"md\"\r\n classes={{ paper: `document-preview-paper ${this.props.preview.fileType === \"pdf\" || this.props.preview.fileType === \"txt\" ? \" document-preview-full\" : \"\"}`}}\r\n className=\"document-preview\"\r\n scroll=\"paper\"\r\n fullWidth\r\n >\r\n <DialogTitle>\r\n <div className=\"action-section\">\r\n <PreviewOptions preview={this.props.preview} onSuccess={this.props.onSuccess} />\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n startIcon={<SaveAltIcon />}\r\n onClick={this.onDownload}\r\n style={{ marginLeft: \"10px\" }}\r\n > Download file</Button>\r\n \r\n <IconButton onClick={this.onClose} size=\"large\"> <CloseIcon /> </IconButton>\r\n </div>\r\n </DialogTitle>\r\n\r\n {\r\n this.props.preview.fileType === \"pdf\" || this.props.preview.fileType === \"txt\"\r\n ? <object\r\n data={`${this.props.preview.fileUrl}#toolbar=0`}\r\n type={getMimeType(this.props.preview.fileType)}\r\n height=\"100%\"\r\n width=\"100%\"\r\n >\r\n <div>No online PDF viewer installed</div>\r\n </object>\r\n : <div className=\"preview-screen\">\r\n <div>\r\n <img src={this.props.preview.fileUrl} alt=\"document preview\" />\r\n </div>\r\n </div>\r\n }\r\n\r\n <DialogContent className=\"document-preview-content\">\r\n <Collapse in={!this.state.showMoreInfo}>\r\n <DocumentPreviewInfo preview={this.props.preview} />\r\n <Link component=\"button\" variant=\"body2\" underline=\"always\" onClick={this.onShowMoreInfo} className=\"more-info-link\">More info</Link>\r\n </Collapse>\r\n\r\n <Collapse in={this.state.showMoreInfo} className=\"document-info\">\r\n <div className=\"document-info-header\">\r\n <IconButton onClick={this.onHideMoreInfo} size=\"large\">\r\n <ArrowBackIcon />\r\n </IconButton>\r\n <div>More info</div>\r\n </div>\r\n <DocumentPreviewMoreInfo preview={this.props.preview} />\r\n </Collapse>\r\n </DialogContent>\r\n\r\n <Snackbar open={!!this.props.errorMessage} anchorOrigin={{ vertical: \"top\", horizontal: \"right\" }} autoHideDuration={6000} onClose={this.props.clearErrorMessage}>\r\n <Alert variant=\"filled\" severity=\"error\" elevation={6} onClose={this.props.clearErrorMessage}>{this.props.errorMessage}</Alert>\r\n </Snackbar>\r\n <LoadingOverlay show={this.props.isSaving || this.props.isUploading} styles={{ paddingTop: 150 }} />\r\n </Dialog>\r\n );\r\n }\r\n\r\n private onClose = () => {\r\n this.props.hidePreview();\r\n }\r\n\r\n private onDownload = () => {\r\n const { preview } = this.props;\r\n if (!preview) return;\r\n\r\n const file = {\r\n name: `${preview.fileName}.${preview.fileType}`\r\n };\r\n new FileDownloader(file).downloadProvided(preview.fileUrl);\r\n }\r\n\r\n private onHideMoreInfo = () => {\r\n this.setState({ showMoreInfo: false });\r\n }\r\n\r\n private onShowMoreInfo = () => {\r\n this.setState({ showMoreInfo: true });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n onSuccess: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n showMoreInfo: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n errorMessage: state.documents.errorMessage,\r\n isSaving: state.documents.isSaving,\r\n isUploading: state.documents.isUploading,\r\n preview: state.documents.preview,\r\n showPreview: state.documents.showPreview\r\n }),\r\n {\r\n clearErrorMessage: actions.clearErrorMessage,\r\n hidePreview: actions.hidePreview\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(DocumentPreview);","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport { AttachedArticle, DateInformation, Document, DocumentsFilterValues, DocumentsListingPage, DocumentState } from \"../../models\";\r\nimport moment from \"moment\";\r\n\r\nimport { documentsApi } from \"api/instances\";\r\n\r\nimport AudienceChipLabels from \"modules/common/components/chips/audienceChipLabels\";\r\nimport CategoryChipLabels from \"modules/common/components/chips/categoryTagChipLabels\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport MoreDocumentOptions from \"../action-buttons/moreDocumentOptions\";\r\nimport DocumentEditor from \"../document-creation/documentEditor\";\r\nimport DocumentFilters from \"../document-filters/documentFilters\";\r\nimport DocumentPreview from \"../document-views/documentPreview\";\r\n\r\nimport { getMimeType } from \"../../utilities/getMimeType\";\r\n\r\nimport TabContent from \"pages/common/tabContent\";\r\nimport TabContentToolbar from \"pages/common/tabContentToolbar\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableContainer from \"@mui/material/TableContainer\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport BlockIcon from \"@mui/icons-material/Block\";\r\nimport CheckCircleOutlineIcon from \"@mui/icons-material/CheckCircleOutline\";\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport EditIcon from \"@mui/icons-material/Edit\";\r\nimport PersonIcon from \"@mui/icons-material/Person\";\r\nimport SaveAltIcon from \"@mui/icons-material/SaveAlt\";\r\nimport VisibilityIcon from \"@mui/icons-material/Visibility\";\r\nimport VisibilityOutlinedIcon from \"@mui/icons-material/VisibilityOutlined\";\r\nimport Paging from \"modules/common/components/paging\";\r\nimport { SortStyle } from \"utils/managementUtils\";\r\nimport Cookies from \"js-cookie\";\r\nimport ArrowDownward from \"@mui/icons-material/ArrowDownward\";\r\nimport ArrowUpward from \"@mui/icons-material/ArrowUpward\";\r\nimport HoverText from \"../action-buttons/hoverText\";\r\nimport ManagementEmptyResults from \"modules/common/components/managementEmptyResults\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\nimport { ROWS_PER_PAGE_COOKIE_NAMES } from \"utils/cookie\";\r\n\r\ninterface HeaderCell {\r\n disablePadding: boolean;\r\n id: string;\r\n label: string | JSX.Element;\r\n ascValue?: SortStyle;\r\n descValue?: SortStyle;\r\n clickable?: boolean;\r\n}\r\n\r\n\r\nclass DocumentList extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n documentFile: undefined,\r\n filters: { ...this.getDefaultFilterValues() },\r\n hasFiltersApplied: false,\r\n isDownloading: false,\r\n isPagedLoad: false,\r\n previewUrl: \"\",\r\n selectedItems: [],\r\n showEditor: false,\r\n sortMethod: this.props.initialSort\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.page.id !== prevProps.page.id)\r\n this.setState({ selectedItems: [] });\r\n\r\n if (this.props.hasRefreshed && !prevProps.hasRefreshed) {\r\n this.setState({ filters: { ...this.getDefaultFilterValues() }, hasFiltersApplied: false });\r\n }\r\n }\r\n\r\n public render() {\r\n const { page } = this.props;\r\n\r\n if (!this.props.show)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n if (page.isFetching && !this.state.isPagedLoad)\r\n return <Loading />;\r\n \r\n return (\r\n <div className=\"documents-list\">\r\n {this.getToolbar()}\r\n <TabContent>\r\n {this.getFilter()}\r\n {this.getList()}\r\n <DocumentEditor onSuccess={this.onClearAllDocuments} />\r\n <DocumentPreview onSuccess={this.onClearAllDocuments} />\r\n <LoadingOverlay absolute={true} show={this.state.isDownloading} />\r\n </TabContent>\r\n </div>\r\n );\r\n }\r\n\r\n private formatTime = (time: DateInformation): JSX.Element => {\r\n if (time.date === \"0001-01-01T00:00:00+00:00\")\r\n return (\r\n <div>\r\n <span>-</span>\r\n </div>\r\n );\r\n \r\n return (\r\n <div>\r\n <span>{moment(new Date(time.date)).format(\"MMM D, YYYY, h:mmA\")}</span>\r\n </div>\r\n );\r\n }\r\n\r\n private formatLanguage = (lcid: string): string => {\r\n if (!lcid)\r\n return \"-\";\r\n\r\n if (!this.props.lcidMappings || !this.props.lcidMappings[lcid])\r\n return lcid;\r\n\r\n return this.props.lcidMappings[lcid].language;\r\n }\r\n\r\n private formatState = (state: DocumentState): JSX.Element => {\r\n if (state === \"disabled\")\r\n return <span className=\"document-state grey\">Disabled</span>;\r\n else if (state === \"scheduled\")\r\n return <span className=\"document-state yellow\">Scheduled</span>;\r\n else\r\n return <span className=\"document-state green\">Enabled</span>;\r\n }\r\n\r\n private formatViews = (totalDownloads: number, uniqueDownloads: number): JSX.Element => {\r\n if (!totalDownloads && !uniqueDownloads)\r\n return <div>-</div>;\r\n\r\n return (\r\n <div className=\"document-views\">\r\n <div title=\"Unique views\"><PersonIcon fontSize=\"small\" />{uniqueDownloads}</div>\r\n <div title=\"Total views\"><VisibilityOutlinedIcon fontSize=\"small\" />{totalDownloads}</div>\r\n </div>\r\n );\r\n }\r\n\r\n\r\n private getDefaultFilterValues = (): Partial<DocumentsFilterValues> => {\r\n const filters: Partial<DocumentsFilterValues> = {\r\n audiences: [],\r\n availabilities: [],\r\n lcids: [],\r\n newerThan: \"\",\r\n olderThan: \"\",\r\n states: [],\r\n tags: [],\r\n textToSearch: \"\",\r\n sortType: SortStyle.publishDesc\r\n };\r\n return filters;\r\n }\r\n\r\n\r\n private getFilter = (): JSX.Element => {\r\n return (\r\n <DocumentFilters\r\n id={this.props.page.id}\r\n filters={this.state.filters}\r\n onChangeFilters={this.onChangeFilters}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n );\r\n }\r\n\r\n //Default to descending, if currently descending make it ascending.\r\n private onClickHeader = (descValue: SortStyle | undefined, ascValue: SortStyle | undefined) => {\r\n const rowsPerPage = Cookies.get(ROWS_PER_PAGE_COOKIE_NAMES.DEFAULT);\r\n \r\n if(descValue === undefined || ascValue === undefined) {\r\n return;\r\n }\r\n\r\n if(this.state.sortMethod === descValue) {\r\n this.setState({sortMethod: ascValue, filters: {...this.state.filters, sortType: ascValue}}, () => {\r\n this.onChangePage(0, Number(rowsPerPage) ?? 10);\r\n });\r\n }\r\n else {\r\n this.setState({sortMethod: descValue, filters: {...this.state.filters, sortType: descValue}}, () => {\r\n this.onChangePage(0, Number(rowsPerPage) ?? 10);\r\n });\r\n }\r\n }\r\n\r\n private getHeader = (): HeaderCell[] => {\r\n const { page } = this.props;\r\n\r\n let header: HeaderCell[] = [\r\n { id: \"title\", disablePadding: true, label: \"Document title\", descValue: SortStyle.titleDesc, ascValue: SortStyle.titleAsc, clickable: true },\r\n { id: \"options\", disablePadding: true, label: \"\" }\r\n ];\r\n\r\n if (page.id === \"all\")\r\n header.push({ id: \"state\", disablePadding: false, label: \"State\", descValue: SortStyle.stateDesc, ascValue: SortStyle.stateAsc, clickable: true });\r\n\r\n if (page.id === \"all\" || page.id === \"enabled\")\r\n header.push({ id: \"publishDate\", disablePadding: false, label: \"Publish date\", descValue: SortStyle.publishDesc, ascValue: SortStyle.publishAsc, clickable: true });\r\n if (page.id === \"scheduled\")\r\n header.push({ id: \"publishDate\", disablePadding: false, label: \"Scheduled for\", descValue: SortStyle.publishDesc, ascValue: SortStyle.publishAsc, clickable: true });\r\n if (page.id === \"disabled\")\r\n header.push({ id: \"disabledDate\", disablePadding: false, label: \"Disabled on\", descValue: SortStyle.disableDesc, ascValue: SortStyle.disableAsc, clickable: true });\r\n\r\n header.push({ id: \"lastModifiedBy\", disablePadding: false, label: \"Last modified by\", descValue: SortStyle.authorDesc, ascValue: SortStyle.authorAsc, clickable: true });\r\n header.push({ id: \"language\", disablePadding: false, label: \"Language\", descValue: SortStyle.languageDesc, ascValue: SortStyle.languageAsc, clickable: true });\r\n header.push({ id: \"categoryTags\", disablePadding: false, label: \"Category tags\" });\r\n header.push({ id: \"audiences\", disablePadding: false, label: \"Accessible to\" });\r\n header.push({ id: \"views\", disablePadding: false, label: (\r\n <div className=\"header-view\">\r\n <HoverText\r\n label=\"Views\"\r\n >\r\n <div>These are the unique views and total views of each document.</div>\r\n </HoverText>\r\n </div>\r\n ), descValue: SortStyle.viewsDesc, ascValue: SortStyle.viewsAsc, clickable: true});\r\n \r\n return header;\r\n }\r\n\r\n private getList = (): JSX.Element => {\r\n const { page } = this.props;\r\n const { selectedItems } = this.state;\r\n\r\n const rowCount = page.documents.length || 10;\r\n\r\n if (page.isFetching)\r\n return <Loading />;\r\n \r\n if (!page.documents.length)\r\n return (\r\n <ManagementEmptyResults searchType={\"Documents\"} hasFilters={this.state.hasFiltersApplied}/>\r\n );\r\n\r\n return (\r\n <React.Fragment>\r\n {this.state.hasFiltersApplied &&\r\n <Typography variant=\"h2\" className=\"document-results\">Results</Typography>\r\n }\r\n <TableContainer>\r\n <Table size=\"medium\">\r\n <TableHead>\r\n <TableRow>\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n color=\"primary\"\r\n indeterminate={selectedItems.length > 0 && selectedItems.length < rowCount}\r\n checked={rowCount > 0 && selectedItems.length === rowCount}\r\n onChange={this.onSelectAllDocuments}\r\n inputProps={{ \"aria-label\": \"select all documents\" }}\r\n />\r\n </TableCell>\r\n {this.getHeader().map((headerCell) => {\r\n if (headerCell.id === \"options\")\r\n return <TableCell key={headerCell.id} padding=\"checkbox\"></TableCell>\r\n\r\n return (\r\n <TableCell\r\n key={headerCell.id}\r\n align={headerCell.disablePadding ? \"left\" : \"center\"}\r\n padding={headerCell.disablePadding ? \"none\" : \"normal\"}\r\n onClick={() => this.onClickHeader(headerCell.descValue, headerCell.ascValue)}\r\n style={{cursor: headerCell.clickable ? \"pointer\" : \"\"}}\r\n >\r\n {headerCell.label}\r\n {this.state.sortMethod === headerCell.ascValue && <ArrowUpward htmlColor=\"#7A7A7A\" style={{position: \"relative\", top: \"8px\", paddingLeft: \"2px\"}}/>}\r\n {this.state.sortMethod === headerCell.descValue && <ArrowDownward htmlColor=\"#7A7A7A\" style={{position: \"relative\", top: \"8px\", paddingLeft: \"2px\"}}/>}\r\n </TableCell>\r\n );\r\n })}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {page.documents\r\n .map((document, index) => this.getListItem(document, index))\r\n }\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n <Paging\r\n currentPage={page.currentPage}\r\n items={page.documents}\r\n totalItems={page.totalDocuments}\r\n totalPages={page.totalPages}\r\n onChangePage={this.onChangePage}\r\n resetSelection={this.resetSelection}\r\n />\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private getListItem = (document: Document, index: number): JSX.Element => {\r\n const isDocumentSelected = this.isDocumentSelected(document);\r\n const labelId = `document-list-checkbox-${index}`;\r\n\r\n return (\r\n <React.Fragment key={document.id}>\r\n <TableRow\r\n hover\r\n onClick={() => this.onEditDocument(document)}\r\n role=\"checkbox\"\r\n aria-checked={isDocumentSelected}\r\n tabIndex={-1}\r\n key={document.id}\r\n selected={isDocumentSelected}\r\n >\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n color=\"primary\"\r\n checked={isDocumentSelected}\r\n inputProps={{ \"aria-labelledby\": labelId }}\r\n onClick={(ev) => this.onSelectDocument(ev, document)}\r\n />\r\n </TableCell>\r\n <TableCell component=\"th\" id={labelId} scope=\"row\" padding=\"none\">{document.title || `${document.fileName}.${document.fileType}`}</TableCell>\r\n <TableCell padding=\"checkbox\">\r\n <MoreDocumentOptions\r\n document={document}\r\n onDownloadDocument={() => this.onDownloadDocument(document)}\r\n onPreviewDocument={() => this.onPreviewDocument(document)}\r\n onSelection={this.onClearAllDocuments}\r\n />\r\n </TableCell>\r\n {this.props.page.id === \"all\" && <TableCell align=\"center\">{this.formatState(document.state)}</TableCell>}\r\n {this.props.page.id !== \"disabled\"\r\n ? <TableCell align=\"center\">{this.formatTime(document.published)}</TableCell>\r\n : <TableCell align=\"center\">{this.formatTime(document.disabled)}</TableCell>\r\n }\r\n <TableCell align=\"center\">{document.updated.userName || \"-\"}</TableCell>\r\n <TableCell align=\"center\">{this.formatLanguage(document.lcid)}</TableCell>\r\n <TableCell align=\"center\"><CategoryChipLabels tags={document.tags} /></TableCell>\r\n <TableCell align=\"center\"><AudienceChipLabels audienceIds={document.audiences.map((audience) => audience.id)} audiences={this.props.audiences} /></TableCell>\r\n <TableCell align=\"center\">{this.formatViews(document.totalDownloads, document.uniqueDownloads)}</TableCell>\r\n </TableRow>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private getToolbar = (): JSX.Element => {\r\n const { selectedItems } = this.state;\r\n\r\n if (!selectedItems.length)\r\n return <React.Fragment></React.Fragment>;\r\n \r\n return (\r\n <TabContentToolbar>\r\n <div>\r\n {this.getToolbarIcon(`${selectedItems.length} selected`, <ClearIcon />, this.onClearAllDocuments)}\r\n </div>\r\n <div>\r\n {selectedItems.length === 1 &&\r\n <React.Fragment>\r\n {this.getToolbarIcon(\"Download file\", <SaveAltIcon />, () => this.onDownloadDocument(selectedItems[0]))}\r\n {this.getToolbarIcon(\"Edit/replace document\", <EditIcon />, () => this.onEditDocument(selectedItems[0]))}\r\n {(selectedItems[0].fileType === \"jpeg\" || selectedItems[0].fileType === \"jpg\" || selectedItems[0].fileType === \"pdf\" || selectedItems[0].fileType === \"png\" || selectedItems[0].fileType === \"txt\") &&\r\n this.getToolbarIcon(\"Preview\", <VisibilityIcon />, () => this.onPreviewDocument(selectedItems[0]))\r\n }\r\n {selectedItems[0].state !== \"enabled\" && this.getToolbarIcon(\"Enable\", <CheckCircleOutlineIcon />, this.onEnableDocument)}\r\n {selectedItems[0].state === \"enabled\" && this.getToolbarIcon(\"Disable\", <BlockIcon style={{ transform: \"rotate(90deg)\" }} />, this.onDisableDocument)}\r\n </React.Fragment>\r\n }\r\n {this.getToolbarIcon(\"Delete\", <DeleteIcon />, this.onDeleteDocument)}\r\n </div>\r\n </TabContentToolbar>\r\n );\r\n }\r\n\r\n private getToolbarIcon = (title: string, icon: React.ReactNode, onClick: () => void) => {\r\n return (\r\n <Button aria-label={title.toLowerCase()} color=\"primary\" startIcon={icon} onClick={onClick}>\r\n {title}\r\n </Button>\r\n );\r\n }\r\n\r\n private isDocumentSelected = (document: Document): boolean => {\r\n return this.state.selectedItems.findIndex((selectedItem) => selectedItem.id === document.id) !== -1;\r\n }\r\n\r\n private onChangeFilters = (filters: Partial<DocumentsFilterValues>) => {\r\n const updatedFilters = { ...this.state.filters, ...filters };\r\n this.setState({ filters: updatedFilters, hasFiltersApplied: true, isPagedLoad: true });\r\n this.props.fetchPage(1, updatedFilters);\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.setState({ hasFiltersApplied: false, filters: { ...this.getDefaultFilterValues() }, isPagedLoad: true });\r\n this.props.fetchPage(1, {});\r\n }\r\n\r\n private onClearAllDocuments = () => {\r\n this.setState({ selectedItems: [] });\r\n }\r\n\r\n private onDeleteDocument = () => {\r\n Promise.all(this.state.selectedItems.map((selectedItem) => this.props.getAttachedArticles(selectedItem.id))).then(async (results) => {\r\n if (this.state.selectedItems.length === 1) {\r\n if (!!results && !!results[0] && !!results[0].totalArticles) {\r\n const result = results[0];\r\n confirm.show({\r\n text: (\r\n <div>\r\n <div>This document is attached to {result.totalArticles} item(s):</div>\r\n <ul>\r\n {result.articles.map((article, index) => {\r\n const text: string = `${article.title} (${article.articleType.charAt(0).toUpperCase()}${article.articleType.substr(1)})`;\r\n return (\r\n <li key={index}>\r\n {article.articleType === \"post\"\r\n ? <span\r\n onClick={() => {\r\n const location: string = window.location.href;\r\n const segments: string[] = location.split(this.props.tenant);\r\n window.open(`${segments[0]}${this.props.tenant}/admin/${article.articleType}s/${article.id}`);\r\n }}\r\n className=\"documents-attached-article\"\r\n >\r\n {text}\r\n </span>\r\n : <span>{text}</span>\r\n }\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n <div>Are you sure you want to delete this? You cannot undo this action.</div>\r\n </div>\r\n ),\r\n title: \"Document in use\",\r\n yesText: \"Ok\",\r\n hideNo: true\r\n });\r\n } else {\r\n let functionalTitle = this.state.selectedItems[0].title === \"\" ? `${this.state.selectedItems[0].fileName}.${this.state.selectedItems[0].fileType}` : this.state.selectedItems[0].title;\r\n if (await confirm.show({\r\n text: `You're about to permanently delete '${functionalTitle}'. You cannot undo this action. Are you sure?`,\r\n title: \"Delete Document\",\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\"\r\n })) {\r\n this.props.deleteDocument(this.state.selectedItems[0].id).then((succeeded) => {\r\n if (succeeded)\r\n this.onClearAllDocuments();\r\n });\r\n }\r\n }\r\n } else {\r\n const totalArticles = (results || []).reduce((sum, article) => sum += article.totalArticles, 0);\r\n if (!!results && !!totalArticles) {\r\n const articles: AttachedArticle[] = results.reduce((acc: AttachedArticle[], article) => acc.concat(article.articles), []);\r\n const affectedDocuments: number = results.filter(result => !!result.totalArticles).length;\r\n confirm.show({\r\n text: (\r\n <div>\r\n <div>{affectedDocuments} of your {this.state.selectedItems.length} selected documents are attached to other items. These document(s) are attached to the following items:</div>\r\n <ul>\r\n {articles.filter((article, index) => articles.findIndex(searchArticle => searchArticle.id === article.id) === index).map((article, index) => {\r\n const text: string = `${article.title} (${article.articleType.charAt(0).toUpperCase()}${article.articleType.substr(1)})`;\r\n return (\r\n <li key={index}>\r\n {article.articleType === \"post\"\r\n ? <span\r\n onClick={() => {\r\n const location: string = window.location.href;\r\n const segments: string[] = location.split(this.props.tenant);\r\n window.open(`${segments[0]}${this.props.tenant}/admin/${article.articleType}s/${article.id}`);\r\n }}\r\n className=\"documents-attached-article\"\r\n >\r\n {text}\r\n </span>\r\n : <span>{text}</span>\r\n }\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n <div>Are you sure you want to delete this? You cannot undo this action.</div>\r\n </div>\r\n ),\r\n title: \"Document(s) in use\",\r\n yesText: \"Ok\",\r\n hideNo: true\r\n });\r\n } else {\r\n if (await confirm.show({\r\n text: \"You're about to permanently delete these documents. You cannot undo this action. Are you sure?\",\r\n title: \"Delete Documents\",\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\"\r\n })) {\r\n this.props.deleteDocuments(this.state.selectedItems.map((selectedItem) => selectedItem.id)).then((succeeded) => {\r\n if (succeeded)\r\n this.onClearAllDocuments();\r\n });\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n private onDisableDocument = () => {\r\n this.props.disableDocument(this.state.selectedItems[0].id).then(() => {\r\n this.onClearAllDocuments();\r\n });\r\n }\r\n\r\n private onDownloadDocument = (selectedDocument: Document) => {\r\n this.setState({ isDownloading: true });\r\n const file = {\r\n name: `${selectedDocument.fileName}.${selectedDocument.fileType}`\r\n };\r\n documentsApi.GetFile(selectedDocument.id)\r\n .then((data) => new FileDownloader(file).downloadDoc(data))\r\n .then(_ => this.setState({ isDownloading: false }))\r\n .catch(_ => this.setState({ isDownloading: false }))\r\n }\r\n\r\n private onEnableDocument = () => {\r\n this.props.enableDocument(this.state.selectedItems[0].id).then(() => {\r\n this.onClearAllDocuments();\r\n });\r\n }\r\n\r\n private onEditDocument = (selectedDocument: Document) => {\r\n this.props.showEditor(selectedDocument);\r\n }\r\n \r\n private onPreviewDocument = (selectedDocument: Document) => {\r\n this.setState({ isDownloading: true });\r\n documentsApi.GetFile(selectedDocument.id).then((file) => {\r\n var blob = new Blob([file], { type: getMimeType(selectedDocument.fileType) });\r\n const fileURL = URL.createObjectURL(blob);\r\n this.props.showPreview({ ...selectedDocument, fileUrl: fileURL });\r\n this.setState({ isDownloading: false });\r\n });\r\n }\r\n\r\n private onSelectAllDocuments = () => {\r\n if (this.state.selectedItems.length === this.props.page.documents.length)\r\n this.setState({ selectedItems: [] });\r\n else\r\n this.setState({ selectedItems: this.props.page.documents });\r\n }\r\n\r\n private onSelectDocument = (ev, document: Document) => {\r\n ev.stopPropagation();\r\n\r\n let selectedItems = this.state.selectedItems.slice();\r\n\r\n if (selectedItems.findIndex((selectedItem) => selectedItem.id === document.id) === -1)\r\n selectedItems = selectedItems.concat([document]);\r\n else\r\n selectedItems = selectedItems.filter(selectedItem => selectedItem.id !== document.id);\r\n\r\n this.setState({ selectedItems });\r\n }\r\n\r\n private resetSelection = () => {\r\n this.setState({selectedItems: []});\r\n }\r\n\r\n private onChangePage = (page: number, rowsPerPage: number) => {\r\n this.props.fetchPage(page + 1, this.state.filters, rowsPerPage);\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n page: DocumentsListingPage;\r\n hasRefreshed?: boolean;\r\n fetchPage: (pageNumber: number, filters: Partial<DocumentsFilterValues>, rowsPerPage?: number) => void;\r\n initialSort: SortStyle;\r\n}\r\n\r\ninterface ComponentState {\r\n documentFile: Document | undefined;\r\n filters: Partial<DocumentsFilterValues>;\r\n hasFiltersApplied: boolean;\r\n isDownloading: boolean;\r\n isPagedLoad: boolean;\r\n previewUrl: string;\r\n selectedItems: Document[];\r\n showEditor: boolean;\r\n sortMethod: SortStyle;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences,\r\n lcidMappings: state.resources.lcidMappings,\r\n tenant: state.tenant.id\r\n }),\r\n {\r\n deleteDocument: actions.deleteDocument,\r\n deleteDocuments: actions.deleteDocuments,\r\n disableDocument: actions.disableDocument,\r\n enableDocument: actions.enableDocument,\r\n getAttachedArticles: actions.getAttachedArticles,\r\n redirectTo: push,\r\n showEditor: actions.showEditor,\r\n showPreview: actions.showPreview\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(DocumentList);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport { DocumentsFilterValues, DocumentsListingPage } from \"../../models\";\r\n\r\nimport DocumentList from \"./documentList\";\r\n\r\nimport Tabs from \"pages/common/tabs\";\r\n\r\n\r\nimport \"../../styles/documentListing.sass\";\r\nimport { SortStyle } from \"utils/managementUtils\";\r\n\r\n\r\nconst allTab: number = 0;\r\nconst enabledTab: number = 1;\r\nconst scheduledTab: number = 2;\r\nconst disabledTab: number = 3;\r\n\r\n\r\nclass DocumentListing extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n hasRefreshed: false,\r\n selectedTab: 0\r\n };\r\n }\r\n\r\n public componentWillMount() {\r\n if (this.props.isInitialLoad || this.props.shouldFetch) {\r\n this.fetchLists();\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.shouldFetch && (this.props.shouldFetch !== prevProps.shouldFetch)) {\r\n this.fetchLists();\r\n }\r\n }\r\n\r\n public render() {\r\n const { selectedTab } = this.state;\r\n\r\n return (\r\n <React.Fragment>\r\n <div className=\"documents-listing\">\r\n <Tabs\r\n tabs={[\r\n { label: this.getTabLabel(\"All\", this.props.all), id: \"all-documents-tab\" },\r\n { label: this.getTabLabel(\"Enabled\", this.props.enabled), dotColor: \"green\", id: \"enabled-documents-tab\" },\r\n { label: this.getTabLabel(\"Scheduled\", this.props.scheduled), dotColor: \"yellow\", id: \"scheduled-documents-tab\" },\r\n { label: this.getTabLabel(\"Disabled\", this.props.disabled), dotColor: \"grey\", id: \"disabled-documents-tab\" }\r\n ]}\r\n selectedTab={selectedTab}\r\n onSelectTab={this.onSelectTab}\r\n />\r\n <DocumentList show={selectedTab === allTab} page={this.props.all} hasRefreshed={this.state.hasRefreshed} fetchPage={this.fetchAll} initialSort={SortStyle.publishDesc}/>\r\n <DocumentList show={selectedTab === enabledTab} page={this.props.enabled} hasRefreshed={this.state.hasRefreshed} fetchPage={this.fetchEnabled} initialSort={SortStyle.publishDesc}/>\r\n <DocumentList show={selectedTab === scheduledTab} page={this.props.scheduled} hasRefreshed={this.state.hasRefreshed} fetchPage={this.fetchScheduled} initialSort={SortStyle.publishDesc}/>\r\n <DocumentList show={selectedTab === disabledTab} page={this.props.disabled} hasRefreshed={this.state.hasRefreshed} fetchPage={this.fetchDisabled} initialSort={SortStyle.disableDesc}/>\r\n </div>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n\r\n private fetchLists = () => {\r\n this.setState({ hasRefreshed: false }, () => this.setState({ hasRefreshed: true }));\r\n this.fetchAll(1, {sortType: SortStyle.publishDesc});\r\n this.fetchEnabled(1, {sortType: SortStyle.publishDesc});\r\n this.fetchScheduled(1, {sortType: SortStyle.publishDesc});\r\n this.fetchDisabled(1, {sortType: SortStyle.disableDesc});\r\n this.props.clearShouldFetch();\r\n }\r\n\r\n\r\n private fetchAll = (pageNumber: number, filters: Partial<DocumentsFilterValues>, pageAmount?: number) => {\r\n !this.props.all.isFetching &&\r\n this.props.getAll(pageNumber, filters, pageAmount);\r\n }\r\n\r\n private fetchEnabled = (pageNumber: number, filters: Partial<DocumentsFilterValues>, pageAmount?: number) => {\r\n !this.props.enabled.isFetching &&\r\n this.props.getEnabled(pageNumber, filters, pageAmount);\r\n }\r\n\r\n private fetchScheduled = (pageNumber: number, filters: Partial<DocumentsFilterValues>, pageAmount?: number) => {\r\n !this.props.scheduled.isFetching &&\r\n this.props.getScheduled(pageNumber, filters, pageAmount);\r\n }\r\n\r\n private fetchDisabled = (pageNumber: number, filters: Partial<DocumentsFilterValues>, pageAmount?: number) => {\r\n !this.props.disabled.isFetching &&\r\n this.props.getDisabled(pageNumber, filters, pageAmount);\r\n }\r\n\r\n\r\n private getTabLabel = (label: string, page: DocumentsListingPage): string => {\r\n if (!!page.currentPage)\r\n return `${label} (${page.totalDocuments})`;\r\n return label;\r\n }\r\n\r\n private onSelectTab = (tabIndex: number) => {\r\n this.setState({ ...this.state, selectedTab: tabIndex });\r\n }\r\n}\r\n \r\n\r\ninterface ComponentProps {}\r\n\r\ninterface ComponentState {\r\n hasRefreshed: boolean;\r\n selectedTab: number;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n all: state.documents.all,\r\n enabled: state.documents.enabled,\r\n disabled: state.documents.disabled,\r\n scheduled: state.documents.scheduled,\r\n isFetching: state.documents.isFetching,\r\n isInitialLoad: state.documents.isInitialLoad,\r\n shouldFetch: state.documents.shouldFetch,\r\n tenantSettings: state.settings.tenantSettings,\r\n tenant: state.tenant.id\r\n }),\r\n {\r\n clearShouldFetch: actions.clearShouldFetch,\r\n getAll: actions.getDocuments,\r\n getDisabled: actions.getDisabledDocuments,\r\n getEnabled: actions.getEnabledDocuments,\r\n getScheduled: actions.getScheduledDocuments,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(DocumentListing);","import * as React from \"react\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as actions from \"../actionCreator\";\r\nimport * as audiencesActions from \"modules/audiences/actionCreator\";\r\nimport * as categoryTagsActions from \"modules/categorytags/actionCreator\";\r\n\r\nimport NewDocument from \"../components/action-buttons/newDocument\";\r\nimport DocumentListing from \"../components/document-listing/documentListing\";\r\n\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Header from \"pages/common/header\";\r\nimport MainContent from \"pages/common/mainContent\";\r\n\r\n\r\nclass DocumentManagementPage extends React.Component<PropsWithRedux, {}> {\r\n public componentDidMount() {\r\n if (!this.props.audiences.length)\r\n this.props.getAudiences();\r\n if (!this.props.categoryTags.length)\r\n this.props.getCategoryTags();\r\n }\r\n\r\n public render() {\r\n return (\r\n <BasePage fullWidth>\r\n <Header\r\n title=\"Manage Documents\"\r\n rightComponent={\r\n <React.Fragment>\r\n <NewDocument />\r\n </React.Fragment>\r\n }\r\n />\r\n <MainContent>\r\n <div className=\"authoring-page\">\r\n <DocumentListing />\r\n <ErrorSnackbar errorMessage={this.props.errorMessage} clearErrorMessage={this.props.clearErrorMessage} />\r\n <LoadingOverlay absolute={true} show={this.props.isDeleting || this.props.isFetching || this.props.isSaving} />\r\n </div>\r\n </MainContent>\r\n </BasePage>\r\n );\r\n }\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences,\r\n categoryTags: state.categoryTags.userCategoryTags,\r\n errorMessage: state.documents.errorMessage,\r\n isDeleting: state.documents.isDeleting,\r\n isFetching: state.documents.isFetching,\r\n isSaving: state.documents.isSaving\r\n }),\r\n {\r\n clearErrorMessage: actions.clearErrorMessage,\r\n getAudiences: audiencesActions.getAudiences,\r\n getCategoryTags: categoryTagsActions.getUserCategoryTags\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(DocumentManagementPage);\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport { Document, DocumentProperties } from \"../../../models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport Snackbar from \"@mui/material/Snackbar\";\r\n\r\nimport Alert from '@mui/material/Alert';\r\n\r\nimport moment from \"moment\";\r\n\r\n\r\nclass DocumentSummary extends React.Component<PropsWithRedux, ComponentState> {\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public render() {\r\n const { document, documentProperties } = this.props;\r\n\r\n if (!document || !documentProperties)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n return (\r\n <Dialog\r\n open={this.props.show}\r\n maxWidth={false}\r\n scroll=\"paper\"\r\n onClose={this.onClose}\r\n classes={{ paper: \"document-summary\" }}\r\n >\r\n <DialogTitle className=\"document-summary-title\">\r\n <div>One last check!</div>\r\n <div>\r\n <Button variant=\"text\" onClick={this.onClose}>Keep editing</Button>\r\n <Button variant=\"contained\" color=\"primary\" onClick={this.props.onPublish}>Publish</Button>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent style={{paddingBottom: 6}}>\r\n <div>\r\n <div className=\"document-summary-properties\">\r\n <div>\r\n <div>File name</div>\r\n <div>{document.fileName}</div>\r\n </div>\r\n {!!documentProperties.title &&\r\n <div>\r\n <div>Title</div>\r\n <div>{documentProperties.title}</div>\r\n </div>\r\n }\r\n {!!documentProperties.description &&\r\n <div>\r\n <div>Description</div>\r\n <div>{documentProperties.description}</div>\r\n </div>\r\n }\r\n {!!documentProperties.lcid &&\r\n <div>\r\n <div>Language</div>\r\n <div>{this.props.lcidMappings[documentProperties.lcid].language}</div>\r\n </div>\r\n }\r\n <div>\r\n <div>Availability</div>\r\n <div>\r\n {documentProperties.availability === \"attachmentOnly\"\r\n ? \"Attachment only\"\r\n : \"Online only\"\r\n }\r\n </div>\r\n </div>\r\n <div>\r\n <div>State</div>\r\n <div>{this.formatState()}</div>\r\n </div>\r\n <div>\r\n <div>Accessible to</div>\r\n <div>\r\n {(!!documentProperties.accessibleAudiences && !!documentProperties.accessibleAudiences.length)\r\n ? this.formatAudiences(documentProperties.accessibleAudiences)\r\n : \"All users\"\r\n }\r\n </div>\r\n </div>\r\n {!!documentProperties.notifiedAudiences && !!documentProperties.notifiedAudiences.length &&\r\n <div>\r\n <div>Notified audiences</div>\r\n <div>{this.formatAudiences(documentProperties.notifiedAudiences)}</div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </DialogContent>\r\n <Snackbar open={!!this.props.errorMessage} anchorOrigin={{ vertical: \"top\", horizontal: \"right\" }} autoHideDuration={6000} onClose={this.props.clearErrorMessage}>\r\n <Alert variant=\"filled\" severity=\"error\" elevation={6} onClose={this.props.clearErrorMessage}>{this.props.errorMessage}</Alert>\r\n </Snackbar>\r\n <LoadingOverlay show={this.props.isSaving} styles={{ paddingTop: 150 }} />\r\n </Dialog>\r\n );\r\n }\r\n\r\n private formatAudiences = (audiences: string[]): string => {\r\n const matchedAudiences: string[] = audiences.map((accessibleAudience) => {\r\n const matchedAudience = this.props.audiences.find((audience) => audience.id === accessibleAudience);\r\n if (!matchedAudience)\r\n return \"\";\r\n\r\n return matchedAudience.displayName;\r\n });\r\n\r\n return matchedAudiences.join(\", \");\r\n }\r\n\r\n private formatState = () => {\r\n if (!this.props.documentProperties.enabled)\r\n return \"Disabled\";\r\n else if (!this.props.documentProperties.publishingTime || (moment(this.props.documentProperties.publishingTime) <= moment()))\r\n return \"Enabled\";\r\n else\r\n return `Scheduled for ${moment(this.props.documentProperties.publishingTime).format(\"MMM D, YYYY\")}`;\r\n }\r\n\r\n private onClose = () => {\r\n this.props.onClose();\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n document: Partial<Document>;\r\n documentProperties: Partial<DocumentProperties>;\r\n onPublish: () => void;\r\n onClose: () => void;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences,\r\n errorMessage: state.documents.errorMessage,\r\n isSaving: state.documents.isSaving,\r\n lcidMappings: state.resources.lcidMappings\r\n }),\r\n {\r\n clearErrorMessage: actions.clearErrorMessage\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(DocumentSummary);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { Prompt } from \"react-router-dom\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport moment from \"moment\";\r\n\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Breadcrumb from \"pages/common/breadcrumb\";\r\nimport Columns from \"pages/common/columns\";\r\nimport MainContent from \"pages/common/mainContent\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport { Document, DocumentProperties, Notifications, NotificationRange } from \"../../models\";\r\nimport DocumentSummary from \"./components/documentSummary\";\r\nimport DocumentUploader from \"./components/documentUploader\";\r\nimport DocumentPropertiesEditor from \"./documentProperties\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport ButtonGroup from \"@mui/material/ButtonGroup\";\r\nimport ClickAwayListener from \"@mui/material/ClickAwayListener\";\r\nimport Hidden from \"@mui/material/Hidden\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\n\r\nimport ArrowDropDownIcon from \"@mui/icons-material/ArrowDropDown\";\r\n\r\n\r\nimport \"modules/common/components/authoring/authoring.sass\";\r\n\r\n\r\nclass DocumentCreation extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n const document = { ...this.getNewDocument() };\r\n\r\n this.state = {\r\n document: document,\r\n documentProperties: {},\r\n hasError: false,\r\n isFetching: false,\r\n showNotificationSettings: false,\r\n showSummary: false,\r\n showTabCommandList: false\r\n };\r\n }\r\n\r\n componentWillMount() {\r\n this.props.clearChangedSinceSaved();\r\n }\r\n\r\n componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public render() {\r\n const { document } = this.state;\r\n\r\n return (\r\n <BasePage fullWidth>\r\n <Prompt when={this.props.changedSinceSaved} message=\"You have unsaved changes, are you sure you want to leave this page?\" />\r\n <Breadcrumb\r\n items={[\r\n { title: \"Documents\", link: \"~/admin/documents\" },\r\n { title: \"Create new document\" }\r\n ]}\r\n backItem={{ title: \"Back to Manage Documents\", onClick: this.onBackToManageDocuments }}\r\n rightComponent={this.getCommands()}\r\n />\r\n <Columns\r\n leftComponent={\r\n <MainContent>\r\n <div>\r\n <DocumentUploader\r\n acceptedFiles=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document,image/jpeg,application/pdf,image/png,application/vnd.openxmlformats-officedocument.presentationml.presentation,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\r\n message=\"Choose or drag a file here to add a new document\"\r\n showSupportedFileTypes\r\n onUpload={this.onUpload}\r\n />\r\n </div>\r\n </MainContent>\r\n }\r\n rightComponent={\r\n <MainContent>\r\n <div className=\"authoring-page\">\r\n {this.state.isFetching\r\n ? <Loading />\r\n : this.state.hasError\r\n ? <div className=\"no-event-data\">This document could not be loaded.</div>\r\n : <DocumentPropertiesEditor\r\n document={document}\r\n documentProperties={this.state.documentProperties}\r\n isUnpublished\r\n onChange={this.onChangeDocumentProperties}\r\n />\r\n }\r\n <ErrorSnackbar errorMessage={this.props.errorMessage} clearErrorMessage={this.props.clearErrorMessage} />\r\n <LoadingOverlay absolute={true} show={this.props.isDeleting || this.props.isSaving} />\r\n </div>\r\n </MainContent>\r\n }\r\n />\r\n <DocumentSummary show={this.state.showSummary} document={this.state.document} documentProperties={this.state.documentProperties} onPublish={this.publishDocument} onClose={this.onHideSummary} />\r\n {/* <NotificationSettings show={this.state.showNotificationSettings} isPreviouslyPublished={false} notifications={document.notifications} type=\"document\" onChangeNotifications={this.onChangeNotifications} onClose={this.onHideNotificationSettings} /> */}\r\n </BasePage>\r\n );\r\n }\r\n\r\n private getCommands = (): JSX.Element => {\r\n return (\r\n <React.Fragment>\r\n <Hidden mdUp>\r\n <div className=\"event-tab-command\">\r\n <ButtonGroup variant=\"contained\" color=\"primary\">\r\n <Button disabled={!this.state.document.id} onClick={this.publishDocument}>Publish</Button>\r\n <Button color=\"primary\" size=\"small\" onClick={this.onShowTabCommandList}>\r\n <ArrowDropDownIcon />\r\n </Button>\r\n </ButtonGroup>\r\n {this.state.showTabCommandList &&\r\n <ClickAwayListener onClickAway={this.onHideTabCommandList}>\r\n <List className=\"event-tab-command-list\">\r\n <ListItem button onClick={this.cancelDocument}>\r\n <ListItemText primary=\"Cancel\" />\r\n </ListItem>\r\n </List>\r\n </ClickAwayListener>\r\n }\r\n </div>\r\n </Hidden>\r\n <Hidden mdDown>\r\n <Button variant=\"text\" onClick={this.cancelDocument}>Cancel</Button>\r\n <Button variant=\"contained\" color=\"primary\" disabled={!this.state.document.id} onClick={this.onShowSummary}>Publish</Button>\r\n </Hidden>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private getNewDocument = (): Partial<Document> => {\r\n const { notificationSettings, tenantSettings } = this.props;\r\n\r\n const lcid: string = tenantSettings ? tenantSettings.defaultLCID : \"en-us\";\r\n\r\n const document: Partial<Document> = {\r\n lcid: lcid,\r\n notifications: {\r\n emailOnPublish: notificationSettings.defaultEventSettings?.emailOnPublish as NotificationRange || \"none\",\r\n mobileOnPublish: notificationSettings.defaultEventSettings?.mobileOnPublish as NotificationRange || \"subscribers\",\r\n reminders: [],\r\n smsOnPublish: notificationSettings.defaultEventSettings?.smsOnPublish as NotificationRange || \"none\",\r\n teamsOnPublish: notificationSettings.defaultEventSettings?.teamsOnPublish as NotificationRange || \"subscribers\"\r\n }\r\n };\r\n return document;\r\n }\r\n\r\n private onBackToManageDocuments = async () => {\r\n if (this.props.changedSinceSaved) {\r\n if (!(await confirm.show({\r\n title: \"Back to Manage Documents\",\r\n text: (\r\n <div style={{ minWidth: 400 }}>\r\n <div style={{ fontWeight: 500 }}>Your changes will not be saved.</div>\r\n <br />\r\n <div>Do you want to continue?</div>\r\n </div>\r\n ),\r\n yesText: \"Keep editing\",\r\n noText: \"Exit\"\r\n }))) {\r\n this.props.clearChangedSinceSaved();\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/documents\");\r\n }\r\n } else {\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/documents\");\r\n }\r\n }\r\n\r\n private onChangeDocumentProperties = (value: Partial<DocumentProperties>) => {\r\n const documentProperties = { ...this.state.documentProperties, ...value };\r\n this.setState({ documentProperties: documentProperties });\r\n this.props.hasChangedSinceSaved();\r\n }\r\n\r\n private onChangeNotifications = (notifications: Notifications) => {\r\n this.onChangeDocumentProperties({ notifications });\r\n }\r\n\r\n\r\n private onHideNotificationSettings = () => {\r\n this.setState({ showNotificationSettings: false });\r\n }\r\n\r\n private onHideSummary = () => {\r\n this.setState({ showSummary: false });\r\n }\r\n\r\n private onHideTabCommandList = () => {\r\n this.setState({ showTabCommandList: false });\r\n }\r\n\r\n private onShowNotificationSettings = () => {\r\n this.setState({ showNotificationSettings: true });\r\n }\r\n\r\n private onShowSummary = () => {\r\n this.setState({ showSummary: true });\r\n }\r\n\r\n private onShowTabCommandList = () => {\r\n this.setState({ showTabCommandList: true });\r\n }\r\n\r\n private onUpload = (file: File, onProgress, onLoad, onError, onAbort): Promise<Document> => {\r\n return this.props.uploadFile(file, onProgress, onLoad, onError, onAbort).then((document) => {\r\n const documentProperties: Partial<DocumentProperties> = {\r\n accessibleAudiences: document.audiences.map(audience => audience.id),\r\n availability: document.availability,\r\n description: document.description,\r\n enabled: true,\r\n lcid: document.lcid,\r\n notifications: document.notifications,\r\n notifiedAudiences: [],\r\n publishingTime: document.state === \"scheduled\" ? document.published.date : \"\",\r\n tags: document.tags.map(tag => tag.id),\r\n title: document.title\r\n };\r\n this.setState({ document, documentProperties });\r\n return document;\r\n });\r\n }\r\n\r\n private cancelDocument = () => {\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/documents\");\r\n }\r\n\r\n private publishDocument = () => {\r\n if(!this.state.documentProperties.tags || this.state.documentProperties.tags?.length === 0) {\r\n let uncategorizedTag = this.props.categoryTags.find(t => t.name === \"Uncategorized\");\r\n let newProperties = this.state.documentProperties;\r\n newProperties.tags = [uncategorizedTag!.id];\r\n this.setState({documentProperties: newProperties});\r\n }\r\n\r\n this.onHideSummary();\r\n this.props.updateDocumentProperties(this.state.document.id!, this.state.documentProperties!).then((succeeded) => {\r\n if (succeeded)\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/documents\");\r\n });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {}\r\n\r\ninterface ComponentState {\r\n document: Partial<Document>;\r\n documentProperties: Partial<DocumentProperties>;\r\n hasError: boolean;\r\n isFetching: boolean;\r\n showNotificationSettings: boolean;\r\n showSummary: boolean;\r\n showTabCommandList: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n changedSinceSaved: state.documents.changedSinceSaved,\r\n errorMessage: state.documents.errorMessage,\r\n isDeleting: state.documents.isDeleting,\r\n isSaving: state.documents.isSaving,\r\n\r\n notificationSettings: state.settings.notificationSettings,\r\n tenant: state.tenant.id,\r\n tenantSettings: state.settings.tenantSettings,\r\n categoryTags: state.categoryTags.userCategoryTags\r\n }),\r\n {\r\n clearChangedSinceSaved: actions.clearChangedSinceSaved,\r\n clearErrorMessage: actions.clearErrorMessage,\r\n // deleteDocuments: actions.deleteDocuments,\r\n hasChangedSinceSaved: actions.hasChangedSinceSaved,\r\n updateDocumentProperties: actions.updateDocumentProperties,\r\n uploadFile: actions.uploadFile,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(DocumentCreation);\r\n","import { Menu, MenuItem } from '@mui/material';\r\nimport IconButton from '@mui/material/IconButton';\r\nimport SvgIcon from '@mui/material/SvgIcon';\r\nimport Loading from 'modules/common/components/loading';\r\nimport * as React from 'react';\r\n\r\ninterface ComponentProps {\r\n downloadExcel: () => void;\r\n downloadImage: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n anchor: null | HTMLElement\r\n}\r\n\r\nexport default class DownloadIcon extends React.Component<ComponentProps, ComponentState> {\r\n\r\n constructor(props){\r\n super(props);\r\n this.state = {\r\n anchor: null\r\n };\r\n }\r\n\r\n showLoadingSpinner = () => {\r\n return (\r\n <div style={{marginLeft: \"auto\", position: \"relative\", top: \"-10px\", height: \"20px\"}}>\r\n <Loading style={{width: \"18px\", height: \"18px\"}}/>\r\n </div>\r\n )\r\n }\r\n\r\n handleClose = () => {\r\n this.setState({...this.state, anchor: null})\r\n }\r\n\r\n handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\r\n this.setState({...this.state, anchor: event.currentTarget})\r\n }\r\n\r\n public render() {\r\n return (\r\n <React.Fragment>\r\n <IconButton\r\n aria-label=\"download-top-event\"\r\n aria-controls={Boolean(this.state.anchor) ? 'basic-menu' : undefined}\r\n aria-haspopup=\"true\"\r\n aria-expanded={Boolean(this.state.anchor) ? 'true' : undefined}\r\n color=\"primary\"\r\n onClick={this.handleClick}\r\n size=\"large\">\r\n <SvgIcon viewBox='0 0 48 48'>\r\n <path d=\"M11 40q-1.2 0-2.1-.9Q8 38.2 8 37v-7.15h3V37h26v-7.15h3V37q0 1.2-.9 2.1-.9.9-2.1.9Zm13-7.65-9.65-9.65 2.15-2.15 6 6V8h3v18.55l6-6 2.15 2.15Z\"/>\r\n </SvgIcon>\r\n </IconButton>\r\n <Menu\r\n id=\"report-menu\"\r\n anchorEl={this.state.anchor}\r\n open={Boolean(this.state.anchor)}\r\n onClick={this.handleClose}\r\n onClose={this.handleClose}\r\n MenuListProps={{\r\n 'aria-labelledby': 'report-button',\r\n }}\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n transformOrigin={{ vertical: \"top\", horizontal: \"right\" }}\r\n PaperProps={{\r\n style: {\r\n transform: 'translateY(6px)',\r\n }\r\n }}\r\n >\r\n <MenuItem style={{width: \"250px\"}} onClick={this.props.downloadImage}>\r\n Download as an Image\r\n </MenuItem>\r\n <MenuItem onClick={this.props.downloadExcel}>\r\n Download Excel Report\r\n </MenuItem>\r\n </Menu>\r\n </React.Fragment>\r\n );\r\n }\r\n}","import { Button, Dialog, DialogContent, DialogTitle, IconButton, Typography } from '@mui/material';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport * as React from 'react';\r\n\r\nconst ContentDeletedDialog: React.FunctionComponent<ComponentProps> = (props) => {\r\n return (\r\n <Dialog open={props.isOpen} onClose={props.closeDialog}>\r\n <DialogTitle style={{paddingBottom: \"0px\"}}>\r\n <div style={{display: \"flex\", flexDirection: \"row\"}}>\r\n <Typography variant=\"h2\"><span style={{textTransform: \"capitalize\"}}>{props.contentType}</span> is no longer available</Typography>\r\n <IconButton\r\n onClick={props.closeDialog}\r\n style={{marginLeft: \"auto\", position: \"relative\", top: \"-12px\"}}\r\n size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent>\r\n <div style={{display: \"flex\", flexDirection: \"column\"}}>\r\n Unfortunately, this {props.contentType} has been deleted and no longer exists in your platform.\r\n <Button onClick={props.closeDialog} style={{marginLeft: \"auto\", marginTop: \"20px\"}}>{props.returnButtonText}</Button>\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n contentType: string;\r\n returnButtonText: string;\r\n isOpen: boolean;\r\n closeDialog: () => void;\r\n}\r\n\r\nexport default ContentDeletedDialog;","import * as React from 'react';\r\nimport { browserHistory } from 'configureStore';\r\nimport TenantLink from 'modules/common/components/tenantLink';\r\nimport { PlatformAnalyticsReport, PostStats } from 'modules/insights/models';\r\nimport { HorizontalBarChart, HBarChartProps, HBarChartDataPoint } from 'modules/insights/components/charts/horizontalBarChart';\r\nimport '../styles/top-posts.sass';\r\nimport WindowResizeListener from 'modules/common/components/window-resize-listener';\r\nimport { FormattedMessage, injectIntl, IntlShape } from \"react-intl\";\r\nimport {connect, ConnectedProps} from \"react-redux\";\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport Loading from 'modules/common/components/loading';\r\nimport EmptyDataMessage from '../../emptyDataMessage';\r\nimport DownloadIcon from '../../downloadIconSvg';\r\nimport ContentDeletedDialog from 'modules/common/components/contentDeletedDialog';\r\n\r\nclass TopPosts extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n \r\n this.state = {\r\n warningOpen: false\r\n };\r\n }\r\n\r\n private _chart: HorizontalBarChart;\r\n private _chartElement: HTMLElement;\r\n\r\n public componentDidMount() {\r\n this._chart = new HorizontalBarChart(this.getBarChartState());\r\n this.props.loadData();\r\n }\r\n\r\n public componentDidUpdate() {\r\n if (this._chart && !this.props.loading) {\r\n this._chart.update(this.getBarChartState());\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n if (this._chart) {\r\n this._chart.destroy();\r\n }\r\n }\r\n\r\n public render() {\r\n return <div id={PlatformAnalyticsReport.mostViewedPost} className=\"analytics-widget\">\r\n <div className='downloadIcon' id={`${PlatformAnalyticsReport.mostViewedPost}-downloadIcon`} style={{float:'right'}}> \r\n <DownloadIcon\r\n downloadExcel={this.props.downloadExcel}\r\n downloadImage={this.props.downloadImage}\r\n />\r\n </div>\r\n <div className=\"header\">\r\n Top 10 Posts with Most Views\r\n </div>\r\n <div className=\"body\">\r\n {\r\n this.props.loading ?\r\n <div className=\"loading-styling\">\r\n <Loading/>\r\n </div> :\r\n <div>\r\n {this.props.posts && this.props.posts.length > 0 ?\r\n <div ref={this.callbackRef} className=\"bar-chart-widget top-posts\"></div>\r\n\r\n : <div className=\"no-data-display\">\r\n <EmptyDataMessage/>\r\n </div> }\r\n </div>\r\n }\r\n <WindowResizeListener onChange={() => this._chart.update(this.getBarChartState())} />\r\n </div>\r\n <ContentDeletedDialog \r\n isOpen={this.state.warningOpen}\r\n contentType={\"post\"}\r\n returnButtonText={\"Back to Platform Analytics\"}\r\n closeDialog={this.closeDialog}\r\n />\r\n <footer id={`${PlatformAnalyticsReport.mostViewedPost}-goto`}>\r\n {!this.props.loading &&\r\n <TenantLink to={`~/admin/posts`}>\r\n <FormattedMessage id=\"insights.viewAllPosts\" defaultMessage=\"Go to Manage Posts\" />\r\n </TenantLink>\r\n }\r\n </footer>\r\n </div>\r\n }\r\n\r\n private callbackRef = (e) => {\r\n this._chartElement = e;\r\n }\r\n\r\n private getTopNPosts(n: number): PostStats[] {\r\n return (this.props.posts || []).filter(post => {\r\n return post.postOpenCount > 0;\r\n }).slice(0, n);\r\n }\r\n\r\n private getBarChartState = (): HBarChartProps => {\r\n return {\r\n el: this._chartElement,\r\n width: '100%',\r\n height: 'auto',\r\n barHeight: 20,\r\n data: this.getTopNPosts(10).map(post => {\r\n return {\r\n id: post.id,\r\n label: post.title,\r\n value: post.postOpenCount,\r\n onClick: this.handlePostClick,\r\n locale: this.props.locale\r\n };\r\n }),\r\n labelWidth: 200,\r\n } as HBarChartProps;\r\n }\r\n\r\n private handlePostClick = (p: HBarChartDataPoint) => {\r\n //Check if post is deleted.\r\n let postToCheck = this.props.posts.find(post => post.id === p.id);\r\n if(postToCheck) {\r\n if(postToCheck.isDeleted) {\r\n this.setState({ warningOpen: true });\r\n }\r\n else {\r\n browserHistory.push(`/${this.props.tenant}/admin/posts/${p.id}#insights`);\r\n }\r\n }\r\n }\r\n\r\n private closeDialog = () => {\r\n this.setState({warningOpen: false});\r\n }\r\n}\r\n\r\ninterface ComponentState {\r\n warningOpen: boolean;\r\n}\r\n\r\ninterface ComponentProps {\r\n loading?: boolean,\r\n tenant: string,\r\n posts: PostStats[],\r\n intl: IntlShape;\r\n loadData: () => void;\r\n downloadExcel: () => void;\r\n downloadImage: () => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n locale: state.localization.locale\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default injectIntl(connector(TopPosts));\r\n","import * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport moment from 'moment';\r\nimport TopPosts from './components/topPosts';\r\n\r\nimport shallowEquals from 'utils/shallowEquals';\r\nimport { insightsApi } from 'api/instances';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport { AnalyticsReportFilters } from 'modules/insights';\r\n\r\n\r\nclass TopPostsContainer extends React.Component<PropsWithRedux, ComponentState> {\r\n private _isMounted = false;\r\n \r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n posts: [],\r\n isLoadingTopPostsAnalyticsOverview: false\r\n }\r\n }\r\n\r\n public componentDidMount() {\r\n this._isMounted = true;\r\n }\r\n\r\n public shouldComponentUpdate(nextProps: ComponentProps, nextState: ComponentState) {\r\n if(nextProps.reportFilter !== this.props.reportFilter) {\r\n this.fetchDataForMyComponent(nextProps.reportFilter);\r\n }\r\n return !shallowEquals(this.props, nextProps)\r\n || !shallowEquals(this.state, nextState)\r\n }\r\n\r\n public componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n\r\n public render() {\r\n moment.locale(\"en\");\r\n\r\n return <TopPosts\r\n posts={this.state.posts}\r\n tenant={this.props.tenantId}\r\n loadData={() => {\r\n this.fetchDataForMyComponent(this.props.reportFilter);\r\n }}\r\n loading={this.state.isLoadingTopPostsAnalyticsOverview}\r\n downloadExcel = {this.props.downloadExcel}\r\n downloadImage = {this.props.downloadImage}\r\n />\r\n }\r\n\r\n private fetchDataForMyComponent = (reportFilter: AnalyticsReportFilters) => {\r\n this.setState(prev => ({ ...prev, isLoadingTopPostsAnalyticsOverview: true}));\r\n insightsApi.GetTopPostsFromInsights(reportFilter)\r\n .then(results => {\r\n if (this._isMounted) {\r\n this.setState((prevState) => ({\r\n ...prevState,\r\n posts: results,\r\n isLoadingTopPostsAnalyticsOverview: false\r\n }))\r\n }\r\n })\r\n .catch(error => {\r\n this.setState((prevState, props) => ({\r\n ...this.state,\r\n isLoadingTopPostsAnalyticsOverview: false,\r\n error: error\r\n }))\r\n });\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n reportFilter: AnalyticsReportFilters;\r\n downloadExcel: () => void;\r\n downloadImage: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n isLoadingTopPostsAnalyticsOverview: boolean,\r\n posts: any[],\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(TopPostsContainer);\r\n","import {select, scaleBand, selectAll, scaleLinear, max, axisBottom} from 'd3';\r\nconst d3 = { select, scaleBand, selectAll, scaleLinear, max, axisBottom };\r\n\r\nexport interface VBarChartProps {\r\n el: any;\r\n height: number;\r\n data: VBarChartDataPoint[];\r\n labelBars: boolean;\r\n showOnHover: boolean;\r\n locale?: string;\r\n}\r\n\r\nexport interface VBarChartDataPoint {\r\n id: string;\r\n label: string;\r\n value: number;\r\n onClick?: (point: VBarChartDataPoint) => any;\r\n}\r\n\r\nexport class VerticalBarChart {\r\n\r\n constructor(props: VBarChartProps) {\r\n this.update(props);\r\n }\r\n\r\n public update(props: VBarChartProps) {\r\n\r\n if (!props.el) {\r\n return;\r\n }\r\n\r\n const boundingRect = props.el.getBoundingClientRect();\r\n\r\n d3.select(props.el)\r\n .select('svg').remove();\r\n\r\n // set the dimensions and margins of the graph\r\n const margin = {top: 20, right: 20, bottom: 40, left: 20},\r\n width = boundingRect.width - margin.left - margin.right,\r\n height = props.height - margin.top - margin.bottom;\r\n\r\n // set the ranges\r\n const x = d3.scaleBand()\r\n .range([0, width])\r\n .padding(0.1);\r\n const y = d3.scaleLinear()\r\n .range([height, 0]);\r\n\r\n d3.select('body').append('div')\r\n .attr('class', 'bar-chart-tooltip')\r\n .style('opacity', 0);\r\n\r\n // append the svg object to the body of the page\r\n // append a 'group' element to 'svg'\r\n // moves the 'group' element to the top left margin\r\n const svgTranslate = `translate(${margin.left}, ${margin.top})`;\r\n const svg = d3.select(props.el)\r\n .append('svg')\r\n .attr('width', width + margin.left + margin.right)\r\n .attr('height', height + margin.top + margin.bottom)\r\n .append('g')\r\n .attr('transform', svgTranslate);\r\n\r\n // Scale the range of the data in the domains\r\n x.domain(props.data.map(function(d) { return d.label; }));\r\n y.domain([0, d3.max(props.data, function(d) { return d.value; })!]);\r\n\r\n // append the rectangles for the bar chart\r\n const bar = svg.selectAll('.bar')\r\n .data(props.data)\r\n .enter()\r\n .append('g')\r\n // allow the class that is using this to\r\n // decide if value will appear when user hovers\r\n // over the bar\r\n .attr('class', props.showOnHover ? 'bar-group' : '')\r\n\r\n bar.append('rect')\r\n .attr('class', 'bar')\r\n .attr('x', (d) => x(d.label)! )\r\n .attr('width', x.bandwidth())\r\n .attr('y', function (d) { return y(d.value); })\r\n .attr('height', function (d) { return height - y(d.value); });\r\n\r\n if (props.labelBars) {\r\n bar.append('text')\r\n .attr('class', 'top-label')\r\n .text((d) => d.value)\r\n .attr('x', (d) => x(d.label)! )\r\n .attr('y', (d) => y(d.value) )\r\n .attr('transform', function (d) {\r\n const xOffset = (x.bandwidth() / 2 - (this as any).getBBox().width / 2);\r\n return 'translate(' + xOffset + ', -5)'\r\n });\r\n }\r\n // add the x Axis\r\n svg.append('g')\r\n .attr('transform', 'translate(0,' + height + ')')\r\n .call(d3.axisBottom(x));\r\n }\r\n\r\n public destroy() {\r\n // Any clean-up would go here\r\n // in this example there is nothing to do\r\n }\r\n}\r\n\r\n","import * as React from 'react';\r\nimport { PlatformAnalyticsReport, UserCount } from '../models';\r\nimport { VerticalBarChart, VBarChartProps, VBarChartDataPoint } from './charts/verticalBarChart';\r\nimport WindowResizeListener from 'modules/common/components/window-resize-listener';\r\nimport moment from 'moment';\r\nimport {injectIntl, IntlShape} from \"react-intl\";\r\nimport {connect, ConnectedProps} from \"react-redux\";\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport Loading from 'modules/common/components/loading';\r\nimport EmptyDataMessage from './emptyDataMessage';\r\nimport InfoHover from 'modules/common/components/hovers/infoHover';\r\nimport DownloadIcon from './downloadIconSvg';\r\n\r\ninterface ComponentProps {\r\n loading?: boolean\r\n userCounts: UserCount[] | null;\r\n intl: IntlShape;\r\n startDate: string;\r\n endDate: string;\r\n downloadImage: () => void;\r\n downloadExcel: () => void;\r\n}\r\n\r\ninterface ComponentState { \r\n widthToUse: string;\r\n itemsToDisplay: number;\r\n}\r\n\r\nclass UsersByMonth extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n widthToUse: \"2400px\",\r\n itemsToDisplay: 2\r\n }\r\n }\r\n\r\n private _chart: VerticalBarChart;\r\n private _chartElement: HTMLElement;\r\n\r\n public componentDidMount() {\r\n this._chart = new VerticalBarChart(this.getChartState());\r\n }\r\n\r\n public componentDidUpdate() {\r\n if (this._chart) {\r\n this._chart.update(this.getChartState());\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n if (this._chart) {\r\n this._chart.destroy();\r\n }\r\n }\r\n\r\n\r\n public render() {\r\n moment.locale(\"en\");\r\n\r\n return <div className=\"analytics-widget\" >\r\n <div className='downloadIcon' id={`${PlatformAnalyticsReport.engagedUsers}-downloadIcon`}> \r\n <DownloadIcon\r\n downloadExcel={this.props.downloadExcel}\r\n downloadImage={this.props.downloadImage}\r\n />\r\n </div>\r\n <div style={{overflowX: \"auto\"}}>\r\n <div id={PlatformAnalyticsReport.engagedUsers} style={ this.state.itemsToDisplay > 7 ? {width: this.state.widthToUse, backgroundColor: '#fff'} : { backgroundColor: '#fff'}}>\r\n <div className=\"header\" style={{display: \"flex\", flexDirection: \"row\", marginTop: \"5px\", position: \"absolute\"}}>\r\n Engaged Users\r\n <div className=\"tooltip-placement\" >\r\n <InfoHover>Engaged Users have opened at least one post or event within the timeframe you've selected.</InfoHover>\r\n </div>\r\n </div>\r\n <div style={{height: \"10px\"}}>\r\n </div>\r\n <div className=\"body\" style={{marginTop: \"40px\"}}>\r\n {\r\n this.props.loading ?\r\n <div style={{position: \"relative\", top: \"55px\"}}>\r\n <Loading/>\r\n </div> :\r\n <div>\r\n {this.props.userCounts && this.props.userCounts.length > 0 ?\r\n <div>\r\n <div \r\n ref={(e) => this._chartElement = e!} \r\n className=\"dashboard-chart-widget\"\r\n style={ this.state.itemsToDisplay > 7 ? {width: this.state.widthToUse} : {}}\r\n >\r\n </div>\r\n <WindowResizeListener onChange={() => this._chart.update(this.getChartState())} />\r\n </div> \r\n : <EmptyDataMessage/> }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n private getChartState = (): VBarChartProps => {\r\n let userCounts = this.props.userCounts ?? [];\r\n \r\n //Use first relevant month and skip over the empty ones.\r\n userCounts = this.getRelevantMonth(userCounts);\r\n\r\n let useShortLabels = userCounts.length > 1 || moment(this.props.startDate, \"MMM D, YYYY, h:mmA\").month() !== moment(this.props.endDate, \"MMM D, YYYY, h:mmA\").month();\r\n\r\n let widthToUse = Math.max((userCounts.length * 80), 380).toString() + \"px\"\r\n if(this.state.widthToUse !== widthToUse) {\r\n this.setState({widthToUse, itemsToDisplay: userCounts.length});\r\n }\r\n\r\n let longLabelToUse = `${moment(this.props.startDate, \"MMM D, YYYY, h:mmA\").format(\"MMM DD, YYYY\")} - ${moment(this.props.endDate, \"MMM D, YYYY, h:mmA\").format(\"MMM DD, YYYY\")}`;\r\n\r\n return {\r\n el: this._chartElement,\r\n locale: this.props.locale,\r\n height: 200,\r\n data: userCounts\r\n .map((range, index) => {\r\n return {\r\n x: index,\r\n value: range.countOfUsers,\r\n label: useShortLabels ? moment(range.dateRounded).format('MMM YYYY') \r\n : longLabelToUse,\r\n id: index.toString()\r\n } as VBarChartDataPoint;\r\n }),\r\n labelBars: true\r\n } as VBarChartProps;\r\n }\r\n\r\n private getRelevantMonth = (userCounts: UserCount[]) => {\r\n if (userCounts.length > 0) {\r\n let oldestValidData = userCounts.findIndex(u => u.countOfUsers > 0);\r\n if (oldestValidData === -1)\r\n oldestValidData = 0;\r\n \r\n userCounts = userCounts.slice(oldestValidData);\r\n }\r\n return userCounts;\r\n }\r\n}\r\n\r\n\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n locale: state.localization.locale\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default injectIntl(connector(UsersByMonth));\r\n\r\n","import {select, scaleBand, selectAll, scaleLinear, max, axisBottom} from 'd3';\r\nconst d3 = { select, scaleBand, selectAll, scaleLinear, max, axisBottom };\r\n\r\nexport interface VBarChartProps {\r\n el: any;\r\n height: number;\r\n data: VBarChartDataPoint[];\r\n labelBars: boolean;\r\n showOnHover: boolean;\r\n locale?: string;\r\n}\r\n\r\nexport interface VBarChartDataPoint {\r\n id: string;\r\n label: string;\r\n value: number;\r\n valueSecond: number;\r\n onClick?: (point: VBarChartDataPoint) => any;\r\n}\r\n\r\nexport class VerticalBarChart {\r\n\r\n constructor(props: VBarChartProps) {\r\n this.update(props);\r\n }\r\n\r\n public update(props: VBarChartProps) {\r\n\r\n if (!props.el) {\r\n return;\r\n }\r\n\r\n let boundingRect = props.el.getBoundingClientRect();\r\n\r\n d3.select(props.el)\r\n .select('svg').remove();\r\n\r\n // set the dimensions and margins of the graph\r\n const margin = {top: 20, right: 20, bottom: 40, left: 20},\r\n width = boundingRect.width - margin.left - margin.right,\r\n height = props.height - margin.top - margin.bottom;\r\n\r\n // set the ranges\r\n const x0 = d3.scaleBand()\r\n .range([0, width])\r\n .padding(0.1);\r\n const x1 = d3.scaleBand()\r\n .range([0, width])\r\n .padding(0.05);\r\n const y = d3.scaleLinear()\r\n .range([height, 0]);\r\n\r\n d3.select('body').append('div')\r\n .attr('class', 'bar-chart-tooltip')\r\n .style('opacity', 0);\r\n\r\n // append the svg object to the body of the page\r\n // append a 'group' element to 'svg'\r\n // moves the 'group' element to the top left margin\r\n const svg = d3.select(props.el)\r\n .append('svg')\r\n .attr('width', width + margin.left + margin.right)\r\n .attr('height', height + margin.top + margin.bottom)\r\n .append('g')\r\n .attr('transform',\r\n 'translate(' + margin.left + ',' + margin.top + ')')\r\n\r\n\r\n // Scale the range of the data in the domains\r\n x0.domain(props.data.map((d) => d.label));\r\n x1.domain(props.data.map((d) => d.label));\r\n y.domain([0, d3.max(props.data, (d) => d.value > d.valueSecond ? d.value : d.valueSecond ) ?? 0]);\r\n\r\n const shiftViewsBar = x0.bandwidth() / 1.9;\r\n const shiftReadsBar = x0.bandwidth() * 0.03;\r\n const shiftViewsTopLabel = x0.bandwidth() / 3.7;\r\n const shiftReadsTopLabel = x0.bandwidth() / 4;\r\n\r\n // append the rectangles for the bar chart\r\n const bar = svg.selectAll('.bar')\r\n .data(props.data)\r\n .enter()\r\n .append('g')\r\n // allow the class that is using this to\r\n // decide if value will appear when user hovers\r\n // over the bar\r\n .attr('class', props.showOnHover ? 'bar-group' : '')\r\n\r\n bar.append('rect')\r\n .attr('class', 'bar')\r\n .attr('x', function (d) { return x0(d.label)! + shiftViewsBar; })\r\n .attr('width', x0.bandwidth() / 2)\r\n .attr('y', function (d) { return y(d.value); })\r\n .attr('height', function (d) { return height - y(d.value); });\r\n\r\n bar.append('rect')\r\n .attr('class', 'barSecond')\r\n .attr('x', function (d) { return x0(d.label)! - shiftReadsBar; })\r\n .attr('width', x0.bandwidth() / 2)\r\n .attr('y', function (d) { return y(d.valueSecond); })\r\n .attr('height', function (d) { return height - y(d.valueSecond); });\r\n\r\n if (props.labelBars) {\r\n bar.append('text')\r\n .attr('class', 'top-label')\r\n .text(function (d) { return d.value; })\r\n .attr('x', function (d) { return x1(d.label)! + shiftViewsTopLabel; })\r\n .attr('y', function (d) { return y(d.value); })\r\n .attr('width', x1.bandwidth())\r\n .attr('transform', function (d) {\r\n const xOffset = (x1.bandwidth() / 2 - (this as any).getBBox().width / 2);\r\n return 'translate(' + xOffset + ', -5)'\r\n });\r\n bar.append('text')\r\n .attr('class', 'top-label')\r\n .text(function (d) { return d.valueSecond; })\r\n .attr('x', function (d) { return x1(d.label)! - shiftReadsTopLabel; })\r\n .attr('y', function (d) { return y(d.valueSecond); })\r\n .attr('width', x1.bandwidth())\r\n .attr('transform', function (d) {\r\n const xOffset = (x1.bandwidth() / 2 - (this as any).getBBox().width / 2);\r\n return 'translate(' + xOffset + ', -5)'\r\n });\r\n }\r\n\r\n // add the x Axis\r\n svg.append('g')\r\n .attr('transform', 'translate(0,' + height + ')')\r\n .call(d3.axisBottom(x0));\r\n }\r\n \r\n public destroy() {\r\n // Any clean-up would go here\r\n // in this example there is nothing to do\r\n }\r\n}\r\n\r\n","import * as React from 'react';\r\nimport { CommentAndReactionCount, PlatformAnalyticsReport } from '../models';\r\nimport { VerticalBarChart, VBarChartProps, VBarChartDataPoint } from './charts/verticalDoubleBarChart';\r\nimport moment from 'moment';\r\nimport WindowResizeListener from 'modules/common/components/window-resize-listener';\r\nimport {injectIntl, IntlShape} from \"react-intl\";\r\nimport {connect, ConnectedProps} from \"react-redux\";\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport Loading from 'modules/common/components/loading';\r\nimport EmptyDataMessage from './emptyDataMessage';\r\nimport DownloadIcon from './downloadIconSvg';\r\n\r\nclass CommentsByMonth extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n widthToUse: \"2400px\",\r\n itemsToDisplay: 1,\r\n };\r\n }\r\n\r\n private _colors = ['#E6911A', '#337AB7'];\r\n private _chart: VerticalBarChart;\r\n private _chartElement: HTMLElement;\r\n\r\n public componentDidMount() {\r\n this._chart = new VerticalBarChart(this.getChartState());\r\n }\r\n\r\n public componentDidUpdate() {\r\n if (this._chart && !this.props.loading) {\r\n this._chart.update(this.getChartState());\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n if (this._chart) {\r\n this._chart.destroy();\r\n }\r\n }\r\n\r\n public render() {\r\n moment.locale(\"en\");\r\n\r\n return <div id={PlatformAnalyticsReport.commentsAndReactions} className=\"analytics-widget\">\r\n <div className='downloadIcon' id={`${PlatformAnalyticsReport.commentsAndReactions}-downloadIcon`}> \r\n <DownloadIcon\r\n downloadExcel={this.props.downloadExcel}\r\n downloadImage={this.props.downloadImage}\r\n />\r\n </div>\r\n <div style={{overflowX: \"auto\"}}>\r\n <div id={PlatformAnalyticsReport.commentsAndReactions} style={ this.state.itemsToDisplay > 7 ? {width: this.state.widthToUse, backgroundColor: '#fff'} : { backgroundColor: '#fff'}}> \r\n <div className=\"header\">\r\n Post Reactions & Comments\r\n </div>\r\n\r\n <div className=\"legend\">\r\n <span style={{ background: this._colors[0], display: \"inline-block\", width: \"15px\", height: \"15px\", marginRight: \"5px\", position: \"relative\", top: \"2px\" }}></span>\r\n <span style={{fontSize: \"13px\", paddingRight: \"10px\"}}>Reactions</span>\r\n \r\n <span style={{ background: this._colors[1], display: \"inline-block\", width: \"15px\", height: \"15px\", marginRight: \"5px\", position: \"relative\", top: \"2px\" }}></span>\r\n <span style={{fontSize: \"13px\"}}>Comments</span>\r\n </div> \r\n <div className=\"body\"style={{marginTop: \"45px\"}}>\r\n {\r\n this.props.loading ?\r\n <div style={{position: \"relative\", top: \"55px\"}}>\r\n <Loading/>\r\n </div> :\r\n <div style={{overflowX: \"auto\"}}>\r\n {this.props.commentAndReactionCounts ?\r\n <div \r\n ref={(e) => this._chartElement = e!} \r\n className=\"dashboard-chart-widget yellow-chart\"\r\n style={ this.state.itemsToDisplay > 7 ? {width: this.state.widthToUse} : {}}\r\n >\r\n </div>\r\n : <EmptyDataMessage/>}\r\n </div>\r\n }\r\n <WindowResizeListener onChange={this.handleWindowResize} />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n private getChartState = (): VBarChartProps => {\r\n let commentCounts = this.props.commentAndReactionCounts ?? [];\r\n\r\n //Use first relevant month and skip over the empty ones.\r\n if(commentCounts.length > 0) {\r\n let oldestValidData = commentCounts.findIndex(u => u.commentCount > 0 || u.reactionCount > 0);\r\n if(oldestValidData === -1)\r\n oldestValidData = 0;\r\n\r\n commentCounts = commentCounts.slice(oldestValidData);\r\n }\r\n\r\n //Use short labels if only one month AND the range is a single month.\r\n let useShortLabels = commentCounts.length > 1 || moment(this.props.startDate, \"MMM D, YYYY, h:mmA\").month() !== moment(this.props.endDate, \"MMM D, YYYY, h:mmA\").month();\r\n\r\n let widthToUse = Math.max((commentCounts.length * 80), 380).toString() + \"px\"\r\n if(this.state.widthToUse !== widthToUse) {\r\n this.setState({widthToUse, itemsToDisplay: commentCounts.length});\r\n }\r\n\r\n let longLabelToUse = `${moment(this.props.startDate, \"MMM D, YYYY, h:mmA\").format(\"MMM DD, YYYY\")} - ${moment(this.props.endDate, \"MMM D, YYYY, h:mmA\").format(\"MMM DD, YYYY\")}`;\r\n\r\n return {\r\n el: this._chartElement,\r\n height: 200,\r\n data: commentCounts\r\n .map((range, index) => {\r\n return {\r\n x: index,\r\n value: range.commentCount,\r\n valueSecond: range.reactionCount,\r\n label: useShortLabels ? moment(range.rangeStart).format('MMM YYYY') \r\n : longLabelToUse,\r\n id: index.toString()\r\n } as VBarChartDataPoint;\r\n }),\r\n labelBars: true,\r\n locale: this.props.locale\r\n } as VBarChartProps;\r\n }\r\n\r\n private handleWindowResize = () => {\r\n this._chart.update(this.getChartState());\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n loading?: boolean;\r\n commentAndReactionCounts: CommentAndReactionCount[] | null;\r\n intl: IntlShape;\r\n startDate: string;\r\n endDate: string;\r\n downloadExcel: () => void;\r\n downloadImage: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n widthToUse: string;\r\n itemsToDisplay: number;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps)=>({\r\n ...ownProps,\r\n locale: state.localization.locale\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default injectIntl(connector(CommentsByMonth));\r\n","import * as React from 'react';\r\nimport { UserTrends } from '../models';\r\nimport {injectIntl, IntlShape} from \"react-intl\";\r\nimport Loading from 'modules/common/components/loading';\r\nimport EmptyDataMessage from './emptyDataMessage';\r\n\r\ninterface UserTrendProps {\r\n loading?: boolean\r\n userTrends: UserTrends | null;\r\n intl: IntlShape;\r\n filterType: string;\r\n}\r\n\r\nclass UserTrend extends React.Component<UserTrendProps, {}> {\r\n\r\n public render() {\r\n const useThe = this.props.filterType.toLowerCase().includes(\"last\");\r\n return <div className=\"analytics-widget\">\r\n <div className=\"header\">\r\n User Trends for {useThe ? \"the\" : \"\"} <span style={{textTransform: \"capitalize\"}}>{this.props.filterType}</span>\r\n </div>\r\n {this.props.loading ? \r\n <div style={{position: \"relative\", top: \"55px\"}}>\r\n <Loading/>\r\n </div>\r\n : <div className=\"body\">\r\n {this.props.userTrends\r\n ? \r\n <>\r\n <div className='number-wrapper' style={{height: \"100px\", paddingTop: \"10px\"}}>\r\n <div>\r\n {this.props.userTrends.uniqueUserViewPostEvent ?? 0}\r\n </div>\r\n <span className='title'>\r\n Users that viewed at least one post or event\r\n </span>\r\n </div>\r\n\r\n <div className='number-wrapper' style={{height: \"100px\", paddingTop: \"10px\"}}>\r\n <div>\r\n {this.props.userTrends.uniqueUserReactionCommentOnPost ?? 0}\r\n </div>\r\n <span className='title'>\r\n Users reacted or commented on a post\r\n </span>\r\n </div>\r\n\r\n </>\r\n\r\n : <EmptyDataMessage/> }\r\n </div>\r\n }\r\n </div>\r\n }\r\n}\r\n\r\ninterface UserTrendSummary {\r\n lastMonth: UserMonthTrend\r\n monthBefore: UserMonthTrend\r\n}\r\n\r\ninterface UserMonthTrend {\r\n monthName: string; userCount: number; trend: number;\r\n}\r\n\r\nexport default injectIntl(UserTrend)\r\n","/* eslint-disable react/style-prop-object */\r\nimport * as React from 'react';\r\nimport { PlatformAnalyticsReport, PlatformStats } from '../models';\r\nimport { PieChart, IPieChartProps, IPieChartDataPoint } from './charts/pieChart';\r\nimport WindowResizeListener from 'modules/common/components/window-resize-listener';\r\nimport {FormattedMessage, injectIntl, IntlShape} from \"react-intl\";\r\nimport {connect, ConnectedProps} from \"react-redux\";\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport Loading from 'modules/common/components/loading';\r\nimport EmptyDataMessage from './emptyDataMessage';\r\nimport DownloadIcon from './downloadIconSvg';\r\n\r\nclass ClientBreakdown extends React.PureComponent<PropsWithRedux, {}> {\r\n\r\n private _chart: PieChart;\r\n private _chartElement: HTMLElement;\r\n\r\n private _colors = ['#1B386B', '#36404A', '#356531', '#169BD5', '#E6911A', '#599FA0'];\r\n\r\n public componentDidMount() {\r\n this._chart = new PieChart(this.getChartState());\r\n }\r\n\r\n public componentDidUpdate() {\r\n if (this._chart) {\r\n this._chart.update(this.getChartState());\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n if (this._chart) {\r\n this._chart.destroy();\r\n }\r\n }\r\n\r\n public groupFlutterWithNative(stats?: PlatformStats[]) {\r\n let legacyAndroidCount = stats?.find(e => e.platformName === 'Android Legacy')?.readCount;\r\n let legacyAppleCount = stats?.find(e => e.platformName === 'Apple Legacy')?.readCount;\r\n let legacyWebCount = stats?.find(e => e.platformName === 'Web Legacy')?.readCount;\r\n\r\n if (typeof stats !== undefined) {\r\n stats = this.addOrUpdatePlatform(stats!, legacyAndroidCount!, \"Android\");\r\n stats = this.addOrUpdatePlatform(stats!, legacyAppleCount!, \"Apple\");\r\n stats = this.addOrUpdatePlatform(stats!, legacyWebCount!, \"Web\");\r\n }\r\n\r\n stats = stats?.filter(e => e.platformName !== 'Android Legacy' && e.platformName !== 'Apple Legacy' && e.platformName !== 'Web Legacy');\r\n return stats ?? [];\r\n }\r\n\r\n public addOrUpdatePlatform(stats: PlatformStats[], count: number, platform: string) {\r\n if (count <= 0 || count === undefined) {\r\n return stats;\r\n }\r\n\r\n const index = stats.findIndex(e => e.platformName === platform)\r\n if (index < 0) {\r\n stats.push({ platformName: platform, readCount: count} as PlatformStats);\r\n } else {\r\n stats[index].readCount = stats[index].readCount + count;\r\n }\r\n\r\n return stats;\r\n }\r\n\r\n public render() {\r\n let stats = this.props.platformStats || [];\r\n let total = stats.reduce((sum, point) => sum + point.readCount, 0);\r\n\r\n return <div id={PlatformAnalyticsReport.channelUsage} className=\"analytics-widget\">\r\n <div className='downloadIcon' id={`${PlatformAnalyticsReport.channelUsage}-downloadIcon`} style={{float:'right'}}> \r\n <DownloadIcon\r\n downloadExcel={this.props.downloadExcel}\r\n downloadImage={this.props.downloadImage}\r\n />\r\n </div>\r\n <div className=\"header\">\r\n Channel Usage\r\n \r\n </div>\r\n <div className=\"body\">\r\n {\r\n this.props.loading ?\r\n <div style={{position: \"relative\", top: \"55px\"}}>\r\n <Loading/>\r\n </div> :\r\n <div className=\"app-usage\">\r\n <div className=\"chart-wrapper\">\r\n <div ref={(e) => this._chartElement = e! }></div>\r\n </div>\r\n {this.props.platformStats && this.props.platformStats.length > 0 ?\r\n <div className=\"legend\">\r\n <header><FormattedMessage id=\"insights.readsByPlatform\" defaultMessage=\"Reads by Platform\" /></header>\r\n <ul>\r\n {this.groupFlutterWithNative(stats).map((data, index) => {\r\n return <li key={data.platformName}>\r\n <span className=\"color-indicator\" style={{ background: this._colors[index] }}></span>\r\n {data.platformDescription}: {((data.readCount / total) * 100).toFixed(1)}%\r\n </li>\r\n })}\r\n </ul>\r\n </div>\r\n : <EmptyDataMessage/>}\r\n </div> \r\n }\r\n <WindowResizeListener onChange={this.handleWindowResize} />\r\n </div>\r\n <footer>\r\n </footer>\r\n </div>\r\n }\r\n\r\n private getChartState = (): IPieChartProps => {\r\n return {\r\n el: this._chartElement,\r\n diameter: 150,\r\n innerDiameter: 100,\r\n data: (this.groupFlutterWithNative(this.props.platformStats ?? [])).map((count, i) => {\r\n return {\r\n label: count.platformName,\r\n value: count.readCount,\r\n color: this._colors[i],\r\n locale: this.props.locale\r\n } as IPieChartDataPoint;\r\n })\r\n } as IPieChartProps;\r\n }\r\n\r\n private handleWindowResize = () => {\r\n this._chart.update(this.getChartState());\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n loading?: boolean\r\n platformStats: PlatformStats[] | null;\r\n intl: IntlShape;\r\n downloadExcel: () => void;\r\n downloadImage: () => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps)=>({\r\n ...ownProps,\r\n locale: state.localization.locale\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n \r\nexport default injectIntl(connector(ClientBreakdown));\r\n","import * as React from 'react';\r\nimport { PlatformAnalyticsReport, ReadViewStatByHour } from '../models';\r\nimport { VerticalBarChart, VBarChartProps, VBarChartDataPoint } from './charts/verticalBarChart';\r\nimport WindowResizeListener from 'modules/common/components/window-resize-listener';\r\nimport {injectIntl, IntlShape} from \"react-intl\";\r\nimport {connect, ConnectedProps} from \"react-redux\";\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport Loading from 'modules/common/components/loading';\r\nimport EmptyDataMessage from './emptyDataMessage';\r\nimport DownloadIcon from './downloadIconSvg';\r\nimport moment from 'moment';\r\nimport momentTimezone from 'moment-timezone';\r\n\r\nclass ReadsViewsByHour extends React.PureComponent<PropsWithRedux, {}> {\r\n\r\n private _chart: VerticalBarChart;\r\n\r\n public componentDidMount() {\r\n this._chart = new VerticalBarChart(this.getBarChartState());\r\n }\r\n\r\n public componentDidUpdate() {\r\n if (this._chart) {\r\n this._chart.update(this.getBarChartState());\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n if (this._chart) {\r\n this._chart.destroy();\r\n }\r\n }\r\n\r\n public render() {\r\n return <div id={PlatformAnalyticsReport.postViewsByHour} className=\"analytics-widget\">\r\n <div className='downloadIcon' id={`${PlatformAnalyticsReport.postViewsByHour}-downloadIcon`}> \r\n <DownloadIcon\r\n downloadExcel={this.props.downloadExcel}\r\n downloadImage={this.props.downloadImage}\r\n />\r\n </div>\r\n <div className=\"header\">\r\n Post Views by Time of Day ({moment.tz(new Date(), momentTimezone.tz.guess()).format('z')})\r\n </div>\r\n <div className=\"body\">\r\n {\r\n this.props.loading ?\r\n <div style={{position: \"relative\", top: \"55px\"}}>\r\n <Loading/>\r\n </div> : \r\n <div>\r\n {this.props.readViewStats && this.props.readViewStats.length > 0 ? \r\n <div ref=\"chart\" className=\"dashboard-chart-widget\"></div>\r\n : <EmptyDataMessage/> }\r\n </div>\r\n }\r\n <WindowResizeListener onChange={this.onWindowResize} />\r\n </div>\r\n <footer>\r\n </footer>\r\n </div>\r\n }\r\n\r\n private getBarChartState = (): VBarChartProps => {\r\n \r\n let date = new Date();\r\n\r\n let readViewStats = this.props.readViewStats || [];\r\n\r\n if(readViewStats.length !== 0){\r\n for(let i = 0; i < 24; i++){\r\n const filter = (s: ReadViewStatByHour) => s.utcHour === i;\r\n const stat = readViewStats.find(filter)!;\r\n date.setUTCHours(stat.utcHour);\r\n\r\n stat.rangeStart = date.getHours();\r\n date.setHours(stat.rangeStart + 1);\r\n stat.rangeEnd = date.getHours();\r\n }\r\n }\r\n\r\n readViewStats = readViewStats.sort((a,b) => a.rangeStart - b.rangeStart);\r\n\r\n return {\r\n el: this.refs.chart,\r\n locale: this.props.locale,\r\n height: 200,\r\n data: readViewStats\r\n .map(stat => {\r\n return {\r\n x: stat.rangeEnd.toString(),\r\n value: stat.viewCount,\r\n label: stat.rangeStart.toString() + ':00',\r\n id: stat.rangeEnd.toString()\r\n } as VBarChartDataPoint;\r\n }),\r\n labelBars: true,\r\n showOnHover: false\r\n } as VBarChartProps;\r\n }\r\n\r\n private onWindowResize = () => this._chart.update(this.getBarChartState())\r\n}\r\n\r\ninterface ComponentProps {\r\n loading?: boolean\r\n readViewStats: ReadViewStatByHour[] | null;\r\n readViewStatsLocalized?: ReadViewStatByHour[]\r\n intl: IntlShape;\r\n downloadImage: () => void;\r\n downloadExcel: () => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n locale: state.localization.locale\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default injectIntl(connector(ReadsViewsByHour));","import * as React from 'react';\r\nimport { browserHistory } from 'configureStore';\r\nimport Tenantink from 'modules/common/components/tenantLink';\r\nimport { HorizontalBarChart, HBarChartProps, HBarChartDataPoint } from './charts/horizontalBarChart';\r\nimport WindowResizeListener from 'modules/common/components/window-resize-listener';\r\nimport { Survey } from 'modules/surveys';\r\nimport {FormattedMessage} from \"react-intl\";\r\nimport {connect, ConnectedProps} from \"react-redux\";\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport Loading from 'modules/common/components/loading';\r\nimport EmptyDataMessage from './emptyDataMessage';\r\nimport DownloadIcon from './downloadIconSvg';\r\nimport { PlatformAnalyticsReport } from '..';\r\n\r\ninterface ComponentProps {\r\n tenant: string\r\n surveys: Survey[];\r\n loading: boolean;\r\n downloadImage: () => void;\r\n downloadExcel: () => void;\r\n}\r\n\r\nclass TopSurveys extends React.PureComponent<PropsWithRedux, {}> {\r\n\r\n private _chart: HorizontalBarChart;\r\n private _chartElement: HTMLElement;\r\n\r\n public componentDidMount() {\r\n this._chart = new HorizontalBarChart(this.getBarChartState());\r\n }\r\n\r\n public componentDidUpdate() {\r\n if (this._chart) {\r\n this._chart.update(this.getBarChartState());\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n if (this._chart) {\r\n this._chart.destroy();\r\n }\r\n }\r\n\r\n public render() {\r\n const noDataAvailable = !this.props.surveys || this.props.surveys.length === 0;\r\n\r\n return <div id={PlatformAnalyticsReport.surveyWithMostResponse} className=\"analytics-widget\">\r\n <div className='downloadIcon' id={`${PlatformAnalyticsReport.surveyWithMostResponse}-downloadIcon`} style={{float:'right'}}> \r\n <DownloadIcon\r\n downloadImage={this.props.downloadImage}\r\n downloadExcel={this.props.downloadExcel}\r\n />\r\n </div>\r\n <div className=\"header\">\r\n Top 10 Survey with Most Responses\r\n </div>\r\n {this.props.loading ? \r\n <div className=\"body\" style={{position: \"relative\", top: \"55px\", height: \"85%\"}}>\r\n <Loading/>\r\n </div>\r\n : <div className=\"body\" style={{height: noDataAvailable ? \"175px\" : \"215px\"}}>\r\n {\r\n noDataAvailable ?\r\n <EmptyDataMessage/>\r\n \r\n : <div ref={e => this._chartElement = e!} className=\"bar-chart-widget\"></div>\r\n }\r\n <WindowResizeListener onChange={() => this._chart.update(this.getBarChartState())} />\r\n </div>\r\n }\r\n <footer id={`${PlatformAnalyticsReport.surveyWithMostResponse}-goto`} style={{position: \"relative\", top: \"-8px\"}}>\r\n <Tenantink to={`~/admin/surveys`}>\r\n <FormattedMessage id=\"surveys.viewAllSurveys\" defaultMessage=\"Go to Manage Surveys\"/>\r\n </Tenantink>\r\n </footer>\r\n </div>\r\n }\r\n\r\n private getBarChartState = (): HBarChartProps => {\r\n return {\r\n el: this._chartElement,\r\n locale: this.props.locale,\r\n width: '100%',\r\n height: 'auto',\r\n barHeight: 20,\r\n data: this.props.surveys.map(s => {\r\n return {\r\n id: s.id,\r\n //handle surveys with multi-language titles\r\n label: s.title,\r\n value: Object.keys(s.aggregatedResults).reduce((acc, key) => acc + s.aggregatedResults[key] , 0),\r\n onClick: this.handlePostClick\r\n };\r\n }).sort((a,b) => b.value - a.value).slice(0,10),\r\n labelWidth: 200\r\n } as HBarChartProps;\r\n }\r\n\r\n private handlePostClick = (p: HBarChartDataPoint) => {\r\n browserHistory.push(`/${this.props.tenant}/admin/surveys/${p.id}`);\r\n }\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n locale: state.localization.locale\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(TopSurveys)","import React, { useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Tutorial, { Slide } from \"modules/common/components/tutorial\";\r\n\r\nimport Cookies from \"utils/cookie\";\r\nimport { Link } from \"@mui/material\";\r\n\r\nconst openSupport = () => {\r\n window.open(\"https://support.sparrowconnected.com/en/understanding-platform-analytics?hs_preview=TqbAInvr-70636390706\", '_blank', 'noopener,noreferrer');\r\n}\r\n\r\nconst TUTORIAL_SLIDES: Slide[] = [\r\n {\r\n title: \"Introducing Platform Analytics\",\r\n content: (\r\n <div>Your Platform Analytics are insights and metrics that measure the reach, engagement, and impact of your communications across all your channels. <br/><br/>\r\n These insights identify top performing content, empower you to make smart decisions, and provide you with true business intelligence from your communication efforts.\r\n </div>\r\n )\r\n },\r\n {\r\n title: \"Gain Valuable User Insights\",\r\n content: (\r\n <div><b>User Trends, Channel Usage</b> and <b>Engaged Users</b> are login sessions, content view and platform usage stats that gauge how many employees are engaged in the platform and which channels get the most traffic. \r\n <br/><br/>\r\n These are metrics that reveal the frequency and depth of your users' content consumption and platform adoption. </div>\r\n )\r\n },\r\n {\r\n title: \"Evaluate Content Engagement\",\r\n content: (\r\n <div>Identify your <b>highest performing posts, events and surveys</b> and use this intelligence to inform your communications strategy and create more engaging content for your audiences. \r\n <br/><br/>\r\n Content <b>Views, Reactions, Comments</b> and <b>Interactions</b> are responses and engagement metrics that show how well your content strategy aligns with user interest. </div>\r\n )\r\n },\r\n {\r\n title: \"Measure Growth and Performance\",\r\n content: (\r\n <div>The growth and performance of your content strategy is measured over time. \r\n <br/><br/>\r\n With the help of our <b>date ranges</b>, you can pinpoint spikes and dips in user behavior and content engagement. Identifying these trends helps you plan ahead and refine your communication strategy. </div>\r\n )\r\n },\r\n {\r\n title: \"Give Feedback and Get Support\",\r\n content: (\r\n <div>Learn more about Sparrow Connected Platform Analytics at: <Link onClick={openSupport}>support.sparrowconnected.com</Link>.\r\n <br/><br/>\r\n For feedback, questions or support, get in touch with us at: <Link href=\"mailto:support@sparrowconnected.com\">support@sparrowconnected.com</Link>. </div>\r\n )\r\n }\r\n];\r\n\r\nconst InsightsTutorial: React.FunctionComponent<PropsWithRedux> = props => {\r\n const [showTutorial] = useState(Cookies.isFirstSet(\"ins-visited\"));\r\n\r\n return (\r\n <Tutorial openOnLoad={showTutorial} slides={TUTORIAL_SLIDES} imageSrc=\"/images/tutorials/platform-insights/platform-insights\" />\r\n );\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(InsightsTutorial);","import React, { useState } from \"react\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\nimport ArrowDropDownIcon from \"@mui/icons-material/ArrowDropDown\";\r\nimport Callout from \"../callout\";\r\n\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n optionsWrapper: {\r\n display: \"inline-block\",\r\n position: \"relative\"\r\n },\r\n options: {\r\n position: \"absolute\",\r\n top: 8\r\n }\r\n })\r\n);\r\n\r\nconst FilterMoreOptionsButton: React.FunctionComponent<ComponentProps> = props => {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const [calloutOpen, setCalloutOpen] = useState(false);\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n <div className={classes.optionsWrapper}>\r\n <Button\r\n variant={props.variant ?? \"outlined\"}\r\n color={(!props.color || props.color === 'default') ? \"primary\" : props.color}\r\n size={props.size ?? \"medium\"}\r\n disabled={props.disabled ?? false}\r\n onClick={(ev: any) => {\r\n ev.stopPropagation();\r\n setAnchorEl(ev.currentTarget);\r\n setCalloutOpen(true);\r\n }}\r\n className={props.className}\r\n >\r\n {props.text || \"More Options\"}\r\n <ArrowDropDownIcon />\r\n </Button>\r\n <Callout\r\n anchorEl={anchorEl}\r\n open={calloutOpen}\r\n setOpen={setCalloutOpen}\r\n footer={props.footer}\r\n header={props.header}\r\n >\r\n {props.children}\r\n </Callout>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n text?: string;\r\n onClick?: (ev) => void;\r\n variant?: \"text\" | \"outlined\" | \"contained\" | undefined;\r\n color?: \"inherit\" | \"primary\" | \"secondary\" | \"default\" | undefined;\r\n size?: \"small\" | \"medium\" | \"large\" | undefined;\r\n disabled?: boolean;\r\n className?: string;\r\n footer?: JSX.Element;\r\n header?: JSX.Element;\r\n}\r\n\r\nexport default FilterMoreOptionsButton;","import * as React from 'react';\r\nimport { connect, ConnectedProps, shallowEqual } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport * as actions from '../actionCreator';\r\nimport RealTopPosts from './top-posts';\r\nimport UsersByMonth from './usersByMonth';\r\nimport CommentsByMonth from './commentsByMonth';\r\nimport UserTrend from './userTrend';\r\nimport ClientBreakdown from './clientBreakdown';\r\nimport ReadsViewsByHour from './readsViewsByHour';\r\nimport TopSurveys from './topSurveys';\r\nimport {injectIntl, IntlShape} from \"react-intl\";\r\nimport AnalyticsErrorBanner from \"modules/common/components/analyticsErrorBanner\";\r\nimport { withRouter, RouteComponentProps } from 'react-router';\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Header from \"pages/common/header\";\r\nimport MainContent from \"pages/common/mainContent\";\r\nimport { Grid } from '@mui/material';\r\nimport InsightsTutorial from './dialogs/insightsTutorial';\r\nimport InsightFilters from './insightFilters';\r\nimport moment from 'moment';\r\nimport { Survey } from 'modules/surveys';\r\nimport TopEvents from './topEvents';\r\nimport { AnalyticsReportFilters, DownloadAllReport, LAST_30_DAYS, PlatformAnalyticsReport, TopEvent } from '..';\r\nimport DownloadReportsDropdown from './downloadReportsDropdown';\r\nimport { audiencesApi, insightsApi, reportsApi } from 'api/instances';\r\nimport * as htmlToImage from 'html-to-image';\r\nimport { store } from 'configureStore';\r\nimport { dateOptions } from 'utils/dateFormatting';\r\nimport { Audience } from 'modules/audiences';\r\nimport { FileDownloader } from 'utils/fileDownloader';\r\nimport SnackbarWrapper from 'modules/common/components/snackbars/snackbarWrapper';\r\nimport { getCurrentTimeInUserTimezone } from 'utils/getCurrentTimeInUserTimezone';\r\n\r\nenum loadTypes { \"all\", \"excel\", \"image\" };\r\n\r\nclass Dashboard extends React.Component<PropsWithRedux, ComponentState> {\r\n\r\n constructor(props){\r\n super(props);\r\n const startDate = moment(new Date()).startOf(\"day\").subtract(30, \"days\").format(dateOptions.basicWithHours);\r\n const endDate = moment(new Date()).endOf(\"day\").format(dateOptions.basicWithHours);\r\n this.state = {\r\n isLoadingUsersByMonthAnalyticsOverview: true,\r\n isLoadingAppUsageAnalyticsOverview: true,\r\n isLoadingCommentsByMonthAnalyticsOverview: true,\r\n isLoadingReadsByTimeOfDayAnalyticsOverview: true,\r\n isLoadingTopSurveyResponseAnalyticsOverview: true,\r\n isLoadingTopEventsAnalyticsOverview: true,\r\n isLoadingUserTrendsAnalyticsOverview: true,\r\n isLoadingAll: false,\r\n isLoadingExcel: false,\r\n isLoadingImage: false,\r\n\r\n reportPayload: {\r\n startDate: startDate,\r\n endDate: endDate\r\n },\r\n reportFilter: {\r\n startDate: startDate,\r\n endDate: endDate,\r\n rangeString: LAST_30_DAYS,\r\n audiences: [],\r\n topics: []\r\n },\r\n audiences: [],\r\n totalSubscribers: 0,\r\n resultMessage: \"\"\r\n };\r\n }\r\n\r\n public componentWillMount() {\r\n audiencesApi\r\n .getAllAudiencesForAuthors()\r\n .then(audiences => this.setState({audiences: audiences.filter(a => a.enabled)})) //Get list of enabled audiences for filtering.\r\n }\r\n\r\n public componentDidMount() {\r\n if(!this.props.toFetch) {\r\n this.getAllAnalytics();\r\n }\r\n else {\r\n //User has come back to the page, reload the default ranges and graphs.\r\n this.onChangeFilters(this.state.reportFilter);\r\n this.props.setToFetch(false);\r\n }\r\n (window as any).scrollTo(0, 0);\r\n }\r\n\r\n public render() {\r\n const isLoading = (this.state.isLoadingAppUsageAnalyticsOverview || this.state.isLoadingCommentsByMonthAnalyticsOverview || this.state.isLoadingReadsByTimeOfDayAnalyticsOverview || this.state.isLoadingTopEventsAnalyticsOverview || this.state.isLoadingTopSurveyResponseAnalyticsOverview || this.state.isLoadingUserTrendsAnalyticsOverview || this.state.isLoadingUsersByMonthAnalyticsOverview )\r\n\r\n return (\r\n <BasePage fullWidth>\r\n <SnackbarWrapper open={!!this.state.resultMessage} style={{ top: \"60px\" }} autoHideDuration={8000} onClose={() => this.setState({resultMessage: \"\"})} severity={\"success\"} message={this.state.resultMessage} />\r\n <Header\r\n title={\r\n <React.Fragment>\r\n <span>Platform Analytics</span>\r\n <InsightsTutorial />\r\n </React.Fragment>\r\n }\r\n rightComponent={\r\n <React.Fragment>\r\n <DownloadReportsDropdown\r\n downloadAllImage={this.downloadAllReportAsImage}\r\n downloadAllExcel={this.sendAllExcelReportRequest}\r\n loadingImage={this.state.isLoadingImage}\r\n />\r\n </React.Fragment>\r\n }\r\n />\r\n <MainContent>\r\n <div className=\"analytics-dashboard\">\r\n {\r\n this.props.analyticsErrorMessage === \"\" ? null :\r\n <span>\r\n <AnalyticsErrorBanner mssg={this.props.analyticsErrorMessage}/>\r\n <div className=\"clearfix\"/>\r\n </span>\r\n }\r\n\r\n <InsightFilters filters={this.state.reportFilter} onChangeFilters={this.onChangeFilters} tenantSettings={this.props.tenantSettings} totalSubscribers={this.state.totalSubscribers} audiences={this.state.audiences} isLoading={isLoading} />\r\n\r\n <Grid container spacing={1}>\r\n <Grid item xs={12} md={2}>\r\n {\r\n <UserTrend\r\n userTrends={this.props.userTrends}\r\n loading={this.state.isLoadingUsersByMonthAnalyticsOverview}\r\n filterType={this.state.reportFilter.rangeString!}\r\n />\r\n }\r\n </Grid>\r\n\r\n <Grid item xs={12} md={4}>\r\n\r\n {\r\n <ClientBreakdown\r\n platformStats={this.props.platformStats}\r\n loading={this.state.isLoadingAppUsageAnalyticsOverview}\r\n downloadExcel={() => this.sendExcelReportRequest(PlatformAnalyticsReport.channelUsage)}\r\n downloadImage={() => this.onDownloadImg(this.fetchChannelsImage, PlatformAnalyticsReport.channelUsage)}\r\n />\r\n }\r\n </Grid>\r\n\r\n <Grid item xs={12} md={6}>\r\n {\r\n <UsersByMonth\r\n userCounts={this.props.userCounts}\r\n loading={this.state.isLoadingUsersByMonthAnalyticsOverview}\r\n startDate={this.state.reportFilter.startDate!}\r\n endDate={this.state.reportFilter.endDate!}\r\n downloadExcel={() => this.sendExcelReportRequest(PlatformAnalyticsReport.engagedUsers)}\r\n downloadImage={() => this.onDownloadImg(this.fetchEngagedUsersImage, PlatformAnalyticsReport.engagedUsers)}\r\n />\r\n }\r\n </Grid>\r\n </Grid>\r\n <Grid container spacing={1}>\r\n <Grid item xs={12} md={6}>\r\n {\r\n <RealTopPosts\r\n reportFilter={this.state.reportFilter}\r\n downloadExcel={() => this.sendExcelReportRequest(PlatformAnalyticsReport.mostViewedPost)}\r\n downloadImage={() => this.onDownloadImg(this.fetchMostViewedPostImage, PlatformAnalyticsReport.mostViewedPost)}\r\n /> //Top 10 Posts\r\n }\r\n </Grid>\r\n <Grid item xs={12} md={6}>\r\n {\r\n <CommentsByMonth\r\n commentAndReactionCounts={this.props.commentAndReactionCounts}\r\n loading={this.state.isLoadingCommentsByMonthAnalyticsOverview}\r\n startDate={this.state.reportFilter.startDate!}\r\n endDate={this.state.reportFilter.endDate!}\r\n downloadExcel={() => this.sendExcelReportRequest(PlatformAnalyticsReport.commentsAndReactions)}\r\n downloadImage={() => this.onDownloadImg(this.fetchCommentsAndReactionsImage, PlatformAnalyticsReport.commentsAndReactions)}\r\n />\r\n }\r\n </Grid>\r\n </Grid>\r\n <Grid container spacing={1}>\r\n <Grid item xs={12} md={12}>\r\n {\r\n <ReadsViewsByHour\r\n readViewStats={this.props.readViewStats}\r\n loading={this.state.isLoadingReadsByTimeOfDayAnalyticsOverview}\r\n downloadExcel={() => this.sendExcelReportRequest(PlatformAnalyticsReport.postViewsByHour)}\r\n downloadImage={() => this.onDownloadImg(this.fetchpostViewsByHourImage, PlatformAnalyticsReport.postViewsByHour)}\r\n />\r\n }\r\n </Grid>\r\n </Grid>\r\n\r\n <Grid container spacing={1}>\r\n <Grid item xs={12} md={6}>\r\n {\r\n <TopSurveys\r\n tenant={this.props.tenantState.id}\r\n surveys={this.props.surveys?.length > 0 ? this.props.surveys : new Array<Survey>()}\r\n loading={this.state.isLoadingTopSurveyResponseAnalyticsOverview}\r\n downloadExcel={() => this.sendExcelReportRequest(PlatformAnalyticsReport.surveyWithMostResponse)}\r\n downloadImage={() => this.onDownloadImg(this.fetchSurveyWithMostResponseImage, PlatformAnalyticsReport.surveyWithMostResponse)}\r\n />\r\n }\r\n </Grid>\r\n <Grid item xs={12} md={6}>\r\n {\r\n <TopEvents \r\n tenant={this.props.tenantState.id} \r\n topEvents={this.props.topEvents?.length > 0 ? this.props.topEvents : new Array<TopEvent>()} \r\n loading={this.state.isLoadingTopEventsAnalyticsOverview} \r\n downloadExcel={() => this.sendExcelReportRequest(PlatformAnalyticsReport.mostViewedEvent)}\r\n downloadImage={() => this.onDownloadImg(this.fetchMostViewedEventImage, PlatformAnalyticsReport.mostViewedEvent)}\r\n />\r\n }\r\n </Grid>\r\n </Grid>\r\n </div>\r\n </MainContent>\r\n <div style={{textAlign: \"right\", paddingTop: \"4px\"}}>\r\n <span style={{color: \"#666666\", fontSize: \"12px\"}}>Data is updated and processed once per hour.</span>\r\n </div>\r\n </BasePage>\r\n );\r\n }\r\n\r\n private onDownloadImg = async (fetchImage: () => Promise<string | undefined> | undefined, reportType: string) => {\r\n this.setState({isLoadingImage: true})\r\n try {\r\n const payloadToDownload = await fetchImage();\r\n const reportName = this.GetReportFileName(reportType);\r\n const file = {\r\n name: `${reportName} ${this.state.reportPayload.startDate} to ${this.state.reportPayload.endDate}`,\r\n }\r\n\r\n if (payloadToDownload) {\r\n new FileDownloader(file).downloadProvided(payloadToDownload)\r\n }\r\n this.setState({isLoadingImage: false});\r\n }\r\n catch (e) {\r\n this.setState({isLoadingImage: false});\r\n } \r\n }\r\n \r\n private getAllAnalytics = () => {\r\n if (!this.props.readViewStats) {\r\n this.fetchReadViewStats(); //Average Post Views\r\n }\r\n else {\r\n this.setState({isLoadingReadsByTimeOfDayAnalyticsOverview: false});\r\n }\r\n\r\n if (!this.props.userCounts) {\r\n this.fetchUserCountsByMonth(); //Active Users\r\n }\r\n else {\r\n this.setState({isLoadingUsersByMonthAnalyticsOverview: false});\r\n }\r\n\r\n if (!this.props.commentAndReactionCounts) {\r\n this.fetchCommentAndReactionCounts(); //Post Reactions & Comments\r\n }\r\n else {\r\n this.setState({isLoadingCommentsByMonthAnalyticsOverview: false});\r\n }\r\n\r\n if (!this.props.platformStats) {\r\n this.fetchPlatformStats(); //Channel usage\r\n }\r\n else {\r\n this.setState({isLoadingAppUsageAnalyticsOverview: false});\r\n }\r\n\r\n if (!this.props.surveys) {\r\n this.fetchSurveys(); //Top surveys\r\n }\r\n else {\r\n this.setState({isLoadingTopSurveyResponseAnalyticsOverview: false});\r\n }\r\n\r\n if(!this.props.topEvents) {\r\n this.fetchTopEvents();\r\n }\r\n else {\r\n this.setState({isLoadingTopEventsAnalyticsOverview: false});\r\n }\r\n\r\n if(!this.props.userTrends) {\r\n this.fetchUserTrends();\r\n }\r\n else {\r\n this.setState({isLoadingUserTrendsAnalyticsOverview: false});\r\n }\r\n }\r\n\r\n private fetchUserCountsByMonth = () => {\r\n this.props.fetchUserCountsByMonth(this.state.reportFilter).then(() => {\r\n this.setState({isLoadingUsersByMonthAnalyticsOverview: false});\r\n });\r\n }\r\n\r\n private fetchPlatformStats = () => {\r\n this.props.fetchPlatformStats(this.state.reportFilter).then(() => {\r\n this.setState({isLoadingAppUsageAnalyticsOverview: false});\r\n });\r\n }\r\n\r\n private fetchCommentAndReactionCounts = () => {\r\n this.props.fetchCommentAndReactionCountsByMonth(this.state.reportFilter).then(() => {\r\n this.setState({isLoadingCommentsByMonthAnalyticsOverview: false});\r\n });\r\n }\r\n\r\n private fetchReadViewStats = () => {\r\n this.props.fetchReadViewStats(this.state.reportFilter).then(() => {\r\n this.setState({isLoadingReadsByTimeOfDayAnalyticsOverview: false});\r\n });\r\n }\r\n\r\n private fetchSurveys = () => {\r\n this.props.fetchSurveys(this.state.reportFilter).then(() => {\r\n this.setState({isLoadingTopSurveyResponseAnalyticsOverview: false});\r\n });\r\n }\r\n\r\n private fetchTopEvents = () => {\r\n this.props.fetchTopEvents(this.state.reportFilter).then(() => {\r\n this.setState({isLoadingTopEventsAnalyticsOverview: false});\r\n });\r\n }\r\n\r\n private fetchUserTrends = () => {\r\n this.props.fetchUserTrends(this.state.reportFilter).then(() => {\r\n this.setState({isLoadingUserTrendsAnalyticsOverview: false});\r\n });\r\n }\r\n\r\n private GetReportFileName = (reportType: string) => {\r\n switch (reportType) {\r\n case PlatformAnalyticsReport.channelUsage:\r\n return 'Channel Usage';\r\n case PlatformAnalyticsReport.commentsAndReactions:\r\n return 'Post Reactions and Comments';\r\n case PlatformAnalyticsReport.engagedUsers:\r\n return 'Engaged Users';\r\n case PlatformAnalyticsReport.mostViewedEvent:\r\n return 'Events with Most Views';\r\n case PlatformAnalyticsReport.mostViewedPost:\r\n return 'Posts with Most Views';\r\n case PlatformAnalyticsReport.postViewsByHour:\r\n return 'Post Views by Time of Day';\r\n case PlatformAnalyticsReport.surveyWithMostResponse:\r\n return 'Surveys with Most Responses';\r\n default: \r\n return \"\";\r\n }\r\n }\r\n\r\n\r\n private setReportPayload = (reportPayload: DownloadAllReport) => {\r\n this.setState({reportPayload: {...this.state.reportPayload, ...reportPayload}});\r\n }\r\n\r\n private fetchChannelsImage = async () : Promise<string | undefined> => {\r\n const channelUsageNode = document.getElementById(PlatformAnalyticsReport.channelUsage);\r\n\r\n if(channelUsageNode) {\r\n const dataUrl = await htmlToImage.toPng(channelUsageNode, {skipFonts: true});\r\n this.setReportPayload({channelUsage: dataUrl})\r\n\r\n return dataUrl;\r\n }\r\n return \r\n }\r\n\r\n private fetchMostViewedPostImage = async () : Promise<string | undefined> => {\r\n const mostViewedPostNode = document.getElementById(PlatformAnalyticsReport.mostViewedPost);\r\n this.setElementDisplay('none', document.getElementById(`${PlatformAnalyticsReport.mostViewedPost}-goto`));\r\n\r\n if(mostViewedPostNode) {\r\n const dataUrl = await htmlToImage.toPng(mostViewedPostNode, {skipFonts: true})\r\n\r\n this.setElementDisplay('block', document.getElementById(`${PlatformAnalyticsReport.mostViewedPost}-goto`));\r\n this.setReportPayload({mostViewedPosts: dataUrl});\r\n return dataUrl;\r\n }\r\n }\r\n\r\n private fetchMostViewedEventImage = async () : Promise<string | undefined> => {\r\n const mostViewedEventNode = document.getElementById(PlatformAnalyticsReport.mostViewedEvent);\r\n this.setElementDisplay('none', document.getElementById(`${PlatformAnalyticsReport.mostViewedEvent}-goto`));\r\n\r\n if(mostViewedEventNode) {\r\n const dataUrl = await htmlToImage.toPng(mostViewedEventNode, {skipFonts: true});\r\n this.setElementDisplay('block', document.getElementById(`${PlatformAnalyticsReport.mostViewedEvent}-goto`));\r\n this.setReportPayload({mostViewedEvents: dataUrl});\r\n return dataUrl;\r\n }\r\n }\r\n\r\n private fetchCommentsAndReactionsImage = async () : Promise<string | undefined> => {\r\n const commentsAndReactionsNode = document.getElementById(PlatformAnalyticsReport.commentsAndReactions);\r\n\r\n if(commentsAndReactionsNode) {\r\n const dataUrl = await htmlToImage.toPng(commentsAndReactionsNode, {skipFonts: true});\r\n this.setReportPayload({commentsAndReactions: dataUrl});\r\n return dataUrl;\r\n }\r\n }\r\n\r\n private fetchEngagedUsersImage = async () : Promise<string | undefined> => {\r\n const engagedUsersNode = document.getElementById(PlatformAnalyticsReport.engagedUsers);\r\n\r\n if(engagedUsersNode) {\r\n const dataUrl = await htmlToImage.toPng(engagedUsersNode, {skipFonts: true});\r\n this.setReportPayload({engagedUsers: dataUrl});\r\n return dataUrl;\r\n }\r\n }\r\n\r\n private fetchpostViewsByHourImage = async () : Promise<string | undefined> => {\r\n const postViewsByHourNode = document.getElementById(PlatformAnalyticsReport.postViewsByHour);\r\n if(postViewsByHourNode) {\r\n const dataUrl = await htmlToImage.toPng(postViewsByHourNode, {skipFonts: true});\r\n this.setReportPayload({postViewsByHour: dataUrl});\r\n return dataUrl;\r\n }\r\n }\r\n\r\n private fetchSurveyWithMostResponseImage = async () : Promise<string | undefined>=> {\r\n const surveyWithMostResponseImageNode = document.getElementById(PlatformAnalyticsReport.surveyWithMostResponse);\r\n this.setElementDisplay('none', document.getElementById(`${PlatformAnalyticsReport.surveyWithMostResponse}-goto`));\r\n\r\n if(surveyWithMostResponseImageNode) {\r\n const dataUrl = await htmlToImage.toPng(surveyWithMostResponseImageNode, {skipFonts: true});\r\n this.setElementDisplay('block', document.getElementById(`${PlatformAnalyticsReport.surveyWithMostResponse}-goto`));\r\n this.setReportPayload({surveysWithMostResponse: dataUrl});\r\n\r\n return dataUrl;\r\n }\r\n }\r\n\r\n private setElementDisplay(display: string, element?: HTMLElement | null) {\r\n if(element) {\r\n element.style.display = display;\r\n }\r\n }\r\n\r\n private sendAllExcelReportRequest = async () => {\r\n const handleReportRequest = () => {\r\n try {\r\n reportsApi.SendAllAnalyticsReportRequest(this.state.reportPayload);\r\n this.setState({resultMessage:\"Your report is being generated and will be emailed to you when it's ready.\"});\r\n }\r\n catch(e){\r\n this.setState({resultMessage:\"Something went wrong. Please try again.\"});\r\n }\r\n }\r\n\r\n this.updateClientTime(handleReportRequest);\r\n }\r\n\r\n private sendExcelReportRequest = async (reportType: string) => {\r\n const handleReportRequest = () => {\r\n try {\r\n reportsApi.SendAnalyticsReportRequest(this.state.reportPayload, reportType);\r\n this.setState({resultMessage:\"Your report is being generated and will be emailed to you when it's ready.\"});\r\n }\r\n catch(e){\r\n this.setState({resultMessage:\"Something went wrong. Please try again.\"});\r\n }\r\n }\r\n\r\n this.updateClientTime(handleReportRequest);\r\n }\r\n\r\n private updateClientTime = (action: () => void) => {\r\n const tz = getCurrentTimeInUserTimezone();\r\n this.setState({\r\n reportPayload: {\r\n ...this.state.reportPayload,\r\n clientTimeZone: tz.format('z'),\r\n clientTimeOffset: tz.format('Z')\r\n }\r\n }, () => action())\r\n }\r\n\r\n private downloadAllReportAsImage = async() => {\r\n this.setState({isLoadingImage: true});\r\n\r\n try {\r\n await Promise.all([\r\n this.fetchChannelsImage(),\r\n this.fetchMostViewedPostImage(),\r\n this.fetchCommentsAndReactionsImage(),\r\n this.fetchEngagedUsersImage(),\r\n this.fetchMostViewedEventImage(),\r\n this.fetchpostViewsByHourImage(),\r\n this.fetchSurveyWithMostResponseImage()\r\n ]);\r\n this.downloadReport(store.getState().config.downloadAllAnalyticsReportAsImage, loadTypes.image);\r\n }\r\n catch {\r\n this.setState({isLoadingImage: false});\r\n }\r\n }\r\n\r\n private downloadReport = (url: string, toReset: loadTypes) => {\r\n this.updateClientTime(() => this.fetchReport(url, toReset));\r\n }\r\n \r\n private setTotalSubscribers = () => {\r\n if (this.state.reportFilter.audiences!.length > 0) {\r\n insightsApi.GetTotalSubscribers(store.getState().config.totalUsersInAudiences, { audiencesOrTopics: this.state.reportFilter.audiences})\r\n .then((response) => {\r\n this.setState({totalSubscribers: response});\r\n });\r\n } else if (this.state.reportFilter.topics!.length > 0) {\r\n insightsApi.GetTotalSubscribers(store.getState().config.totalUsersSubscribedInTopics, { audiencesOrTopics: this.state.reportFilter.topics})\r\n .then((response) => {\r\n this.setState({totalSubscribers: response});\r\n });\r\n }\r\n }\r\n\r\n private onChangeFilters = (filters: Partial<AnalyticsReportFilters>) => {\r\n if(!shallowEqual(filters, this.state.reportFilter) || this.props.toFetch) {\r\n const updatedFilters = { ...this.state.reportFilter, ...filters };\r\n this.setState({\r\n reportFilter: updatedFilters,\r\n reportPayload: {...this.state.reportPayload, ...updatedFilters},\r\n isLoadingCommentsByMonthAnalyticsOverview: true,\r\n isLoadingUsersByMonthAnalyticsOverview: true,\r\n isLoadingReadsByTimeOfDayAnalyticsOverview: true,\r\n isLoadingTopSurveyResponseAnalyticsOverview: true,\r\n isLoadingAppUsageAnalyticsOverview: true,\r\n isLoadingTopEventsAnalyticsOverview: true,\r\n isLoadingUserTrendsAnalyticsOverview: true,\r\n }, () => {\r\n this.fetchCommentAndReactionCounts();\r\n this.fetchUserCountsByMonth();\r\n this.fetchReadViewStats();\r\n this.fetchSurveys();\r\n this.fetchPlatformStats();\r\n this.fetchTopEvents();\r\n this.fetchUserTrends();\r\n this.setTotalSubscribers();\r\n });\r\n }\r\n if(!this.props.toFetch) {\r\n this.props.setToFetch(true);\r\n }\r\n }\r\n\r\n private fetchReport = (url: string, toReset: loadTypes) => { \r\n const file = {\r\n name: this.assembleReportFileName(),\r\n type: 'application/x-zip-compressed'\r\n }\r\n return insightsApi.DownloadInsightReport(url, this.state.reportPayload)\r\n .then((data) => new FileDownloader(file).downloadBlob(data))\r\n .then(_ => this.resetLoading(toReset))\r\n .catch(_ => this.resetLoading(toReset));\r\n }\r\n\r\n private assembleReportFileName = () : string => {\r\n const endFormat = \"DD-MMM-YY\";\r\n const originalFormat = 'MMM D, YYYY, h:mmA';\r\n\r\n const startDate = moment(this.state.reportFilter.startDate, originalFormat).format(endFormat);\r\n const endDate = moment(this.state.reportFilter.endDate, originalFormat).format(endFormat);\r\n return `Sparrow Connected - ${startDate} to ${endDate}.zip`;\r\n }\r\n\r\n private resetLoading(toReset: loadTypes) {\r\n switch (toReset) {\r\n case loadTypes.image:\r\n this.setState({ isLoadingImage: false });\r\n break;\r\n\r\n case loadTypes.excel:\r\n this.setState({ isLoadingExcel: false });\r\n break;\r\n\r\n case loadTypes.all:\r\n this.setState({ isLoadingAll: false });\r\n break;\r\n }\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n intl: IntlShape;\r\n}\r\n\r\ninterface ComponentState {\r\n isLoadingUsersByMonthAnalyticsOverview: boolean;\r\n isLoadingAppUsageAnalyticsOverview: boolean;\r\n isLoadingCommentsByMonthAnalyticsOverview: boolean;\r\n isLoadingReadsByTimeOfDayAnalyticsOverview: boolean;\r\n isLoadingTopSurveyResponseAnalyticsOverview: boolean;\r\n isLoadingTopEventsAnalyticsOverview: boolean;\r\n isLoadingUserTrendsAnalyticsOverview: boolean;\r\n isLoadingImage: boolean;\r\n isLoadingExcel: boolean;\r\n isLoadingAll: boolean;\r\n reportFilter: AnalyticsReportFilters;\r\n reportPayload: DownloadAllReport;\r\n audiences: Audience[];\r\n totalSubscribers: number;\r\n resultMessage: string;\r\n}\r\n\r\ninterface RouteParams { tenant: string }\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps<RouteParams>) => ({\r\n ...ownProps,\r\n postStats: state.insights.postStats,\r\n topTags: state.insights.topChannels,\r\n userCounts: state.insights.userCounts,\r\n commentAndReactionCounts: state.insights.commentAndReactionCounts,\r\n platformStats: state.insights.platformStats,\r\n readViewStats: state.insights.readViewStats,\r\n tenantState: state.tenant,\r\n commentEnabled: state.settings.tenantSettings.commentsEnabled,\r\n surveys: state.insights.surveys,\r\n topEvents: state.insights.topEvents,\r\n userTrends: state.insights.userTrends,\r\n analyticsErrorMessage: state.config.AnalyticsErrorMessage,\r\n toFetch: state.insights.toFetch,\r\n tenantSettings: state.settings.tenantSettings,\r\n asyncReportsEnabled: state.settings.tenantSettings.showFeatures.asyncReportProcessingEnabled\r\n }),\r\n {\r\n fetchPostStats: actions.fetchPostStats,\r\n fetchTopTags: actions.fetchTopChannels,\r\n fetchReadViewStats: actions.fetchReadViewStats,\r\n fetchUserCountsByMonth: actions.fetchUserCountsByMonth,\r\n fetchCommentAndReactionCountsByMonth: actions.fetchCommentAndReactionCountsByMonth,\r\n fetchPlatformStats: actions.fetchPlatformStats,\r\n fetchSurveys: actions.fetchSurveyStats,\r\n fetchTopEvents: actions.fetchTopEvents,\r\n fetchUserTrends: actions.fetchUserTrends,\r\n setToFetch: actions.setToFetch\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default injectIntl(withRouter(connector(Dashboard)));\r\n","import * as React from 'react';\r\nimport TenantLink from 'modules/common/components/tenantLink';\r\nimport { HorizontalBarChart, HBarChartProps, HBarChartDataPoint } from './charts/horizontalBarChart';\r\nimport WindowResizeListener from 'modules/common/components/window-resize-listener';\r\nimport {FormattedMessage} from \"react-intl\";\r\nimport {connect, ConnectedProps} from \"react-redux\";\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport Loading from 'modules/common/components/loading';\r\nimport { PlatformAnalyticsReport, TopEvent } from '../models';\r\nimport { useEffect } from 'react';\r\nimport EmptyDataMessage from './emptyDataMessage';\r\nimport DownloadIcon from './downloadIconSvg';\r\nimport { browserHistory } from 'configureStore';\r\nimport EventPreview from 'modules/events/components/event-views/eventPreview';\r\nimport { getDraft } from 'modules/events/actionCreator';\r\nimport { ImageScale } from 'modules/posts/models';\r\nimport { Event } from 'modules/events';\r\nimport { UserRoleStrings } from 'modules/authorization/models';\r\nimport { getHighestRole } from 'utils/userRoleUtils';\r\n\r\ninterface ComponentProps {\r\n tenant: string\r\n topEvents: TopEvent[];\r\n loading: boolean;\r\n downloadExcel: () => void;\r\n downloadImage: () => void;\r\n}\r\n\r\nconst TopEvents: React.FunctionComponent<PropsWithRedux> = props => {\r\n let chart = React.useRef<HorizontalBarChart>();\r\n let chartElement = React.useRef<HTMLElement>();\r\n\r\n const [selectedEvent, setSelectedEvent] = React.useState<Event | undefined>(undefined);\r\n\r\n const getEventDraft = props.getDraft;\r\n\r\n const getBarChartState = React.useCallback((): HBarChartProps => {\r\n\r\n const handleEventClick = async (e: HBarChartDataPoint) => {\r\n try {\r\n const selected = await getEventDraft(e.id, ImageScale.Modal);\r\n setSelectedEvent(selected);\r\n } catch (error) {\r\n setSelectedEvent(undefined);\r\n }\r\n }\r\n\r\n return {\r\n el: chartElement.current,\r\n locale: props.locale,\r\n width: \"100%\",\r\n height: 'auto',\r\n barHeight: 20,\r\n data: props.topEvents.map(s => {\r\n return {\r\n id: s.draftId,\r\n label: s.eventName,\r\n value: s.viewCount,\r\n onClick: handleEventClick,\r\n };\r\n }),\r\n labelWidth: 200\r\n } as HBarChartProps;\r\n }, [props.topEvents, props.locale, getEventDraft]);\r\n\r\n const onEditEvent = () => {\r\n if (selectedEvent) {\r\n browserHistory.push(`/${props.tenant}/admin/events/edit/${selectedEvent.id}`)\r\n }\r\n }\r\n \r\n const onHideEvent = () => {\r\n setSelectedEvent(undefined)\r\n }\r\n\r\n useEffect(() => {\r\n chart.current = new HorizontalBarChart(getBarChartState());\r\n\r\n return function cleanup() {\r\n if (chart && chart.current) {\r\n chart.current.destroy();\r\n }\r\n };\r\n });\r\n\r\n useEffect(() => {\r\n if (chart && chart.current) {\r\n chart.current.update(getBarChartState());\r\n }\r\n }, [props, getBarChartState]);\r\n\r\n const noDataAvailable = !props.topEvents || props.topEvents.length === 0;\r\n\r\n return (\r\n <div id={PlatformAnalyticsReport.mostViewedEvent} className=\"analytics-widget\">\r\n {\r\n selectedEvent && \r\n <EventPreview\r\n show={selectedEvent !== undefined}\r\n event={selectedEvent}\r\n onEditDetails={onEditEvent} onClose={onHideEvent}\r\n isContributor={getHighestRole(props.currentUser) === UserRoleStrings.CONTRIBUTOR}\r\n inEditor={false}\r\n />\r\n }\r\n <div className='downloadIcon' id={`${PlatformAnalyticsReport.mostViewedEvent}-downloadIcon`}> \r\n <DownloadIcon \r\n downloadExcel={props.downloadExcel}\r\n downloadImage={props.downloadImage}\r\n />\r\n </div>\r\n <div className=\"header\">\r\n Top 10 Events with Most Views\r\n </div>\r\n {props.loading ? \r\n <div className=\"body\" style={{position: \"relative\", top: \"55px\", height: \"85%\"}}>\r\n <Loading/>\r\n </div>\r\n : <div className=\"body\" style={{height: noDataAvailable ? \"175px\" : \"215px\"}}>\r\n {\r\n noDataAvailable ?\r\n <EmptyDataMessage/>\r\n \r\n : <div ref={e => chartElement.current = e!} className=\"bar-chart-widget\"></div>\r\n }\r\n <WindowResizeListener onChange={() => chart.current?.update(getBarChartState())} />\r\n </div>\r\n }\r\n <footer id={`${PlatformAnalyticsReport.mostViewedEvent}-goto`} style={{position: \"relative\", top: \"-8px\"}}>\r\n <TenantLink to={`~/admin/events`}>\r\n <FormattedMessage id=\"events.viewAllEvents\" defaultMessage=\"Go to Manage Events\"/>\r\n </TenantLink>\r\n </footer>\r\n </div>\r\n )\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n locale: state.localization.locale,\r\n currentUser: state.settings.currentUser\r\n }),\r\n {\r\n getDraft: getDraft,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(TopEvents)","import { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { IntlShape, injectIntl } from \"react-intl\";\r\nimport { Button, Menu, MenuItem } from \"@mui/material\";\r\nimport * as React from 'react';\r\nimport ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown';\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\ninterface ComponentProps { \r\n downloadAllImage: () => void;\r\n downloadAllExcel: () => void;\r\n loadingImage?: boolean;\r\n loadingExcel?: boolean;\r\n loadingAll?: boolean;\r\n intl: IntlShape;\r\n}\r\n\r\nconst DownloadReportsDropdown: React.FunctionComponent<PropsWithRedux> = (props) => {\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const open = Boolean(anchorEl);\r\n\r\n const handleClick = (e) => {\r\n setAnchorEl(e.currentTarget);\r\n }\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n }\r\n\r\n const showLoadingSpinner = () => {\r\n return (\r\n <div style={{marginLeft: \"auto\", position: \"relative\", top: \"-10px\", height: \"20px\"}}>\r\n <Loading style={{width: \"18px\", height: \"18px\"}}/>\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div>\r\n <Button\r\n id=\"report-button\"\r\n aria-controls={open ? 'basic-menu' : undefined}\r\n aria-haspopup=\"true\"\r\n aria-expanded={open ? 'true' : undefined}\r\n onClick={handleClick}\r\n variant=\"contained\"\r\n color=\"primary\"\r\n endIcon={<ArrowDropDownIcon/>}\r\n >\r\n Download Reports\r\n </Button>\r\n <Menu\r\n id=\"report-menu\"\r\n anchorEl={anchorEl}\r\n open={open}\r\n onClick={handleClose}\r\n onClose={handleClose}\r\n MenuListProps={{\r\n 'aria-labelledby': 'report-button',\r\n }}\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n transformOrigin={{ vertical: \"top\", horizontal: \"right\" }}\r\n PaperProps={{\r\n style: {\r\n transform: 'translateY(6px)',\r\n }\r\n }}\r\n >\r\n <MenuItem style={{width: \"250px\"}} onClick={props.downloadAllImage} disabled={props.loadingImage}>\r\n {props.intl.formatMessage({ id: 'insights.downloadAsImg', defaultMessage: \"as Images\" })}\r\n { props.loadingImage && showLoadingSpinner() }\r\n </MenuItem>\r\n <MenuItem onClick={props.downloadAllExcel} disabled={props.loadingExcel}>\r\n {props.intl.formatMessage({ id: 'insights.downloadAsExcel', defaultMessage: \"as Excel\" })}\r\n { props.loadingExcel && showLoadingSpinner() }\r\n </MenuItem>\r\n </Menu>\r\n </div>\r\n )\r\n}\r\n\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n }), \r\n {\r\n }\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default injectIntl(connector(DownloadReportsDropdown));","import * as React from \"react\";\r\nimport { TenantSettingsTagGroup } from \"modules/settings\";\r\nimport { FormattedNumber, FormattedMessage } from \"react-intl\";\r\nimport { TagStats, defaultTagStats } from \"modules/insights\";\r\nimport * as settingsActions from 'modules/settings/actionCreator'\r\nimport TenantLink from 'modules/common/components/tenantLink';\r\nimport { connect, ConnectedProps } from \"react-redux\"\r\nimport { injectIntl, IntlShape } from \"react-intl\";\r\nimport \"./tagListItem.sass\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport LoadingSpinner from \"modules/common/components/loadingSpinner\";\r\nimport confirm from 'utils/notyPopups';\r\n\r\n\r\ninterface ComponentProps {\r\n tagGroup: TenantSettingsTagGroup;\r\n tagStats: TagStats[];\r\n intl: IntlShape;\r\n createNewTag: (id: string) => void;\r\n closeModal: () => void;\r\n onDropOnGroup: (tagGroupID: string) => void;\r\n onDragTagStart: (e: React.DragEvent<HTMLDivElement>, tagId: string) => void;\r\n onDragTagEnd: (e: React.DragEvent<HTMLDivElement>) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n editingGroupId: string\r\n}\r\n\r\nclass TagListItem extends React.Component<PropsWithRedux, ComponentState> {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n editingGroupId: \"\"\r\n }\r\n }\r\n\r\n public render() {\r\n let group = this.props.tagGroup;\r\n let tags = group.tags;\r\n let working = this.props.saving || this.props.fetching;\r\n\r\n return <tr onDragOver={(e) => e.preventDefault()}\r\n onDrop={(e) => { this.props.onDropOnGroup(group.id) }}>\r\n <td colSpan={4}>\r\n <div className=\"group\">\r\n {\r\n group.isNew || group.id === this.state.editingGroupId ?\r\n <div className=\"new-tag\">\r\n <input type=\"text\"\r\n className=\"form-control\"\r\n value={group.name}\r\n placeholder=\"new topic group name\"\r\n readOnly={working || !this.props.canEdit}\r\n onChange={(e) => this.handleTagGroupNameChange(e, group)}\r\n />\r\n <button\r\n disabled={group.name === \"\" || working}\r\n onClick={this.handleSave}>\r\n {\r\n this.props.saving ?\r\n <LoadingSpinner size={\"14px\"} />\r\n : <FormattedMessage id=\"common.save\" defaultMessage=\"Save\" />\r\n }\r\n </button>\r\n {\r\n this.state.editingGroupId === group.id ?\r\n <button\r\n onClick={() => this.setState({ ...this.state, editingGroupId: \"\" })}>\r\n <FormattedMessage id=\"common.cancel\" defaultMessage=\"Cancel\" />\r\n </button>\r\n : null\r\n }\r\n </div>\r\n : <div style={{ display: \"flex\" }}>\r\n <p>{group.name}</p>\r\n {\r\n group.disabled ?\r\n <span style={{ color: '#595959', fontStyle: 'italic', marginLeft: '10px' }}>\r\n (disabled)\r\n </span>\r\n : <button\r\n className=\"add-tag\"\r\n disabled={working}\r\n onClick={() => this.props.createNewTag(group.id)}>\r\n {\r\n this.props.saving ?\r\n <LoadingSpinner size={\"14px\"} />\r\n : \"+ New Topic\"\r\n }\r\n </button>\r\n }\r\n <button className=\"disable-btn\"\r\n disabled={working || !this.props.canEdit}\r\n onClick={() => this.toggleDisableTagGroup(group)}>\r\n {\r\n group.disabled ?\r\n <FormattedMessage id=\"common.enableGroup\" defaultMessage=\"Enable group\" />\r\n : <FormattedMessage id=\"common.disableGroup\" defaultMessage=\"Disable group\" />\r\n }\r\n </button>\r\n {\r\n (group.tags.length === 0 || group.tags.every(t => t.deleted)) ?\r\n <button className=\"grp-delete-btn\"\r\n disabled={working || !this.props.canEdit}\r\n onClick={() => this.toggleDeletedTagGroup(group)}>\r\n Delete Group\r\n <i className=\"material-icons\" style={{ verticalAlign: \"top\", fontSize: \"16px\", marginLeft: '4px' }}>delete</i>\r\n </button>\r\n : null\r\n }\r\n <button\r\n className=\"edit-btn\"\r\n disabled={working}\r\n title=\"Edit topic group name\"\r\n onClick={() => this.setState({ ...this.state, editingGroupId: group.id })}>\r\n <i className=\"material-icons\">edit</i>\r\n </button>\r\n </div>\r\n }\r\n\r\n </div>\r\n {\r\n tags.length === 0 ?\r\n <div className=\"tag-detail border\" style={{ height: '45px' }} />\r\n : tags.map(t => {\r\n let currentTagStats = this.props.tagStats.find(tag => tag.id === t.id) || defaultTagStats;\r\n\r\n return (\r\n <div className=\"tag-detail border\" key={t.id}\r\n draggable={true}\r\n onDragStart={(e) => { this.props.onDragTagStart(e, t.id) }}\r\n onDragEnd={(e) => { this.props.onDragTagEnd(e) }}>\r\n\r\n <div className=\"tag-row\">\r\n <div style={{\r\n display: \"flex\",\r\n flexDirection: \"row\"\r\n }}>\r\n <span className=\"drag-handle\">....<br />....</span>\r\n {\r\n <div>\r\n <TenantLink\r\n className=\"post-title-link\"\r\n to={`~/admin/topics/${group.id}/${t.id}`}>\r\n {t.name}\r\n </TenantLink>\r\n {\r\n t.disabled ?\r\n <span style={{ color: '#595959', fontStyle: 'italic', marginLeft: '10px' }}>\r\n (disabled)\r\n </span>\r\n : null\r\n }\r\n </div>\r\n }\r\n\r\n <div style={{ display: \"flex\" }}>\r\n {\r\n t.mandatory ?\r\n <i className=\"material-icons\" style={{ verticalAlign: \"sub\", fontSize: '16px', marginLeft: \"10px\" }}>priority_high</i>\r\n : null\r\n }\r\n {\r\n t.default ?\r\n <i className=\"material-icons\" style={{ verticalAlign: \"sub\", fontSize: '16px', marginLeft: \"10px\" }}>done</i>\r\n : null\r\n }\r\n {\r\n t.restricted ?\r\n <i className=\"material-icons\" style={{ verticalAlign: \"sub\", fontSize: '16px', marginLeft: \"10px\" }}>lock</i>\r\n : null\r\n }\r\n </div>\r\n\r\n </div>\r\n\r\n <div className=\"stat\">\r\n {\r\n currentTagStats.id === \"\"\r\n ? <div title={\"Not enough data yet.\"}>-</div>\r\n : <div ><FormattedNumber value={currentTagStats.subscriberCount} /></div>\r\n }\r\n {\r\n currentTagStats.id === \"\" ? <div title={\"Not enough data yet.\"}>-</div> : <div><FormattedNumber value={currentTagStats.postCount} /></div>\r\n }\r\n {\r\n currentTagStats.id === \"\" ? <div title={\"Not enough data yet.\"}>-</div> : <div><FormattedNumber value={currentTagStats.viewCount} /></div>\r\n }\r\n </div>\r\n\r\n </div>\r\n </div>)\r\n })\r\n }\r\n </td>\r\n </tr>\r\n\r\n }\r\n\r\n private handleTagGroupNameChange = (e: React.FormEvent<HTMLInputElement>, tagGroup: TenantSettingsTagGroup) => {\r\n let input = e.target as HTMLInputElement;\r\n this.props.updateTagGroup(tagGroup.id, input.value, tagGroup.disabled, tagGroup.deleted);\r\n }\r\n\r\n private toggleDisableTagGroup = async (tagGroup: TenantSettingsTagGroup) => {\r\n let toggleGroup = true;\r\n if (!tagGroup.disabled) toggleGroup = await confirm.show({ text: `Are you sure you want to disable the topic group ${tagGroup.name}? All contained topics will also be disabled.`, title: \"Disable topic group\" });\r\n if (toggleGroup) {\r\n this.props.updateTagGroup(tagGroup.id, tagGroup.name, !tagGroup.disabled, tagGroup.deleted);\r\n this.props.saveTenantSettings();\r\n }\r\n }\r\n\r\n private toggleDeletedTagGroup = async (tagGroup: TenantSettingsTagGroup) => {\r\n if (await confirm.show({ text: `Are you sure you want to delete the topic group ${tagGroup.name}?`, title: \"Delete topic group\" })) {\r\n this.props.updateTagGroup(tagGroup.id, tagGroup.name, tagGroup.disabled, !tagGroup.deleted);\r\n this.props.saveTenantSettings();\r\n }\r\n }\r\n\r\n private handleSave = () => {\r\n this.setState({ ...this.state, editingGroupId: \"\" });\r\n this.props.saveTenantSettings();\r\n }\r\n\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n fetching: state.settings.fetching,\r\n saving: state.settings.saving,\r\n tenantSettings: state.settings.tenantSettings,\r\n canEdit: state.settings.tenantSettings.manageTopicsAudiencesInAdmin\r\n }),\r\n {\r\n updateTagGroup: settingsActions.updateTagGroup,\r\n saveTenantSettings: settingsActions.saveTenantSettings\r\n }\r\n)\r\n\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default injectIntl(connector(TagListItem));","import * as React from \"react\";\r\nimport Modal from \"modules/common/components/modal\";\r\nimport './tagSubscriptionManagerModal.sass'\r\nimport { injectIntl, IntlShape, FormattedMessage } from \"react-intl\";\r\nimport { Audience } from \"modules/audiences/models\";\r\nimport { audiencesApi } from \"api/instances\";\r\nimport { TenantSettingsTag } from \"modules/settings\";\r\nimport confirm from 'utils/notyPopups';\r\nimport \"./tagListItem.sass\";\r\nimport ToggleSwitch from \"modules/common/components/toggleSwitch\";\r\nimport MultiSelect from \"modules/common/components/forms/inputs/multiselect\";\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n closeModal: () => void;\r\n intl: IntlShape;\r\n saveNewTag: () => void;\r\n newTag: TenantSettingsTag | undefined;\r\n updateTag: (id: string,\r\n name: string,\r\n mandatory: boolean,\r\n defaultValue: boolean,\r\n disabled: boolean,\r\n deleted: boolean,\r\n restricted: boolean,\r\n restrictedTo: string[],\r\n mandatoryFor: string[],\r\n defaultFor: string[]\r\n ) => void;\r\n errorMssg: string;\r\n showAudiences: boolean;\r\n}\r\n\r\ninterface ComponentState {\r\n audiences: Audience[];\r\n fetching: boolean;\r\n saving: boolean;\r\n confirmShowing: boolean;\r\n}\r\n\r\nclass TagCreationModal extends React.PureComponent<ComponentProps, ComponentState> {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n audiences: [],\r\n fetching: true,\r\n saving: false,\r\n confirmShowing: false\r\n }\r\n }\r\n\r\n public componentDidMount() {\r\n audiencesApi.getAllAudiences()\r\n .then(response => {\r\n this.setState({\r\n audiences: response,\r\n fetching: false\r\n });\r\n })\r\n }\r\n\r\n public render() {\r\n let tag = this.props.newTag;\r\n\r\n return (<Modal active={this.props.show}\r\n title={this.props.intl.formatMessage({id: \"common.topicCreation\", defaultMessage: 'Create New Topic'})}\r\n showControls={true}\r\n onCloseClick={this.handleModalCloseClick}\r\n buttons={[\r\n { title: \"Save\", workingTitle: \"Saving...\", isWorking: this.state.saving, isPrimary: true, isEnabled: !this.state.saving && this.props.newTag?.name !== \"\", onClick: this.props.saveNewTag },\r\n { title: \"Cancel\", isPrimary: false, isEnabled: !this.state.saving, onClick: this.props.closeModal }\r\n\r\n ]}\r\n hideForNoty={true}\r\n >\r\n <div className=\"new-tag-modal\">\r\n <div className=\"option-wrapper\">\r\n <label>Topic name</label>\r\n <input className=\"form-control\"\r\n autoComplete=\"off\"\r\n value={this.props.newTag?.name}\r\n style={{width: \"200px\", height: \"18px\"}}\r\n onChange={(e) => this.handleTagNameChange(e)}\r\n />\r\n </div>\r\n\r\n <div className=\"option-wrapper\">\r\n <label>Mandatory</label>\r\n <ToggleSwitch\r\n value={tag?.mandatory || false}\r\n onClick={this.toggleTagMandatory}\r\n disabled={tag?.disabled} />\r\n\r\n </div>\r\n <p><FormattedMessage id=\"common.mandatoryTopic\" defaultMessage=\"Users in the selected audiences will always be subscribed to this topic. If no audiences are selected, all users will always be subscribed.\"/></p>\r\n <div className=\"select-wrapper\">\r\n {\r\n this.renderSelection(\"mandatory\")\r\n }\r\n </div>\r\n <div className=\"option-wrapper\">\r\n <label>Default</label>\r\n <ToggleSwitch\r\n value={tag?.default || false}\r\n onClick={this.toggleTagDefault}\r\n disabled={tag?.disabled} />\r\n\r\n </div>\r\n <p><FormattedMessage id=\"common.defaultTopic\" defaultMessage=\"New users in the selected audiences will always be subscribed to this topic by default. If no audiences are selected, all new users will be subscribed by default.\"/></p>\r\n <div className=\"select-wrapper\">\r\n {\r\n this.renderSelection(\"default\")\r\n }\r\n </div>\r\n {\r\n this.props.showAudiences ?\r\n <span>\r\n <div className=\"option-wrapper\">\r\n <label>Restricted</label>\r\n <ToggleSwitch\r\n value={tag?.restricted || false}\r\n onClick={this.toggleTagRestricted}\r\n disabled={tag?.disabled} />\r\n\r\n </div>\r\n <p><FormattedMessage id=\"common.restrictedTopic\" defaultMessage=\"Users must be a part of the selected audiences to see this topic. Restricted topics must have at least one audience.\"/></p>\r\n <div className=\"select-wrapper\">\r\n {\r\n this.renderSelection(\"restricted\")\r\n }\r\n </div>\r\n </span>\r\n : null\r\n }\r\n <div className=\"error-mssg\">\r\n {this.props.errorMssg}\r\n </div>\r\n </div>\r\n\r\n\r\n </Modal>);\r\n }\r\n\r\n private handleModalCloseClick = () => {\r\n this.props.closeModal();\r\n }\r\n\r\n private handleTagNameChange = (e: React.FormEvent<HTMLInputElement>) => {\r\n let input = e.target as HTMLInputElement;\r\n let tag = this.props.newTag;\r\n if (tag) {\r\n this.props.updateTag(tag.id, input.value, tag.mandatory, tag.default, tag.disabled, tag.deleted, tag.restricted, tag.restrictedTo, tag.mandatoryFor, tag.defaultFor);\r\n }\r\n }\r\n\r\n private toggleTagMandatory = () => {\r\n let tag = this.props.newTag;\r\n if (tag) {\r\n let newMandatoryFor = tag.mandatoryFor;\r\n if (tag.mandatory && tag.mandatoryFor.length > 0) { //if mandatory was on and had mandatoryFor list, empty it before turning off\r\n newMandatoryFor = [];\r\n }\r\n this.props.updateTag(tag.id, tag.name, !tag.mandatory, tag.default, tag.disabled, tag.deleted, tag.restricted, tag.restrictedTo, newMandatoryFor, tag.defaultFor);\r\n }\r\n }\r\n\r\n private toggleTagDefault = () => {\r\n let tag = this.props.newTag;\r\n if (tag) {\r\n let newDefaultFor = tag.defaultFor;\r\n if (tag.default && tag.defaultFor.length > 0) { //if default was on and had defaultFor list, empty it before turning off\r\n newDefaultFor = [];\r\n }\r\n this.props.updateTag(tag.id, tag.name, tag.mandatory, !tag.default, tag.disabled, tag.deleted, tag.restricted, tag.restrictedTo, tag.mandatoryFor, newDefaultFor);\r\n }\r\n }\r\n\r\n private toggleTagRestricted = async () => {\r\n let tag = this.props.newTag;\r\n if (tag) {\r\n var newRestrictedTo;\r\n if (!tag.restricted) { //if restricted was off, confirm turning it on\r\n this.setState({...this.state, confirmShowing: true})\r\n if (! (await confirm.show({ text: 'Posts published with this topic will only be visible to users in the selected audience(s). <br/><br/>Do you want to continue?', title: 'Set topic as restricted' }))) {\r\n this.setState({...this.state, confirmShowing: false})\r\n return; //if declines return\r\n }\r\n newRestrictedTo = tag.restrictedTo;\r\n }\r\n if (tag.restricted) { //if restricted was on, confirm turning it off\r\n if (! (await confirm.show({ text: 'Posts published with this topic may become visible to anyone in your organization. <br/><br/>Do you want to continue?', title: 'Removing restriction from topic' }))) {\r\n return; //if declines return\r\n }\r\n newRestrictedTo = [];\r\n }\r\n\r\n this.props.updateTag(tag.id, tag.name, tag.mandatory, tag.default, tag.disabled, tag.deleted, !tag.restricted, newRestrictedTo, tag.mandatoryFor, tag.defaultFor)\r\n }\r\n }\r\n\r\n private renderSelection = (type: string) => {\r\n let options = this.state.audiences.map(a => ({ label: a.displayName, value: a.id }))\r\n\r\n const selectStyles = {\r\n multiValue: (styles) => {\r\n return {\r\n ...styles,\r\n backgroundColor: \"rgba(242,249,252,0.2)\",\r\n border: \"1px solid rgba(201,230,242)\",\r\n color: \"rgb(3,169,244)\"\r\n };\r\n }\r\n }\r\n\r\n let placeholder = \"\";\r\n let audienceValues: string[] = [];\r\n let isTypeOn = false;\r\n if (this.props.newTag) {\r\n if(type === \"mandatory\") {\r\n isTypeOn = this.props.newTag.mandatory;\r\n audienceValues = this.props.newTag.mandatoryFor;\r\n if (isTypeOn) {\r\n placeholder = \"Everyone or select audience(s)...\";\r\n }\r\n }\r\n else if(type === \"default\") {\r\n isTypeOn = this.props.newTag.default;\r\n audienceValues = this.props.newTag.defaultFor;\r\n if (isTypeOn) {\r\n placeholder = \"Everyone or select audience(s)...\";\r\n }\r\n }\r\n else {\r\n isTypeOn = this.props.newTag.restricted;\r\n audienceValues = this.props.newTag.restrictedTo;\r\n if (isTypeOn) {\r\n placeholder = \"Restricted subscription for....\";\r\n }\r\n }\r\n }\r\n\r\n let initialValues = (audienceValues|| []).map(a => ({ label: (this.state.audiences.find(al => al.id === a) || { displayName: 'unknown' }).displayName, value: a }));\r\n\r\n if (!this.props.showAudiences) {\r\n placeholder = \"Everyone\";\r\n }\r\n\r\n return (\r\n <MultiSelect\r\n placeholder={placeholder}\r\n options={options}\r\n onChange={this.onAudiencesChange(type)}\r\n value={initialValues}\r\n isDisabled={!isTypeOn}\r\n styles={selectStyles}\r\n components={ !this.props.showAudiences ? { DropdownIndicator:() => null , IndicatorSeparator:() => null } : { } }\r\n />\r\n )\r\n }\r\n\r\n private updateTagGroups = (tag: TenantSettingsTag | undefined, audienceIds: string[], type: string) => {\r\n if (tag) {\r\n if (type === \"mandatory\") {\r\n this.props.updateTag(tag.id, tag.name, tag.mandatory, tag.default, tag.disabled, tag.deleted, tag.restricted, tag.restrictedTo, audienceIds, tag.defaultFor)\r\n }\r\n else if (type === \"default\") {\r\n this.props.updateTag(tag.id, tag.name, tag.mandatory, tag.default, tag.disabled, tag.deleted, tag.restricted, tag.restrictedTo, tag.mandatoryFor, audienceIds)\r\n }\r\n else {\r\n this.props.updateTag(tag.id, tag.name, tag.mandatory, tag.default, tag.disabled, tag.deleted, tag.restricted, audienceIds, tag.mandatoryFor, tag.defaultFor)\r\n }\r\n }\r\n }\r\n\r\n private onAudiencesChange = (type: string) => (newValues) => {\r\n this.updateTagGroups(this.props.newTag, (newValues || []).map(s => s.value), type)\r\n }\r\n}\r\n\r\nexport default injectIntl(TagCreationModal);\r\n","import * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport * as actions from '../actionCreator';\r\nimport * as settingsActions from 'modules/settings/actionCreator';\r\nimport {injectIntl, FormattedMessage, IntlShape} from \"react-intl\";\r\nimport TagListItem from \"modules/insights/components/tagListItem\";\r\nimport { UserRoleStrings } from 'modules/authorization/models';\r\nimport TagCreationModal from \"./tagCreationModal\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Header from \"pages/common/header\";\r\nimport MainContent from \"pages/common/mainContent\";\r\n\r\n\r\nexport class TagList extends React.Component<PropsWithRedux, ComponentState> {\r\n\r\n private _draggingTagId: string | null = null;\r\n\r\n constructor(props){\r\n super(props);\r\n this.state = { showTagCreationModal: false, groupIdForNewTag: \"\" };\r\n }\r\n\r\n public componentWillMount() {\r\n if (!this.props.tagStats) {\r\n this.props.fetchTopChannels();\r\n }\r\n }\r\n\r\n public componentWillReceiveProps(nextProps: PropsWithRedux) {\r\n if (this.props.errorMsg !== nextProps.errorMsg && nextProps.errorMsg !== null) {\r\n this.setState({...this.state, showTagCreationModal: true });\r\n }\r\n }\r\n\r\n public render() {\r\n let newTag = this.props.tagGroups.find(tg => tg.id === this.state.groupIdForNewTag)?.tags.slice(-1).pop();\r\n\r\n return (\r\n <BasePage fullWidth>\r\n <Header\r\n title=\"Manage Topics\"\r\n />\r\n <MainContent>\r\n <div className=\"analytics-page\">\r\n <div className=\"all-tags\">\r\n <div className=\"page-controls\">\r\n {\r\n this.props.canEdit ?\r\n <button className=\"add-btn\"\r\n disabled={(!this.props.tagStats && !this.props.tenantSettings) || this.props.saving}\r\n onClick={this.addTagGroup}\r\n >\r\n + New Topic Group\r\n </button>\r\n : null\r\n }\r\n </div>\r\n <div className=\"page-body\">\r\n\r\n {\r\n this.props.tagStats && this.props.tenantSettings ?\r\n <table className=\"tag-list\">\r\n <thead>\r\n <tr>\r\n <th className=\"empty\">\r\n <div style={{display: \"flex\", fontSize: \"15px\", fontWeight: \"normal\"}}>\r\n <i className=\"material-icons\" style={{verticalAlign: \"sub\", fontSize: '16px'}}>priority_high</i>\r\n {\" Mandatory\"}\r\n <i className=\"material-icons\" style={{verticalAlign: \"sub\", fontSize: '16px', marginLeft: \"10px\", marginRight: \"5px\"}}>done</i>\r\n {\" Default\"}\r\n <i className=\"material-icons\" style={{verticalAlign: \"sub\", fontSize: '16px', marginLeft: \"10px\", marginRight: \"5px\"}}>lock</i>\r\n {\" Restricted\"}\r\n </div>\r\n </th>\r\n <th className=\"num\"><FormattedMessage id=\"insights.subscribers\" defaultMessage=\"Subscribers\" /></th>\r\n <th className=\"num\"><FormattedMessage id=\"posts.posts\" defaultMessage=\"Posts\" /></th>\r\n <th className=\"num\"><FormattedMessage id=\"insights.views\" defaultMessage=\"Views\" /></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {\r\n this.props.tenantSettings.tagGroups.length === 0 && this.props.tagStats.length === 0 ?\r\n <td colSpan={4} style={{textAlign: 'center'}}>There are currently no topics set up</td>\r\n : this.props.tenantSettings.tagGroups.map(tg =>\r\n <TagListItem\r\n key={tg.id}\r\n tagGroup={tg}\r\n tagStats={this.props.tagStats}\r\n createNewTag={this.createNewTag}\r\n closeModal={this.closeModal}\r\n onDropOnGroup={this.onDropGroup}\r\n onDragTagStart={this.onDragTagStart}\r\n onDragTagEnd={this.onDragTagEnd}\r\n />\r\n )\r\n }\r\n </tbody>\r\n </table>\r\n : <div className=\"fetching-message\"><FormattedMessage id=\"common.fetching\" defaultMessage=\"Fetching\" />...</div>\r\n }\r\n </div>\r\n </div>\r\n <TagCreationModal\r\n show={this.state.showTagCreationModal}\r\n closeModal={this.closeModal}\r\n saveNewTag={this.saveNewTag}\r\n newTag={newTag}\r\n updateTag={this.props.updateTag}\r\n errorMssg={this.props.errorMsg}\r\n showAudiences={this.props.showAudiences}\r\n />\r\n </div>\r\n </MainContent>\r\n </BasePage>\r\n );\r\n }\r\n\r\n private addTagGroup = () => {\r\n this.props.addTagGroup();\r\n window.scrollTo(0, document.body.scrollHeight);\r\n }\r\n\r\n private createNewTag = (id: string) => {\r\n this.setState({...this.state, showTagCreationModal: true, groupIdForNewTag: id });\r\n this.props.addTag(id);\r\n }\r\n\r\n private closeModal = () => {\r\n this.props.removeNewTag(this.state.groupIdForNewTag);\r\n this.setState({...this.state, showTagCreationModal: false });\r\n }\r\n\r\n private saveNewTag = () => {\r\n this.props.saveTenantSettings();\r\n this.setState({...this.state, showTagCreationModal: false });\r\n }\r\n\r\n private onDropGroup = (tagGroupID: string) => {\r\n if (!!this._draggingTagId) {\r\n this.props.moveTag(this._draggingTagId, tagGroupID);\r\n this.props.saveTenantSettings();\r\n }\r\n }\r\n\r\n private onDragTagStart = (e: React.DragEvent<HTMLDivElement>, tagId) => {\r\n this._draggingTagId = tagId;\r\n }\r\n\r\n private onDragTagEnd = (e: React.DragEvent<HTMLDivElement>) => {\r\n this._draggingTagId = null;\r\n }\r\n\r\n}\r\n\r\ninterface ComponentState { showTagCreationModal: boolean, groupIdForNewTag: string }\r\ninterface ComponentProps { intl: IntlShape; }\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tagStats: state.insights.topChannels,\r\n tenantSettings: state.settings.tenantSettings,\r\n saving: state.settings.saving,\r\n errorMsg: state.settings.errorMsg,\r\n canEdit: (!!state.settings.currentUser && state.settings.currentUser.roles.indexOf(UserRoleStrings.OWNER) > -1) && state.settings.tenantSettings.manageTopicsAudiencesInAdmin,\r\n tagGroups: state.settings.tenantSettings.tagGroups,\r\n showAudiences: state.settings.tenantSettings.showFeatures.audiences\r\n }),\r\n {\r\n fetchTopChannels: actions.fetchTopChannels,\r\n addTagGroup: settingsActions.addTagGroup,\r\n addTag: settingsActions.addTag,\r\n updateTag: settingsActions.updateTag,\r\n saveTenantSettings: settingsActions.saveTenantSettings,\r\n removeNewTag: settingsActions.removeNewTag,\r\n moveTag: settingsActions.moveTag\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default injectIntl(connector(TagList))\r\n","import { PostRead } from '../models';\r\nimport { UserListItem } from 'modules/users/models';\r\n\r\nexport interface IAwarenessScore {\r\n x: number;\r\n y: number;\r\n monthIndex: string;\r\n}\r\n\r\nexport class TagAwarenessCalculator {\r\n public static calculate = (readData: PostRead[], userList: UserListItem[]): IAwarenessScore[] => {\r\n let points = new Array<IAwarenessScore & {monthIndex: string}>();\r\n let readStats = readData || [];\r\n let users = userList || [];\r\n\r\n if (readStats.length && users.length) {\r\n\r\n const firstDate = new Date(readStats[0].timestamp);\r\n const today = new Date();\r\n\r\n const numDaysInSet = TagAwarenessCalculator.daysBetween(firstDate, today) + 1;\r\n\r\n // create initial list of data points\r\n for (let i = 0; i < numDaysInSet; i++) {\r\n\r\n const pointDate = new Date(firstDate.valueOf());\r\n pointDate.setUTCDate(pointDate.getUTCDate() + i);\r\n\r\n const point = {\r\n x: i,\r\n y: 0,\r\n date: pointDate,\r\n monthIndex: pointDate.getUTCMonth() + '-' + pointDate.getUTCFullYear()\r\n };\r\n points.push(point);\r\n }\r\n\r\n const userScoreDict = {};\r\n\r\n const alreadyReadThatDayDict = {};\r\n\r\n for (let i = 0; i < readStats.length; i++) {\r\n\r\n const readStat = readStats[i];\r\n const readStatDate = new Date(readStat.timestamp);\r\n const readStatIndex = TagAwarenessCalculator.daysBetween(firstDate, readStatDate);\r\n\r\n const alreadyReadThatDayDictKey = `${readStatDate.getMonth()}/${readStatDate.getDate()}/${readStatDate.getFullYear()}|${readStat.userId}`;\r\n if (alreadyReadThatDayDict[alreadyReadThatDayDictKey]) {\r\n continue;\r\n } else {\r\n alreadyReadThatDayDict[alreadyReadThatDayDictKey] = 1;\r\n }\r\n\r\n const point = points[readStatIndex];\r\n const existingScoreKey = `${readStat.userId}|${readStat.postId}`;\r\n const existingUserScore = userScoreDict[existingScoreKey];\r\n\r\n const usersScore = Math.min(existingUserScore ? existingUserScore * (1.15 * readStat.depth) : 1 * readStat.depth, 1);\r\n\r\n userScoreDict[existingScoreKey] = usersScore;\r\n\r\n point.y += usersScore;\r\n }\r\n\r\n // calculate actuals using decay\r\n for (let i = 0; i < points.length; i++) {\r\n\r\n let previousStep = i > 0 ? points[i - 1] : null;\r\n let decayedPreviousStepAwareness = previousStep ? previousStep.y * 0.99 : 0;\r\n\r\n let currentStep = points[i];\r\n\r\n let numberOfUsers = users.length;\r\n\r\n let currentStepAwareness = (currentStep.y / numberOfUsers) * 100;\r\n\r\n currentStep.y = Math.min(100, decayedPreviousStepAwareness + currentStepAwareness);\r\n }\r\n }\r\n return points;\r\n }\r\n\r\n private static daysBetween = ( date1, date2 ) => {\r\n // Get 1 day in milliseconds\r\n const one_day = 1000 * 60 * 60 * 24;\r\n\r\n // Convert both dates to milliseconds\r\n const date1_ms = date1.getTime();\r\n const date2_ms = date2.getTime();\r\n\r\n // Calculate the difference in milliseconds\r\n const difference_ms = date2_ms - date1_ms;\r\n\r\n // Convert back to days and return\r\n return Math.round(difference_ms / one_day);\r\n }\r\n}\r\n\r\n","import {timeParse, scaleLinear, extent, area, curveBasis, max, line, select, axisLeft, axisBottom} from 'd3';\r\nconst d3 = {timeParse, scaleLinear, extent, area, curveBasis, max, line, select, axisLeft, axisBottom};\r\n\r\nexport interface ILineChartProps {\r\n el: any;\r\n data: ILineChartDataPoint[];\r\n height: number;\r\n maxY?: number;\r\n numXTicks?: number;\r\n xLabelGenerator?: (x: number) => string;\r\n locale?: string;\r\n}\r\n\r\nexport interface ILineChartDataPoint {\r\n x: number;\r\n y: number;\r\n label: string;\r\n}\r\n\r\nexport class LineChart {\r\n\r\n constructor(props: ILineChartProps) {\r\n this.update(props);\r\n }\r\n\r\n public update(props: ILineChartProps) {\r\n if (!props.el) {\r\n return;\r\n }\r\n\r\n const boundingRect = props.el.getBoundingClientRect();\r\n\r\n // set the dimensions and margins of the graph\r\n const margin = {top: 20, right: 30, bottom: 40, left: 35},\r\n width = boundingRect.width - margin.left - margin.right,\r\n height = props.height - margin.top - margin.bottom;\r\n\r\n d3.timeParse('%d-%b-%y');\r\n\r\n // set the ranges\r\n const x = d3.scaleLinear()\r\n .domain(d3.extent(props.data, d => d.x) as number[]) //Used to be [number, number]\r\n .range([0, width]);\r\n\r\n const y = d3.scaleLinear()\r\n .domain([0, props.maxY != null ? props.maxY : d3.max(props.data, d => d.y)!])\r\n .range([height, 0]);\r\n\r\n // define the area\r\n const area = d3.area<ILineChartDataPoint>()\r\n .curve(d3.curveBasis)\r\n .x(function(d) { return x(d.x); })\r\n .y0(height)\r\n .y1(function(d) { return y(d.y); });\r\n\r\n // define the line\r\n const valueline = d3.line<ILineChartDataPoint>()\r\n .curve(d3.curveBasis)\r\n .x(function(d) { return x(d.x); })\r\n .y(function(d) { return y(d.y); });\r\n\r\n d3.select(props.el)\r\n .select('svg').remove();\r\n\r\n const svg = d3.select(props.el)\r\n .append('svg')\r\n .attr('width', width + margin.left + margin.right)\r\n .attr('height', height + margin.top + margin.bottom)\r\n // .selectAll('*')\r\n // .remove()\r\n .append('g')\r\n .attr('transform',\r\n 'translate(' + margin.left + ',' + margin.top + ')');\r\n\r\n // add the area\r\n svg.append('path')\r\n .data([props.data])\r\n .attr('class', 'area')\r\n .attr('d', area);\r\n\r\n // add the valueline path.\r\n svg.append('path')\r\n .data([props.data])\r\n .attr('class', 'line')\r\n .attr('d', valueline);\r\n\r\n // add the X Axis\r\n svg.append('g')\r\n .attr('class', 'x-axis')\r\n .attr('transform', 'translate(0,' + height + ')')\r\n .call(d3.axisBottom(x)\r\n .ticks(props.numXTicks != null ? props.numXTicks : props.data.length)\r\n .tickFormat(props.xLabelGenerator ? props.xLabelGenerator : (d, i) => {\r\n return d.toString();\r\n }));\r\n\r\n // add the Y Axis\r\n svg.append('g')\r\n .call(d3.axisLeft(y));\r\n\r\n }\r\n\r\n public destroy() {\r\n // Any clean-up would go here\r\n // in this example there is nothing to do\r\n }\r\n}\r\n\r\n","/* Designed to be a simpler version of the contentAnalyses component.\r\n Will lack some functionality intentionally, primary purpose for is for displaying data but not editing it.\r\n*/\r\n\r\nimport React from \"react\";\r\nimport { Accordion, AccordionDetails, AccordionSummary, Button, useMediaQuery, useTheme } from \"@mui/material\";\r\nimport WhereToVoteIcon from '@mui/icons-material/WhereToVote'; // leaving for when we hook up recommended scores\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\n\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\"; // leaving for when we hook up recommended scores\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\nimport { IIndicatorDetail } from \"modules/common/components/authoring/models\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport \"../styles/contentAnalyses.sass\";\r\nimport ReadabilityAndReachIndicators from \"./readabilityAndReachIndicators\";\r\nimport TextAndWords from \"./textAndWords\";\r\nimport ContentIssues from \"./contentIssues\";\r\nimport { PostAnalysisScores, PostAverages } from \"modules/posts/models\";\r\nimport PublicIcon from '@mui/icons-material/Public';\r\nimport { fallbackSentimentLabel } from \"utils/readableLabelMapper\";\r\n\r\nconst SYNC_ARROWS_SRC: string = \"/images/icons/sync_arrows.svg\";\r\n\r\ninterface IContentAnalysesProps {\r\n fetching: boolean;\r\n content?: string;\r\n contentAnalyses: PostAnalysisScores;\r\n tenantAverages: PostAverages;\r\n globalAverages: PostAverages;\r\n isUsingTenantAverages: boolean;\r\n setIsUsingTenantAverages: (toSet: boolean) => void;\r\n accordionStates: boolean[];\r\n onChangeAccordion: (expanded: boolean, key: ACCORDIONS) => void;\r\n}\r\n\r\nconst SCORE_ICON_SRC: string = \"/images/icons/change_history.svg\";\r\n\r\n// indices for open state array\r\nenum ACCORDIONS {\r\n REACH_AND_READABILITY,\r\n TEXT_AND_WORDS,\r\n ISSUES\r\n}\r\n\r\nconst ContentAnalysesSimple: React.FunctionComponent<IContentAnalysesProps> = ({\r\n contentAnalyses,\r\n tenantAverages,\r\n globalAverages,\r\n isUsingTenantAverages,\r\n fetching,\r\n accordionStates,\r\n onChangeAccordion,\r\n setIsUsingTenantAverages\r\n}) => {\r\n const theme = useTheme();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down('sm'), { noSsr: true });\r\n let missingContentIssues = false;\r\n\r\n const {\r\n wordsPerSentence,\r\n sentencesPerParagraph,\r\n lettersPerWord,\r\n wordsPerParagraph,\r\n syllablesPerWord,\r\n sentenceCount,\r\n wordCount,\r\n readingTime,\r\n } = contentAnalyses || {};\r\n\r\n if(!contentAnalyses.lettersPerWord || !contentAnalyses.syllablesPerWord || !contentAnalyses.wordsPerSentence || !contentAnalyses.wordsPerParagraph || !contentAnalyses.sentencesPerParagraph) {\r\n missingContentIssues = true;\r\n }\r\n\r\n const readabilityIndicator: IIndicatorDetail = {\r\n minLabel: \"Very difficult to read\",\r\n maxLabel: \"Very easy to read\",\r\n recommendedScore: isUsingTenantAverages ? Math.max(tenantAverages.averageReadabilityScore, 1) : Math.max(globalAverages.averageReadabilityScore, 1), //Scores can be < 0 technically.\r\n minScore: 0,\r\n maxScore: 100,\r\n score: Math.max(Number.parseInt(contentAnalyses.readabilityScore), 1),\r\n scoreLabel: contentAnalyses.readabilityText\r\n }\r\n\r\n const toneIndicator:IIndicatorDetail = {\r\n minScore: 0,\r\n maxScore: 100,\r\n minLabel: \"Formal\",\r\n maxLabel: \"Conversational\",\r\n score: contentAnalyses.toneNumber,\r\n recommendedScore: isUsingTenantAverages ? tenantAverages.averageTone : globalAverages.averageTone,\r\n scoreLabel: contentAnalyses.tone\r\n }\r\n\r\n //Newer property, use neutral value if score doesn't exist.\r\n const personalismIndicator: IIndicatorDetail = {\r\n minScore: 0,\r\n maxScore: 100,\r\n minLabel: \"Impersonal\",\r\n maxLabel: \"Personal\",\r\n score: contentAnalyses.personalism,\r\n recommendedScore: isUsingTenantAverages ? tenantAverages.averagePersonalism : globalAverages.averagePersonalism,\r\n scoreLabel: contentAnalyses.personal\r\n }\r\n\r\n const sentimentIndicator: IIndicatorDetail = {\r\n minScore: 0,\r\n maxScore: 1,\r\n minLabel: \"Negative\",\r\n maxLabel: \"Positive\",\r\n score: contentAnalyses.sentimentScore,\r\n recommendedScore: isUsingTenantAverages ? (tenantAverages.averageSentiment / 100) : (globalAverages.averageSentiment / 100),\r\n scoreLabel: contentAnalyses?.sentiment ?? fallbackSentimentLabel(contentAnalyses.sentimentScore, 0, 1, \"Negative\", \"Positive\", false) //Fallback purely for old records.\r\n }\r\n\r\n const getAccordion = (key: ACCORDIONS, label: string, content: JSX.Element | undefined = <></>) => {\r\n return (\r\n <Accordion\r\n expanded={accordionStates[key]}\r\n elevation={0}\r\n onChange={(event: React.ChangeEvent, expanded: boolean) => onChangeAccordion(expanded, key)}\r\n classes={{\r\n expanded: \"expanded\"\r\n }}\r\n className=\"content-analyses-accordion\"\r\n style={{\r\n width: isSmallAndSmaller ? \"95%\" : 428\r\n }}\r\n >\r\n <AccordionSummary\r\n expandIcon={<ExpandMoreIcon />}\r\n style={{ fontWeight: 500 }}\r\n >\r\n {label}\r\n </AccordionSummary>\r\n <AccordionDetails style={{ flexWrap: \"wrap\" }}>\r\n {content}\r\n </AccordionDetails>\r\n </Accordion>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"content-analyses-container\">\r\n <div className=\"content-analyses-header\">\r\n <div className=\"content-analyses-header-item\" style={{paddingLeft: \"12px\"}}>\r\n {isUsingTenantAverages ?\r\n <>\r\n <WhereToVoteIcon htmlColor=\"#adb7c1\" style={{ width: 13, color: \"#adb7c1\", marginRight: 5}} />\r\n <HoverText labelClassName=\"legend-text\" inline label=\"Internal avg.\">\r\n Average scores taken from your organization's most engaging posts.\r\n </HoverText>\r\n </>\r\n :\r\n <>\r\n <PublicIcon htmlColor=\"#599FA0\" style={{ width: 13, color: \"#599FA0\", marginRight: 5}} />\r\n <HoverText labelClassName=\"legend-text-global\" inline label=\"Global avg.\">\r\n Global average scores are taken from most engaging posts in Sparrow.\r\n </HoverText>\r\n </>}\r\n <img alt=\"Your score\" src={SCORE_ICON_SRC} width={16} style={{ marginRight: 5, marginLeft: 15, }} />\r\n <span className=\"legend-text\" style={{ color: \"#3b78ab\" }}>Current scores</span>\r\n\r\n </div>\r\n <Button color=\"primary\" style={{marginLeft: \"auto\", marginRight: \"20px\"}} onClick={() => setIsUsingTenantAverages(!isUsingTenantAverages)} startIcon={\r\n <img src={SYNC_ARROWS_SRC} style={{width: \"26px\"}} alt={\"Swap average locale icon\"}></img>\r\n }>\r\n {isUsingTenantAverages ? \"Use Global Scores\" : \"Use Internal Scores\" }\r\n </Button>\r\n </div>\r\n {fetching\r\n ? <div style={{ height: \"100%\", width: \"100%\", display: \"flex\", justifyContent: \"center\" }}>\r\n <Loading />\r\n </div>\r\n : <div className=\"content-analyses-content\">\r\n <Disclaimer\r\n containerStyle={{ marginTop: 21, marginBottom: 15, width: isSmallAndSmaller ? \"95%\" : 428, boxSizing: \"border-box\" }}\r\n icon={<InfoOutlinedIcon />}\r\n text={\"Content analysis applies to English text only.\"}\r\n />\r\n {getAccordion(\r\n ACCORDIONS.REACH_AND_READABILITY,\r\n \"Reach & Readability\",\r\n <ReadabilityAndReachIndicators\r\n isUsingTenantAverages={isUsingTenantAverages}\r\n toneIndicator={toneIndicator}\r\n readabilityIndicator={readabilityIndicator}\r\n personalismIndicator={personalismIndicator}\r\n sentimentIndicator={sentimentIndicator}\r\n />)}\r\n {getAccordion(\r\n ACCORDIONS.TEXT_AND_WORDS,\r\n \"Text & Words\",\r\n <TextAndWords\r\n wordCount={wordCount}\r\n estimatedReadingTime={readingTime}\r\n averageWordCount={isUsingTenantAverages ? tenantAverages.averageWordCount : globalAverages.averageWordCount}\r\n usingGlobalStats={!isUsingTenantAverages}\r\n />)}\r\n {getAccordion(\r\n ACCORDIONS.ISSUES,\r\n \"Issues\",\r\n !missingContentIssues\r\n ? <ContentIssues\r\n totalSentenceCount={sentenceCount}\r\n totalWordCount={wordCount}\r\n hideHighlights={true}\r\n wordsPerParagraph={wordsPerParagraph}\r\n lettersPerWord={lettersPerWord}\r\n sentencesPerParagraph={sentencesPerParagraph}\r\n syllablesPerWord={syllablesPerWord}\r\n wordsPerSentence={wordsPerSentence}\r\n />\r\n : <Disclaimer\r\n icon={<InfoOutlinedIcon />}\r\n text={\r\n <React.Fragment>\r\n <span>Oops, something went wrong. </span>\r\n <br/>\r\n <span>Text issues are currently unavailable for this post.</span>\r\n </React.Fragment>\r\n }/>\r\n )}\r\n </div>\r\n }\r\n </div>\r\n );\r\n}\r\n\r\nexport default ContentAnalysesSimple;\r\n","import * as React from 'react';\r\nimport { LineChart, ILineChartProps, ILineChartDataPoint } from './charts/lineChart';\r\nimport { IAwarenessScore } from './postAwarenessCalculator';\r\nimport WindowResizeListener from 'modules/common/components/window-resize-listener';\r\nimport {FormattedMessage} from \"react-intl\";\r\n\r\ninterface Props {\r\n awarenessScore: IAwarenessScore[];\r\n title: string;\r\n xLabel: string;\r\n locale: string;\r\n}\r\n\r\nexport default class AwarenessVisualization extends React.PureComponent<Props, {}> {\r\n\r\n private _barChart: LineChart;\r\n private chart: HTMLElement\r\n\r\n private _dataPoints: ILineChartDataPoint[] = [] as ILineChartDataPoint[];\r\n\r\n public componentWillMount() {\r\n this._dataPoints = this.processReadStatsToBuildAwarenessDataPoints(this.props.awarenessScore);\r\n }\r\n\r\n public componentDidMount() {\r\n this._barChart = new LineChart(this.getChartState());\r\n }\r\n\r\n public componentWillUpdate(nextProps, state) {\r\n if (this._barChart) {\r\n this._dataPoints = this.processReadStatsToBuildAwarenessDataPoints(nextProps.awarenessScore);\r\n }\r\n }\r\n\r\n public componentDidUpdate() {\r\n if (this._barChart) {\r\n this._barChart.update(this.getChartState());\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n if (this._barChart) {\r\n this._barChart.destroy();\r\n }\r\n }\r\n\r\n private BLUR_FACTOR: number = 7\r\n\r\n public render() {\r\n return <div className=\"post-awareness\">\r\n <h3>{this.props.title}</h3>\r\n {\r\n this._dataPoints.length > this.BLUR_FACTOR \r\n ? <div className=\"awareness-graph-wrapper\">\r\n <div ref={e => this.chart = e!}></div>\r\n <span className=\"xLabel\">{this.props.xLabel}</span>\r\n </div> \r\n\r\n : <div className=\"awareness-graph-wrapper\">\r\n <FormattedMessage id=\"insights.notEnoughData\" defaultMessage=\"Not enough data\" />\r\n </div>\r\n }\r\n <WindowResizeListener onChange={this.handleWindowResize} />\r\n </div>\r\n }\r\n\r\n private getChartState = (): ILineChartProps => {\r\n return {\r\n el: this.chart,\r\n data: this.blurDataPoints(this._dataPoints, this.BLUR_FACTOR),\r\n height: 250,\r\n maxY: 100,\r\n numXTicks: 6,\r\n locale: this.props.locale\r\n } as ILineChartProps;\r\n }\r\n\r\n private blurDataPoints = (points: ILineChartDataPoint[], level): ILineChartDataPoint[] => {\r\n return points.filter((point, index) => {\r\n return index % level === 0;\r\n });\r\n }\r\n\r\n private processReadStatsToBuildAwarenessDataPoints = (score: IAwarenessScore[]): ILineChartDataPoint[] => {\r\n let awarenessPoints = score || [];\r\n let graphPoints = [] as ILineChartDataPoint[];\r\n\r\n for (let i = 0; i < awarenessPoints.length; i++) {\r\n let point = awarenessPoints[i];\r\n graphPoints.push({\r\n x: point.x,\r\n y: point.y,\r\n label: point.x.toString()\r\n })\r\n }\r\n\r\n return graphPoints;\r\n }\r\n\r\n private handleWindowResize = () => {\r\n this._dataPoints = this.processReadStatsToBuildAwarenessDataPoints(this.props.awarenessScore);\r\n this._barChart.update(this.getChartState());\r\n }\r\n}\r\n","import moment from 'moment';\r\n\r\nexport default {\r\n formatDate: (date?: Date | null) : string => {\r\n return !!date ? moment(date).format('L') : '';\r\n },\r\n formatTime: (date?: Date | null) : string => {\r\n return !!date ? moment(date).format(`h:mm a`) : '';\r\n }\r\n}\r\n","import * as React from 'react';\r\nimport ThreeDots from \"modules/common/components/three-dots\";\r\nimport numeral from 'numeral';\r\n\r\ninterface HighlightedNumberProps {\r\n value: number|string;\r\n text: string;\r\n badIfBelow: number;\r\n goodIfAbove: number;\r\n loading?: boolean;\r\n decimalFormat?: boolean;\r\n}\r\n\r\nexport default class HighlightedNumber extends React.Component<HighlightedNumberProps, {}> {\r\n\r\n public render() {\r\n return (\r\n <div className={'hl-stat hl-stat' + this.marker() + (this.props.loading ? ' hl-stat-loading' : '')}>\r\n <div className={'hl-stat-circle'}>\r\n { this.props.loading ? <ThreeDots width={30}/> : this.formattedNumber(this.props.value) }\r\n </div>\r\n <div className=\"hl-stat-circle-footer\">\r\n {this.props.text}\r\n </div>\r\n </div>)\r\n }\r\n\r\n private marker = () => {\r\n let marker = '-neutral';\r\n if (typeof this.props.value === 'number' && this.props.value < this.props.badIfBelow) {\r\n marker = '-bad';\r\n } else if (typeof this.props.value === 'number' && this.props.value > this.props.goodIfAbove) {\r\n marker = '-good';\r\n }\r\n return marker;\r\n }\r\n\r\n private formattedNumber = (value): string => {\r\n if(typeof(value) !== 'number') return \"*\";\r\n return numeral(value).format(this.props.decimalFormat ? '0.0a' : '0a');\r\n }\r\n}\r\n","import * as React from \"react\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport \"./audiences.sass\";\r\nimport { audiencesApi } from \"api/instances\";\r\nimport { UserSuggestions, GroupSuggestions, UpdateAudience, AudienceSuggestions, GroupSuggestionsV1 } from \"../models\";\r\nimport { injectIntl, FormattedMessage, IntlShape } from \"react-intl\";\r\nimport UserGroupPreviewModal from \"./userGroupPreviewModal\";\r\nimport CSVUploader from \"./csvUploader\";\r\nimport { truncateStringWithElipsis } from \"utils/stringFormatting\";\r\n\r\nconst FETCH_AMOUNT = 10;\r\n\r\nclass SuggestionsManager extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n fetching: false,\r\n userSuggestions: [],\r\n groupSuggestions: [],\r\n audienceSuggestions: [],\r\n amountFetched: 0,\r\n groupAmountFetched: 0,\r\n userSearchText: \"\",\r\n prevUserSearchText: \"\",\r\n groupSearchText: \"\",\r\n prevGroupSearchText: \"\",\r\n activeTab: \"user-audience\",\r\n showGroupPreview: false,\r\n currentGroup: { name: \"\", users: [] },\r\n };\r\n }\r\n\r\n public render() {\r\n let currentAudience: null | UpdateAudience = null;\r\n if (this.props.currentAudience) {\r\n currentAudience = {\r\n ...this.props.currentAudience,\r\n includedUsers: this.props.currentAudience?.includedUsers.map((user) => {\r\n return { Id: user.Id, Details: user.Details };\r\n }),\r\n includedGroups: this.props.currentAudience?.includedGroups.map((group) => {\r\n return { id: group.id, name: group.name, disabled: group.disabled, isIncluded: true };\r\n }),\r\n };\r\n }\r\n\r\n let showBackButton;\r\n let showNextButton;\r\n if (this.state.activeTab === \"user-audience\") {\r\n if (this.props.currentAudience) {\r\n showNextButton = this.state.userSuggestions.length >= FETCH_AMOUNT;\r\n } else {\r\n showNextButton = this.state.audienceSuggestions.length >= FETCH_AMOUNT;\r\n }\r\n showBackButton = this.state.amountFetched > FETCH_AMOUNT;\r\n } else {\r\n showBackButton = this.state.groupAmountFetched > FETCH_AMOUNT;\r\n showNextButton = this.state.groupSuggestions.length >= FETCH_AMOUNT;\r\n }\r\n\r\n return (\r\n <div className={`details list ${!this.props.currentAudience ? \"subscription\" : \"\"}`}>\r\n <div className=\"tabs\" style={{ borderBottom: \"1px solid #ddd\" }}>\r\n <ul className=\"tab-btns\">\r\n <li>\r\n <span\r\n onClick={() => {\r\n this.setState({ ...this.state, activeTab: \"user-audience\" });\r\n }}\r\n className={\"tab-btn\" + (this.state.activeTab === \"user-audience\" ? \" active\" : \"\")}\r\n >\r\n {this.props.currentAudience ? (\r\n <FormattedMessage id=\"users.users\" defaultMessage=\"Users\" />\r\n ) : (\r\n <FormattedMessage id=\"audiences.audiences\" defaultMessage=\"Audiences\" />\r\n )}\r\n </span>\r\n </li>\r\n <li>\r\n <span\r\n onClick={() => {\r\n this.setState({\r\n ...this.state,\r\n activeTab: \"groups\",\r\n });\r\n }}\r\n className={\"tab-btn\" + (this.state.activeTab === \"groups\" ? \" active\" : \"\")}\r\n title={\r\n this.props.ADGroupSyncOrEveryoneAudienceEnabled\r\n ? \"\"\r\n : \"Active Directory Synchronization is not setup - speak to your Sparrow Administrator\"\r\n }\r\n >\r\n <FormattedMessage id=\"users.groups\" defaultMessage={this.props.syncType + \" Groups\"} />\r\n </span>\r\n </li>\r\n\r\n { this.props.parseCSV != null &&\r\n <li>\r\n <span\r\n onClick={() => {\r\n this.setState({ ...this.state, activeTab: \"bulk-upload\" });\r\n }}\r\n className={\"tab-btn\" + (this.state.activeTab === \"bulk-upload\" ? \" active\" : \"\")}\r\n >\r\n <FormattedMessage id=\"users.bulkUpload\" defaultMessage=\"Bulk Upload\" />\r\n </span>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n {this.state.activeTab === \"user-audience\" ? (\r\n <div style={{ marginTop: \"15px\" }}>\r\n {!this.props.currentAudience ? (\r\n <label style={{ width: \"160px\", marginLeft: \"25px\" }}>Search Audiences</label>\r\n ) : null}\r\n <div className={`input-wrapper ${this.props.currentAudience ? \"\" : \" subscription\"}`}>\r\n {this.props.currentAudience ? <label style={{ width: \"160px\" }}>Search Users</label> : null}\r\n <input\r\n className=\"form-control\"\r\n autoComplete=\"off\"\r\n value={this.state.userSearchText}\r\n onChange={(e) => this.setState({ ...this.setState, userSearchText: e.target.value })}\r\n onKeyDown={(e) =>\r\n this.state.userSearchText !== this.state.prevUserSearchText &&\r\n this.state.userSearchText !== \"\" &&\r\n e.key === \"Enter\" &&\r\n this.fetchUserOrAudienceSuggestions()\r\n }\r\n />\r\n <button\r\n className=\"search-btn btn-primary\"\r\n disabled={\r\n this.state.fetching ||\r\n this.props.working ||\r\n this.state.userSearchText === this.state.prevUserSearchText ||\r\n this.state.userSearchText === \"\"\r\n }\r\n onClick={() => this.fetchUserOrAudienceSuggestions()}\r\n >\r\n Search\r\n </button>\r\n </div>\r\n <div className=\"results\">\r\n {this.state.fetching ? (\r\n <Loading padding={12} />\r\n ) : this.props.currentAudience ? (\r\n this.state.userSuggestions.length !== 0 ? (\r\n this.state.userSuggestions.map((user) => {\r\n return (\r\n <div key={user.Id} className=\"item\">\r\n {truncateStringWithElipsis(\r\n `${user.Details.firstName} ${user.Details.lastName} - ${user.Details.email}`,\r\n 35\r\n )}\r\n {this.props.canEdit ? (\r\n currentAudience?.includedUsers.find(\r\n (iu) => iu.Details.email === user.Details.email\r\n ) ? null : (\r\n <span\r\n className=\"add-btn\"\r\n onClick={() =>\r\n this.props.updateAudience\r\n ? this.props.updateAudience(\"includedUsers\", \"list\", user)\r\n : null\r\n }\r\n >\r\n <i className=\"material-icons\">add</i>\r\n </span>\r\n )\r\n ) : null}\r\n </div>\r\n );\r\n })\r\n ) : (\r\n <div style={{ textAlign: \"center\", color: \"#666\" }}>\r\n <FormattedMessage id=\"common.noResults\" defaultMessage=\"No Results\" />\r\n </div>\r\n )\r\n ) : this.state.audienceSuggestions.length !== 0 ? (\r\n this.state.audienceSuggestions.map((a) => {\r\n return (\r\n <div key={a.Id} className=\"item\">\r\n {a.DisplayName}\r\n <input\r\n type=\"checkbox\"\r\n readOnly\r\n id={a.Id}\r\n checked={this.props.currentList?.findIndex((ul) => ul.id === a.Id) !== -1}\r\n onClick={() =>\r\n this.props.updateList\r\n ? this.props.updateList(\r\n a.Id,\r\n \"audience\",\r\n !(this.props.currentList?.findIndex((ul) => ul.id === a.Id) !== -1)\r\n )\r\n : null\r\n }\r\n />\r\n </div>\r\n );\r\n })\r\n ) : (\r\n <div style={{ textAlign: \"center\", color: \"#666\" }}>\r\n <FormattedMessage id=\"common.noResults\" defaultMessage=\"No Results\" />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n ) : this.state.activeTab === \"groups\" ? (\r\n <div style={{ marginTop: \"15px\" }}>\r\n {!this.props.currentAudience && <label style={{ width: \"155px\", marginLeft: \"25px\" }}>Search {this.props.syncType} Groups</label>}\r\n <div className={`input-wrapper ${this.props.currentAudience ? \"\" : \" subscription\"}`}>\r\n {this.props.currentAudience && <label style={{ width: \"155px\" }}>Search {this.props.syncType} Groups</label>}\r\n <input\r\n className=\"form-control\"\r\n autoComplete=\"off\"\r\n value={this.state.groupSearchText}\r\n onChange={(e) => this.setState({ ...this.setState, groupSearchText: e.target.value })}\r\n onKeyDown={(e) =>\r\n this.state.groupSearchText !== this.state.prevGroupSearchText &&\r\n this.state.groupSearchText !== \"\" &&\r\n e.key === \"Enter\" &&\r\n this.fetchGroupSuggestions()\r\n }\r\n />\r\n <button\r\n className=\"search-btn btn-primary\"\r\n disabled={\r\n this.state.fetching ||\r\n this.props.working ||\r\n this.state.groupSearchText === this.state.prevGroupSearchText ||\r\n this.state.groupSearchText === \"\"\r\n }\r\n onClick={() => this.fetchGroupSuggestions()}\r\n >\r\n Search\r\n </button>\r\n </div>\r\n <div className=\"results\">\r\n {this.state.fetching ? (\r\n <Loading padding={12} />\r\n ) : this.state.groupSuggestions.length !== 0 ? (\r\n this.state.groupSuggestions.map((group) => {\r\n return (\r\n <div key={group.id} className=\"item\">\r\n {group.name}\r\n <div style={{ display: \"inline\", float: \"right\" }}>\r\n <span\r\n className=\"add-btn\"\r\n onClick={() =>\r\n this.props.updateAudience\r\n ? this.props.updateAudience(\"includedGroups\", \"list\", group)\r\n : null\r\n }\r\n >\r\n {this.props.canEdit ? (\r\n this.props.currentAudience ? (\r\n currentAudience?.includedGroups.find((ig) => ig.id === group.id) ? null : (\r\n <i className=\"material-icons\">add</i>\r\n )\r\n ) : (\r\n <input\r\n type=\"checkbox\"\r\n readOnly\r\n id={group.id}\r\n checked={\r\n this.props.currentList?.findIndex((ul) => ul.id === group.id) !== -1\r\n }\r\n onClick={() =>\r\n this.props.updateList\r\n ? this.props.updateList(\r\n group.id,\r\n \"userGroup\",\r\n !(\r\n this.props.currentList?.findIndex(\r\n (ul) => ul.id === group.id\r\n ) !== -1\r\n )\r\n )\r\n : null\r\n }\r\n />\r\n )\r\n ) : null}\r\n </span>\r\n {this.props.currentAudience ? (\r\n <span\r\n className=\"preview-btn\"\r\n style={{ float: \"right\" }}\r\n onClick={() => this.previewUsersInGroup(group)}\r\n >\r\n <i className=\"material-icons\">pageview</i>\r\n </span>\r\n ) : null}\r\n </div>\r\n </div>\r\n );\r\n })\r\n ) : (\r\n <div style={{ textAlign: \"center\", color: \"#666\" }}>No results</div>\r\n )}\r\n </div>\r\n </div>\r\n ) : (\r\n <div>\r\n <CSVUploader\r\n parseCSV={this.props.parseCSV}\r\n downloadSample={this.props.downloadSample} />\r\n </div>\r\n )}\r\n <div className=\"page-controls\">\r\n {showBackButton ? (\r\n <button\r\n className=\"page-btn\"\r\n disabled={this.state.fetching || this.props.working}\r\n onClick={() =>\r\n this.state.activeTab === \"user-audience\"\r\n ? this.fetchUserOrAudienceSuggestions(true)\r\n : this.fetchGroupSuggestions(true)\r\n }\r\n >\r\n <i className=\"material-icons\" style={{ fontSize: \"28px\" }}>\r\n navigate_before\r\n </i>\r\n </button>\r\n ) : null}\r\n {showNextButton ? (\r\n <button\r\n className=\"page-btn next\"\r\n disabled={this.state.fetching || this.props.working}\r\n onClick={() =>\r\n this.state.activeTab === \"user-audience\"\r\n ? this.fetchUserOrAudienceSuggestions()\r\n : this.fetchGroupSuggestions()\r\n }\r\n >\r\n <i className=\"material-icons\" style={{ fontSize: \"28px\" }}>\r\n navigate_next\r\n </i>\r\n </button>\r\n ) : null}\r\n </div>\r\n <UserGroupPreviewModal show={this.state.showGroupPreview} group={this.state.currentGroup} closeModal={this.closeModal} />\r\n </div>\r\n );\r\n }\r\n\r\n private fetchUserOrAudienceSuggestions = (back?: boolean) => {\r\n let newAmountFetched;\r\n if (this.state.prevUserSearchText !== this.state.userSearchText) {\r\n newAmountFetched = 0;\r\n } else {\r\n if (back) {\r\n if (this.props.currentAudience) {\r\n newAmountFetched = this.state.amountFetched - (FETCH_AMOUNT + this.state.userSuggestions.length);\r\n } else {\r\n newAmountFetched = this.state.amountFetched - (FETCH_AMOUNT + this.state.audienceSuggestions.length);\r\n }\r\n } else {\r\n newAmountFetched = this.state.amountFetched;\r\n }\r\n }\r\n\r\n this.setState(\r\n {\r\n ...this.state,\r\n fetching: true,\r\n amountFetched: newAmountFetched,\r\n },\r\n () => {\r\n if (this.state.userSearchText !== \"\") {\r\n if (this.props.currentAudience) {\r\n audiencesApi\r\n .getUserSuggestions(this.state.userSearchText, FETCH_AMOUNT, this.state.amountFetched)\r\n .then((response) => {\r\n this.setState({\r\n ...this.state,\r\n userSuggestions: response,\r\n fetching: false,\r\n prevUserSearchText: this.state.userSearchText,\r\n amountFetched: this.state.amountFetched + response.length,\r\n });\r\n });\r\n } else {\r\n audiencesApi\r\n .getAudienceSuggestions(this.state.userSearchText, FETCH_AMOUNT, this.state.amountFetched)\r\n .then((response) => {\r\n this.setState({\r\n ...this.state,\r\n audienceSuggestions: response.filter((a) => a.Enabled),\r\n fetching: false,\r\n prevUserSearchText: this.state.userSearchText,\r\n amountFetched: this.state.amountFetched + response.length,\r\n });\r\n });\r\n }\r\n }\r\n }\r\n );\r\n };\r\n\r\n private fetchGroupSuggestions = (back?: boolean) => {\r\n let newGroupAmountFetched;\r\n if (this.state.prevGroupSearchText !== this.state.groupSearchText) {\r\n newGroupAmountFetched = 0;\r\n } else {\r\n if (back) {\r\n newGroupAmountFetched = this.state.groupAmountFetched - (FETCH_AMOUNT + this.state.groupSuggestions.length);\r\n } else {\r\n newGroupAmountFetched = this.state.groupAmountFetched;\r\n }\r\n }\r\n\r\n this.setState(\r\n {\r\n ...this.state,\r\n fetching: true,\r\n groupAmountFetched: newGroupAmountFetched,\r\n },\r\n () => {\r\n if (this.state.groupSearchText !== \"\") {\r\n audiencesApi\r\n .getUserGroupSuggestions(this.state.groupSearchText, FETCH_AMOUNT, this.state.groupAmountFetched)\r\n .then((response) => {\r\n this.setState({\r\n ...this.state,\r\n groupSuggestions: response\r\n .filter((group: GroupSuggestionsV1) => !group.Disabled)\r\n // response is PascalCase -> convert to camel\r\n .map((group: GroupSuggestionsV1) => ({ id: group.Id, name: group.Name, disabled: group.Disabled })),\r\n fetching: false,\r\n prevGroupSearchText: this.state.groupSearchText,\r\n groupAmountFetched: this.state.groupAmountFetched + response.length,\r\n });\r\n });\r\n }\r\n }\r\n );\r\n };\r\n\r\n private previewUsersInGroup = (group: GroupSuggestions) => {\r\n this.setState({ ...this.state, fetching: true });\r\n audiencesApi.getUsersInGroup(group.id).then((response) => {\r\n this.setState({\r\n ...this.state,\r\n currentGroup: { name: group.name, users: response },\r\n fetching: false,\r\n showGroupPreview: true,\r\n });\r\n });\r\n };\r\n\r\n private closeModal = () => {\r\n this.setState({ ...this.state, showGroupPreview: false });\r\n };\r\n}\r\n\r\ninterface ComponentProps {\r\n intl: IntlShape;\r\n working: boolean;\r\n updateAudience?: (field: string, type: string, value: any) => void;\r\n currentAudience?: UpdateAudience;\r\n currentList?: { id: string; type: string }[];\r\n updateList?: (id: string, type: string, add: boolean) => void;\r\n ADGroupSyncOrEveryoneAudienceEnabled: boolean;\r\n canEdit: boolean;\r\n parseCSV: (file: File) => any;\r\n downloadSample: any;\r\n syncType: string;\r\n}\r\n\r\ninterface ComponentState {\r\n userSearchText: string;\r\n prevUserSearchText: string;\r\n groupSearchText: string;\r\n prevGroupSearchText: string;\r\n fetching: boolean;\r\n userSuggestions: UserSuggestions[];\r\n groupSuggestions: GroupSuggestions[];\r\n audienceSuggestions: AudienceSuggestions[];\r\n amountFetched: number;\r\n groupAmountFetched: number;\r\n activeTab: string;\r\n showGroupPreview: boolean;\r\n currentGroup: {\r\n name: string;\r\n users: any[];\r\n };\r\n}\r\n\r\nexport default injectIntl(SuggestionsManager);\r\n","import * as React from \"react\";\r\nimport Modal from \"modules/common/components/modal\";\r\n// import 'modules/audiences/components/audiences.sass'\r\nimport { injectIntl, IntlShape } from \"react-intl\";\r\nimport { Audience } from \"modules/audiences/models\";\r\nimport { audiencesApi, tagsApi } from \"api/instances\";\r\nimport { TenantSettingsSecurityGroups } from \"modules/settings\";\r\nimport SuggestionsManager from \"modules/audiences/components/suggestionsManager\";\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n closeModal: () => void;\r\n intl: IntlShape;\r\n userGroups: TenantSettingsSecurityGroups[];\r\n ADGroupSyncEnabled: boolean;\r\n tagIsRestricted: boolean;\r\n id: string;\r\n canEditTag: boolean;\r\n}\r\n\r\ninterface ComponentState {\r\n optIn: boolean;\r\n activeTab: string;\r\n userList: {id: string, type: string}[];\r\n audiences: Audience[];\r\n fetching: boolean;\r\n saving: boolean;\r\n}\r\n\r\nclass TagSubscriptionManagerModal extends React.PureComponent<ComponentProps, ComponentState> {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = { \r\n optIn: true,\r\n activeTab: \"audiences\",\r\n userList: [],\r\n audiences: [],\r\n fetching: true,\r\n saving: false\r\n }\r\n }\r\n\r\n public componentDidMount() {\r\n audiencesApi.getAllAudiences()\r\n .then(response => {\r\n this.setState({\r\n audiences: response,\r\n fetching: false\r\n });\r\n })\r\n }\r\n\r\n public render() {\r\n\r\n return (<Modal active={this.props.show}\r\n title={this.props.intl.formatMessage({id: \"common.manageUserSubscriptions\", defaultMessage: 'Manage User Subscriptions'})}\r\n showControls={true}\r\n onCloseClick={this.handleModalCloseClick}\r\n buttons={[\r\n { title: \"Save\", workingTitle: \"Saving...\", isWorking: this.state.saving, isPrimary: true, isEnabled: !this.state.saving && this.state.userList.length > 0, onClick: this.saveSubscriptions },\r\n ]}>\r\n <div className=\"radio-wrapper\">\r\n <label>Automatically: </label>\r\n <input\r\n className=\"input-radio\"\r\n type=\"radio\"\r\n value=\"in\"\r\n id=\"in\"\r\n onChange={() => this.toggleOptIn(true)}\r\n checked={this.state.optIn} />\r\n <label htmlFor=\"in\">Subscribe</label>\r\n <input\r\n className=\"input-radio\"\r\n type=\"radio\"\r\n value=\"out\"\r\n id=\"out\"\r\n onChange={() => this.toggleOptIn(false)}\r\n checked={!this.state.optIn} />\r\n <label htmlFor=\"out\">Unsubscribe</label>\r\n \r\n </div>\r\n <p style={{ textAlign: \"left\", fontSize: \"14px\", marginLeft: \"15px\"}}>{`Automatically ${this.state.optIn? \"subscribe\" : \"unsubscribe\"} the selected users.`}</p>\r\n {\r\n this.state.optIn && this.props.tagIsRestricted?\r\n <p style={{ textAlign: \"left\", fontSize: \"14px\", marginLeft: \"15px\"}}>{`Only users that have access to this tag will be subscribed.`}</p>\r\n : null\r\n }\r\n <SuggestionsManager\r\n working={this.state.saving || this.state.fetching}\r\n ADGroupSyncEnabled={this.props.ADGroupSyncEnabled}\r\n canEdit={this.props.canEditTag}\r\n currentList={this.state.userList}\r\n updateList={this.updateUserList}\r\n />\r\n \r\n </Modal>);\r\n }\r\n\r\n private handleModalCloseClick = () => {\r\n this.props.closeModal();\r\n }\r\n \r\n private toggleOptIn = (value: boolean) => {\r\n this.setState({...this.state, optIn: value})\r\n }\r\n\r\n private updateUserList = (id: string, type: string, add: boolean) => {\r\n var newUserList;\r\n if (add) {\r\n newUserList = [...this.state.userList, {id, type}];\r\n }\r\n else {\r\n newUserList = this.state.userList.filter(ul => ul.id !== id);\r\n }\r\n \r\n this.setState({...this.state, userList: newUserList});\r\n }\r\n\r\n private saveSubscriptions = () => {\r\n this.setState({...this.state, saving: true});\r\n tagsApi.BulkSubscription(this.props.id, this.state.optIn, this.state.userList)\r\n .then(response => {\r\n this.setState({\r\n ...this.state,\r\n saving: false,\r\n userList: []\r\n });\r\n });\r\n this.props.closeModal();\r\n }\r\n}\r\n\r\nexport default injectIntl(TagSubscriptionManagerModal);","import * as React from \"react\";\r\nimport TenantLink from \"modules/common/components/tenantLink\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as actions from \"../actionCreator\";\r\nimport * as userActions from \"modules/users/actionCreator\";\r\nimport * as settingsActions from \"modules/settings/actionCreator\";\r\nimport { DetailedTagStats } from \"../models\";\r\nimport { TagAwarenessCalculator, IAwarenessScore } from \"./tagAwarenessCalculator\";\r\nimport AwarenessVisualization from \"./awarenessVisualization\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport DateFormatter from \"modules/common/dateFormatter\";\r\nimport HighlightedNumber from \"./highlightedNumber\";\r\nimport { injectIntl, FormattedMessage, FormattedNumber, IntlShape } from \"react-intl\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport LoadingSpinner from \"modules/common/components/loadingSpinner\";\r\nimport { TenantSettingsTag } from \"modules/settings\";\r\nimport confirm from \"utils/notyPopups\";\r\nimport { browserHistory } from \"configureStore\";\r\nimport { tagsApi, audiencesApi, insightsApi } from \"api/instances\";\r\nimport { withRouter, RouteComponentProps } from \"react-router\";\r\nimport TagSubscriptionManagerModal from \"./tagSubscriptionManagerModal\";\r\nimport ToggleSwitch from \"modules/common/components/toggleSwitch\";\r\nimport MultiSelect from \"modules/common/components/forms/inputs/multiselect\";\r\nimport { Audience } from \"modules/audiences/models\";\r\nimport \"./tagDetail.sass\";\r\nimport DownloadButton from \"modules/common/components/buttons/downloadButton\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Breadcrumb from \"pages/common/breadcrumb\";\r\nimport MainContent from \"pages/common/mainContent\";\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\n\r\n\r\nexport class TagDetail extends React.Component<PropsWithRedux, ComponentState> {\r\n private _awarenessPoints: IAwarenessScore[];\r\n private _isMounted;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n currentAction: \"\",\r\n showSubscriptionManagementModal: false,\r\n audiences: [],\r\n editting: false,\r\n isTagReadsAndPostsFetched: false,\r\n errorMessage: \"\",\r\n fetchedTagStats: {\r\n posts: [],\r\n readStats: null,\r\n id: \"\",\r\n groupName: \"\",\r\n name: \"\",\r\n isMandatory: false,\r\n subscriberCount: 0,\r\n postCount: 0,\r\n viewCount: 0,\r\n }\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n this._isMounted = true;\r\n (window as any).scrollTo(0, 0);\r\n\r\n audiencesApi.getAllAudiences().then((response) => {\r\n if (this._isMounted) {\r\n this.setState({\r\n audiences: response,\r\n });\r\n }\r\n });\r\n\r\n this.props.fetchTagReadsAndPostReads(this.props.match.params.tagId).then(() => {\r\n if (this._isMounted) {\r\n this.setState({\r\n ...this.state,\r\n isTagReadsAndPostsFetched: true\r\n })\r\n }\r\n });\r\n\r\n insightsApi.GetSpecificTagStats(this.props.match.params.tagId).then((response) => {\r\n if (this._isMounted) {\r\n if (response) {\r\n this.setState({\r\n ...this.state,\r\n fetchedTagStats: {\r\n ...this.state.fetchedTagStats,\r\n subscriberCount: response.subscriberCount,\r\n postCount: response.postCount,\r\n viewCount: response.viewCount\r\n }\r\n })\r\n }\r\n }\r\n })\r\n\r\n if (this.props.users === null || this.props.users.length === 0) {\r\n this.props.fetchUsers();\r\n }\r\n\r\n if (\r\n this.props.tagStats &&\r\n this.props.tagStats.id === this.props.match.params.tagId &&\r\n this.props.tagStats.readStats &&\r\n this.props.users\r\n ) {\r\n this._awarenessPoints = TagAwarenessCalculator.calculate(this.props.tagStats.readStats, this.props.users);\r\n }\r\n }\r\n\r\n public componentWillUpdate(nextProps, nextState) {\r\n if (nextProps.tagStats && nextProps.tagStats.readStats && nextProps.users) {\r\n this._awarenessPoints = TagAwarenessCalculator.calculate(nextProps.tagStats.readStats, nextProps.users);\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n this._isMounted = false;\r\n this.setState({\r\n ...this.state,\r\n isTagReadsAndPostsFetched: false\r\n })\r\n }\r\n\r\n private defaultStyles: React.CSSProperties = {\r\n backgroundColor: \"#2f4050\",\r\n color: \"#ffffff\",\r\n border: \"1px solid #ccc\",\r\n outline: \"none\",\r\n padding: \"8px\",\r\n cursor: \"pointer\",\r\n display: \"inline-block\",\r\n fontSize: \"14px\",\r\n borderRadius: \"3px\",\r\n float: \"right\",\r\n marginRight: \"15px\",\r\n };\r\n\r\n public render() {\r\n if ((!this.props.tagStats || this.props.tagStats.id !== this.props.match.params.tagId) && this.props.fetching) {\r\n return <Loading />;\r\n }\r\n\r\n let topAuthors = this.getTopAuthors(this.props.tagStats);\r\n let awarenessScore =\r\n this._awarenessPoints && this._awarenessPoints.length\r\n ? Math.round(this._awarenessPoints[this._awarenessPoints.length - 1].y)\r\n : \"?\";\r\n let views = this.props.tagStats?.viewCount || 0;\r\n\r\n var tagGroup;\r\n var tag;\r\n\r\n if (!!this.props.tagStats) {\r\n tagGroup = !this.props.fetching\r\n ? this.props.tenantSettings.tagGroups.find((t) => t.id === this.props.match.params.tagGroupId)!\r\n : null;\r\n tag = !this.props.fetching ? tagGroup?.tags.find((t) => t.id === this.props.match.params.tagId)! : null;\r\n } else {\r\n tagGroup = !this.props.fetching\r\n ? this.props.tenantSettings.tagGroups.find((t) => t.name === this.props.tagStats?.groupName)!\r\n : null;\r\n tag = !this.props.fetching ? tagGroup?.tags.find((t) => t.id === this.props.tagStats.id)! : null;\r\n }\r\n\r\n return (\r\n <BasePage fullWidth>\r\n <Breadcrumb\r\n items={[\r\n { title: \"Manage Topics\", link: \"~/admin/topics\" },\r\n { title: tag?.name },\r\n ]}\r\n />\r\n <MainContent>\r\n <div className=\"channel-detail\">\r\n <header>\r\n <span style={{ display: \"flex\", alignItems: \"center\", minHeight: \"70px\" }}>\r\n {this.state.editting ? (\r\n <input\r\n className=\"name-edit form-control\"\r\n autoComplete=\"off\"\r\n value={tag ? tag.name : \"\"}\r\n onChange={(e) => this.handleTagNameChange(e, tag!)}\r\n />\r\n ) : (\r\n <h2\r\n style={{\r\n color: tag?.disabled && !this.props.saving ? \"#595959\" : \"\",\r\n }}\r\n >\r\n {tag?.name}\r\n </h2>\r\n )}\r\n {tag?.disabled && !this.props.saving ? <span className=\"disabled\">(disabled)</span> : null}\r\n {this.state.editting ? (\r\n <div className=\"editing-btns\">\r\n <button\r\n style={{ backgroundColor: \"#2196f3\" }}\r\n disabled={this.props.saving || this.props.fetching || tag?.name === \"\"}\r\n onClick={this.handleSave}\r\n >\r\n {this.props.saving ? (\r\n <LoadingSpinner size={\"14px\"} />\r\n ) : (\r\n <FormattedMessage id=\"common.save\" defaultMessage=\"Save\" />\r\n )}\r\n </button>\r\n <button\r\n style={{ backgroundColor: \"#ffffff\", color: \"#000000\" }}\r\n onClick={() => this.setState({ ...this.state, editting: false })}\r\n >\r\n <FormattedMessage id=\"common.cancel\" defaultMessage=\"Cancel\" />\r\n </button>\r\n </div>\r\n ) : (\r\n <button\r\n className=\"edit-btn\"\r\n disabled={this.props.saving || this.props.fetching}\r\n title=\"Edit topic name\"\r\n onClick={() => this.setState({ ...this.state, editting: true })}\r\n >\r\n <i className=\"material-icons\">edit</i>\r\n </button>\r\n )}\r\n </span>\r\n </header>\r\n {this.props.canEditTag ? (\r\n <div style={{ display: \"flex\", flexDirection: \"row-reverse\", paddingTop: \"50px\", paddingBottom: \"10px\" }}>\r\n\r\n\r\n {!tag?.mandatory || this.props.tenantSettings.showFeatures.everyoneAudienceEnabled ? (\r\n <button onClick={this.toggleSubscriptionModal} disabled={this.props.saving || this.props.fetching || tag?.disabled}>\r\n <FormattedMessage\r\n id=\"common.manageUserSubscriptions\"\r\n defaultMessage=\"Manage User Subscriptions\"\r\n />\r\n </button>\r\n ) : null}\r\n\r\n <DownloadButton\r\n onClick={() => this.downloadTopicUserList()}\r\n text={\" Download User Data\"}\r\n downloadName={`${tag?.name}-user-data`}\r\n styles={this.defaultStyles}\r\n />\r\n <button disabled={this.props.saving || this.props.fetching} onClick={() => this.toggleTagDisabled(tag)}>\r\n {this.props.saving && this.state.currentAction === \"toggling\" ? (\r\n <LoadingSpinner size={\"18px\"} />\r\n ) : tag?.disabled ? (\r\n <FormattedMessage id=\"common.enable\" defaultMessage=\"Enable\" />\r\n ) : (\r\n <FormattedMessage id=\"common.disable\" defaultMessage=\"Disable\" />\r\n )}\r\n </button>\r\n <button\r\n onClick={() => this.toggleTagDeleted(tag)}\r\n disabled={this.props.saving || this.props.fetching}\r\n style={{ backgroundColor: \"#d9534f\", padding: \"0px 20px\" }}\r\n >\r\n {this.props.saving && this.state.currentAction === \"deleting\" ? (\r\n <LoadingSpinner size={\"18px\"} />\r\n ) : (\r\n <span>\r\n <FormattedMessage id=\"common.delete\" defaultMessage=\"Delete\" />\r\n </span>\r\n )}\r\n </button>\r\n </div>\r\n ) : null}\r\n <div className=\"hl-stats-wrapper\">\r\n <div className=\"hl-stats\">\r\n <HighlightedNumber\r\n loading={!this._awarenessPoints}\r\n value={this.state.isTagReadsAndPostsFetched ? awarenessScore : 0}\r\n text={this.props.intl.formatMessage({ id: \"insights.awareness\", defaultMessage: \"Awareness\" })}\r\n badIfBelow={40}\r\n goodIfAbove={70}\r\n />\r\n\r\n <HighlightedNumber\r\n loading={!this.props.users}\r\n value={this.state.fetchedTagStats.subscriberCount}\r\n text={this.props.intl.formatMessage({ id: \"insights.subscribers\", defaultMessage: \"Subscribers\" })}\r\n badIfBelow={(this.props.users || []).length / 5}\r\n goodIfAbove={(this.props.users || []).length * 0.75}\r\n />\r\n\r\n <HighlightedNumber\r\n loading={!this.props.tagStats?.posts}\r\n value={this.state.fetchedTagStats.postCount}\r\n text={this.props.intl.formatMessage({ id: \"posts.posts\", defaultMessage: \"Posts\" })}\r\n badIfBelow={1}\r\n goodIfAbove={100}\r\n />\r\n\r\n <HighlightedNumber\r\n loading={!this.props.users}\r\n value={this.state.fetchedTagStats.viewCount}\r\n decimalFormat={views > 1000 && `${views}`.length % 3 !== 0}\r\n text={this.props.intl.formatMessage({ id: \"insights.views\", defaultMessage: \"Views\" })}\r\n badIfBelow={(this.props.users || []).length / 5}\r\n goodIfAbove={(this.props.users || []).length * 0.75}\r\n />\r\n\r\n <HighlightedNumber\r\n loading={!this.props.tagStats?.posts}\r\n value={this.state.isTagReadsAndPostsFetched ? topAuthors.length : 0}\r\n text={this.props.intl.formatMessage({ id: \"posts.authors\", defaultMessage: \"Authors\" })}\r\n badIfBelow={2}\r\n goodIfAbove={5}\r\n />\r\n <div className=\"clearfix\"></div>\r\n <div style={{ marginLeft: 40, paddingTop: 10 }}>* Updated every hour on the thirty minute mark</div>\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n <div className=\"topic-details\">\r\n <div className=\"row-wrapper\">\r\n <div className=\"detail-wrapper\">\r\n <i\r\n title={this.props.intl.formatMessage({ id: \"common.mandatoryTopic\" })}\r\n className=\"material-icons\"\r\n style={{ fontSize: \"22px\", marginRight: \"5px\", marginTop: \"-4px\" }}\r\n >\r\n info\r\n </i>\r\n <label>Mandatory</label>\r\n <ToggleSwitch\r\n value={tag?.mandatory || false}\r\n onClick={() => {\r\n this.toggleTagMandatory(tag!);\r\n }}\r\n />\r\n <p>for</p>\r\n </div>\r\n {this.renderSelection(\"mandatory\", tag!)}\r\n </div>\r\n <div className=\"row-wrapper\">\r\n <div className=\"detail-wrapper\">\r\n <i\r\n title={this.props.intl.formatMessage({ id: \"common.defaultTopic\" })}\r\n className=\"material-icons\"\r\n style={{ fontSize: \"22px\", marginRight: \"5px\", marginTop: \"-4px\" }}\r\n >\r\n info\r\n </i>\r\n <label>Default</label>\r\n <ToggleSwitch\r\n value={tag?.default || false}\r\n onClick={() => {\r\n this.toggleTagDefault(tag!);\r\n }}\r\n />\r\n <p>for</p>\r\n </div>\r\n {this.renderSelection(\"default\", tag!)}\r\n </div>\r\n {this.props.showAudiences ? (\r\n <div className=\"row-wrapper\">\r\n <div className=\"detail-wrapper\">\r\n <i\r\n title={this.props.intl.formatMessage({ id: \"common.restrictedTopic\" })}\r\n className=\"material-icons\"\r\n style={{ fontSize: \"22px\", marginRight: \"5px\", marginTop: \"-4px\" }}\r\n >\r\n info\r\n </i>\r\n <label>Restricted</label>\r\n <ToggleSwitch\r\n value={tag?.restricted || false}\r\n onClick={() => {\r\n this.toggleTagRestricted(tag!);\r\n }}\r\n />\r\n <p>to  </p>\r\n </div>\r\n {this.renderSelection(\"restricted\", tag!)}\r\n </div>\r\n ) : null}\r\n <div className=\"error-mssg\">{this.props.errorMsg}</div>\r\n <div style={{ textAlign: \"right\" }}>\r\n <button\r\n className=\"btn btn-primary\"\r\n onClick={this.props.saveTenantSettings}\r\n disabled={this.props.saving || this.props.fetching || this.props.pristine}\r\n >\r\n {this.props.saving ? <LoadingSpinner size={\"14px\"} color=\"#fff\" /> : \"Save\"}\r\n </button>\r\n <button\r\n className=\"btn reset-btn\"\r\n onClick={this.props.resetTenantSettingsToPristine}\r\n disabled={this.props.saving || this.props.fetching || this.props.pristine}\r\n >\r\n {this.props.fetching ? <LoadingSpinner size={\"14px\"} color=\"#fff\" /> : \"Reset\"}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div className=\"tag-stats\">\r\n <AwarenessVisualization\r\n title={this.props.intl.formatMessage({\r\n id: \"insights.awarenessOverTime\",\r\n defaultMessage: \"Awareness Over Time\",\r\n })}\r\n awarenessScore={this._awarenessPoints}\r\n locale={this.props.locale}\r\n xLabel={this.props.intl.formatMessage(\r\n {\r\n id: \"insights.topicAwarenessXLabel\",\r\n defaultMessage: `days since first post was created with the {tagName} topic`,\r\n },\r\n { tagName: this.props.tagStats?.name }\r\n )}\r\n />\r\n <div className=\"clearfix\"></div>\r\n <div className=\"alert alert-info\">\r\n <FormattedMessage\r\n id=\"insights.awarenessDescription\"\r\n defaultMessage=\"Awareness of this topic increases as users read posts marked with the {tagName} topic. Post read contribution depends on how much of the post was read by the user and decays over time. In order to maintain awareness of this topic in your organization, posts should be created at regular intervals to keep users engaged.\"\r\n values={{ tagName: this.props.tagStats?.name }}\r\n />\r\n </div>\r\n </div>\r\n <div className=\"tag-detail-items-wrapper\">\r\n <div className=\"tag-detail-items\">\r\n {(this.props.tagStats?.posts || []).length > 0 ? (\r\n <div className=\"tag-detail-item\">\r\n <h3>\r\n <FormattedMessage\r\n id=\"insights.postsWithTopic\"\r\n defaultMessage=\"Posts with topic {tagName}\"\r\n values={{ tagName: this.props.tagStats?.name }}\r\n />\r\n </h3>\r\n <table className=\"detail-table fixed\">\r\n <thead>\r\n <tr>\r\n <th>\r\n <FormattedMessage id=\"common.title\" defaultMessage=\"Title\" />\r\n </th>\r\n <th className=\"fixed-100\">\r\n <FormattedMessage id=\"common.created\" defaultMessage=\"Created\" />\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {!!this.props.tagStats?.posts &&\r\n this.props.tagStats?.posts.map((post) => {\r\n return (\r\n <tr key={post.id}>\r\n <td>\r\n <TenantLink\r\n className=\"post-title-link\"\r\n to={`~/admin/posts/${post.id}`}\r\n >\r\n {post.title}\r\n </TenantLink>\r\n <div className=\"author\">{post.author}</div>\r\n </td>\r\n <td>{DateFormatter.formatDate(post.createdTime)}</td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n ) : null}\r\n {topAuthors.length > 0 && (\r\n <div className=\"tag-detail-item\">\r\n <h3>\r\n <FormattedMessage id=\"posts.authors\" defaultMessage=\"Author\" />\r\n </h3>\r\n <table className=\"detail-table fixed\">\r\n <thead>\r\n <tr>\r\n <th>\r\n <FormattedMessage id=\"common.name\" defaultMessage=\"Name\" />\r\n </th>\r\n <th className=\"fixed-50\">\r\n <FormattedMessage id=\"posts.posts\" defaultMessage=\"Posts\" />\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {topAuthors.map((author) => {\r\n return (\r\n <tr key={author.name}>\r\n <td>{author.name}</td>\r\n <td>\r\n <FormattedNumber value={author.count} />\r\n </td>\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n <TagSubscriptionManagerModal\r\n show={this.state.showSubscriptionManagementModal && !this.props.saving && !this.props.fetching}\r\n closeModal={this.toggleSubscriptionModal}\r\n userGroups={this.props.userGroups}\r\n ADGroupSyncEnabled={this.props.ADGroupSyncEnabled}\r\n restricted={tag?.restricted}\r\n id={this.props.match.params.tagId}\r\n canEditTag={this.props.canEditTag}\r\n />\r\n <ErrorSnackbar \r\n errorMessage={ this.state.errorMessage || \"\" }\r\n clearErrorMessage={ () => this.setState({ ...this.state, errorMessage: \"\"}) }\r\n />\r\n </MainContent>\r\n </BasePage>\r\n );\r\n };\r\n\r\n private toggleTagDisabled = async (tag: TenantSettingsTag | null) => {\r\n if (tag) {\r\n this.setState({ ...this.state, currentAction: \"toggling\" });\r\n this.props.updateTag(\r\n tag.id,\r\n tag.name,\r\n tag.mandatory,\r\n tag.default,\r\n !tag.disabled,\r\n tag.deleted,\r\n tag.restricted,\r\n tag.restrictedTo,\r\n tag.mandatoryFor,\r\n tag.defaultFor\r\n );\r\n this.props.saveTenantSettings();\r\n }\r\n };\r\n\r\n private toggleTagDeleted = (tag: TenantSettingsTag | null) => {\r\n if (tag) {\r\n this.setState({ ...this.state, currentAction: \"deleting\" });\r\n tagsApi\r\n .GetTagUsageStatus(tag.id)\r\n .then((tagUsed) => {\r\n if (!tagUsed) {\r\n //if tag is not used in any posts or events, can delete\r\n this.handleTagDeletion(tag);\r\n } else {\r\n this.setState({errorMessage: \"This topic cannot be deleted because it is used by existing posts or events.\"});\r\n }\r\n })\r\n .catch((err) => this.setState({errorMessage: \"There was an error processing this topic.\"}));\r\n }\r\n };\r\n\r\n private handleTagDeletion = async (tag: TenantSettingsTag) => {\r\n if (await confirm.show({ text: `Are you sure you want to delete the topic ${tag.name}? Deleted topics will be permanently removed.`, title: \"Topic deletion\" })) {\r\n this.props.updateTag(\r\n tag.id,\r\n tag.name,\r\n tag.mandatory,\r\n tag.default,\r\n tag.disabled,\r\n !tag.deleted,\r\n tag.restricted,\r\n tag.restrictedTo,\r\n tag.mandatoryFor,\r\n tag.defaultFor\r\n );\r\n this.props.saveTenantSettings();\r\n browserHistory.goBack();\r\n }\r\n return;\r\n };\r\n\r\n private getTopAuthors = (tagStats: DetailedTagStats) => {\r\n let topAuthors = {};\r\n if (!!tagStats && !!tagStats.posts) {\r\n for (let i = 0; i < tagStats.posts.length; i++) {\r\n let post = tagStats.posts[i];\r\n let authorName = post.author || this.props.intl.formatMessage({ id: \"posts.noauthor\", defaultMessage: \"No Author\" });\r\n let key = authorName.toUpperCase();\r\n let entry = topAuthors[key];\r\n if (!entry) {\r\n entry = {\r\n name: authorName,\r\n count: 0,\r\n };\r\n }\r\n entry.count++;\r\n topAuthors[key] = entry;\r\n }\r\n }\r\n let topAuthorsArr = Object.keys(topAuthors).map((key) => {\r\n return topAuthors[key];\r\n });\r\n\r\n topAuthorsArr.sort((a, b) => {\r\n return b.count - a.count;\r\n });\r\n\r\n return topAuthorsArr;\r\n };\r\n\r\n private toggleSubscriptionModal = () => {\r\n this.setState({ ...this.state, showSubscriptionManagementModal: !this.state.showSubscriptionManagementModal });\r\n };\r\n\r\n private renderSelection = (type: string, tag: TenantSettingsTag) => {\r\n let options = this.state.audiences.map((a) => ({ label: a.displayName, value: a.id }));\r\n\r\n const selectStyles = {\r\n multiValue: (styles) => {\r\n return {\r\n ...styles,\r\n backgroundColor: \"rgba(242,249,252,0.2)\",\r\n border: \"1px solid rgba(201,230,242)\",\r\n color: \"rgb(3,169,244)\",\r\n };\r\n },\r\n };\r\n\r\n let placeholder = \"\";\r\n let audienceValues: string[] = [];\r\n let isTypeOn = false;\r\n if (tag) {\r\n if (type === \"mandatory\") {\r\n isTypeOn = tag.mandatory;\r\n audienceValues = tag.mandatoryFor;\r\n if (isTypeOn) {\r\n placeholder = \"Everyone or select audience(s)...\";\r\n }\r\n } else if (type === \"default\") {\r\n isTypeOn = tag.default;\r\n audienceValues = tag.defaultFor;\r\n if (isTypeOn) {\r\n placeholder = \"Everyone or select audience(s)...\";\r\n }\r\n } else {\r\n isTypeOn = tag?.restricted;\r\n audienceValues = tag.restrictedTo;\r\n if (isTypeOn) {\r\n placeholder = \"Restricted subscription for....\";\r\n }\r\n }\r\n }\r\n\r\n let initialValues = (audienceValues || []).map((a) => ({\r\n label: (this.state.audiences.find((al) => al.id === a) || { displayName: \"unknown\" }).displayName,\r\n value: a,\r\n }));\r\n\r\n if (!this.props.showAudiences) {\r\n placeholder = \"Everyone\";\r\n }\r\n\r\n return (\r\n <MultiSelect\r\n placeholder={placeholder}\r\n options={options}\r\n onChange={this.onAudiencesChange(tag, type)}\r\n value={initialValues}\r\n isDisabled={!isTypeOn}\r\n styles={selectStyles}\r\n components={!this.props.showAudiences ? { DropdownIndicator: () => null, IndicatorSeparator: () => null } : {}}\r\n />\r\n );\r\n };\r\n\r\n private toggleTagMandatory = (tag: TenantSettingsTag) => {\r\n let newMandatoryFor = tag.mandatoryFor;\r\n if (tag.mandatory && tag.mandatoryFor.length > 0) {\r\n //if mandatory was on and had mandatoryFor list, empty it before turning off\r\n newMandatoryFor = [];\r\n }\r\n this.props.updateTag(\r\n tag.id,\r\n tag.name,\r\n !tag.mandatory,\r\n tag.default,\r\n tag.disabled,\r\n tag.deleted,\r\n tag.restricted,\r\n tag.restrictedTo,\r\n newMandatoryFor,\r\n tag.defaultFor\r\n );\r\n };\r\n\r\n private toggleTagDefault = (tag: TenantSettingsTag) => {\r\n let newDefaultFor = tag.defaultFor;\r\n if (tag.default && tag.defaultFor.length > 0) {\r\n //if default was on and had defaultFor list, empty it before turning off\r\n newDefaultFor = [];\r\n }\r\n this.props.updateTag(\r\n tag.id,\r\n tag.name,\r\n tag.mandatory,\r\n !tag.default,\r\n tag.disabled,\r\n tag.deleted,\r\n tag.restricted,\r\n tag.restrictedTo,\r\n tag.mandatoryFor,\r\n newDefaultFor\r\n );\r\n };\r\n\r\n private toggleTagRestricted = async (tag: TenantSettingsTag) => {\r\n var newRestrictedTo;\r\n if (!tag.restricted) {\r\n //if restricted was off, confirm turning it on\r\n if (\r\n !(await confirm.show({\r\n text: \"Posts published with this topic will only be visible to users in the selected audience(s). <br/><br/>Do you want to continue?\", title: \"Topic restriction\"\r\n }))\r\n ) {\r\n return; //if declines return\r\n }\r\n newRestrictedTo = tag.restrictedTo;\r\n }\r\n if (tag.restricted) {\r\n //if restricted was on, confirm turning it off\r\n if (\r\n !(await confirm.show({\r\n text: \"Posts published with this topic may become visible to anyone in your organization. <br/><br/>Do you want to continue?\", title: \"Topic unrestriction\"\r\n }))\r\n ) {\r\n return; //if declines return\r\n }\r\n newRestrictedTo = [];\r\n }\r\n\r\n this.props.updateTag(\r\n tag.id,\r\n tag.name,\r\n tag.mandatory,\r\n tag.default,\r\n tag.disabled,\r\n tag.deleted,\r\n !tag.restricted,\r\n newRestrictedTo,\r\n tag.mandatoryFor,\r\n tag.defaultFor\r\n );\r\n };\r\n\r\n private updateTagGroups = (tag: TenantSettingsTag, audienceIds: string[], type: string) => {\r\n if (type === \"mandatory\") {\r\n this.props.updateTag(\r\n tag.id,\r\n tag.name,\r\n tag.mandatory,\r\n tag.default,\r\n tag.disabled,\r\n tag.deleted,\r\n tag.restricted,\r\n tag.restrictedTo,\r\n audienceIds,\r\n tag.defaultFor\r\n );\r\n } else if (type === \"default\") {\r\n this.props.updateTag(\r\n tag.id,\r\n tag.name,\r\n tag.mandatory,\r\n tag.default,\r\n tag.disabled,\r\n tag.deleted,\r\n tag.restricted,\r\n tag.restrictedTo,\r\n tag.mandatoryFor,\r\n audienceIds\r\n );\r\n } else {\r\n this.props.updateTag(\r\n tag.id,\r\n tag.name,\r\n tag.mandatory,\r\n tag.default,\r\n tag.disabled,\r\n tag.deleted,\r\n tag.restricted,\r\n audienceIds,\r\n tag.mandatoryFor,\r\n tag.defaultFor\r\n );\r\n }\r\n };\r\n\r\n private onAudiencesChange = (tag: TenantSettingsTag, type: string) => (newValues) => {\r\n this.updateTagGroups(\r\n tag,\r\n (newValues || []).map((s) => s.value),\r\n type\r\n );\r\n };\r\n\r\n private handleTagNameChange = (e: React.FormEvent<HTMLInputElement>, tag: TenantSettingsTag) => {\r\n let input = e.target as HTMLInputElement;\r\n if (tag) {\r\n this.props.updateTag(\r\n tag.id,\r\n input.value,\r\n tag.mandatory,\r\n tag.default,\r\n tag.disabled,\r\n tag.deleted,\r\n tag.restricted,\r\n tag.restrictedTo,\r\n tag.mandatoryFor,\r\n tag.defaultFor\r\n );\r\n }\r\n };\r\n\r\n private handleSave = () => {\r\n this.setState({ ...this.state, editting: false });\r\n this.props.saveTenantSettings();\r\n };\r\n\r\n private downloadTopicUserList = () => tagsApi.GetTopicUserCsv(this.props.match.params.tagId);\r\n}\r\n\r\ninterface ComponentProps {\r\n intl: IntlShape;\r\n}\r\n\r\ninterface ComponentState {\r\n currentAction: string;\r\n showSubscriptionManagementModal: boolean;\r\n audiences: Audience[];\r\n editting: boolean;\r\n isTagReadsAndPostsFetched: boolean;\r\n fetchedTagStats: DetailedTagStats;\r\n errorMessage: string;\r\n}\r\ninterface RouteParams {\r\n tenant: string;\r\n tagId: string;\r\n tagGroupId: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps<RouteParams>) => ({\r\n ...ownProps,\r\n canEditTag:\r\n !!state.settings.currentUser &&\r\n state.settings.currentUser.roles.indexOf(UserRoleStrings.OWNER) > -1 &&\r\n state.settings.tenantSettings.manageTopicsAudiencesInAdmin,\r\n tagStats: state.insights.tagStats,\r\n tenantSettings: state.settings.tenantSettings,\r\n saving: state.settings.saving,\r\n fetching: state.settings.fetching,\r\n users: state.users.userList.users,\r\n locale: state.localization.locale,\r\n userGroups: state.settings.tenantSettings.securityGroups,\r\n ADGroupSyncEnabled: state.settings.tenantSettings.ADGroupSyncEnabled,\r\n pristine: state.settings.pristine,\r\n errorMsg: state.settings.errorMsg,\r\n showAudiences: state.settings.tenantSettings.showFeatures.audiences,\r\n }),\r\n {\r\n fetchTagStats: actions.fetchTagStats,\r\n fetchTagReadsAndPostReads: actions.fetchTagReadsAndPostReads,\r\n fetchUsers: userActions.getUsersV1,\r\n updateTag: settingsActions.updateTag,\r\n saveTenantSettings: settingsActions.saveTenantSettings,\r\n resetTenantSettingsToPristine: settingsActions.resetTenantSettingsToPristine,\r\n }\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default withRouter(injectIntl(connector(TagDetail)));\r\n","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { CategoryTagsListItem } from \"modules/categorytags\";\r\n\r\nimport MoreOptionsIconButton from \"modules/common/components/buttons/moreOptionsIconButton\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport Divider from \"@mui/material/Divider\";\r\nimport List from \"@mui/material/List\";\r\n\r\nimport \"../../styles/categoryTagsListing.sass\"\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\n\r\n\r\nconst MoreCategoryTagOptions: React.FunctionComponent<PropsWithRedux> = props => {\r\n const getTagForDownload = async (id: string) => {\r\n const file = {\r\n name: `${props.categoryTag.title}-${new Date().toISOString()}.csv`\r\n }\r\n props.fetchCategoryTagDetails(id)\r\n .then((data) => new FileDownloader(file).downloadBlob(data))\r\n }\r\n\r\n const onDeleteCategoryTags = async (id: string, name: string) => {\r\n const confirmationMessage: string = \"Are you sure you want to delete \" + name + \"?\";\r\n if (await confirm.show({text: confirmationMessage, title: \"Delete tag\"})) {\r\n props.deleteCategoryTag(id);\r\n }\r\n }\r\n\r\n const { categoryTag } = props;\r\n\r\n return (\r\n <MoreOptionsIconButton>\r\n <List disablePadding>\r\n {categoryTag.title !== \"Uncategorized\" && \r\n <MoreOptionsItem\r\n text=\"Edit tag details\"\r\n onClick={() => {\r\n props.setTagToEdit(props.categoryTag);\r\n props.editCategoryTag();\r\n }}\r\n />\r\n }\r\n <Divider light />\r\n {categoryTag.enabled && categoryTag.title !== \"Uncategorized\" &&\r\n <MoreOptionsItem\r\n text=\"Disable\"\r\n onClick={() => {\r\n props.disableCategoryTag(categoryTag.id);\r\n }}\r\n />\r\n }\r\n {!categoryTag.enabled &&\r\n <MoreOptionsItem\r\n text=\"Enable\"\r\n onClick={() => {\r\n props.enableCategoryTag(categoryTag.id);\r\n }}\r\n />\r\n }\r\n {categoryTag.title !== \"Uncategorized\" &&\r\n <MoreOptionsItem\r\n text=\"Delete\"\r\n onClick={() => {\r\n onDeleteCategoryTags(categoryTag.id, categoryTag.title);\r\n }}\r\n />\r\n }\r\n <Divider light />\r\n <List disablePadding>\r\n <MoreOptionsItem\r\n text=\"Download report\"\r\n onClick={() => {\r\n getTagForDownload(categoryTag.id);\r\n }}\r\n />\r\n </List>\r\n </List>\r\n </MoreOptionsIconButton>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n categoryTag: CategoryTagsListItem;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n deleteCategoryTag: actions.deleteCategoryTag,\r\n enableCategoryTag: actions.enableCategoryTag,\r\n disableCategoryTag: actions.disableCategoryTag,\r\n fetchCategoryTagDetails: actions.getCategoryTagDownload,\r\n editCategoryTag: actions.showEditCategoryTag,\r\n setTagToEdit: actions.setTagToEdit\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(MoreCategoryTagOptions);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport AuthoringSearch from \"modules/common/components/filters/authoringSearch\";\r\nimport FilterContainer from \"modules/common/components/filters/filterContainer\";\r\nimport FilterDropdown from \"modules/common/components/filters/filterDropdown\";\r\n\r\nimport { CategoryTagFilter } from \"../../models\";\r\n\r\nimport TextField from \"@mui/material/TextField\";\r\nimport { PickerLocalization } from \"modules/common/components/pickerLocalization\";\r\n\r\nimport { Button, Checkbox, Chip, List, ListItem, ListItemIcon, ListItemText } from \"@mui/material\";\r\nimport { DatePicker } from \"@mui/x-date-pickers/DatePicker\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport moment from \"moment\";\r\n\r\nconst States = [\r\n { id: \"Enabled\", text: \"Enabled\" },\r\n { id: \"Disabled\", text: \"Disabled\" }\r\n];\r\nclass CategoryTagsFilters extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n canSearch: !!props.filters.audienceVisibleTo!.length || !!props.filters.title!.length || !!props.filters.startDate || !!props.filters.endDate,\r\n enabledChecked: false,\r\n disabledChecked: false,\r\n title: props.filters.title || \"\"\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.filters.title !== prevProps.filters.title)\r\n this.setState({ title: this.props.filters.title || \"\" });\r\n }\r\n\r\n public render() {\r\n const { filters } = this.props;\r\n\r\n const validLanguages = Object.keys(this.props.lcid);\r\n var Languages = [{}];\r\n validLanguages.forEach((lcid, index) => {\r\n var toAdd = {id: this.props.lcidMappings[lcid].language, text: this.props.lcidMappings[lcid].language}\r\n Languages[index] = toAdd;\r\n })\r\n\r\n return (\r\n <FilterContainer\r\n filters={\r\n <React.Fragment> \r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.state.title}\r\n placeholder=\"Search title or administrator\"\r\n InputProps={{\r\n startAdornment: <SearchIcon className=\"search-icon\" />\r\n }}\r\n onChange={this.onUpdateSearchText}\r\n onKeyUp={this.onKeyUp}\r\n className=\"text-to-search\"\r\n />\r\n {this.props.id === \"all\" &&\r\n <FilterDropdown text=\"State\">\r\n <List disablePadding>\r\n {States.map((state) =>\r\n <ListItem key={state.id} dense button onClick={() => this.onChangeEnabledFilter(state.id)}>\r\n <ListItemIcon className=\"filter-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={state.id === \"Enabled\" ? (this.state.enabledChecked) : (this.state.disabledChecked)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={state.text} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </FilterDropdown>\r\n }\r\n { Languages.length > 1 &&\r\n <FilterDropdown text=\"Language\">\r\n <List disablePadding>\r\n {Languages.map((language) =>\r\n <ListItem key={language['text']} dense button onClick={() => this.onChangeCurrentLanguages(language['text'], false)}>\r\n <ListItemIcon className=\"filter-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={this.props.filters.languages?.includes(language['text']) ?? false}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={language['text']} style={{whiteSpace: \"nowrap\"}} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </FilterDropdown>\r\n }\r\n <FilterDropdown text=\"Published between\">\r\n <PickerLocalization>\r\n <div className=\"published-time\">\r\n <div>\r\n <div>From</div>\r\n <DatePicker\r\n format=\"MMM dd yyyy\"\r\n value={filters.startDate || null}\r\n slotProps={{ \r\n textField: { size: \"small\", placeholder: \"\", inputProps: { readOnly: true }},\r\n openPickerIcon: { color: \"primary\" }\r\n }}\r\n onChange={this.onChangePublishedFromDate}\r\n className=\"date-picker\"\r\n />\r\n </div>\r\n <div>\r\n <div>To</div>\r\n <DatePicker\r\n format=\"MMM dd yyyy\"\r\n value={filters.endDate || null}\r\n slotProps={{ \r\n textField: { size: \"small\", placeholder: \"\", inputProps: { readOnly: true }},\r\n openPickerIcon: { color: \"primary\" }\r\n }}\r\n onChange={this.onChangePublishedToDate}\r\n className=\"date-picker\"\r\n />\r\n </div>\r\n </div>\r\n </PickerLocalization>\r\n </FilterDropdown>\r\n <FilterDropdown\r\n text=\"Accessible to\"\r\n footer={\r\n <div>\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onClearAudiences}>Clear all</Button>\r\n </div>\r\n }\r\n >\r\n <List disablePadding className=\"audiences\">\r\n {this.props.audiences.map((audience) =>\r\n <ListItem key={audience.id} dense button onClick={() => this.onChangeAudiences(audience.id, false)}>\r\n <ListItemIcon className=\"filter-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!filters.audienceVisibleTo!.find((selectedAudience) => selectedAudience === audience.id)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={audience.displayName} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </FilterDropdown>\r\n { /* Can add usedIn here, once the feature is actually implemented! */ }\r\n </React.Fragment>\r\n }\r\n filterCommands={\r\n <AuthoringSearch\r\n canSearch={this.state.canSearch}\r\n onApplyFilters={this.onChangeSearchText}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n }\r\n filterSelection={this.getFilterSelection()}\r\n />\r\n );\r\n }\r\n\r\n private getFilterSelection = (): JSX.Element | undefined => {\r\n const { filters } = this.props;\r\n\r\n if (this.state.enabledChecked === null && this.state.disabledChecked === null && !filters.audienceVisibleTo!.length && !!filters.startDate && !!filters.endDate && !!filters.title)\r\n return undefined;\r\n\r\n return (\r\n <React.Fragment>\r\n {!!filters.title &&\r\n <Chip\r\n key=\"search-text\"\r\n label={`\"${filters.title}\"`}\r\n onDelete={this.onClearSearchText}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n }\r\n \r\n {this.state.enabledChecked &&\r\n <Chip\r\n key=\"search-enabled\"\r\n label={\"Enabled\"}\r\n onDelete={() => this.onChangeEnabledFilter(\"Enabled\")}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n }\r\n\r\n {this.state.disabledChecked &&\r\n <Chip\r\n key=\"search-disabled\"\r\n label={\"Disabled\"}\r\n onDelete={() => this.onChangeEnabledFilter(\"Disabled\")}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n }\r\n\r\n {!!filters.languages && filters.languages.map((language => \r\n <Chip\r\n key={`search-language-${language}`}\r\n label={language}\r\n onDelete={() => this.onChangeCurrentLanguages(language, true)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n ))\r\n }\r\n\r\n {(!!filters.startDate || !!filters.endDate) &&\r\n <Chip\r\n key=\"published-time\"\r\n label={`Released${!!filters.startDate ? ` from ${moment(filters.startDate).format(\"MMM D, YYYY\")}` : \"\"}${!!filters.endDate? ` up to ${moment(filters.endDate).format(\"MMM D, YYYY\")}` : \"\"}`}\r\n onDelete={this.onClearPublishedTime}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n }\r\n\r\n {filters.audienceVisibleTo!.map((selectedAudience) =>\r\n <Chip\r\n key={selectedAudience}\r\n label={this.props.audiences.find(a => a.id === selectedAudience)?.displayName ?? \"\"}\r\n onDelete={() => this.onChangeAudiences(selectedAudience, true)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private onChangeFilters = (value: Partial<CategoryTagFilter>) => {\r\n this.props.onChangeFilters({ ...this.props.filters, title: this.state.title, ...value });\r\n this.setCanSearch();\r\n }\r\n \r\n private onChangeSearchText = () => {\r\n this.onChangeFilters({ title: this.state.title });\r\n }\r\n\r\n private onClearSearchText = (event) => {\r\n this.updateAndReloadFilters({title: \"\"});\r\n }\r\n\r\n private updateAndReloadFilters = (toUpdate: {}) => {\r\n this.props.onChangeFilters(toUpdate);\r\n }\r\n\r\n private onChangeEnabledFilter = (enabledFilter: string) => {\r\n switch(enabledFilter){\r\n case(\"Enabled\"):\r\n this.setState({enabledChecked: !this.state.enabledChecked}, () => this.updateStateFilter())\r\n break;\r\n\r\n case(\"Disabled\"):\r\n this.setState({disabledChecked: !this.state.disabledChecked}, () => this.updateStateFilter())\r\n break;\r\n }\r\n }\r\n\r\n private updateStateFilter = () => {\r\n if(this.state.enabledChecked && this.state.disabledChecked) {\r\n this.onChangeFilters({ enabled: null});\r\n }\r\n else if(this.state.enabledChecked) {\r\n this.onChangeFilters({ enabled: true});\r\n }\r\n else if(this.state.disabledChecked) {\r\n this.onChangeFilters({ enabled: false});\r\n }\r\n else if(!this.state.enabledChecked && !this.state.disabledChecked)\r\n {\r\n this.onChangeFilters({ enabled: null });\r\n }\r\n }\r\n\r\n private onChangeCurrentLanguages = (language: string, chipDeleted: boolean) => {\r\n var languagesListToEdit = this.props.filters.languages ?? [];\r\n\r\n if(languagesListToEdit.indexOf(language) === -1) {\r\n languagesListToEdit = [...languagesListToEdit, language];\r\n }\r\n else if(languagesListToEdit.indexOf(language) !== -1) {\r\n languagesListToEdit = languagesListToEdit.filter(l => l !== language)\r\n }\r\n\r\n if(!chipDeleted)\r\n this.onChangeFilters({languages: languagesListToEdit})\r\n else\r\n this.updateAndReloadFilters({languages: languagesListToEdit});\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.clearCanSearch();\r\n this.props.onClearFilters();\r\n this.setState({enabledChecked: false, disabledChecked: false})\r\n }\r\n\r\n private onChangePublishedFromDate = (date) => {\r\n this.onChangeFilters({ startDate: moment(date).toDate() });\r\n }\r\n\r\n private onChangePublishedToDate = (date) => {\r\n this.onChangeFilters({ endDate: moment(date).toDate() });\r\n }\r\n\r\n private onClearPublishedTime = () => {\r\n this.updateAndReloadFilters({ startDate: undefined, endDate: undefined});\r\n this.setCanSearch();\r\n }\r\n\r\n private onChangeAudiences = (audience: string, chipDeleted: boolean) => {\r\n var audiencesToEdit = this.props.filters.audienceVisibleTo ?? [];\r\n\r\n if(audiencesToEdit.indexOf(audience) === -1) {\r\n audiencesToEdit = [...audiencesToEdit, audience];\r\n }\r\n else if(audiencesToEdit.indexOf(audience) !== -1) {\r\n audiencesToEdit = audiencesToEdit.filter(l => l !== audience)\r\n }\r\n\r\n if(!chipDeleted)\r\n this.onChangeFilters({audienceVisibleTo: audiencesToEdit})\r\n else\r\n this.updateAndReloadFilters({audienceVisibleTo: audiencesToEdit});\r\n }\r\n\r\n private onClearAudiences = () => {\r\n this.onChangeFilters({ audienceVisibleTo: [] });\r\n }\r\n \r\n private onKeyUp = (key) => {\r\n if (key.keyCode === 13)\r\n this.onChangeSearchText();\r\n }\r\n\r\n private onUpdateSearchText = (event) => {\r\n this.setState({ title: event.target.value });\r\n }\r\n\r\n private clearCanSearch = () => {\r\n this.setState({ canSearch: false });\r\n }\r\n\r\n private setCanSearch = () => {\r\n this.setState({ canSearch: true });\r\n }\r\n}\r\n \r\n\r\ninterface ComponentProps {\r\n filters: Partial<CategoryTagFilter>;\r\n id: string;\r\n onChangeFilters: (filters: Partial<CategoryTagFilter>) => void;\r\n onClearFilters: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n canSearch: boolean;\r\n enabledChecked: boolean;\r\n disabledChecked: boolean;\r\n title: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n lcidMappings: state.resources.lcidMappings,\r\n lcid: state.settings.tenantSettings.translatedContent,\r\n audiences: state.audiences.audiences\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(CategoryTagsFilters);","import React, { ReactElement } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { CategoryTagFilter, CategoryTagsListingPage, CategoryTagsListItem } from \"../../models\";\r\nimport moment from \"moment\";\r\n\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport MoreCategoryTagOptions from \"../action-buttons/moreCategoryTagOptions\";\r\nimport CategoryTagsFilters from \"../category-tags-filters/categoryTagsFilters\";\r\n\r\nimport TabContent from \"pages/common/tabContent\";\r\nimport TabContentToolbar from \"pages/common/tabContentToolbar\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableContainer from \"@mui/material/TableContainer\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TablePagination from \"@mui/material/TablePagination\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport SaveAltIcon from \"@mui/icons-material/SaveAlt\";\r\n\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\nimport AudienceChipLabels from \"modules/common/components/chips/audienceChipLabels\";\r\nimport LoadingSpinner from \"modules/common/components/loadingSpinner\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\n\r\ninterface HeaderCell {\r\n disablePadding: boolean;\r\n id: string;\r\n label: string;\r\n icon?: ReactElement<any>;\r\n}\r\n\r\n\r\nclass CategoryTagsList extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n filters: { ...this.getDefaultFilterValues() },\r\n hasFiltersApplied: false,\r\n isPagedLoad: false,\r\n categoryTagDetails: undefined,\r\n selectedItems: [],\r\n showCategoryTagDetails: false,\r\n isDownloading: false\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.page.id !== prevProps.page.id) {\r\n this.setState({ selectedItems: [] });\r\n }\r\n }\r\n\r\n public render() {\r\n const { page } = this.props;\r\n\r\n if (!this.props.show)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n if (page.isFetching && !this.state.isPagedLoad)\r\n return <Loading />;\r\n \r\n return (\r\n <div className=\"category-tags-list\">\r\n {this.getToolbar()}\r\n <TabContent>\r\n {this.getFilter()}\r\n {this.getList()}\r\n </TabContent>\r\n </div>\r\n );\r\n }\r\n\r\n private formatPublishedTime = (time?: string): JSX.Element => {\r\n if (time) {\r\n return (\r\n <div className=\"category-tag-time\">\r\n <span>{moment(new Date(time)).format(\"MMM D, YYYY, h:mmA\")}</span>\r\n </div>\r\n );\r\n }\r\n return <div>-</div>;\r\n }\r\n\r\n private formatState = (enabled: boolean): JSX.Element => {\r\n if (!enabled)\r\n return <span className=\"category-tag-state grey\">{\"Disabled\"}</span>;\r\n else\r\n return <span className=\"category-tag-state green\">{\"Enabled\"}</span>;\r\n }\r\n\r\n private getDefaultFilterValues = (): Partial<CategoryTagFilter> => {\r\n const filters: Partial<CategoryTagFilter> = {\r\n title: \"\",\r\n audienceVisibleTo: []\r\n };\r\n return filters;\r\n }\r\n\r\n\r\n private getFilter = (): JSX.Element => {\r\n return (\r\n <CategoryTagsFilters\r\n filters={this.state.filters}\r\n id={this.props.page.id}\r\n onChangeFilters={this.onChangeFilters}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n );\r\n }\r\n\r\n private getHeader = (): HeaderCell[] => {\r\n const { page } = this.props;\r\n\r\n let header: HeaderCell[] = [\r\n { id: \"title\", disablePadding: true, label: \"Category tag title\" },\r\n { id: \"options\", disablePadding: true, label: \"\" }\r\n ];\r\n\r\n if (page.id === \"all\")\r\n header.push({ id: \"state\", disablePadding: false, label: \"State\" });\r\n\r\n header.push({ id: \"publish\", disablePadding: false, label: \"Created date\" })\r\n header.push({ id: \"modified\", disablePadding: false, label: \"Last modified by\" })\r\n header.push({ id: \"language\", disablePadding: false, label: \"Language\" })\r\n\r\n header.push({ id: \"access\", disablePadding: false, label: \"Default access audience\", \r\n icon: <InfoHover>These are the default audiences that the content will be accessible to when a tag is used. \r\n You can still edit these audiences despite using this tag.</InfoHover>})\r\n \r\n header.push({ id: \"notify\", disablePadding: false, label: \"Default notified audience\",\r\n icon: <InfoHover>These are the default audiences that will receive a notification when a tag is used. \r\n You can still edit these audiences despite using this tag. </InfoHover>})\r\n \r\n return header;\r\n }\r\n\r\n private getList = (): JSX.Element => {\r\n const { page } = this.props;\r\n const { selectedItems } = this.state;\r\n\r\n const rowCount = page.categoryTags.length || 10;\r\n if (page.isFetching)\r\n return <Loading />;\r\n \r\n if (!page.categoryTags.length)\r\n return (\r\n <React.Fragment>\r\n {this.state.hasFiltersApplied && \r\n <Typography variant=\"h2\" className=\"category-tag-results\">Results</Typography>\r\n }\r\n <div>No category tags were found.</div>\r\n </React.Fragment>\r\n );\r\n\r\n return (\r\n <React.Fragment>\r\n {this.state.hasFiltersApplied && \r\n <Typography variant=\"h2\" className=\"category-tag-results\">Results</Typography>\r\n }\r\n <TableContainer>\r\n <Table size=\"medium\">\r\n <TableHead>\r\n <TableRow>\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n color=\"primary\"\r\n indeterminate={selectedItems.length > 0 && selectedItems.length < rowCount}\r\n checked={rowCount > 0 && selectedItems.length === rowCount}\r\n onChange={this.onSelectAllCategoryTags}\r\n inputProps={{ \"aria-label\": \"select all pages\" }}\r\n />\r\n </TableCell>\r\n {this.getHeader().map((headerCell) => {\r\n if (headerCell.id === \"options\")\r\n return <TableCell key={headerCell.id} padding=\"checkbox\"></TableCell>\r\n\r\n return (\r\n <TableCell\r\n key={headerCell.id}\r\n align={headerCell.disablePadding ? \"left\" : \"center\"}\r\n padding={headerCell.disablePadding && headerCell.id !== \"title\" ? \"none\" : \"normal\"}\r\n >\r\n <div className=\"category-tag-headers\">\r\n {headerCell.label}\r\n {headerCell.icon}\r\n </div>\r\n </TableCell>\r\n );\r\n })}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {page.categoryTags\r\n .map((categoryTag, index) => this.getListItem(categoryTag, index))\r\n }\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n {page.currentPage > 0 && page.totalPages > 1 &&\r\n <TablePagination\r\n rowsPerPageOptions={[10]}\r\n component=\"div\"\r\n backIconButtonProps={{ color: \"primary\" }}\r\n nextIconButtonProps={{ color: \"primary\" }}\r\n count={page.totalCategoryTags}\r\n rowsPerPage={10}\r\n page={page.currentPage - 1}\r\n onPageChange={this.onChangePage}\r\n />\r\n }\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private getListItem = (categoryTag: CategoryTagsListItem, index: number): JSX.Element => {\r\n const isCategoryTagSelected = this.isCategoryTagSelected(categoryTag);\r\n const labelId = `category-tag-list-checkbox-${index}`;\r\n\r\n return (\r\n <React.Fragment key={categoryTag.id}>\r\n <TableRow\r\n hover\r\n onClick={() => this.prepareAndView(categoryTag.id, categoryTag)}\r\n role=\"checkbox\"\r\n aria-checked={isCategoryTagSelected}\r\n tabIndex={-1}\r\n key={categoryTag.id}\r\n selected={isCategoryTagSelected}\r\n style={{cursor: \"pointer\"}}\r\n >\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n color=\"primary\"\r\n checked={isCategoryTagSelected}\r\n inputProps={{ \"aria-labelledby\": labelId }}\r\n onClick={(ev) => this.onSelectCategoryTag(ev, categoryTag)}\r\n />\r\n </TableCell>\r\n <TableCell component=\"td\" id={labelId} scope=\"row\">{categoryTag.title}</TableCell>\r\n <TableCell padding=\"checkbox\">\r\n <MoreCategoryTagOptions categoryTag={categoryTag} /> \r\n </TableCell>\r\n {this.props.page.id === \"all\" &&\r\n <TableCell component=\"td\" id={labelId} scope=\"row\" align=\"center\"><div>{this.formatState(categoryTag.enabled)}</div></TableCell>\r\n }\r\n <TableCell component=\"td\" id={labelId} scope=\"row\" align=\"center\">{categoryTag.title === \"Uncategorized\" ? \"-\" : this.formatPublishedTime(categoryTag.createdDate)}</TableCell>\r\n <TableCell component=\"td\" id={labelId} scope=\"row\" align=\"center\">{categoryTag.lastModifiedBy ? categoryTag.lastModifiedBy.name : \"-\"}</TableCell>\r\n <TableCell component=\"td\" id={labelId} scope=\"row\" align=\"center\">{categoryTag.language}</TableCell>\r\n <TableCell component=\"td\" id={labelId} scope=\"row\" align=\"center\">{<AudienceChipLabels audienceIds={categoryTag.defaultAudienceAccess} audiences={this.props.audiences}/>}</TableCell>\r\n <TableCell component=\"td\" id={labelId} scope=\"row\" align=\"center\">{<AudienceChipLabels audienceIds={categoryTag.defaultAudienceNotified} audiences={this.props.audiences} emptyText=\"None\" />}</TableCell>\r\n </TableRow>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private getToolbar = (): JSX.Element => {\r\n const { selectedItems } = this.state;\r\n\r\n if (!selectedItems.length)\r\n return <React.Fragment></React.Fragment>;\r\n \r\n return (\r\n <TabContentToolbar>\r\n <div>\r\n {this.getToolbarIcon(`${selectedItems.length} selected`, <ClearIcon />, this.onClearAllCategoryTags)}\r\n </div>\r\n <div>\r\n {this.getToolbarIcon(\"Download Selected Reports\", this.state.isDownloading ? <LoadingSpinner size={\"20px\"}/> : <SaveAltIcon/>, () => this.getTagsForDownload(this.state.selectedItems.map(s => s.id)))}\r\n {this.getToolbarIcon(\"Delete\", <DeleteIcon />, this.onDeleteCategoryTags)}\r\n </div>\r\n </TabContentToolbar>\r\n );\r\n }\r\n\r\n private getTagsForDownload = async (ids: string[]) => {\r\n this.setState({isDownloading: true})\r\n\r\n const file = {\r\n name: `SelectedCategoryTags-${new Date().toISOString()}.csv`\r\n } \r\n this.props.downloadCategoryTags(ids)\r\n .then((tags) => new FileDownloader(file).downloadBlob(tags))\r\n .then(_ => this.setState({isDownloading: false}))\r\n .catch(_ => this.setState({isDownloading: false}))\r\n }\r\n\r\n private getToolbarIcon = (title: string, icon: React.ReactNode, onClick: () => void) => {\r\n return (\r\n <Button aria-label={title.toLowerCase()} color=\"primary\" startIcon={icon} onClick={onClick}>\r\n {title}\r\n </Button>\r\n );\r\n }\r\n\r\n private isCategoryTagSelected = (categoryTag: CategoryTagsListItem): boolean => {\r\n return this.state.selectedItems.findIndex((selectedItem) => selectedItem.id === categoryTag.id) !== -1;\r\n }\r\n\r\n private onApplyFilters = () => {\r\n this.setState({ hasFiltersApplied: true, isPagedLoad: true });\r\n this.props.fetchPage(1, this.state.filters);\r\n }\r\n\r\n private onChangeFilters = (filters: Partial<CategoryTagFilter>) => {\r\n this.setState({ filters: { ...this.state.filters, ...filters } }, () => {\r\n this.onApplyFilters();\r\n });\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.setState({ hasFiltersApplied: false, filters: { ...this.getDefaultFilterValues() }, isPagedLoad: true });\r\n this.props.fetchPage(1, {});\r\n }\r\n\r\n\r\n private onClearAllCategoryTags = () => {\r\n this.setState({ selectedItems: [] });\r\n }\r\n\r\n private onDeleteCategoryTags = async () => {\r\n const confirmationMessage: string = this.state.selectedItems.length > 1\r\n ? \"Are you sure you want to delete these category tags?\"\r\n : \"Are you sure you want to delete this category tag?\";\r\n if (await confirm.show({text: confirmationMessage, title: \"Delete tag(s)\"})) {\r\n if (this.state.selectedItems.length === 1) {\r\n const selectedItem: CategoryTagsListItem = this.state.selectedItems[0];\r\n this.props.deleteCategoryTag(selectedItem.id);\r\n this.onClearAllCategoryTags();\r\n } else {\r\n this.props.deleteCategoryTags(this.state.selectedItems);\r\n this.onClearAllCategoryTags();\r\n }\r\n }\r\n }\r\n\r\n private onSelectAllCategoryTags = () => {\r\n if (this.state.selectedItems.length === this.props.page.categoryTags.length)\r\n this.setState({ selectedItems: [] });\r\n else\r\n this.setState({ selectedItems: this.props.page.categoryTags });\r\n }\r\n\r\n private onSelectCategoryTag = (ev, categoryTag: CategoryTagsListItem) => {\r\n ev.stopPropagation();\r\n let selectedItems = this.state.selectedItems.slice();\r\n\r\n if (selectedItems.findIndex((selectedItem) => selectedItem.id === categoryTag.id) === -1)\r\n selectedItems = selectedItems.concat([categoryTag]);\r\n else\r\n selectedItems = selectedItems.filter(selectedItem => selectedItem.id !== categoryTag.id);\r\n\r\n this.setState({ selectedItems });\r\n }\r\n\r\n private deselectCategoryTag = (id: string) => {\r\n let selectedItems = this.state.selectedItems.slice();\r\n selectedItems = selectedItems.filter(selectedItem => selectedItem.id !== id);\r\n this.setState({ selectedItems });\r\n }\r\n\r\n private onChangePage = (ev, page: number) => {\r\n this.props.fetchPage(page + 1, this.state.filters);\r\n }\r\n\r\n private prepareAndView = (id: string, tag: CategoryTagsListItem | undefined) => {\r\n //Deselect tag when viewed in detail as a safety precaution in case they delete.\r\n //Could potentially upgrade this later to be smarter about the deselection, but due to having seperate components it will be complicated.\r\n this.deselectCategoryTag(id);\r\n this.props.setTagToView(id, tag);\r\n this.props.showCategoryTagDetails();\r\n }\r\n}\r\n \r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n page: CategoryTagsListingPage;\r\n fetchPage: (pageNumber: number, filters: Partial<CategoryTagFilter>) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n filters: Partial<CategoryTagFilter>;\r\n hasFiltersApplied: boolean;\r\n isPagedLoad: boolean;\r\n categoryTagDetails: CategoryTagsListItem | undefined;\r\n selectedItems: CategoryTagsListItem[];\r\n showCategoryTagDetails: boolean;\r\n isDownloading: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences,\r\n tenant: state.tenant.id,\r\n }),\r\n {\r\n deleteCategoryTag: actions.deleteCategoryTag,\r\n deleteCategoryTags: actions.deleteCategoryTags,\r\n showCategoryTagDetails: actions.showViewCategoryTag,\r\n setTagToView: actions.setTagToView,\r\n downloadCategoryTags: actions.downloadCategoryTags,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(CategoryTagsList);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { CategoryTagFilter, CategoryTagsListingPage } from \"modules/categorytags\";\r\n\r\nimport CategoryTagsList from \"./categoryTagsList\";\r\n\r\nimport Tabs from \"pages/common/tabs\";\r\n\r\nconst allTab: number = 0;\r\nconst enabledTab: number = 1;\r\nconst disabledTab: number = 2;\r\n\r\n\r\nclass CategoryTagsListing extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n filters: { ...this.getDefaultFilterValues() },\r\n hasFiltersApplied: false,\r\n selectedItems: [],\r\n selectedTab: 0\r\n };\r\n }\r\n\r\n public componentWillMount() {\r\n if (this.props.isInitialLoad || this.props.shouldFetch) {\r\n this.fetchLists();\r\n this.props.getUserCategoryTags();\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.shouldFetch && (this.props.shouldFetch !== prevProps.shouldFetch)) {\r\n this.fetchLists();\r\n this.props.getUserCategoryTags();\r\n }\r\n }\r\n\r\n public render() {\r\n const { selectedTab } = this.state;\r\n\r\n return (\r\n <React.Fragment>\r\n <div className=\"category-tags-listing\">\r\n <Tabs\r\n tabs={[\r\n { label: this.getTabLabel(\"All\", this.props.all), id: \"all-tags-tab\" },\r\n { label: this.getTabLabel(\"Enabled\", this.props.enabled), dotColor: \"green\", id: \"enabled-tags-tab\" },\r\n { label: this.getTabLabel(\"Disabled\", this.props.disabled), dotColor: \"grey\", id: \"disabled-tags-tab\" }\r\n ]}\r\n selectedTab={selectedTab}\r\n onSelectTab={this.onSelectTab}\r\n />\r\n { <CategoryTagsList show={selectedTab === allTab} page={this.props.all} fetchPage={this.fetchAll} /> }\r\n { <CategoryTagsList show={selectedTab === enabledTab} page={this.props.enabled} fetchPage={this.fetchEnabled} /> }\r\n { <CategoryTagsList show={selectedTab === disabledTab} page={this.props.disabled} fetchPage={this.fetchDisabled} /> }\r\n </div>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n\r\n private fetchLists = () => {\r\n this.fetchAll(1, {});\r\n this.fetchEnabled(1, {});\r\n this.fetchDisabled(1, {});\r\n this.props.clearShouldFetch();\r\n }\r\n\r\n\r\n private fetchAll = (pageNumber: number, filters: Partial<CategoryTagFilter>) => {\r\n !this.props.all.isFetching &&\r\n this.props.getAll(pageNumber, filters);\r\n }\r\n\r\n private fetchEnabled = (pageNumber: number, filters: Partial<CategoryTagFilter>) => {\r\n !this.props.enabled.isFetching &&\r\n this.props.getEnabled(pageNumber, filters);\r\n }\r\n\r\n private fetchDisabled = (pageNumber: number, filters: Partial<CategoryTagFilter>) => {\r\n !this.props.disabled.isFetching &&\r\n this.props.getDisabled(pageNumber, filters);\r\n }\r\n\r\n\r\n private getDefaultFilterValues = (): Partial<CategoryTagFilter> => {\r\n const filters: Partial<CategoryTagFilter> = {\r\n title: \"\"\r\n };\r\n return filters;\r\n }\r\n\r\n private getTabLabel = (label: string, page: CategoryTagsListingPage): string => {\r\n if (!!page.currentPage)\r\n return `${label} (${page.totalCategoryTags})`;\r\n return label;\r\n }\r\n\r\n private onSelectTab = (tabIndex: number) => {\r\n this.setState({ ...this.state, selectedTab: tabIndex });\r\n }\r\n}\r\n \r\n\r\ninterface ComponentProps {\r\n}\r\n\r\ninterface ComponentState {\r\n filters: Partial<CategoryTagFilter>;\r\n hasFiltersApplied: boolean;\r\n selectedItems: string[];\r\n selectedTab: number;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n all: state.categoryTags.all,\r\n enabled: state.categoryTags.enabled,\r\n disabled: state.categoryTags.disabled,\r\n isFetching: state.categoryTags.isFetching,\r\n isInitialLoad: state.categoryTags.isInitialLoad,\r\n shouldFetch: state.categoryTags.shouldFetch,\r\n tenantSettings: state.settings.tenantSettings,\r\n tenant: state.tenant.id\r\n }),\r\n {\r\n clearShouldFetch: actions.clearShouldFetch,\r\n getAll: actions.getCategoryTags,\r\n getDisabled: actions.getDisabledCategoryTags,\r\n getEnabled: actions.getEnabledCategoryTags,\r\n getUserCategoryTags: actions.getUserCategoryTags\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(CategoryTagsListing);","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport SaveAltIcon from '@mui/icons-material/SaveAlt';\r\n\r\nimport { Button } from \"@mui/material\";\r\nimport LoadingSpinner from \"modules/common/components/loadingSpinner\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\n\r\nconst DownloadReports: React.FunctionComponent<PropsWithRedux> = props => {\r\n const [downloading, setIsDownloading] = React.useState(false);\r\n\r\n const getTagsForDownload = async () => {\r\n setIsDownloading(true);\r\n const file = {\r\n name: `AllCategoryTags-${new Date().toISOString()}.csv`\r\n };\r\n \r\n props.downloadAllReports()\r\n .then((tags) => new FileDownloader(file).downloadBlob(tags))\r\n .then(_ => setIsDownloading(false))\r\n .catch(_ => setIsDownloading(false))\r\n }\r\n\r\n return (\r\n <div>\r\n <Button\r\n startIcon={downloading ? <LoadingSpinner size={\"20px\"}/> : <SaveAltIcon/>} \r\n onClick={() => getTagsForDownload()}\r\n variant={\"outlined\"}\r\n color={\"primary\"}\r\n >\r\n Download reports\r\n </Button>\r\n </div>\r\n );\r\n\r\n}\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps\r\n }),\r\n {\r\n downloadAllReports: actions.downloadAllCategoryTags\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(DownloadReports);","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\n\r\n\r\nconst NewCategoryTag: React.FunctionComponent<PropsWithRedux> = props => {\r\n return (\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n startIcon={<AddIcon />}\r\n onClick={props.showNewCategoryTag}\r\n >\r\n New Category Tag\r\n </Button>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps\r\n }),\r\n {\r\n showNewCategoryTag: actions.showNewCategoryTag\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(NewCategoryTag);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport * as audiencesActions from \"modules/audiences/actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { Audience } from \"modules/audiences/models\";\r\n\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Drawer from \"@mui/material/Drawer\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport Paper from \"@mui/material/Paper\";\r\n\r\nimport ArrowBackIcon from \"@mui/icons-material/ArrowBack\";\r\n\r\n\r\nclass AudiencesDrawer extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n isLoading: false,\r\n selectedAudiences: props.selectedAudiences\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n if (!this.props.audiences.length) {\r\n this.setState({ isLoading: true });\r\n this.props.getAudiences().then(() => {\r\n this.setState({ isLoading: false });\r\n });\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.show && !prevProps.show)\r\n this.setState({ selectedAudiences: this.props.selectedAudiences });\r\n }\r\n\r\n public render() {\r\n return (\r\n <Drawer anchor=\"right\" open={this.props.show} onClose={this.onApply} classes={{ paper: \"portal-pages-list-drawer\" }} style={{zIndex: 1500}}>\r\n <Paper square elevation={0} className=\"portal-pages-list-header\">\r\n <IconButton onClick={this.onApply} size=\"large\">\r\n <ArrowBackIcon />\r\n </IconButton>\r\n <div>Add audience</div>\r\n </Paper>\r\n <div>\r\n {this.getList()}\r\n </div>\r\n </Drawer>\r\n );\r\n }\r\n\r\n private getList = () => {\r\n if (this.state.isLoading)\r\n return <Loading />;\r\n \r\n if (!this.props.audiences.length)\r\n return <div>No audiences were found</div>;\r\n \r\n var audiencesForList;\r\n\r\n if (this.props.audiencesToCheck && this.props.audiencesToCheck.length > 0)\r\n {\r\n audiencesForList = this.props.audiencesToCheck;\r\n }\r\n else\r\n {\r\n audiencesForList = this.props.audiences;\r\n }\r\n\r\n return (\r\n <List disablePadding>\r\n {audiencesForList.map((audience) =>\r\n <ListItem key={audience.id} dense button onClick={() => this.onSelectAudience(audience)}>\r\n <ListItemIcon className=\"portal-pages-list-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!this.state.selectedAudiences.find((selectedAudience) => selectedAudience.id === audience.id)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={audience.displayName} />\r\n </ListItem>\r\n )}\r\n </List>\r\n );\r\n }\r\n\r\n private onApply = () => {\r\n this.props.onChange(this.state.selectedAudiences);\r\n }\r\n\r\n private onSelectAudience = (audience: Audience) => {\r\n const hasSelectedAudience: boolean = !!this.state.selectedAudiences.find((selectedAudience) => selectedAudience.id === audience.id);\r\n if (hasSelectedAudience)\r\n this.setState({ ...this.state, selectedAudiences: this.state.selectedAudiences.filter((selectedAudience) => selectedAudience.id !== audience.id) });\r\n else\r\n this.setState({ ...this.state, selectedAudiences: this.state.selectedAudiences.concat([audience]) });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n selectedAudiences: Audience[];\r\n onChange: (audiences: Audience[]) => void;\r\n audiencesToCheck?: Audience[];\r\n}\r\n\r\ninterface ComponentState {\r\n isLoading: boolean;\r\n selectedAudiences: Audience[];\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n getAudiences: audiencesActions.getAudiences,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(AudiencesDrawer);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { CategoryTagModel } from \"modules/categorytags/models\";\r\n\r\nimport { Audience } from \"modules/audiences/models\";\r\n\r\nimport \"../../categoryTags.sass\"\r\nimport \"../../styles/dialogs.sass\"\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport Chip from \"@mui/material/Chip\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport FileCopyOutlinedIcon from \"@mui/icons-material/FileCopyOutlined\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport Select from \"@mui/material/Select\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Switch from \"@mui/material/Switch\";\r\n\r\nimport AudiencesDrawer from \"./audiencesDrawer\";\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\n\r\n\r\nclass NewCategoryTagDialog extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n audiences: [],\r\n visibleAudiences: [],\r\n notifiedAudiences: [],\r\n categoryTagTitle: \"\",\r\n categoryTagTitleIsValid: true,\r\n categoryTagDescription: \"\",\r\n categoryTagDescriptionIsValid: true,\r\n categoryTagLanguage: \"\",\r\n categoryTagEnabled: true,\r\n showAudiencesList: false,\r\n showNotifyAudiencesList: false,\r\n showVisibleAudiencesList: false\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.showNewCategoryTag && !prevProps.showNewCategoryTag) {\r\n const validLanguages = Object.keys(this.props.lcid);\r\n var languageOptions:string[] = [];\r\n validLanguages.forEach((lcid, index) => {\r\n var toAdd = this.props.lcidMappings[lcid].language\r\n languageOptions.push(toAdd);\r\n })\r\n\r\n this.setState({\r\n audiences: [],\r\n visibleAudiences: [],\r\n notifiedAudiences: [],\r\n categoryTagTitle: \"\",\r\n categoryTagTitleIsValid: true,\r\n categoryTagDescription: \"\",\r\n categoryTagDescriptionIsValid: true,\r\n categoryTagLanguage: languageOptions[0] ?? \"\",\r\n categoryTagEnabled: true,\r\n showAudiencesList: false,\r\n showNotifyAudiencesList: false,\r\n showVisibleAudiencesList: false\r\n });\r\n }\r\n }\r\n\r\n \r\n public render() {\r\n const validLanguages = Object.keys(this.props.lcid);\r\n var languageOptions:string[] = [];\r\n validLanguages.forEach((lcid, index) => {\r\n var toAdd = this.props.lcidMappings[lcid].language\r\n languageOptions.push(toAdd);\r\n })\r\n\r\n return (\r\n <Dialog open={this.props.showNewCategoryTag} maxWidth={false} onClose={this.onClose}>\r\n <DialogTitle className=\"category-tags-dialog-header\">\r\n <div className=\"category-tags-dialog-header-title\">\r\n <Typography variant=\"h2\">Create new category tag</Typography>\r\n <IconButton onClick={this.onClose} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent className=\"category-tag-dialog-content\">\r\n <div className=\"category-tag-dialog-content-form\">\r\n <div>\r\n <div className=\"category-tag-prompt-left\">Category tag title</div>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.state.categoryTagTitle}\r\n autoComplete=\"off\"\r\n error={!this.state.categoryTagTitleIsValid}\r\n fullWidth\r\n inputProps={{\r\n maxLength: 50\r\n }}\r\n onChange={this.onChangeTitle}\r\n />\r\n </div>\r\n <div>\r\n <div className=\"category-tag-prompt-left\">Description</div>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.state.categoryTagDescription}\r\n autoComplete=\"off\"\r\n error={!this.state.categoryTagDescriptionIsValid}\r\n fullWidth\r\n onChange={this.onChangeDescription}\r\n />\r\n </div>\r\n { languageOptions.length > 1 &&\r\n <div>\r\n <div className=\"category-tag-prompt-left\">Language</div>\r\n <Select className=\"category-tag-language-select\"\r\n onChange={(e) => this.onChangeLanguage(e)}\r\n MenuProps={{\r\n anchorOrigin: {\r\n vertical: \"bottom\",\r\n horizontal: \"left\"\r\n },\r\n transformOrigin: {\r\n vertical: \"top\",\r\n horizontal: \"left\"\r\n },\r\n }}\r\n variant={\"outlined\"}\r\n value={this.state.categoryTagLanguage}\r\n >\r\n {languageOptions.map((l, index) => (\r\n <MenuItem key={index} value={l}>{l}</MenuItem>\r\n ))}\r\n </Select>\r\n </div>\r\n }\r\n <div>\r\n <div className=\"category-tag-prompt-left\">Enabled</div>\r\n <Switch\r\n checked={this.state.categoryTagEnabled}\r\n onClick={() => this.onChangeEnabled(!this.state.categoryTagEnabled)}\r\n color=\"primary\"\r\n className=\"category-tag-enable\"\r\n size=\"medium\"\r\n />\r\n </div>\r\n <div>\r\n <div className=\"audiences-list-label\">Default access audiences {<InfoHover>Default audiences who can access contents that use this tag. These audiences can still be edited when creating new content.</InfoHover>}</div>\r\n <div> \r\n {!!this.state.visibleAudiences.length &&\r\n <div className=\"audiences-list\">\r\n {this.state.visibleAudiences.map((audience) =>\r\n <Chip\r\n key={audience.id}\r\n label={audience.displayName}\r\n onDelete={() => this.onRemoveAudienceAccess(audience)}\r\n deleteIcon={<CloseIcon />}\r\n style={{position: 'relative', top: '12px'}}\r\n />\r\n )}\r\n </div>\r\n }\r\n { !this.state.visibleAudiences.length && \r\n <div className=\"audiences-list\">\r\n <Chip\r\n key={\"everyone-default-audience\"}\r\n label={<i>All users</i>}\r\n style={{position: 'relative', top: '12px', backgroundColor: \"#dde1e5\"}}\r\n disabled={true}\r\n />\r\n </div>\r\n }\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n startIcon={<AddIcon />}\r\n onClick={this.onShowVisibleAudiencesList}\r\n style={{position: 'relative', top: '6px'}}\r\n >\r\n Edit Audiences\r\n </Button>\r\n { <AudiencesDrawer show={this.state.showVisibleAudiencesList} selectedAudiences={this.state.visibleAudiences} onChange={this.onChangeAudiencesAccess} /> }\r\n </div>\r\n </div>\r\n <div>\r\n <div className=\"audiences-list-label\">Default notified audiences {<InfoHover>Default audiences who get notified when content is published with this tag. These audiences can still be edited when creating new content.</InfoHover>}</div>\r\n <div>\r\n {!!this.state.notifiedAudiences.length &&\r\n <div className=\"audiences-list\">\r\n {this.state.notifiedAudiences.map((audience) =>\r\n <Chip\r\n key={audience.id}\r\n label={audience.displayName}\r\n onDelete={() => this.onRemoveAudienceNotify(audience)}\r\n deleteIcon={<CloseIcon />}\r\n style={{position: 'relative', top: '12px'}}\r\n />\r\n )}\r\n </div>\r\n }\r\n <div>\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n startIcon={<AddIcon />}\r\n onClick={this.onShowNotifyAudiencesList}\r\n style={{position: 'relative', top: '10px'}}\r\n >\r\n Edit Audiences\r\n </Button>\r\n </div>\r\n\r\n <div>\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n startIcon={<FileCopyOutlinedIcon />}\r\n onClick={this.onCopyAudiences}\r\n style={{position: 'relative', top: '8px'}}\r\n disabled={this.state.visibleAudiences.length === 0}\r\n >\r\n Copy Access Audiences\r\n </Button>\r\n </div>\r\n { <AudiencesDrawer show={this.state.showNotifyAudiencesList} selectedAudiences={this.state.notifiedAudiences} onChange={this.onChangeAudiencesNotify} audiencesToCheck={this.state.visibleAudiences}/> }\r\n </div>\r\n </div>\r\n </div>\r\n </DialogContent>\r\n <DialogActions className=\"category-tags-dialog-footer\">\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onClose}>Cancel</Button>\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n disabled={!this.state.categoryTagTitle || !this.state.categoryTagTitleIsValid || !this.state.categoryTagDescription || !this.state.categoryTagDescriptionIsValid\r\n || this.state.categoryTagLanguage === \"\"}\r\n onClick={this.onCreate}\r\n >\r\n Create\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n }\r\n\r\n private onCreate = () => {\r\n this.onClose();\r\n\r\n var visibleAudienceIds:string[] = [];\r\n var notifyAudienceIds:string[] = [];\r\n\r\n this.state.visibleAudiences.forEach(audience => {\r\n visibleAudienceIds.push(audience.id);\r\n })\r\n\r\n this.state.notifiedAudiences.forEach(audience => {\r\n notifyAudienceIds.push(audience.id);\r\n })\r\n\r\n var toUpload: CategoryTagModel = {\r\n title: this.state.categoryTagTitle,\r\n description: this.state.categoryTagDescription,\r\n language: this.state.categoryTagLanguage,\r\n enabled: this.state.categoryTagEnabled,\r\n readonly: false,\r\n defaultAudienceAccess: visibleAudienceIds,\r\n defaultAudienceNotified: notifyAudienceIds,\r\n id: \"\",\r\n }\r\n\r\n this.props.createCategoryTag(toUpload);\r\n }\r\n\r\n private onChangeAudiencesAccess = (audiences: Audience[]) => {\r\n this.setState({ visibleAudiences: audiences, showVisibleAudiencesList: false });\r\n\r\n if(audiences.length > 0) {\r\n this.setState({notifiedAudiences: this.state.notifiedAudiences.filter(n => audiences.includes(n))})\r\n }\r\n } \r\n\r\n private onChangeAudiencesNotify = (audiences: Audience[]) => {\r\n this.setState({ notifiedAudiences: audiences, showNotifyAudiencesList: false });\r\n } \r\n\r\n private onCopyAudiences = () => {\r\n this.setState({ notifiedAudiences: this.state.visibleAudiences})\r\n }\r\n\r\n private onChangeTitle = (event) => {\r\n const isInvalid = event.target.value.toLowerCase() === \"uncategorized\" || event.target.toString().length > 200;\r\n this.setState({ categoryTagTitle: event.target.value, categoryTagTitleIsValid: !isInvalid });\r\n }\r\n\r\n private onChangeDescription = (event) => {\r\n const isInvalid = event.target.toString().length > 200; \r\n this.setState({ categoryTagDescription: event.target.value, categoryTagDescriptionIsValid: !isInvalid });\r\n }\r\n\r\n private onClose = () => {\r\n this.props.hideNewCategoryTag();\r\n }\r\n\r\n private onRemoveAudienceAccess = (audience: Audience) => {\r\n this.onChangeAudiencesAccess(this.state.visibleAudiences.filter((selectedAudience) => selectedAudience.id !== audience.id));\r\n }\r\n\r\n private onRemoveAudienceNotify = (audience: Audience) => {\r\n this.onChangeAudiencesNotify(this.state.notifiedAudiences.filter((selectedAudience) => selectedAudience.id !== audience.id));\r\n }\r\n\r\n private onShowVisibleAudiencesList = () => {\r\n this.setState({ showVisibleAudiencesList: true });\r\n }\r\n\r\n private onShowNotifyAudiencesList = () => {\r\n this.setState({ showNotifyAudiencesList: true });\r\n }\r\n\r\n private onChangeLanguage = (e) => {\r\n this.setState({categoryTagLanguage: e.target.value})\r\n }\r\n\r\n private onChangeEnabled = (enabled: boolean) => {\r\n this.setState({categoryTagEnabled: enabled})\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {}\r\n\r\ninterface ComponentState {\r\n audiences: Audience[],\r\n visibleAudiences: Audience[],\r\n notifiedAudiences: Audience[],\r\n categoryTagTitle: string,\r\n categoryTagTitleIsValid: boolean,\r\n categoryTagDescription: string,\r\n categoryTagDescriptionIsValid: boolean,\r\n categoryTagLanguage: string,\r\n categoryTagEnabled: boolean,\r\n showAudiencesList: boolean,\r\n showVisibleAudiencesList: boolean,\r\n showNotifyAudiencesList: boolean\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n showNewCategoryTag: state.categoryTags.showNewCategoryTag,\r\n tenantId: state.tenant.id,\r\n lcidMappings: state.resources.lcidMappings,\r\n lcid: state.settings.tenantSettings.translatedContent,\r\n }),\r\n {\r\n createCategoryTag: actions.addNewTagAction,\r\n hideNewCategoryTag: actions.hideNewCategoryTag,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(NewCategoryTagDialog);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { CategoryTagModel } from \"modules/categorytags/models\";\r\n\r\nimport { Audience } from \"modules/audiences/models\";\r\n\r\nimport \"../../categoryTags.sass\"\r\nimport \"../../styles/dialogs.sass\"\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport Chip from \"@mui/material/Chip\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport FileCopyOutlinedIcon from \"@mui/icons-material/FileCopyOutlined\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport Select from \"@mui/material/Select\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Switch from \"@mui/material/Switch\";\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\n\r\nimport AudiencesDrawer from \"./audiencesDrawer\";\r\n\r\nclass EditCategoryTagDialog extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n audiences: [],\r\n visibleAudiences: [],\r\n notifiedAudiences: [],\r\n categoryTagTitle: \"\",\r\n categoryTagTitleIsValid: true,\r\n categoryTagDescription: \"\",\r\n categoryTagDescriptionIsValid: true,\r\n categoryTagLanguage: \"\",\r\n categoryTagEnabled: true,\r\n showAudiencesList: false,\r\n showNotifyAudiencesList: false,\r\n showVisibleAudiencesList: false,\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.editCategoryTag && !prevProps.editCategoryTag) {\r\n\r\n var accessAudiences = this.props.tagToEdit?.defaultAudienceAccess ?? [];\r\n var notifyAudiences = this.props.tagToEdit?.defaultAudienceNotified ?? [];\r\n\r\n var accessToSet = this.props.audiences.filter(a => accessAudiences.includes(a.id));\r\n var notifyToSet = this.props.audiences.filter(a => notifyAudiences.includes(a.id));\r\n\r\n this.setState({\r\n audiences: [],\r\n visibleAudiences: accessToSet,\r\n notifiedAudiences: notifyToSet,\r\n categoryTagTitle: this.props.tagToEdit?.title ?? \"\",\r\n categoryTagTitleIsValid: true,\r\n categoryTagDescription: this.props.tagToEdit?.description ?? \"\",\r\n categoryTagDescriptionIsValid: true,\r\n categoryTagLanguage: this.props.tagToEdit?.language ?? \"\",\r\n categoryTagEnabled: this.props.tagToEdit?.enabled ?? true,\r\n showNotifyAudiencesList: false,\r\n showVisibleAudiencesList: false,\r\n });\r\n }\r\n }\r\n\r\n \r\n public render() {\r\n const validLanguages = Object.keys(this.props.lcid);\r\n var languageOptions:string[] = [];\r\n validLanguages.forEach((lcid, index) => {\r\n var toAdd = this.props.lcidMappings[lcid].language\r\n languageOptions.push(toAdd);\r\n })\r\n\r\n return (\r\n <Dialog open={this.props.editCategoryTag} maxWidth={false} onClose={this.onClose}>\r\n <DialogTitle className=\"category-tags-dialog-header\">\r\n <div className=\"category-tags-dialog-header-title\">\r\n <Typography variant=\"h2\">Edit category tag</Typography>\r\n <IconButton onClick={this.onClose} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent className=\"category-tag-dialog-content\">\r\n <div className=\"category-tag-dialog-content-form\">\r\n <div>\r\n <div className=\"category-tag-prompt-left\">Category tag title</div>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.state.categoryTagTitle}\r\n autoComplete=\"off\"\r\n error={!this.state.categoryTagTitleIsValid}\r\n fullWidth\r\n inputProps={{\r\n maxLength: 25\r\n }}\r\n onChange={this.onChangeTitle}\r\n />\r\n </div>\r\n <div>\r\n <div className=\"category-tag-prompt-left\">Description</div>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.state.categoryTagDescription}\r\n autoComplete=\"off\"\r\n error={!this.state.categoryTagDescriptionIsValid}\r\n fullWidth\r\n onChange={this.onChangeDescription}\r\n />\r\n </div>\r\n { languageOptions.length > 1 &&\r\n <div>\r\n <div className=\"category-tag-prompt-left\">Language</div>\r\n <Select className=\"category-tag-language-select\"\r\n onChange={(e) => this.onChangeLanguage(e)}\r\n MenuProps={{\r\n anchorOrigin: {\r\n vertical: \"bottom\",\r\n horizontal: \"left\"\r\n },\r\n transformOrigin: {\r\n vertical: \"top\",\r\n horizontal: \"left\"\r\n },\r\n }}\r\n value={this.state.categoryTagLanguage}\r\n variant={\"outlined\"}\r\n >\r\n {languageOptions.map((l, index) => (\r\n <MenuItem key={index} value={l}>{l}</MenuItem>\r\n ))}\r\n </Select>\r\n </div>\r\n }\r\n <div>\r\n <div className=\"category-tag-prompt-left\">Enabled</div>\r\n <Switch\r\n checked={this.state.categoryTagEnabled}\r\n onClick={() => this.onChangeEnabled(!this.state.categoryTagEnabled)}\r\n color=\"primary\"\r\n className=\"category-tag-enable\"\r\n size=\"medium\"\r\n />\r\n </div>\r\n <div>\r\n <div className=\"audiences-list-label\">\r\n Default access audiences\r\n <InfoHover>Default audiences who can access contents that use this tag. These audiences can still be edited when creating new content.</InfoHover>\r\n </div>\r\n <div>\r\n {!!this.state.visibleAudiences.length &&\r\n <div className=\"audiences-list\">\r\n {this.state.visibleAudiences.map((audience) =>\r\n <Chip\r\n key={audience.id}\r\n label={audience.displayName}\r\n onDelete={() => this.onRemoveAudienceAccess(audience)}\r\n deleteIcon={<CloseIcon />}\r\n style={{position: 'relative', top: '12px'}}\r\n />\r\n )}\r\n </div>\r\n }\r\n { !this.state.visibleAudiences.length && \r\n <div className=\"audiences-list\">\r\n <Chip\r\n key={\"everyone-default-audience\"}\r\n label={<i>All users</i>}\r\n style={{position: 'relative', top: '12px', backgroundColor: \"#dde1e5\"}}\r\n disabled={true}\r\n />\r\n </div>\r\n }\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n startIcon={<AddIcon />}\r\n onClick={this.onShowVisibleAudiencesList}\r\n style={{position: 'relative', top: '6px'}}\r\n >\r\n Edit Audiences\r\n </Button>\r\n { <AudiencesDrawer show={this.state.showVisibleAudiencesList} selectedAudiences={this.state.visibleAudiences} onChange={this.onChangeAudiencesAccess} /> }\r\n </div>\r\n </div>\r\n <div>\r\n <div className=\"audiences-list-label\">Default notified audiences {<InfoHover>Default audiences who get notified when content is published with this tag. These audiences can still be edited when creating new content.</InfoHover>}</div>\r\n <div>\r\n {!!this.state.notifiedAudiences.length &&\r\n <div className=\"audiences-list\">\r\n {this.state.notifiedAudiences.map((audience) =>\r\n <Chip\r\n key={audience.id}\r\n label={audience.displayName}\r\n onDelete={() => this.onRemoveAudienceNotify(audience)}\r\n deleteIcon={<CloseIcon />}\r\n style={{position: 'relative', top: '12px'}}\r\n />\r\n )}\r\n </div>\r\n }\r\n <div>\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n startIcon={<AddIcon />}\r\n onClick={this.onShowNotifyAudiencesList}\r\n style={{position: 'relative', top: '10px'}}\r\n >\r\n Edit Audiences\r\n </Button>\r\n </div>\r\n\r\n <div>\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n startIcon={<FileCopyOutlinedIcon />}\r\n onClick={this.onCopyAudiences}\r\n style={{position: 'relative', top: '8px'}}\r\n disabled={this.state.visibleAudiences.length === 0}\r\n >\r\n Copy Access Audiences\r\n </Button>\r\n </div>\r\n { <AudiencesDrawer show={this.state.showNotifyAudiencesList} selectedAudiences={this.state.notifiedAudiences} onChange={this.onChangeAudiencesNotify} audiencesToCheck={this.state.visibleAudiences}/> }\r\n </div>\r\n </div>\r\n </div>\r\n </DialogContent>\r\n <DialogActions className=\"category-tags-dialog-footer\">\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onClose}>Cancel</Button>\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n disabled={!this.state.categoryTagTitle || !this.state.categoryTagTitleIsValid || !this.state.categoryTagDescription || !this.state.categoryTagDescriptionIsValid\r\n || this.state.categoryTagLanguage === \"\"}\r\n onClick={this.onEdit}\r\n >\r\n Save\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n }\r\n\r\n private onEdit = () => {\r\n this.onClose();\r\n\r\n var visibleAudienceIds:string[] = [];\r\n var notifyAudienceIds:string[] = [];\r\n\r\n this.state.visibleAudiences.forEach(audience => {\r\n visibleAudienceIds.push(audience.id);\r\n })\r\n\r\n this.state.notifiedAudiences.forEach(audience => {\r\n notifyAudienceIds.push(audience.id);\r\n })\r\n\r\n var toUpload: CategoryTagModel = {\r\n title: this.state.categoryTagTitle,\r\n description: this.state.categoryTagDescription,\r\n language: this.state.categoryTagLanguage,\r\n enabled: this.state.categoryTagEnabled,\r\n readonly: false,\r\n defaultAudienceAccess: visibleAudienceIds,\r\n defaultAudienceNotified: notifyAudienceIds,\r\n id: this.props.tagToEdit?.id ?? \"\"\r\n }\r\n\r\n this.props.saveCategoryTagEdit(toUpload);\r\n }\r\n\r\n private onChangeAudiencesAccess = (audiences: Audience[]) => {\r\n this.setState({ visibleAudiences: audiences, showVisibleAudiencesList: false });\r\n\r\n if(audiences.length > 0) {\r\n this.setState({notifiedAudiences: this.state.notifiedAudiences.filter(n => audiences.includes(n))})\r\n }\r\n } \r\n\r\n private onChangeAudiencesNotify = (audiences: Audience[]) => {\r\n this.setState({ notifiedAudiences: audiences, showNotifyAudiencesList: false });\r\n } \r\n\r\n private onCopyAudiences = () => {\r\n this.setState({ notifiedAudiences: this.state.visibleAudiences})\r\n }\r\n\r\n private onChangeTitle = (event) => {\r\n const isInvalid = event.target.value.toLowerCase() === \"uncategorized\" || event.target.toString().length > 200;\r\n this.setState({ categoryTagTitle: event.target.value, categoryTagTitleIsValid: !isInvalid });\r\n }\r\n\r\n private onChangeDescription = (event) => {\r\n const isInvalid = event.target.toString().length > 200; \r\n this.setState({ categoryTagDescription: event.target.value, categoryTagDescriptionIsValid: !isInvalid });\r\n }\r\n\r\n private onClose = () => {\r\n this.props.hideEditCategoryTag();\r\n }\r\n\r\n private onRemoveAudienceAccess = (audience: Audience) => {\r\n this.onChangeAudiencesAccess(this.state.visibleAudiences.filter((selectedAudience) => selectedAudience.id !== audience.id));\r\n }\r\n\r\n private onRemoveAudienceNotify = (audience: Audience) => {\r\n this.onChangeAudiencesNotify(this.state.notifiedAudiences.filter((selectedAudience) => selectedAudience.id !== audience.id));\r\n }\r\n\r\n private onShowVisibleAudiencesList = () => {\r\n this.setState({ showVisibleAudiencesList: true });\r\n }\r\n\r\n private onShowNotifyAudiencesList = () => {\r\n this.setState({ showNotifyAudiencesList: true });\r\n }\r\n\r\n private onChangeLanguage = (e) => {\r\n this.setState({categoryTagLanguage: e.target.value})\r\n }\r\n\r\n private onChangeEnabled = (enabled: boolean) => {\r\n this.setState({categoryTagEnabled: enabled})\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {}\r\n\r\ninterface ComponentState {\r\n audiences: Audience[],\r\n visibleAudiences: Audience[],\r\n notifiedAudiences: Audience[],\r\n categoryTagTitle: string,\r\n categoryTagTitleIsValid: boolean,\r\n categoryTagDescription: string,\r\n categoryTagDescriptionIsValid: boolean,\r\n categoryTagLanguage: string,\r\n categoryTagEnabled: boolean,\r\n showAudiencesList: boolean,\r\n showVisibleAudiencesList: boolean,\r\n showNotifyAudiencesList: boolean,\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n editCategoryTag: state.categoryTags.showEditCategoryTag,\r\n tenantId: state.tenant.id,\r\n lcidMappings: state.resources.lcidMappings,\r\n lcid: state.settings.tenantSettings.translatedContent,\r\n tagToEdit: state.categoryTags.editingTag,\r\n audiences: state.audiences.audiences\r\n }),\r\n {\r\n showEditCategoryTag: actions.showEditCategoryTag,\r\n saveCategoryTagEdit: actions.editTagAction,\r\n hideEditCategoryTag: actions.hideEditCategoryTag,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(EditCategoryTagDialog);","import React from 'react';\r\n\r\nimport Button from \"@mui/material/Button\";\r\n\r\nexport interface ToggleFilterOption {\r\n label: string;\r\n icon?: JSX.Element;\r\n iconOnly?: boolean;\r\n}\r\n\r\nconst ToggleFilter: React.FunctionComponent<ComponentProps> = (props) => {\r\n const lastIndex = props.filterOptions.length - 1;\r\n\r\n return (\r\n <>\r\n {\r\n props.filterOptions.map((option: ToggleFilterOption, index: number) =>\r\n <Button key={index}\r\n color=\"primary\"\r\n variant={ props.selectedIndex === index ? 'contained' : 'outlined'}\r\n size='small'\r\n onClick={() => props.setSelectedIndex(index)}\r\n style={{\r\n boxShadow: 'none',\r\n borderRadius: index === 0 ? '4px 0px 0px 4px' : index === lastIndex ? '0px 4px 4px 0px' : '0'\r\n }}\r\n >\r\n {option.icon && option.icon}\r\n {!option.iconOnly && option.label}\r\n </Button>\r\n )\r\n }\r\n </>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n filterOptions: ToggleFilterOption[];\r\n selectedIndex: number\r\n setSelectedIndex: (index: number) => void\r\n}\r\n\r\nexport default ToggleFilter;\r\n","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"../../../../globalApplicationState\";\r\n\r\nimport List from \"@mui/material/List\";\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport MoreOptionsButton from \"../../../../modules/common/components/buttons/moreOptionsButton\";\r\nimport { Divider } from \"@mui/material\";\r\nimport { CategoryTagDetails, CategoryTagsListItem } from \"modules/categorytags\";\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\n\r\nconst MoreOptions: React.FunctionComponent<PropsWithRedux> = props => {\r\n const getTagForDownload = async (toDownload: CategoryTagDetails) => {\r\n const file = {\r\n name: `${props.categoryTag.title}-${new Date().toISOString()}.csv`\r\n }\r\n props.downloadReport(toDownload)\r\n .then((data) => new FileDownloader(file).downloadBlob(data))\r\n }\r\n\r\n const onDeleteCategoryTag = async (id: string, name: string, ev) => {\r\n const confirmationMessage: string = \"Are you sure you want to delete \" + name + \"?\"\r\n if (await confirm.show({text: confirmationMessage, title: \"Delete Tag\"})) {\r\n props.deleteTag(id);\r\n //UNSELECT THE TAG JUST IN CASE HERE.\r\n props.closeDialog();\r\n }\r\n }\r\n\r\n return (\r\n <div style={{paddingTop: \"6px\", paddingRight: \"30px\"}}>\r\n <MoreOptionsButton text=\"Actions\">\r\n <List disablePadding>\r\n {props.categoryTag.title !== \"Uncategorized\" &&\r\n <MoreOptionsItem\r\n text=\"Edit tag details\"\r\n onClick={() => {\r\n props.closeDialog();\r\n props.setTagToEdit(props.categoryTag);\r\n props.editCategoryTag();\r\n }}\r\n />\r\n }\r\n <Divider light />\r\n {!props.categoryTag.enabled && props.categoryTag.title !== \"Uncategorized\" &&\r\n <MoreOptionsItem\r\n text=\"Enable\"\r\n onClick={() => {\r\n props.closeDialog();\r\n props.enableTag(props.categoryTag.id);\r\n }}\r\n />\r\n }\r\n {props.categoryTag.enabled && props.categoryTag.title !== \"Uncategorized\" &&\r\n <MoreOptionsItem\r\n text=\"Disable\"\r\n onClick={() => {\r\n props.closeDialog();\r\n props.disableTag(props.categoryTag.id);\r\n }}\r\n />\r\n }\r\n {props.categoryTag.title !== \"Uncategorized\" &&\r\n <MoreOptionsItem\r\n text=\"Delete\"\r\n onClick={(ev) => {\r\n onDeleteCategoryTag(props.categoryTag.id, props.categoryTag.title, ev);\r\n }}\r\n />\r\n }\r\n <Divider light />\r\n <MoreOptionsItem\r\n text=\"Download Tag Report\"\r\n onClick={() => {\r\n getTagForDownload(props.categoryTagAnalytics)\r\n }}\r\n />\r\n </List>\r\n </MoreOptionsButton>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n categoryTag: CategoryTagsListItem,\r\n categoryTagAnalytics: CategoryTagDetails,\r\n closeDialog: () => void\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n }),\r\n {\r\n downloadReport: actions.getCategoryTagDownloadFromAnalytics,\r\n deleteTag: actions.deleteCategoryTag,\r\n enableTag: actions.enableCategoryTag,\r\n disableTag: actions.disableCategoryTag,\r\n setTagToEdit: actions.setTagToEdit,\r\n editCategoryTag: actions.showEditCategoryTag\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(MoreOptions);","import * as React from 'react';\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"../../../../globalApplicationState\"\r\nimport { Dialog, DialogContent, DialogTitle, IconButton, Typography } from '@mui/material';\r\nimport { CategoryTagDetails } from '../../models';\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport UserInsightsBlockTiny from 'modules/users/components/userInsightsBlockTiny';\r\nimport ToggleFilter from 'modules/common/components/toggleFilter';\r\nimport PictureAsPdfIcon from '@mui/icons-material/PictureAsPdf';\r\n\r\nimport MoreOptions from \"./moreOptions\";\r\nimport Loading from 'modules/common/components/loading';\r\n\r\ninterface ComponentState {\r\n categoryTag: CategoryTagDetails;\r\n selectedFilter: number;\r\n}\r\n\r\nconst defaultTag = {\r\n id: \"\",\r\n title: \"Category Tag Details\",\r\n description: \"Category Tag Description\",\r\n accessAudience: [''],\r\n accessCount: 0,\r\n notifiedAudience: [''],\r\n notifyCount: 0,\r\n totalUsage: 0,\r\n usageRanking: 0,\r\n awareness: 0,\r\n analyticsAllTime: {\r\n surveyUsage: -1,\r\n documentUsage: -1,\r\n quickLinkUsage: -1,\r\n mediaFileUsage: -1\r\n },\r\n analyticsLast30: {\r\n surveyUsage: -1,\r\n documentUsage: -1,\r\n quickLinkUsage: -1,\r\n mediaFileUsage: -1\r\n }\r\n}\r\n\r\nconst defaultViewtag = {\r\n id: \"\",\r\n title: \"\",\r\n description: \"\",\r\n language: \"\",\r\n enabled: true,\r\n defaultAudienceAccess: [],\r\n defaultAudienceNotified: [],\r\n totalUsage: 0,\r\n usageRanking: 0,\r\n awareness: 0,\r\n createdDate: \"\",\r\n lastModifiedBy: {\r\n name: \"\",\r\n userId: \"\"\r\n }\r\n}\r\n\r\nconst filterOptions = [\"Since Created\", \"In The Last 30 Days\"]\r\n\r\nclass EditCategoryTagDialog extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n categoryTag: defaultTag,\r\n selectedFilter: 0\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.viewCategoryTag && !prevProps.viewCategoryTag) {\r\n this.loadData();\r\n }\r\n }\r\n\r\n\r\n public render() {\r\n const categoryTag = this.props.tagToView ?? defaultViewtag ;\r\n\r\n if(this.props.isLoadingDetails)\r\n {\r\n return(\r\n <Dialog open={true} maxWidth={false} onClose={this.onClose}>\r\n <Loading padding={12} />\r\n </Dialog>\r\n )\r\n }\r\n\r\n return (\r\n <Dialog open={this.props.viewCategoryTag} maxWidth={false} onClose={this.onClose}>\r\n <DialogTitle className=\"portal-pages-dialog-header\">\r\n <div className=\"portal-pages-dialog-header-title\">\r\n <Typography variant=\"h2\">{this.state.categoryTag.title}</Typography>\r\n <div style={{display: \"flex\", flexDirection: \"row\"}}>\r\n <MoreOptions categoryTag={categoryTag} categoryTagAnalytics={this.state.categoryTag} closeDialog={this.onClose} />\r\n <IconButton onClick={this.onClose} style={{float: \"right\"}} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent className=\"category-tag-dialog-content\" style={{paddingTop: \"10px\", paddingBottom: \"10px\"}}>\r\n <div className=\"category-tag-dialog-content-form\"></div>\r\n <div>\r\n <strong>Key Insights</strong>\r\n </div>\r\n <div className=\"category-tag-data-container\">\r\n <div className=\"category-tag-data-display\">\r\n <UserInsightsBlockTiny\r\n stats={this.state.categoryTag.totalUsage}\r\n title={\"Total uses\"}\r\n />\r\n </div>\r\n {/* Hiding for this release, can populate with data later.\r\n <div className=\"category-tag-data-display\">\r\n <UserInsightsBlockTiny\r\n stats={this.getNumberWithOrdinal(this.state.categoryTag.usageRanking)}\r\n title={\"Most used tag\"}\r\n />\r\n </div>\r\n <div className=\"category-tag-data-display\">\r\n <UserInsightsBlockTiny\r\n stats={this.state.categoryTag.totalUsage}\r\n title={\"Awareness\"}\r\n />\r\n </div>\r\n */}\r\n </div>\r\n <div style={{marginTop: '15px', marginBottom: '20px'}}>\r\n <strong>Uses per content type</strong>\r\n <div style={{float: \"right\"}}>\r\n <ToggleFilter\r\n filterOptions={filterOptions.map((label: string) => ({ label }))}\r\n selectedIndex={this.state.selectedFilter}\r\n setSelectedIndex={(e) => this.setSelectedfilter(e)}\r\n />\r\n </div>\r\n </div>\r\n <div className=\"category-tag-data-container\">\r\n {/* Add once the feature exists.\r\n <div className=\"category-tag-data-display\">\r\n <UserInsightsBlockTiny\r\n icon={<BarChartIcon fontSize={\"large\"} color={\"disabled\"} className=\"category-tag-icon-positioning\"/>}\r\n stats={this.state.selectedFilter === 0 ? this.state.categoryTag.analyticsAllTime.surveyUsage : this.state.categoryTag.analyticsLast30.surveyUsage }\r\n title={\"Surveys\"}\r\n />\r\n </div>\r\n */}\r\n <div className=\"category-tag-data-display\">\r\n <UserInsightsBlockTiny\r\n icon={<PictureAsPdfIcon fontSize={\"large\"} color={\"disabled\"} className=\"category-tag-icon-positioning\"/>}\r\n stats={this.state.selectedFilter === 0 ? this.state.categoryTag.analyticsAllTime.documentUsage : this.state.categoryTag.analyticsLast30.documentUsage }\r\n title={\"Documents\"}\r\n />\r\n </div>\r\n {/* Add once the feature exists.\r\n <div className=\"category-tag-data-display\">\r\n <UserInsightsBlockTiny\r\n icon={<LinkIcon fontSize={\"large\"} color={\"disabled\"} className=\"category-tag-icon-positioning\"/>}\r\n stats={this.state.selectedFilter === 0 ? this.state.categoryTag.analyticsAllTime.quickLinkUsage : this.state.categoryTag.analyticsLast30.quickLinkUsage }\r\n title={\"Quick Links\"}\r\n />\r\n </div>\r\n <div className=\"category-tag-data-display\">\r\n\r\n <UserInsightsBlockTiny\r\n icon={<ImageIcon fontSize={\"large\"} color={\"disabled\"} className=\"category-tag-icon-positioning\"/>}\r\n stats={this.state.selectedFilter === 0 ? this.state.categoryTag.analyticsAllTime.mediaFileUsage : this.state.categoryTag.analyticsLast30.mediaFileUsage }\r\n title={\"Media Files\"}\r\n />\r\n </div>\r\n */}\r\n </div>\r\n <hr color={\"#dde1e5\"}/>\r\n\r\n <div className=\"category-tag-text-display\">\r\n <span className=\"category-tag-text-title\">Description</span>\r\n <span className=\"category-tag-text-description\">{this.state.categoryTag.description}</span>\r\n </div>\r\n\r\n <div className=\"category-tag-text-display\">\r\n <span className=\"category-tag-text-title\">Total employees with access</span>\r\n <span className=\"category-tag-text-description\">{this.state.categoryTag.accessCount}</span>\r\n </div>\r\n\r\n <div className=\"category-tag-text-display\">\r\n <span className=\"category-tag-text-title\">Default access audiences</span>\r\n <span className=\"category-tag-text-description\">{this.state.categoryTag.accessAudience.map(a => a).join(\", \")}</span>\r\n </div>\r\n\r\n <div className=\"category-tag-text-display\">\r\n <span className=\"category-tag-text-title\">Total employees notified</span>\r\n <span className=\"category-tag-text-description\">{this.state.categoryTag.notifyCount}</span>\r\n </div>\r\n\r\n <div className=\"category-tag-text-display\">\r\n <span className=\"category-tag-text-title\">Default notified audiences</span>\r\n <span className=\"category-tag-text-description\">{this.state.categoryTag.notifiedAudience.map(a => a).join(\", \")}</span>\r\n </div>\r\n\r\n <div style={{height: \"15px\"}}/>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n }\r\n\r\n private onClose = () => {\r\n this.props.hideViewCategoryTag();\r\n }\r\n\r\n private getNumberWithOrdinal(number) {\r\n var ordinals = [\"th\", \"st\", \"nd\", \"rd\"],\r\n v = number % 100;\r\n return number + (ordinals[(v - 20) % 10] || ordinals[v] || ordinals[0]);\r\n }\r\n\r\n private setSelectedfilter(e) {\r\n this.setState({selectedFilter: e})\r\n }\r\n\r\n private async loadData() {\r\n var data = await this.props.loadTagDetails(this.props.tagToLoadId);\r\n\r\n if(data !== null)\r\n {\r\n var newCategoryTag = defaultTag;\r\n\r\n newCategoryTag.title = data[\"title\"] ?? \"\";\r\n newCategoryTag.description = data[\"description\"] ?? \"\";\r\n newCategoryTag.awareness = data[\"awareness\"] ?? 0;\r\n newCategoryTag.id = data[\"id\"] ?? \"\";\r\n newCategoryTag.awareness = data[\"awareness\"] ?? 0;\r\n newCategoryTag.totalUsage = data[\"totalUsage\"] ?? 0;\r\n newCategoryTag.usageRanking = data[\"usageRanking\"] ?? 0;\r\n newCategoryTag.notifiedAudience = data[\"notifiedAudience\"] ?? [];\r\n newCategoryTag.notifyCount = data[\"notifyCount\"] ?? 0;\r\n newCategoryTag.accessAudience = data[\"accessAudience\"] ?? [];\r\n newCategoryTag.accessCount = data[\"accessCount\"] ?? 0;\r\n newCategoryTag.analyticsAllTime = data[\"analyticsAllTime\"] ?? defaultTag.analyticsAllTime;\r\n newCategoryTag.analyticsLast30 = data[\"analyticsLast30\"] ?? defaultTag.analyticsLast30;\r\n\r\n if(newCategoryTag.notifiedAudience.length === 0)\r\n {\r\n newCategoryTag.notifiedAudience = [\"None(0)\"];\r\n }\r\n\r\n this.setState({categoryTag: newCategoryTag});\r\n }\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\nconst connector = connect(\r\n(state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n viewCategoryTag: state.categoryTags.showViewCategoryTag,\r\n tagToLoadId: state.categoryTags.tagToViewId,\r\n tagToView: state.categoryTags.tagToView,\r\n isLoadingDetails: state.categoryTags.isLoadingDetails\r\n}),\r\n{\r\n hideViewCategoryTag: actions.hideViewCategoryTag,\r\n loadTagDetails: actions.loadCategoryTagAnalytics,\r\n}\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(EditCategoryTagDialog);\r\n","import * as React from \"react\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as actions from \"../actionCreator\";\r\nimport * as audiencesActions from \"modules/audiences/actionCreator\";\r\n\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport CategoryTagsListing from \"../components/category-tags-listing/categoryTagsListing\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Header from \"pages/common/header\";\r\nimport MainContent from \"pages/common/mainContent\";\r\nimport DownloadReports from \"../components/action-buttons/downloadReports\";\r\nimport NewCategoryTag from \"../components/action-buttons/newCategoryTag\";\r\nimport NewCategoryTagDialog from \"../components/dialogs/newCategoryTagDialog\";\r\nimport EditCategoryTagDialog from \"../components/dialogs/editCategoryTagDialog\";\r\nimport ViewCategoryTagDialog from \"../components/dialogs/viewCategoryTagDialog\";\r\n\r\nclass CategoryTagsManagementPage extends React.Component<PropsWithRedux, {}> {\r\n public componentDidMount() {\r\n if (!this.props.audiences.length)\r\n this.props.getAudiences();\r\n }\r\n\r\n public render() {\r\n return (\r\n <BasePage fullWidth>\r\n <Header\r\n title=\"Manage Category Tags\"\r\n rightComponent={\r\n <React.Fragment>\r\n <DownloadReports />\r\n <NewCategoryTag />\r\n </React.Fragment>\r\n }\r\n />\r\n <MainContent>\r\n <CategoryTagsListing />\r\n <NewCategoryTagDialog />\r\n <EditCategoryTagDialog />\r\n <ViewCategoryTagDialog />\r\n <ErrorSnackbar errorMessage={this.props.errorMessage} clearErrorMessage={this.props.clearErrorMessage} />\r\n <LoadingOverlay absolute={true} show={this.props.isDeleting || this.props.isFetching || this.props.isSaving} />\r\n </MainContent>\r\n </BasePage>\r\n );\r\n }\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences,\r\n errorMessage: state.categoryTags.errorMessage,\r\n isDeleting: state.categoryTags.isDeleting,\r\n isFetching: state.categoryTags.isFetching,\r\n isSaving: state.categoryTags.isSaving\r\n }),\r\n {\r\n clearErrorMessage: actions.clearErrorMessage,\r\n getAudiences: audiencesActions.getAudiences\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(CategoryTagsManagementPage);","import * as React from \"react\";\r\nimport { push } from 'react-router-redux';\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\n\r\nimport ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos';\r\nimport Button from \"@mui/material/Button\";\r\n\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\n\r\nimport './backToButton.sass'\r\n\r\nconst BackToButton: React.FunctionComponent<PropsWithRedux> = (props) => {\r\n\r\n const handleClick = () => {\r\n props.redirectTo('/' + props.tenant + '/' + props.to)\r\n }\r\n\r\n return(\r\n <div className='back-to-wrapper'>\r\n\r\n <Button color=\"primary\" onClick={handleClick} classes={{ root: 'back-to'}}>\r\n <ArrowBackIosIcon />\r\n {'Back to ' + props.locationTitle}\r\n </Button>\r\n </div>\r\n ) \r\n\r\n}\r\n\r\ninterface ComponentProps {\r\n locationTitle: string\r\n to: string\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenant: state.tenant.id,\r\n }),\r\n {\r\n redirectTo: push,\r\n }\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(BackToButton);","import * as React from 'react';\r\n\r\nexport default class ProgressiveImage extends React.Component<ComponentProps, {}> {\r\n\r\n private _imageReady: boolean = false;\r\n private _mounted: boolean = false;\r\n\r\n public render() {\r\n\r\n let previewStyles = {\r\n 'background': 'url(' + this.props.previewSrc + ') center center no-repeat',\r\n 'backgroundSize': 'cover'\r\n }\r\n\r\n return (\r\n <div className=\"progressive-image-visible-container\" style={{position: 'relative'}}>\r\n <div className=\"progressive-image-placeholder\" style={previewStyles}></div>\r\n { !!this._imageReady && <img className=\"progressive-image\" alt={\"Progressive\"} { ...{ src: this.props.src!, ...this.props.imageProps } } /> }\r\n </div>\r\n );\r\n }\r\n\r\n public componentDidMount() {\r\n this.setup(this.props.src);\r\n }\r\n\r\n public componentWillUpdate(nextProps){\r\n if(nextProps.src !== this.props.src){\r\n this._mounted = false;\r\n this._imageReady = false;\r\n this.setup(nextProps.src)\r\n }\r\n }\r\n\r\n private setup(imgSrc: string){\r\n this._mounted = true;\r\n let that = this;\r\n let img = new Image();\r\n img.src = imgSrc;\r\n img.onload = (e: any) => {\r\n that.imageReady(e);\r\n this.notifyImageLoaded(img);\r\n }\r\n }\r\n\r\n public componentWillUnmount() {\r\n this._mounted = false;\r\n }\r\n\r\n private imageReady = (e: any) => {\r\n this._imageReady = true;\r\n if (this._mounted) {\r\n this.forceUpdate();\r\n }\r\n }\r\n\r\n private notifyImageLoaded = (img: HTMLImageElement) => {\r\n if (this.props.onImageLoaded) {\r\n this.props.onImageLoaded(img)\r\n }\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n src: string,\r\n previewSrc?: string,\r\n imageProps?: React.ImgHTMLAttributes<HTMLImageElement>,\r\n onImageLoaded?: (image: HTMLImageElement) => void\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { injectIntl, IntlShape } from \"react-intl\";\r\n\r\nimport { PostOverview } from \"modules/posts/models\";\r\nimport ProgressiveImage from \"modules/common/components/progressiveImage\";\r\nimport CanvasPreviewImage from \"modules/common/components/canvasPreviewImage\";\r\n\r\nimport { Box, Button, Grid, Typography } from \"@mui/material\";\r\n\r\nimport \"./contentOverview.sass\";\r\nimport ChipList from \"modules/common/components/chipList\";\r\n\r\nimport LockIcon from \"@mui/icons-material/Lock\";\r\nimport { dateOptions } from \"utils/dateFormatting\";\r\nimport moment from \"moment\";\r\nimport { MultiSelectTopic } from \"modules/settings\";\r\n\r\n// TODO: relocate file if component extended to more than posts\r\n// TODO: add react-intl where neceessary here post fix\r\n\r\nconst ContentOverviewSideBar: React.FunctionComponent<ComponentProps> = (props) => {\r\n const [showMore, setShowMore] = useState(false);\r\n const imgSrc = props.postDetails.imageUrl || null;\r\n\r\n let infoHeadings = [\r\n props.intl.formatMessage({ id: \"posts.published\", defaultMessage: \"Published on\" }),\r\n props.intl.formatMessage({ id: \"posts.lastModified\", defaultMessage: \"Last modified on\" }),\r\n props.intl.formatMessage({ id: \"common.type\", defaultMessage: \"Type\" }),\r\n props.intl.formatMessage({ id: \"posts.state\", defaultMessage: \"State\" }),\r\n ];\r\n\r\n let authorHeadings = [\r\n props.intl.formatMessage({ id: \"posts.publishedBy\", defaultMessage: \"Published by\" }),\r\n props.intl.formatMessage({ id: \"posts.author\", defaultMessage: \"Author\" }),\r\n ];\r\n\r\n let postInfo = [\r\n props.postDetails.datePublished\r\n ? moment(props.postDetails.datePublished).locale(\"en\").format(dateOptions.basicWithHoursWithSpacing)\r\n : \"\",\r\n props.postDetails.updatedTime\r\n ? moment(props.postDetails.updatedTime).locale(\"en\").format(dateOptions.basicWithHoursWithSpacing)\r\n : \"\",\r\n capitalizePostType(),\r\n props.postDetails.state,\r\n ];\r\n\r\n let authorInfo = [\r\n props.postDetails.lastPublishedByName, \r\n props.postDetails && props.postDetails.author ? props.postDetails.author.name : \"\",\r\n ];\r\n\r\n if (props.postDetails.bannersSet === \"\") {\r\n let removeIndex = infoHeadings.findIndex((h) => h === \"Set as\");\r\n infoHeadings = infoHeadings.filter((h, index) => index !== removeIndex);\r\n postInfo = postInfo.filter((h, index) => index !== removeIndex);\r\n }\r\n\r\n function getNotifications() {\r\n let notificationsReturn = props.postDetails.notifications\r\n ? (props.postDetails.notifications.teamsOnPublish !== \"none\" ? \"MS Teams, \" : \"\") +\r\n (props.postDetails.notifications.mobileOnPublish !== \"none\" ? \"Mobile App, \" : \"\") +\r\n (props.postDetails.notifications.emailOnPublish !== \"none\" ? \"Email, \" : \"\") +\r\n (props.postDetails.notifications.smsOnPublish !== \"none\" ? \"SMS\" : \"\")\r\n : \"\";\r\n\r\n //Checks if there is a comma and a whitespace\r\n if (notificationsReturn && notificationsReturn.slice(-2) === \", \") {\r\n return notificationsReturn.substring(0, notificationsReturn.length - 2);\r\n } else if (notificationsReturn !== \"\") {\r\n return notificationsReturn;\r\n } else {\r\n return \"None\";\r\n }\r\n }\r\n\r\n function capitalizePostType() {\r\n return props.postDetails.postType.charAt(0).toUpperCase() + props.postDetails.postType.slice(1);\r\n }\r\n\r\n return (\r\n <div className=\"content-overview\">\r\n <div className=\"side-bar\">\r\n {!imgSrc ? null : !props.postDetails.cropPoints ? (\r\n <ProgressiveImage src={imgSrc} previewSrc={imgSrc} />\r\n ) : (\r\n <CanvasPreviewImage src={imgSrc} cropPoints={props.postDetails.cropPoints} />\r\n )}\r\n <div className=\"info-wrapper\">\r\n <div className=\"heading\">{props.intl.formatMessage({ id: \"common.title\", defaultMessage: \"Title\" })}</div>\r\n <div className=\"post-title\">{props.postDetails.translatedContent[props.defaultLCID][\"title\"]}</div>\r\n {props.postDetails.tags.length > 0 ? (\r\n <ChipList\r\n onClose={() => {}}\r\n truncateAtIndex={3}\r\n items={props.postDetails.tags.map((opt: MultiSelectTopic) => ({\r\n id: opt.id,\r\n name: opt.name,\r\n icon: opt.restricted ? (\r\n <LockIcon\r\n style={{ fontSize: \"16px\", color: \"#B72026\", position: \"relative\", top: \"2px\", marginLeft: \"4px\" }}\r\n />\r\n ) : undefined,\r\n }))}\r\n />\r\n ) : null}\r\n </div>\r\n <hr />\r\n <div className=\"info-wrapper\">\r\n {authorHeadings.map((item, index) => {\r\n return (\r\n <Grid key={index} container spacing={0}>\r\n <Grid item xs={5}>\r\n <Box sx={{ fontWeight: \"bold\", m: 0.5, fontSize: \"14px\" }}>{item}</Box>\r\n </Grid>\r\n <Grid item xs={7}>\r\n <Box sx={{ fontWeight: \"bold\", m: 0.5, fontSize: \"14px\" }}>{authorInfo[index]}</Box>\r\n </Grid>\r\n </Grid>\r\n );\r\n })}\r\n </div>\r\n <hr />\r\n <div className=\"info-wrapper\">\r\n {infoHeadings.map((item, index) => {\r\n return (\r\n <Grid key={index} container spacing={0}>\r\n <Grid item xs={5}>\r\n <Box sx={{ fontWeight: \"bold\", m: 0.5, fontSize: \"14px\" }}>{item}</Box>\r\n </Grid>\r\n <Grid item xs={7}>\r\n <Box sx={{ fontWeight: \"bold\", m: 0.5, fontSize: \"14px\" }}>{postInfo[index]}</Box>\r\n </Grid>\r\n </Grid>\r\n );\r\n })}\r\n </div>\r\n {showMore && (\r\n <div>\r\n <hr />\r\n <div className=\"item\" style={{ paddingBottom: \"4%\" }}>\r\n <Typography variant=\"caption\" fontSize={\"12px\"}>\r\n {props.intl.formatMessage({\r\n id: \"posts.notificationsUponPublishing\",\r\n defaultMessage: \"Notifications upon publishing\",\r\n })}\r\n </Typography>\r\n </div>\r\n\r\n <Grid container spacing={0}>\r\n <Grid item xs={5}>\r\n <Box sx={{ fontWeight: \"bold\", m: 0.5, fontSize: \"14px\" }}>\r\n {\" \"}\r\n {props.intl.formatMessage({ id: \"posts.notificationsLastSent\", defaultMessage: \"Last sent on\" })}\r\n </Box>\r\n </Grid>\r\n <Grid item xs={7}>\r\n <Box sx={{ fontWeight: \"bold\", m: 0.5, fontSize: \"14px\" }}>\r\n {props.postDetails.datePublished\r\n ? moment(props.postDetails.datePublished).locale(\"en\").format(dateOptions.basicFormatting)\r\n : \"\"}\r\n </Box>\r\n </Grid>\r\n </Grid>\r\n\r\n <Grid container spacing={1}>\r\n <Grid item xs={5}></Grid>\r\n <Grid item xs={6}>\r\n <Typography variant=\"caption\" fontSize=\"14px\">\r\n {getNotifications()}\r\n </Typography>\r\n </Grid>\r\n <Grid item xs={1}></Grid>\r\n </Grid>\r\n </div>\r\n )}\r\n <Box textAlign=\"center\">\r\n <Button variant=\"text\" style={{ backgroundColor: \"transparent\", paddingTop: '8%' }} onClick={() => setShowMore(!showMore)}>\r\n {showMore ? \"SEE LESS\" : \"SEE MORE\"}\r\n </Button>\r\n </Box>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\ninterface ComponentProps {\r\n postDetails: PostOverview;\r\n defaultLCID: string;\r\n intl: IntlShape;\r\n}\r\n\r\nexport default injectIntl(ContentOverviewSideBar);\r\n","import React, { useState } from 'react';\r\n\r\nimport { ApiRequest } from 'api/network';\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport LoadingSpinner from '../loadingSpinner';\r\nimport { FileDownloader } from 'utils/fileDownloader';\r\n\r\nconst DownloadButtonv2: React.FunctionComponent<ComponentProps> = (props) => {\r\n\r\n const [isLoading, setIsLoading] = useState(false)\r\n\r\n const onClick = (e) => {\r\n e.stopPropagation();\r\n setIsLoading(true)\r\n const file = {\r\n name: `${props.downloadName}-${new Date().toLocaleString().replaceAll(/, | /g, \"/\")}.csv`\r\n };\r\n props.onClick()\r\n .then(data => new FileDownloader(file).downloadBlob(data))\r\n .then(_ => setIsLoading(false))\r\n .catch(_ => setIsLoading(false));\r\n }\r\n\r\n return(\r\n <Button {...props.styles} onClick={(e) => onClick(e)}>\r\n {props.text}\r\n { isLoading ? \r\n <span style={{paddingLeft: '3px', paddingTop: \"2px\"}}>\r\n <LoadingSpinner size={'14px'} /> \r\n </span>\r\n : null\r\n }\r\n </Button>\r\n )\r\n} \r\n\r\nexport default DownloadButtonv2;\r\n\r\ninterface ComponentProps {\r\n onClick: () => ApiRequest\r\n text: any\r\n downloadName: string\r\n styles: { //for material UI component \r\n size: any\r\n variant?: any\r\n color: any\r\n disableElevation: boolean\r\n startIcon?: any\r\n }\r\n}","/**\r\n * A fallback mapper from the old sentiment score we used to the new label system described here:\r\n * https://help.readable.com/en/article/tone-sentiment-personalism-and-reach-xc2eog/\r\n *\r\n * This works by normalizing the score to a 0-100 range and then mapping to the new labels\r\n * @param score - sentiment score\r\n * @param minVal - min score\r\n * @param maxVal - max score\r\n * @param minLabel - min label\r\n * @param maxLabel - max label\r\n * @param reverse - controls whether low score should be at right end of indicator or not\r\n */\r\nexport const fallbackSentimentLabel = (score: number, minVal: number, maxVal: number, minLabel: string, maxLabel: string, reverse: boolean) => {\r\n let normalizedScore = ((score - minVal) * 100) / (maxVal - minVal);\r\n let leftLabel = reverse ? maxLabel : minLabel;\r\n let rightLabel = reverse ? minLabel : maxLabel;\r\n\r\n if (normalizedScore <= 19) {\r\n return leftLabel;\r\n } else if (normalizedScore <= 39) {\r\n return \"Neutral (Slightly \" + leftLabel + \")\";\r\n } else if (normalizedScore <= 59) {\r\n return \"Neutral\";\r\n } else if (normalizedScore <= 79) {\r\n return \"Neutral (Slightly \" + rightLabel + \")\";\r\n } else {\r\n return rightLabel;\r\n }\r\n}\r\n","import { PostAnalysisScores, PostAverages } from 'modules/posts/models';\r\nimport React from 'react';\r\nimport {injectIntl, IntlShape } from \"react-intl\";\r\n\r\nimport '../styles/basic-insights.sass'\r\nimport '../styles/graphs.sass'\r\n\r\nimport { IIndicatorDetail } from 'modules/common/components/authoring/models';\r\nimport IndicatorWrapper from 'modules/insights/components/indicatorWrapper';\r\nimport { fallbackSentimentLabel } from 'utils/readableLabelMapper';\r\n\r\nconst ReadingComprehensionAnalysis: React.FunctionComponent<ComponentProps> = (props) => {\r\n\r\n const renderTimeString = (value: string): string => {\r\n if (props.timeSpentReading) {\r\n let values = value.split(\":\")\r\n let minutes = parseInt(values[0])\r\n let seconds = parseInt(values[1])\r\n return `${minutes}m ${seconds}s`;\r\n }\r\n return ''\r\n }\r\n\r\n //https://readable.com/readability/flesch-reading-ease-flesch-kincaid-grade-level/\r\n const readabilityIndicator:IIndicatorDetail = {\r\n minScore: 1,\r\n maxScore: 100,\r\n minLabel: \"Very difficult to read\",\r\n maxLabel: \"Very easy to read\",\r\n score: Math.max(parseInt(props.postAnalysis.readabilityScore), 1),\r\n recommendedScore: props.isUsingTenantAverages ? Math.max(props.tenantAverages.averageReadabilityScore, 1) : Math.max(props.globalAverages.averageReadabilityScore, 1),\r\n scoreLabel: props.postAnalysis.readabilityText\r\n }\r\n\r\n const toneIndicator:IIndicatorDetail = {\r\n minScore: 0,\r\n maxScore: 100,\r\n minLabel: \"Formal\",\r\n maxLabel: \"Conversational\",\r\n score: props.postAnalysis.toneNumber,\r\n recommendedScore: props.isUsingTenantAverages ? props.tenantAverages.averageTone : props.globalAverages.averageTone,\r\n scoreLabel: props.postAnalysis.tone\r\n }\r\n\r\n //Newer property, use neutral value if score doesn't exist.\r\n const personalismIndicator: IIndicatorDetail = {\r\n minScore: 0,\r\n maxScore: 100,\r\n minLabel: \"Impersonal\",\r\n maxLabel: \"Personal\",\r\n score: props.postAnalysis.personalism ?? 50,\r\n recommendedScore: props.isUsingTenantAverages ? props.tenantAverages.averagePersonalism : props.globalAverages.averagePersonalism,\r\n scoreLabel: props.postAnalysis.personal\r\n }\r\n\r\n const sentimentIndicator: IIndicatorDetail = {\r\n minScore: 0,\r\n maxScore: 1,\r\n minLabel: \"Negative\",\r\n maxLabel: \"Positive\",\r\n score: props.postAnalysis.sentimentScore,\r\n recommendedScore: props.isUsingTenantAverages ? (props.tenantAverages.averageSentiment / 100) : (props.globalAverages.averageSentiment / 100),\r\n scoreLabel: props.postAnalysis.sentiment ?? fallbackSentimentLabel(props.postAnalysis.sentimentScore, 0, 1, \"Negative\", \"Positive\", false) //Fallback for posts older than around 6 months old.\r\n }\r\n\r\n return (\r\n <div style={{ marginTop: '10px'}}>\r\n <div>\r\n <span className='metric-title'>\r\n Reach & Readability\r\n </span>\r\n <div className='reading-analysis' style={{display: \"flex\", flexWrap: \"wrap\"}}>\r\n <div style={{width: \"46%\", paddingRight: \"3%\"}}>\r\n <IndicatorWrapper\r\n title='Readability'\r\n indicator={readabilityIndicator}\r\n reverse={true}\r\n useGlobalIcon={!props.isUsingTenantAverages}\r\n />\r\n </div>\r\n <div style={{width: \"46%\", paddingLeft: \"3%\"}}>\r\n <IndicatorWrapper\r\n title='Sentiment'\r\n indicator={sentimentIndicator}\r\n reverse={false}\r\n useGlobalIcon={!props.isUsingTenantAverages}\r\n />\r\n </div>\r\n <div style={{width: \"46%\", paddingRight: \"3%\"}}>\r\n <IndicatorWrapper\r\n title='Tone'\r\n indicator={toneIndicator}\r\n reverse={true}\r\n useGlobalIcon={!props.isUsingTenantAverages}\r\n />\r\n </div>\r\n <div style={{width: \"46%\", paddingLeft: \"3%\"}}>\r\n <IndicatorWrapper\r\n title='Personalism'\r\n indicator={personalismIndicator}\r\n reverse={false}\r\n useGlobalIcon={!props.isUsingTenantAverages}\r\n />\r\n </div>\r\n <div style={{width: \"46%\", paddingRight: \"3%\"}}>\r\n <span className='metric-title'>\r\n Text & Words\r\n </span>\r\n <div style={{paddingTop: \"52px\"}}>\r\n <span>Estimated reading time</span>\r\n <span style={{float: \"right\", paddingRight: \"24px\"}}>{renderTimeString(props.postAnalysis.readingTime)}</span>\r\n </div>\r\n <div style={{paddingTop: \"4px\"}}>\r\n <span>Actual average reading time</span>\r\n <span style={{float: \"right\", paddingRight: \"24px\"}}>{renderTimeString(props.timeSpentReading)}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\ninterface ComponentProps {\r\n intl: IntlShape;\r\n postAnalysis: PostAnalysisScores;\r\n timeSpentReading: string;\r\n isUsingTenantAverages: boolean;\r\n tenantAverages: PostAverages;\r\n globalAverages: PostAverages\r\n}\r\n\r\nexport default injectIntl(ReadingComprehensionAnalysis)\r\n","import React from 'react';\r\nimport AutoSizer from \"react-virtualized-auto-sizer\";\r\n\r\nimport { Pie } from '@nivo/pie';\r\n// import { useMediaQuery } from '@mui/material';\r\n\r\nimport '../styles/basic-insights.sass'\r\nimport '../styles/graphs.sass'\r\n\r\n// TODO: add react-intl where neceessary here post fix\r\n\r\nconst BreakdownChart: React.FunctionComponent<ComponentProps> = (props) => {\r\n\r\n // const matchesXLarge = useMediaQuery('(max-width:2500px)');\r\n\r\n const getLeftMargin = (legend: boolean = false): number => {\r\n let margin = 100\r\n // if (matchesXLarge)\r\n // margin = 100\r\n\r\n if (legend)\r\n margin = margin * -1\r\n\r\n return margin\r\n }\r\n\r\n // const getReScale = (): number => {\r\n // if (matchesXLarge)\r\n // return 1.1\r\n // return 1\r\n // }\r\n\r\n return (\r\n <div className='nivo-wrapper' > \r\n {\r\n props.totalSubscribers || props.totalUniqueViews || props.totalViews ?\r\n <div className='metric-title'>\r\n {props.totalSubscribers ? `Total Subscribers: ${props.totalSubscribers}` :\r\n props.totalUniqueViews ? `Total Unique Views: ${props.totalUniqueViews}` :\r\n `Total Views: ${props.totalViews}`}\r\n </div>\r\n : null\r\n }\r\n <AutoSizer>\r\n {({ height, width }) => (\r\n <Pie \r\n height={height}\r\n width={width}\r\n data={props.chartData}\r\n colors={{scheme: 'red_yellow_blue'}}\r\n innerRadius={props.innerRadius}\r\n padAngle={1}\r\n enableArcLabels={false}\r\n enableArcLinkLabels={false}\r\n margin={{ top: 40, right: 20, bottom: 15, left: getLeftMargin()}}\r\n activeOuterRadiusOffset={15} \r\n legends={[\r\n {\r\n anchor: 'top-left',\r\n direction: 'column',\r\n justify: false,\r\n itemHeight: 20,\r\n translateX: getLeftMargin(true),\r\n itemWidth: 75,\r\n itemsSpacing: 10,\r\n symbolSize: 20,\r\n textColor: '#333333',\r\n itemTextColor: '#333333',\r\n \r\n }\r\n ]}\r\n />\r\n )}\r\n </AutoSizer>\r\n </div>\r\n )\r\n\r\n}\r\n\r\ninterface ComponentProps {\r\n chartData: {id: string, value: number, label: string }[]\r\n totalSubscribers?: number\r\n totalUniqueViews?: number\r\n totalViews?: number\r\n innerRadius: number\r\n}\r\n\r\nexport default BreakdownChart;\r\n","import React, { useState } from 'react';\r\nimport AutoSizer from \"react-virtualized-auto-sizer\";\r\n\r\nimport { Pie } from '@nivo/pie';\r\nimport { useMediaQuery } from '@mui/material';\r\n\r\nimport ToggleFilter from 'modules/common/components/toggleFilter';\r\n\r\nimport '../styles/graphs.sass'\r\n\r\n// TODO: add react-intl where neceessary here post fix\r\n\r\nconst PostInsightsCharts: React.FunctionComponent<ComponentProps> = (props) => {\r\n\r\n const [selectedFilterIndex, setSelectedFilterIndex] = useState(0);\r\n\r\n const filterOptions = [\"All Time\", \"First 7 Days\", \"First 30 Days\"]\r\n\r\n const readTypeChartData = props.readTypeData.filter(d => d.interval === filterOptions[selectedFilterIndex])\r\n .map(d => {\r\n return { id: d.label, value: d.value, label: `${d.label}: ${d.value}` }\r\n })\r\n\r\n const engagementChartData = props.engagementData.filter(d => d.interval === filterOptions[selectedFilterIndex])\r\n .map(d => {\r\n return { id: d.label, value: d.value, label: `${d.label}: ${d.value}` }\r\n })\r\n\r\n const options = { year: 'numeric', month: 'short', day: 'numeric' };\r\n const firstPublished = new Date(props.firstPublishDate).toLocaleDateString(undefined, options as any)\r\n\r\n const matchesMed = useMediaQuery('(max-width:1200px)');\r\n const matchesSmall = useMediaQuery('(max-width:1024px)');\r\n const matchesXSmall = useMediaQuery('(max-width:900px)');\r\n\r\n const renderPie = (data): JSX.Element => {\r\n return (\r\n <AutoSizer>\r\n {({ height, width }) => (\r\n <Pie\r\n height={height}\r\n width={width}\r\n data={data}\r\n colors={{ scheme: 'red_yellow_blue' }}\r\n innerRadius={0.7}\r\n padAngle={1}\r\n enableArcLabels={false}\r\n enableArcLinkLabels={false}\r\n margin={{ top: props.compliancePost ? 20 : 40, right: 20, bottom: 15, left: 195 }}\r\n\r\n activeOuterRadiusOffset={15}\r\n legends={[\r\n {\r\n anchor: 'top-left',\r\n direction: 'column',\r\n justify: false,\r\n itemHeight: 20,\r\n translateX: -195,\r\n itemWidth: 75,\r\n itemsSpacing: 10,\r\n symbolSize: 20,\r\n textColor: '#333333',\r\n itemTextColor: '#333333',\r\n\r\n }\r\n ]}\r\n />\r\n )}\r\n </AutoSizer>\r\n )\r\n }\r\n\r\n const switchToColumn = (matchesMed && !matchesSmall) || matchesXSmall;\r\n\r\n return (\r\n <div style={{ position: 'relative' }}>\r\n <div className='post-insights-header' style={{ flexDirection: switchToColumn ? 'column' : 'row' }}>\r\n <div>\r\n First Published:\r\n <span className='date'>\r\n {firstPublished}\r\n </span>\r\n </div>\r\n <div style={{ marginTop: switchToColumn ? '15px' : '' }}>\r\n <ToggleFilter filterOptions={filterOptions.map((label: string) => ({ label }))}\r\n selectedIndex={selectedFilterIndex}\r\n setSelectedIndex={setSelectedFilterIndex}\r\n />\r\n </div>\r\n </div>\r\n <div className='pie-wrapper' style={{ flexDirection: switchToColumn ? 'column' : 'row' }}>\r\n <div className='nivo-wrapper' style={{ width: switchToColumn || props.compliancePost ? '100%' : '50%' }}>\r\n <div className='metric-title'>\r\n {`Total Views: ${props.totalViews}`}\r\n </div>\r\n {renderPie(readTypeChartData)}\r\n </div>\r\n {\r\n !props.compliancePost ?\r\n <div className='nivo-wrapper' style={{ width: switchToColumn ? '100%' : '50%' }}>\r\n <div className='metric-title'>\r\n {`Interactions: ${props.totalEngagement}`}\r\n </div>\r\n {\r\n props.disclaimer && <div className='graphs-disclaimer'>{props.disclaimer}</div>\r\n }\r\n {renderPie(engagementChartData)}\r\n </div>\r\n : null\r\n }\r\n\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\ninterface ComponentProps {\r\n readTypeData: { value: number, interval: string, label: string }[]\r\n engagementData: { value: number, interval: string, label: string }[]\r\n totalEngagement: number\r\n totalViews: number\r\n firstPublishDate: Date\r\n compliancePost?: boolean\r\n disclaimer?: string | null\r\n}\r\n\r\nexport default PostInsightsCharts;\r\n","import React, { useState } from 'react';\r\n\r\nimport { injectIntl, IntlShape } from \"react-intl\";\r\n\r\nimport { PostOverview } from '../../../models';\r\nimport CanvasPreviewImage from 'modules/common/components/canvasPreviewImage';\r\nimport ProgressiveImage from '../../../../common/components/progressiveImage';\r\n\r\nimport { Box, Button, Card, CardActions, CardContent, Collapse, Grid, IconButton, Typography } from '@mui/material';\r\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\r\nimport ExpandLessIcon from '@mui/icons-material/ExpandLess';\r\n\r\nimport './contentOverview.sass'\r\nimport moment from 'moment';\r\nimport { dateOptions } from 'utils/dateFormatting';\r\n\r\nimport ChipList from 'modules/common/components/chipList';\r\nimport LockIcon from \"@mui/icons-material/Lock\";\r\nimport { MultiSelectTopic } from 'modules/settings';\r\n\r\nconst ContentOverviewCard: React.FunctionComponent<ComponentProps> = (props) => { \r\n const [showMore, setShowMore] = useState(false);\r\n const [expanded, setExpanded] = useState(false)\r\n\r\n const imgSrc = props.postDetails.imageUrl || null;\r\n let infoHeadings = [\r\n props.intl.formatMessage({ id: \"posts.published\", defaultMessage: \"Published on\" }),\r\n props.intl.formatMessage({ id: \"posts.lastModified\", defaultMessage: \"Last modified on\" }),\r\n props.intl.formatMessage({ id: \"common.type\", defaultMessage: \"Type\" }),\r\n props.intl.formatMessage({ id: \"posts.state\", defaultMessage: \"State\" }),\r\n ];\r\n\r\n let authorHeadings = [\r\n props.intl.formatMessage({ id: \"posts.publishedBy\", defaultMessage: \"Published by\" }),\r\n props.intl.formatMessage({ id: \"posts.author\", defaultMessage: \"Author\" }),\r\n ];\r\n\r\n let postInfo = [\r\n props.postDetails.datePublished ? moment(props.postDetails.datePublished).locale(\"en\").format(dateOptions.basicWithHoursWithSpacing) : \"\",\r\n props.postDetails.updatedTime ? moment(props.postDetails.updatedTime).locale(\"en\").format(dateOptions.basicWithHoursWithSpacing) : \"\",\r\n capitalizePostType(),\r\n props.postDetails.state,\r\n ];\r\n\r\n let authorInfo = [\r\n props.postDetails.lastPublishedByName,\r\n props.postDetails && props.postDetails.author ? props.postDetails.author.name : \"\",\r\n ];\r\n\r\n if (props.postDetails.bannersSet === \"\") {\r\n let removeIndex = infoHeadings.findIndex(h => h === \"Set as\");\r\n infoHeadings = infoHeadings.filter((h, index) => index !== removeIndex)\r\n postInfo = postInfo.filter((h, index) => index !== removeIndex)\r\n }\r\n\r\n function getNotifications() {\r\n let notificationsReturn = props.postDetails.notifications\r\n ? (props.postDetails.notifications.teamsOnPublish !== \"none\" ? \"MS Teams, \" : \"\") +\r\n (props.postDetails.notifications.mobileOnPublish !== \"none\" ? \"Mobile App, \" : \"\") +\r\n (props.postDetails.notifications.emailOnPublish !== \"none\" ? \"Email, \" : \"\") +\r\n (props.postDetails.notifications.smsOnPublish !== \"none\" ? \"SMS\" : \"\")\r\n : \"\";\r\n\r\n //Checks if there is a comma and a whitespace\r\n if (notificationsReturn && notificationsReturn.slice(-2) === \", \") {\r\n return notificationsReturn.substring(0, notificationsReturn.length - 2);\r\n } else if(notificationsReturn !== \"\"){\r\n return notificationsReturn;\r\n } else {\r\n return \"None\";\r\n }\r\n }\r\n\r\n function capitalizePostType() {\r\n return props.postDetails.postType.charAt(0).toUpperCase() + props.postDetails.postType.slice(1);\r\n }\r\n\r\n return (\r\n <div className=\"content-overview\">\r\n <Card classes={{ root: \"top-card\" }}>\r\n <div className=\"card-content-wrapper\">\r\n <CardContent style={{ padding: \"0\" }}>\r\n <div className=\"card-header\">\r\n <div style={{ maxWidth: \"200px\" }}>\r\n {!imgSrc ? null : !props.postDetails.cropPoints ? (\r\n <ProgressiveImage src={imgSrc} previewSrc={imgSrc} />\r\n ) : (\r\n <CanvasPreviewImage src={imgSrc} cropPoints={props.postDetails.cropPoints} />\r\n )}\r\n </div>\r\n <div className=\"info-wrapper card\">\r\n <div className=\"heading\">{props.intl.formatMessage({ id: \"common.title\", defaultMessage: \"Title\" })}</div>\r\n <div className=\"post-title\">{props.postDetails.translatedContent[props.defaultLCID][\"title\"]}</div>\r\n {props.postDetails.tags.length > 0 ? (\r\n <ChipList\r\n onClose={() => {}}\r\n truncateAtIndex={3}\r\n items={props.postDetails.tags.map((opt: MultiSelectTopic) => ({\r\n id: opt.id,\r\n name: opt.name,\r\n icon: opt.restricted ? (\r\n <LockIcon\r\n style={{\r\n fontSize: \"16px\",\r\n color: \"#B72026\",\r\n position: \"relative\",\r\n top: \"2px\",\r\n marginLeft: \"4px\",\r\n }}\r\n />\r\n ) : undefined,\r\n }))}\r\n />\r\n ) : null}\r\n </div>\r\n </div>\r\n </CardContent>\r\n <CardActions>\r\n <IconButton onClick={() => setExpanded(!expanded)} size=\"large\">\r\n {expanded ? <ExpandLessIcon /> : <ExpandMoreIcon />}\r\n </IconButton>\r\n </CardActions>\r\n </div>\r\n <hr />\r\n <Collapse in={expanded} unmountOnExit>\r\n <CardContent style={{ padding: \"0\" }}>\r\n <div className=\"info-wrapper\">\r\n {authorHeadings.map((item, index) => {\r\n return (\r\n <Grid key={index} container spacing={0}>\r\n <Grid item xs={5}>\r\n <Box sx={{ fontWeight: \"bold\", m: 0.5, fontSize: \"14px\" }}>{item}</Box>\r\n </Grid>\r\n <Grid item xs={7}>\r\n <Box sx={{ fontWeight: \"bold\", m: 0.5, fontSize: \"14px\" }}>{authorInfo[index]}</Box>\r\n </Grid>\r\n </Grid>\r\n );\r\n })}\r\n </div>\r\n <hr />\r\n <div className=\"info-wrapper\">\r\n {infoHeadings.map((item, index) => {\r\n return (\r\n <Grid key={index} container spacing={0}>\r\n <Grid item xs={5}>\r\n <Box sx={{ fontWeight: \"bold\", m: 0.5, fontSize: \"14px\" }}>{item}</Box>\r\n </Grid>\r\n <Grid item xs={7}>\r\n <Box sx={{ fontWeight: \"bold\", m: 0.5, fontSize: \"14px\" }}>{postInfo[index]}</Box>\r\n </Grid>\r\n </Grid>\r\n );\r\n })}\r\n </div>\r\n {showMore && (\r\n <>\r\n <hr />\r\n <div className=\"item\" style={{ paddingBottom: \"4%\" }}>\r\n <Typography variant=\"caption\" fontSize={\"12px\"}>\r\n {props.intl.formatMessage({\r\n id: \"posts.notificationsUponPublishing\",\r\n defaultMessage: \"Notifications upon publishing\",\r\n })}\r\n </Typography>\r\n </div>\r\n\r\n <Grid container spacing={0}>\r\n <Grid item xs={5}>\r\n <Box sx={{ fontWeight: \"bold\", m: 0.5, fontSize: \"14px\" }}>\r\n {\" \"}\r\n {props.intl.formatMessage({\r\n id: \"posts.notificationsLastSent\",\r\n defaultMessage: \"Last sent on\",\r\n })}\r\n </Box>\r\n </Grid>\r\n <Grid item xs={7}>\r\n <Box sx={{ fontWeight: \"bold\", m: 0.5, fontSize: \"14px\" }}>\r\n {props.postDetails.datePublished\r\n ? moment(props.postDetails.datePublished).locale(\"en\").format(dateOptions.basicFormatting)\r\n : \"\"}\r\n </Box>\r\n </Grid>\r\n </Grid>\r\n\r\n <Grid container spacing={1}>\r\n <Grid item xs={5}></Grid>\r\n <Grid item xs={6}>\r\n <Typography variant=\"caption\" fontSize=\"14px\">\r\n {getNotifications()}\r\n </Typography>\r\n </Grid>\r\n <Grid item xs={1}></Grid>\r\n </Grid>\r\n </>\r\n )}\r\n <Box textAlign=\"center\">\r\n <Button variant=\"text\" style={{ backgroundColor: \"transparent\", paddingTop: '8%' }} onClick={() => setShowMore(!showMore)}>\r\n {showMore ? \"SEE LESS\" : \"SEE MORE\"}\r\n </Button>\r\n </Box>\r\n </CardContent>\r\n </Collapse>\r\n </Card>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n postDetails: PostOverview\r\n defaultLCID: string\r\n intl: IntlShape\r\n}\r\n\r\nexport default injectIntl(ContentOverviewCard);","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { ActivityInsightsDetails } from \"modules/posts/models\";\r\n\r\nimport WarningIcon from \"@mui/icons-material/Warning\";\r\n\r\nimport \"../styles/basic-insights.sass\"\r\nimport \"../styles/graphs.sass\"\r\n\r\n// TODO: add react-intl where neceessary here post fix\r\n\r\nconst ActivityInsights: React.FunctionComponent<PropsWithRedux> = (props) => {\r\n\r\n const options = { year: \"numeric\", month: \"short\", day: \"numeric\" };\r\n\r\n const renderCommentContent = (comment: any, index: number): JSX.Element => {\r\n return(\r\n <div key={index} className=\"comment-wrapper\">\r\n <div className=\"author-avatar\" style={{ backgroundColor: `${comment.avatarColor}` }}>\r\n {comment.firstName ? comment.firstName[0] : comment.commentAuthor ? comment.commentAuthor[0] : \"\"}\r\n </div>\r\n <div style={{flexGrow: 1}}>\r\n <div className=\"header\">\r\n <div className=\"comment-contents\">\r\n <span className=\"name-label\">{comment.firstName !== undefined ? `${comment.firstName} ${comment.lastName}` : comment.commentAuthor}</span>\r\n <span className=\"date-label\">{new Date(comment.createdTime?.toString()).toLocaleDateString(undefined, options as any)}</span>\r\n </div>\r\n {comment.upvoteCount !== undefined ?\r\n comment.upvoteCount > 0 &&\r\n <span className=\"data-label\">{`${comment.upvoteCount} like${comment.upvoteCount > 1 ? \"s\": \"\"}`}</span>\r\n : <span className=\"data-label\">{`${comment.totalFlagActions} flag${comment.totalFlagActions > 1 ? \"s\": \"\"}`}</span>\r\n }\r\n </div> \r\n <div className=\"body\">\r\n {comment.commentBody}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n const calculatePercent = (firstVal: number, secondVal: number) => {\r\n let result = (firstVal/secondVal)*100;\r\n if (result < 0.5) {\r\n return Math.ceil(result)\r\n }\r\n return Math.round(result)\r\n }\r\n\r\n const availableReactions = props.reactions.filter(r => r.enabled \r\n || (props.activityInsights?.reactionCounts != null && props.activityInsights.reactionCounts.find(c => c.reactionId === r.id) != null));\r\n const uniqueViewersWhoReacted = calculatePercent(props.activityInsights?.totalUniqueReactors,props.totalUniqueOpens)\r\n const uniqueViewersWhoCommented = calculatePercent(props.activityInsights?.totalUniqueCommentors,props.totalUniqueOpens)\r\n\r\n\r\n return(\r\n <React.Fragment>\r\n {\r\n (!props.showComments || !props.showReactions) &&\r\n <div className=\"graphs-disclaimer\">{`*${props.showComments ? \"\" : \"Comments\"}${!props.showComments && !props.showReactions ? \" and \" : \"\"}${props.showReactions? \"\" : \"Reactions\"} were disabled`}</div>\r\n }\r\n {\r\n props.showReactions &&\r\n <div className=\"activity-insights-wrapper\">\r\n <div className=\"metric-title\">\r\n {`Reactions: ${props.activityInsights?.totalReactions}`}\r\n </div>\r\n <div className=\"activity-insights-row\">\r\n <div className=\"number-wrapper activity-widget\">\r\n <div className=\"number\">\r\n {`${uniqueViewersWhoReacted !== Infinity && isNaN(uniqueViewersWhoReacted) === false ? uniqueViewersWhoReacted : 0}%`}\r\n </div>\r\n <span className=\"title\">\r\n of unique viewers reacted\r\n </span>\r\n <span className=\"description\">\r\n {`${props.activityInsights?.totalUniqueReactors ?? 0} of ${props.totalUniqueOpens}`}\r\n </span>\r\n </div> \r\n <div className=\"stats-row\" style={{justifyContent: \"normal\", flexGrow: 1, marginLeft: \"10px\"}}>\r\n {\r\n availableReactions.map(r => {\r\n var count: null | number = null;\r\n if (props.activityInsights?.reactionCounts.length > 0) {\r\n count = props.activityInsights?.reactionCounts.find(rc => rc.reactionId === r.id)?.count!\r\n }\r\n return (\r\n <div key={r.sentiment}>\r\n <div className=\"number-wrapper reaction-widget\">\r\n <img src={`/images/reactions/${r.sentiment}_reaction.png`}\r\n alt={r.sentiment}\r\n style={{ height: \"32px\", maxWidth: \"40px\" }} />\r\n <div className=\"title\" style={{width: \"18px\"}}>\r\n {count ? count : 0}\r\n </div> \r\n </div>\r\n <div className=\"number-wrapper percent\">\r\n <span className=\"title\">\r\n {`${ count && count > 0 ? (count/(props.activityInsights?.totalReactions ?? 0) * 100).toFixed(1) : 0}%`}\r\n </span>\r\n </div>\r\n </div>\r\n )\r\n })\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n {\r\n props.showComments &&\r\n <div className=\"activity-insights-wrapper\">\r\n <div className=\"metric-title\">\r\n {`Comments: ${props.totalComments}`}\r\n </div>\r\n <div className=\"activity-insights-row\">\r\n <div className=\"number-wrapper activity-widget\" style={{marginBottom: 0}}>\r\n <div className=\"number\">\r\n {`${uniqueViewersWhoCommented !== Infinity && isNaN(uniqueViewersWhoCommented) === false ? uniqueViewersWhoCommented : 0}%`}\r\n </div>\r\n <span className=\"title\">\r\n of unique viewers left a comment\r\n </span>\r\n <span className=\"description\">\r\n {`${props.activityInsights?.totalUniqueCommentors} of ${props.totalUniqueOpens}`}\r\n </span>\r\n </div> \r\n <div className=\"comment-content\">\r\n {\r\n props.activityInsights?.topComments.length > 0 &&\r\n <span className=\"comment-heading\">Top Comments</span>\r\n }\r\n {/* take top 3 comments */}\r\n {props.activityInsights?.topComments.slice(0, 5).map((c, index) => renderCommentContent(c, index))}\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n {\r\n <div className=\"activity-insights-wrapper\">\r\n <div className=\"metric-title\" style={{display: \"flex\"}}>\r\n {`Flagged Items: ${props.activityInsights?.totalFlaggedItems}`}\r\n {\r\n props.activityInsights?.totalFlaggedItems > 0 &&\r\n <span style={{marginLeft: \"10px\"}}>\r\n <WarningIcon style={{ color: \"#b72026\"}}/>\r\n </span>\r\n }\r\n </div>\r\n <div className=\"activity-insights-row\">\r\n <div className=\"number-wrapper activity-widget\" style={{marginBottom: 0}}> \r\n <div className=\"number\">\r\n {props.activityInsights?.totalFlaggedItems}\r\n </div>\r\n <span className=\"title\">\r\n total flags found\r\n </span>\r\n </div> \r\n <div className=\"comment-content\">\r\n {\r\n props.activityInsights?.totalFlaggedItems > 0 &&\r\n <span className=\"comment-heading\">Flagged Items</span>\r\n }\r\n {props.activityInsights?.flaggedItems.map((c, index) => renderCommentContent(c, index))}\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </React.Fragment>\r\n )\r\n}\r\n\r\ninterface ComponentProps {\r\n totalReactions: number\r\n totalComments: number\r\n activityInsights: ActivityInsightsDetails\r\n showComments: boolean\r\n showReactions: boolean\r\n totalUniqueOpens: number\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n reactions: state.settings.tenantSettings.reactions\r\n })\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(ActivityInsights);","import { Button, Divider, Drawer } from '@mui/material';\r\nimport * as React from 'react';\r\n\r\nimport ArrowBackIcon from \"@mui/icons-material/ArrowBack\";\r\nimport ContentAnalysesSimple from 'modules/insights/components/contentAnalysesSimple';\r\nimport { PostAnalysisScores, PostAverages } from 'modules/posts/models';\r\nimport useAccordion from 'modules/common/hooks/useAccordion';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\n\r\nconst useStyles = makeStyles({\r\n paper: {\r\n width: 500\r\n }\r\n});\r\n\r\nconst AnalyticsDrawer: React.FunctionComponent<ComponentProps> = (props) => {\r\n const classes = useStyles();\r\n const { accordionOpenStates, onChangeAccordionOpen, expandAllLabel, onExpandOrCollapseAll } = useAccordion(3);\r\n\r\n return (\r\n <Drawer open={props.isOpen} anchor='right' classes={{ paper: classes.paper }} onClose={props.closeDrawer}>\r\n <div style={{ padding: 20, paddingBottom: \"0px\" }}>\r\n <div style={{display: \"flex\", flexDirection: \"row\"}}>\r\n <ArrowBackIcon className=\"close-modal-icon\" style={{position: \"relative\", top: \"4px\"}} onClick={props.closeDrawer} />\r\n <h4 style={{paddingLeft: \"14px\"}}>Content Analysis</h4>\r\n </div>\r\n </div>\r\n\r\n <Divider />\r\n <div style={{display: \"flex\", flexDirection: \"column\", flex: 1, overflowY: \"hidden\"}}>\r\n <div style={{ margin: 20, marginBottom: 0, flex: 1, overflowY: \"hidden\"}}>\r\n {props.tenantAverages && props.globalAverages && props.postAnalysis &&\r\n <ContentAnalysesSimple\r\n fetching={false}\r\n contentAnalyses={props.postAnalysis}\r\n tenantAverages={props.tenantAverages}\r\n globalAverages={props.globalAverages}\r\n isUsingTenantAverages={props.isUsingTenantAverages}\r\n setIsUsingTenantAverages={props.setIsUsingTenantAverages}\r\n accordionStates={accordionOpenStates}\r\n onChangeAccordion={onChangeAccordionOpen}\r\n />\r\n }\r\n </div>\r\n\r\n <div style={{marginTop: \"0\", paddingBottom: \"20px\"}}>\r\n <Divider />\r\n <Button variant=\"text\" color=\"primary\" style={{float: \"right\", position: \"relative\", top: \"6px\", marginRight: \"12px\"}} onClick={onExpandOrCollapseAll}>\r\n {expandAllLabel}\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n </Drawer>\r\n )\r\n}\r\n\r\ninterface ComponentProps {\r\n isOpen: boolean;\r\n closeDrawer: () => void;\r\n postAnalysis: PostAnalysisScores;\r\n tenantAverages: PostAverages;\r\n globalAverages: PostAverages;\r\n isUsingTenantAverages: boolean;\r\n setIsUsingTenantAverages: (toSet: boolean) => void;\r\n}\r\n\r\nexport default(AnalyticsDrawer)\r\n","import React, { useCallback, useEffect, useState, createRef, useRef } from 'react';\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport { withRouter, RouteComponentProps } from \"react-router\";\r\nimport { IntlShape, injectIntl } from \"react-intl\";\r\nimport { push } from 'react-router-redux';\r\nimport moment from 'moment';\r\n\r\nimport { insightsApi, postsApi, reportsApi } from 'api/instances';\r\nimport {\r\n ActivityInsightsDetails,\r\n defaultPostAnalysisScores,\r\n defaultPostOverview,\r\n DetailedPostInsights,\r\n ImageScale,\r\n POST_TYPES,\r\n PostAnalysisScores,\r\n PostInsightBreakdowns,\r\n PostOverview,\r\n PostAverages\r\n} from 'modules/posts/models';\r\nimport confirm from 'utils/notyPopups';\r\nimport * as actions from 'modules/posts/actionCreator';\r\n\r\nimport BackToButton from 'modules/common/components/buttons/backToButton';\r\nimport ContentOverviewSideBar from './components/contentOverviewSideBar';\r\nimport DownloadButtonv2 from 'modules/common/components/buttons/downloadButtonv2';\r\nimport WindowResizeListener from 'modules/common/components/window-resize-listener';\r\nimport LoadingOverlay from 'modules/common/components/loadingOverlay';\r\nimport ReadingComprehensionAnalysis from './components/readingComprehensionAnalysis';\r\nimport Loading from 'modules/common/components/loading';\r\nimport BreakdownChart from './components/breakdownChart';\r\nimport PostInsightsCharts from './components/postInsightsCharts';\r\nimport ContentOverviewCard from './components/contentOverviewCard';\r\nimport ActivityInsights from './components/activityInsights';\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Breadcrumb from \"pages/common/breadcrumb\";\r\n\r\nimport ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos';\r\nimport ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown';\r\nimport ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'\r\nimport Button from \"@mui/material/Button\";\r\nimport DeleteIcon from '@mui/icons-material/Delete';\r\nimport EditIcon from '@mui/icons-material/Edit';\r\nimport ExitToAppIcon from '@mui/icons-material/ExitToApp';\r\nimport GetAppIcon from '@mui/icons-material/GetApp';\r\nimport HelpOutlineIcon from '@mui/icons-material/HelpOutline';\r\nimport VisibilityIcon from '@mui/icons-material/Visibility';\r\nimport WarningIcon from '@mui/icons-material/Warning';\r\nimport useMediaQuery from '@mui/material/useMediaQuery';\r\nimport WhereToVoteIcon from '@mui/icons-material/WhereToVote';\r\nimport PublicIcon from '@mui/icons-material/Public';\r\nimport {\r\n ButtonGroup,\r\n ClickAwayListener,\r\n List,\r\n ListItem,\r\n ListItemText,\r\n Popover,\r\n Tooltip,\r\n} from '@mui/material';\r\n\r\nimport withStyles from '@mui/styles/withStyles';\r\nimport './postInsights.sass'\r\nimport './styles/basic-insights.sass'\r\nimport MoreOptionsButton from 'modules/common/components/buttons/moreOptionsButton';\r\nimport HoverText from 'modules/documents/components/action-buttons/hoverText';\r\nimport Preview, { PreviewType } from 'modules/common/components/authoring/dialogs/preview';\r\nimport { openPostInPortal } from 'utils/redirectUtils';\r\nimport PostContentView from '../post-view/postContentView';\r\nimport { ReportTypes } from 'modules/reports/models';\r\nimport SnackbarWrapper from 'modules/common/components/snackbars/snackbarWrapper';\r\nimport cookie from 'utils/cookie';\r\nimport AnalyticsDrawer from './components/analyticsDrawer';\r\nimport { QUERY_PARAM_KEYS } from 'modules/common/hooks/useQueryParams';\r\n\r\nconst SIDE_BAR_MENU_WIDTH = 225\r\nconst SIDE_BAR_CONTENT_WIDTH = 315\r\nconst SCORE_ICON_SRC: string = \"/images/icons/change_history.svg\";\r\nconst SYNC_ARROWS_SRC: string = \"/images/icons/sync_arrows.svg\";\r\n// const INSIGHTS_START_DATE = new Date('June 1, 2021')\r\n\r\n// TODO: add react-intl where neceessary here post fix\r\n// TODO: break this up into re-usable components\r\nconst PostInsights: React.FunctionComponent<PropsWithRedux> = (props) => {\r\n const setTenantAveragesSetting = (toSet: boolean) => {\r\n setIsUsingTenantAverages(toSet);\r\n cookie.setTenantAveragesSetting(toSet);\r\n }\r\n\r\n const matchesXLarge = useMediaQuery('(min-width:1850px)')\r\n const matchesLarge = useMediaQuery('(max-width:1610px)')\r\n const matchesMed = useMediaQuery('(max-width:1024px)')\r\n\r\n const keyInsightsRef = useRef<HTMLDivElement>(null)\r\n const postInsightsRef = useRef<HTMLDivElement>(null)\r\n const channelBreakdownRef = useRef<HTMLDivElement>(null)\r\n const languageBreakdownRef = useRef<HTMLDivElement>(null)\r\n const readingCompRef = useRef<HTMLDivElement>(null)\r\n const complianceBreakdownRef = useRef<HTMLDivElement>(null)\r\n const activityRef = useRef<HTMLDivElement>(null)\r\n\r\n const [isLoadingPost, setIsLoadingPost] = useState(false)\r\n const [postDetails, setPostDetails] = useState<PostOverview>({\r\n ...defaultPostOverview,\r\n id: props.match.params.postId\r\n })\r\n const [isLoadingAnalysis, setIsLoadingAnalysis] = useState(false)\r\n const [postAnalysis, setPostAnalysis] = useState<PostAnalysisScores>(defaultPostAnalysisScores)\r\n const [postAnalysisReportReady, setPostAnalysisReportReady] = useState(true)\r\n\r\n const [isLoadingDetailedInsights, setIsLoadingDetailedInsights] = useState(false)\r\n const [detailedInsights, setDetailedInsights] = useState<DetailedPostInsights>()\r\n\r\n const [isLoadingInsightBreakdowns, setIsLoadingInsightBreakdowns] = useState(false)\r\n const [insightBreakdowns, setInsightBreakdowns] = useState<PostInsightBreakdowns>({ channelBreakdown: [], languageBreakdown: [], reportIsReady: true })\r\n\r\n const [isLoadingActivityInsights, setIsLoadingActivityInsights] = useState(false)\r\n const [activityInsights, setActivityInsights] = useState<ActivityInsightsDetails>()\r\n\r\n const [isLoadingTenantAverages, setIsLoadingTenantAverages] = useState(false);\r\n const [tenantPostAverages, setTenantPostAverages] = useState<PostAverages>()\r\n\r\n const [isLoadingGlobalAverages, setIsLoadingGlobalAverages] = useState(false);\r\n const [globalPostAverages, setGlobalPostAverages] = useState<PostAverages>()\r\n\r\n const [isUsingTenantAverages, setIsUsingTenantAverages] = useState(cookie.getTenantAveragesSetting()); //use this to toggle between global and tenant scores\r\n\r\n const [windowWidth, setWindowWidth] = useState(window.innerWidth - SIDE_BAR_MENU_WIDTH - SIDE_BAR_CONTENT_WIDTH)\r\n const [navWidth, setNavWidth] = useState(0)\r\n const [navPage, setNavPage] = useState(0)\r\n\r\n const [showPreview, setShowPreview] = useState(false)\r\n const [showActionCommandList, setShowActionCommandList] = useState(false)\r\n\r\n const [successMessage, setSuccessMessage] = useState(\"\");\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n\r\n const [showPopover, setShowPopover] = useState(false);\r\n const [showDrawer, setShowDrawer] = useState(false);\r\n\r\n const [allPageNum, setAllPageNum] = useState(\"1\");\r\n const [pubPageNum, setPubPageNum] = useState(\"1\");\r\n const [schPageNum, setSchPageNum] = useState(\"1\");\r\n const [dftPageNum, setDftPageNum] = useState(\"1\");\r\n const [tabNum, setTabNum] = useState(\"0\");\r\n\r\n const popoverRef = useRef(null);\r\n\r\n // hide open in portal if post has not been published yet\r\n const hideOpenInPortalPreviewAction = !postDetails.datePublished || moment(postDetails.datePublished).isAfter(moment());\r\n\r\n const [navButtons, setNavButtons] = useState([{ title: 'key insights', ref: createRef<any>(), scrollTo: keyInsightsRef },\r\n { title: 'post insights', ref: createRef<any>(), scrollTo: postInsightsRef },\r\n { title: 'channel breakdown', ref: createRef<any>(), scrollTo: channelBreakdownRef },\r\n { title: 'reading & comprehension', ref: createRef<any>(), scrollTo: readingCompRef },\r\n { title: 'language breakdown', ref: createRef<any>(), scrollTo: languageBreakdownRef },\r\n { title: 'compliance', ref: createRef<any>(), scrollTo: complianceBreakdownRef },\r\n { title: 'activity', ref: createRef<any>(), scrollTo: activityRef }])\r\n\r\n const [showPostEditedWarning, setShowPostEditedWaring] = useState(false)\r\n\r\n const determinePostState = (expired: boolean, publishTime: Date): string => {\r\n let now = moment()\r\n if (expired) {\r\n return \"Expired\"\r\n }\r\n else if (moment(publishTime) <= now) {\r\n return \"Published\"\r\n }\r\n else if (moment(publishTime) > now) {\r\n return \"Scheduled\"\r\n }\r\n return \"\"\r\n }\r\n\r\n const determinePostBannersSet = (featured: boolean, breaking: boolean): string => {\r\n if (featured && breaking) {\r\n return \"Featured & Breaking\"\r\n }\r\n else if (featured) {\r\n return \"Featured\"\r\n }\r\n else if (breaking) {\r\n return \"Breaking\"\r\n }\r\n return \"\"\r\n }\r\n\r\n const determineScrollWidths = useCallback(() => {\r\n let totalWidth = 0\r\n navButtons.forEach(item => {\r\n totalWidth += (item.ref.current?.offsetWidth + 5 || 0)\r\n })\r\n setNavWidth(totalWidth)\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n const fetchDetailedPostInsights = useCallback((fetchCompliance: boolean) => {\r\n setIsLoadingDetailedInsights(true)\r\n insightsApi.GetDetailedPostInsights(props.match.params.postId, fetchCompliance)\r\n .then(result => {\r\n setDetailedInsights({\r\n ...result,\r\n firstPublishedDate: new Date(result.firstPublishedDate.toString())\r\n })\r\n setIsLoadingDetailedInsights(false)\r\n })\r\n .catch(error => setIsLoadingDetailedInsights(false))\r\n }, [props.match.params.postId]);\r\n\r\n const fetchPostActivityInsights = useCallback((fetchComments: boolean, fetchReactions: boolean) => {\r\n setIsLoadingActivityInsights(true)\r\n insightsApi.GetPostActivityInsights(props.match.params.postId, fetchComments, fetchReactions)\r\n .then(result => {\r\n setActivityInsights(result)\r\n setIsLoadingActivityInsights(false)\r\n })\r\n .catch(error => setIsLoadingActivityInsights(false))\r\n }, [props.match.params.postId]);\r\n\r\n const fetchPostDetails = useCallback(() => {\r\n setIsLoadingPost(true)\r\n\r\n postsApi.GetPostOverview(props.match.params.postId, ImageScale.Modal)\r\n .then(post => {\r\n setPostDetails({\r\n ...post,\r\n state: determinePostState(post.isExpired, new Date(post.datePublished)),\r\n bannersSet: determinePostBannersSet(post.isFeatured, post.isBreaking)\r\n })\r\n setIsLoadingPost(false)\r\n fetchDetailedPostInsights(post.postType === 'compliance')\r\n fetchPostActivityInsights(post.commentingEnabled, post.reactingEnabled)\r\n\r\n let updatedNavButtons = navButtons;\r\n if (post.postType !== 'compliance') {\r\n updatedNavButtons = updatedNavButtons.filter(item => item.title !== 'compliance')\r\n setNavButtons(updatedNavButtons)\r\n }\r\n else {\r\n updatedNavButtons = updatedNavButtons.filter(item => item.title !== 'activity')\r\n setNavButtons(updatedNavButtons)\r\n }\r\n\r\n });\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [fetchDetailedPostInsights, fetchPostActivityInsights, props.match.params.postId]);\r\n\r\n const scrollToView = (ref: React.RefObject<HTMLDivElement> | null) => {\r\n if (ref) {\r\n ref.current?.scrollIntoView({ block: 'center', behavior: 'smooth' })\r\n }\r\n }\r\n\r\n const fetchPostAnalysis = useCallback(() => {\r\n setIsLoadingAnalysis(true)\r\n postsApi.GetFirstPublishedPostAnalysisScores(props.match.params.postId)\r\n .then(result => {\r\n setPostAnalysis(result.postAnalysisScores)\r\n setPostAnalysisReportReady(result.reportIsReady)\r\n })\r\n .catch()\r\n .finally(() => setIsLoadingAnalysis(false));\r\n }, [props.match.params.postId]);\r\n\r\n const fetchInsightBreakdowns = useCallback(() => {\r\n setIsLoadingInsightBreakdowns(true)\r\n insightsApi.GetPosttInsightBreakdowns(props.match.params.postId)\r\n .then(result => {\r\n setInsightBreakdowns(result)\r\n })\r\n .catch()\r\n .finally(() => setIsLoadingInsightBreakdowns(false));\r\n }, [props.match.params.postId]);\r\n\r\n const fetchTenantPostAverages = useCallback(() => {\r\n setIsLoadingTenantAverages(true);\r\n postsApi.GetTenantPostAverages()\r\n .then(result => {\r\n setTenantPostAverages(result);\r\n })\r\n .catch()\r\n .finally(() => setIsLoadingTenantAverages(false));\r\n }, []);\r\n\r\n const fetchGlobalPostAverages = useCallback(() => {\r\n setIsLoadingGlobalAverages(true);\r\n postsApi.GetGlobalPostAverages()\r\n .then(result => {\r\n setGlobalPostAverages(result);\r\n })\r\n .catch()\r\n .finally(() => setIsLoadingGlobalAverages(false));\r\n }, []);\r\n\r\n useEffect(() => {\r\n determineScrollWidths();\r\n fetchPostDetails();\r\n fetchPostAnalysis();\r\n fetchInsightBreakdowns();\r\n fetchTenantPostAverages();\r\n fetchGlobalPostAverages();\r\n\r\n //Pull the context from the url of where the user was on the post management screen.\r\n const queryParams = new URLSearchParams(window.location.search);\r\n const pageContext = (queryParams.get(QUERY_PARAM_KEYS.PAGE_CONTEXT) ?? \"\");\r\n const contextNums = pageContext.split(\",\");\r\n\r\n if (contextNums.length === 5) {\r\n setAllPageNum(contextNums[0]);\r\n setPubPageNum(contextNums[1]);\r\n setSchPageNum(contextNums[2]);\r\n setDftPageNum(contextNums[3]);\r\n setTabNum(contextNums[4]);\r\n }\r\n\r\n }, [determineScrollWidths, fetchPostDetails, fetchPostAnalysis, fetchInsightBreakdowns, fetchTenantPostAverages, fetchGlobalPostAverages]);\r\n\r\n useEffect(() => {\r\n if (windowWidth > navWidth) {\r\n setNavPage(0)\r\n }\r\n }, [windowWidth, navWidth])\r\n\r\n useEffect(() => {\r\n setShowPostEditedWaring(postDetails.changedSinceFirstPublish)\r\n }, [postDetails.changedSinceFirstPublish])\r\n\r\n const deletePost = async () => {\r\n if (await confirm.show({ text: 'Are you sure you want to delete this post?' })) {\r\n props.deletePosts([{ draftId: props.match.params.postId, status: 'published' }])\r\n .then(() => {\r\n props.redirectTo(`/${props.tenant}/admin/posts/`)\r\n })\r\n }\r\n }\r\n\r\n const handleWindowResize = () => {\r\n let value = window.innerWidth - SIDE_BAR_MENU_WIDTH - SIDE_BAR_CONTENT_WIDTH\r\n if (matchesMed) {\r\n value = window.innerWidth - SIDE_BAR_MENU_WIDTH - 10\r\n }\r\n setWindowWidth(value)\r\n }\r\n\r\n const calculatePercent = (firstVal: number, secondVal: number): string => {\r\n let result = (firstVal / secondVal) * 100;\r\n if (result === Infinity || isNaN(result)) {\r\n return `0%`\r\n }\r\n if (result < 0.5) {\r\n result = Math.ceil(result)\r\n }\r\n result = Math.round(result)\r\n\r\n return `${result}%`\r\n }\r\n\r\n const LightTooltip = withStyles((theme) => ({\r\n tooltip: {\r\n backgroundColor: '#f5f5f9',\r\n color: 'rgba(0, 0, 0, 0.87)',\r\n boxShadow: theme.shadows[1],\r\n fontSize: \"12px\"\r\n }\r\n }))(Tooltip);\r\n\r\n const onEdit = async () => {\r\n const confirmationMessage: string = `Editing a compliance post and publishing its changes will reset its Compliance Report, clearing the list of users who have complied to it.`;\r\n\r\n if (postDetails.usersComplied === false) {\r\n props.redirectTo(`/${props.tenant}/admin/posts/edit/${postDetails.draftId}`);\r\n }\r\n else if (await confirm.show({\r\n title: `Edit Compliance Post`,\r\n text: (\r\n <div>\r\n <div>{confirmationMessage}</div>\r\n <br />\r\n <div>Would you like to proceed?</div>\r\n </div>\r\n ),\r\n yesColor: \"#3b78ab\",\r\n yesText: \"Edit\",\r\n noText: \"Cancel\"\r\n })) {\r\n props.redirectTo(`/${props.tenant}/admin/posts/edit/${postDetails.draftId}`);\r\n }\r\n }\r\n\r\n const actionButtons = (): JSX.Element => {\r\n return (\r\n <React.Fragment>\r\n <Button color=\"primary\" size=\"small\" disableElevation startIcon={<VisibilityIcon />} onClick={() => setShowPreview(true)}>\r\n {props.intl.formatMessage({ id: 'posts.preview', defaultMessage: \"Preview\" })}\r\n </Button>\r\n {\r\n postDetails.editable &&\r\n <Button color=\"primary\" size=\"small\" disableElevation startIcon={<EditIcon />} onClick={onEdit}>\r\n {props.intl.formatMessage({ id: 'common.edit', defaultMessage: \"Edit\" })}\r\n </Button>\r\n }\r\n <Button color=\"primary\" size=\"small\" startIcon={<DeleteIcon />} disableElevation onClick={deletePost}>\r\n {props.intl.formatMessage({ id: 'common.delete', defaultMessage: \"Delete\" })}\r\n </Button>\r\n </React.Fragment>\r\n )\r\n }\r\n\r\n const loadingComplete = !isLoadingDetailedInsights && !isLoadingInsightBreakdowns && !isLoadingAnalysis && !isLoadingActivityInsights && !isLoadingTenantAverages && !isLoadingGlobalAverages;\r\n const allReportsNotReady = !detailedInsights?.reportIsReady && !insightBreakdowns?.reportIsReady && !postAnalysisReportReady;\r\n const detailedInsightsReady = !allReportsNotReady && detailedInsights?.reportIsReady\r\n const breakdownsReady = !allReportsNotReady && insightBreakdowns?.reportIsReady\r\n // const dataIsOlder = new Date(detailedInsights?.firstPublishedDate!) < INSIGHTS_START_DATE;\r\n\r\n /**\r\n * Get the desktop preview component\r\n */\r\n const getDesktopPreview = (): JSX.Element => (\r\n <div className=\"post-preview\">\r\n {postDetails &&\r\n <PostContentView\r\n tinyMceCustomCssEnabled={props.tenantSettings.showFeatures.tinyMceCustomCssEnabled}\r\n reactions={props.tenantSettings.reactions.filter((t) => t.enabled).map((t) => ({ ...t, order: t.sortIndex }))}\r\n reactionsEnabledOnTenant={props.tenantSettings.reactionsEnabled}\r\n commentsEnabledOnTenant={props.tenantSettings.commentsEnabled}\r\n post={postDetails}\r\n lcidMappings={props.lcidMappings}\r\n defaultLcid={props.defaultLCID}\r\n />}\r\n </div>\r\n );\r\n\r\n const renderPostInsights = (): JSX.Element => {\r\n return <div className='insights-wrapper' ref={postInsightsRef} style={{ height: !matchesLarge ? '380px' : '' }}>\r\n <div className='heading'>\r\n {props.intl.formatMessage({ id: 'posts.postInsights', defaultMessage: \"Post Insights\" })}\r\n </div>\r\n {\r\n isLoadingDetailedInsights ?\r\n <Loading />\r\n : detailedInsightsReady ?\r\n <React.Fragment>\r\n <PostInsightsCharts \r\n readTypeData={[{ value: detailedInsights?.allTimeSkims!, interval: \"All Time\", label: \"Skims\" },\r\n { value: detailedInsights?.allTimeReads!, interval: \"All Time\", label: \"Reads\" },\r\n { value: detailedInsights?.allTimeCompleteReads!, interval: \"All Time\", label: \"Complete Reads\" },\r\n { value: detailedInsights?.allTimeOutlierReads!, interval: \"All Time\", label: \"Outlier Reads\" },\r\n { value: detailedInsights?.first7DaysSkims!, interval: \"First 7 Days\", label: \"Skims\" },\r\n { value: detailedInsights?.first7DaysReads!, interval: \"First 7 Days\", label: \"Reads\" },\r\n { value: detailedInsights?.first7DaysCompleteReads!, interval: \"First 7 Days\", label: \"Complete Reads\" },\r\n { value: detailedInsights?.first7DaysOutlierReads!, interval: \"First 7 Days\", label: \"Outlier Reads\" },\r\n { value: detailedInsights?.first30DaysSkims!, interval: \"First 30 Days\", label: \"Skims\" },\r\n { value: detailedInsights?.first30DaysReads!, interval: \"First 30 Days\", label: \"Reads\" },\r\n { value: detailedInsights?.first30DaysCompleteReads!, interval: \"First 30 Days\", label: \"Complete Reads\" },\r\n { value: detailedInsights?.first30DaysOutlierReads!, interval: \"First 30 Days\", label: \"Outlier Reads\" }]}\r\n engagementData={[{ value: detailedInsights?.allTimeUpvotes!, interval: \"All Time\", label: \"Comment likes\" },\r\n { value: detailedInsights?.allTimeComments!, interval: \"All Time\", label: \"Comments\" },\r\n { value: detailedInsights?.allTimeReactions!, interval: \"All Time\", label: \"Reactions\" },\r\n { value: detailedInsights?.first7DaysUpvotes!, interval: \"First 7 Days\", label: \"Comment likes\" },\r\n { value: detailedInsights?.first7DaysComments!, interval: \"First 7 Days\", label: \"Comments\" },\r\n { value: detailedInsights?.first7DaysReactions!, interval: \"First 7 Days\", label: \"Reactions\" },\r\n { value: detailedInsights?.first30DaysUpvotes!, interval: \"First 30 Days\", label: \"Comment likes\" },\r\n { value: detailedInsights?.first30DaysComments!, interval: \"First 30 Days\", label: \"Comments\" },\r\n { value: detailedInsights?.first30DaysReactions!, interval: \"First 30 Days\", label: \"Reactions\" }]}\r\n totalViews={detailedInsights?.allTimeTotalViews!}\r\n totalEngagement={detailedInsights?.totalEngagement!}\r\n firstPublishDate={detailedInsights?.firstPublishedDate!}\r\n compliancePost={postDetails.postType === 'compliance'}\r\n disclaimer={(!postDetails.commentingEnabled || !postDetails.reactingEnabled) ? `*${postDetails.commentingEnabled ? '' : 'Comments'}${!postDetails.commentingEnabled && !postDetails.reactingEnabled ? ' and ' : ''}${postDetails.reactingEnabled ? '' : 'Reactions'} were disabled` : null}\r\n />\r\n <div>\r\n <LightTooltip placement='right-end' title='A post view is measured as a Skim if the time spent viewing the post is less than 30% of the posts estimated read time.\r\n It is measured as a Read if the viewer spends more than 30%, but less than 70% of the estimated read time. Every view which exceeds 70% is a Complete Read. Lastly, it is measured as an\r\n Outlier if the time spent in viewing is more than 400%.'>\r\n <span className='info'>What are skims, reads and outliers?</span>\r\n </LightTooltip>\r\n </div>\r\n </React.Fragment>\r\n : <div className='empty-widget'>\r\n No found insights at the moment. Please try again later.\r\n </div>\r\n\r\n }\r\n </div>\r\n }\r\n\r\n const sendReadReportRequest = async () => {\r\n try {\r\n await reportsApi.SendUserReadReportRequest(ReportTypes.UserReadReport, props.match.params.postId);\r\n setSuccessMessage(\"Your report is being generated and will be emailed to you when it's ready.\");\r\n }\r\n catch (e) {\r\n setErrorMessage(\"Something went wrong. Please try again.\");\r\n }\r\n }\r\n\r\n const renderChannelBreakdown = (): JSX.Element => {\r\n return <div className='insights-wrapper' ref={channelBreakdownRef} style={{ height: !matchesLarge ? '380px' : '', flexGrow: !matchesLarge ? 'unset' : 1 }}>\r\n <div className='heading'>\r\n {props.intl.formatMessage({ id: 'posts.channelBreakdown', defaultMessage: \"Channel Breakdown\" })}\r\n {\r\n isLoadingInsightBreakdowns ?\r\n <Loading />\r\n : breakdownsReady ?\r\n <BreakdownChart chartData={insightBreakdowns?.channelBreakdown!.map(b => {\r\n return { id: b.platformName, value: b.viewsOnPlatform, label: `${b.platformName}: ${b.viewsOnPlatform}` }\r\n })}\r\n totalViews={detailedInsights?.allTimeTotalViews!}\r\n innerRadius={0.8}\r\n />\r\n : <div className='empty-widget'>\r\n No found insights at the moment. Please try again later.\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n const renderLanguageBreakdown = (): JSX.Element => {\r\n return <div className='insights-wrapper' ref={languageBreakdownRef} style={{ flexGrow: !matchesLarge ? 'unset' : 1 }}>\r\n <div className='heading'>\r\n {props.intl.formatMessage({ id: 'posts.languageBreakdown', defaultMessage: \"Language Breakdown\" })}\r\n {\r\n isLoadingInsightBreakdowns ?\r\n <Loading />\r\n : breakdownsReady ?\r\n <BreakdownChart chartData={insightBreakdowns?.languageBreakdown!.map(b => {\r\n return { id: b.language, value: b.viewsOnLCID, label: `${b.language}: ${b.viewsOnLCID}` }\r\n })}\r\n totalViews={detailedInsights?.allTimeTotalViews!}\r\n innerRadius={0.7}\r\n />\r\n : <div className='empty-widget'>\r\n No found insights at the moment. Please try again later.\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n const renderComplianceBreakdown = (): JSX.Element => {\r\n const chartData = detailedInsights?.usersNotViewedNotComplied === null ?\r\n [{ id: 'ViewsNotComplied', value: detailedInsights?.usersViewedNotComplied!, label: `Viewed but not complied: ${detailedInsights?.usersViewedNotComplied!}` },\r\n { id: 'Complied', value: detailedInsights?.totalCompliedUsers!, label: `Complied: ${detailedInsights?.totalCompliedUsers!}` }]\r\n : [{ id: 'NotViewed', value: detailedInsights?.usersNotViewedNotComplied!, label: `Not Viewed: ${detailedInsights?.usersNotViewedNotComplied!}` },\r\n { id: 'ViewsNotComplied', value: detailedInsights?.usersViewedNotComplied!, label: `Viewed but not complied: ${detailedInsights?.usersViewedNotComplied!}` },\r\n { id: 'Complied', value: detailedInsights?.totalCompliedUsers!, label: `Complied: ${detailedInsights?.totalCompliedUsers!}` }]\r\n\r\n return <div className='insights-wrapper' ref={complianceBreakdownRef}>\r\n <div className='header'>\r\n <div className='heading'>\r\n {props.intl.formatMessage({ id: 'posts.compliance', defaultMessage: \"Compliance\" })}\r\n </div>\r\n <DownloadButtonv2 styles={{ color: \"primary\", size: \"small\", disableElevation: true, startIcon: <GetAppIcon /> }}\r\n downloadName={postDetails.translatedContent[props.defaultLCID]['title'] + '-compliance-report'}\r\n text={props.intl.formatMessage({ id: 'insights.downloadCSVReport', defaultMessage: \"Download CSV Report\" })}\r\n onClick={() => insightsApi.GetComplianceReportCSV(props.match.params.postId)}\r\n />\r\n {\r\n detailedInsights?.usersNotViewedNotComplied != null ?\r\n <LightTooltip placement='right-end' title='Total Subscribers are the count of Subscribers at Publish Time of the Post. Not Viewed is the total number of subscribers that have not opened the post yet;\r\n Viewed but Not Complied are subscribers that have viewed the post, but have not complied to it; and Complied are subscribers who have acknowledged and complied to the post.'>\r\n <HelpOutlineIcon />\r\n </LightTooltip>\r\n : null\r\n }\r\n </div>\r\n {\r\n isLoadingDetailedInsights ?\r\n <Loading />\r\n : detailedInsightsReady ?\r\n <BreakdownChart chartData={chartData}\r\n totalSubscribers={detailedInsights?.totalSubscriberCountAtPublishTime!}\r\n totalUniqueViews={detailedInsights?.totalCompliedUsers! + detailedInsights?.usersViewedNotComplied!}\r\n innerRadius={0.7}\r\n />\r\n : <div className='empty-widget'>\r\n No found insights at the moment. Please try again later.\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n const keyInsights = [{ value: detailedInsights?.allTimeUniqueOpens, title: 'Users viewed this post' },\r\n { value: calculatePercent(detailedInsights?.allTimeUniqueOpens!, detailedInsights?.totalSubscriberCountAtPublishTime!), title: 'Viewers vs. Total Subscribers', description: `${detailedInsights?.allTimeUniqueOpens!} of ${detailedInsights?.totalSubscriberCountAtPublishTime!}` },\r\n { value: calculatePercent(detailedInsights?.allTimeUniqueOpens!, detailedInsights?.reachableUsersAtPublishTime!), title: 'Viewers vs. Total Reachable', description: `${detailedInsights?.allTimeUniqueOpens!} of ${detailedInsights?.reachableUsersAtPublishTime!}` },\r\n { value: calculatePercent(activityInsights?.totalUniqueInteractions!, detailedInsights?.allTimeUniqueOpens!), title: 'Of viewers interacted', description: `${activityInsights?.totalUniqueInteractions!} of ${detailedInsights?.allTimeUniqueOpens!}` },\r\n { value: detailedInsights?.allTimeTotalViews, title: 'Total views' },\r\n { value: detailedInsights?.allTimeCompleteReads, title: 'Complete Reads' },\r\n { value: detailedInsights?.allTimeComments, title: `Comments${!postDetails.commentingEnabled ? '*' : ''}` },\r\n { value: detailedInsights?.allTimeReactions, title: `Reactions${!postDetails.reactingEnabled ? '*' : ''}` }]\r\n\r\n if (isLoadingPost)\r\n return <LoadingOverlay show={isLoadingPost} absolute />\r\n\r\n let navButtonsToScroll = (navPage * (navWidth - windowWidth + 30))\r\n const backToTarget = `admin/posts?allPageNum=${allPageNum}&pubPageNum=${pubPageNum}&schPageNum=${schPageNum}&dftPageNum=${dftPageNum}&tabNum=${tabNum}`;\r\n\r\n return (\r\n <BasePage fullWidth>\r\n <Breadcrumb\r\n items={[\r\n { title: postDetails.translatedContent[props.defaultLCID]['title'], link: \"~/admin/posts\" },\r\n { title: props.intl.formatMessage({ id: \"insights.insightsAndReports\", defaultMessage: \"Insights & Reports\" }) }\r\n ]}\r\n />\r\n <div className='post-insights'>\r\n <div className='action-buttons'>\r\n <BackToButton locationTitle='Manage Posts' to={backToTarget} />\r\n <div className='right-buttons'>\r\n {\r\n matchesMed ?\r\n <div className='list-button'>\r\n\r\n <ButtonGroup color=\"primary\" size='small'>\r\n <Button color=\"primary\" size=\"small\" disableElevation onClick={() => setShowPreview(true)}>\r\n {props.intl.formatMessage({ id: 'posts.preview', defaultMessage: \"Preview\" })}\r\n </Button>\r\n <Button color=\"primary\" size=\"small\" onClick={() => setShowActionCommandList(true)}>\r\n <ArrowDropDownIcon />\r\n </Button>\r\n </ButtonGroup>\r\n {\r\n showActionCommandList &&\r\n <ClickAwayListener onClickAway={() => setShowActionCommandList(false)}>\r\n <List className='action-button-list'>\r\n {\r\n postDetails.editable &&\r\n <ListItem button onClick={onEdit}>\r\n <ListItemText primary=\"Edit\" />\r\n </ListItem>\r\n }\r\n <ListItem button onClick={deletePost}>\r\n <ListItemText primary=\"Delete\" />\r\n </ListItem>\r\n </List>\r\n </ClickAwayListener>\r\n }\r\n </div>\r\n : actionButtons()\r\n }\r\n <div className='list-button'>\r\n\r\n <div ref={popoverRef}\r\n onMouseEnter={() => setShowPopover(true)}\r\n onMouseLeave={() => setShowPopover(false)}\r\n >\r\n <Popover\r\n open={showPopover && (!(postDetails.postType === 'compliance' || detailedInsights?.reportIsReady))}\r\n anchorEl={popoverRef.current}\r\n anchorOrigin={{\r\n vertical: \"bottom\",\r\n horizontal: \"left\"\r\n }}\r\n transformOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"left\"\r\n }}\r\n PaperProps={{\r\n style: {\r\n maxWidth: 250\r\n }\r\n }}\r\n style={{ pointerEvents: \"none\" }}\r\n onClose={() => setShowPopover(false)}\r\n classes={{\r\n paper: \"help-icon-description\"\r\n }}\r\n >\r\n <span>\r\n No insights are found at the moment. Please try downloading the report again later.\r\n </span>\r\n </Popover>\r\n <MoreOptionsButton text=\"Download Reports\" variant=\"contained\" size=\"small\" disabled={(!(postDetails.postType === 'compliance' || detailedInsights?.reportIsReady))}>\r\n <List className='action-button-list'>\r\n {\r\n postDetails.postType === 'compliance' &&\r\n <ListItem>\r\n <DownloadButtonv2 styles={{ color: \"primary\", size: \"small\", disableElevation: true }}\r\n downloadName={postDetails.translatedContent[props.defaultLCID]['title'] + '-compliance-report'}\r\n text={props.intl.formatMessage({ id: 'insights.downloadComplianceReport', defaultMessage: \"Compliance Report\" })}\r\n onClick={() => insightsApi.GetComplianceReportCSV(props.match.params.postId)}\r\n />\r\n </ListItem>\r\n }\r\n {\r\n detailedInsights?.reportIsReady &&\r\n <ListItem>\r\n <Button\r\n size='small'\r\n color='primary'\r\n disableElevation={true}\r\n onClick={sendReadReportRequest}\r\n >\r\n {props.intl.formatMessage({ id: 'insights.downloadUserReadsReport', defaultMessage: \"User Read Report\" })}\r\n </Button>\r\n </ListItem>\r\n }\r\n </List>\r\n </MoreOptionsButton>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div className='content'>\r\n {\r\n !matchesMed &&\r\n <div className='post-side'>\r\n <ContentOverviewSideBar postDetails={postDetails} defaultLCID={props.defaultLCID} />\r\n </div>\r\n }\r\n <div className='insights-side' style={{ width: matchesMed ? '100%' : '' }}>\r\n {\r\n matchesMed &&\r\n <ContentOverviewCard postDetails={postDetails} defaultLCID={props.defaultLCID} />\r\n }\r\n <div className='nav-header'>\r\n <div className='nav-buttons'>\r\n <div className='nav-buttons-wrapper' style={{ transform: `translate(${navButtonsToScroll}px`, transition: 'transform 1s' }}>\r\n {navButtons.map(item => {\r\n return <Button key={item.title} size=\"small\" color=\"primary\" variant='outlined' classes={{ root: 'round-button' }} ref={item.ref} onClick={() => scrollToView(item.scrollTo)}>{item.title}</Button>\r\n })}\r\n </div>\r\n </div>\r\n {\r\n navPage === -1 &&\r\n <Button size=\"small\" color=\"primary\" aria-label='align' classes={{ root: 'arrow-button left' }} onClick={() => setNavPage(0)}>\r\n <ArrowBackIosIcon />\r\n </Button>\r\n }\r\n {windowWidth < navWidth && navPage !== -1 &&\r\n <Button size=\"small\" color=\"primary\" classes={{ root: 'arrow-button right' }} onClick={() => setNavPage(-1)}>\r\n <ArrowForwardIosIcon />\r\n </Button>\r\n }\r\n </div>\r\n {\r\n showPostEditedWarning && loadingComplete && !allReportsNotReady &&\r\n <div className='warning'>\r\n <WarningIcon style={{ color: '#e6911a' }} />\r\n <span>We found modifications made to your post. Take note that insights are gathered from post details and settings set from the original published version only.</span>\r\n </div>\r\n }\r\n {\r\n allReportsNotReady && loadingComplete ?\r\n <div className='insights-wrapper'>\r\n <div className='empty-widget'>\r\n No found insights at the moment. Please try again later.\r\n </div>\r\n </div>\r\n :\r\n <React.Fragment>\r\n <div className='insights-wrapper' ref={keyInsightsRef} >\r\n <div className='header'>\r\n <div className='heading'>\r\n {props.intl.formatMessage({ id: 'posts.keyInsights', defaultMessage: \"Key Insights\" })}\r\n </div>\r\n <LightTooltip placement='left-start' title='Key Insights is the summary of all the data provided below. These give an overview of the performance of this post.'>\r\n <HelpOutlineIcon />\r\n </LightTooltip>\r\n </div>\r\n {\r\n isLoadingDetailedInsights || detailedInsights === undefined ?\r\n <Loading />\r\n : detailedInsightsReady ?\r\n <React.Fragment>\r\n <div style={{ display: !matchesXLarge && !matchesLarge ? 'flex' : 'block' }}>\r\n <div className='stats-row'>\r\n {\r\n keyInsights.map((item, index) => {\r\n if (!matchesXLarge) {\r\n if (index >= 4) return null\r\n }\r\n return <div key={index} className='number-wrapper'>\r\n <div className={`number ${!matchesXLarge && !matchesLarge ? 'left' : ''}`}>\r\n {\r\n (detailedInsights.totalSubscriberCountAtPublishTime === null && index === 1) ||\r\n (detailedInsights.reachableUsersAtPublishTime === null && (index === 2 || index === 3)) ?\r\n \"N/A\"\r\n : item.value\r\n }\r\n </div>\r\n <span className='title'>\r\n {item.title}\r\n </span>\r\n {\r\n item.description &&\r\n <span className='description'>\r\n {\r\n (detailedInsights.totalSubscriberCountAtPublishTime === null && index === 1) ||\r\n (detailedInsights.reachableUsersAtPublishTime === null && (index === 2 || index === 3)) ?\r\n \"Not Available\"\r\n : item.description\r\n }\r\n </span>\r\n }\r\n </div>\r\n })\r\n }\r\n </div>\r\n {!matchesXLarge &&\r\n <div className={`stats-row ${!matchesLarge ? 'wrap' : ''}`}>\r\n <div style={{ display: \"flex\", flexGrow: 1, width: matchesLarge ? '50%' : '' }}>\r\n {\r\n keyInsights.map((item, index) => {\r\n if (index < 4 || index > 5) return null\r\n return <div key={index} className='number-wrapper'>\r\n <div className='number'>\r\n {item.value}\r\n </div>\r\n <span className='title'>\r\n {item.title}\r\n </span>\r\n {\r\n item.description &&\r\n <span className='description'>\r\n {item.description}\r\n </span>\r\n }\r\n </div>\r\n })\r\n\r\n }\r\n </div>\r\n <div style={{ display: \"flex\", flexGrow: 1, width: matchesLarge ? '50%' : '' }}>\r\n {\r\n keyInsights.map((item, index) => {\r\n if (index < 6) return null\r\n return <div key={index} className='number-wrapper' style={{ marginTop: !matchesLarge ? 0 : '' }}>\r\n <div className='number'>\r\n {item.value}\r\n </div>\r\n <span className='title'>\r\n {item.title}\r\n </span>\r\n {\r\n item.description &&\r\n <span className='description'>\r\n {item.description}\r\n </span>\r\n }\r\n </div>\r\n })\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n {\r\n (!postDetails.commentingEnabled || !postDetails.reactingEnabled) &&\r\n <div className='graphs-disclaimer' style={{ textAlign: 'right', marginRight: '12px' }}>{`*${postDetails.commentingEnabled ? '' : 'Comments'}${!postDetails.commentingEnabled && !postDetails.reactingEnabled ? ' and ' : ''}${postDetails.reactingEnabled ? '' : 'Reactions'} were disabled`}</div>\r\n }\r\n </React.Fragment>\r\n : <div className='empty-widget'>\r\n No found insights at the moment. Please try again later.\r\n </div>\r\n }\r\n </div>\r\n {\r\n matchesLarge &&\r\n <React.Fragment>\r\n {renderPostInsights()}\r\n <div className='insight-row'>\r\n {renderChannelBreakdown()}\r\n {renderLanguageBreakdown()}\r\n </div>\r\n </React.Fragment>\r\n }\r\n {\r\n matchesLarge && postDetails.postType === 'compliance' && renderComplianceBreakdown()\r\n }\r\n <div className={!matchesLarge ? 'insight-row' : ''}>\r\n <div className='insight-column' style={{ flexGrow: 2 }}>\r\n {\r\n !matchesLarge && renderPostInsights()\r\n }\r\n <div className='insights-wrapper' ref={readingCompRef}>\r\n <div className='header'>\r\n <div className='heading'>\r\n {props.intl.formatMessage({ id: 'posts.readingAnalysis', defaultMessage: \"Reading & Comprehension Analysis*\" })}\r\n </div>\r\n <div style={{ fontSize: \"10px\", fontWeight: \"normal\" }}>\r\n {isUsingTenantAverages ?\r\n <>\r\n <WhereToVoteIcon htmlColor=\"#adb7c1\" style={{ width: 13, color: \"#adb7c1\", marginRight: 5, position: \"relative\", top: \"8px\" }} />\r\n <HoverText labelClassName=\"legend-text\" inline label=\"Internal avg.\">\r\n Average scores taken from your organization's most engaging posts.\r\n </HoverText>\r\n </>\r\n :\r\n <>\r\n <PublicIcon htmlColor=\"#599FA0\" style={{ width: 13, color: \"#599FA0\", marginRight: 5, position: \"relative\", top: \"8px\" }} />\r\n <HoverText labelClassName=\"legend-text-global\" inline label=\"Global avg.\">\r\n <span>Global average scores are taken from most engaging posts in Sparrow.</span>\r\n </HoverText>\r\n </>}\r\n <img alt=\"Your score\" src={SCORE_ICON_SRC} width={16} style={{ marginRight: 5, marginLeft: 15, }} />\r\n <span className=\"legend-text\" style={{ color: \"#3b78ab\" }}>Current scores</span>\r\n </div>\r\n\r\n {!!tenantPostAverages && !!globalPostAverages &&\r\n <AnalyticsDrawer\r\n isOpen={showDrawer}\r\n closeDrawer={() => setShowDrawer(false)}\r\n postAnalysis={postAnalysis}\r\n tenantAverages={tenantPostAverages}\r\n globalAverages={globalPostAverages}\r\n isUsingTenantAverages={isUsingTenantAverages}\r\n setIsUsingTenantAverages={setIsUsingTenantAverages}\r\n />\r\n }\r\n </div>\r\n {\r\n (isLoadingAnalysis || isLoadingTenantAverages || isLoadingGlobalAverages) ?\r\n <Loading />\r\n : (postAnalysisReportReady && !!tenantPostAverages && !!globalPostAverages) ?\r\n <>\r\n <ReadingComprehensionAnalysis\r\n postAnalysis={postAnalysis}\r\n globalAverages={globalPostAverages}\r\n tenantAverages={tenantPostAverages}\r\n timeSpentReading={detailedInsights?.averageTimeSpentReadingUI!}\r\n isUsingTenantAverages={isUsingTenantAverages}\r\n />\r\n <div>\r\n <Button color='primary' onClick={() => setTenantAveragesSetting(!isUsingTenantAverages)} startIcon={\r\n <img src={SYNC_ARROWS_SRC} style={{ width: \"26px\" }} alt={\"Swap average locale icon\"}></img>\r\n }>\r\n {isUsingTenantAverages ? \"Use Global Scores\" : \"Use Internal Scores\"}\r\n </Button>\r\n <Button color='primary' onClick={() => setShowDrawer(true)} style={{ float: \"right\" }}>\r\n See All Analysis\r\n </Button>\r\n </div>\r\n </>\r\n : <div className='empty-widget'>\r\n No found insights at the moment. Please try again later.\r\n </div>\r\n }\r\n\r\n </div>\r\n {\r\n postDetails.postType !== 'compliance' &&\r\n <div className='insights-wrapper' ref={activityRef}>\r\n <div className='header'>\r\n <div className='heading' >\r\n {props.intl.formatMessage({ id: 'activity.activity', defaultMessage: \"Activity\" })}\r\n </div>\r\n <Button color=\"primary\" size=\"small\" disableElevation startIcon={<ExitToAppIcon />} onClick={() => props.redirectTo(`/${props.tenant}/admin/activity`)}>\r\n Go to flagged comments\r\n </Button>\r\n </div>\r\n {\r\n isLoadingActivityInsights ?\r\n <Loading />\r\n : <ActivityInsights\r\n totalComments={detailedInsights?.allTimeComments!}\r\n totalReactions={detailedInsights?.allTimeReactions!}\r\n activityInsights={activityInsights!}\r\n showComments={postDetails.commentingEnabled}\r\n showReactions={postDetails.reactingEnabled}\r\n totalUniqueOpens={detailedInsights?.allTimeUniqueOpens!}\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div className='insight-column' style={{ flexGrow: 1, minWidth: '350px' }}>\r\n {\r\n !matchesLarge ?\r\n <React.Fragment>\r\n {renderChannelBreakdown()}\r\n {renderLanguageBreakdown()}\r\n </React.Fragment>\r\n : null\r\n }\r\n {\r\n !matchesLarge && postDetails.postType === 'compliance' && renderComplianceBreakdown()\r\n }\r\n </div>\r\n </div>\r\n </React.Fragment>\r\n }\r\n </div>\r\n\r\n </div>\r\n {showPreview &&\r\n <Preview\r\n editAction={postDetails.postType === POST_TYPES.COMPLIANCE ? undefined : onEdit}\r\n editLabel={\"EDIT POST\"}\r\n openAction={hideOpenInPortalPreviewAction ? undefined : () => openPostInPortal(props.tenant, postDetails.id)}\r\n openLabel={hideOpenInPortalPreviewAction ? undefined : \"OPEN POST IN PORTAL\"}\r\n onClose={() => setShowPreview(false)}\r\n open={showPreview}\r\n previews={[{ type: PreviewType.Desktop, label: \"DESKTOP\", component: getDesktopPreview() }]}\r\n />\r\n }\r\n <WindowResizeListener onChange={handleWindowResize} />\r\n <SnackbarWrapper open={!!successMessage} style={{ top: \"60px\" }} autoHideDuration={8000} onClose={() => setSuccessMessage(\"\")} severity=\"success\" message={successMessage} />\r\n <SnackbarWrapper open={!!errorMessage} style={{ top: \"60px\" }} autoHideDuration={8000} onClose={() => setErrorMessage(\"\")} severity=\"error\" message={errorMessage} />\r\n </div>\r\n </BasePage>\r\n );\r\n}\r\n\r\ninterface ComponentProps { intl: IntlShape; }\r\n\r\ninterface RouteParams {\r\n postId: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps<RouteParams>) => ({\r\n ...ownProps,\r\n tenant: state.tenant.id,\r\n asyncReportsEnabled: state.settings.tenantSettings.showFeatures.asyncReportProcessingEnabled,\r\n defaultLCID: state.settings.tenantSettings.defaultLCID,\r\n tenantSettings: state.settings.tenantSettings,\r\n lcidMappings: state.resources.lcidMappings,\r\n }),\r\n {\r\n redirectTo: push,\r\n deletePosts: actions.deleteDraftPosts,\r\n }\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default injectIntl(connector(withRouter(PostInsights)));\r\n","import React, { useState } from \"react\";\r\nimport { Container, SxProps, TextField, TextFieldProps } from \"@mui/material\";\r\nimport Chips from \"./chips/chips\";\r\n\r\ninterface ITextFieldError {\r\n isValueValid: (value: string) => boolean;\r\n errorHelperText?: React.ReactNode;\r\n}\r\n\r\ninterface IChipListProps {\r\n textFieldProps?: TextFieldProps;\r\n values: string[];\r\n onRemoveChip: (removedChip: string) => void;\r\n onAddValidatedChips: (addedChips: string[]) => void; // if errorProps.isValueValid is set, will only run if validation passes.\r\n helperText?: React.ReactNode;\r\n errorProps?: ITextFieldError; // set this prop to show error messages and apply input validation\r\n chipClassName?: string;\r\n containerSx?: SxProps;\r\n}\r\n\r\nconst ChipListInput: React.FC<IChipListProps> = ({\r\n textFieldProps,\r\n values,\r\n onRemoveChip,\r\n onAddValidatedChips,\r\n helperText,\r\n errorProps,\r\n chipClassName,\r\n containerSx\r\n}) => {\r\n const [innerInputValue, setInnerInputValue] = useState(\"\");\r\n const [showError, setShowError] = useState(false);\r\n\r\n const onChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = event.target.value;\r\n if (value !== \",\") {\r\n if (value.split(',').length > 1) {\r\n handleAndValidateInputValue(value);\r\n }\r\n else {\r\n setInnerInputValue(value);\r\n }\r\n\r\n if (showError) setShowError(false);\r\n }\r\n }\r\n\r\n const handleAndValidateInputValue = (inputValue: string) => {\r\n let allValues = inputValue.split(',').map(v => v.trim().split(' ')[0]);\r\n let valuesToAdd: string[] = [];\r\n let valuesLeft: string[] = [];\r\n let newInnerInputValue = \"\";\r\n\r\n if (errorProps) {\r\n valuesToAdd = allValues.filter(errorProps.isValueValid);\r\n valuesLeft = allValues.filter(k => !valuesToAdd.includes(k));\r\n\r\n if (valuesToAdd.length === 0 && valuesLeft.length === 1) {\r\n newInnerInputValue = valuesLeft[0];\r\n setShowError(true);\r\n }\r\n }\r\n\r\n const uniqueValidValues = new Set(valuesToAdd.filter(keyword => !values.includes(keyword)));\r\n if (uniqueValidValues.size > 0)\r\n onAddValidatedChips(Array.from(uniqueValidValues));\r\n \r\n setInnerInputValue(newInnerInputValue);\r\n }\r\n\r\n const onKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\r\n const cleanedInputValue = innerInputValue.trim();\r\n\r\n if (cleanedInputValue === \"\") return;\r\n\r\n if (event.key === \"Enter\" || event.key === \",\") {\r\n handleAndValidateInputValue(cleanedInputValue);\r\n }\r\n };\r\n\r\n return <>\r\n <TextField\r\n onKeyDown={onKeyDown}\r\n value={innerInputValue}\r\n onChange={onChange}\r\n fullWidth\r\n error={showError}\r\n helperText={showError ? errorProps?.errorHelperText : helperText}\r\n {...textFieldProps}\r\n />\r\n <Container disableGutters sx={{ ...containerSx }}>\r\n <Chips \r\n chips={\r\n values.map((name, idx) => \r\n ({\r\n id: `${idx}`,\r\n name: name,\r\n onDelete: () => onRemoveChip(name)\r\n })\r\n )\r\n } \r\n hideAll\r\n chipClassName={chipClassName}\r\n />\r\n </Container>\r\n </>;\r\n};\r\n\r\nexport default ChipListInput;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { Container, Divider, Grid, IconButton, Stack, Typography } from '@mui/material';\r\nimport moment from 'moment';\r\nimport EditIcon from '@mui/icons-material/Edit';\r\nimport FileDownloadIcon from '@mui/icons-material/FileDownload';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { mediaApi } from 'api/instances';\r\nimport { Image, ImageType } from \"modules/gallery/models\";\r\nimport Preview from 'modules/common/components/authoring/dialogs/preview';\r\nimport HoverText from 'modules/documents/components/action-buttons/hoverText';\r\nimport { IChipListItem } from 'modules/common/components/chipList';\r\nimport { cmp } from '../customChonkyFileActions';\r\nimport ChipListInput from 'modules/common/components/chipListInput';\r\n\r\nimport './mediaPreviewer.sass'\r\n\r\ninterface ComponentProps {\r\n previewImage?: Image;\r\n onPreviewClose: () => void;\r\n onKeywordsChange: (keywords: string[]) => void;\r\n onNameEdit: (imageId: string) => void;\r\n}\r\n\r\nconst MediaPreviewer: React.FC<ComponentProps> = props => {\r\n const [videoId, setVideoId] = useState<string | undefined>(undefined);\r\n const [videoPreviewUrl, setVideoPreviewUrl] = useState<string | undefined>(undefined);\r\n const [videoRef, setVideoRef] = useState<HTMLVideoElement | undefined>();\r\n const [keywordsChipListValue, setKeywordsChipListValue] = useState<string[]>([]);\r\n\r\n useEffect(() => {\r\n setKeywordsChipListValue(props.previewImage?.keywords.sort((a, b) => cmp(a, b)) ?? [])\r\n }, [props.previewImage?.keywords])\r\n\r\n const showVideo = (previewImage: Image) => {\r\n if(previewImage.videoId && previewImage.videoId !== videoId){\r\n \r\n mediaApi.GetVideoUrl(previewImage.videoId)\r\n .then(response => {\r\n setVideoId(previewImage.videoId);\r\n setVideoPreviewUrl(response);\r\n });\r\n }\r\n return <video\r\n className=\"video-js vjs-default-skin post-video-primary vjs-16-9 vjs-big-play-centered\"\r\n ref={(e) => setVideoRef(e!)}\r\n crossOrigin=\"anonymous\"\r\n controls\r\n preload=\"metadata\"\r\n style={{ backgroundColor: \"black\" }}\r\n poster={props.previewImage?.url}\r\n />;\r\n }\r\n\r\n useEffect(() => {\r\n if (videoRef) {\r\n const videojs = (window as any).videojs;\r\n const player = videojs(videoRef, {});\r\n player\r\n .ready(() => {\r\n player.src(videoPreviewUrl);\r\n })\r\n .on('ended', () => {\r\n player.pause().currentTime(0).trigger('loadstart');\r\n })\r\n .on('pause', () => {\r\n player.bigPlayButton.el_.style.display = 'block';\r\n })\r\n .on('play', () => {\r\n player.bigPlayButton.el_.style.display = 'none';\r\n });\r\n }\r\n }, [videoRef, videoPreviewUrl]);\r\n\r\n const onRemoveKeyword = (name: string) => {\r\n const newKeywords = removeKeywordFromList(name);\r\n props.onKeywordsChange(newKeywords);\r\n }\r\n\r\n const addKeywordsToList = (newKeywords: string[]) => {\r\n let newKeywordsList = keywordsChipListValue.concat(newKeywords);\r\n setAndSortChipListValue(newKeywordsList);\r\n props.onKeywordsChange(newKeywordsList);\r\n }\r\n\r\n const removeKeywordFromList = (keywordNameToRemove: string): string[] => {\r\n let newKeywordsList = keywordsChipListValue.filter(keyword => keyword !== keywordNameToRemove);\r\n return newKeywordsList;\r\n }\r\n\r\n const setAndSortChipListValue = (newKeywordsList: string[]) => {\r\n setKeywordsChipListValue(newKeywordsList.sort((a, b) => cmp(a, b)));\r\n }\r\n\r\n const onPreviewClose = () => {\r\n setVideoId(undefined);\r\n setVideoRef(undefined);\r\n setKeywordsChipListValue([]);\r\n\r\n props.onPreviewClose();\r\n }\r\n\r\n const downloadImage = async () => {\r\n if (props.previewImage) {\r\n const response = await fetch(props.previewImage.url);\r\n const blob = await response.blob();\r\n\r\n const link = document.createElement('a');\r\n link.href = window.URL.createObjectURL(blob);\r\n link.download = props.previewImage.name;\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n }\r\n };\r\n\r\n return(\r\n <>\r\n {\r\n props.previewImage && \r\n <Preview \r\n open={true}\r\n onClose={onPreviewClose} \r\n extraLabel={\"download\"}\r\n extraAction={() => downloadImage()}\r\n extraLabelStartIcon={<FileDownloadIcon />} \r\n >\r\n <Grid sx={{ flexGrow: 1 }} container spacing={2}>\r\n <Grid item xs={8} display={\"flex\"}>\r\n <Container maxWidth=\"md\">\r\n {\r\n props.previewImage.videoId\r\n ? showVideo(props.previewImage)\r\n : <img className=\"image-preview-image\" src={props.previewImage.url} alt=\"preview\"/>\r\n } \r\n </Container>\r\n </Grid>\r\n <Grid item xs={4}>\r\n <Container disableGutters sx={{display: 'flex', flexDirection: 'row'}}>\r\n <Typography variant=\"h6\" sx={{width: 'fit-content', alignSelf: 'center'}}>\r\n {props.previewImage.name}\r\n </Typography>\r\n <IconButton\r\n onClick={_ => props.previewImage?.id && props.onNameEdit(props.previewImage.id)}\r\n >\r\n <EditIcon/>\r\n </IconButton>\r\n </Container>\r\n <Stack spacing={2} divider={<Divider flexItem/>} mt={2}>\r\n <Grid container spacing={2}>\r\n <Grid item xs={4}>\r\n <Typography>Created On</Typography>\r\n </Grid>\r\n <Grid item xs={8}>\r\n <Typography>{moment(props.previewImage.createdTime.date).format('MMM D, YYYY, h:mm a')}</Typography>\r\n </Grid>\r\n <Grid item xs={4}>\r\n <Typography>Created By</Typography>\r\n </Grid>\r\n <Grid item xs={8}>\r\n <Typography>{props.previewImage.createdBy ?? \"Unknown\"}</Typography>\r\n </Grid>\r\n <Grid item xs={4}>\r\n <Typography>File Type</Typography>\r\n </Grid>\r\n <Grid item xs={8}>\r\n <Typography>{ImageType[props.previewImage.fileType]}</Typography>\r\n </Grid>\r\n </Grid>\r\n <Stack spacing={1} display=\"flex\">\r\n <HoverText label=\"Keywords for search\">\r\n Improve search results by tagging this file with words and phrases people typically use to find it. Separate each word by a comma.\r\n </HoverText>\r\n <ChipListInput\r\n values={keywordsChipListValue}\r\n textFieldProps={{\r\n hiddenLabel: true,\r\n placeholder: \"Enter keywords (separated by commas)\" \r\n }}\r\n onAddValidatedChips={addKeywordsToList}\r\n onRemoveChip={onRemoveKeyword}\r\n />\r\n </Stack>\r\n </Stack>\r\n </Grid>\r\n </Grid>\r\n </Preview>\r\n }\r\n </>\r\n );\r\n}\r\n\r\nexport default MediaPreviewer;","import * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport {injectIntl, IntlShape} from \"react-intl\";\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Header from \"pages/common/header\";\r\nimport MainContent from \"pages/common/mainContent\";\r\nimport GalleryVFSBrowser from './galleryVFSBrowser';\r\nimport UploadMediaButton from './uploadMediaButton';\r\nimport MediaPreviewer from './mediaPreviewer';\r\nimport { CustomFileData, Image } from '../models';\r\nimport * as actions from 'modules/posts/actionCreator';\r\n\r\ninterface ComponentProps {\r\n intl: IntlShape;\r\n}\r\n\r\ninterface ComponentState {\r\n filesToUpload: FileList | null;\r\n previewImage?: Image;\r\n fileToRename?: CustomFileData;\r\n}\r\n\r\nclass ImageGallery extends React.PureComponent<PropsWithRedux, ComponentState> {\r\n constructor(props){\r\n super(props);\r\n\r\n this.state = {\r\n filesToUpload: null,\r\n previewImage: undefined,\r\n fileToRename: undefined,\r\n };\r\n }\r\n\r\n public render() {\r\n return (\r\n <BasePage fullWidth>\r\n <Header\r\n title=\"Media Gallery\"\r\n rightComponent={<UploadMediaButton onFileUpload={files => this.setState({ filesToUpload: files })} />}\r\n />\r\n <MainContent fullHeight>\r\n <div \r\n className=\"image-gallery\"\r\n style={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n overflowX: 'hidden'\r\n }}\r\n >\r\n <GalleryVFSBrowser\r\n externalFilesToUpload={this.state.filesToUpload}\r\n onSingleSelect={file => this.onSingleSelect(file)}\r\n onMultiSelect={files => this.onMultiSelect(files)}\r\n externalFileToRename={this.state.fileToRename}\r\n clearExternalFileToRename={() => this.state.previewImage ? this.onSingleSelect(this.state.previewImage) : undefined}\r\n />\r\n <MediaPreviewer\r\n previewImage={this.state.previewImage}\r\n onPreviewClose={() => this.setState({ previewImage: undefined })}\r\n onKeywordsChange={keywords => this.onKeywordsChange(keywords)}\r\n onNameEdit={(imageId: string) => {\r\n const chonkyImageData = this.props.imageLibrary.chonkyFileData.find(x => x.id === imageId);\r\n if (chonkyImageData) {\r\n this.setState({ fileToRename: chonkyImageData });\r\n }\r\n }}\r\n />\r\n </div>\r\n </MainContent>\r\n </BasePage>\r\n );\r\n }\r\n\r\n private async onSingleSelect(mediaFile: CustomFileData): Promise<void> {\r\n if (mediaFile === undefined || mediaFile.isDir) return;\r\n\r\n let image = await this.props.fetchSingleImage(mediaFile.id);\r\n \r\n this.setState({ previewImage: image });\r\n }\r\n\r\n private onMultiSelect(mediaFiles: CustomFileData[]) {}\r\n\r\n private async onKeywordsChange (keywords: string[]) {\r\n if (this.state.previewImage?.id)\r\n await this.props.setImageKeywords(this.state.previewImage.id, keywords);\r\n }\r\n}\r\n\r\nconst connector = connect((state: GlobalApplicationState, ownProps: ComponentProps) => ({ \r\n ...ownProps,\r\n imageLibrary: state.posts.imageLibrary,\r\n }),\r\n {\r\n fetchSingleImage: actions.fetchImage,\r\n setImageKeywords: actions.setImageKeywords,\r\n }\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default injectIntl(connector(ImageGallery));","import * as React from \"react\";\r\nimport { GlobalApplicationState } from \"../../globalApplicationState\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { RouteComponentProps, withRouter } from \"react-router\";\r\n\r\nimport CookieBanner from \"./common/components/CookieBanner\";\r\n\r\nclass ExternalLayout extends React.Component<PropsWithRedux, any> {\r\n public render() {\r\n return (\r\n <div id=\"app-base\" className={\"external-app\"}>\r\n <div className=\"primary-content-wrapper-external\" >\r\n <div className=\"wrapper\" style={{backgroundColor: \"#2f4050\"}}>\r\n <div className=\"logo-wrapper\">\r\n <img src=\"/images/sparrow_banner.png\" alt=\"Sparrow\" width=\"400px\" />\r\n </div>\r\n {this.props.children}\r\n </div>\r\n </div>\r\n <CookieBanner />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n strongBackground?: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector> & RouteComponentProps;\r\n\r\nexport default withRouter(connector(ExternalLayout));\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\n\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { FormattedMessage } from \"react-intl\";\r\n\r\nimport { Link } from \"react-router-dom\";\r\nimport Cookies from 'utils/cookie';\r\nimport { useIsAuthenticated, useMsal } from \"@azure/msal-react\";\r\nimport MsalAuthModule from \"authentication/msalAuthModule\";\r\nimport { InteractionStatus } from \"@azure/msal-browser\";\r\nimport ExternalLayout from \"routes/_layout/externalLayout\";\r\n\r\nconst Logout: React.FunctionComponent<PropsWithRedux> = (props) => {\r\n const isAuthenticated = useIsAuthenticated();\r\n const { inProgress } = useMsal();\r\n\r\n /**\r\n * React to changes in authentication and msal progress statuses\r\n */\r\n React.useEffect(() => {\r\n if (isAuthenticated && inProgress === InteractionStatus.None) {\r\n MsalAuthModule.getInstance().logout();\r\n } else if (!isAuthenticated) {\r\n document.title = \"Sparrow Connected\";\r\n Cookies.remove(\"tenantId\");\r\n Cookies.remove(\"multitenancy\");\r\n }\r\n\r\n }, [isAuthenticated, inProgress]);\r\n\r\n return (\r\n <ExternalLayout>\r\n <div className=\"logout\">\r\n <header className=\"page-header\">\r\n {isAuthenticated ? (\r\n <FormattedMessage id=\"logout.signingOut\" defaultMessage={\"Signing you out\"} tagName=\"h2\" />\r\n ):(\r\n <FormattedMessage id=\"logout.signedOut\" defaultMessage={\"You are signed out\"} tagName=\"h2\" />\r\n )\r\n }\r\n </header>\r\n {!isAuthenticated && (\r\n <div>\r\n <div className=\"input-section\">\r\n <div className=\"btn-wrapper\">\r\n <Link className=\"continue-btn\" to=\"/\" >Sign in again</Link>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </ExternalLayout>\r\n );\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(Logout);\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\n\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { withRouter, Redirect } from \"react-router\";\r\n\r\nclass RedirectToDashboard extends React.Component<PropsWithRedux, ComponentState> {\r\n public render() {\r\n return (<Redirect to={`/${this.props.tenant_id || \"tenant\"}/admin/dashboard`} />);\r\n }\r\n}\r\n\r\ninterface ComponentProps { }\r\ninterface ComponentState { }\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenant_id: state.tenant?.id\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default withRouter(connector(RedirectToDashboard));","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\n\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { withRouter, Redirect } from \"react-router\";\r\n\r\nclass RedirectToHome extends React.Component<PropsWithRedux, ComponentState> {\r\n public render() {\r\n return (<Redirect to={`/${this.props.tenant_id || \"tenant\"}/home`} />);\r\n }\r\n}\r\n\r\ninterface ComponentProps { }\r\ninterface ComponentState { }\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenant_id: state.tenant?.id\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default withRouter(connector(RedirectToHome));\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\n\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { withRouter, Redirect } from \"react-router\";\r\n\r\nclass RedirectToWelcome extends React.Component<PropsWithRedux, ComponentState> {\r\n public render() {\r\n return (<Redirect to={`/${this.props.tenant_id || \"tenant\"}/welcome`} />);\r\n }\r\n}\r\n\r\ninterface ComponentProps { }\r\ninterface ComponentState { }\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenant_id: state.tenant?.id\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default withRouter(connector(RedirectToWelcome));","import React from \"react\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { RouteComponentProps, withRouter } from \"react-router\";\r\nimport { Theme } from \"@mui/material/styles\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport useMediaQuery from '@mui/material/useMediaQuery';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n main: {\r\n height: \"100vh\",\r\n width: \"100vw\",\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n },\r\n col: {\r\n flex: 1,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n padding: 15,\r\n },\r\n leftCol: {\r\n backgroundColor: \"#fcfcff\",\r\n },\r\n rightCol: {\r\n background: `url(${process.env.PUBLIC_URL}/images/login-bg.png) no-repeat`,\r\n backgroundSize: \"cover\",\r\n flex: 1.5,\r\n },\r\n form: {\r\n padding: 25,\r\n backgroundColor: \"rgba(255, 255, 255, 1)\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n borderRadius: 4,\r\n width: \"75%\",\r\n maxWidth: 529,\r\n },\r\n formContainer: {\r\n marginTop: \"auto\",\r\n marginBottom: \"auto\",\r\n width: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n },\r\n engageText: {\r\n fontWeight: 500,\r\n fontSize: 36,\r\n color: \"#aa214e\",\r\n lineHeight: 1,\r\n },\r\n whatsNew: {\r\n textTransform: \"capitalize\",\r\n textDecoration: \"none\",\r\n marginTop: 50,\r\n fontSize: 16,\r\n color: \"rgb(59, 120, 171)\",\r\n fontWeight: 500,\r\n \"&:hover\": {\r\n textDecoration: \"none\",\r\n },\r\n },\r\n arrow: {\r\n fontSize: 16,\r\n fontWeight: 500,\r\n },\r\n poweredByContainer: {\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n alignItems: \"center\",\r\n alignSelf: \"flex-start\",\r\n },\r\n monomark: {\r\n width: 30,\r\n height: 30,\r\n marginRight: 7,\r\n },\r\n monomarkWhite: {\r\n background: `url(${process.env.PUBLIC_URL}/images/icons/sparrow-connected-monomark-white.svg)`,\r\n },\r\n monomarkRed: {\r\n background: `url(${process.env.PUBLIC_URL}/images/icons/sparrow-connected-monomark.svg)`,\r\n },\r\n poweredBy: {\r\n fontWeight: 400,\r\n fontStyle: \"normal\",\r\n fontSize: 12,\r\n color: \"#ADB7C1\",\r\n },\r\n engageContainer: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n margin: \"auto\",\r\n },\r\n needHelp: {\r\n color: \"#D7D7D7\",\r\n \"&:hover,&:focus,&:link,&:visited,&:active\": {\r\n color: \"#D7D7D7\",\r\n },\r\n },\r\n linksContainer: {\r\n marginTop: 15,\r\n textAlign: \"center\",\r\n fontSize: 14,\r\n },\r\n underline: {\r\n textDecoration: \"underline\",\r\n },\r\n separator: {\r\n textDecoration: \"none\",\r\n marginLeft: 7,\r\n marginRight: 7,\r\n fontSize: 16,\r\n color: \"#D7D7D7\",\r\n },\r\n font10: {\r\n fontSize: 10,\r\n },\r\n })\r\n);\r\n\r\nconst LoginLayout: React.FunctionComponent<PropsWithRedux> = ({ children, helpLinks = false }) => {\r\n const classes = useStyles();\r\n const isBootstrapSmallAndAbove = useMediaQuery(\"(min-width: 576px)\");\r\n const isBootstrapExtraSmall = useMediaQuery(\"(max-width: 575px)\");\r\n\r\n // responsive font logic\r\n const stopFont10 = useMediaQuery(\"(min-width: 670px)\");\r\n const useFont10Small = useMediaQuery(\"(max-width: 390px\");\r\n const useFont10Large = useMediaQuery(\"(min-width: 576px)\");\r\n const useFont10 = !stopFont10 && (useFont10Small || useFont10Large);\r\n\r\n // helper function to render powered by icon and text\r\n const poweredByText = (iconClass: string) => (\r\n <div className={classes.poweredByContainer}>\r\n <div className={`${classes.monomark} ${iconClass}`}></div>\r\n <span className={classes.poweredBy}>Powered by Sparrow Connected</span>\r\n </div>\r\n );\r\n\r\n return (\r\n <div id=\"login-layout-container\" className={classes.main}>\r\n {isBootstrapSmallAndAbove && (\r\n <div className={`${classes.col} ${classes.leftCol}`}>\r\n <div className={classes.engageContainer}>\r\n <span className={classes.engageText}>Be in-the-know. Discover.</span>\r\n <span className={classes.engageText}>Engage. Explore.</span>\r\n <a\r\n id=\"whats-new-text\"\r\n className={classes.whatsNew}\r\n href=\" https://support.sparrowconnected.com/en/product-updates\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n >\r\n WHAT'S NEW\r\n <span className={classes.arrow}>→</span>\r\n </a>\r\n </div>\r\n {poweredByText(classes.monomarkRed)}\r\n </div>\r\n )}\r\n <div className={`${classes.col} ${classes.rightCol}`}>\r\n <div className={classes.formContainer}>\r\n <div className={classes.form}>{children}</div>\r\n {helpLinks && (\r\n <div className={`${classes.linksContainer} ${useFont10 && classes.font10}`}>\r\n <a\r\n href=\"https://support.sparrowconnected.com/en/forgot-email-or-username\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className={`${classes.underline} ${classes.needHelp}`}\r\n >\r\n I don't know my email or user ID\r\n </a>\r\n <span className={classes.separator}> | </span>\r\n <a\r\n href=\"https://support.sparrowconnected.com/en/sign-in-screen-explained\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className={`${classes.underline} ${classes.needHelp}`}\r\n >\r\n Why am I seeing this?\r\n </a>\r\n </div>\r\n )}\r\n </div>\r\n {isBootstrapExtraSmall && poweredByText(classes.monomarkWhite)}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\ninterface ComponentProps {\r\n helpLinks?: boolean;\r\n}\r\n\r\nconst connector = connect((state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n}));\r\ntype PropsWithRedux = ConnectedProps<typeof connector> & RouteComponentProps;\r\n\r\nexport default withRouter(connector(LoginLayout));\r\n","import React, { useState } from \"react\";\r\nimport Select, { OptionsType } from \"react-select\";\r\nimport { injectIntl, FormattedMessage, IntlShape } from \"react-intl\";\r\n\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport useIsMounted from \"modules/common/hooks/useIsMounted\";\r\nimport LoginLayout from \"routes/_layout/login/loginLayout\";\r\nimport { Button, Divider, Theme } from \"@mui/material\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport useSignOut from \"modules/common/hooks/useSignOut\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport tenantManagementUtils, { ISelectOpt } from \"utils/tenantManagementUtils\";\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n primaryButton: {\r\n backgroundColor: \"#3b78ab\",\r\n \"&:hover\": {\r\n backgroundColor: \"rgb(41, 84, 119)\",\r\n },\r\n marginTop: 25,\r\n width: \"100%\",\r\n },\r\n divider: {\r\n marginTop: 40,\r\n },\r\n picker: {\r\n marginTop: 5,\r\n },\r\n buttonLink: {\r\n fontWeight: \"normal\",\r\n color: \"rgb(59, 120, 171)\",\r\n textDecoration: \"underline\",\r\n background: \"transparent\",\r\n textTransform: \"none\",\r\n marginTop: 35,\r\n \"&:hover\": {\r\n background: \"transparent\",\r\n textDecoration: \"underline\",\r\n },\r\n alignSelf: \"center\",\r\n width: 200,\r\n },\r\n })\r\n);\r\n\r\nconst TenantSelection: React.FunctionComponent<PropsWithRedux> = (props) => {\r\n const [fetching, setFetching] = useState<boolean>(true);\r\n const [tenantOpts, setTenantOpts] = useState<OptionsType<ISelectOpt>>();\r\n const [selectedTenantId, setSelectedTenantId] = useState<string>();\r\n const isMounted = useIsMounted();\r\n const classes = useStyles();\r\n const { signOut, isSigningOut } = useSignOut();\r\n\r\n // load tenants into state\r\n React.useEffect(() => {\r\n const loadTenants = async () => {\r\n // run setup, and navigate to the tenant page only if user belongs to a single tenant\r\n const res = await tenantManagementUtils.setupTenantUserData();\r\n \r\n // if there is more than 1 tenant for the user, setup won't fully run so we can set options for user to choose\r\n if (isMounted() && res.length >= 1) {\r\n setTenantOpts(res);\r\n // default selection to first in list\r\n if (res.length > 0) setSelectedTenantId(res[0].value);\r\n setFetching(false);\r\n }\r\n };\r\n\r\n loadTenants();\r\n }, [isMounted]);\r\n\r\n // handle continue click\r\n const onContinue = () => {\r\n if (!selectedTenantId) return;\r\n\r\n tenantManagementUtils.setTenantUserDataAndNav(selectedTenantId, true);\r\n };\r\n\r\n // handle tenant selection change\r\n const onSelectChange = (option: any) => {\r\n setSelectedTenantId(option.value as string);\r\n };\r\n\r\n return (\r\n <LoginLayout>\r\n {fetching || isSigningOut ? (\r\n <div>\r\n <Loading style={{ color: \"#ADB7C1\" }} />\r\n <div\r\n style={{\r\n marginTop: \"20px\",\r\n color: \"#ffffff\",\r\n margin: \"0 auto\",\r\n width: \"215px\",\r\n }}\r\n >\r\n <FormattedMessage id=\"common.assemblingAnalytics\" defaultMessage=\"Assembling Your Analytics\" />\r\n {\"...\"}\r\n </div>\r\n </div>\r\n ) : tenantOpts ? (\r\n tenantOpts.length > 0 ? (\r\n <>\r\n <label>\r\n <FormattedMessage id={\"common.selectOrganization\"} defaultMessage={\"Select your organization\"} />\r\n </label>\r\n <div className=\"select-wrapper\">\r\n <Select\r\n options={tenantOpts}\r\n isDisabled={false}\r\n placeholder={\" \"}\r\n value={tenantOpts.find((o) => o.value === selectedTenantId)}\r\n onChange={onSelectChange}\r\n isMulti={false}\r\n isClearable={false}\r\n backspaceRemovesValue={false}\r\n className={classes.picker}\r\n components={{\r\n IndicatorSeparator: () => null,\r\n }}\r\n />\r\n </div>\r\n <Button\r\n color=\"primary\"\r\n variant=\"contained\"\r\n className={classes.primaryButton}\r\n onClick={onContinue}\r\n disabled={!selectedTenantId}\r\n >\r\n CONTINUE\r\n </Button>\r\n <Divider className={classes.divider} />\r\n <Button className={classes.buttonLink} onClick={signOut}>\r\n Sign out & switch accounts\r\n </Button>\r\n </>\r\n ) : (\r\n <div className=\"options-wrapper\">\r\n <p className=\"disabled-wrapper\">\r\n <FormattedMessage\r\n id={\"common.accountDisabled\"}\r\n defaultMessage={\"Your account may have been disabled. Please talk to your Sparrow Administrator.\"}\r\n />\r\n </p>\r\n </div>\r\n )\r\n ) : null}\r\n </LoginLayout>\r\n );\r\n};\r\n\r\ninterface ComponentProps {\r\n intl: IntlShape;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n })\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default injectIntl(connector(TenantSelection));\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { withRouter, RouteComponentProps } from \"react-router\";\r\nimport TenantSelection from \"modules/tenant/components/tenantSelection\";\r\nimport { SetTenantIdAction } from \"modules/tenant/actions\";\r\nimport { useMsal, useIsAuthenticated } from \"@azure/msal-react\";\r\nimport { InteractionStatus, RedirectRequest } from \"@azure/msal-browser\";\r\n\r\nimport MsalAuthModule from \"./msalAuthModule\";\r\nimport useQueryParams, { QUERY_PARAM_KEYS } from \"modules/common/hooks/useQueryParams\";\r\nimport Cookies from \"utils/cookie\";\r\n\r\nconst RequireLogin: React.FunctionComponent<PropsWithRedux> = (props) => {\r\n const isAuthenticated = useIsAuthenticated();\r\n const { inProgress } = useMsal();\r\n const query = useQueryParams();\r\n\r\n React.useEffect(() => {\r\n /**\r\n * Helper to build login request configs to send to b2c\r\n */\r\n const getMSALRedirectConfig = (): RedirectRequest => {\r\n let config = {} as RedirectRequest;\r\n let signedOutSuccess = query.get(QUERY_PARAM_KEYS.SIGNED_OUT_SUCCESS);\r\n config.extraQueryParameters = { signedOutSuccess: signedOutSuccess || \"false\" };\r\n\r\n return config;\r\n };\r\n\r\n const tryLoginAsync = async () => {\r\n // If a user is not logged in and authentication is not already in progress, invoke login\r\n if (!isAuthenticated && inProgress === InteractionStatus.None) {\r\n let redirectConfig = getMSALRedirectConfig();\r\n await MsalAuthModule.getInstance().login(redirectConfig);\r\n }\r\n }\r\n\r\n tryLoginAsync();\r\n }, [isAuthenticated, inProgress, query]);\r\n\r\n const tenantId = checkTenantId() || props.tenantId;\r\n if (tenantId) props.SetTenantId(tenantId);\r\n\r\n return (\r\n <>\r\n {isAuthenticated &&\r\n <>\r\n {tenantId ? props.children : <TenantSelection />}\r\n </>\r\n }\r\n </>\r\n );\r\n};\r\n\r\nconst checkTenantId = (): string | undefined => {\r\n let tenantCookie = Cookies.get(\"tenantId\");\r\n return tenantCookie;\r\n};\r\n\r\ninterface ComponentProps { }\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id,\r\n }),\r\n {\r\n SetTenantId: (tenantId: string) => SetTenantIdAction({ tenantId }),\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default withRouter(connector(RequireLogin));\r\n","import * as React from \"react\";\r\nimport { withRouter, RouteComponentProps } from \"react-router\";\r\n\r\nconst IFrameDetector: React.FunctionComponent<ComponentProps & RouteComponentProps> = (props) => {\r\n \r\n const isInIFrame = window !== window.parent && !window.opener;\r\n \r\n if((isInIFrame && props.renderWhen === 'InFrame') || (!isInIFrame && props.renderWhen === 'NotInFrame')){\r\n return (<>{props.children}</>);\r\n }else {\r\n return null;\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n renderWhen: 'InFrame' | 'NotInFrame'\r\n}\r\n\r\nexport default withRouter(IFrameDetector);","import * as React from \"react\";\r\nimport { FlaggedComment } from \"../models\";\r\nimport \"./flaggedItemsManagement.sass\";\r\nimport LoadingSpinner from \"modules/common/components/loadingSpinner\";\r\nimport { FormattedMessage } from \"react-intl\";\r\n\r\ninterface Props {\r\n commentItem: FlaggedComment\r\n ignoreClick: (id: string) => any\r\n deleteClick: (id: string, isReply: boolean) => any\r\n moderationEnabled: boolean\r\n processingIgnore: string | null\r\n processingDelete: string | null\r\n tenantId: string\r\n}\r\n\r\nexport default class FlaggedListItem extends React.Component<Props, {}> {\r\n\r\n private openPost = () => {\r\n window.open(`/${this.props.tenantId}/posts/${this.props.commentItem.postId}`, '_blank', 'noopener,noreferrer');\r\n }\r\n\r\n public render() {\r\n let options = { year: 'numeric', month: 'long', day: 'numeric' }\r\n let comment = this.props.commentItem;\r\n let date = comment.flaggingLastIgnoredAt? new Date(comment.flaggingLastIgnoredAt.toString()) : new Date();\r\n //need to use new date to be able to use toLocaleDateString\r\n return <tr key={this.props.commentItem.commentId}>\r\n <td className=\"item-info\">\r\n <div className=\"item-wrapper\">\r\n <span>{comment.commentAuthor}: </span>\r\n <span style={{fontStyle: \"italic\"}}>\r\n \"{comment.commentBody}\"\r\n </span>\r\n {comment.parentText && \r\n <div style={{paddingLeft: \"10%\", marginTop: \"12px\", color: \"grey\"}}>\r\n {`Replied to ${comment.parentAuthor}: \"${comment.parentText}\"`}\r\n </div>\r\n }\r\n </div>\r\n <hr style={{marginLeft: '10px', marginRight: '15px'}} />\r\n <div className=\"stats-wrapper\">\r\n <label><FormattedMessage id=\"activity.flaggingLastIgnored\" defaultMessage=\"Flagging Last Ignored On\" />:</label> \r\n <span>{ comment.flaggingLastIgnoredAt ? date.toLocaleDateString (undefined, options as any) : '-' }</span>\r\n <label style={{marginLeft: \"45px\"}}><FormattedMessage id=\"activity.totalFlags\" defaultMessage=\"Total Flags\" />:</label> \r\n <span>{ comment.totalFlagActions }</span>\r\n <label style={{marginLeft: \"45px\"}}><FormattedMessage id=\"activity.flagsLastIgnored\" defaultMessage=\"Flags Since Last Ignored\" />:</label> \r\n <span>{ comment.flagActionsSinceLastIgnored }</span>\r\n </div>\r\n </td>\r\n\r\n <td className=\"actions\">\r\n <div style={{textAlign: 'center', marginTop: '5px', marginBottom: '5px'}}>\r\n <button className=\"btn flagActionBtn\"\r\n style={{backgroundColor: '#F4B032'}} \r\n onClick={() => this.props.ignoreClick(comment.commentId)}\r\n disabled={this.props.processingIgnore === this.props.commentItem.commentId}>\r\n {\r\n this.props.processingIgnore === this.props.commentItem.commentId?\r\n <LoadingSpinner size={'14px'} />\r\n : <span>\r\n <FormattedMessage id=\"flagging.ignoreFlags\" defaultMessage=\"Ignore Flags\" />\r\n <i className=\"material-icons\" style={{verticalAlign: \"top\", fontSize: \"16px\", marginLeft: '4px'}}>pan_tool</i>\r\n </span>\r\n }\r\n \r\n </button>\r\n <button className=\"btn flagActionBtn\"\r\n style={{backgroundColor: '#F4B032'}}\r\n disabled={this.props.processingDelete === this.props.commentItem.commentId || this.props.processingIgnore === this.props.commentItem.commentId}\r\n onClick={() => this.openPost()}>\r\n {\r\n <FormattedMessage id=\"flagging.goToPost\" defaultMessage=\"Go to post\" />\r\n }\r\n <i className=\"material-icons\" style={{verticalAlign: \"top\", fontSize: \"16px\", marginLeft: '4px'}}>arrow_forward</i>\r\n\r\n </button> \r\n <button className=\"btn flagActionBtn\"\r\n style={{backgroundColor: this.props.moderationEnabled ? '#d9534f' : '#CCCCCC', color: this.props.moderationEnabled? '' : '#9B9797', cursor: this.props.moderationEnabled? '' : 'default' }}\r\n disabled={!this.props.moderationEnabled || this.props.processingDelete === this.props.commentItem.commentId}\r\n onClick={() => this.props.deleteClick(comment.commentId, (!!comment.parentText && comment.parentText !== \"\"))}>\r\n {\r\n this.props.processingDelete === this.props.commentItem.commentId?\r\n <LoadingSpinner size={'14px'} />\r\n : <FormattedMessage id=\"flagging.deleteComment\" defaultMessage=\"Delete Comment\" />\r\n }\r\n <i className=\"material-icons\" style={{verticalAlign: \"top\", fontSize: \"16px\", marginLeft: '4px'}}>delete</i>\r\n </button> \r\n </div>\r\n </td>\r\n </tr>\r\n }\r\n\r\n}","import * as React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport InfiniteScrollView from \"modules/common/components/table-view/components/infinite-scroll-view\";\r\nimport Loading from 'modules/common/components/loading';\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport TenantLink from 'modules/common/components/tenantLink';\r\nimport {FormattedMessage} from \"react-intl\";\r\n\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport { FlaggedComment } from \"../models\";\r\nimport FlaggedListItem from \"./flaggedListItem\";\r\nimport \"./flaggedItemsManagement.sass\";\r\nimport { activityApi, commentApi } from 'api/instances';\r\n\r\nclass FlaggedItemsManagement extends React.Component<PropsWithRedux, State> {\r\n private _isMounted = false;\r\n\r\n constructor(props)\r\n {\r\n super(props);\r\n this.state = {\r\n fetchingItems: false,\r\n processingIgnoreAction: null,\r\n processingDeleteAction: null,\r\n flaggedItems: []\r\n }\r\n }\r\n \r\n public componentDidMount() { \r\n this._isMounted = true;\r\n this.fetchFlaggedItems(); \r\n }\r\n\r\n public componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n\r\n private shouldShowLoadingOverlay = () => {\r\n return this.state.fetchingItems || this.props.fetchingSettings;\r\n }\r\n\r\n public render() {\r\n let itemData = {}\r\n this.state.flaggedItems.forEach(item => {\r\n itemData[item.commentId] = item\r\n })\r\n\r\n const loadMoreFallback = (\r\n <div>\r\n <p style={{textAlign: 'center'}}>\r\n {\r\n this.state.fetchingItems?\r\n <span>Loading...</span>\r\n : <button className=\"load-fallback\" onClick={() => \r\n this.fetchFlaggedItems()}>Load More</button>\r\n }\r\n </p>\r\n </div>\r\n );\r\n\r\n return(\r\n <div>\r\n {\r\n this.props.moderationEnabled || this.shouldShowLoadingOverlay() ? null :\r\n <p style={{marginLeft: '3%', marginBottom: '20px'}} className=\"alert-info wrapped\">If you want to moderate flagged items, moderation must be enabled. Moderation can be enabled \r\n by turning on \"Allow Owners to delete Comments\" <TenantLink to=\"~/admin/settings\">here</TenantLink> \r\n </p>\r\n }\r\n {\r\n this.shouldShowLoadingOverlay() ? null :\r\n <InfiniteScrollView\r\n usesWindowScroll={true}\r\n distanceThreshold={500}\r\n hasNext={false}//todo when we move to using continuation\r\n loading={this.state.fetchingItems && !this.shouldShowLoadingOverlay()}\r\n onThresholdCrossed={this.threshHoldCrossed} //todo when we move to using continuation\r\n loadingBlockRenderer={() => this.shouldShowLoadingOverlay() ? null : <Loading padding={12} />}\r\n loadingBlockFallbackRenderer={() => loadMoreFallback}\r\n >\r\n <table className=\"items-table\">\r\n <thead>\r\n <tr>\r\n <th>\r\n <FormattedMessage id=\"activity.commentInfo\" defaultMessage=\"Comment Information\" />\r\n </th>\r\n <th> \r\n <FormattedMessage id=\"activity.actions\" defaultMessage=\"Actions\" />\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {\r\n this.state.flaggedItems.length === 0 && !this.state.fetchingItems ?\r\n <tr>\r\n <td colSpan={2} style={{padding: '10px', textAlign: 'center'}}>\r\n There are currently no flagged comments\r\n </td>\r\n </tr>\r\n : this.state.flaggedItems.map(item =>\r\n <FlaggedListItem \r\n key={item.commentId}\r\n commentItem={item} \r\n ignoreClick={this.IgnoreFlaggedItem}\r\n deleteClick={this.DeleteComment}\r\n moderationEnabled={this.props.moderationEnabled}\r\n processingIgnore={this.state.processingIgnoreAction}\r\n processingDelete={this.state.processingDeleteAction}\r\n tenantId={this.props.tenantId}/>\r\n )\r\n }\r\n\r\n </tbody>\r\n </table>\r\n </InfiniteScrollView>\r\n }\r\n <LoadingOverlay absolute={true} show={this.shouldShowLoadingOverlay()} />\r\n </div>\r\n );\r\n }\r\n\r\n private threshHoldCrossed = () => null //todo when we move to using continuation\r\n\r\n private fetchFlaggedItems = () => {\r\n this.setState(prev => ({...prev, fetchingItems: true }));\r\n activityApi.GetFlaggedItems()\r\n .then(flaggedItems => {\r\n if (this._isMounted) {\r\n this.setState(prev => ({...prev, flaggedItems, fetchingItems: false}) )\r\n }\r\n })\r\n .catch(err => {\r\n this.setState(prev => ({...prev, fetchingItems: false }));\r\n }) \r\n }\r\n\r\n private IgnoreFlaggedItem = (id: string) => {\r\n this.setState(prev => ({...prev, processingIgnoreAction: id }));\r\n let updatedFlaggedList = this.state.flaggedItems.filter(i => i.commentId !== id);\r\n activityApi.IgnoreFlag(id)\r\n .then(result => {\r\n this.setState(prev => ({...prev, flaggedItems: updatedFlaggedList, processingIgnoreAction: null }));\r\n })\r\n .catch(err => {\r\n if (err.response.status === 404 || err.response.status === 400) {\r\n this.setState(prev => ({...prev, flaggedItems: updatedFlaggedList, processingIgnoreAction: null }));\r\n }\r\n else {\r\n this.setState(prev => ({...prev, processingIgnoreAction: null }));\r\n }\r\n }) \r\n }\r\n\r\n private DeleteComment = (id: string) => {\r\n this.setState(prev => ({...prev, processingDeleteAction: id }));\r\n let updatedFlaggedList = this.state.flaggedItems.filter(i => i.commentId !== id);\r\n\r\n commentApi.DeleteComment(id)\r\n .then(_ => {\r\n this.setState(prev => ({...prev, flaggedItems: updatedFlaggedList, processingDeleteAction: null }));\r\n })\r\n .catch(err => {\r\n if (err.response.status === 404) {\r\n this.setState(prev => ({...prev, flaggedItems: updatedFlaggedList, processingDeleteAction: null }));\r\n }\r\n else {\r\n this.setState(prev => ({...prev, processingDeleteAction: null }));\r\n }\r\n })\r\n }\r\n}\r\n\r\ninterface State {\r\n fetchingItems: boolean\r\n flaggedItems: FlaggedComment[]\r\n processingIgnoreAction: string | null\r\n processingDeleteAction: string | null\r\n}\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps)=>({ \r\n ...ownProps,\r\n moderationEnabled: state.settings.tenantSettings.commentModerationEnabled,\r\n fetchingSettings: state.settings.fetching,\r\n tenantId: state.tenant.id\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(FlaggedItemsManagement);","import * as React from \"react\"\r\nimport { ActivityTab } from \"../models\";\r\n// import ActivityLog from \"./activityLog\";\r\nimport FlaggedItemsManagement from \"./flaggedItemsManagement\";\r\nimport { FormattedMessage } from \"react-intl\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as actions from '../actionCreator';\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Header from \"pages/common/header\";\r\nimport MainContent from \"pages/common/mainContent\";\r\n\r\n\r\nclass ActivityManagementPage extends React.Component<PropsWithRedux, {}> {\r\n\r\n public componentDidMount() {\r\n (window as any).scrollTo(0, 0);\r\n }\r\n\r\n public render() {\r\n return (\r\n <BasePage fullWidth>\r\n <Header\r\n title=\"Activity Tools\"\r\n />\r\n <MainContent>\r\n <div className=\"activity-page\">\r\n <div className=\"tabs\">\r\n <ul className=\"tab-btns\">\r\n {/* Commented out due to activity log not functioning properly.\r\n <li>\r\n <span className={`tab-btn ${this.props.activeTab === ActivityTab.ActivityLog && \"active\"}`}\r\n onClick={() => this.props.setActiveTab(ActivityTab.ActivityLog)}>\r\n <FormattedMessage id=\"common.activityLog\" defaultMessage=\"Activity Log\" />\r\n </span>\r\n </li>\r\n */} \r\n <li>\r\n <span className={`tab-btn ${this.props.activeTab === ActivityTab.FlaggedItems && \"active\"}`}\r\n onClick={() => this.props.setActiveTab(ActivityTab.FlaggedItems)}>\r\n <FormattedMessage id=\"common.flaggedItems\" defaultMessage=\"Flagged Comments\" />\r\n </span>\r\n </li>\r\n </ul>\r\n {/* Commented out due to activity log not functioning properly.\r\n <div className={`tab non-list-view ${this.props.activeTab === ActivityTab.ActivityLog && \"active\"}`}>\r\n <ActivityLog />\r\n </div>\r\n */}\r\n <div className={`tab non-list-view ${this.props.activeTab === ActivityTab.FlaggedItems && \"active\"}`}>\r\n <FlaggedItemsManagement />\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </MainContent>\r\n </BasePage>\r\n );\r\n }\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n activeTab: state.activity.activeTab\r\n }),\r\n {\r\n setActiveTab: actions.setActiveTab\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(ActivityManagementPage)","import React, { useRef, useState } from \"react\";\r\n\r\nimport Popover from \"@mui/material/Popover\";\r\n\r\nimport WarningIcon from \"@mui/icons-material/Warning\";\r\n\r\n\r\nimport \"./infoHover.sass\";\r\n\r\n\r\nconst WarningHover: React.FC<ComponentProps> = ({ children, labelText }) => {\r\n const [showPopover, setShowPopover] = useState(false);\r\n const popoverRef = useRef(null);\r\n\r\n return (\r\n <div\r\n onMouseEnter={() => setShowPopover(true)}\r\n onMouseLeave={() => setShowPopover(false)}\r\n ref={popoverRef}\r\n >\r\n <WarningIcon\r\n style={{ color: \"#e6911a\" }}\r\n className=\"warning-icon\"\r\n />\r\n <span style={{paddingLeft: \"5px\", position: \"relative\", top: \"-6px\", fontSize: \"14px\"}}>{labelText}</span>\r\n <Popover\r\n open={showPopover}\r\n anchorEl={popoverRef.current}\r\n anchorOrigin={{\r\n vertical: \"bottom\",\r\n horizontal: \"right\"\r\n }}\r\n transformOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"right\"\r\n }}\r\n PaperProps={{\r\n onMouseEnter: () => setShowPopover(true),\r\n onMouseLeave: () => setShowPopover(false),\r\n style: {\r\n maxWidth: 250\r\n }\r\n }}\r\n style={{ pointerEvents: \"none\" }}\r\n onClose={() => setShowPopover(false)}\r\n classes={{\r\n paper: \"warning-icon-description\"\r\n }}\r\n >\r\n {children}\r\n </Popover>\r\n </div>\r\n )\r\n}\r\n\r\ninterface ComponentProps {\r\n labelText: string;\r\n}\r\n\r\nexport default WarningHover;","import React from \"react\";\r\nimport moment from \"moment\";\r\nimport numeral from \"numeral\";\r\n\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\nimport WarningHover from \"modules/common/components/hovers/warningHover\";\r\n\r\nimport { AccountType, UserDetails, UserEdit, UserRole } from \"../../models\";\r\n\r\nimport Divider from \"@mui/material/Divider\";\r\n\r\nimport CalendarTodayOutlinedIcon from \"@mui/icons-material/CalendarTodayOutlined\";\r\nimport DescriptionIcon from \"@mui/icons-material/Description\";\r\nimport { Button } from \"@mui/material\";\r\nimport OpenInNew from \"@mui/icons-material/OpenInNew\";\r\nimport { useDefaultLocale } from \"modules/common/hooks/useDefaultLocale\";\r\n\r\n\r\nconst Account: React.FunctionComponent<ComponentProps> = props => {\r\n useDefaultLocale();\r\n\r\n const getAccountType = (accountType: AccountType) => {\r\n switch (accountType) {\r\n case \"adfs\":\r\n return \"ADFS\";\r\n case \"apple\":\r\n return \"Apple\";\r\n case \"default\":\r\n return \"Pending\";\r\n case \"facebook\":\r\n return \"Facebook\";\r\n case \"google\":\r\n return \"Google\";\r\n case \"linkedIn\":\r\n return \"LinkedIn\";\r\n case \"microsoft\":\r\n return \"Microsoft Personal\";\r\n case \"sparrow\":\r\n return \"Sparrow account\";\r\n case \"work\":\r\n return \"Work account\";\r\n default:\r\n return accountType;\r\n }\r\n }\r\n\r\n const getRoleName = (role: UserRole) => {\r\n switch(role) {\r\n case 1:\r\n return \"Author\";\r\n case 2:\r\n return \"Owner\";\r\n case 3: \r\n return \"User\";\r\n default:\r\n return \"Default\";\r\n } \r\n }\r\n\r\n const { userDetails } = props;\r\n const userRole = getRoleName(userDetails.permissionDetails.role);\r\n \r\n return (\r\n <div className=\"account-info\">\r\n <div>\r\n {!props.isEnabled &&\r\n <div style={{float: \"right\"}}>\r\n <WarningHover labelText=\"Deactivated\">Deactivating an account revokes a user's access to your organization's Sparrow app, portals and/or intranet.</WarningHover>\r\n {/* <span style={{paddingLeft: \"5px\", position: \"relative\", top: \"-6px\"}}>Deactivated</span> */}\r\n </div>\r\n }\r\n {!!userDetails.name &&\r\n <div className=\"avatar\">\r\n <div style={{ backgroundColor: userDetails.avatar }} className=\"avatar-icon-container\">\r\n <div className=\"avatar-letter\">{userDetails.initials}</div>\r\n </div>\r\n </div>\r\n }\r\n <div className=\"user-info\">\r\n <div>\r\n <div className=\"full-name\">{userDetails.name || \"[Name Not Provided]\"}</div>\r\n </div>\r\n </div>\r\n <div className=\"email\">{userDetails.email}</div>\r\n <div style={{display: \"flex\"}}>\r\n <div className=\"email\" style={{alignSelf: \"end\"}}>{userRole}</div>\r\n <Button style={{marginLeft: \"auto\"}} color=\"primary\" endIcon={<OpenInNew/>} onClick={props.onOpenDrawer}>View Permissions</Button>\r\n </div>\r\n </div>\r\n <div>\r\n <Divider light />\r\n <div className=\"account-data\">\r\n {userDetails.created !== \"0001-01-01T00:00:00+00:00\" &&\r\n <div>\r\n <div>Member since</div>\r\n <div>{moment(userDetails.created).format(\"MMM D, YYYY\")}</div>\r\n </div>\r\n }\r\n <div className=\"account-type\">\r\n <div>Account type</div>\r\n <div>{getAccountType(userDetails.accountType)}</div>\r\n </div>\r\n <div>\r\n <div>\r\n Views\r\n <InfoHover>Number of times this user has viewed all posts and events, respectively.</InfoHover>\r\n </div>\r\n <div className=\"interaction-stats\">\r\n <div>\r\n <DescriptionIcon fontSize=\"small\" />\r\n {numeral(userDetails.dataDetails.postViews).format(\"0,0\")}\r\n </div>\r\n <div>\r\n <CalendarTodayOutlinedIcon fontSize=\"small\" />\r\n {numeral(userDetails.dataDetails.eventViews).format(\"0,0\")}\r\n </div>\r\n </div>\r\n </div>\r\n <div>\r\n <div>\r\n Reads\r\n <InfoHover>Number of times this user has completely read all posts and events, respectively.</InfoHover>\r\n </div>\r\n <div className=\"interaction-stats\">\r\n <div>\r\n <DescriptionIcon fontSize=\"small\" />\r\n {numeral(userDetails.dataDetails.postReads).format(\"0,0\")}\r\n </div>\r\n <div>\r\n <CalendarTodayOutlinedIcon fontSize=\"small\" />\r\n {numeral(userDetails.dataDetails.eventReads).format(\"0,0\")}\r\n </div>\r\n </div>\r\n </div>\r\n <div>\r\n <div>Reactions</div>\r\n <div className=\"interaction-stats\">\r\n <div>\r\n <DescriptionIcon fontSize=\"small\" />\r\n {numeral(userDetails.dataDetails.reactions).format(\"0,0\")}\r\n </div>\r\n </div>\r\n </div>\r\n <div>\r\n <div>Comments</div>\r\n <div className=\"interaction-stats\">\r\n <div>\r\n <DescriptionIcon fontSize=\"small\" />\r\n {numeral(userDetails.dataDetails.comments).format(\"0,0\")}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n userDetails: UserDetails;\r\n isEnabled: boolean;\r\n onOpenDrawer: () => void;\r\n onChangeUser: (value: Partial<UserEdit>) => void;\r\n}\r\n\r\nexport default Account;","import React from \"react\";\r\n\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport ConditionalWrapper from \"modules/common/components/conditionalWrapper\";\r\n\r\ninterface InputFieldProps {\r\n description?: string;\r\n label: string;\r\n error?: boolean;\r\n value: string;\r\n placeholder?: string;\r\n refreshable?: boolean;\r\n multiline?: boolean;\r\n disabled?: boolean;\r\n required?: boolean;\r\n helperText?: string;\r\n onChange?: (event: any) => void;\r\n}\r\n\r\nconst InputField: React.FunctionComponent<InputFieldProps> = ({\r\n refreshable = false,\r\n ...props\r\n}) => {\r\n return (\r\n <div className=\"section-field\">\r\n <div className=\"section-input-field-heading\">\r\n {props.required ? <label className={\"control-label\"}>{props.label}</label> : <label>{props.label}</label>}\r\n </div>\r\n <div className=\"section-input-field\">\r\n <ConditionalWrapper condition={refreshable} wrapper={(children) => <div key={props.value}>{children}</div>}>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n error={props.error}\r\n defaultValue={props.value}\r\n placeholder={props.disabled ? \"\" : props.placeholder}\r\n multiline={props.multiline}\r\n rows={3}\r\n fullWidth\r\n helperText={props.helperText}\r\n autoComplete=\"off\"\r\n disabled={props.disabled}\r\n onChange={(event) => {\r\n if (!!props.onChange && event.target.value !== props.value)\r\n props.onChange(event);\r\n }}\r\n />\r\n </ConditionalWrapper>\r\n {props.description &&\r\n <Typography variant=\"caption\">{props.description}</Typography>\r\n }\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default InputField;\r\n","import React from \"react\";\r\n\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\n\r\ninterface InputFieldProps {\r\n description?: string;\r\n label: string;\r\n value: string;\r\n prefix: string;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n onChange?: (event: any) => void;\r\n}\r\n\r\nconst InputPrefixField: React.FunctionComponent<InputFieldProps> = props => {\r\n return (\r\n <div className=\"section-field\">\r\n <div className=\"section-input-field-heading\">\r\n <label>{props.label}</label>\r\n </div>\r\n <div className=\"section-input-field\">\r\n <div className=\"section-input-prefix-field\">\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={props.prefix}\r\n disabled={true}\r\n />\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n defaultValue={props.value}\r\n placeholder={props.disabled ? \"\" : props.placeholder}\r\n fullWidth\r\n autoComplete=\"off\"\r\n disabled={props.disabled}\r\n onChange={(event) => {\r\n if (!!props.onChange && event.target.value !== props.value)\r\n props.onChange(event);\r\n }}\r\n />\r\n </div>\r\n {props.description &&\r\n <Typography variant=\"caption\">{props.description}</Typography>\r\n }\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default InputPrefixField;","\r\n export function setVerify(event: string) {\r\n if(event.length >= 9) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n export function removeLeftoverCountryCode (event: string) {\r\n //In case the user puts nothing for input we don't want to just add a country code.\r\n if (event === \"+1\" || event === \"1\" || event === \"+\") { \r\n return event = \"\";\r\n }\r\n else {\r\n return event;\r\n }\r\n }\r\n","import React, { useEffect, useState } from \"react\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport PhoneInput from \"react-phone-input-2\";\r\nimport \"react-phone-input-2/lib/material.css\";\r\nimport { Button, Grid } from \"@mui/material\";\r\nimport { removeLeftoverCountryCode, setVerify } from \"utils/phoneInputFunctions\";\r\n\r\ninterface PhoneFieldProps {\r\n description?: string;\r\n label: string;\r\n value: string;\r\n country: string;\r\n enableSearch: boolean;\r\n autoFormat: boolean;\r\n changedDescription?: string;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n onChange?: (event: any) => void;\r\n onVerifySms: () => void;\r\n}\r\nconst PhoneInputField: React.FunctionComponent<PhoneFieldProps> = (props) => {\r\n const [isActive, setActive] = useState(false);\r\n const [isVerifyDisabled, setVerifyDisabled] = useState(false);\r\n \r\n const focusedColor = \"#E6911A\";\r\n const disabledColor = \"#3b78ab\";\r\n\r\n const styleInputClasses = \"MuiOutlinedInput-input MuiInputBase-inputMarginDense MuiOutlinedInput-inputMarginDense Mui-focused react-tel-input\";\r\n\r\n useEffect(() => {\r\n }, [isActive, isVerifyDisabled]);\r\n\r\n return (\r\n <div className=\"section-field\">\r\n <div className=\"section-input-field-heading\">\r\n <label>{props.label}</label>\r\n </div>\r\n <div className=\"section-input-field\">\r\n <PhoneInput\r\n inputClass={ styleInputClasses }\r\n inputStyle={{ boxShadow: \"none\", border: isActive && !props.disabled ? \"solid 2px\" + focusedColor : \"\", width: \"100%\", padding: \"10.5px 14.5px 10.5px 50px\" }}\r\n searchStyle={{ width: \"93%\", padding: \"4px\", height: \"40px\", maxHeight: \"100%\" }}\r\n dropdownStyle={{ maxHeight: \"320px\" }}\r\n searchPlaceholder=\"Search country\"\r\n key={props.value}\r\n autoFormat={props.autoFormat}\r\n country={props.country}\r\n value={props.value}\r\n enableSearch={props.enableSearch}\r\n placeholder={props.disabled ? \"\" : props.placeholder}\r\n disabled={props.disabled}\r\n specialLabel=\"\"\r\n onFocus={() => setActive(true)}\r\n onChange={(event) => {\r\n setVerifyDisabled(setVerify(event));\r\n event = removeLeftoverCountryCode(event);\r\n\r\n if (!!props.onChange && event !== props.value) {\r\n props.onChange(event);\r\n }\r\n }}\r\n onBlur={() => {\r\n setActive(false);\r\n }}\r\n />\r\n <Grid justifyContent=\"space-between\" container >\r\n <Grid item>\r\n {props.description && (\r\n <Typography style={{ color: isActive ? focusedColor : \"\" }} variant=\"caption\">\r\n {isActive ? props.changedDescription : props.description}\r\n </Typography>\r\n )}\r\n </Grid>\r\n <Grid item>\r\n <Button disabled={isVerifyDisabled} onClick={props.onVerifySms} style={{ color: isVerifyDisabled ? \"\" : disabledColor, height: '20px', textDecoration: \"underline\", background: \"transparent\", fontSize: \"11px\" }}>\r\n Verify mobile number\r\n </Button>\r\n </Grid>\r\n </Grid>\r\n </div>\r\n </div>\r\n );\r\n};\r\nexport default PhoneInputField;","import React, { useState } from \"react\";\r\n\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport InputAdornment from \"@mui/material/InputAdornment\";\r\nimport OutlinedInput from \"@mui/material/OutlinedInput\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport VisibilityIcon from \"@mui/icons-material/Visibility\";\r\nimport VisibilityOffIcon from \"@mui/icons-material/VisibilityOff\";\r\n\r\n\r\ninterface InputFieldProps {\r\n description?: string;\r\n label: string;\r\n value: string;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n onChange?: (event: any) => void;\r\n error?: boolean;\r\n}\r\n\r\nconst PasswordInputField: React.FunctionComponent<InputFieldProps> = props => {\r\n const [showPassword, setShowPassword] = useState(false);\r\n\r\n return (\r\n <div className=\"section-field\">\r\n <div className=\"section-input-field-heading\">\r\n <label>{props.label}</label>\r\n </div>\r\n <div className=\"section-input-field\">\r\n <FormControl variant=\"outlined\" size=\"small\" fullWidth>\r\n <OutlinedInput\r\n error={props.error}\r\n type={showPassword ? \"text\" : \"password\"}\r\n value={props.value}\r\n placeholder={props.placeholder}\r\n fullWidth\r\n autoComplete=\"off\"\r\n onChange={(event) => {\r\n if (!!props.onChange && event.target.value !== props.value)\r\n props.onChange(event);\r\n }}\r\n endAdornment={\r\n <InputAdornment position=\"end\">\r\n <IconButton\r\n aria-label=\"toggle password visibility\"\r\n onClick={() => setShowPassword(!showPassword)}\r\n onMouseDown={(event) => event.preventDefault()}\r\n size=\"large\">\r\n {showPassword ? <VisibilityOffIcon /> : <VisibilityIcon />}\r\n </IconButton>\r\n </InputAdornment>\r\n }\r\n />\r\n {props.description &&\r\n <Typography variant=\"caption\">{props.description}</Typography>\r\n }\r\n </FormControl>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default PasswordInputField;","import React, { useState } from \"react\";\r\n\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Select from \"@mui/material/Select\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\n\r\ninterface InputFieldProps {\r\n description?: string;\r\n label: string;\r\n value: string;\r\n items: { value: string; text: string; }[];\r\n disabled?: boolean;\r\n onChangeValue: (value: string) => void;\r\n}\r\n\r\nconst CustomPronouns = (pronouns: string): boolean => {\r\n return pronouns !== \"he/him/his\" && pronouns !== \"she/her/hers\" && pronouns !== \"they/them/their\";\r\n}\r\n\r\nconst PronounsInputField: React.FunctionComponent<InputFieldProps> = props => {\r\n const pronouns = props.value.split(\"/\");\r\n const isCustom = CustomPronouns(props.value) && pronouns.length === 3;\r\n\r\n const [selectedPronouns, setSelectedPronouns] = useState(!!props.value ? isCustom ? [\"custom\"] : props.value.split(\",\") : []);\r\n const [firstPronoun, setFirstPronoun] = useState(isCustom ? pronouns[0] : \"\");\r\n const [secondPronoun, setSecondPronoun] = useState(isCustom ? pronouns[1] : \"\");\r\n const [thirdPronoun, setThirdPronoun] = useState(isCustom ? pronouns[2] : \"\");\r\n\r\n return (\r\n <div className=\"section-field\">\r\n <div className=\"section-input-field-heading\">\r\n <label>{props.label}</label>\r\n </div>\r\n <div className=\"section-input-field\">\r\n <FormControl variant=\"outlined\" size=\"small\" fullWidth>\r\n <Select\r\n variant=\"outlined\"\r\n value={selectedPronouns}\r\n multiple\r\n displayEmpty\r\n fullWidth\r\n disabled={props.disabled}\r\n renderValue={(selected: string[]) =>\r\n !selected.length\r\n ? \"Select all that apply\"\r\n : selected[0] === \"custom\"\r\n ? \"My pronouns are...\"\r\n : selected.join(\", \")\r\n }\r\n onChange={(event) => {\r\n if ((event.target.value as string[])[(event.target.value as string[]).length - 1] === \"custom\") {\r\n setSelectedPronouns([\"custom\"]);\r\n props.onChangeValue(\"\");\r\n } else {\r\n const updatedPronouns = (event.target.value as string[]).filter(pronoun => pronoun !== \"custom\");\r\n setSelectedPronouns(updatedPronouns);\r\n props.onChangeValue(updatedPronouns.join(\",\"));\r\n }\r\n }}\r\n >\r\n {props.items.map(item => <MenuItem key={item.value} value={item.value}>{item.text}</MenuItem>)}\r\n <MenuItem value=\"custom\">My pronouns are...</MenuItem>\r\n </Select>\r\n {!!selectedPronouns.length && selectedPronouns[0] === \"custom\" &&\r\n <div className=\"section-input-pronouns-field\">\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={firstPronoun}\r\n autoComplete=\"off\"\r\n onChange={(event) => {\r\n setFirstPronoun(event.target.value);\r\n props.onChangeValue(event.target.value + \"/\" + secondPronoun + \"/\" + thirdPronoun);\r\n }}\r\n />\r\n <div>/</div>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={secondPronoun}\r\n autoComplete=\"off\"\r\n onChange={(event) => {\r\n setSecondPronoun(event.target.value);\r\n props.onChangeValue(firstPronoun + \"/\" + event.target.value + \"/\" + thirdPronoun);\r\n }}\r\n />\r\n <div>/</div>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={thirdPronoun}\r\n autoComplete=\"off\"\r\n onChange={(event) => {\r\n setThirdPronoun(event.target.value);\r\n props.onChangeValue(firstPronoun + \"/\" + secondPronoun + \"/\" + event.target.value);\r\n }}\r\n />\r\n </div>\r\n }\r\n </FormControl>\r\n {props.description &&\r\n <Typography variant=\"caption\">{props.description}</Typography>\r\n }\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default PronounsInputField;","import React, { useState } from \"react\";\r\n\r\nimport Callout from \"modules/common/components/callout\";\r\n\r\nimport { UserDetailsAudience } from \"../../models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\n\r\n\r\nconst EditAudiences: React.FunctionComponent<ComponentProps> = props => {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const [audiences, setAudiences] = useState(props.audiences);\r\n const [calloutOpen, setCalloutOpen] = useState(false);\r\n\r\n return (\r\n <React.Fragment>\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n startIcon={<AddIcon />}\r\n onClick={(event: any) => {\r\n setAudiences(props.audiences);\r\n setAnchorEl(event.currentTarget);\r\n setCalloutOpen(true);\r\n }}\r\n >\r\n Edit audiences\r\n </Button>\r\n <Callout\r\n anchorEl={anchorEl} \r\n setOpen={(toSet) => {\r\n props.onChange(audiences);\r\n setCalloutOpen(toSet);\r\n }}\r\n open={calloutOpen}\r\n >\r\n <List disablePadding className=\"audiences\">\r\n {!props.availableAudiences.length &&\r\n <div>No available audiences found</div>\r\n }\r\n {props.availableAudiences.map((audience) =>\r\n <ListItem key={audience.id} dense button disabled={audience.audienceType === \"smart\" || !audience.isEditable} onClick={() => {\r\n const hasSelectedAudience: boolean = audiences.findIndex((selectedAudience) => selectedAudience.id === audience.id) !== -1;\r\n if (hasSelectedAudience)\r\n setAudiences(audiences.filter((selectedAudience) => selectedAudience.id !== audience.id));\r\n else\r\n setAudiences(audiences.concat([{ ...audience, isEditable: true, isIncluded: true }]));\r\n }}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={audiences.findIndex((selectedAudience) => selectedAudience.id === audience.id) !== -1}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={`${audience.title || \"\"} (${audience.totalUsers})`} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </Callout>\r\n </React.Fragment>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n audiences: UserDetailsAudience[];\r\n availableAudiences: UserDetailsAudience[];\r\n onChange: (audiences: UserDetailsAudience[]) => void;\r\n}\r\n\r\nexport default EditAudiences;","import * as React from \"react\";\r\n\r\nimport { UserDetails, UserDetailsAudience, UserEdit } from \"../../models\";\r\n\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\nimport InputField from \"../common/inputField\";\r\nimport InputPrefixField from \"../common/inputPrefixField\";\r\nimport PhoneInputField from \"../common/phoneInputField\";\r\nimport PasswordInputField from \"../common/passwordInputField\";\r\nimport PronounsInputField from \"../common/pronounsInputField\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport ButtonGroup from \"@mui/material/ButtonGroup\";\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport Chip from \"@mui/material/Chip\";\r\n\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport EditAudiences from \"../common/editAudiences\";\r\n\r\nclass ProfileDetails extends React.Component<IProfileDetailsProps, IProfileDetailsState> {\r\n constructor(props: IProfileDetailsProps) {\r\n super(props);\r\n\r\n this.state = {\r\n currentTab: \"standard\",\r\n showMoreTopics: false,\r\n showMoreAudiences: false,\r\n smsPhone: props.userDetails.standardDetails.smsPhone,\r\n userId: props.userDetails.localId.startsWith(props.localAccountPrefix) ? props.userDetails.localId.replace(props.localAccountPrefix, \"\") : props.userDetails.localId,\r\n };\r\n }\r\n\r\n public render() {\r\n const { userDetails } = this.props;\r\n const showTopicsOption: boolean = this.checkShouldShowTopicsOption(userDetails.standardDetails.subscribedTags);\r\n const showAudiencesOption: boolean = this.checkShouldShowAudiencesOption(this.props.selectedAudiences);\r\n\r\n return (\r\n <React.Fragment>\r\n <div className=\"section-heading\">\r\n <Typography variant=\"h2\">Profile Details</Typography>\r\n {!!userDetails.customDetails.length &&\r\n <ButtonGroup variant=\"outlined\">\r\n <Button variant={this.state.currentTab === \"standard\" ? \"contained\" : \"outlined\"} color=\"primary\" onClick={() => this.setState({ currentTab: \"standard\" })}>Standard Fields</Button>\r\n <Button variant={this.state.currentTab === \"custom\" ? \"contained\" : \"outlined\"} color=\"primary\" onClick={() => this.setState({ currentTab: \"custom\" })}>Custom Fields</Button>\r\n </ButtonGroup>\r\n }\r\n </div>\r\n {this.state.currentTab === \"standard\" &&\r\n <React.Fragment>\r\n <section>\r\n <InputField\r\n label={\"First Name\"}\r\n required={true}\r\n error={this.props.errorFirstname}\r\n helperText={this.props.errorFirstname ? \"Enter first name\" : ''}\r\n value={userDetails.standardDetails.firstName}\r\n disabled={userDetails.accountCategory !== \"social\" && userDetails.accountCategory !== \"sparrow\"}\r\n onChange={this.onChangeFirstName}\r\n />\r\n <InputField\r\n label=\"Preferred Name\"\r\n value={userDetails.standardDetails.preferredName}\r\n disabled={true}\r\n />\r\n <InputField\r\n label={\"Last Name\"}\r\n required={true}\r\n error={this.props.errorLastname}\r\n helperText={this.props.errorLastname ? \"Enter last name\" : ''}\r\n value={userDetails.standardDetails.lastName}\r\n disabled={userDetails.accountCategory !== \"social\" && userDetails.accountCategory !== \"sparrow\"}\r\n onChange={this.onChangeLastName}\r\n />\r\n <InputField\r\n label=\"Email\"\r\n required={true}\r\n value={userDetails.standardDetails.email}\r\n disabled={userDetails.accountCategory !== \"sparrow\"}\r\n onChange={this.onChangeEmail}\r\n />\r\n <InputField\r\n label=\"Employee Id\"\r\n value={userDetails.standardDetails.employeeId}\r\n onChange={this.onChangeEmployeeId}\r\n />\r\n <PhoneInputField\r\n changedDescription=\"Saving a new number will ask the user to re-subscribe to SMS notifications and alerts via SMS.\"\r\n description=\"If changed, user is required to opt-in the new mobile number to receive SMS notifications.\"\r\n label=\"Mobile No.\"\r\n value={userDetails.standardDetails.smsPhone}\r\n country={\"us\"}\r\n enableSearch={true}\r\n autoFormat={true}\r\n disabled={this.props.userDetails.isWorkAccount}\r\n placeholder=\"Enter mobile number\"\r\n onChange={this.onChangePreferredSMSPhone}\r\n onVerifySms={this.sendSMSVerifyMessage}\r\n />\r\n </section>\r\n {userDetails.accountCategory === \"sparrow\" &&\r\n <React.Fragment>\r\n <Divider light />\r\n <section>\r\n <form>\r\n <Disclaimer\r\n icon={<InfoOutlinedIcon />}\r\n text=\"The Password can only be changed for Sparrow Accounts.\"\r\n />\r\n {/* only show prefix for v1 sparrow accounts where we do not do auto prefixing (note below) (i.e. sign in with pre-fix + user id) */}\r\n {/* for specific tenants (Belden at time of writing) we handle the prefix behind the scenes using a custom portal url subdomain */}\r\n {userDetails.isLocalIdValidEmail || window.location.host.split(\".\")[0].toLowerCase() === this.props.localAccountPrefix.toLowerCase()\r\n ? <InputField\r\n required={true}\r\n disabled={true}\r\n label=\"User ID\"\r\n refreshable\r\n value={userDetails.isLocalIdValidEmail ? userDetails.localId : this.state.userId}\r\n />\r\n : <InputPrefixField\r\n label=\"User ID\"\r\n value={this.state.userId}\r\n prefix={this.props.localAccountPrefix}\r\n disabled={true}\r\n />}\r\n <PasswordInputField\r\n error={this.props.errorPassword}\r\n label=\"Password\"\r\n value={this.props.password}\r\n placeholder=\"Change password\"\r\n onChange={this.onChangePassword}\r\n description=\"Password must be 8-32 characters long and must contain at least one capital letter, one special character and one number.\"\r\n />\r\n </form>\r\n </section>\r\n </React.Fragment>\r\n }\r\n <Divider light />\r\n <section>\r\n <InputField\r\n label=\"Title\"\r\n value={userDetails.standardDetails.title.value}\r\n disabled={!userDetails.standardDetails.title.isEditable}\r\n onChange={this.onChangeTitle}\r\n />\r\n <InputField\r\n label=\"Reports to\"\r\n value={userDetails.standardDetails.reportsTo.value}\r\n disabled={!userDetails.standardDetails.reportsTo.isEditable}\r\n onChange={this.onChangeReportsTo}\r\n />\r\n <InputField\r\n label=\"Office Location\"\r\n value={userDetails.standardDetails.officeLocation.value}\r\n disabled={!userDetails.standardDetails.officeLocation.isEditable}\r\n onChange={this.onChangeLocation}\r\n />\r\n <InputField\r\n label=\"Country\"\r\n value={userDetails.standardDetails.country.value}\r\n disabled={!userDetails.standardDetails.country.isEditable}\r\n onChange={this.onChangeCountry}\r\n />\r\n <InputField\r\n label=\"Region\"\r\n value={userDetails.standardDetails.region.value}\r\n disabled={!userDetails.standardDetails.region.isEditable}\r\n onChange={this.onChangeRegion}\r\n />\r\n <PronounsInputField\r\n label=\"Pronouns\"\r\n value={userDetails.standardDetails.pronouns.value}\r\n items={[\r\n { value: \"she/her/hers\", text: \"she/her/hers\" },\r\n { value: \"he/him/his\", text: \"he/him/his\" },\r\n { value: \"they/them/their\", text: \"they/them/their\" }\r\n ]}\r\n disabled={!userDetails.standardDetails.pronouns.isEditable}\r\n onChangeValue={this.onChangePronouns}\r\n />\r\n <InputField\r\n label=\"Bio\"\r\n value={userDetails.standardDetails.bio.value}\r\n multiline\r\n disabled={!userDetails.standardDetails.bio.isEditable}\r\n onChange={this.onChangeBio}\r\n />\r\n </section>\r\n {!!userDetails &&\r\n <React.Fragment>\r\n <Divider light />\r\n <section>\r\n <div className=\"section-heading\">\r\n <Typography variant=\"h2\">Audiences<InfoHover>These are audiences that this user/account is included in.</InfoHover></Typography>\r\n <EditAudiences audiences={this.props.selectedAudiences} availableAudiences={this.props.includableAudiences} onChange={this.props.onChangeAudiences} />\r\n </div>\r\n <div id=\"subscribed-tags-bubbles\">\r\n {!this.state.showMoreAudiences &&\r\n <React.Fragment>\r\n {this.props.selectedAudiences.slice(0, 9).map((audience, index) => {\r\n return (\r\n <Chip\r\n className=\"chip-styling\"\r\n key={audience.id}\r\n label={`${audience.title} (${audience.totalUsers})`}\r\n onDelete={() => this.removeAudience(audience)}\r\n deleteIcon={<CloseIcon fontSize=\"small\"/>}\r\n />\r\n )\r\n })}\r\n {this.props.selectedAudiences.length === 10 &&\r\n <Chip\r\n className=\"chip-styling\"\r\n key={this.props.selectedAudiences[9].id}\r\n label={`${this.props.selectedAudiences[9].title} (${this.props.selectedAudiences[9].totalUsers})`}\r\n onDelete={() => this.removeAudience(this.props.selectedAudiences[9])}\r\n deleteIcon={<CloseIcon fontSize=\"small\"/>}\r\n />\r\n }\r\n {this.props.selectedAudiences.length > 10 &&\r\n <Chip\r\n className=\"chip-styling\"\r\n label={`+${this.props.selectedAudiences.length - 10}`}\r\n />\r\n }\r\n </React.Fragment>\r\n }\r\n {this.state.showMoreAudiences &&\r\n <React.Fragment>\r\n {this.props.selectedAudiences.map((audience, index) => {\r\n return (\r\n <Chip\r\n className=\"chip-styling\"\r\n key={audience.id}\r\n label={`${audience.title} (${audience.totalUsers})`}\r\n onDelete={() => this.removeAudience(audience)}\r\n deleteIcon={<CloseIcon fontSize=\"small\"/>}\r\n />\r\n )\r\n })}\r\n </React.Fragment>\r\n }\r\n </div>\r\n {showAudiencesOption &&\r\n <div className=\"show-more-topics-option\">\r\n {this.state.showMoreAudiences\r\n ? <Button variant=\"text\" color=\"primary\" onClick={() => this.setState({ showMoreAudiences: false })}>See less audiences</Button>\r\n : <Button variant=\"text\" color=\"primary\" onClick={() => this.setState({ showMoreAudiences: true })}>See all audiences</Button>\r\n }\r\n </div>\r\n }\r\n </section>\r\n </React.Fragment>\r\n }\r\n\r\n {!!userDetails.standardDetails.subscribedTags.length &&\r\n <React.Fragment>\r\n <Divider light />\r\n <section>\r\n <div className=\"section-heading\">\r\n <Typography variant=\"h2\">Topic Subscriptions<InfoHover>This user is a subscriber of the following topics. *Mandatory topics the user is required to subscribe to, set through the Topic settings</InfoHover></Typography>\r\n </div>\r\n <div id=\"subscribed-tags-bubbles\">\r\n {userDetails.standardDetails.subscribedTags.map((tagGroup) => {\r\n return (\r\n <div key={tagGroup.id} className=\"tag-group\">\r\n <div className=\"tag-group-name\">{tagGroup.name}</div>\r\n <div>\r\n {tagGroup.tags.slice(0, 4).map((tag, index) => (\r\n <Chip\r\n className=\"chip-styling\"\r\n key={tag.id}\r\n label={`${tag.name}${tag.isMandatory ? \"*\" : \"\" }`}\r\n />\r\n ))}\r\n {tagGroup.tags.length === 5 &&\r\n <Chip\r\n className=\"chip-styling\"\r\n key={tagGroup.tags[4].id}\r\n label={`${tagGroup.tags[4].name} ${tagGroup.tags[4].isMandatory ? \"*\" : \"\"}`}\r\n />\r\n }\r\n {tagGroup.tags.length > 5 &&\r\n <React.Fragment>\r\n <Collapse in={this.state.showMoreTopics}>\r\n {tagGroup.tags.slice(4).map((tag) => (\r\n <Chip\r\n className=\"chip-styling\"\r\n key={tag.id}\r\n label={`${tag.name}${tag.isMandatory ? \"*\" : \"\"}`}\r\n />\r\n ))}\r\n </Collapse>\r\n <Collapse appear={true} in={!this.state.showMoreTopics}>\r\n <Chip\r\n className=\"chip-styling\"\r\n key={`${tagGroup.id}-more`}\r\n label={`+${tagGroup.tags.length - 4}`}\r\n />\r\n </Collapse>\r\n </React.Fragment>\r\n }\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n {showTopicsOption &&\r\n <div className=\"show-more-topics-option\">\r\n {this.state.showMoreTopics\r\n ? <Button variant=\"text\" color=\"primary\" onClick={() => this.setState({ showMoreTopics: false })}>See less topics</Button>\r\n : <Button variant=\"text\" color=\"primary\" onClick={() => this.setState({ showMoreTopics: true })}>See all topics</Button>\r\n }\r\n </div>\r\n }\r\n </section>\r\n </React.Fragment>\r\n }\r\n </React.Fragment>\r\n }\r\n {this.state.currentTab === \"custom\" &&\r\n <section>\r\n <Disclaimer\r\n icon={<InfoOutlinedIcon />}\r\n text=\"Custom fields are added details synced from your human resource information system (HRIS).\"\r\n />\r\n {userDetails.customDetails.map((customDetail) =>\r\n <InputField\r\n key={customDetail.key}\r\n label={customDetail.title}\r\n value={customDetail.value}\r\n disabled={true}\r\n />\r\n )}\r\n </section>\r\n }\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private checkShouldShowTopicsOption = (topics): boolean => {\r\n return !!topics.find((tagGroup) => tagGroup.tags.length > 5);\r\n }\r\n\r\n private checkShouldShowAudiencesOption = (audiences): boolean => {\r\n return audiences.length > 5;\r\n }\r\n\r\n private removeAudience = (audienceToRemove) => {\r\n let newAudiences = this.props.selectedAudiences.filter(s => s.id !== audienceToRemove.id);\r\n this.props.onChangeAudiences(newAudiences);\r\n }\r\n\r\n private onChangeBio = (event) => {\r\n this.props.onChangeUser({ bio: event.target.value });\r\n }\r\n\r\n private onChangeCountry = (event) => {\r\n this.props.onChangeUser({ country: event.target.value });\r\n }\r\n\r\n private onChangeFirstName = (event) => {\r\n this.props.onChangeUser({ firstName: event.target.value });\r\n }\r\n\r\n private onChangeLastName = (event) => {\r\n this.props.onChangeUser({ lastName: event.target.value });\r\n }\r\n\r\n private onChangePassword = (event) => {\r\n this.props.onChangePassword(event.target.value);\r\n }\r\n\r\n private onChangeEmployeeId = (event) => {\r\n this.props.onChangeUser({ employeeId: event.target.value });\r\n }\r\n\r\n private onChangePreferredSMSPhone = (event) => {\r\n this.props.onChangeUser({ smsPhone: event });\r\n }\r\n\r\n private onChangePronouns = (pronouns: string) => {\r\n this.props.onChangeUser({ pronouns });\r\n }\r\n\r\n private onChangeRegion = (event) => {\r\n this.props.onChangeUser({ region: event.target.value });\r\n }\r\n\r\n private onChangeReportsTo = (event) => {\r\n this.props.onChangeUser({ reportsTo: event.target.value });\r\n }\r\n\r\n private onChangeTitle = (event) => {\r\n this.props.onChangeUser({ title: event.target.value });\r\n }\r\n\r\n private onChangeEmail = (event) => {\r\n this.props.onChangeUser({ email: event.target.value });\r\n }\r\n\r\n private onChangeLocation = (event) => {\r\n this.props.onChangeUser({ officeLocation: event.target.value });\r\n }\r\n\r\n private sendSMSVerifyMessage = () => {\r\n this.props.onSMSVerifyMessage(this.props.userDetails.id);\r\n };\r\n}\r\n\r\n\r\ninterface IProfileDetailsProps {\r\n localAccountPrefix: string;\r\n password: string;\r\n userDetails: UserDetails;\r\n onChangePassword: (password: string) => void;\r\n onChangeUser: (value: Partial<UserEdit>) => void;\r\n onChangeAudiences: (selectedAudiences: UserDetailsAudience[]) => void;\r\n onSMSVerifyMessage: (id: string) => void;\r\n errorPassword: boolean;\r\n includableAudiences: UserDetailsAudience[];\r\n selectedAudiences: UserDetailsAudience[];\r\n errorFirstname: boolean;\r\n errorLastname: boolean;\r\n syncLevel: string;\r\n}\r\n\r\ninterface IProfileDetailsState {\r\n currentTab: \"standard\" | \"custom\";\r\n showMoreTopics: boolean;\r\n showMoreAudiences: boolean;\r\n smsPhone: string;\r\n userId: string;\r\n}\r\n\r\nexport default ProfileDetails;\r\n","import React, { useRef, useState } from \"react\";\r\n\r\nimport Popover from \"@mui/material/Popover\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\n\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n message: {\r\n color: \"#666666\",\r\n fontSize: 12,\r\n fontStyle: \"italic\",\r\n marginTop: 15,\r\n textDecoration: \"underline\"\r\n }\r\n })\r\n);\r\n\r\n\r\nconst UnableToEditMessage: React.FunctionComponent<{}> = props => {\r\n const [showPopover, setShowPopover] = useState(false);\r\n const popoverRef = useRef(null);\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n <React.Fragment>\r\n <div\r\n ref={popoverRef}\r\n onMouseEnter={() => setShowPopover(true)}\r\n onMouseLeave={() => setShowPopover(false)}\r\n className={classes.message}\r\n >\r\n Why can't I edit other fields or delete this account?\r\n </div>\r\n <Popover\r\n open={showPopover}\r\n anchorEl={popoverRef.current}\r\n anchorOrigin={{\r\n vertical: \"bottom\",\r\n horizontal: \"left\"\r\n }}\r\n transformOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"left\"\r\n }}\r\n PaperProps={{\r\n onMouseEnter: () => setShowPopover(true),\r\n onMouseLeave: () => setShowPopover(false),\r\n style: {\r\n maxWidth: 250\r\n }\r\n }}\r\n style={{ pointerEvents: \"none\" }}\r\n onClose={() => setShowPopover(false)}\r\n classes={{\r\n paper: \"help-text-description\"\r\n }}\r\n >\r\n Profiles and details synced from a third-party provider cannot be edited or deleted through Sparrow.\r\n </Popover>\r\n </React.Fragment>\r\n );\r\n}\r\n\r\nexport default UnableToEditMessage;","import React from \"react\";\r\n\r\nimport MoreOptionsButton from \"modules/common/components/buttons/moreOptionsButton\";\r\n\r\nimport List from \"@mui/material/List\";\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\nimport { UserDetails } from \"modules/users/models\";\r\nimport CalloutHover from \"modules/common/components/hovers/calloutHover\";\r\n\r\n\r\nconst MoreUserProfileOptions: React.FunctionComponent<ComponentProps> = props => {\r\n if(!props.userDetails)\r\n return <React.Fragment></React.Fragment>\r\n\r\n return (\r\n <React.Fragment>\r\n <MoreOptionsButton text=\"More Options\">\r\n <List disablePadding style={{width: \"162px\"}}>\r\n {props.userDetails.accountCategory === \"work\" && \r\n <CalloutHover\r\n component={\r\n <MoreOptionsItem\r\n text=\"Delete\"\r\n onClick={() => {}} //Component requires a function but I'll leave it blank.\r\n disabled={true}\r\n />\r\n }\r\n >\r\n <div className=\"disabled-button-message\">\r\n Work accounts added from your {props.syncType} Directory and synced through an {props.syncType} Group cannot be deleted. Disable the account to revoke access from this account.\r\n </div>\r\n </CalloutHover>\r\n }\r\n {props.userDetails.accountCategory !== \"work\" && \r\n <MoreOptionsItem\r\n text=\"Delete\"\r\n textStyle={{color: \"#B72026\"}}\r\n onClick={props.deleteUser}\r\n />\r\n }\r\n {!props.enabledStatus &&\r\n <MoreOptionsItem\r\n text=\"Activate\"\r\n onClick={props.enableUser}\r\n />\r\n }\r\n {props.enabledStatus &&\r\n <MoreOptionsItem\r\n text=\"Deactivate\"\r\n onClick={props.disableUser}\r\n />\r\n }\r\n </List>\r\n </MoreOptionsButton>\r\n </React.Fragment>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n userDetails: UserDetails | undefined;\r\n syncType: string;\r\n enabledStatus: boolean;\r\n deleteUser: () => void;\r\n enableUser: () => void;\r\n disableUser: () => void;\r\n}\r\n\r\nexport default MoreUserProfileOptions;","import React, { useCallback } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport ArrowBack from \"@mui/icons-material/ArrowBack\";\r\nimport { Button, Divider, Drawer, Link, Snackbar, Switch, Typography } from \"@mui/material\";\r\nimport { makeStyles } from \"@mui/styles\";\r\nimport { PermissionDetails, UserDetails, UserRole } from \"modules/users/models\";\r\nimport confirm from \"utils/notyPopups\";\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport { TenantSettingsTag } from \"modules/settings\";\r\nimport { actions } from \"modules/users\";\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport { MultiSelectTopic } from \"modules/settings\";\r\nimport { USER_ROLE_DESCRIPTIONS } from \"modules/authorization/models\";\r\nimport TopicPermissionSection from \"./topicPermissionSection\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport { RoleSelector } from \"modules/common/components/forms/inputs/roleSelector\";\r\n\r\nimport \"./dialogStyling.sass\";\r\n\r\nconst useStyles = makeStyles({\r\n paper: {\r\n width: 850\r\n }\r\n});\r\n\r\nconst PermissionsDrawer: React.FunctionComponent<PropsWithRedux> = props => {\r\n //Wrap tag function in callback so we can access it in useEffect.\r\n const resolveCurrentUserTags = useCallback(() => {\r\n let allTags: TenantSettingsTag[] = [];\r\n props.topics.forEach(topicGroup => allTags = allTags.concat(topicGroup.tags)); //Create list of all tags.\r\n if (props.userData.permissionDetails && props.userData.permissionDetails.topics) {\r\n allTags = allTags.filter(t => props.userData.permissionDetails.topics.includes(t.id)); //Filter to just what's selected.\r\n }\r\n else {\r\n allTags = [];\r\n }\r\n return allTags;\r\n }, [props.topics, props.userData.permissionDetails]);\r\n\r\n const userRole = props.userData.permissionDetails.role;\r\n const currentTags = resolveCurrentUserTags();\r\n let freshClone: UserDetails = JSON.parse(JSON.stringify(props.userData));\r\n freshClone.permissionDetails.topics = currentTags.map(t => t.id);\r\n\r\n const [selectedRole, setSelectedRole] = React.useState<UserRole>(userRole);\r\n const [selectedTags, setSelectedTags] = React.useState<MultiSelectTopic[]>(currentTags); //Load from current user data.\r\n const [userClone, setUserClone] = React.useState<UserDetails>(freshClone); //Object used to keep track of local edits.\r\n const [isSaving, setIsSaving] = React.useState(false);\r\n const [errorMessage, setErrorMessage] = React.useState(\"\");\r\n const [isSubmissionManager, setIsSubmissionManager] = React.useState(props.userData.securityDetails.isSubmissionManager);\r\n\r\n\r\n //Reset dropdown when drawer is closed.\r\n React.useEffect(() => {\r\n if (!props.isOpen) {\r\n const userRole = props.userData.permissionDetails.role;\r\n setSelectedRole(userRole);\r\n setSelectedTags(resolveCurrentUserTags()); //Reset this to user data.\r\n }\r\n }, [props.isOpen, props.userData.permissionDetails.role, resolveCurrentUserTags]);\r\n\r\n // reset submission manager field when role selection changes\r\n React.useEffect(() => {\r\n if (selectedRole !== UserRole.AUTHOR && selectedRole !== UserRole.OWNER)\r\n setIsSubmissionManager(false);\r\n }, [selectedRole]);\r\n\r\n const classes = useStyles();\r\n\r\n const changesMade = () => {\r\n let currentUserTopics = props.userData.permissionDetails.topics ?? [];\r\n let selectedTagIds = selectedTags.map(t => t.id);\r\n\r\n //Check for role match.\r\n if (userClone.permissionDetails.role !== props.userData.permissionDetails.role) {\r\n return true;\r\n }\r\n\r\n //Check for topics mismatch\r\n else if (selectedTags.length !== currentUserTopics.length) {\r\n return true;\r\n }\r\n\r\n //If we make it here they're the same length, so we don't need to worry about checking both\r\n else if (!currentUserTopics.every(topic => selectedTagIds.includes(topic))) {\r\n return true;\r\n } else if (props.userData.securityDetails.isSubmissionManager !== isSubmissionManager) {\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n const closeDrawer = async () => {\r\n if (changesMade()) {\r\n if (await confirm.show({\r\n title: \"Back to User Profile\",\r\n text: \"You have unsaved permission changes.<br><br>Do you want to continue?\",\r\n yesText: \"Keep Editing\",\r\n noText: \"Exit Permissions\",\r\n })) {\r\n //Don't actually do anything except close the dialogue (which happens automatically).\r\n //Save only happens if they click the button.\r\n }\r\n else {\r\n props.closeDrawer();\r\n }\r\n }\r\n else {\r\n props.closeDrawer();\r\n }\r\n };\r\n\r\n const closeDrawerAndDisableUser = async () => {\r\n if (changesMade()) {\r\n if (await confirm.show({\r\n title: \"Back to User Profile\",\r\n text: \"You have unsaved permission changes.<br><br>Do you want to continue?\",\r\n yesText: \"Keep Editing\",\r\n noText: \"Exit Permissions\",\r\n })) {\r\n //Don't actually do anything except close the dialogue (which happens automatically).\r\n //Save only happens if they click the button.\r\n }\r\n else {\r\n props.closeDrawer();\r\n props.disableUser();\r\n }\r\n }\r\n else {\r\n props.closeDrawer();\r\n props.disableUser();\r\n }\r\n };\r\n\r\n //Update clone of user to have new role.\r\n const setNewRole = (toSet: UserRole) => {\r\n let toUpdate = userClone;\r\n toUpdate.permissionDetails.role = toSet;\r\n\r\n setSelectedRole(toSet);\r\n setUserClone(toUpdate);\r\n };\r\n\r\n const getSubmissionManagerSection = (role: UserRole) => <div>\r\n <div className=\"header\">Content Management</div>\r\n <div className=\"submission-manager\">\r\n <div>\r\n <div>Assign as a Submission Manager</div>\r\n <div>\r\n <Switch color=\"primary\" checked={isSubmissionManager} onChange={(ev, checked) => setIsSubmissionManager(checked)} />\r\n </div>\r\n </div>\r\n <Typography variant=\"caption\">Notify this {UserRole[role].toString()} when Content is submitted by a Contributor.</Typography>\r\n </div>\r\n </div>\r\n\r\n const savePermissions = () => {\r\n let userToSave: PermissionDetails = {\r\n role: selectedRole,\r\n topics: selectedTags.map(t => t.id),\r\n isSubmissionManager: isSubmissionManager\r\n };\r\n\r\n setIsSaving(true);\r\n\r\n props.updatePermissions(userToSave, props.userData.id).then((result) => {\r\n setIsSaving(false);\r\n if (!result) {\r\n setErrorMessage(\"Changes could not be saved. Please try again.\");\r\n return;\r\n }\r\n else {\r\n setUserClone(JSON.parse(JSON.stringify(props.userData))); //Update everything to saved new permissions.\r\n\r\n props.onSave(props.userData);\r\n }\r\n }).catch(err => {\r\n setErrorMessage(\"Changes could not be saved. Please try again.\");\r\n });\r\n };\r\n\r\n const isMissingInput = (): boolean =>\r\n selectedRole === UserRole.CONTRIBUTOR && selectedTags.length === 0;\r\n\r\n const saveButton = () => <Button\r\n style={{ marginLeft: \"auto\", height: \"35px\", width: \"75px\" }}\r\n color={\"primary\"}\r\n variant={\"contained\"}\r\n disabled={!changesMade() || isSaving || isMissingInput()}\r\n onClick={savePermissions}\r\n >\r\n Save\r\n </Button>;\r\n\r\n const getContentCreationSection = (role: UserRole) : JSX.Element =>\r\n <React.Fragment>\r\n <Divider style={{marginTop: \"12px\"}}/> \r\n <TopicPermissionSection\r\n role={selectedRole}\r\n topics={props.topics}\r\n selectedTopics={selectedTags}\r\n setSelectedTopics={setSelectedTags}\r\n defaultChipLabel={selectedRole === UserRole.CONTRIBUTOR ? \"Select at least 1 topic\" : undefined}\r\n />\r\n {role === UserRole.AUTHOR && <Divider/>}\r\n </React.Fragment>\r\n\r\n const getContentEngagementSection = () : JSX.Element =>\r\n <div>\r\n <div className=\"header\">Content Engagement</div>\r\n <span>\r\n All activated users in your Sparrow directory are able to sign in to the portal, and view and interact with any published content they have access to.\r\n  <Link onClick={closeDrawerAndDisableUser}>Deactivate the user</Link> to revoke their access.\r\n </span>\r\n </div>;\r\n\r\n return (\r\n <Drawer open={props.isOpen} anchor=\"right\" onClose={closeDrawer} classes={{ paper: classes.paper }}>\r\n <div style={{ padding: 20 }}>\r\n\r\n <div style={{ display: \"flex\", flexDirection: \"row\" }}>\r\n <ArrowBack className=\"close-modal-icon\" style={{ position: \"relative\", top: \"4px\" }} onClick={closeDrawer} />\r\n <h4 style={{ paddingLeft: \"14px\" }}>Permissions</h4>\r\n {\r\n isMissingInput() ?\r\n <HoverText\r\n style={{ marginLeft: \"auto\" }}\r\n label={saveButton()}\r\n >\r\n Complete required fields\r\n </HoverText>\r\n : saveButton()\r\n }\r\n </div>\r\n\r\n <Divider style={{ width: \"870px\", position: \"relative\", right: \"5%\", marginTop: \"12px\" }} />\r\n\r\n <div style={{ display: \"flex\", flexDirection: \"row\", marginTop: \"30px\", marginBottom: \"10px\" }}>\r\n <span style={{ paddingRight: \"35px\" }}>Role</span>\r\n <RoleSelector\r\n selectedRole={selectedRole}\r\n onSelectRole={setNewRole}\r\n selectStyle={{ position: \"relative\", top: -9 }}\r\n />\r\n </div>\r\n\r\n <React.Fragment>\r\n <Disclaimer\r\n icon={<InfoOutlinedIcon />}\r\n text={USER_ROLE_DESCRIPTIONS[selectedRole]}>\r\n </Disclaimer>\r\n\r\n {selectedRole !== UserRole.OWNER && getContentEngagementSection()}\r\n \r\n {\r\n (selectedRole === UserRole.AUTHOR\r\n || selectedRole === UserRole.CONTRIBUTOR)\r\n && getContentCreationSection(selectedRole)\r\n }\r\n {\r\n (selectedRole === UserRole.AUTHOR\r\n || selectedRole === UserRole.OWNER)\r\n && getSubmissionManagerSection(selectedRole)\r\n }\r\n {\r\n (selectedRole === UserRole.AUTHOR\r\n || selectedRole === UserRole.CONTRIBUTOR)\r\n && <Snackbar/>\r\n }\r\n </React.Fragment>\r\n </div>\r\n <ErrorSnackbar errorMessage={errorMessage} clearErrorMessage={() => setErrorMessage(\"\")} />\r\n </Drawer>\r\n );\r\n};\r\n\r\ninterface ComponentProps {\r\n isOpen: boolean;\r\n userData: UserDetails;\r\n closeDrawer: () => void;\r\n disableUser: () => void;\r\n onSave: (updatedUser: UserDetails) => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n topics: state.settings.tenantSettings.tagGroups\r\n }), {\r\n updatePermissions: actions.updatePermissions\r\n}\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(PermissionsDrawer);\r\n","import * as React from \"react\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport { push } from \"react-router-redux\";\r\nimport { actions } from \"../..\";\r\nimport moment from \"moment\";\r\n\r\nimport { audiencesApi, usersApi } from \"api/instances\";\r\n\r\nimport { UserDetails, UserEdit, UserDetailsAudience } from \"../../models\";\r\n\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport Account from \"./account\";\r\nimport ProfileDetails from \"./profileDetails\";\r\nimport UnableToEditMessage from \"./unableToEditMessage\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Breadcrumb from \"pages/common/breadcrumb\";\r\nimport Columns from \"pages/common/columns\";\r\nimport MainContent from \"pages/common/mainContent\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\n\r\nimport \"modules/profile/styles/profile.sass\";\r\nimport \"../../styles/userProfile.sass\";\r\nimport { passwordRegex } from \"../../../../utils/regexUserValidation\";\r\nimport MoreUserProfileOptions from \"./moreUserProfileOptions\";\r\nimport PermissionsDrawer from \"../dialogs/permissionsDrawer\";\r\nimport SuccessSnackbar from \"modules/common/components/snackbars/successSnackbar\";\r\n\r\n\r\ntype Tabs = \"details\" | \"settings\";\r\n\r\nclass UserProfilePage extends React.PureComponent<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.applyAudienceChanges = this.applyAudienceChanges.bind(this);\r\n\r\n this.state = {\r\n includableAudiences: [],\r\n user: {},\r\n userDetails: undefined,\r\n changedSinceSaved: false,\r\n password: \"\",\r\n selectedAudiences: [],\r\n selectedTab: \"details\",\r\n errorMessage: \"\",\r\n successMessage: \"\",\r\n loading: false,\r\n saving: false,\r\n errorPassword: false,\r\n errorFirstname: false,\r\n errorLastname: false,\r\n permissionsOpen: false,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n moment.locale(\"en\");\r\n\r\n this.setState({ loading: true });\r\n\r\n if (!!this.props.match.params.userId) {\r\n usersApi.GetUserById(this.props.match.params.userId)\r\n .then((response: UserDetails) => {\r\n if (response.accountType !== \"default\")\r\n this.setState({ selectedAudiences: response.securityDetails.audiences, userDetails: response, loading: false });\r\n else\r\n this.props.redirectTo(\"/\" + this.props.tenantId + \"/admin/users\");\r\n }).catch(() => {\r\n this.props.redirectTo(\"/\" + this.props.tenantId + \"/admin/users\");\r\n });\r\n\r\n usersApi.GetIncludableAudiences(this.props.match.params.userId)\r\n .then((response) => {\r\n this.setState({ includableAudiences: response });\r\n });\r\n } else {\r\n this.props.redirectTo(\"/\" + this.props.tenantId + \"/admin/users\");\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n this.setState({\r\n includableAudiences: [],\r\n selectedAudiences: [],\r\n user: {},\r\n userDetails: undefined,\r\n password: \"\",\r\n errorPassword: false,\r\n errorFirstname: false,\r\n errorLastname: false\r\n });\r\n }\r\n\r\n public render() {\r\n const { userDetails } = this.state;\r\n\r\n if (this.state.loading || !userDetails)\r\n return <Loading />;\r\n\r\n const name = userDetails.standardDetails.preferredName ? `${userDetails.standardDetails.lastName}, ${userDetails.standardDetails.firstName} (${userDetails.standardDetails.preferredName})` :\r\n userDetails.standardDetails.firstName && userDetails.standardDetails.lastName ? `${userDetails.standardDetails.lastName}, ${userDetails.standardDetails.firstName}` :\r\n \"[Name Not Provided]\";\r\n\r\n //Get the current state of the account WITH edits, rather than what's on the server.\r\n const enabledStatus = this.state.user.isEnabled ?? this.state.userDetails!.isEnabled;\r\n\r\n return (\r\n <BasePage fullWidth>\r\n <Breadcrumb\r\n items={[\r\n { title: \"Manage Users\", onClick: this.onBackToManageUsers },\r\n { title: `${name}` },\r\n ]}\r\n backItem={{ title: \"Back to Users & Permissions\", onClick: this.onBackToManageUsers }}\r\n rightComponent={\r\n <React.Fragment>\r\n <MoreUserProfileOptions\r\n userDetails={this.state.userDetails}\r\n syncType={this.props.syncType}\r\n deleteUser={this.deleteUser}\r\n disableUser={this.disableUser}\r\n enableUser={this.enableUser}\r\n enabledStatus={enabledStatus}\r\n />\r\n\r\n <Button variant=\"contained\" color=\"primary\" disabled={!userDetails || !this.state.changedSinceSaved || this.state.errorFirstname || this.state.errorLastname} onClick={this.saveChanges}>Save changes</Button>\r\n </React.Fragment>\r\n }\r\n />\r\n <Columns\r\n slim\r\n leftComponent={\r\n <div className=\"user-profile-left-column\">\r\n <MainContent id=\"user-account\" addPadding>\r\n <Account userDetails={userDetails!} onChangeUser={this.onChangeUser} isEnabled={enabledStatus} onOpenDrawer={this.openDrawer}/>\r\n <PermissionsDrawer isOpen={this.state.permissionsOpen} closeDrawer={this.closeDrawer} userData={this.state.userDetails!} onSave={this.updatePermissions} disableUser={this.disableUser}/>\r\n </MainContent>\r\n <UnableToEditMessage />\r\n </div>\r\n }\r\n rightComponent={\r\n <MainContent id=\"user-profile\" addPadding>\r\n <ProfileDetails\r\n localAccountPrefix={this.props.localAccountPrefix}\r\n password={this.state.password}\r\n errorPassword={this.state.errorPassword}\r\n errorFirstname={this.state.errorFirstname}\r\n errorLastname={this.state.errorLastname}\r\n userDetails={userDetails!}\r\n onChangePassword={this.onChangePassword}\r\n onChangeUser={this.onChangeUser}\r\n onSMSVerifyMessage={this.sendSMSVerifyMessage}\r\n onChangeAudiences={this.onChangeAudiences}\r\n selectedAudiences={this.state.selectedAudiences}\r\n includableAudiences={this.state.includableAudiences}\r\n syncLevel={this.props.syncLevel}\r\n />\r\n </MainContent>\r\n }\r\n />\r\n <LoadingOverlay absolute={true} show={this.state.saving} />\r\n <SuccessSnackbar successMessage={this.state.successMessage || \"\"} clearSuccessMessage={() => this.setState({ successMessage: \"\" })} />\r\n <ErrorSnackbar errorMessage={this.state.errorMessage} clearErrorMessage={this.onClearMessage} />\r\n </BasePage>\r\n );\r\n }\r\n\r\n private enableUser = () => {\r\n this.onChangeUser({ isEnabled: true });\r\n }\r\n\r\n private disableUser = () => {\r\n this.onChangeUser({ isEnabled: false });\r\n }\r\n\r\n\r\n private onBackToManageUsers = async () => {\r\n if (this.state.changedSinceSaved) {\r\n if (!(await confirm.show({\r\n title: \"Back to Users & Permissions\",\r\n text: (\r\n <div style={{ minWidth: 400 }}>\r\n <div style={{ fontWeight: 500 }}>Your changes will not be saved.</div>\r\n <br />\r\n <div>Do you want to continue?</div>\r\n </div>\r\n ),\r\n yesText: \"Keep editing\",\r\n noText: \"Exit\"\r\n }))) {\r\n this.setState({ changedSinceSaved: false });\r\n this.props.redirectTo(\"/\" + this.props.tenantId + \"/admin/users\");\r\n }\r\n } else {\r\n this.props.redirectTo(\"/\" + this.props.tenantId + \"/admin/users\");\r\n }\r\n }\r\n\r\n private onChangePassword = (password: string) => {\r\n this.setState({ changedSinceSaved: true, password });\r\n }\r\n\r\n private onChangeUser = (value: Partial<UserEdit>) => {\r\n if(this.state.errorFirstname || this.state.errorLastname) {\r\n this.onClearMessage();\r\n }\r\n this.setState({ changedSinceSaved: true, user: { ...this.state.user!, ...value }});\r\n }\r\n\r\n private onClearMessage = () => {\r\n this.setState({ errorMessage: \"\", errorPassword: false, errorFirstname: false, errorLastname: false });\r\n }\r\n\r\n private onChangeAudiences = (audiences: UserDetailsAudience[]) => {\r\n this.setState({ changedSinceSaved: true, selectedAudiences: audiences });\r\n }\r\n\r\n private deleteUser = async () => {\r\n if (await confirm.show({\r\n title: \"Delete user\",\r\n text: \"Are you sure you want to delete this user? You can't undo this action.\",\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\"\r\n })) {\r\n this.setState({ saving: true });\r\n usersApi.DeleteUser(this.state.userDetails!.id, this.state.userDetails!.accountCategory)\r\n .then(async () => {\r\n await confirm.show({\r\n title: \"User deleted\",\r\n text: (\r\n <div className=\"success-checkmark-pop-dialog\">\r\n <div className=\"success-checkmark-pop-wrapper\">\r\n <div className=\"success-checkmark-pop-bg\">\r\n <div className=\"success-checkmark-pop-checkmark\"></div>\r\n </div>\r\n </div>\r\n <div>This user has been successfully deleted.</div>\r\n </div>\r\n ),\r\n yesText: \"Ok\",\r\n hideNo: true\r\n });\r\n this.props.redirectTo(\"/\" + this.props.tenantId + \"/admin/users\");\r\n })\r\n .catch(() => {\r\n this.setState({ errorMessage: \"Something went wrong deleting this user. Please try again.\", saving: false });\r\n });\r\n }\r\n }\r\n\r\n\r\n private saveChanges = () => {\r\n this.setState({ saving: true });\r\n\r\n if(this.state.password === \"\" || this.state.password.match(passwordRegex)) {\r\n let user = this.state.user;\r\n let accountCategory = this.state.userDetails?.accountCategory === \"sparrow\" || this.state.userDetails?.accountCategory === \"social\";\r\n\r\n if(this.state.user.firstName === \"\" && accountCategory ) {\r\n this.setState({ errorFirstname: true, saving: false });\r\n }\r\n\r\n if(this.state.user.lastName === \"\" && accountCategory) {\r\n this.setState({ errorLastname: true, saving: false });\r\n }\r\n\r\n if(!this.state.errorFirstname && !this.state.errorLastname) {\r\n this.props.saveUser(this.state.userDetails!.id, user)\r\n .then((userDetails) => {\r\n this.setState({ changedSinceSaved: false, userDetails: userDetails || this.state.userDetails, saving: false });\r\n });\r\n\r\n /** NOTE: Remove this and uncomment the above code once addSubscribedTags and removeSubscribedTags has been updated to addSubscribedAudiences and removeSubscribedAudiences */\r\n if (this.state.userDetails!.securityDetails.audiences !== this.state.selectedAudiences) {\r\n audiencesApi.updateAudiencesForUser(this.state.selectedAudiences.map(audience => audience.id), this.state.userDetails!.id);\r\n }\r\n\r\n if (!!this.state.password) {\r\n usersApi.ResetLocalUserPassword(this.state.userDetails!.id, this.state.password).then(() => {\r\n this.setState({ password: \"\" });\r\n });\r\n }\r\n }\r\n } else {\r\n this.setState({ errorMessage:\"Password must be 8-32 characters long and must contain at least one capital letter, one special character and one number.\", errorPassword: true, saving: false });\r\n }\r\n }\r\n\r\n private applyAudienceChanges = (audiences: UserDetailsAudience[]) => {\r\n this.setState({ selectedAudiences: audiences });\r\n }\r\n\r\n private openDrawer = () => {\r\n this.setState({ permissionsOpen: true });\r\n }\r\n\r\n private closeDrawer = () => {\r\n this.setState({ permissionsOpen: false });\r\n }\r\n\r\n private sendSMSVerifyMessage = (id: string) => {\r\n this.props.sendSMSVerify(id)\r\n .then((response) => {\r\n if(response === true) {\r\n this.setState({ successMessage: \"An SMS verification and opt-in invite was sent to your number.\" })\r\n } else {\r\n this.setState({ errorMessage: \"Something went wrong. Please try again.\" })\r\n }\r\n })\r\n }\r\n\r\n private updatePermissions = () => {\r\n this.setState({ permissionsOpen: false, loading: true });\r\n if (!!this.props.match.params.userId) {\r\n usersApi.GetUserById(this.props.match.params.userId)\r\n .then((response: UserDetails) => {\r\n if (response.accountType !== \"default\")\r\n this.setState({ userDetails: response, loading: false, successMessage: \"Successfully updated user permissions!\" });\r\n });\r\n }\r\n }\r\n}\r\n\r\n\r\ninterface RouteParams {\r\n userId: string;\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\ninterface ComponentState {\r\n includableAudiences: UserDetailsAudience[];\r\n userDetails: UserDetails | undefined;\r\n user: Partial<UserEdit>;\r\n changedSinceSaved: boolean;\r\n password: string;\r\n selectedAudiences: UserDetailsAudience[];\r\n selectedTab: Tabs;\r\n errorMessage: string;\r\n loading: boolean;\r\n saving: boolean;\r\n errorPassword: boolean;\r\n errorFirstname: boolean;\r\n errorLastname: boolean;\r\n permissionsOpen: boolean;\r\n successMessage: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps<RouteParams>) => ({\r\n ...ownProps,\r\n localAccountPrefix: state.settings.tenantSettings.localAccountPrefix,\r\n tenantId: state.tenant.id,\r\n syncType: state.settings.tenantSettings.syncConfig.syncType,\r\n syncLevel: state.settings.tenantSettings.syncConfig.syncLevel,\r\n }),\r\n {\r\n saveUser: actions.updateUser,\r\n sendSMSVerify: actions.sendSMSVerify,\r\n redirectTo: push,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(UserProfilePage);\r\n","import React from 'react';\r\n\r\ninterface ComponentProps {\r\n icon?: any;\r\n title: string;\r\n handleClick: () => any;\r\n downloadCsv?: () => any;\r\n}\r\n\r\nconst ToolboxButton: React.FC<ComponentProps> = ({icon, title, handleClick, downloadCsv}) => {\r\n\r\n const iconStyle: React.CSSProperties = {\r\n fontSize: '40px', \r\n color: \"#2196f3\", \r\n verticalAlign: \"middle\",\r\n marginRight: \"5px\"\r\n };\r\n\r\n return (\r\n <React.Fragment>\r\n <button \r\n className=\"toolbox-button\"\r\n onClick={() => handleClick()}>\r\n <i \r\n className=\"material-icons\"\r\n style={iconStyle}>\r\n {icon}\r\n </i>\r\n {title}\r\n </button>\r\n </React.Fragment>\r\n )\r\n}\r\n\r\nexport default ToolboxButton;","import { messagingApi, reportsApi } from 'api/instances';\r\nimport DownloadButton from 'modules/common/components/buttons/downloadButton';\r\nimport SnackbarWrapper from 'modules/common/components/snackbars/snackbarWrapper';\r\nimport { ReportTypes } from 'modules/reports/models';\r\nimport ToolboxButton from 'modules/users/components/toolboxButton';\r\nimport UserInsightsBlock from 'modules/users/components/userInsightsBlock';\r\nimport React, { useEffect, useState } from 'react';\r\n\r\ninterface ComponentProps {\r\n navigateToSettings: () => any;\r\n userSMSStats: UserSMSStats;\r\n }\r\n\r\ninterface UserSMSStats {\r\n totalMobileNumbers: number,\r\n optedIn: number,\r\n pendingOptIns: number,\r\n optedOut: number,\r\n invalidNumbers: number\r\n}\r\n\r\nconst MessagingCenterSMSTab: React.FunctionComponent<ComponentProps> = ({navigateToSettings, userSMSStats}) => {\r\n\r\n const [successMessage, setSuccessMessage] = useState(\"\");\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const [reportRequestState, setReportRequestState] = useState(false);\r\n\r\n const defaultStyles: React.CSSProperties = {\r\n height: '50px',\r\n lineHeight: '0px',\r\n width: '290px',\r\n textAlign: 'left',\r\n boxShadow: '0 0 5px #b8b8b8',\r\n margin: 5,\r\n borderRadius: 5,\r\n border: 'none',\r\n cursor: 'pointer',\r\n background: 'white',\r\n color: 'black',\r\n }\r\n\r\n useEffect(() => {\r\n }, [successMessage, errorMessage, reportRequestState]);\r\n\r\n const downloadSMSOutbox = async () => {\r\n setReportRequestState(true);\r\n\r\n try {\r\n await reportsApi.SendSMSReportRequest(ReportTypes.SMSNotificationReport);\r\n setSuccessMessage(\"Your report is being generated and will be emailed to you when it's ready.\");\r\n }\r\n catch (e) {\r\n setErrorMessage(\"Something went wrong. Please try again.\");\r\n }\r\n\r\n setReportRequestState(false);\r\n }\r\n\r\n return (\r\n <div className=\"messaging-center-tab-container\">\r\n <h4>SMS User Count</h4>\r\n <div className=\"email-tab-container\">\r\n <div className=\"center-div\">\r\n <div className=\"vertically-center-div\">\r\n <div className=\"email-insights\">\r\n <UserInsightsBlock \r\n title={\"Total mobile numbers\"}\r\n stats={userSMSStats.totalMobileNumbers}\r\n />\r\n <UserInsightsBlock \r\n title={\"Opted-in\"}\r\n stats={userSMSStats.optedIn}\r\n />\r\n\r\n <UserInsightsBlock \r\n title={\"Pending Opted-ins\"}\r\n stats={userSMSStats.pendingOptIns}\r\n />\r\n\r\n <UserInsightsBlock \r\n title={\"Opted-out\"}\r\n stats={userSMSStats.optedOut}\r\n />\r\n\r\n <UserInsightsBlock \r\n title={\"Detected Invalid Numbers\"}\r\n stats={userSMSStats.invalidNumbers}\r\n />\r\n </div>\r\n </div>\r\n <div className=\"email-toolbox-container\">\r\n <span className=\"toolbox-title\">SMS Toolbox</span>\r\n <div className=\"toolbox-button-wrapper\"> \r\n <DownloadButton\r\n onClick={() => messagingApi.GetSMSUserCsv() }\r\n text={\" Download User Data\"}\r\n downloadName={`notification-sms-user-data`}\r\n styles={defaultStyles}\r\n />\r\n \r\n <DownloadButton\r\n onClick={() => downloadSMSOutbox()}\r\n text={\" Download SMS Outbox\"}\r\n downloadName={`notification-sms-outbox-user-data`}\r\n waitingOnRequest={reportRequestState}\r\n usingNewReports={true}\r\n styles={defaultStyles}\r\n />\r\n\r\n <ToolboxButton \r\n title={\"Automated SMS Configurations\"}\r\n handleClick={() => navigateToSettings()} \r\n />\r\n \r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <SnackbarWrapper open={!!successMessage} style={{ top: \"60px\" }} autoHideDuration={8000} onClose={() => setSuccessMessage(\"\")} severity=\"success\" message={successMessage} />\r\n <SnackbarWrapper open={!!errorMessage} style={{ top: \"60px\" }} autoHideDuration={8000} onClose={() => setErrorMessage(\"\")} severity=\"error\" message={errorMessage} />\r\n </div>\r\n )\r\n}\r\n\r\nexport default MessagingCenterSMSTab;","import React from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport './textAreaLanguageSelector.sass'\r\n\r\n\r\ninterface ComponentProps { \r\n returnTranslatedContent: (any) => any;\r\n maxTextLength?: number;\r\n disabled?: boolean;\r\n}\r\n\r\ninterface ComponentState {\r\n defaultLCID: string;\r\n translatedContent: {\r\n [lcid: string]: string,\r\n },\r\n selectedLCID: string;\r\n}\r\n\r\n\r\nclass TextAreaLanguageSelector extends React.Component<PropsWithRedux, ComponentState> {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n defaultLCID: this.props.tenantSettings.defaultLCID,\r\n translatedContent: { \r\n [this.props.tenantSettings.defaultLCID]: \"\"\r\n },\r\n selectedLCID: this.props.tenantSettings.defaultLCID,\r\n }\r\n }\r\n public componentDidMount() {\r\n }\r\n public render() {\r\n\r\n const lcidToLanguage = {\r\n \"en-ca\": \"English\",\r\n \"en-us\": \"English\",\r\n \"es-us\": \"Español\",\r\n \"fr\": \"Français\",\r\n \"fr-ca\": \"Français\",\r\n \"it\": \"Italiano\",\r\n \"tl\": \"Tagalog\",\r\n \"pt-br\": \"Português\",\r\n \"vi\": \"Tiếng Việt\"\r\n }\r\n\r\n const availableLCID = Object.keys(this.props.lcid);\r\n const lcidButtons = availableLCID.map((lcid) => {\r\n return (\r\n <span\r\n key={`${lcid}-buton`}\r\n onClick={() => this.selectLanguage(lcid)}\r\n className={`lcid-options-dropdown`}>\r\n {lcidToLanguage[lcid]} ({lcid})\r\n </span>\r\n )\r\n })\r\n\r\n const tabs = Object.keys(this.state.translatedContent).map((lcid) => {\r\n const active = (lcid === this.state.selectedLCID) ? \"active\" : \"\"\r\n return (\r\n <span\r\n key={`${lcid}-tab`}\r\n onClick={() => this.selectLanguageTab(lcid)}\r\n className={`text-area-lcid-tab ${active}`}>\r\n\r\n {lcidToLanguage[lcid]} ({lcid}) \r\n {lcid !== this.state.defaultLCID ?\r\n <i \r\n style={{marginLeft: 5, cursor: \"pointer\", color: \"#2f4050\"}}\r\n className=\"material-icons\"\r\n onClick={(e) => {\r\n e.stopPropagation()\r\n this.removeLcid(lcid)}}\r\n >delete</i>\r\n : null\r\n }\r\n </span>\r\n )\r\n })\r\n return (\r\n\r\n <React.Fragment>\r\n <div className=\"language-section\">\r\n {tabs}\r\n <div className=\"language-button-selector\">\r\n <button className=\"dropdown-button-lcid\">+</button>\r\n <div className=\"dropdown-btn-content-lcid\">\r\n {lcidButtons}\r\n </div>\r\n </div> \r\n </div>\r\n <div className=\"text-area-container\">\r\n <textarea\r\n value={this.state.translatedContent[this.state.selectedLCID] ?? \"\"}\r\n className=\"text-area-language-body\" \r\n onChange={(e) => this.handleTextArea(e)}\r\n maxLength={this.props.maxTextLength}\r\n disabled={this.props.disabled}>\r\n </textarea>\r\n </div>\r\n </React.Fragment>\r\n )\r\n }\r\n\r\n private removeLcid = (lcid: string) => {\r\n delete this.state.translatedContent[lcid]\r\n this.setState({\r\n ...this.state,\r\n selectedLCID: this.state.defaultLCID,\r\n translatedContent: this.state.translatedContent,\r\n })\r\n }\r\n private selectLanguageTab = (lcid: string) => {\r\n this.setState({\r\n ...this.state,\r\n selectedLCID: lcid,\r\n })\r\n }\r\n\r\n private selectLanguage = (lcid: string) => {\r\n if (!Object.keys(this.state.translatedContent).includes(lcid)) {\r\n this.setState({\r\n ...this.state,\r\n translatedContent: {\r\n ...this.state.translatedContent,\r\n [lcid]: \"\"\r\n }\r\n })\r\n } else {\r\n this.selectLanguageTab(lcid)\r\n }\r\n }\r\n private handleTextArea = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\r\n this.setState({\r\n ...this.state,\r\n translatedContent: {\r\n ...this.state.translatedContent,\r\n [this.state.selectedLCID]: e.target.value\r\n },\r\n }, () => {\r\n this.props.returnTranslatedContent(this.state.translatedContent);\r\n })\r\n }\r\n}\r\n\r\n\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantSettings: state.settings.tenantSettings,\r\n lcidMappings: state.resources.lcidMappings,\r\n lcid: state.settings.tenantSettings.translatedContent\r\n }),\r\n {\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default (connector(TextAreaLanguageSelector));\r\n\r\n","import React, { useEffect, useState } from 'react';\r\nimport { Audience } from '../models';\r\nimport './audienceSidebarSelector.sass';\r\nimport { Button, Checkbox, List, ListItem, TextField } from '@mui/material';\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport Callout from 'modules/common/components/callout';\r\nimport TextBubble from 'modules/common/components/textBubble';\r\n\r\ninterface ComponentProps {\r\n applyAudienceChanges: any;\r\n previousAudiences: string[];\r\n userAudiences: Audience[];\r\n handlePopupClick: HTMLButtonElement | null;\r\n handleClose: () => void;\r\n onSelectAudienceClick: () => any;\r\n textBubbles: TextBubble[];\r\n}\r\n\r\ninterface TextBubble {\r\n id: string;\r\n name: string;\r\n}\r\n\r\nconst AudienceCalloutSelector: React.FunctionComponent<ComponentProps> = ( {userAudiences, applyAudienceChanges, previousAudiences, handlePopupClick, handleClose, onSelectAudienceClick, textBubbles } ) => {\r\n const [selectedAudiences, setSelectedAudiences] = useState<string[]>(previousAudiences);\r\n const [audiences, setAudiences] = useState<Audience[]>(userAudiences);\r\n const [audienceSearchText, setAudienceSearchText] = useState<string>();\r\n const [anchorEl, setAnchorEl] = React.useState<HTMLButtonElement | null>(handlePopupClick);\r\n const [calloutOpen, setCalloutOpen] = React.useState(false);\r\n\r\n useEffect(() => {\r\n },[anchorEl])\r\n\r\n const getAllAudiences = userAudiences.filter((audience) => audience.enabled).map((allAudiences) => {\r\n return allAudiences.id;\r\n })\r\n\r\n const audienceSelector = audiences.filter((audience) => audience.enabled).map((filteredAudience) => {\r\n return (\r\n <React.Fragment key={filteredAudience.id}>\r\n <ListItem\r\n button\r\n onClick={() => {\r\n modifySelectedAudiences(filteredAudience.id); \r\n }}\r\n className=\"select-popover-group-header-clickable\"\r\n >\r\n <Checkbox\r\n id={filteredAudience.id}\r\n name={filteredAudience.displayName}\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={selectedAudiences.includes(filteredAudience.id)}\r\n />\r\n {filteredAudience.displayName}\r\n </ListItem>\r\n </React.Fragment>\r\n );\r\n })\r\n\r\n const getAudienceFilterFooter = () => {\r\n const audienceSelected = (selectedAudiences?.length ?? [].length) > 0;\r\n\r\n return <Button color=\"primary\" style={{float: \"right\"}} onClick={() => onHandleAllAudience(audienceSelected)}>\r\n {audienceSelected ? \"Unselect\" : \"Select\"} All\r\n </Button>\r\n }\r\n\r\n const onHandleAllAudience = (audienceSelected: boolean) => {\r\n if (audienceSelected){\r\n setSelectedAudiences([]);\r\n } else {\r\n setSelectedAudiences(getAllAudiences);\r\n }\r\n }\r\n\r\n const getAudienceSearchBox = () => {\r\n return <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n fullWidth\r\n value={audienceSearchText}\r\n placeholder = \"Search audience\"\r\n InputProps={{\r\n startAdornment: <SearchIcon className=\"search-icon\" />\r\n }}\r\n onChange={(event) => {onUpdateAudienceTextToSearch(event.target.value)}}\r\n className=\"text-to-search\" />\r\n }\r\n\r\n const onUpdateAudienceTextToSearch = (ev: any) => {\r\n setAudienceSearchText(ev);\r\n setAudiences(userAudiences.filter(c => c.displayName.toLowerCase().includes(ev.toLowerCase())));\r\n }\r\n \r\n const modifySelectedAudiences = (id: string) => {\r\n /* We either remove or add an audience on click */\r\n if (selectedAudiences.includes(id)) {\r\n setSelectedAudiences(selectedAudiences.filter(audience => audience !== id));\r\n } else {\r\n setSelectedAudiences(prev => [...prev, id])\r\n }\r\n }\r\n\r\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n return (\r\n <>\r\n <p className=\"profile-input-label\">Assign To Audiences</p>\r\n <div className=\"label-description-block\">\r\n <button\r\n className=\"reset-btn-no-border\"\r\n onClick={(e) => {\r\n handleClick(e);\r\n setCalloutOpen(true);\r\n onSelectAudienceClick();\r\n }}\r\n >\r\n SELECT AUDIENCES\r\n </button>\r\n <TextBubble list={textBubbles} />\r\n </div>\r\n <Callout\r\n anchorEl={anchorEl}\r\n setOpen={(toSet) => {\r\n applyAudienceChanges(selectedAudiences);\r\n setCalloutOpen(toSet ?? false);\r\n }}\r\n open={calloutOpen}\r\n footer={getAudienceFilterFooter()}\r\n header={getAudienceSearchBox()}\r\n >\r\n <div style={{ height: \"254px\", width: \"350px\" }}>\r\n <List disablePadding>{audienceSelector}</List>\r\n </div>\r\n </Callout>\r\n </>\r\n );\r\n}\r\n\r\n\r\n export default AudienceCalloutSelector;\r\n","import TextBubble from 'modules/common/components/textBubble';\r\nimport { lcidMappings } from 'modules/resources/models';\r\nimport InputField from 'modules/users/components/user-field-components/inputField';\r\nimport React from 'react';\r\nimport TextAreaLanguageSelector from '../../common/components/textAreaLanguageSelector';\r\nimport { Blast, NotificationEvents } from '../models';\r\nimport { connect, ConnectedProps } from \"react-redux\"\r\nimport { GlobalApplicationState } from \"globalApplicationState\"\r\nimport Select from 'react-select';\r\nimport { messagingApi } from 'api/instances';\r\nimport { ValueLabel } from 'modules/common/components/selectFilter';\r\nimport { errorAlert } from 'utils/notyPopups';\r\nimport AudienceCalloutSelector from 'modules/audiences/components/audienceCalloutSelector';\r\nimport { Audience } from 'modules/audiences';\r\nimport { Typography } from '@mui/material';\r\n\r\ninterface ComponentProps {\r\n closeModal: () => any;\r\n onSelectAudienceClick: () => any;\r\n textBubbles: TextBubble[];\r\n selectedAudiences: string[];\r\n onBlastSuccess: () => any;\r\n applyAudienceChanges: any;\r\n previousAudiences: string[];\r\n userAudiences: Audience[];\r\n }\r\n\r\ninterface ComponentState { \r\n showAudiencePicker: boolean;\r\n translatedContent: lcidMappings;\r\n sending: boolean;\r\n textBlastSelected: boolean;\r\n massConsentSelected: boolean;\r\n reinviteSelected: boolean;\r\n anchorEl: HTMLButtonElement | null;\r\n}\r\n\r\ninterface TextBubble {\r\n id: string;\r\n name: string;\r\n}\r\nclass SmsBlastModal extends React.Component<PropsWithRedux, ComponentState> {\r\n \r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n showAudiencePicker: false,\r\n translatedContent: { },\r\n sending: false,\r\n textBlastSelected: false,\r\n massConsentSelected: false,\r\n reinviteSelected: false,\r\n anchorEl: null,\r\n }\r\n }\r\n\r\n public render() {\r\n\r\n const disabledButton = this.props.notificationSettings[NotificationEvents.MassSMS].toggle ? \"apply-btn-2\" : \"disabled-btn-2\"\r\n\r\n const selectStyles = {\r\n container:(provided) => ({\r\n ...provided,\r\n width: \"100%\"\r\n }),\r\n control: (provided) => ({\r\n ...provided,\r\n width: \"100%\",\r\n marginTop: 20,\r\n marginBottom: 20\r\n }),\r\n menu: (provided) => {\r\n return {\r\n ...provided,\r\n width: \"100%\",\r\n }\r\n } \r\n };\r\n\r\n const smsOptions = [\r\n { value: \"Text Blast\", label: \"Text Blast\"},\r\n { value: \"Mass Consent\", label: \"Mass Consent Invitation\"},\r\n { value: \"Reinvite\", label: \"Reinvite Opted-out Users\"}\r\n ]\r\n\r\n\r\n const maxTextLength = 160;\r\n const suggestions = [\r\n {id: \"Reply YES ...\", name: \"Reply YES ...\"},\r\n {id: \"Reply STOP ...\", name: \"Reply STOP ...\"},\r\n {id: \"Reply HELP ...\", name: \"Reply HELP ...\"},\r\n {id: \"SMS charges may apply\", name: \"SMS charges may apply\"},\r\n {id: \"{{newLine}}\", name: \"{{newLine}}\"},\r\n {id: \"{{userPreferredName}}\", name: \"{{userPreferredName}}\"},\r\n {id: \"{{userFirstName}}\", name: \"{{userFirstName}}\"},\r\n {id: \"{{userLastName}}\", name: \"{{userLastName}}\"},\r\n {id: \"{{supportEmail}}\", name: \"{{supportEmail}}\"},\r\n\r\n ] as TextBubble[]\r\n\r\n return (\r\n <div className=\"email-blast-container\">\r\n <div className=\"email-blast-header\">\r\n <h4 style={{ float: \"left\" }}>Create SMS Blast</h4>{\" \"}\r\n <p style={{ float: \"right\", cursor: \"pointer\" }} onClick={() => this.props.closeModal()}>\r\n ✕\r\n </p>\r\n </div>\r\n\r\n <div className=\"email-blast-fields\">\r\n <InputField\r\n title={\"Sender\"}\r\n isDisabled={true}\r\n inputType={\"text\"}\r\n description={\r\n \"This number appears as the Sender once the text message is received. Contact Sparrow to customize your number.\"\r\n }\r\n placeholder={\"+1 833 684 1574\"}\r\n />\r\n\r\n <div className=\"input-row\">\r\n <AudienceCalloutSelector\r\n handlePopupClick={this.state.anchorEl}\r\n applyAudienceChanges={this.props.applyAudienceChanges}\r\n previousAudiences={this.props.selectedAudiences}\r\n userAudiences={this.props.userAudiences}\r\n textBubbles={this.props.textBubbles}\r\n onSelectAudienceClick={this.props.onSelectAudienceClick}\r\n handleClose={this.handleClose}\r\n />\r\n </div>\r\n\r\n <div className=\"input-row\">\r\n <p className=\"profile-input-label\">SMS Type</p>\r\n <div className=\"label-description-block\">\r\n <Select options={smsOptions} styles={selectStyles} onChange={this.handleSMSType} />\r\n </div>\r\n </div>\r\n\r\n <div className=\"input-row\">\r\n <p className=\"profile-input-label\">Body</p>\r\n <div className=\"label-description-block\">\r\n <TextAreaLanguageSelector\r\n returnTranslatedContent={this.getTranslatedContent}\r\n maxTextLength={maxTextLength}\r\n disabled={!this.props.notificationSettings[NotificationEvents.MassSMS].toggle}\r\n />\r\n <div>\r\n <Typography variant='caption'>\r\n Max character length {maxTextLength}\r\n </Typography>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"input-row\">\r\n <p className=\"profile-input-label\">Suggestions</p>\r\n <div className=\"label-description-block\">\r\n <TextBubble list={suggestions} />\r\n <p className=\"description-text\">\r\n Use suggestions in brackets (ex. {{First Name}}) to personalize your message for each\r\n recipient. {{newLine}} is used to insert a line space between sentences. Do not change\r\n the texts within suggested items to correctly use them.\r\n </p>\r\n </div>\r\n </div>\r\n <div className=\"clearfix\">\r\n <button\r\n disabled={!this.props.notificationSettings[NotificationEvents.MassSMS].toggle}\r\n className={disabledButton}\r\n style={{ float: \"right\", marginBottom: 10 }}\r\n onClick={() => this.SendBlast()}\r\n >\r\n SEND\r\n </button>\r\n {!this.props.notificationSettings[NotificationEvents.MassSMS].toggle && (\r\n <div className=\"blast-disabled-message\">\r\n SMS Blasts are currently disabled. To send a blast please re-enable them in the settings.\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n \r\n private handleClose = () => {\r\n this.setState( { anchorEl: null });\r\n };\r\n\r\n private getTranslatedContent = (translatedContent: any) => {\r\n this.setState({\r\n ...this.state,\r\n translatedContent: translatedContent\r\n })\r\n }\r\n \r\n private SendBlast = () => {\r\n const blast = {\r\n audienceIds: this.props.selectedAudiences,\r\n translatedBody: this.state.translatedContent,\r\n } as Blast;\r\n\r\n this.setState({\r\n ...this.state,\r\n sending: true,\r\n })\r\n \r\n if (this.state.textBlastSelected) {\r\n messagingApi.SendSMSBlast(blast)\r\n .then((response) => {\r\n this.setState({\r\n ...this.state,\r\n sending: false\r\n })\r\n if (response === \"Success\") {\r\n this.props.onBlastSuccess()\r\n }\r\n })\r\n .catch((error) => {\r\n errorAlert(`There was an error processing your email blast`, 3000)\r\n this.setState({\r\n ...this.state,\r\n sending: false\r\n })\r\n })\r\n } else {\r\n messagingApi.MassSendConsent(blast)\r\n .then((response) => {\r\n this.setState({\r\n ...this.state,\r\n sending: false\r\n })\r\n if (response === \"Success\") {\r\n this.props.onBlastSuccess()\r\n }\r\n })\r\n .catch((error) => {\r\n errorAlert(`There was an error processing your email blast`, 3000)\r\n this.setState({\r\n ...this.state,\r\n sending: false\r\n })\r\n })\r\n }\r\n }\r\n\r\n private handleSMSType = (o: ValueLabel) => {\r\n switch(o.value) {\r\n case \"Text Blast\": \r\n this.setState({...this.state, textBlastSelected: true});\r\n break;\r\n case \"Mass Consent\":\r\n this.setState({...this.state, massConsentSelected: true});\r\n break;\r\n case \"Reinvite\": \r\n this.setState({...this.state, reinviteSelected: true});\r\n break;\r\n default:\r\n break;\r\n }\r\n \r\n }\r\n}\r\n\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantSettings: state.settings.tenantSettings,\r\n lcidMappings: state.resources.lcidMappings,\r\n notificationSettings: state.settings.notificationSettings.settings,\r\n }),\r\n {\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(SmsBlastModal)\r\n","import { messagingApi } from 'api/instances';\r\nimport DownloadButton from 'modules/common/components/buttons/downloadButton';\r\nimport ToolboxButton from 'modules/users/components/toolboxButton';\r\nimport UserInsightsBlock from 'modules/users/components/userInsightsBlock';\r\nimport React from 'react';\r\n\r\ninterface ComponentProps { \r\n navigateToSettings: () => any;\r\n userTeamsStats: UserTeamsStats;\r\n}\r\n\r\ninterface UserTeamsStats {\r\n totalUsers: number,\r\n registeredUsers: number\r\n}\r\n\r\nconst MessagingCenterTeamsTab: React.FunctionComponent<ComponentProps> = ({navigateToSettings, userTeamsStats}) => {\r\n\r\n const defaultStyles: React.CSSProperties = {\r\n height: '50px',\r\n lineHeight: '0px',\r\n width: '290px',\r\n textAlign: 'left',\r\n boxShadow: '0 0 5px #b8b8b8',\r\n margin: 5,\r\n borderRadius: 5,\r\n border: 'none',\r\n cursor: 'pointer',\r\n background: 'white',\r\n color: 'black'\r\n }\r\n\r\n return (\r\n <div className=\"messaging-center-tab-container\">\r\n <h4>Teams Chatbot User Count</h4>\r\n <div className=\"email-tab-container\">\r\n <div className=\"center-div\">\r\n\r\n <div className=\"vertically-center-div\">\r\n <div className=\"email-insights\">\r\n \r\n <UserInsightsBlock \r\n title={\"Total Work Accounts in Directory\"}\r\n stats={userTeamsStats.totalUsers}\r\n />\r\n\r\n <UserInsightsBlock \r\n title={\"Total Users Installed MS Chatbot\"}\r\n stats={userTeamsStats.registeredUsers}\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"email-toolbox-container\">\r\n <span className=\"toolbox-title\">Teams Chatbot Toolbox</span>\r\n <div className=\"toolbox-button-wrapper\"> \r\n\r\n <DownloadButton\r\n onClick={() => messagingApi.GetTeamsUserCsv() }\r\n text={\" Download User Data\"}\r\n downloadName={`notification-teams-user-data`}\r\n styles={defaultStyles}\r\n />\r\n\r\n <DownloadButton\r\n onClick={() => messagingApi.GetOutbox(\"teams\") }\r\n text={\" Download Teams Chatbot Outbox\"}\r\n downloadName={`notification-teams-outbox-user-data`}\r\n styles={defaultStyles}\r\n />\r\n\r\n <ToolboxButton \r\n title={\"Teams Chatbot Configurations\"}\r\n handleClick={() => navigateToSettings()} \r\n />\r\n \r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n )\r\n}\r\n\r\nexport default MessagingCenterTeamsTab;","import { messagingApi } from 'api/instances';\r\nimport DownloadButton from 'modules/common/components/buttons/downloadButton';\r\nimport ToolboxButton from 'modules/users/components/toolboxButton';\r\nimport UserInsightsBlock from 'modules/users/components/userInsightsBlock';\r\nimport React from 'react';\r\n\r\ninterface ComponentProps { \r\n navigateToSettings: () => any;\r\n userMobileStats: UserMobileStats;\r\n}\r\n\r\ninterface UserMobileStats {\r\n activeDevices: number,\r\n usersWithApp: number,\r\n usersWithNoDevice: number\r\n}\r\n\r\nconst MessagingCenterMobileTab: React.FunctionComponent<ComponentProps> = ({navigateToSettings, userMobileStats}) => {\r\n\r\n const defaultStyles: React.CSSProperties = {\r\n height: '50px',\r\n lineHeight: '0px',\r\n width: '290px',\r\n textAlign: 'left',\r\n boxShadow: '0 0 5px #b8b8b8',\r\n margin: 5,\r\n borderRadius: 5,\r\n border: 'none',\r\n cursor: 'pointer',\r\n background: 'white',\r\n color: 'black'\r\n }\r\n\r\n return (\r\n <div className=\"messaging-center-tab-container\">\r\n <h4>Mobile App User Count</h4>\r\n <div className=\"email-tab-container\">\r\n <div className=\"center-div\">\r\n\r\n <div className=\"vertically-center-div\">\r\n <div className=\"email-insights\">\r\n \r\n <UserInsightsBlock \r\n title={\"Total Number of Active Devices\"}\r\n stats={userMobileStats.activeDevices}\r\n />\r\n\r\n <UserInsightsBlock \r\n title={\"Total Number of Users With App\"}\r\n stats={userMobileStats.usersWithApp}\r\n />\r\n\r\n <UserInsightsBlock \r\n title={\"Total Number of Users With No Device\"}\r\n stats={userMobileStats.usersWithNoDevice}\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"email-toolbox-container\">\r\n <span className=\"toolbox-title\">Mobile App Toolbox</span>\r\n <div className=\"toolbox-button-wrapper\"> \r\n\r\n <DownloadButton\r\n onClick={() => messagingApi.GetMobileUserCsv() }\r\n text={\" Download User Data\"}\r\n downloadName={`notification-mobile-user-data`}\r\n styles={defaultStyles}\r\n />\r\n\r\n <DownloadButton\r\n onClick={() => messagingApi.GetOutbox(\"mobile\") }\r\n text={\" Download Mobile App Outbox\"}\r\n downloadName={`notification-mobile-outbox-user-data`}\r\n styles={defaultStyles}\r\n />\r\n\r\n <ToolboxButton \r\n title={\"Automated Mobile App Configurations\"}\r\n handleClick={() => navigateToSettings()} \r\n />\r\n \r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n )\r\n}\r\n\r\nexport default MessagingCenterMobileTab;","import React from 'react';\r\nimport { connect, ConnectedProps } from \"react-redux\"\r\nimport { GlobalApplicationState } from \"globalApplicationState\"\r\nimport { MessagingTabs } from \"../models\";\r\nimport { actions } from \"modules/messaging\";\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Header from \"pages/common/header\";\r\nimport MainContent from \"pages/common/mainContent\";\r\nimport MessagingCenterSMSTab from './messagingCenterSMSTab';\r\nimport { audiencesApi, messagingApi } from 'api/instances';\r\nimport { Audience } from 'modules/audiences/models';\r\nimport TextBubble from 'modules/common/components/textBubble';\r\nimport SmsBlastModal from './smsBlastModal';\r\nimport SuccessfulActionDialog from 'modules/common/components/successfulActionDialog';\r\nimport { push } from 'connected-react-router';\r\nimport MessagingCenterTeamsTab from './messagingCenterTeamsTab';\r\nimport MessagingCenterMobileTab from './messagingCenterMobileTab';\r\n\r\nimport '../messaging.sass';\r\n\r\ninterface ComponentProps { }\r\n\r\ninterface ComponentState { \r\n showSmsModal: boolean;\r\n audiences: Audience[];\r\n selectedAudiences: string[];\r\n showAudiencePicker: boolean;\r\n shouldShowSuccessfulBlastDialog: boolean;\r\n userSMSStats: UserSMSStats;\r\n userTeamsStats: UserTeamsStats;\r\n userMobileStats: UserMobileStats;\r\n}\r\n\r\ninterface TextBubble {\r\n id: string;\r\n name: string;\r\n}\r\n\r\ninterface UserSMSStats {\r\n totalMobileNumbers: number,\r\n optedIn: number,\r\n pendingOptIns: number,\r\n optedOut: number,\r\n invalidNumbers: number\r\n}\r\n\r\ninterface UserTeamsStats {\r\n totalUsers: number,\r\n registeredUsers: number\r\n}\r\n\r\ninterface UserMobileStats {\r\n activeDevices: number,\r\n usersWithApp: number,\r\n usersWithNoDevice: number\r\n}\r\nclass MessagingCenterScreen extends React.Component<PropsWithRedux, ComponentState> {\r\n\r\n componentDidMount() {\r\n audiencesApi.getAllAudiences()\r\n .then((audiences) => {\r\n this.setState({\r\n ...this.state,\r\n audiences: audiences\r\n })\r\n })\r\n\r\n messagingApi.GetSMSStats()\r\n .then((stats) => {\r\n this.setState({\r\n ...this.state,\r\n userSMSStats: stats\r\n })\r\n })\r\n\r\n messagingApi.GetTeamsStats()\r\n .then((stats) => {\r\n this.setState({\r\n ...this.state,\r\n userTeamsStats: stats\r\n })\r\n })\r\n\r\n messagingApi.GetMobileStats()\r\n .then((stats) => {\r\n this.setState({\r\n ...this.state,\r\n userMobileStats: stats\r\n })\r\n })\r\n }\r\n\r\n constructor(props) {\r\n super(props)\r\n this.state = {\r\n showSmsModal: false,\r\n audiences: [],\r\n selectedAudiences: [],\r\n showAudiencePicker: false,\r\n shouldShowSuccessfulBlastDialog: false,\r\n userSMSStats: {\r\n totalMobileNumbers: 0,\r\n optedIn: 0,\r\n optedOut: 0,\r\n invalidNumbers: 0,\r\n pendingOptIns: 0\r\n },\r\n userTeamsStats: {\r\n totalUsers: 0,\r\n registeredUsers: 0\r\n },\r\n userMobileStats: {\r\n activeDevices: 0,\r\n usersWithApp: 0,\r\n usersWithNoDevice: 0\r\n }\r\n }\r\n }\r\n\r\n public render() {\r\n\r\n const smsTabActive = this.props.activeTab === MessagingTabs.SMS ? \" active\" : \"\";\r\n const teamsTabActive = this.props.activeTab === MessagingTabs.Teams ? \" active\" : \"\";\r\n const mobileTabActive = this.props.activeTab === MessagingTabs.Mobile ? \" active\" : \"\";\r\n\r\n const audienceBubbles : TextBubble[] = []\r\n this.state.selectedAudiences.forEach(element => {\r\n audienceBubbles.push({id: element, name: this.state.audiences.find((a) => a.id === element)?.displayName} as TextBubble)\r\n });\r\n return (\r\n <BasePage fullWidth>\r\n <Header\r\n title=\"Direct Messaging\"\r\n />\r\n <MainContent>\r\n <div className=\"messaging-center-page\">\r\n <div className=\"tab-clearfix\">\r\n <ul style={{float: \"left\"}} className=\"tab-btns\">\r\n <li> \r\n <span className={`tab-btn ${smsTabActive}`}\r\n onClick={() => { this.handleTabChange(MessagingTabs.SMS) } }>\r\n SMS\r\n </span>\r\n </li> \r\n <li>\r\n <span className={`tab-btn ${teamsTabActive}`}\r\n onClick={() => {this.handleTabChange(MessagingTabs.Teams)}}>\r\n Teams\r\n </span> \r\n </li> \r\n <li>\r\n <span className={`tab-btn ${mobileTabActive}`}\r\n onClick={() => {this.handleTabChange(MessagingTabs.Mobile)}}>\r\n Mobile\r\n </span>\r\n </li>\r\n </ul>\r\n <div style={{float: \"right\", margin: 20}} className=\"send-new-btn\">\r\n <button className=\"dropdown-button\">SEND NEW</button>\r\n <div className=\"dropdown-btn-content\">\r\n <div className=\"send-new-dropdown\" onClick={() => this.setState({...this.state, showSmsModal: true, selectedAudiences: []})}>Text Blast (SMS)</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {\r\n this.state.shouldShowSuccessfulBlastDialog ? \r\n <SuccessfulActionDialog \r\n title={\"Blast sent\"}\r\n displayMessage={ <p> Your blast has been sent to your selected audiences </p> }\r\n afterPublishSuccess={this.onBlastClose}\r\n /> \r\n : null\r\n }\r\n {this.state.showSmsModal && \r\n <SmsBlastModal \r\n closeModal={this.closeSMSBlast}\r\n onSelectAudienceClick={() => this.setState({ ...this.state, showAudiencePicker: true})}\r\n textBubbles={audienceBubbles}\r\n selectedAudiences={this.state.selectedAudiences}\r\n onBlastSuccess={this.onBlastSuccess}\r\n applyAudienceChanges={this.applyAudienceChanges}\r\n previousAudiences={this.state.selectedAudiences}\r\n userAudiences={this.state.audiences}\r\n />\r\n } \r\n {smsTabActive &&\r\n <div className={`tab non-list-view ${smsTabActive}`}>\r\n <MessagingCenterSMSTab \r\n navigateToSettings={this.navigateToSettings}\r\n userSMSStats={this.state.userSMSStats}\r\n />\r\n </div>\r\n }\r\n {teamsTabActive &&\r\n <div className={`tab non-list-view ${teamsTabActive}`}>\r\n <MessagingCenterTeamsTab\r\n navigateToSettings={this.navigateToSettings}\r\n userTeamsStats={this.state.userTeamsStats}\r\n />\r\n </div>\r\n }\r\n {mobileTabActive &&\r\n <div className={`tab non-list-view ${mobileTabActive}`}>\r\n <MessagingCenterMobileTab\r\n navigateToSettings={this.navigateToSettings}\r\n userMobileStats={this.state.userMobileStats}\r\n />\r\n </div>\r\n }\r\n </div>\r\n </MainContent>\r\n </BasePage>\r\n );\r\n }\r\n\r\n private handleTabChange = (tab: MessagingTabs) => {\r\n if (!this.state.showSmsModal) {\r\n this.props.setActiveTab(tab)\r\n }\r\n }\r\n private navigateToSettings = () => {\r\n this.props.redirectTo('/' + this.props.tenantId + '/admin/settings#messaging')\r\n }\r\n private onBlastClose = () => {\r\n this.setState({\r\n ...this.state,\r\n shouldShowSuccessfulBlastDialog: false\r\n })\r\n }\r\n private onBlastSuccess = () => {\r\n this.setState({\r\n ...this.state,\r\n showSmsModal: false,\r\n shouldShowSuccessfulBlastDialog: true\r\n })\r\n }\r\n\r\n private applyAudienceChanges = (audiences: string[]) => {\r\n this.setState({\r\n ...this.state,\r\n showAudiencePicker: false,\r\n selectedAudiences: audiences\r\n })\r\n }\r\n\r\n private closeSMSBlast = () => {\r\n this.setState({\r\n ...this.state,\r\n showSmsModal: false,\r\n selectedAudiences: [],\r\n showAudiencePicker: false,\r\n })\r\n }\r\n}\r\n\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n activeTab: state.messaging.activeTab,\r\n tenantId: state.tenant.id,\r\n }),\r\n {\r\n setActiveTab: actions.setActiveTab,\r\n redirectTo: push,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(MessagingCenterScreen)\r\n","import * as React from \"react\"\r\nimport moment from 'moment';\r\nimport { usersApi } from \"api/instances\";\r\nimport { LobbyUser, UsersTab } from \"../models\";\r\nimport LoadingSpinner from \"modules/common/components/loadingSpinner\";\r\nimport { errorAlert, infoAlert } from \"utils/notyPopups\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Breadcrumb from \"pages/common/breadcrumb\";\r\nimport MainContent from \"pages/common/mainContent\";\r\n\r\n\r\ninterface ComponentState {\r\n lobbyUsers: LobbyUser[]\r\n isLoading: boolean\r\n processingDelete: string | null\r\n processingGrant: string | null\r\n}\r\ninterface ComponentProps {\r\n activeTab: UsersTab;\r\n}\r\nexport default class ExternalUsersLobbyView extends React.Component<ComponentProps, ComponentState> {\r\n private _isMounted = false;\r\n constructor(props){\r\n super(props);\r\n this.state = { lobbyUsers: [], \r\n isLoading: false,\r\n processingDelete: null, \r\n processingGrant: null,\r\n };\r\n }\r\n \r\n public componentDidMount() {\r\n this._isMounted = true;\r\n this.fetchLobby();\r\n }\r\n public componentWillReceiveProps(nextProps) {\r\n if( this.props.activeTab !== nextProps.activeTab) { \r\n this.fetchLobby();\r\n }\r\n }\r\n public componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n public render() {\r\n return (\r\n <BasePage fullWidth>\r\n <Breadcrumb\r\n items={[\r\n { title: \"Users & Permissions\", link: \"~/admin/users\" },\r\n { title: \"External User Lobby\"},\r\n ]}\r\n />\r\n <MainContent>\r\n <div style={{display: 'inline-flex', marginTop: 20}}>\r\n <p className=\"alert-info\" style={{width: 'fit-content', marginLeft: '35px', paddingLeft: '15px', paddingRight: '15px'}}>\r\n The lobby shows external users that have attempted to sign into the App and that are currently awaiting approval. <br />\r\n Granting them access will allow them to log in.\r\n </p>\r\n </div>\r\n <table className=\"table external-lobby\" style={{marginTop: '20px'}}>\r\n <thead>\r\n <tr>\r\n <th className=\"auth-provider-col\"></th>\r\n <th className=\"email\">Email</th>\r\n <th className=\"actions\">Actions</th> \r\n <th className=\"date\">First Login Attempt</th>\r\n\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {\r\n this.state.lobbyUsers.map(user => {\r\n \r\n return <tr key={user.email}>\r\n <td className=\"auth-provider-col\">\r\n { this.mapExternalAuthToIcon(user) }\r\n </td>\r\n <td className=\"email\">\r\n {user.email} \r\n </td>\r\n <td className=\"actions\">\r\n <button\r\n disabled={this.state.isLoading || this.state.processingDelete === user.email}\r\n className = \"btn\"\r\n style={{backgroundColor: '#D9534F', padding: '8px', color: \"white\"}}\r\n onClick = {() => this.deleteRequest(user.objectId, user.email)}\r\n > \r\n {\r\n this.state.processingDelete === user.objectId? <LoadingSpinner size={'14px'} /> : \r\n <span>\r\n Delete\r\n <i className=\"material-icons\" \r\n style={{fontSize: '17px', verticalAlign: 'text-bottom'}}>delete</i>\r\n </span>\r\n }\r\n \r\n </button>\r\n <button\r\n disabled={this.state.isLoading || this.state.processingGrant === user.email}\r\n className = \"btn\"\r\n style={{backgroundColor: '#2196f3', padding: '9px', color: \"white\"}}\r\n onClick = {() => this.grantAccess(user.objectId, user.issuerName, user.email)}\r\n >\r\n {\r\n this.state.processingGrant === user.objectId ? <LoadingSpinner size={'14px'} /> : \r\n <span>\r\n Grant Access\r\n <i className=\"material-icons\" \r\n style={{fontSize: '17px', verticalAlign: 'text-bottom', marginLeft: '4px'}}>done</i>\r\n </span>\r\n }\r\n </button>\r\n </td>\r\n <td className=\"date\">\r\n { moment(user.createdDateTime).format('MM/DD/YYYY').toString()}\r\n </td> \r\n </tr>\r\n })\r\n }\r\n {\r\n this.state.lobbyUsers.length === 0 ?\r\n <tr>\r\n <td colSpan={5} style={{ textAlign: 'center' }}>\r\n There are no external users in the lobby\r\n </td>\r\n </tr>\r\n : null\r\n }\r\n </tbody>\r\n </table>\r\n </MainContent>\r\n </BasePage>\r\n );\r\n }\r\n private trimIssuerName = (issuer: string) => {\r\n if (issuer.toLowerCase().includes(\"facebook\"))\r\n {\r\n return \"facebook\";\r\n } else if (issuer.toLowerCase().includes(\"google\"))\r\n {\r\n return \"google\";\r\n } else if (issuer.toLowerCase().includes(\"linkedin\"))\r\n {\r\n return \"linkedin\";\r\n } else if (issuer.toLowerCase().includes(\"apple\"))\r\n {\r\n return \"apple\";\r\n } else\r\n {\r\n return \"\";\r\n }\r\n }\r\n private mapExternalAuthToIcon(user: LobbyUser): JSX.Element {\r\n if (user.issuerName && user.issuerName !== \"\") {\r\n switch (this.trimIssuerName(user.issuerName)) {\r\n case \"google\":\r\n return <img className=\"auth-provider-logo\"\r\n title=\"This user uses Google auth to log in.\"\r\n src=\"/images/g-logo.png\" alt=\"Google\" />;\r\n case \"facebook\":\r\n return <img className=\"auth-provider-logo\"\r\n title=\"This user uses Facebook auth to log in.\"\r\n src=\"/images/fb-logo.png\" alt=\"Facebook\" />;\r\n case \"linkedin\":\r\n return <img className=\"auth-provider-logo\"\r\n title=\"This user uses LinkedIn auth to log in.\"\r\n src=\"/images/linkedin-logo.png\" alt=\"Linkedin\" />;\r\n case \"apple\":\r\n return <img className=\"auth-provider-logo\"\r\n title=\"This user uses Apple auth to log in.\"\r\n src=\"/images/apple-logo.png\" alt=\"apple\" />;\r\n default:\r\n return <React.Fragment></React.Fragment>\r\n }\r\n }\r\n return <React.Fragment></React.Fragment>;\r\n }\r\n private fetchLobby = () => {\r\n this.setState(prev => ({...prev, isLoading: true, error: \"\"}));\r\n usersApi.GetExternalUsersLobby()\r\n .then(result => {;\r\n if (this._isMounted) {\r\n this.setState(prev => ({\r\n ...prev,\r\n lobbyUsers: result,\r\n isLoading: false\r\n }));\r\n }\r\n })\r\n }\r\n private deleteRequest = (objectId: string, email: string) => {\r\n this.setState(prev => ({...prev, processingDelete: objectId}));\r\n usersApi.DeleteExternalUserRequest(objectId)\r\n .then(result => {\r\n infoAlert(`${email} request has been deleted`, 4000);\r\n\r\n this.setState(prev => ({\r\n ...prev,\r\n lobbyUsers: this.state.lobbyUsers.filter(o => o.objectId !== objectId),\r\n processingDelete: null\r\n }));\r\n })\r\n .catch(err => {\r\n errorAlert(err.response.data.Message, 4000);\r\n this.setState(prev => ({\r\n ...prev, \r\n lobbyUsers: prev.lobbyUsers,\r\n processingGrant: null\r\n }));\r\n })\r\n }\r\n private grantAccess = (objectId: string, issuer: string, email: string) => {\r\n this.setState(prev => ({...prev, processingGrant: objectId}));\r\n usersApi.GrantExternalUserAccess(objectId, issuer, email)\r\n .then(result => {\r\n infoAlert(`${email} has been granted access`, 4000);\r\n this.setState(prev => ({\r\n ...prev,\r\n lobbyUsers: this.state.lobbyUsers.filter(o => o.objectId !== objectId),\r\n processingGrant: null,\r\n }));\r\n })\r\n .catch(err => {\r\n if (err.response.status === 400) {\r\n errorAlert(err.response.data.Message, 4000);\r\n this.setState(prev => ({\r\n ...prev, \r\n lobbyUsers: prev.lobbyUsers,\r\n processingGrant: null\r\n }));\r\n }\r\n })\r\n }\r\n}\r\n\r\n","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../../actionCreator\";\r\nimport { defaultListingPage } from \"../../../reducer\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Callout from \"modules/common/components/callout\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { PortalPagesFilterValues, PortalPagesListingPage, PortalPagesListItem } from \"modules/portalPages/models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\n\r\nimport Pagination from '@mui/material/Pagination';\r\n\r\n\r\nclass NewNavigationItem extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n anchorEl: null,\r\n calloutOpen: false,\r\n filters: {\r\n searchText: \"\"\r\n },\r\n isFetching: false,\r\n pagesList: { ...defaultListingPage },\r\n selectedPortalPage: undefined\r\n };\r\n }\r\n\r\n public render() {\r\n return (\r\n <React.Fragment>\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n startIcon={<AddIcon />}\r\n onClick={this.onShowPagesList}\r\n >\r\n New Navigation Item\r\n </Button>\r\n <Callout\r\n anchorEl={this.state.anchorEl}\r\n open={this.state.calloutOpen}\r\n setOpen={(toSet: boolean) => {\r\n this.onHidePagesList(toSet);\r\n }}\r\n arrowStyle={{ left: 225 }}\r\n header={<div>Select a page</div>}\r\n footer={\r\n <Pagination color=\"primary\" count={this.state.pagesList.totalPages} page={this.state.pagesList.currentPage} boundaryCount={2} showFirstButton showLastButton onChange={(ev, pageNumber) => this.fetchNavigationPortalPages(pageNumber, this.state.filters)} />\r\n }\r\n >\r\n <div className=\"navigation-items-callout\">\r\n {this.state.isFetching\r\n ? <Loading padding={12} />\r\n : <React.Fragment>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n fullWidth\r\n value={this.state.filters.searchText}\r\n placeholder=\"Search page\"\r\n InputProps={{\r\n startAdornment: <SearchIcon className=\"search-icon\" />\r\n }}\r\n onChange={this.onChangeSearchText}\r\n onKeyUp={this.onKeyUp}\r\n className=\"text-to-search\"\r\n />\r\n <List disablePadding>\r\n {this.state.pagesList.portalPages.length === 0\r\n ? <div>No pages were found.</div>\r\n : <div className=\"pages-list\">\r\n {this.state.pagesList.portalPages.map((portalPage) => {\r\n return (\r\n <ListItem key={portalPage.draftId} dense button onClick={() => this.onSelectPortalPage(portalPage)}>\r\n <ListItemText\r\n primary={portalPage.title}\r\n secondary={\r\n <React.Fragment>\r\n <Typography\r\n component=\"span\"\r\n display=\"block\"\r\n variant=\"body2\"\r\n >\r\n /{portalPage.url}\r\n </Typography>\r\n <Typography\r\n component=\"span\"\r\n display=\"block\"\r\n variant=\"body2\"\r\n >\r\n {portalPage.lastModifiedBy}\r\n </Typography>\r\n </React.Fragment>\r\n }\r\n />\r\n </ListItem>\r\n );\r\n })}\r\n </div>\r\n }\r\n </List>\r\n </React.Fragment>\r\n }\r\n </div>\r\n </Callout>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private fetchNavigationPortalPages = (pageNumber: number, filters: Partial<PortalPagesFilterValues>) => {\r\n this.setState({ isFetching: true });\r\n this.props.getNavigationPortalPages(pageNumber, filters).then((pagesList) => {\r\n this.setState({ isFetching: false, pagesList: pagesList });\r\n });\r\n }\r\n\r\n private onApplyFilters = () => {\r\n this.fetchNavigationPortalPages(1, this.state.filters);\r\n }\r\n\r\n private onChangeFilters = (value: Partial<PortalPagesFilterValues>) => {\r\n this.setState({ filters: { ...this.state.filters, ...value } });\r\n }\r\n\r\n private onChangeSearchText = (event) => {\r\n this.onChangeFilters({ searchText: event.target.value });\r\n }\r\n\r\n private onKeyUp = (key) => {\r\n if (key.keyCode === 13)\r\n this.onApplyFilters();\r\n }\r\n\r\n private onSelectPortalPage = (portalPage: PortalPagesListItem) => {\r\n const sequence: number = this.props.navigation.navigationItems.length + 1 || 2;\r\n this.props.createNewNavigationItem(portalPage.id, portalPage.title, portalPage.url, sequence);\r\n this.onHidePagesList();\r\n }\r\n\r\n private onHidePagesList = (toSet: boolean = false) => {\r\n this.setState({ calloutOpen: toSet });\r\n }\r\n\r\n private onShowPagesList = (event: any) => {\r\n this.setState({ anchorEl: event.currentTarget, filters: { searchText: \"\" }, calloutOpen: true });\r\n this.fetchNavigationPortalPages(1, {});\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\ninterface ComponentState {\r\n anchorEl: any;\r\n calloutOpen: boolean;\r\n filters: Partial<PortalPagesFilterValues>;\r\n isFetching: boolean;\r\n pagesList: PortalPagesListingPage;\r\n selectedPortalPage: PortalPagesListItem | undefined;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n navigation: state.portalPages.navigationItems\r\n }),\r\n {\r\n createNewNavigationItem: actions.createNewNavigationItem,\r\n getNavigationPortalPages: actions.getNavigationPortalPages\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(NewNavigationItem);\r\n","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../../actionCreator\";\r\nimport { defaultListingPage } from \"../../../reducer\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Callout from \"modules/common/components/callout\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { NavigationItem, PortalPagesFilterValues, PortalPagesListingPage, PortalPagesListItem } from \"modules/portalPages/models\";\r\n\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\n\r\nimport Pagination from '@mui/material/Pagination';\r\n\r\n\r\nclass NewChildNavigationItem extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n anchorEl: null,\r\n calloutOpen: false,\r\n filters: {\r\n searchText: \"\"\r\n },\r\n isFetching: false,\r\n pagesList: { ...defaultListingPage },\r\n selectedPortalPage: undefined\r\n };\r\n }\r\n\r\n public render() {\r\n return (\r\n <React.Fragment>\r\n <IconButton\r\n size=\"small\"\r\n onClick={this.onShowPagesList}\r\n >\r\n <AddIcon />\r\n </IconButton>\r\n <Callout\r\n anchorEl={this.state.anchorEl}\r\n open={this.state.calloutOpen}\r\n setOpen={(toSet) => {\r\n this.onHidePagesList();\r\n this.setState({calloutOpen: toSet});\r\n }}\r\n arrowStyle={{ left: \"70%\" }}\r\n header={<div>Select a page</div>}\r\n footer={\r\n <Pagination color=\"primary\" count={this.state.pagesList.totalPages} page={this.state.pagesList.currentPage} boundaryCount={2} showFirstButton showLastButton onChange={(ev, pageNumber) => this.fetchNavigationPortalPages(pageNumber, this.state.filters)} />\r\n }\r\n >\r\n <div className=\"navigation-items-callout\">\r\n {this.state.isFetching\r\n ? <Loading padding={12} />\r\n : <React.Fragment>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n fullWidth\r\n value={this.state.filters.searchText}\r\n placeholder=\"Search page\"\r\n InputProps={{\r\n startAdornment: <SearchIcon className=\"search-icon\" />\r\n }}\r\n onChange={this.onChangeSearchText}\r\n onKeyUp={this.onKeyUp}\r\n className=\"text-to-search\"\r\n />\r\n <List disablePadding>\r\n {this.state.pagesList.portalPages.length === 0\r\n ? <div>No pages were found.</div>\r\n : <div className=\"pages-list\">\r\n {this.state.pagesList.portalPages.map((portalPage) => {\r\n return (\r\n <ListItem key={portalPage.draftId} dense button onClick={() => this.onSelectPortalPage(portalPage)}>\r\n <ListItemText\r\n primary={portalPage.title}\r\n secondary={\r\n <React.Fragment>\r\n <Typography\r\n component=\"span\"\r\n display=\"block\"\r\n variant=\"body2\"\r\n >\r\n /{portalPage.url}\r\n </Typography>\r\n <Typography\r\n component=\"span\"\r\n display=\"block\"\r\n variant=\"body2\"\r\n >\r\n {portalPage.lastModifiedBy}\r\n </Typography>\r\n </React.Fragment>\r\n }\r\n />\r\n </ListItem>\r\n );\r\n })}\r\n </div>\r\n }\r\n </List>\r\n </React.Fragment>\r\n }\r\n </div>\r\n </Callout>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private fetchNavigationPortalPages = (pageNumber: number, filters: Partial<PortalPagesFilterValues>) => {\r\n this.setState({ isFetching: true });\r\n this.props.getNavigationPortalPages(pageNumber, filters).then((pagesList) => {\r\n this.setState({ isFetching: false, pagesList: pagesList });\r\n });\r\n }\r\n\r\n private onApplyFilters = () => {\r\n this.fetchNavigationPortalPages(1, this.state.filters);\r\n }\r\n\r\n private onChangeFilters = (value: Partial<PortalPagesFilterValues>) => {\r\n this.setState({ filters: { ...this.state.filters, ...value } });\r\n }\r\n\r\n private onChangeSearchText = (event) => {\r\n this.onChangeFilters({ searchText: event.target.value });\r\n }\r\n\r\n private onKeyUp = (key) => {\r\n if (key.keyCode === 13)\r\n this.onApplyFilters();\r\n }\r\n\r\n private onSelectPortalPage = (portalPage: PortalPagesListItem) => {\r\n const sequence: number = this.props.parentNavigationItem.children.length + 1 || 1;\r\n this.props.createNewChildNavigationItem(portalPage.id, this.props.parentNavigationItem.id, portalPage.title, portalPage.url, sequence);\r\n this.onHidePagesList();\r\n }\r\n\r\n\r\n private onHidePagesList = () => {\r\n this.setState({ anchorEl: null });\r\n }\r\n\r\n private onShowPagesList = (event: any) => {\r\n this.setState({ anchorEl: event.currentTarget, filters: { searchText: \"\" } });\r\n this.fetchNavigationPortalPages(1, {});\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n parentNavigationItem: NavigationItem;\r\n}\r\n\r\ninterface ComponentState {\r\n anchorEl: any;\r\n calloutOpen: boolean;\r\n filters: Partial<PortalPagesFilterValues>;\r\n isFetching: boolean;\r\n pagesList: PortalPagesListingPage;\r\n selectedPortalPage: PortalPagesListItem | undefined;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n navigation: state.portalPages.navigationItems\r\n }),\r\n {\r\n createNewChildNavigationItem: actions.createNewChildNavigationItem,\r\n getNavigationPortalPages: actions.getNavigationPortalPages\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(NewChildNavigationItem);","import React, { useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { Audience } from \"modules/audiences/models\";\r\nimport { NavigationItem } from \"../../../models\";\r\n\r\nimport AudienceChipLabels from \"modules/common/components/chips/audienceChipLabels\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport TabContent from \"pages/common/tabContent\";\r\nimport NewChildNavigationItem from \"../action-buttons/newChildNavigationItem\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Select from \"@mui/material/Select\";\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableContainer from \"@mui/material/TableContainer\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\n\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport KeyboardArrowDownIcon from \"@mui/icons-material/KeyboardArrowDown\";\r\nimport KeyboardArrowUpIcon from \"@mui/icons-material/KeyboardArrowUp\";\r\nimport SubdirectoryArrowLeftIcon from \"@mui/icons-material/SubdirectoryArrowLeft\";\r\n\r\n\r\ninterface HeaderCell {\r\n align: \"center\" | \"left\" | \"right\";\r\n disablePadding: boolean;\r\n id: string;\r\n label: string;\r\n}\r\n\r\ninterface IListItem {\r\n navigationItem: NavigationItem;\r\n parentSequence?: number;\r\n totalItems: number;\r\n onDelete: (navigationItem: NavigationItem) => void;\r\n onSetAsParent: (navigationItem: NavigationItem) => void;\r\n onUpdateSequence: (navigationItem: NavigationItem, sequence: number) => void;\r\n}\r\n\r\n\r\nconst ListItem: React.FunctionComponent<IListItem & { audiences: Audience[] }> = props => {\r\n const [showChildItems, setShowChildItems] = useState(false);\r\n\r\n const { navigationItem, totalItems } = props;\r\n\r\n return (\r\n <React.Fragment>\r\n <TableRow\r\n hover={!navigationItem.isHome}\r\n className={!navigationItem.parentId ? \"parent-item\" : \"child-item\"}\r\n >\r\n <TableCell align=\"left\" padding=\"checkbox\">\r\n {!!navigationItem.children.length &&\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => setShowChildItems(!showChildItems)}\r\n >\r\n {showChildItems ? <KeyboardArrowUpIcon /> : <KeyboardArrowDownIcon />}\r\n </IconButton>\r\n }\r\n </TableCell>\r\n <TableCell align=\"left\" className=\"navigation-item-order\">\r\n <FormControl size=\"small\">\r\n <Select\r\n variant=\"outlined\"\r\n value={navigationItem.sequence}\r\n disabled={navigationItem.isHome}\r\n onChange={(event) => props.onUpdateSequence(navigationItem, event.target.value as number)}\r\n className=\"item-sequence\"\r\n >\r\n {navigationItem.isHome\r\n ? <MenuItem key={1} value={1}>1</MenuItem>\r\n : Array.from(Array(totalItems).keys()).slice(!navigationItem.parentId ? 1 : 0).map((number) => {\r\n return <MenuItem key={number} value={number + 1}>{`${!!props.parentSequence ? props.parentSequence + \".\" : \"\"}${number + 1}`}</MenuItem>;\r\n })\r\n }\r\n </Select>\r\n </FormControl>\r\n </TableCell>\r\n <TableCell align=\"left\">{navigationItem.name}{navigationItem.state === \"Disabled\" ? \" (disabled)\" : \"\"}</TableCell>\r\n <TableCell align=\"left\">/{navigationItem.url}</TableCell>\r\n <TableCell align=\"left\"><AudienceChipLabels audienceIds={navigationItem.audiences} audiences={props.audiences} /></TableCell>\r\n <TableCell align=\"right\">\r\n {!navigationItem.isHome &&\r\n <React.Fragment>\r\n {!navigationItem.parentId\r\n ? <NewChildNavigationItem parentNavigationItem={navigationItem} />\r\n : <IconButton\r\n size=\"small\"\r\n onClick={() => props.onSetAsParent(navigationItem)}\r\n >\r\n <SubdirectoryArrowLeftIcon />\r\n </IconButton>\r\n }\r\n <IconButton\r\n size=\"small\"\r\n onClick={() => props.onDelete(navigationItem)}\r\n >\r\n <DeleteIcon />\r\n </IconButton>\r\n </React.Fragment>\r\n }\r\n </TableCell>\r\n </TableRow>\r\n {showChildItems && !!navigationItem.children.length && navigationItem.children.map((childItem: NavigationItem) => {\r\n return (\r\n <ListItem key={childItem.id} audiences={props.audiences} navigationItem={childItem} parentSequence={navigationItem.sequence} totalItems={navigationItem.children.length} onDelete={props.onDelete} onSetAsParent={props.onSetAsParent} onUpdateSequence={props.onUpdateSequence} />\r\n );\r\n })}\r\n </React.Fragment>\r\n );\r\n}\r\n\r\nclass NavigationItemsList extends React.Component<PropsWithRedux, ComponentState> {\r\n public render() {\r\n const { page } = this.props;\r\n\r\n if (page.isFetching)\r\n return <Loading />;\r\n\r\n return (\r\n <div>\r\n <TabContent>\r\n {this.getList()}\r\n </TabContent>\r\n </div>\r\n );\r\n }\r\n\r\n\r\n private getHeader = (): HeaderCell[] => {\r\n let header: HeaderCell[] = [\r\n { id: \"expand\", disablePadding: false, label: \"\", align: \"left\" },\r\n { id: \"order\", disablePadding: false, label: \"Order\", align: \"left\" },\r\n { id: \"title\", disablePadding: true, label: \"Page title\", align: \"left\" },\r\n { id: \"url\", disablePadding: false, label: \"URL\", align: \"left\" },\r\n { id: \"audiences\", disablePadding: false, label: \"Accessible to\", align: \"left\" },\r\n { id: \"actions\", disablePadding: false, label: \"Actions\", align: \"right\" }\r\n ];\r\n \r\n return header;\r\n }\r\n\r\n private getList = (): JSX.Element => {\r\n const { page } = this.props;\r\n\r\n if (page.isFetching)\r\n return <Loading />;\r\n \r\n if (!page.navigationItems.length)\r\n return <div>No navigation items were found.</div>;\r\n\r\n return (\r\n <TableContainer>\r\n <Table size=\"medium\">\r\n <TableHead>\r\n <TableRow>\r\n {this.getHeader().map((headerCell) => (\r\n <TableCell\r\n key={headerCell.id}\r\n align={headerCell.align}\r\n padding={headerCell.disablePadding ? \"none\" : \"normal\"}\r\n >\r\n {headerCell.label}\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody className=\"navigation-items-list\">\r\n {page.navigationItems\r\n .map((navigationItem) => {\r\n return (\r\n <ListItem\r\n key={navigationItem.id}\r\n audiences={this.props.audiences}\r\n navigationItem={navigationItem}\r\n totalItems={page.navigationItems.length}\r\n onDelete={this.onDeleteNavigationItem}\r\n onSetAsParent={this.onSetNavigationItemAsParent}\r\n onUpdateSequence={this.onUpdateNavigationItemSequence}\r\n />\r\n );\r\n })\r\n }\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n );\r\n }\r\n\r\n private onDeleteNavigationItem = async (navigationItem: NavigationItem) => {\r\n if (await confirm.show({ text: \"Are you sure you want to delete this navigation item?\", title: \"Delete navigation item\" }))\r\n this.props.deleteNavigationItem(navigationItem.id);\r\n }\r\n\r\n private onSetNavigationItemAsParent = (navigationItem: NavigationItem) => {\r\n const sequence: number = this.props.page.navigationItems.length + 1 || 2;\r\n this.props.setNavigationItemAsParent(navigationItem.id, sequence);\r\n }\r\n\r\n private onUpdateNavigationItemSequence = (navigationItem: NavigationItem, sequence: number) => {\r\n this.props.updateNavigationItemSequence(navigationItem.id, navigationItem.parentId, sequence);\r\n }\r\n}\r\n \r\n\r\ninterface ComponentProps {\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences,\r\n page: state.portalPages.navigationItems\r\n }),\r\n {\r\n deleteNavigationItem: actions.deleteNavigationItem,\r\n setNavigationItemAsParent: actions.setNavigationItemAsParent,\r\n updateNavigationItemSequence: actions.updateNavigationItemSequence\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(NavigationItemsList);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\n\r\nimport NavigationItemsList from \"./navigationItemsList\";\r\n\r\n\r\nclass NavigationItemsListing extends React.Component<PropsWithRedux, ComponentState> {\r\n public componentDidMount() {\r\n this.fetchItems();\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.shouldFetch && (this.props.shouldFetch !== prevProps.shouldFetch)) {\r\n this.fetchItems();\r\n }\r\n }\r\n\r\n public render() {\r\n return (\r\n <div className=\"navigation-items-listing\">\r\n <NavigationItemsList />\r\n </div>\r\n );\r\n }\r\n\r\n\r\n private fetchItems = () => {\r\n !this.props.isFetching &&\r\n this.props.getNavigationItems();\r\n }\r\n}\r\n \r\n\r\ninterface ComponentProps {\r\n}\r\n\r\ninterface ComponentState {\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n isFetching: state.portalPages.navigationItems.isFetching,\r\n shouldFetch: state.portalPages.navigationItems.shouldFetch,\r\n tenantSettings: state.settings.tenantSettings,\r\n tenant: state.tenant.id\r\n }),\r\n {\r\n getNavigationItems: actions.getNavigationItems,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(NavigationItemsListing);","import * as React from \"react\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as actions from \"../actionCreator\";\r\nimport * as audiencesActions from \"modules/audiences/actionCreator\";\r\n\r\nimport NewNavigationItem from \"../global-components/navigation-items/action-buttons/newNavigationItem\";\r\nimport NavigationItemsListing from \"../global-components/navigation-items/navigation-items-listing/navigationItemsListing\";\r\n\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Breadcrumb from \"pages/common/breadcrumb\";\r\nimport MainContent from \"pages/common/mainContent\";\r\n\r\nimport \"../styles/dialogs.sass\";\r\nimport \"../styles/navigationItems.sass\";\r\n\r\n\r\nclass NavigationItemsManagementPage extends React.Component<PropsWithRedux, {}> {\r\n public componentDidMount() {\r\n if (!this.props.audiences.length)\r\n this.props.getAudiences();\r\n }\r\n \r\n public render() {\r\n return (\r\n <BasePage fullWidth>\r\n <Breadcrumb\r\n items={[\r\n { title: \"Global Components\" },\r\n { title: \"Navigation Items\" }\r\n ]}\r\n backItem={{ title: \"Back to Manage Portal Pages\", link: \"~/admin/portalPages\" }}\r\n rightComponent={\r\n <div className=\"navigation-items\">\r\n <NewNavigationItem />\r\n </div>\r\n }\r\n />\r\n <MainContent>\r\n <NavigationItemsListing />\r\n <ErrorSnackbar errorMessage={this.props.errorMessage} clearErrorMessage={this.props.clearErrorMessage} />\r\n <LoadingOverlay absolute={true} show={this.props.isDeleting || this.props.isSaving} />\r\n </MainContent>\r\n </BasePage>\r\n );\r\n }\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences,\r\n errorMessage: state.portalPages.errorMessage,\r\n isDeleting: state.portalPages.isDeleting,\r\n isSaving: state.portalPages.isSaving\r\n }),\r\n {\r\n clearErrorMessage: actions.clearErrorMessage,\r\n getAudiences: audiencesActions.getAudiences\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(NavigationItemsManagementPage);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Drawer from \"@mui/material/Drawer\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Paper from \"@mui/material/Paper\";\r\n\r\nimport ArrowBackIcon from \"@mui/icons-material/ArrowBack\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\n\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n globalComponent: {\r\n backgroundColor: theme.palette.background.default,\r\n \"&:hover\": {\r\n backgroundColor: \"#e8e8e8\"\r\n }\r\n }\r\n })\r\n);\r\n\r\n\r\nconst GlobalComponent: React.FunctionComponent<{ onClick: () => void }> = props => {\r\n const classes = useStyles();\r\n\r\n return (\r\n <Paper onClick={props.onClick} className={classes.globalComponent}>\r\n {props.children}\r\n </Paper>\r\n );\r\n}\r\n\r\n\r\nclass GlobalComponentsDrawer extends React.Component<PropsWithRedux, ComponentState> {\r\n public render() {\r\n return (\r\n <Drawer anchor=\"right\" open={this.props.showGlobalComponents} onClose={this.onClose} classes={{ paper: \"portal-pages-list-drawer\" }}>\r\n <Paper square elevation={0} className=\"portal-pages-list-header\">\r\n <IconButton onClick={this.onClose} size=\"large\">\r\n <ArrowBackIcon />\r\n </IconButton>\r\n <div>Global Components</div>\r\n </Paper>\r\n <div className=\"global-components-list\">\r\n <GlobalComponent onClick={this.onSelectNavigationItems}>\r\n <img src=\"/images/navigation.png\" alt=\"navigation icon\" />\r\n <div>Navigation Items</div>\r\n </GlobalComponent>\r\n </div>\r\n </Drawer>\r\n );\r\n }\r\n\r\n private onSelectNavigationItems = () => {\r\n this.onClose();\r\n this.props.redirectTo(\"/\" + this.props.tenantId + \"/admin/portalPages/navigation\");\r\n }\r\n\r\n private onClose = () => {\r\n this.props.hideGlobalComponents();\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\ninterface ComponentState {\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n showGlobalComponents: state.portalPages.showGlobalComponents,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n hideGlobalComponents: actions.hideGlobalComponents,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(GlobalComponentsDrawer);","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport MoreOptionsButton from \"modules/common/components/buttons/moreOptionsButton\";\r\n\r\nimport List from \"@mui/material/List\";\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\n\r\n\r\nconst OpenGlobalComponents: React.FunctionComponent<PropsWithRedux> = props => {\r\n return (\r\n <div>\r\n <MoreOptionsButton>\r\n <List disablePadding>\r\n <MoreOptionsItem\r\n text=\"Open Global Components\"\r\n onClick={props.showGlobalComponents}\r\n />\r\n </List>\r\n </MoreOptionsButton>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps\r\n }),\r\n {\r\n showGlobalComponents: actions.showGlobalComponents\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(OpenGlobalComponents);","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\n\r\n\r\nconst NewPortalPage: React.FunctionComponent<PropsWithRedux> = props => {\r\n return (\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n startIcon={<AddIcon />}\r\n onClick={props.showNewPortalPage}\r\n >\r\n New Page\r\n </Button>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps\r\n }),\r\n {\r\n showNewPortalPage: actions.showNewPortalPage\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(NewPortalPage);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport * as audiencesActions from \"modules/audiences/actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { Audience } from \"modules/audiences/models\";\r\n\r\nimport Callout from \"modules/common/components/callout\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\n\r\n\r\nclass AudiencesList extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n isLoading: false,\r\n selectedAudiences: props.selectedAudiences,\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n if (!this.props.audiences.length) {\r\n this.setState({ isLoading: true });\r\n this.props.getAudiences().then(() => {\r\n this.setState({ isLoading: false });\r\n });\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (!!this.props.anchorEl && !prevProps.anchorEl)\r\n this.setState({ selectedAudiences: this.props.selectedAudiences });\r\n }\r\n\r\n public render() {\r\n return (\r\n <Callout\r\n anchorEl={this.props.anchorEl}\r\n open={this.props.calloutOpen}\r\n setOpen={(toSet) => {\r\n this.onApply();\r\n this.props.setCalloutOpen(toSet);\r\n }}\r\n >\r\n {this.getList()}\r\n </Callout>\r\n );\r\n }\r\n\r\n private getList = () => {\r\n if (this.state.isLoading)\r\n return <Loading />;\r\n \r\n if (!this.props.audiences.length)\r\n return <div>No audiences were found</div>;\r\n \r\n return (\r\n <List disablePadding>\r\n {this.props.audiences.map((audience) =>\r\n <ListItem key={audience.id} dense button onClick={() => this.onSelectAudience(audience)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!this.state.selectedAudiences.find((selectedAudience) => selectedAudience.id === audience.id)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={audience.displayName} />\r\n </ListItem>\r\n )}\r\n </List>\r\n );\r\n }\r\n\r\n private onApply = () => {\r\n this.props.onChange(this.state.selectedAudiences);\r\n }\r\n\r\n private onSelectAudience = (audience: Audience) => {\r\n const hasSelectedAudience: boolean = !!this.state.selectedAudiences.find((selectedAudience) => selectedAudience.id === audience.id);\r\n if (hasSelectedAudience)\r\n this.setState({ ...this.state, selectedAudiences: this.state.selectedAudiences.filter((selectedAudience) => selectedAudience.id !== audience.id) });\r\n else\r\n this.setState({ ...this.state, selectedAudiences: this.state.selectedAudiences.concat([audience]) });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n anchorEl: any;\r\n selectedAudiences: Audience[];\r\n onChange: (audiences: Audience[]) => void;\r\n calloutOpen: boolean;\r\n setCalloutOpen: (toSet: boolean) => void;\r\n}\r\n\r\ninterface ComponentState {\r\n isLoading: boolean;\r\n selectedAudiences: Audience[];\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n getAudiences: audiencesActions.getAudiences,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(AudiencesList);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { Audience } from \"modules/audiences/models\";\r\n\r\nimport AudiencesList from \"./audiencesList\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport Chip from \"@mui/material/Chip\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\n\r\nclass NewPortalPageDialog extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n anchorEl: null,\r\n audiences: [],\r\n isChecking: false,\r\n pageTitle: \"\",\r\n pageTitleIsValid: true,\r\n pageUrl: \"\",\r\n pageUrlIsValid: true,\r\n urlErrorMessage: \"\",\r\n calloutOpen: false,\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.showNewPortalPage && !prevProps.showNewPortalPage)\r\n this.setState({\r\n anchorEl: null,\r\n audiences: [],\r\n isChecking: false,\r\n pageTitle: \"\",\r\n pageTitleIsValid: true,\r\n pageUrl: \"\",\r\n pageUrlIsValid: true,\r\n urlErrorMessage: \"\"\r\n });\r\n }\r\n\r\n public render() {\r\n return (\r\n <Dialog open={this.props.showNewPortalPage} maxWidth={false} onClose={this.onClose}>\r\n <DialogTitle className=\"portal-pages-dialog-header\">\r\n <div className=\"portal-pages-dialog-header-title\">\r\n <Typography variant=\"h2\">Create new page</Typography>\r\n <IconButton onClick={this.onClose} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent className=\"portal-page-dialog-content\">\r\n <div className=\"portal-page-dialog-content-form\">\r\n <div>\r\n <div>Page title</div>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.state.pageTitle}\r\n autoComplete=\"off\"\r\n disabled={this.state.isChecking}\r\n error={!this.state.pageTitleIsValid}\r\n helperText={!this.state.pageTitleIsValid ? \"Cannot contain numbers or special characters\" : \"\"}\r\n fullWidth\r\n inputProps={{\r\n maxLength: 25\r\n }}\r\n onChange={this.onChangePageTitle}\r\n />\r\n </div>\r\n <div>\r\n <div>Page URL</div>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.state.pageUrl}\r\n autoComplete=\"off\"\r\n disabled={this.state.isChecking}\r\n error={!this.state.pageUrlIsValid}\r\n helperText={this.state.urlErrorMessage || \"\"}\r\n fullWidth\r\n onChange={this.onChangePageUrl}\r\n />\r\n </div>\r\n <div>\r\n <div className=\"audiences-list-label\">Accessible to</div>\r\n <div>\r\n {!this.state.audiences.length\r\n ? <div className=\"audiences-list\">\r\n <Chip\r\n label=\"All users\"\r\n disabled={true}\r\n className=\"all-users-audience\"\r\n />\r\n </div>\r\n : <div className=\"audiences-list\">\r\n {this.state.audiences.map((audience) =>\r\n <Chip\r\n key={audience.id}\r\n label={audience.displayName}\r\n onDelete={() => this.onRemoveAudience(audience)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n </div>\r\n }\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n startIcon={<AddIcon />}\r\n disabled={this.state.isChecking}\r\n onClick={this.onShowAudiencesList}\r\n >\r\n Add audience\r\n </Button>\r\n <AudiencesList \r\n anchorEl={this.state.anchorEl} \r\n selectedAudiences={this.state.audiences} \r\n onChange={this.onChangeAudiences} \r\n setCalloutOpen={this.setCalloutOpen} \r\n calloutOpen={this.state.calloutOpen}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </DialogContent>\r\n <DialogActions className=\"portal-pages-dialog-footer\">\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onClose}>Cancel</Button>\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n disabled={this.state.isChecking || !this.state.pageTitle || !this.state.pageTitleIsValid || !this.state.pageUrl || !this.state.pageUrlIsValid}\r\n onClick={this.onNext}\r\n >\r\n Next\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n }\r\n\r\n private onNext = () => {\r\n this.setState({ isChecking: true });\r\n this.props.checkIfUrlExists(this.state.pageUrl).then((exists) => {\r\n this.setState({ isChecking: false });\r\n if (exists) {\r\n this.setState({ pageUrlIsValid: false, urlErrorMessage: \"URL already exists\" });\r\n } else {\r\n this.onClose();\r\n this.props.createNewDraft(this.state.pageTitle.trim(), this.state.pageUrl, this.state.audiences.map(audience => audience.id)).then((draftId) => {\r\n if (!!draftId)\r\n this.props.redirectTo(\"/\" + this.props.tenantId + \"/admin/portalPages/edit/\" + draftId);\r\n });\r\n }\r\n });\r\n }\r\n\r\n private onChangeAudiences = (audiences: Audience[]) => {\r\n this.setState({ audiences, anchorEl: null });\r\n }\r\n\r\n private onChangePageTitle = (event) => {\r\n const isInvalid = /[^A-Za-z\\s]/.test(event.target.value) || event.target.value.toLowerCase() === \"home\";\r\n this.setState({ pageTitle: event.target.value, pageTitleIsValid: !isInvalid });\r\n }\r\n\r\n private onChangePageUrl = (event) => {\r\n const isInvalid = /[^A-Za-z0-9-]/.test(event.target.value) || event.target.value.toLowerCase() === \"home\";\r\n this.setState({ pageUrl: event.target.value, pageUrlIsValid: !isInvalid, urlErrorMessage: isInvalid ? \"Cannot contain special characters\" : \"\" });\r\n }\r\n\r\n private onClose = () => {\r\n this.props.hideNewPortalPage();\r\n }\r\n \r\n private onRemoveAudience = (audience: Audience) => {\r\n this.onChangeAudiences(this.state.audiences.filter((selectedAudience) => selectedAudience.id !== audience.id));\r\n }\r\n\r\n private onShowAudiencesList = (event: any) => {\r\n this.setState({ anchorEl: event.currentTarget, calloutOpen: true });\r\n }\r\n\r\n private setCalloutOpen = (toSet: boolean) => {\r\n this.setState({calloutOpen: toSet});\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {}\r\n\r\ninterface ComponentState {\r\n anchorEl: any;\r\n audiences: Audience[];\r\n isChecking: boolean;\r\n pageTitle: string;\r\n pageTitleIsValid: boolean;\r\n pageUrl: string;\r\n pageUrlIsValid: boolean;\r\n urlErrorMessage: string;\r\n calloutOpen: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n showNewPortalPage: state.portalPages.showNewPortalPage,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n checkIfUrlExists: actions.checkIfUrlExists,\r\n createNewDraft: actions.createNewDraft,\r\n hideNewPortalPage: actions.hideNewPortalPage,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(NewPortalPageDialog);","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { PortalPagesListItem } from \"../../models\";\r\n\r\nimport MoreOptionsIconButton from \"modules/common/components/buttons/moreOptionsIconButton\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport Divider from \"@mui/material/Divider\";\r\nimport List from \"@mui/material/List\";\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\n\r\n\r\nconst MorePortalPageOptions: React.FunctionComponent<PropsWithRedux> = props => {\r\n const { portalPage } = props;\r\n\r\n return (\r\n <MoreOptionsIconButton>\r\n <List disablePadding>\r\n <MoreOptionsItem\r\n text=\"Open in page editor\"\r\n onClick={() => {\r\n props.redirectTo(\"/\" + props.tenantId + \"/admin/portalPages/edit/\" + props.portalPage.draftId);\r\n }}\r\n />\r\n <Divider light />\r\n <MoreOptionsItem\r\n text=\"Preview\"\r\n onClick={() => {\r\n props.onPreviewPortalPage();\r\n props.onSelection();\r\n }}\r\n />\r\n {!portalPage.isHome &&\r\n <Divider light />\r\n }\r\n {!portalPage.isHome && portalPage.state === \"Enabled\" &&\r\n <MoreOptionsItem\r\n text=\"Set as homepage\"\r\n onClick={async () => {\r\n if (await confirm.show({\r\n text: \"You are about to set \" + portalPage.title + \" as the Homepage. This will change the page settings including the URL and the audiences who can access the page.<br /><br />\"+\r\n \"Do you want to continue?\",\r\n title: \"Set as homepage\"\r\n })) {\r\n props.setPortalPageAsHome(portalPage.id);\r\n props.onSelection();\r\n }\r\n }}\r\n />\r\n }\r\n {(portalPage.state === \"Draft\" || portalPage.hasPendingDraft) &&\r\n <MoreOptionsItem\r\n text={portalPage.hasPendingDraft\r\n ? portalPage.state === \"Enabled\"\r\n ? \"Publish changes\"\r\n : \"Publish with changes\"\r\n : \"Publish now\"\r\n }\r\n onClick={() => {\r\n props.publishDraft(portalPage.draftId);\r\n props.onSelection();\r\n }}\r\n />\r\n }\r\n {!portalPage.isHome && portalPage.state === \"Enabled\" &&\r\n <MoreOptionsItem\r\n text=\"Disable\"\r\n onClick={() => {\r\n props.disablePortalPage(portalPage.id);\r\n props.onSelection();\r\n }}\r\n />\r\n }\r\n {portalPage.state === \"Disabled\" &&\r\n <MoreOptionsItem\r\n text=\"Enable\"\r\n onClick={() => {\r\n props.enablePortalPage(portalPage.id);\r\n props.onSelection();\r\n }}\r\n />\r\n }\r\n {!portalPage.isHome &&\r\n <MoreOptionsItem\r\n text=\"Delete\"\r\n textStyle={{color: \"#B72026\"}}\r\n onClick={async () => {\r\n if (portalPage.state === \"Draft\") {\r\n if (await confirm.show({ \r\n text: `You're about to permanently delete '${portalPage.title}'. You cannot undo this action. Are you sure?`, \r\n title: \"Delete Draft\",\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\"\r\n }))\r\n props.deleteDraft(portalPage.draftId);\r\n } else {\r\n if (await confirm.show({ \r\n text: `You're about to permanently delete '${portalPage.title}'. You cannot undo this action. Are you sure?`, \r\n title: \"Delete Portal Page\",\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\"\r\n }))\r\n props.deletePortalPage(portalPage.id);\r\n }\r\n props.onSelection();\r\n }}\r\n />\r\n }\r\n </List>\r\n </MoreOptionsIconButton>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n portalPage: PortalPagesListItem;\r\n onPreviewPortalPage: () => void;\r\n onSelection: () => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n deleteDraft: actions.deleteDraft,\r\n deletePortalPage: actions.deletePortalPage,\r\n disablePortalPage: actions.disablePortalPage,\r\n enablePortalPage: actions.enablePortalPage,\r\n publishDraft: actions.publishDraft,\r\n redirectTo: push,\r\n setPortalPageAsHome: actions.setPortalPageAsHome\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(MorePortalPageOptions);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { Audience } from \"modules/audiences/models\";\r\nimport { PortalPagesListItem } from \"../../models\";\r\n\r\nimport AudiencesList from \"./audiencesList\";\r\n\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Chip from \"@mui/material/Chip\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\n\r\nclass ModifyPortalPageSettingsDialog extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n anchorEl: null,\r\n audiences: props.portalPage && props.portalPage.audiences ? props.portalPage.audiences.map(audience => this.convertAudienceIdToAudience(audience)) : [],\r\n isChecking: false,\r\n pageTitle: props.portalPage ? props.portalPage.title : \"\",\r\n pageTitleIsValid: true,\r\n pageUrl: props.portalPage ? props.portalPage.url : \"\",\r\n pageUrlIsValid: true,\r\n urlErrorMessage: \"\",\r\n calloutOpen: false\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.show && !prevProps.show)\r\n this.setState({\r\n anchorEl: null,\r\n audiences: this.props.portalPage && this.props.portalPage.audiences ? this.props.portalPage.audiences.map(audience => this.convertAudienceIdToAudience(audience)) : [],\r\n isChecking: false,\r\n pageTitle: this.props.portalPage ? this.props.portalPage.title : \"\",\r\n pageTitleIsValid: true,\r\n pageUrl: this.props.portalPage ? this.props.portalPage.url : \"\",\r\n pageUrlIsValid: true,\r\n urlErrorMessage: \"\"\r\n });\r\n }\r\n\r\n public render() {\r\n return (\r\n <Dialog open={this.props.show} maxWidth={false} onClose={this.onClose}>\r\n <DialogTitle className=\"portal-pages-dialog-header\">\r\n <div className=\"portal-pages-dialog-header-title\">\r\n <Typography variant=\"h2\">Modify page settings</Typography>\r\n <IconButton onClick={this.onClose} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent className=\"portal-page-dialog-content\">\r\n <div className=\"portal-page-dialog-content-form\" style={{paddingTop: \"8px\"}}>\r\n <div>\r\n <div>Page title</div>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.state.pageTitle}\r\n autoComplete=\"off\"\r\n disabled={this.state.isChecking}\r\n error={!this.state.pageTitleIsValid}\r\n helperText={!this.state.pageTitleIsValid ? \"Cannot contain numbers or special characters\" : \"\"}\r\n fullWidth\r\n inputProps={{\r\n maxLength: 25\r\n }}\r\n onChange={this.onChangePageTitle}\r\n />\r\n </div>\r\n <div>\r\n <div>Page URL</div>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.state.pageUrl}\r\n autoComplete=\"off\"\r\n disabled={this.state.isChecking}\r\n error={!this.state.pageUrlIsValid}\r\n helperText={this.state.urlErrorMessage || \"\"}\r\n fullWidth\r\n onChange={this.onChangePageUrl}\r\n />\r\n </div>\r\n <div>\r\n <div className=\"audiences-list-label\">Accessible to</div>\r\n <div>\r\n {!this.state.audiences.length\r\n ? <div className=\"audiences-list\">\r\n <Chip\r\n label=\"All users\"\r\n disabled={true}\r\n className=\"all-users-audience\"\r\n />\r\n </div>\r\n : <div className=\"audiences-list\">\r\n {this.state.audiences.map((audience) =>\r\n <Chip\r\n key={audience.id}\r\n label={audience.displayName}\r\n onDelete={() => this.onRemoveAudience(audience)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n </div>\r\n }\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n startIcon={<AddIcon />}\r\n disabled={this.state.isChecking}\r\n onClick={this.onShowAudiencesList}\r\n >\r\n Add audience\r\n </Button>\r\n <AudiencesList \r\n anchorEl={this.state.anchorEl} \r\n selectedAudiences={this.state.audiences} \r\n onChange={this.onChangeAudiences} \r\n setCalloutOpen={this.setCalloutOpen} \r\n calloutOpen={this.state.calloutOpen}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </DialogContent>\r\n <DialogActions className=\"portal-pages-dialog-footer\">\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onClose}>Cancel</Button>\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n disabled={this.state.isChecking || !this.state.pageTitle || !this.state.pageTitleIsValid || !this.state.pageUrl || !this.state.pageUrlIsValid}\r\n onClick={this.onSave}\r\n >\r\n Save\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n }\r\n\r\n private convertAudienceIdToAudience = (audienceId: string): Audience => {\r\n const matchedAudience: Audience | undefined = this.props.audiences.find((audience) => audience.id === audienceId);\r\n if (!matchedAudience)\r\n return { id: audienceId, displayName: \"\", description: \"\", enabled: true, type: \"\" };\r\n return matchedAudience;\r\n }\r\n\r\n private onSave = () => {\r\n this.setState({ isChecking: true });\r\n\r\n if (this.props.portalPage?.url === this.state.pageUrl) {\r\n this.savePageDetails();\r\n } else {\r\n this.props.checkIfUrlExists(this.state.pageUrl).then((exists) => {\r\n this.setState({ isChecking: false }, () => {\r\n if (exists) {\r\n this.setState({ pageUrlIsValid: false, urlErrorMessage: \"URL already exists\" });\r\n } else {\r\n this.savePageDetails();\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n private savePageDetails(){\r\n if (this.props.portalPage!.state === \"Draft\") {\r\n this.props.modifyDraftDetails(this.props.portalPage!.draftId, this.state.pageTitle.trim(), this.state.pageUrl, this.state.audiences.map(audience => audience.id)).then((succeeded) => {\r\n this.props.updateDraft();\r\n if (succeeded && !!this.props.onSuccess)\r\n this.props.onSuccess();\r\n });\r\n this.onClose();\r\n } else {\r\n this.props.modifyPortalPageDetails(this.props.portalPage!.id, this.state.pageTitle.trim(), this.state.pageUrl, this.state.audiences.map(audience => audience.id)).then((succeeded) => {\r\n this.props.updateDraft();\r\n if (succeeded && !!this.props.onSuccess)\r\n this.props.onSuccess();\r\n });\r\n this.onClose();\r\n }\r\n }\r\n\r\n private onChangeAudiences = (audiences: Audience[]) => {\r\n this.setState({ audiences, anchorEl: null });\r\n }\r\n\r\n private onChangePageTitle = (event) => {\r\n const isInvalid = /[^A-Za-z\\s]/.test(event.target.value) || event.target.value.toLowerCase() === \"home\";\r\n this.setState({ pageTitle: event.target.value, pageTitleIsValid: !isInvalid });\r\n }\r\n\r\n private onChangePageUrl = (event) => {\r\n const isInvalid = /[^A-Za-z0-9-]/.test(event.target.value) || event.target.value.toLowerCase() === \"home\";\r\n this.setState({ pageUrl: event.target.value, pageUrlIsValid: !isInvalid, urlErrorMessage: isInvalid ? \"Cannot contain special characters\" : \"\" });\r\n }\r\n\r\n private onClose = () => {\r\n this.props.onClose();\r\n }\r\n\r\n private onRemoveAudience = (audience: Audience) => {\r\n this.onChangeAudiences(this.state.audiences.filter((selectedAudience) => selectedAudience.id !== audience.id));\r\n }\r\n\r\n private onShowAudiencesList = (event: any) => {\r\n this.setState({ anchorEl: event.currentTarget, calloutOpen: true });\r\n }\r\n\r\n private setCalloutOpen = (toSet: boolean) => {\r\n this.setState({calloutOpen: toSet});\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n portalPage: PortalPagesListItem | undefined;\r\n onSuccess?: () => void;\r\n onClose: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n anchorEl: any;\r\n audiences: Audience[];\r\n isChecking: boolean;\r\n pageTitle: string;\r\n pageTitleIsValid: boolean;\r\n pageUrl: string;\r\n pageUrlIsValid: boolean;\r\n urlErrorMessage: string;\r\n calloutOpen: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences\r\n }),\r\n {\r\n checkIfUrlExists: actions.checkIfUrlExists,\r\n modifyDraftDetails: actions.modifyDraftDetails,\r\n modifyPortalPageDetails: actions.modifyPortalPageDetails,\r\n updateDraft: actions.updateDraft\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(ModifyPortalPageSettingsDialog);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { PortalPagesListItem } from \"../../models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\n\r\nclass ModifyPortalPageTitleDialog extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n pageTitle: props.portalPage ? props.portalPage.title : \"\",\r\n pageTitleIsValid: true\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.show && !prevProps.show)\r\n this.setState({\r\n pageTitle: this.props.portalPage ? this.props.portalPage.title : \"\",\r\n pageTitleIsValid: true\r\n });\r\n }\r\n\r\n public render() {\r\n return (\r\n <Dialog open={this.props.show} maxWidth={false} onClose={this.onClose}>\r\n <DialogTitle className=\"portal-pages-dialog-header\">\r\n <div className=\"portal-pages-dialog-header-title\">\r\n <Typography variant=\"h2\">Modify page title</Typography>\r\n <IconButton onClick={this.onClose} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent className=\"portal-page-dialog-content\">\r\n <div className=\"portal-page-dialog-content-form\">\r\n <div>\r\n <div>Page title</div>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.state.pageTitle}\r\n autoComplete=\"off\"\r\n error={!this.state.pageTitleIsValid}\r\n fullWidth\r\n inputProps={{\r\n maxLength: 25\r\n }}\r\n onChange={this.onChangePageTitle}\r\n />\r\n </div>\r\n </div>\r\n </DialogContent>\r\n <DialogActions className=\"portal-pages-dialog-footer\">\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onClose}>Cancel</Button>\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n disabled={!this.state.pageTitle || !this.state.pageTitleIsValid}\r\n onClick={this.onSave}\r\n >\r\n Save\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n }\r\n\r\n private onSave = () => {\r\n if (this.props.portalPage!.state === \"Draft\") {\r\n this.props.modifyDraftTitle(this.props.portalPage!.draftId, this.state.pageTitle.trim()).then((succeeded) => {\r\n this.props.updateDraft();\r\n if (succeeded && !!this.props.onSuccess)\r\n this.props.onSuccess();\r\n });\r\n this.onClose();\r\n } else {\r\n this.props.modifyPortalPageTitle(this.props.portalPage!.id, this.state.pageTitle.trim()).then((succeeded) => {\r\n this.props.updateDraft();\r\n if (succeeded && !!this.props.onSuccess)\r\n this.props.onSuccess();\r\n });\r\n this.onClose();\r\n }\r\n }\r\n\r\n private onChangePageTitle = (event) => {\r\n const isInvalid = /[^A-Za-z0-9\\s]/.test(event.target.value) || event.target.value.toLowerCase() === \"home\";\r\n this.setState({ pageTitle: event.target.value, pageTitleIsValid: !isInvalid });\r\n }\r\n\r\n private onClose = () => {\r\n this.props.onClose();\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n portalPage: PortalPagesListItem | undefined;\r\n onSuccess?: () => void;\r\n onClose: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n pageTitle: string;\r\n pageTitleIsValid: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps\r\n }),\r\n {\r\n modifyDraftTitle: actions.modifyDraftTitle,\r\n modifyPortalPageTitle: actions.modifyPortalPageTitle,\r\n updateDraft: actions.updateDraft\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(ModifyPortalPageTitleDialog);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport AuthoringSearch from \"modules/common/components/filters/authoringSearch\";\r\nimport FilterContainer from \"modules/common/components/filters/filterContainer\";\r\nimport FilterDropdown from \"modules/common/components/filters/filterDropdown\";\r\n\r\nimport { Audience } from \"modules/audiences/models\";\r\nimport { PortalPagesFilterValues } from \"../../models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Chip from \"@mui/material/Chip\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport { DatePicker } from \"@mui/x-date-pickers/DatePicker\";\r\nimport { PickerLocalization } from \"modules/common/components/pickerLocalization\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\n\r\n\r\nimport moment from \"moment\";\r\n\r\n\r\nconst States = [\r\n { id: \"Enabled\", text: \"Enabled\" },\r\n { id: \"Draft\", text: \"Draft\" },\r\n { id: \"Disabled\", text: \"Disabled\" }\r\n];\r\n\r\nclass PortalPagesFilters extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n canSearch: !!props.filters.audiences!.length || !!props.filters.currentFilter!.length || !!props.filters.publishedFromDate || !!props.filters.publishedToDate || !!props.filters.searchText,\r\n searchText: props.filters.searchText || \"\"\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.filters.searchText !== prevProps.filters.searchText)\r\n this.setState({ searchText: this.props.filters.searchText || \"\" });\r\n }\r\n\r\n public render() {\r\n const { filters } = this.props;\r\n\r\n return (\r\n <FilterContainer\r\n filters={\r\n <React.Fragment>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.state.searchText}\r\n placeholder=\"Search title or administrator\"\r\n InputProps={{\r\n startAdornment: <SearchIcon className=\"search-icon\" />\r\n }}\r\n onChange={this.onUpdateSearchText}\r\n onKeyUp={this.onKeyUp}\r\n className=\"text-to-search\"\r\n />\r\n {this.props.id === \"all\" &&\r\n <FilterDropdown text=\"State\">\r\n <List disablePadding>\r\n {States.map((state) =>\r\n <ListItem key={state.id} dense button onClick={() => this.onChangeCurrentFilter(state.id)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!filters.currentFilter!.find((selectedFilter) => selectedFilter === state.id)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={state.text} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </FilterDropdown>\r\n }\r\n <FilterDropdown text=\"Published between\">\r\n <PickerLocalization>\r\n <div className=\"published-time\">\r\n <div>\r\n <div>From</div>\r\n <DatePicker\r\n format=\"MMM dd yyyy\"\r\n value={filters.publishedFromDate ? Date.parse(filters.publishedFromDate) : null}\r\n slotProps={{ \r\n textField: { size: \"small\", placeholder: \"\", inputProps: { readOnly: true }},\r\n openPickerIcon: { color: \"primary\" }\r\n }}\r\n onChange={this.onChangePublishedFromDate}\r\n className=\"date-picker\"\r\n />\r\n </div>\r\n <div>\r\n <div>To</div>\r\n <DatePicker\r\n format=\"MMM dd yyyy\"\r\n value={filters.publishedToDate ? Date.parse(filters.publishedToDate) : null}\r\n slotProps={{ \r\n textField: { size: \"small\", placeholder: \"\", inputProps: { readOnly: true }},\r\n openPickerIcon: { color: \"primary\" }\r\n }}\r\n onChange={this.onChangePublishedToDate}\r\n className=\"date-picker\"\r\n />\r\n </div>\r\n </div>\r\n </PickerLocalization>\r\n </FilterDropdown>\r\n <FilterDropdown\r\n text=\"Accessible to\"\r\n footer={\r\n <div>\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onClearAudiences}>Clear all</Button>\r\n </div>\r\n }\r\n >\r\n <List disablePadding className=\"audiences\">\r\n {this.props.audiences.map((audience) =>\r\n <ListItem key={audience.id} dense button onClick={() => this.onChangeAudiences(audience)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!filters.audiences!.find((selectedAudience) => selectedAudience.id === audience.id)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={audience.displayName} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </FilterDropdown>\r\n </React.Fragment>\r\n }\r\n filterCommands={\r\n <AuthoringSearch\r\n canSearch={this.state.canSearch}\r\n onApplyFilters={this.onChangeSearchText}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n }\r\n filterSelection={this.getFilterSelection()}\r\n />\r\n );\r\n }\r\n\r\n\r\n private getFilterSelection = (): JSX.Element | undefined => {\r\n const { filters } = this.props;\r\n\r\n if (!filters.searchText && !filters.currentFilter!.length && !filters.publishedFromDate && !filters.publishedToDate && !filters.audiences!.length)\r\n return undefined;\r\n\r\n return (\r\n <React.Fragment>\r\n {!!filters.searchText &&\r\n <Chip\r\n key=\"search-text\"\r\n label={`\"${filters.searchText}\"`}\r\n onDelete={this.onClearSearchText}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n }\r\n {filters.currentFilter!.map((selectedFilter) =>\r\n <Chip\r\n key={selectedFilter}\r\n label={selectedFilter}\r\n onDelete={() => this.onClearCurrentFilter(selectedFilter)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n {(!!filters.publishedFromDate || !!filters.publishedToDate) &&\r\n <Chip\r\n key=\"published-time\"\r\n label={`Released${!!filters.publishedFromDate ? ` from ${moment(filters.publishedFromDate).format(\"MMM D, YYYY\")}` : \"\"}${!!filters.publishedToDate ? ` up to ${moment(filters.publishedToDate).format(\"MMM D, YYYY\")}` : \"\"}`}\r\n onDelete={this.onClearPublishedTime}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n }\r\n {filters.audiences!.map((selectedAudience) =>\r\n <Chip\r\n key={selectedAudience.id}\r\n label={selectedAudience.displayName}\r\n onDelete={() => this.onClearAudience(selectedAudience)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n\r\n private onChangeAudiences = (audience: Audience) => {\r\n const hasSelectedAudience: boolean = !!this.props.filters.audiences!.find((selectedAudience) => selectedAudience.id === audience.id);\r\n if (hasSelectedAudience)\r\n this.onChangeFilters({ audiences: this.props.filters.audiences!.filter((selectedAudience) => selectedAudience.id !== audience.id) });\r\n else\r\n this.onChangeFilters({ audiences: this.props.filters.audiences!.concat([audience]) });\r\n }\r\n\r\n private onChangeCurrentFilter = (currentFilter: string) => {\r\n const hasSelectedFilter: boolean = !!this.props.filters.currentFilter!.find((selectedFilter) => selectedFilter === currentFilter);\r\n if (hasSelectedFilter)\r\n this.onChangeFilters({ currentFilter: this.props.filters.currentFilter!.filter((selectedFilter) => selectedFilter !== currentFilter) });\r\n else\r\n this.onChangeFilters({ currentFilter: this.props.filters.currentFilter!.concat([currentFilter]) });\r\n }\r\n\r\n private onChangeFilters = (value: Partial<PortalPagesFilterValues>) => {\r\n this.props.onChangeFilters({ ...this.props.filters, searchText: this.state.searchText, ...value });\r\n this.setCanSearch();\r\n }\r\n\r\n private onChangePublishedFromDate = (date) => {\r\n this.onChangeFilters({ publishedFromDate: moment(date).toISOString() });\r\n }\r\n\r\n private onChangePublishedToDate = (date) => {\r\n this.onChangeFilters({ publishedToDate: moment(date).toISOString() });\r\n }\r\n \r\n private onChangeSearchText = () => {\r\n this.onChangeFilters({ searchText: this.state.searchText });\r\n }\r\n\r\n private onClearAudience = (audience: Audience) => {\r\n this.onChangeFilters({ audiences: this.props.filters.audiences!.filter((selectedAudience) => selectedAudience.id !== audience.id) });\r\n }\r\n\r\n private onClearAudiences = () => {\r\n this.onChangeFilters({ audiences: [] });\r\n }\r\n\r\n private onClearCurrentFilter = (currentFilter: string) => {\r\n this.onChangeFilters({ currentFilter: this.props.filters.currentFilter!.filter((selectedFilter) => selectedFilter !== currentFilter) });\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.clearCanSearch();\r\n this.props.onClearFilters();\r\n }\r\n\r\n private onClearPublishedTime = () => {\r\n this.onChangeFilters({ publishedFromDate: \"\", publishedToDate: \"\" });\r\n }\r\n\r\n private onClearSearchText = () => {\r\n this.onChangeFilters({ searchText: \"\" });\r\n }\r\n \r\n private onKeyUp = (key) => {\r\n if (key.keyCode === 13)\r\n this.onChangeSearchText();\r\n }\r\n\r\n private onUpdateSearchText = (event) => {\r\n this.setState({ searchText: event.target.value });\r\n if(event.target.value && event.target.value !== \"\") {\r\n this.setCanSearch();\r\n }\r\n else if(this.hasNoCurrentFilters()){\r\n this.clearCanSearch();\r\n }\r\n }\r\n\r\n private clearCanSearch = () => {\r\n this.setState({ canSearch: false });\r\n }\r\n\r\n private setCanSearch = () => {\r\n this.setState({ canSearch: true });\r\n }\r\n\r\n private hasNoCurrentFilters = () => {\r\n let filters = this.props.filters;\r\n\r\n return (!filters.audiences || filters.audiences.length === 0) \r\n && filters.searchText === \"\" \r\n && (!filters.currentFilter || filters.currentFilter.length === 0)\r\n && (!filters.publishedFromDate && !filters.publishedToDate);\r\n }\r\n}\r\n \r\n\r\ninterface ComponentProps {\r\n id: \"\" | \"all\" | \"enabled\" | \"drafts\" | \"disabled\";\r\n filters: Partial<PortalPagesFilterValues>;\r\n onChangeFilters: (filters: Partial<PortalPagesFilterValues>) => void;\r\n onClearFilters: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n canSearch: boolean;\r\n searchText: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(PortalPagesFilters);","import React from \"react\";\r\n\r\n\r\nconst Banner: React.FunctionComponent<{ data: any }> = props => {\r\n return (\r\n <div className=\"banner-block\">\r\n <div\r\n style={{\r\n backgroundImage: !!props.data.background_image ? `url('${props.data.background_image.fileUrl}')` : \"\",\r\n backgroundPosition: props.data.image_alignment || \"center\",\r\n backgroundColor: props.data.background_color,\r\n }}\r\n className=\"banner-image\"\r\n >\r\n </div>\r\n {props.data.overlay_color &&\r\n <div\r\n style={{\r\n backgroundColor: props.data.overlay_color,\r\n opacity: !!props.data.overlay_opacity ? props.data.overlay_opacity / 100 : 0\r\n }}\r\n className=\"image-overlay\"\r\n >\r\n </div>\r\n }\r\n <div dangerouslySetInnerHTML={{ __html: props.data.banner_text }} className=\"banner-text\"></div>\r\n </div>\r\n );\r\n};\r\n\r\n\r\nexport const banner_fields = [\r\n {\r\n name: \"content_label\",\r\n label: \"Content\",\r\n component: \"section-label\"\r\n },\r\n {\r\n name: \"banner_text\",\r\n label: \"Banner text\",\r\n description: \"Ex. Welcome, Hello, Page titles\",\r\n component: \"tinymce\"\r\n },\r\n {\r\n name: \"content_hr\",\r\n component: \"hr\"\r\n },\r\n {\r\n name: \"styling_label\",\r\n label: \"Styling\",\r\n component: \"section-label\"\r\n },\r\n {\r\n name: \"background_image\",\r\n label: \"Background image\",\r\n component: \"image\"\r\n },\r\n {\r\n name: \"image_alignment\",\r\n label: \"Image alignment\",\r\n component: \"select\",\r\n options: [\r\n { value: \"top\", label: \"Top\" },\r\n { value: \"center\", label: \"Center\" },\r\n { value: \"bottom\", label: \"Bottom\" }\r\n ]\r\n },\r\n {\r\n name: \"background_color\",\r\n label: \"Background color\",\r\n component: \"color\",\r\n },\r\n {\r\n name: \"overlay_color\",\r\n label: \"Overlay color & opacity\",\r\n component: \"color\"\r\n },\r\n {\r\n name: \"overlay_opacity\",\r\n component: \"percentage-slider\"\r\n }\r\n];\r\n\r\nexport const BannerBlock: React.FunctionComponent<{ data: any }> = props => {\r\n return (\r\n <Banner data={props.data} />\r\n );\r\n};\r\n\r\nexport const BANNER_TEMPLATE = {\r\n key: \"banner-block\",\r\n label: \"Banner\",\r\n defaultItem: {\r\n banner_text: \"<h2>Header</h2>\",\r\n image_alignment: \"center\",\r\n overlay_opacity: 50\r\n },\r\n fields: banner_fields\r\n};","import React, { useRef, useState } from \"react\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as actions from \"../../actionCreator\";\r\n\r\nimport { NavigationItem } from \"../../models\";\r\n\r\nimport TenantLink from \"modules/common/components/tenantLink\";\r\n\r\nimport AppBar from \"@mui/material/AppBar\";\r\nimport Button from \"@mui/material/Button\";\r\nimport Hidden from \"@mui/material/Hidden\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport Popover from \"@mui/material/Popover\";\r\nimport Toolbar from \"@mui/material/Toolbar\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\n\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\nimport MenuIcon from \"@mui/icons-material/Menu\";\r\nimport { MenuItemLabel } from \"routes/_layout/common/components/MenuItem\";\r\n\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n popover: {\r\n borderTopColor: theme.palette.primary.main,\r\n pointerEvents: \"none\"\r\n },\r\n popoverPaper: {\r\n borderTop: \"4px solid\",\r\n borderTopColor: \"inherit\",\r\n marginTop: 5,\r\n pointerEvents: \"auto\",\r\n \"& a\": {\r\n color: \"inherit\",\r\n flexGrow: 1,\r\n textDecoration: \"none\"\r\n },\r\n \"& $expandIcon\": {\r\n color: theme.palette.primary.main\r\n }\r\n },\r\n popoverSubPaper: {\r\n borderTop: \"4px solid\",\r\n borderTopColor: \"inherit\",\r\n pointerEvents: \"auto\",\r\n \"& a\": {\r\n color: \"inherit\",\r\n flexGrow: 1,\r\n textDecoration: \"none\"\r\n }\r\n },\r\n expandIcon: {\r\n cursor: \"pointer\",\r\n padding: \"5px 5px 20px 5px\",\r\n marginBottom: -15,\r\n marginRight: -12\r\n },\r\n expandNavigation: {\r\n alignItems: \"center\",\r\n cursor: \"pointer\",\r\n display: \"inline-flex\",\r\n marginBottom: -15,\r\n paddingBottom: 15\r\n },\r\n childItem: {\r\n boxSizing: \"border-box\",\r\n minWidth: 180,\r\n padding: \"10px 15px\",\r\n pointerEvents: \"auto\",\r\n \"&:hover\": {\r\n backgroundColor: theme.palette.background.default\r\n }\r\n }\r\n })\r\n);\r\n\r\nconst SubItemListItem: React.FunctionComponent<{ subItem: NavigationItem, isInEditMode?: boolean, theme?: string }> = props => {\r\n const [showPopover, setShowPopover] = useState(false);\r\n const [showClickablePopover, setShowClickablePopover] = useState(false);\r\n const popoverRef = useRef(null);\r\n \r\n const classes = useStyles();\r\n\r\n const { subItem } = props;\r\n\r\n const closePopover = () => {\r\n setShowPopover(false);\r\n setShowClickablePopover(false);\r\n };\r\n const openPopover = () => setShowPopover(true);\r\n const togglePopover = () => setShowClickablePopover(!showClickablePopover);\r\n\r\n return (\r\n <ListItem key={subItem.id} ref={popoverRef} onMouseEnter={openPopover} onMouseLeave={closePopover} className={classes.childItem}>\r\n {props.isInEditMode\r\n ? <ListItemText primary={subItem.name} />\r\n : <TenantLink key={subItem.id} to={`~/page/${subItem.url}`}>\r\n <ListItemText primary={subItem.name} />\r\n </TenantLink>\r\n }\r\n {!!subItem.children && !!subItem.children.length &&\r\n <React.Fragment>\r\n <ExpandMoreIcon onClick={togglePopover} className={classes.expandIcon} />\r\n <Popover\r\n open={showPopover || showClickablePopover}\r\n anchorEl={popoverRef.current}\r\n anchorOrigin={{\r\n vertical: \"bottom\",\r\n horizontal: \"right\",\r\n }}\r\n transformOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"right\"\r\n }}\r\n PaperProps={{\r\n onMouseEnter: openPopover,\r\n onMouseLeave: closePopover\r\n }}\r\n onClose={closePopover}\r\n style={{ borderTopColor: props.theme, marginTop: -5 }}\r\n classes={{ paper: classes.popoverSubPaper }}\r\n className={classes.popover}\r\n >\r\n <List disablePadding>\r\n {subItem.children.map((childItem) =>\r\n <SubItemListItem\r\n key={childItem.id}\r\n subItem={childItem}\r\n isInEditMode={props.isInEditMode}\r\n theme={props.theme}\r\n />\r\n )}\r\n </List>\r\n </Popover>\r\n </React.Fragment>\r\n }\r\n </ListItem>\r\n );\r\n}\r\n\r\nconst Item: React.FunctionComponent<{ item: NavigationItem, isInEditMode?: boolean, theme?: string, className?: string; }> = props => {\r\n const [showPopover, setShowPopover] = useState(false);\r\n const [showClickablePopover, setShowClickablePopover] = useState(false);\r\n const popoverAnchor = useRef(null);\r\n\r\n const classes = useStyles();\r\n\r\n const { item, isInEditMode } = props;\r\n\r\n const closePopover = () => {\r\n setShowPopover(false);\r\n setShowClickablePopover(false);\r\n };\r\n const openPopover = () => setShowPopover(true);\r\n const togglePopover = () => setShowClickablePopover(!showClickablePopover);\r\n\r\n return (\r\n <React.Fragment key={item.id}>\r\n <div className={props.className} onMouseEnter={openPopover} onMouseLeave={closePopover}>\r\n {item.url &&\r\n (isInEditMode\r\n ? <span>{item.name}</span>\r\n : <TenantLink to={item.isHome ? \"~/home\" : `~/page/${item.url}`}>{item.name}</TenantLink>\r\n )\r\n }\r\n {!!item.children && !!item.children.length &&\r\n (!item.url\r\n ? <div ref={popoverAnchor} onClick={togglePopover} className={classes.expandNavigation}>\r\n <div>{item.name}</div>\r\n <ExpandMoreIcon className={classes.expandIcon} />\r\n </div>\r\n : <ExpandMoreIcon ref={popoverAnchor} onClick={togglePopover} className={classes.expandIcon} />\r\n )\r\n }\r\n {!!item.children && !!item.children.length &&\r\n <Popover\r\n open={showPopover || showClickablePopover}\r\n anchorEl={popoverAnchor.current}\r\n anchorOrigin={{\r\n vertical: \"bottom\",\r\n horizontal: \"right\",\r\n }}\r\n transformOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"right\"\r\n }}\r\n PaperProps={{\r\n onMouseEnter: openPopover,\r\n onMouseLeave: closePopover\r\n }}\r\n onClose={closePopover}\r\n style={{ borderTopColor: props.theme }}\r\n classes={{ paper: classes.popoverPaper }}\r\n className={classes.popover}\r\n >\r\n <List disablePadding>\r\n {item.children.map((subItem) => (\r\n <SubItemListItem\r\n key={subItem.id}\r\n subItem={subItem}\r\n isInEditMode={isInEditMode}\r\n theme={props.theme}\r\n />\r\n ))}\r\n </List>\r\n </Popover>\r\n }\r\n </div>\r\n </React.Fragment>\r\n );\r\n}\r\n\r\nconst Items: React.FunctionComponent<{ items: NavigationItem[], isInEditMode?: boolean, theme?: string }> = props => {\r\n const [showPopover, setShowPopover] = useState(false);\r\n const [showClickablePopover, setShowClickablePopover] = useState(false);\r\n const popoverRef = useRef(null);\r\n\r\n const classes = useStyles();\r\n\r\n const closePopover = () => {\r\n setShowPopover(false);\r\n setShowClickablePopover(false);\r\n };\r\n const openPopover = () => setShowPopover(true);\r\n const togglePopover = () => setShowClickablePopover(!showClickablePopover);\r\n\r\n return (\r\n <React.Fragment>\r\n <div>\r\n <Button ref={popoverRef} onClick={togglePopover} onMouseEnter={openPopover} onMouseLeave={closePopover} className=\"navigation-icon\">\r\n <MenuIcon />\r\n </Button>\r\n </div>\r\n <Popover\r\n open={showPopover || showClickablePopover}\r\n anchorEl={popoverRef.current}\r\n anchorOrigin={{\r\n vertical: \"bottom\",\r\n horizontal: \"right\",\r\n }}\r\n transformOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"right\"\r\n }}\r\n PaperProps={{\r\n onMouseEnter: openPopover,\r\n onMouseLeave: closePopover\r\n }}\r\n onClose={closePopover}\r\n style={{ borderTopColor: props.theme, marginTop: 13 }}\r\n classes={{ paper: classes.popoverPaper }}\r\n className={classes.popover}\r\n >\r\n <List disablePadding>\r\n {props.items.map((item) =>\r\n <SubItemListItem\r\n key={item.id}\r\n subItem={item}\r\n isInEditMode={props.isInEditMode}\r\n theme={props.theme}\r\n />\r\n )}\r\n </List>\r\n </Popover>\r\n </React.Fragment>\r\n );\r\n}\r\n\r\nclass NavigationItems extends React.Component<PropsWithRedux, {}> {\r\n public componentDidMount() {\r\n if (this.props.shouldFetch)\r\n this.fetchItems();\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.shouldFetch && !prevProps.shouldFetch)\r\n this.fetchItems();\r\n }\r\n\r\n public render() {\r\n const { navigation, isInEditMode } = this.props;\r\n\r\n return (\r\n <AppBar position=\"static\" elevation={6} style={{ backgroundColor: this.props.theme || \"\" }}>\r\n <Toolbar className=\"navigation\">\r\n <Hidden mdUp>\r\n <Items\r\n items={navigation}\r\n isInEditMode={isInEditMode}\r\n theme={this.props.theme || \"\"}\r\n />\r\n </Hidden>\r\n <Hidden mdDown>\r\n <div className=\"navigation-links\">\r\n {navigation.slice(0,4).map((item) => (\r\n <Item className=\"navigation-button-custom-css\" key={item.id} item={item} isInEditMode={isInEditMode} theme={this.props.theme || \"\"} />\r\n ))}\r\n {navigation.length > 4 &&\r\n (navigation.length === 5\r\n ? <Item className=\"navigation-button-custom-css\" key={navigation[4].id} item={navigation[4]} isInEditMode={isInEditMode} theme={this.props.theme || \"\"} />\r\n : <Item\r\n className=\"navigation-button-custom-css\"\r\n key=\"more\"\r\n item={{\r\n id: \"more\",\r\n children: navigation.slice(4),\r\n isHome: false,\r\n name: MenuItemLabel.MORE,\r\n parentId: \"\",\r\n portalPageId: \"\",\r\n portalPageJson: [],\r\n sequence: 5,\r\n state: \"Enabled\",\r\n url: \"\",\r\n sourceDraftId: \"\"\r\n }}\r\n isInEditMode={isInEditMode}\r\n theme={this.props.theme || \"\"}\r\n />\r\n )\r\n }\r\n </div>\r\n </Hidden>\r\n </Toolbar>\r\n </AppBar>\r\n );\r\n }\r\n\r\n private fetchItems = () => {\r\n !this.props.isFetching &&\r\n this.props.getNavigation();\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n isInEditMode?: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n errorMessage: state.portalPages.errorMessage,\r\n isDeleting: state.portalPages.isDeleting,\r\n isFetching: state.portalPages.navigation.isFetching,\r\n isSaving: state.portalPages.isSaving,\r\n navigation: state.portalPages.navigation.navigationItems,\r\n shouldFetch: state.portalPages.navigation.shouldFetch,\r\n theme: state.settings.tenantSettings.themeSettings?.color // overwrite admin theme with client-side theme for preview\r\n }),\r\n {\r\n clearErrorMessage: actions.clearErrorMessage,\r\n getNavigation: actions.getNavigation\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(NavigationItems);","import React from \"react\";\r\n\r\nimport NavigationItems from \"modules/portalPages/global-components/navigation-items/navigationItems\";\r\n\r\n\r\nconst Navigation: React.FunctionComponent<{ data: any } & ComponentProps> = props => {\r\n return (\r\n <NavigationItems isInEditMode={props.isInEditMode} />\r\n );\r\n};\r\n\r\nexport const NavigationBlock: React.FunctionComponent<{ data: any } & ComponentProps> = props => {\r\n return (\r\n <Navigation {...props} />\r\n );\r\n};\r\n\r\ninterface ComponentProps {\r\n isInEditMode?: boolean;\r\n}","import styled from \"styled-components\";\r\n\r\nconst PluginSpacing = styled.div`\r\n margin-bottom: var(--tina-padding-big);\r\n`;\r\n\r\nexport default PluginSpacing;","export const LOADING_SNACKBAR_TEXT = \"Fetching your link...\";\r\nexport const LINK_COPIED_SNACKBAR_TEXT = \"Link copied.\";\r\n\r\nexport enum ContentType {\r\n Post = 'post',\r\n Event = 'event'\r\n}\r\n\r\nexport enum ShareContentMapType {\r\n PortalPost = 'portalPost',\r\n PortalPostPublic = 'portalPostPublic',\r\n PortalEvent = 'portalEvent',\r\n TeamsPost = 'teamsPost',\r\n TeamsEvent = 'teamsEvent',\r\n SharePointPost = 'sharePointPost',\r\n SharePointEvent = 'sharePointEvent',\r\n CustomShareLink = 'customShareLink'\r\n}\r\n\r\nexport interface IShareLinkv1 {\r\n contentType: ShareContentMapType;\r\n contentId: string;\r\n}","import * as React from 'react';\r\n\r\n\r\nimport \"./quickPostBanner.sass\";\r\n\r\n\r\nconst QuickPostBanner: React.FunctionComponent<ComponentProps> = props => {\r\n if (!props.isQuickPost)\r\n return (null);\r\n return <div style={{ backgroundColor: props.bannerColor, position: 'absolute', height: props.height }} className=\"quick-post-banner\"></div>;\r\n};\r\n\r\ninterface ComponentProps {\r\n bannerColor: string;\r\n isQuickPost?: boolean;\r\n height?: string | number;\r\n}\r\n\r\nexport default QuickPostBanner;","import * as React from \"react\";\r\n\r\nimport moment from \"moment\";\r\nimport { useDefaultLocale } from \"modules/common/hooks/useDefaultLocale\";\r\n\r\n\r\nconst PublishTime: React.FunctionComponent<ComponentProps> = props => {\r\n useDefaultLocale();\r\n \r\n return (\r\n <div className=\"publish-time\">\r\n {moment(props.publishTime).format(\"MMMM D, YYYY\")}\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n publishTime: string;\r\n}\r\n\r\nexport default PublishTime;","import * as React from \"react\";\r\n\r\nimport moment from \"moment\";\r\n\r\nimport \"../../styles/ReadDate.sass\";\r\n\r\nconst ReadDate: React.FunctionComponent<ComponentProps> = (props) => {\r\n moment.locale(\"en\");\r\n\r\n const { hideWhenRead, lastReadTime } = props;\r\n const unread = !lastReadTime;\r\n\r\n if (hideWhenRead && !unread) return null;\r\n\r\n return (\r\n <div className={`read-date ${unread ? \"unread\" : \"has-been-read\"}`}>\r\n {!unread ? `Read ${moment(lastReadTime).fromNow()}` : \"Unread\"}\r\n </div>\r\n );\r\n};\r\n\r\ninterface ComponentProps {\r\n hideWhenRead?: boolean;\r\n lastReadTime?: string;\r\n}\r\n\r\nexport default ReadDate;\r\n","import * as React from \"react\";\r\n\r\nimport MenuBookIcon from \"@mui/icons-material/MenuBook\";\r\n\r\n\r\nconst formatReadingTime = (readingTime?: string, simple?: boolean): string => {\r\n if (readingTime) {\r\n\r\n const times = readingTime.split(\":\");\r\n const minuteLabel = simple ? \"min\" : times[0] === \"1\" ? \"minute\" : \"minutes\";\r\n const secondLabel = simple ? \"sec\" : times[1] === \"01\" ? \"second\" : \"seconds\";\r\n\r\n const minutes = times[0] !== \"0\" && `${times[0]} ${minuteLabel}`;\r\n const seconds = times[1] !== \"00\" && `${times[1]} ${secondLabel}`;\r\n\r\n if (minutes && seconds)\r\n return minutes + \" \" + seconds;\r\n if (!minutes && !seconds)\r\n return \"\";\r\n if (!seconds)\r\n return minutes as string;\r\n return seconds;\r\n }\r\n return \"\";\r\n}\r\n\r\n\r\nconst ReadingTime: React.FunctionComponent<ComponentProps> = props => {\r\n if (props.hideReadTime || !props.readingTime)\r\n return (null);\r\n \r\n const readingTime = formatReadingTime(props.readingTime, props.simple);\r\n if (!readingTime)\r\n return (null);\r\n\r\n return (\r\n <div className=\"reading-time\">\r\n <MenuBookIcon fontSize=\"inherit\" />\r\n {readingTime}\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n hideReadTime?: boolean;\r\n readingTime?: string;\r\n simple?: boolean;\r\n}\r\n\r\nexport default ReadingTime;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { PostViewStats } from \"../../../../models\";\r\n\r\nimport AddCommentIcon from \"@mui/icons-material/AddComment\";\r\nimport FavoriteIcon from \"@mui/icons-material/Favorite\";\r\n\r\n\r\nconst Stats: React.FunctionComponent<PropsWithRedux> = props => {\r\n const { postType, stats } = props;\r\n\r\n const commentCount = props.commentsEnabled ? stats.commentCount : 0;\r\n const reactionCount = props.reactionsEnabled && postType !== \"compliance\" && stats.reactions ? stats.reactions.reduce((sum, reaction) => sum + reaction.count, 0) : 0;\r\n\r\n const comments = commentCount > 0 &&\r\n <div>\r\n <AddCommentIcon />\r\n <span>{commentCount}</span>\r\n </div>;\r\n const reactions = reactionCount > 0 &&\r\n <div>\r\n <FavoriteIcon />\r\n <span>{reactionCount}</span>\r\n </div>;\r\n\r\n return (\r\n <div className=\"stats\">\r\n {comments}\r\n {reactions}\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n postType: string;\r\n stats: PostViewStats;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n // Checks first for client settings, then tenant settings when in the Admin Portal previews\r\n commentsEnabled: state.settings.clientSettings.commentSystem.enabled || state.settings.tenantSettings.commentsEnabled,\r\n reactionsEnabled: (state.settings.clientSettings.reactionSystem && state.settings.clientSettings.reactionSystem.enabled) || state.settings.tenantSettings.reactionsEnabled\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(Stats);","import React from \"react\";\r\n\r\nimport LocalOfferIcon from \"@mui/icons-material/LocalOfferOutlined\";\r\n\r\nconst Topics: React.FunctionComponent<ComponentProps> = props => {\r\n const { topics } = props;\r\n\r\n if (!topics || topics.length === 0) return (null);\r\n\r\n return <div className=\"topics truncated-text-1\">\r\n <LocalOfferIcon fontSize=\"inherit\" />\r\n\r\n {topics.map(topic => topic.name).join(\", \")}\r\n </div>;\r\n};\r\n\r\ninterface ComponentProps {\r\n topics: { id: string, name: string; }[];\r\n}\r\n\r\nexport default Topics;","import * as React from \"react\";\r\n\r\nimport PostTypeBanner from \"modules/common/components/banners/postTypeBanner\";\r\n\r\nimport { PostFeedItem } from \"../../../../../models\";\r\nimport BreakingFeaturedBanner from \"../../../../banners/breakingFeaturedBanner\";\r\nimport QuickPostBanner from \"../../../../banners/quickPostBanner\";\r\nimport PublishTime from \"../../dates/PublishTime\";\r\nimport ReadDate from \"../../dates/ReadDate\";\r\nimport ReadingTime from \"../../dates/ReadingTime\";\r\nimport Stats from \"../../stats/Stats\";\r\nimport Topics from \"../../topics/Topics\";\r\n\r\n\r\nconst Tile: React.FunctionComponent<ComponentProps> = props => {\r\n const { cardCount, post, preferredLCID, onPostSelected } = props;\r\n\r\n if (!post) {\r\n return (null);\r\n }\r\n\r\n const backgroundImageUrl = post.imageUrl || \"\";\r\n const selectPost = () => onPostSelected ? onPostSelected(post) : null;\r\n const excerptToDisplay = post.excerpt.length > 297 ? post.excerpt.substring(0, 297) + \"...\" : post.excerpt;\r\n\r\n return (\r\n <div onClick={selectPost} className={`tile tile-${cardCount}`}>\r\n <div className=\"image-container\">\r\n <div \r\n style={post.isQuickPost ? { backgroundColor: \"#000000\" } : { \r\n backgroundImage: \"url('\" + backgroundImageUrl + \"')\", \r\n backgroundSize: \"contain\", backgroundColor: \"#DDE1E5\" \r\n }} \r\n className={`image ${post.isQuickPost ? \"quick-post\" : \"\"}`}\r\n >\r\n <QuickPostBanner {...post} height={30} />\r\n <PostTypeBanner {...props} {...post} lcid={preferredLCID} />\r\n {!props.hideStats &&\r\n <Stats {...post} />\r\n }\r\n </div>\r\n </div>\r\n <div className=\"content-container\">\r\n <div className=\"content\">\r\n <div className=\"date-bar\">\r\n {!props.hidePublishTime &&\r\n <PublishTime publishTime={post.publishTime} />\r\n }\r\n {!props.hideReadDate &&\r\n <ReadDate lastReadTime={post.lastReadTime} />\r\n }\r\n </div>\r\n <div className=\"title\">{post.title}</div>\r\n {!props.hideStats &&\r\n <ReadingTime readingTime={post.readingTime} />\r\n }\r\n <div className=\"summary\">\r\n <BreakingFeaturedBanner {...props} {...post} activeLcid={preferredLCID} />\r\n {!props.hideSummary &&\r\n excerptToDisplay\r\n }\r\n </div>\r\n {!props.hideTopics &&\r\n <Topics topics={post.tags} />\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n cardCount: number;\r\n hidePublishTime?: boolean;\r\n hideReadDate?: boolean;\r\n hideStats?: boolean;\r\n hideSummary?: boolean;\r\n hideTopics?: boolean;\r\n post: PostFeedItem;\r\n preferredLCID: string;\r\n onPostSelected: (post: PostFeedItem) => void;\r\n}\r\n\r\nexport default Tile;","import React from \"react\";\r\n\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { Button } from \"@mui/material\";\r\n\r\nexport const LoadMoreButton: React.FunctionComponent<ILoadMoreButton> = (props: ILoadMoreButton) => {\r\n const [pageNumber, setPageNumber] = React.useState<number>(1);\r\n\r\n const onFetchMore = () => {\r\n setPageNumber(pageNumber + 1);\r\n props.onFetchMore(pageNumber + 1);\r\n }\r\n\r\n if (!props.canLoadMore) return <React.Fragment/>;\r\n\r\n if (props.isFetching) return <Loading/>;\r\n\r\n return <Button variant=\"outlined\" color=\"primary\" onClick={onFetchMore} className=\"feed-buttons\">\r\n Load more\r\n </Button>;\r\n};\r\n\r\nexport interface ILoadMoreButton {\r\n isFetching: boolean;\r\n canLoadMore: boolean;\r\n onFetchMore: (pageNumber: number) => void;\r\n}","import React from \"react\";\r\n\r\nimport { Button } from \"@mui/material\";\r\nimport { ILoadMoreButton, LoadMoreButton } from \"./loadMoreButton\";\r\n\r\nimport \"./styles/feedButtons.sass\";\r\n\r\ninterface IActionButton {\r\n action: () => void;\r\n}\r\n\r\ninterface IFeedButtons {\r\n viewAll?: IActionButton;\r\n loadMore?: ILoadMoreButton;\r\n inCard?: boolean;\r\n}\r\n\r\nexport const FeedButtons: React.FunctionComponent<IFeedButtons> = (props) => {\r\n return <div className={`feed-buttons ${props.inCard ? \"card-feed-buttons\" : \"\"}`}>\r\n {\r\n props.viewAll &&\r\n <Button variant=\"text\" color=\"primary\" className=\"feed-buttons\" onClick={props.viewAll?.action}>\r\n VIEW ALL\r\n </Button>\r\n }\r\n {\r\n props.loadMore &&\r\n <LoadMoreButton\r\n canLoadMore={props.loadMore?.canLoadMore}\r\n isFetching={props.loadMore?.isFetching}\r\n onFetchMore={(pageNumber: number) => props.loadMore?.onFetchMore(pageNumber)}\r\n />\r\n }\r\n </div>;\r\n};","import * as React from \"react\";\r\n\r\nimport Tile from \"./Tile\";\r\nimport { PostFeedItem } from \"../../../../../models\";\r\nimport { ILoadMoreButton } from \"../../../../../../common/components/feed/loadMoreButton\";\r\nimport { FeedButtons } from \"modules/common/components/feed/feedButtons\";\r\n\r\nimport \"../../../styles/Card.sass\";\r\n\r\n\r\nconst Card: React.FunctionComponent<ComponentProps> = props => {\r\n return (\r\n <div className=\"card\">\r\n {props.postsFeed.map(post => <Tile key={post.id} {...props} post={post} />)}\r\n\r\n {\r\n (props.viewAll || props.loadMore?.canLoadMore) &&\r\n <div className={\"tile load-tile\"}>\r\n <FeedButtons\r\n inCard\r\n viewAll={props.viewAll ? {action: props.viewAll} : undefined}\r\n loadMore={props.loadMore}\r\n />\r\n </div>\r\n }\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n cardCount: number;\r\n hidePublishTime?: boolean;\r\n hideReadDate?: boolean;\r\n hideStats?: boolean;\r\n hideSummary?: boolean;\r\n hideTopics?: boolean;\r\n hideLoadMore?: boolean;\r\n postsFeed: PostFeedItem[];\r\n preferredLCID: string;\r\n loadMore?: ILoadMoreButton;\r\n viewAll?: () => void;\r\n onPostSelected: (post: PostFeedItem) => void;\r\n}\r\n\r\nexport default Card;","import * as React from \"react\";\r\n\r\nimport PostTypeBanner from \"modules/common/components/banners/postTypeBanner\";\r\n\r\nimport { PostFeedItem } from \"../../../../../models\";\r\nimport BreakingFeaturedBanner from \"../../../../banners/breakingFeaturedBanner\";\r\nimport QuickPostBanner from \"../../../../banners/quickPostBanner\";\r\nimport PublishTime from \"../../dates/PublishTime\";\r\nimport ReadDate from \"../../dates/ReadDate\";\r\nimport ReadingTime from \"../../dates/ReadingTime\";\r\nimport Stats from \"../../stats/Stats\";\r\nimport Topics from \"../../topics/Topics\";\r\n\r\n\r\nconst Tile: React.FunctionComponent<ComponentProps> = props => {\r\n const { post, preferredLCID, onPostSelected } = props;\r\n\r\n if (!post) {\r\n return (null);\r\n }\r\n\r\n const backgroundImageUrl = post.imageUrl || \"\";\r\n const selectPost = () => onPostSelected ? onPostSelected(post) : null;\r\n\r\n return (\r\n <div onClick={selectPost} className=\"tile\">\r\n <div className=\"image-container\">\r\n <div \r\n style={\r\n post.isQuickPost ? { backgroundColor: \"#000000\" } : { \r\n backgroundImage: \"url('\" + backgroundImageUrl + \"')\", \r\n backgroundSize: \"contain\", backgroundColor: \"#DDE1E5\" \r\n }} \r\n className={`image ${post.isQuickPost ? \"quick-post\" : \"\"}`}\r\n >\r\n <QuickPostBanner {...post} height={30} />\r\n <PostTypeBanner {...props} {...post} lcid={preferredLCID} />\r\n {!props.hideStats &&\r\n <Stats {...post} />\r\n }\r\n </div>\r\n </div>\r\n <div className=\"content-container\">\r\n <div className=\"content\">\r\n <div className=\"date-bar\">\r\n {!props.hidePublishTime &&\r\n <PublishTime publishTime={post.publishTime} />\r\n }\r\n <ReadDate lastReadTime={post.lastReadTime} />\r\n </div>\r\n <div className=\"title\">{post.title}</div>\r\n {!props.hideStats &&\r\n <ReadingTime readingTime={post.readingTime} />\r\n }\r\n <div className=\"summary\">\r\n <BreakingFeaturedBanner {...props} {...post} activeLcid={preferredLCID} />\r\n {!props.hideSummary &&\r\n post.excerpt\r\n }\r\n </div>\r\n {!props.hideTopics &&\r\n <Topics topics={post.tags} />\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n hidePublishTime?: boolean;\r\n hideStats?: boolean;\r\n hideSummary?: boolean;\r\n hideTopics?: boolean;\r\n post: PostFeedItem;\r\n preferredLCID: string;\r\n onPostSelected: (post: PostFeedItem) => void;\r\n}\r\n\r\nexport default Tile;","import * as React from \"react\";\r\n\r\nimport { PostFeedItem } from \"../../../../../models\";\r\nimport Tile from \"./Tile\";\r\n\r\n\r\nimport \"../../../styles/Card.sass\";\r\n\r\n\r\nconst Column: React.FunctionComponent<ComponentProps> = props => {\r\n return (\r\n <div className=\"column\">\r\n {props.postsFeed.map(post => <Tile key={post.id} {...props} post={post} />)}\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n hidePublishTime?: boolean;\r\n hideStats?: boolean;\r\n hideSummary?: boolean;\r\n hideTopics?: boolean;\r\n postsFeed: PostFeedItem[];\r\n preferredLCID: string;\r\n onPostSelected: (post: PostFeedItem) => void;\r\n}\r\n\r\nexport default Column;","import * as React from \"react\";\r\n\r\nimport PostTypeBanner from \"modules/common/components/banners/postTypeBanner\";\r\n\r\nimport { PostFeedItem } from \"../../../../../models\";\r\nimport BreakingFeaturedBanner from \"../../../../banners/breakingFeaturedBanner\";\r\nimport QuickPostBanner from \"../../../../banners/quickPostBanner\";\r\nimport PublishTime from \"../../dates/PublishTime\";\r\nimport Stats from \"../../stats/Stats\";\r\n\r\n\r\nconst Tile: React.FunctionComponent<ComponentProps> = props => {\r\n const { cardCount, post, preferredLCID, onPostSelected } = props;\r\n\r\n if (!post) {\r\n return (null);\r\n }\r\n\r\n const backgroundImageUrl = post.imageUrl || \"\";\r\n const selectPost = () => onPostSelected ? onPostSelected(post) : null;\r\n\r\n return (\r\n <div className={`tile-cell tile-cell-${cardCount}`}>\r\n <div onClick={selectPost} className=\"tile\">\r\n <div \r\n style={post.isQuickPost ? { backgroundColor: \"#000000\" } : { \r\n backgroundImage: \"url('\" + backgroundImageUrl + \"')\", \r\n backgroundSize: \"contain\", backgroundColor: \"#DDE1E5\" \r\n }} \r\n className=\"image\"\r\n >\r\n <QuickPostBanner {...post} />\r\n <PostTypeBanner {...props} {...post} lcid={preferredLCID} />\r\n {!props.hideStats &&\r\n <Stats {...post} />\r\n }\r\n {!props.hidePublishTime &&\r\n <PublishTime publishTime={post.publishTime} />\r\n }\r\n <div title={post.title} className=\"title\">{post.title}</div>\r\n <div className=\"summary\">\r\n <BreakingFeaturedBanner {...props} {...post} activeLcid={preferredLCID} />\r\n {!props.hideSummary &&\r\n post.excerpt\r\n }\r\n </div>\r\n </div>\r\n <div className=\"gradient-overlay\"></div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n cardCount: number;\r\n hidePublishTime?: boolean;\r\n hideStats?: boolean;\r\n hideSummary?: boolean;\r\n post: PostFeedItem;\r\n preferredLCID: string;\r\n onPostSelected: (post: PostFeedItem) => void;\r\n}\r\n\r\nexport default Tile;","import * as React from \"react\";\r\n\r\nimport { PostFeedItem } from \"../../../../../models\";\r\nimport Tile from \"./Tile\";\r\n\r\nimport \"../../../../../../common/components/feed/styles/windowFeed.sass\";\r\n\r\nconst Window: React.FunctionComponent<ComponentProps> = props => {\r\n return (\r\n <div className=\"window\">\r\n {props.postsFeed.map(post => <Tile key={post.id} {...props} post={post} />)}\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n cardCount: number;\r\n hidePublishTime?: boolean;\r\n hideStats?: boolean;\r\n hideSummary?: boolean;\r\n postsFeed: PostFeedItem[];\r\n preferredLCID: string;\r\n onPostSelected: (post: PostFeedItem) => void;\r\n}\r\n\r\nexport default Window;","import { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { TranslatableField } from \"modules/settings\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { getTranslatedContentField } from \"utils/getTranslatedContent\";\r\n\r\nexport type TranslatableContentReturnType = {\r\n getTranslation: (field: TranslatableField) => string\r\n}\r\n\r\nconst DEFAULT_LCID = \"en-us\";\r\n\r\n/*\r\n * Hook for accessing translatable content.\r\n * Fetches translation according to the user's preferred language.\r\n */\r\nexport const useTranslatableContent = (): TranslatableContentReturnType => {\r\n const {\r\n translatedContent\r\n } = useSelector((state: GlobalApplicationState) => state.settings.clientSettings);\r\n const { preferredLCID: lcid } = useSelector((state: GlobalApplicationState) => state.settings.currentUser);\r\n\r\n const getTranslation = (field: TranslatableField) : string => {\r\n if (!translatedContent\r\n || (!translatedContent[lcid] && !translatedContent[DEFAULT_LCID]))\r\n return \"\";\r\n\r\n const translation = getTranslatedContentField(field, translatedContent, lcid)\r\n return translation\r\n };\r\n\r\n return { getTranslation };\r\n}\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport { useTranslatableContent } from \"modules/common/hooks/useTranslatableContent\";\r\n\r\nimport \"./ContentTypeIcons.sass\";\r\nconst iconRestricted: string = \"/images/icons/restricted_ico.svg\";\r\n\r\nexport interface IBanner extends IDefaultBanner{\r\n icon: string;\r\n}\r\n\r\nexport interface IDefaultBanner {\r\n color: string;\r\n text: string;\r\n description?: string;\r\n urlDescription?: string;\r\n}\r\n\r\ninterface IContentTypeIcons {\r\n isRestricted?: boolean;\r\n}\r\n\r\nconst DEFAULT_RESTRICTED_BANNER : IDefaultBanner = {\r\n color: \"#b72026\",\r\n text: \"Restricted\",\r\n description: \"This content is exclusive to specific audiences.\"\r\n}\r\n\r\nconst ContentTypeIcons: React.FunctionComponent<PropsWithRedux> = ({\r\n isRestricted,\r\n restrictedBannerEnabled,\r\n restrictedBannerColor\r\n}) => {\r\n const { getTranslation } = useTranslatableContent();\r\n\r\n const restrictedBanner : IBanner = {\r\n icon: iconRestricted,\r\n color: restrictedBannerColor || DEFAULT_RESTRICTED_BANNER.color,\r\n text: getTranslation(\"restrictedContent\") || DEFAULT_RESTRICTED_BANNER.text,\r\n description: getTranslation(\"restrictedBannerDescription\") || DEFAULT_RESTRICTED_BANNER.description \r\n };\r\n\r\n return (\r\n <React.Fragment>\r\n {isRestricted && restrictedBannerEnabled &&\r\n <HoverText\r\n label={\r\n <div className=\"contentIcon\" style={{ backgroundColor: restrictedBanner.color }}>\r\n <img src={iconRestricted} alt=\"Restricted content icon\" className=\"iconImage\"></img>\r\n </div>\r\n }\r\n >\r\n {restrictedBanner.description}\r\n </HoverText>\r\n }\r\n </React.Fragment>\r\n );\r\n};\r\n\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IContentTypeIcons) => ({\r\n ...ownProps,\r\n restrictedBannerColor: state.settings.clientSettings.specialtyPostColors?.restricted,\r\n restrictedBannerEnabled: state.settings.tenantSettings.bannerVisibility.showRestrictedBanner,\r\n }),\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(ContentTypeIcons);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { PostViewStats } from \"modules/posts/models\";\r\n\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport { useTranslatableContent } from \"modules/common/hooks/useTranslatableContent\";\r\n\r\nimport ContentTypeIcons, { IBanner } from \"modules/common/components/banners/contentTypeIcons\";\r\n\r\nimport \"../../../../../../common/components/banners/ContentTypeIcons.sass\";\r\n\r\nconst icoComplied: string = \"/images/icons/complied_ico.svg\";\r\nconst icoMandatory: string = \"/images/icons/mandatory_ico.svg\";\r\nconst icoNotComplied: string = \"/images/icons/not_complied_ico.svg\";\r\nconst icoPublic: string = \"/images/icons/public_ico.svg\";\r\n\r\ntype PostBannerTypes = \"complied\" | \"mandatory\" | \"notComplied\" | \"public\";\r\n\r\ntype PostBanners = { [bannerType in PostBannerTypes]: IBanner; };\r\n\r\ninterface ComponentProps {\r\n lcid: string;\r\n postType: string;\r\n stats?: PostViewStats;\r\n isRestricted?: boolean;\r\n currentUserHasComplied?: boolean\r\n}\r\n\r\nconst PostTypeIcons: React.FunctionComponent<PropsWithRedux> = props => { \r\n const { bannerColors } = props;\r\n const { getTranslation } = useTranslatableContent();\r\n \r\n if (!bannerColors) return (null);\r\n\r\n const banners: PostBanners = {\r\n complied: {\r\n color: (bannerColors && bannerColors.complianceChecked) || \"#05b34b\",\r\n icon: icoComplied,\r\n text: getTranslation(\"compliedPost\") || \"Complied\",\r\n description: getTranslation(\"compliedBannerDescription\") || \"You have already read and complied to this post.\"\r\n },\r\n mandatory: {\r\n color: (bannerColors && bannerColors.mandatory) || \"#004e79\",\r\n icon: icoMandatory,\r\n text: getTranslation(\"mandatoryPost\") || \"Mandatory\",\r\n description: getTranslation(\"mandatoryBannerDescription\") || \"You are required to read this post.\"\r\n },\r\n notComplied: {\r\n color: (bannerColors && bannerColors.compliance) || \"#faaf18\",\r\n icon: icoNotComplied,\r\n text: getTranslation(\"compliancePost\") || \"Compliance\",\r\n description: getTranslation(\"complianceBannerDescription\") || \"If you agree with the content of this post, comply using the checkbox down below.\"\r\n },\r\n public: {\r\n color: (bannerColors && bannerColors.public) || \"#ffffff\",\r\n icon: icoPublic,\r\n text: getTranslation(\"publicPost\") || \"Public\",\r\n description: getTranslation(\"publicBannerDescription\") || \"This is a public post.\",\r\n urlDescription: getTranslation(\"publicBannerDescriptionShareTitle\") || \"Share it through here\"\r\n }\r\n };\r\n\r\n const hasBanner = props.postType !== \"standard\" || (props.isRestricted && props.restrictedBannerEnabled);\r\n const hasTwoIcons = props.postType !== \"standard\" && props.isRestricted && props.restrictedBannerEnabled;\r\n const isComplied = props.stats ? (!!props.stats && !!props.stats.complianceTime) : props.currentUserHasComplied;\r\n\r\n return (\r\n <div style={{paddingRight: hasBanner ? \"6px\" : \"0px\", display: \"flex\", flexDirection: \"row\"}}>\r\n {props.postType === \"compliance\" &&\r\n <HoverText\r\n label={\r\n <div className=\"contentIcon\" style={{backgroundColor: isComplied ? banners.complied.color : banners.notComplied.color, marginRight: hasTwoIcons ? \"6px\" : \"0px\"}}>\r\n {isComplied ?\r\n <img src={icoComplied} alt=\"Complied icon\" className=\"content-icon\"></img>\r\n : <img src={icoNotComplied} alt=\"Not complied icon\" className=\"content-icon\"></img>}\r\n </div>\r\n }\r\n >\r\n {isComplied ? banners.complied.description : banners.notComplied.description}\r\n </HoverText>\r\n }\r\n\r\n {props.postType === \"mandatory\" && \r\n <HoverText\r\n label={\r\n <div className=\"contentIcon\" style={{backgroundColor: banners.mandatory.color, marginRight: hasTwoIcons ? \"6px\" : \"0px\"}}>\r\n <img src={icoMandatory} alt=\"Mandatory post icon\" className=\"iconImage\"></img>\r\n </div>\r\n }\r\n >\r\n {banners.mandatory.description}\r\n </HoverText>\r\n }\r\n\r\n {props.postType === \"public\" && \r\n <HoverText\r\n label={\r\n <div className=\"contentIcon\" style={{backgroundColor: banners.public.color, marginRight: hasTwoIcons ? \"6px\" : \"0px\"}}>\r\n <img src={icoPublic} alt=\"Public post icon\" className=\"iconImage\"></img>\r\n </div>\r\n }\r\n >\r\n {banners.public.description}\r\n </HoverText>\r\n }\r\n <ContentTypeIcons isRestricted={props.isRestricted}/>\r\n </div>\r\n );\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n bannerColors: state.settings.clientSettings?.specialtyPostColors,\r\n restrictedBannerEnabled: state.settings.tenantSettings.bannerVisibility.showRestrictedBanner,\r\n }),\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(PostTypeIcons);","import * as React from \"react\";\r\n\r\nimport { PostFeedItem } from \"../../../../../models\";\r\nimport BreakingFeaturedBanner from \"../../../../banners/breakingFeaturedBanner\";\r\nimport PublishTime from \"../../dates/PublishTime\";\r\nimport ReadingTime from \"../../dates/ReadingTime\";\r\nimport Stats from \"../../stats/Stats\";\r\nimport Topics from \"../../topics/Topics\";\r\nimport PostTypeIcons from \"./PostTypeIcons\";\r\n\r\nconst Tile: React.FunctionComponent<ComponentProps> = props => {\r\n const { cardCount, post, preferredLCID, onPostSelected } = props;\r\n \r\n if (!post) return (null);\r\n\r\n const selectPost = () => onPostSelected ? onPostSelected(post) : null;\r\n const excerptToDisplay = post.excerpt.length > 87 ? post.excerpt.substring(0, 87) + \"...\" : post.excerpt;\r\n\r\n return (\r\n <div onClick={selectPost} className={`tile tile-${cardCount}`}>\r\n <div className=\"content-container\">\r\n <div className=\"content\">\r\n <div className=\"date-bar\">\r\n {!props.hidePublishTime &&\r\n <PublishTime publishTime={post.publishTime} />\r\n }\r\n </div>\r\n\r\n <div style={{display: \"flex\", alignItems: \"baseline\"}}>\r\n <PostTypeIcons {...props} {...post} lcid={preferredLCID} />\r\n <div className=\"title\">{post.title}</div>\r\n </div>\r\n\r\n {!props.hideStats &&\r\n <div style={{display: \"flex\", flexDirection: \"row\", alignItems: \"center\"}}>\r\n <ReadingTime readingTime={post.readingTime} simple/>\r\n <div style={{marginLeft: \"auto\"}}>\r\n <Stats {...post}/>\r\n </div>\r\n </div>\r\n }\r\n <div className=\"summary\">\r\n <BreakingFeaturedBanner {...props} {...post} activeLcid={preferredLCID} />\r\n {!props.hideSummary &&\r\n excerptToDisplay\r\n }\r\n </div>\r\n {!props.hideTopics &&\r\n <Topics topics={post.tags} />\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\ninterface ComponentProps {\r\n cardCount: number;\r\n hidePublishTime?: boolean;\r\n hideReadDate?: boolean;\r\n hideStats?: boolean;\r\n hideSummary?: boolean;\r\n hideTopics?: boolean;\r\n post: PostFeedItem;\r\n preferredLCID: string;\r\n onPostSelected: (post: PostFeedItem) => void;\r\n}\r\n\r\nexport default Tile;","import * as React from \"react\";\r\n\r\nimport { PostFeedItem } from \"../../../../../models\";\r\nimport Tile from \"./Tile\";\r\n\r\nimport \"../../../styles/List.sass\";\r\n\r\nconst List: React.FunctionComponent<ComponentProps> = props => {\r\n return (\r\n <div className=\"list\">\r\n {props.postsFeed.map(post => <Tile key={post.id} {...props} post={post} />)}\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n cardCount: number;\r\n hidePublishTime?: boolean;\r\n hideReadDate?: boolean;\r\n hideStats?: boolean;\r\n hideSummary?: boolean;\r\n hideTopics?: boolean;\r\n postsFeed: PostFeedItem[];\r\n preferredLCID: string;\r\n onPostSelected: (post: PostFeedItem) => void;\r\n}\r\n\r\nexport default List;","import React from \"react\";\r\nimport { IconButton } from \"@mui/material\";\r\nimport './labelledIconButton.sass';\r\n\r\ninterface ComponentProps {\r\n label: string | React.ReactElement;\r\n icon: React.ReactElement;\r\n onClick: () => void;\r\n}\r\n\r\nconst LabelledIconButton: React.FunctionComponent<ComponentProps> = props => {\r\n const { icon, label } = props;\r\n\r\n return (\r\n <div className=\"labelled-icon-container\">\r\n <IconButton \r\n className=\"labelled-icon-button\"\r\n onClick={props.onClick} \r\n sx={{\r\n \":hover\": {\r\n backgroundColor: \"#F2F2EF\"\r\n }\r\n }}>\r\n {icon}\r\n </IconButton>\r\n {label}\r\n </div>\r\n );\r\n }\r\n\r\n export default (LabelledIconButton);","\r\nimport { ContentType } from \"modules/sharing/models\";\r\n\r\n//Performs all the required encoding and URL formatting for an email/mailto link.\r\n//Please note: mailto links do not respect links, and only expect plaintext.\r\nexport const generateMailTo = (subject: string, body: string, link?: string) => {\r\n const encodedSubject = encodeURI(subject);\r\n const encodedBody = encodeURI(body);\r\n let mailToUrl = `mailto:?subject=${encodedSubject}&body=${encodedBody}`;\r\n\r\n if(link) {\r\n //%0A is an encoded /n\r\n mailToUrl += `%0A%0A${link}`;\r\n }\r\n\r\n return mailToUrl;\r\n}\r\n\r\nexport const getDefaultEmailSubject = (contentType: ContentType, tenantName: string, contentTitle: string = \"\") => {\r\n switch(contentType) {\r\n case ContentType.Event:\r\n return `Sharing this event from ${tenantName}`;\r\n\r\n case ContentType.Post:\r\n return `${tenantName}: ${contentTitle}`;\r\n }\r\n}\r\n\r\nexport const getDefaultEmailBody = (contentType: ContentType, tenantName: string) => {\r\n switch(contentType) {\r\n case ContentType.Event:\r\n return `Check out this event in ${tenantName}:`\r\n\r\n case ContentType.Post:\r\n default:\r\n return `Check out this post in ${tenantName}:`\r\n }\r\n}\r\n\r\nexport const getTwitterLink = (encodedText: string) => {\r\n return (`https://twitter.com/intent/tweet?text=${encodedText}`);\r\n}\r\n\r\nexport const getLinkedInLink = (encodedText: string) => {\r\n return (`https://www.linkedin.com/feed/?shareActive=true&text=${encodedText}`);\r\n}\r\n\r\nexport const getFacebookLink = (encodedText: string) => {\r\n return (`https://www.facebook.com/sharer/sharer.php?u=${encodedText}`);\r\n}\r\n\r\n//Generates our generic message + link as a single string and encodes it - Put it on the end of share urls.\r\nexport const createBodyAndEncode = (tenantName: string, shareUrl: string) => {\r\n const plainBody = `Check out this post in ${tenantName}:\\n\\n${shareUrl}`;\r\n return encodeURI(plainBody);\r\n}\r\n\r\n//EncodeURIComponent is used for facebook, as it requires the share link in its entirety (including https://) to be encoded.\r\n//Some websites don't allow for prewritten body texts as well, so this one is just the link.\r\nexport const createBodyAndEncodeOnlyUrl = (shareUrl: string) => {\r\n return encodeURIComponent(shareUrl);\r\n}","import * as React from 'react';\r\nimport { ArrowBack, ArrowDropDown, EmailOutlined, Link } from \"@mui/icons-material\";\r\nimport { IconButton, List, Snackbar } from \"@mui/material\";\r\nimport LabelledIconButton from \"modules/common/components/buttons/labelledIconButton\";\r\nimport { generateMailTo, getDefaultEmailBody, getDefaultEmailSubject } from 'utils/shareHelpers';\r\nimport Callout from 'modules/common/components/callout';\r\nimport MoreOptionsItem from 'modules/common/components/moreOptionsItem';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport { ConnectedProps, connect } from 'react-redux';\r\nimport { ContentType, IShareLinkv1, LINK_COPIED_SNACKBAR_TEXT, LOADING_SNACKBAR_TEXT, ShareContentMapType } from './models';\r\nimport { sharingApi } from 'api/instances';\r\n\r\nimport './sharingPages.sass'\r\n\r\n\r\ninterface ComponentProps {\r\n onCloseDialog: () => void;\r\n tenantName: string;\r\n contentTitle: string;\r\n contentId: string;\r\n contentStyling: any;\r\n contentType: ContentType;\r\n isPublic: boolean;\r\n}\r\n\r\nenum ChannelSelection {\r\n None,\r\n Portal,\r\n SharePoint,\r\n Teams\r\n}\r\n\r\nconst InternalShareScreen: React.FunctionComponent<PropsWithRedux> = (props) => {\r\n //If we get a bad setup, just default to portal.\r\n const getInitialChannelPreference = () => {\r\n const linkPreference = props.linkPreference ? parseInt(props.linkPreference) : ChannelSelection.Portal;\r\n\r\n if (linkPreference === ChannelSelection.Teams && props.teamsShareEnabled) {\r\n return ChannelSelection.Teams;\r\n }\r\n\r\n else if (linkPreference === ChannelSelection.SharePoint && props.sharepointShareEnabled) {\r\n return ChannelSelection.SharePoint;\r\n }\r\n\r\n else {\r\n return ChannelSelection.Portal;\r\n }\r\n }\r\n\r\n const getShareLinkAndUpdateSnackbar = async (linkDetails: IShareLinkv1, copyFinishedText: string) => {\r\n setSnackbarAndText(LOADING_SNACKBAR_TEXT, true);\r\n\r\n const link = await sharingApi.getShareLink(linkDetails);\r\n navigator.clipboard.writeText(link);\r\n setSnackbarAndText(copyFinishedText, true);\r\n }\r\n\r\n const copyLinkRef = React.useRef(null);\r\n const [calloutOpen, setCalloutOpen] = React.useState(false);\r\n\r\n const [snackbarOpen, setSnackbarOpen] = React.useState(false);\r\n const [snackbarText, setSnackbarText] = React.useState(\"\");\r\n\r\n const [selectedPlatform, setSelectedPlatform] = React.useState(getInitialChannelPreference());\r\n\r\n const portalLabel = props.portalShareLabel.trim() === \"\" ? \"Portal\" : props.portalShareLabel;\r\n const sharePointLabel = props.sharePointShareLabel.trim() === \"\" ? \"MS Sharepoint\" : props.sharePointShareLabel;\r\n const teamsLabel = props.teamsShareLabel.trim() === \"\" ? \"MS Teams\" : props.teamsShareLabel;\r\n\r\n const allChannelsDisabled = !(props.sharepointShareEnabled || props.teamsShareEnabled || props.portalShareEnabled);\r\n\r\n const onEmailClicked = async () => {\r\n const subject = getDefaultEmailSubject(props.contentType, props.tenantName, props.contentTitle);\r\n const body = getDefaultEmailBody(props.contentType, props.tenantName);\r\n const linkDetails: IShareLinkv1 = { \r\n contentType: fetchShareTypeEnum(props.contentType, getInitialChannelPreference()), \r\n contentId: props.contentId \r\n };\r\n\r\n setSnackbarAndText(LOADING_SNACKBAR_TEXT, true);\r\n\r\n const link = await sharingApi.getShareLink(linkDetails);\r\n const linkToOpen = generateMailTo(subject, body, link);\r\n window.open(linkToOpen);\r\n }\r\n\r\n const onLinkClicked = async () => {\r\n const linkDetails: IShareLinkv1 = { \r\n contentType: fetchShareTypeEnum(props.contentType, selectedPlatform), \r\n contentId: props.contentId \r\n };\r\n\r\n await getShareLinkAndUpdateSnackbar(linkDetails, LINK_COPIED_SNACKBAR_TEXT);\r\n }\r\n\r\n const getLinkLabel = () => {\r\n return <div className=\"link-label-container\" onClick={() => setCalloutOpen(true)}>\r\n <span className=\"link-label\">Copy link</span>\r\n <ArrowDropDown className=\"link-label-icon\" style={{rotate: calloutOpen ? \"180deg\" : \"\"}}/>\r\n </div>;\r\n }\r\n\r\n const onChannelSelected = async(platformName: string, platform: ChannelSelection) => {\r\n setSelectedPlatform(platform);\r\n setCalloutOpen(false);\r\n\r\n const linkDetails: IShareLinkv1 = {\r\n contentType: fetchShareTypeEnum(props.contentType, platform), \r\n contentId: props.contentId\r\n };\r\n\r\n await getShareLinkAndUpdateSnackbar(linkDetails, `Link copied and will open in ${platformName}`);\r\n }\r\n\r\n const fetchShareTypeEnum = (contentType: ContentType, targetPlatform: ChannelSelection): ShareContentMapType => {\r\n if (contentType === ContentType.Post) {\r\n switch(targetPlatform) {\r\n case ChannelSelection.Teams:\r\n return ShareContentMapType.TeamsPost;\r\n\r\n case ChannelSelection.SharePoint:\r\n return ShareContentMapType.SharePointPost;\r\n \r\n case ChannelSelection.Portal:\r\n default:\r\n return ShareContentMapType.PortalPost;\r\n }\r\n }\r\n\r\n //Event\r\n else {\r\n switch(targetPlatform) {\r\n case ChannelSelection.Teams:\r\n return ShareContentMapType.TeamsEvent;\r\n\r\n case ChannelSelection.SharePoint:\r\n return ShareContentMapType.SharePointEvent;\r\n\r\n case ChannelSelection.Portal:\r\n default:\r\n return ShareContentMapType.PortalEvent;\r\n }\r\n }\r\n }\r\n\r\n const setSnackbarAndText = (text: string, open: boolean) => {\r\n setSnackbarText(text);\r\n setSnackbarOpen(open);\r\n }\r\n\r\n return (\r\n <div className=\"share-screen\">\r\n <div className=\"contents\">\r\n\r\n <IconButton className=\"back-button\" onClick={props.onCloseDialog}>\r\n <ArrowBack className=\"icon-styling\"/>\r\n </IconButton>\r\n\r\n <div style={{...props.contentStyling}} className=\"body\">\r\n <span className=\"share-label\"> Share with people in {props.tenantName}</span>\r\n <div className=\"share-options-container\"> \r\n <LabelledIconButton \r\n label={\"Email\"}\r\n icon={ <EmailOutlined className=\"icon-styling\" /> }\r\n onClick={onEmailClicked}\r\n />\r\n\r\n <div ref={copyLinkRef}>\r\n <LabelledIconButton \r\n label={getLinkLabel()}\r\n icon={ <Link className=\"icon-styling\" /> }\r\n onClick={onLinkClicked}\r\n />\r\n <Callout\r\n anchorEl={copyLinkRef.current}\r\n open={calloutOpen}\r\n setOpen={setCalloutOpen}\r\n popoverProps={{\r\n style: { padding: 0 }\r\n }}\r\n arrowPosition='none'\r\n anchorOrigin={{vertical: \"bottom\", horizontal: \"left\"}}\r\n transformOrigin={{vertical: \"top\", horizontal: \"left\"}}\r\n contentClassName='share-callout-content'\r\n >\r\n <div className=\"callout-container\">\r\n <span className=\"copy-link-text\">Copy link that will open in...</span>\r\n <List disablePadding>\r\n {(allChannelsDisabled || props.portalShareEnabled) &&\r\n <MoreOptionsItem\r\n key={ChannelSelection.Portal}\r\n text={portalLabel}\r\n textStyle={{fontSize: \"14px\", fontWeight: selectedPlatform === ChannelSelection.Portal ? 500 : {}}}\r\n buttonStyle={selectedPlatform === ChannelSelection.Portal ? {backgroundColor: \"#F2F2EF\"} : {}}\r\n onClick={async() => {\r\n await onChannelSelected(portalLabel, ChannelSelection.Portal);\r\n }}\r\n />\r\n }\r\n\r\n {props.sharepointShareEnabled &&\r\n <MoreOptionsItem\r\n key={ChannelSelection.SharePoint}\r\n text={sharePointLabel}\r\n textStyle={{fontSize: \"14px\", fontWeight: selectedPlatform === ChannelSelection.SharePoint ? 500 : {}}}\r\n buttonStyle={selectedPlatform === ChannelSelection.SharePoint ? {backgroundColor: \"#F2F2EF\"} : {}}\r\n onClick={async() => {\r\n await onChannelSelected(sharePointLabel, ChannelSelection.SharePoint);\r\n }}\r\n />\r\n }\r\n\r\n {props.teamsShareEnabled &&\r\n <MoreOptionsItem\r\n key={ChannelSelection.Teams}\r\n text={teamsLabel}\r\n textStyle={{fontSize: \"14px\", fontWeight: selectedPlatform === ChannelSelection.Teams ? 500 : {}}}\r\n buttonStyle={selectedPlatform === ChannelSelection.Teams ? {backgroundColor: \"#F2F2EF\"} : {}}\r\n onClick={async() => {\r\n await onChannelSelected(teamsLabel, ChannelSelection.Teams);\r\n }}\r\n />\r\n }\r\n </List>\r\n </div> \r\n </Callout>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <Snackbar\r\n open={snackbarOpen}\r\n autoHideDuration={null}\r\n onClose={() => {\r\n setSnackbarOpen(false);\r\n }}\r\n ContentProps={{\r\n style: { minWidth: \"50px\", backgroundColor: \"#36404A\" }\r\n }}\r\n message={snackbarText}\r\n anchorOrigin={{vertical: 'bottom', horizontal: 'center'}}\r\n />\r\n </div>\r\n );\r\n\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id,\r\n sharePointShareLabel: state.settings.tenantSettings.shareUrlsConfig.spUrlShareLinkName,\r\n portalShareLabel: state.settings.tenantSettings.shareUrlsConfig.companyPortalUrlShareLinkName,\r\n teamsShareLabel: state.settings.tenantSettings.shareUrlsConfig.teamsUrlShareLinkName,\r\n linkPreference: state.settings.notificationSettings.linkPreference,\r\n portalShareEnabled: state.settings.tenantSettings.shareUrlsConfig.toggleCompanyPortalUrl,\r\n teamsShareEnabled: state.settings.tenantSettings.shareUrlsConfig.toggleTeamsUrl,\r\n sharepointShareEnabled: state.settings.tenantSettings.shareUrlsConfig.toggleSpUrl,\r\n portalUrl: state.settings.tenantSettings.teams.companyPortalUrl\r\n }),\r\n {\r\n }\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(InternalShareScreen);","import * as React from 'react';\r\nimport { ArrowBack, EmailOutlined, Link } from \"@mui/icons-material\";\r\nimport { Icon, IconButton, Snackbar } from \"@mui/material\";\r\nimport LabelledIconButton from \"modules/common/components/buttons/labelledIconButton\";\r\nimport { createBodyAndEncode, createBodyAndEncodeOnlyUrl, generateMailTo, getDefaultEmailBody, getDefaultEmailSubject, getFacebookLink, getLinkedInLink, getTwitterLink } from 'utils/shareHelpers';\r\nimport { ContentType, IShareLinkv1, LINK_COPIED_SNACKBAR_TEXT, LOADING_SNACKBAR_TEXT, ShareContentMapType } from './models';\r\n\r\nimport \"./sharingPages.sass\";\r\nimport { sharingApi } from 'api/instances';\r\n\r\ninterface ComponentProps {\r\n onCloseDialog: () => void;\r\n tenantName: string;\r\n tenantId: string;\r\n contentTitle: string;\r\n contentId: string;\r\n contentType: ContentType;\r\n customShareUrl: string; //Replaces share system if populated. Validation means that if a URL is here it should be good.\r\n isAuthenticated: boolean;\r\n}\r\n\r\nconst PublicShareScreen: React.FunctionComponent<ComponentProps> = (props) => {\r\n const [snackbarOpen, setSnackbarOpen] = React.useState(false);\r\n const [snackbarText, setSnackbarText] = React.useState(\"\");\r\n const validShareUrl = !!props.customShareUrl && props.customShareUrl !== \"\";\r\n const headerLabel = props.isAuthenticated ? \"Share publicly\" : \"Share this post\";\r\n\r\n //In the future this may need to be more dynamic if we have more public share options.\r\n const shareType = validShareUrl ? ShareContentMapType.CustomShareLink : ShareContentMapType.PortalPostPublic;\r\n const linkDetails:IShareLinkv1 = {contentType: shareType, contentId: props.contentId};\r\n\r\n const setSnackbarAndText = (text: string, open: boolean) => {\r\n setSnackbarText(text);\r\n setSnackbarOpen(open);\r\n }\r\n\r\n const onLinkRequested = async (linkDetails: IShareLinkv1) => {\r\n setSnackbarAndText(LOADING_SNACKBAR_TEXT, true);\r\n\r\n return await sharingApi.getShareLinkAnonymous(props.tenantId, linkDetails);\r\n }\r\n\r\n const onXClicked = async() => {\r\n const url = await onLinkRequested(linkDetails);\r\n const encodedTweetBody = createBodyAndEncode(props.tenantName, url);\r\n window.open(getTwitterLink(encodedTweetBody));\r\n }\r\n\r\n const onLinkedInClicked = async() => {\r\n const url = await onLinkRequested(linkDetails);\r\n const encodedPostBody = createBodyAndEncode(props.tenantName, url);\r\n window.open(getLinkedInLink(encodedPostBody))\r\n }\r\n\r\n const onFacebookClicked = async() => {\r\n const url = await onLinkRequested(linkDetails);\r\n const encodedPostBody = createBodyAndEncodeOnlyUrl(url);\r\n window.open(getFacebookLink(encodedPostBody))\r\n }\r\n\r\n const onEmailClicked = async() => {\r\n const subject = getDefaultEmailSubject(props.contentType, props.tenantName, props.contentTitle);\r\n const body = getDefaultEmailBody(props.contentType, props.tenantName);\r\n \r\n const url = await onLinkRequested(linkDetails);\r\n const mailToUrl = generateMailTo(subject, body, url);\r\n window.open(mailToUrl);\r\n }\r\n\r\n const onLinkClicked = async() => {\r\n const url = await onLinkRequested(linkDetails);\r\n navigator.clipboard.writeText(url);\r\n setSnackbarAndText(LINK_COPIED_SNACKBAR_TEXT, true);\r\n }\r\n\r\n return (\r\n <div className=\"share-screen\">\r\n <div className=\"contents\">\r\n\r\n <IconButton className=\"back-button\" onClick={props.onCloseDialog}>\r\n <ArrowBack className=\"icon-styling\"/>\r\n </IconButton>\r\n\r\n <div className=\"body\" style={{marginTop: \"40%\"}}>\r\n <span className=\"share-label\"> {headerLabel} </span>\r\n\r\n <div className=\"share-options-container\"> \r\n <LabelledIconButton \r\n label={\"Facebook\"}\r\n icon={ \r\n <Icon className=\"social-media-icon\">\r\n <img \r\n src={\"/images/socialMediaLogos/facebook.svg\"} \r\n alt=\"Facebook Logo\" \r\n height={\"28px\"} \r\n width={\"28px\"}\r\n ></img>\r\n </Icon> \r\n }\r\n onClick={onFacebookClicked}\r\n />\r\n\r\n <LabelledIconButton \r\n label={\"X\"}\r\n icon={ \r\n <Icon className=\"social-media-icon\">\r\n <img \r\n src={\"/images/socialMediaLogos/x.svg\"} \r\n alt=\"X / Twitter Logo\" \r\n height={\"22px\"} \r\n width={\"22px\"}\r\n ></img>\r\n </Icon> \r\n }\r\n onClick={onXClicked}\r\n />\r\n\r\n <LabelledIconButton \r\n label={\"LinkedIn\"}\r\n icon={ \r\n <Icon className=\"social-media-icon\">\r\n <img \r\n src={\"/images/socialMediaLogos/linkedInCropped.svg\"} \r\n alt=\"LinkedIn Logo\" \r\n height={\"22px\"} \r\n width={\"22px\"}\r\n style={{position: \"relative\", left: \"1px\"}}\r\n ></img>\r\n </Icon> \r\n }\r\n onClick={onLinkedInClicked}\r\n />\r\n\r\n <LabelledIconButton \r\n label={\"Email\"}\r\n icon={ <EmailOutlined className=\"icon-styling\" /> }\r\n onClick={onEmailClicked}\r\n />\r\n\r\n <LabelledIconButton \r\n label={\"Copy link\"}\r\n icon={ <Link className=\"icon-styling\"/> }\r\n onClick={onLinkClicked}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n <Snackbar\r\n open={snackbarOpen}\r\n autoHideDuration={null}\r\n onClose={() => {\r\n setSnackbarOpen(false);\r\n }}\r\n ContentProps={{\r\n style: { minWidth: \"50px\", backgroundColor: \"#36404A\" }\r\n }}\r\n message={snackbarText}\r\n anchorOrigin={{vertical: 'bottom', horizontal: 'center'}}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport default PublicShareScreen;","import * as React from \"react\";\r\n\r\nexport enum FeedLayout {\r\n HorizontalBand = \"card\",\r\n Column = \"column\",\r\n Window = \"window\",\r\n List = \"list\",\r\n StackedCard = \"stackedCard\" \r\n}\r\n\r\nexport interface ITinaProps<T> {\r\n input: ITinaInput<T>;\r\n field: ITinaField;\r\n}\r\n\r\ninterface ITinaInput<T> {\r\n value: T;\r\n name: string;\r\n onChange: (event: React.SyntheticEvent<any, Event> | any) => void,\r\n onFocus: (event?: React.SyntheticEvent<any, Event>) => void,\r\n onBlur: (event?: React.SyntheticEvent<any, Event>) => void,\r\n}\r\n\r\ninterface ITinaField {\r\n component: string;\r\n description: string;\r\n label: string;\r\n name: string;\r\n\r\n buttonLabel?: string;\r\n options?: ISelectableOption[];\r\n}\r\n\r\ninterface ISelectableOption {\r\n value: string;\r\n label: string;\r\n}","/* Share button v1 is not being replaced as it's still used in documents. If we ever swap it for this one, file should be safe for deletion. */\r\n\r\nimport * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport ShareIcon from \"@mui/icons-material/Share\";\r\n\r\n\r\nimport \"../dialogs/shareDialog.sass\";\r\nimport { useState } from \"react\";\r\nimport { List, Popover } from \"@mui/material\";\r\nimport MoreOptionsItem from \"../moreOptionsItem\";\r\n\r\n\r\nconst ShareButtonv2: React.FunctionComponent<PropsWithRedux> = (props) => {\r\n const [shareOptionsOpen, setShareOptionsOpen] = useState(false);\r\n\r\n const shareRef = React.useRef(null);\r\n\r\n const onShow = () => {\r\n if(props.isPublic) {\r\n if(props.isAuthenticated) {\r\n setShareOptionsOpen(true);\r\n }\r\n else if (props.togglePublicShare){\r\n props.togglePublicShare(true);\r\n }\r\n }\r\n else {\r\n props.toggleInternalShare(true);\r\n }\r\n }\r\n\r\n const { linkText } = props;\r\n\r\n return (\r\n <div className={`share-button ${linkText ? \"link\" : \"share\"}`}>\r\n {linkText\r\n ? <div title=\"Share\" onClick={onShow} className=\"link-text\">\r\n {linkText}\r\n </div>\r\n : <IconButton title=\"Share\" size={props.size === \"small\" ? \"small\" : \"medium\"} onClick={onShow} style={{backgroundColor: shareOptionsOpen ? \"#F2F2EF\" : \"\"}}>\r\n <ShareIcon fontSize={props.size === \"small\" ? \"small\" : \"medium\"} />\r\n </IconButton>\r\n }\r\n <div ref={shareRef} className=\"popover-container\"/>\r\n <Popover\r\n open={shareOptionsOpen}\r\n onClose={() => setShareOptionsOpen(false)}\r\n anchorEl={shareRef.current}\r\n anchorOrigin={{\r\n vertical: 'bottom',\r\n horizontal: 'right',\r\n }}\r\n transformOrigin={{\r\n vertical: 'top',\r\n horizontal: 'right',\r\n }}\r\n >\r\n <List disablePadding>\r\n <MoreOptionsItem\r\n text={`Share with people in ${props.tenantName}`}\r\n hoverStyle={{backgroundColor: \"#F2F2EF\"}}\r\n onClick={() => {\r\n setShareOptionsOpen(false);\r\n props.toggleInternalShare(true)\r\n }} \r\n />\r\n <MoreOptionsItem\r\n text={`Share publicly`}\r\n hoverStyle={{backgroundColor: \"#F2F2EF\"}}\r\n onClick={() => {\r\n setShareOptionsOpen(false);\r\n \r\n if(props.togglePublicShare)\r\n props.togglePublicShare(true);\r\n }} \r\n />\r\n </List>\r\n </Popover>\r\n </div>\r\n );\r\n}\r\n\r\n\r\ninterface IShareButtonv2Props {\r\n size?: \"default\" | \"small\";\r\n isPublic?: boolean;\r\n linkText?: string;\r\n isAuthenticated: boolean;\r\n togglePublicShare?: (toSet: boolean) => void;\r\n toggleInternalShare: (toSet: boolean) => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IShareButtonv2Props) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id,\r\n tenantName: state.settings.tenantSettings.displayName\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(ShareButtonv2);\r\n","import * as React from 'react';\r\nimport { useEffect, useState } from 'react';\r\nimport { connect, ConnectedProps } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport * as actions from 'modules/posts/actionCreator';\r\nimport { Comment, ImageScale, PostView as IPostView } from '../../models';\r\nimport { postsApi } from 'api/instances';\r\nimport moment from \"moment\";\r\n\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport PostTypeBanner from \"modules/common/components/banners/postTypeBanner\";\r\nimport useIsMounted from 'modules/common/hooks/useIsMounted';\r\nimport useIsFirstRender from 'modules/common/hooks/useIsFirstRender';\r\nimport { parseAnchors } from 'utils/htmlUtils';\r\nimport { CustomCss } from 'modules/common/components/customCss';\r\n\r\nimport BreakingFeaturedBanner from \"../banners/breakingFeaturedBanner\";\r\nimport Comments from \"./comments/comments\";\r\nimport Compliance from \"./compliance/compliance\";\r\nimport HeroBanner from \"../../../common/components/heroBanner\";\r\nimport Reactions from \"./reactions/reactions\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport Link from \"@mui/material/Link\";\r\n\r\nimport './postView.sass';\r\nimport PublicShareScreen from 'modules/sharing/publicShareScreen';\r\nimport InternalShareScreen from 'modules/sharing/internalShareScreen';\r\nimport ShareButtonv2 from 'modules/common/components/buttons/shareButtonv2';\r\nimport { useIsAuthenticated } from '@azure/msal-react';\r\nimport { ContentType } from 'modules/sharing/models';\r\nimport { useDefaultLocale } from 'modules/common/hooks/useDefaultLocale';\r\n\r\nconst PostView: React.FunctionComponent<PropsWithRedux> = (props) => {\r\n const [activeLcid, setActiveLcid] = useState<string>(props.currentUserPreferredLCID);\r\n const [post, setPost] = useState<IPostView>();\r\n const [isLoading, setIsLoading] = useState<boolean>(true);\r\n const [internalShareOpen, setInternalShareOpen] = useState<boolean>(false);\r\n const [publicShareOpen, setPublicShareOpen] = useState<boolean>(false);\r\n\r\n const isMounted = useIsMounted();\r\n const isAuthenticated = useIsAuthenticated();\r\n const isFirstRender = useIsFirstRender();\r\n useDefaultLocale();\r\n\r\n const postRef = React.useRef<HTMLInputElement | null>(null);\r\n\r\n useEffect(() => {\r\n /**\r\n * Get a public post\r\n * @param isInitialLoad\r\n */\r\n const getPublicPost = async (isInitialLoad: boolean): Promise<IPostView | null> => {\r\n if (!props.tenantId || !props.postId) return null;\r\n\r\n const response: IPostView = await postsApi.GetPublicPost(props.tenantId, props.postId, ImageScale.Modal);\r\n if (response && isInitialLoad)\r\n await postsApi.SendPublicPostOpenedEvent(props.tenantId, response.id, response.defaultLCID);\r\n\r\n return response;\r\n };\r\n\r\n /**\r\n * Get a private post\r\n * @param initialLoad\r\n */\r\n const getPrivatePost = async (isInitialLoad: boolean): Promise<IPostView | null> => {\r\n if (!props.postId) return null;\r\n\r\n const response = await postsApi.GetPost(props.postId, ImageScale.Modal);\r\n if (response && isInitialLoad)\r\n await postsApi.SendPostOpenedEvent(response.id, response.defaultLCID);\r\n\r\n return response;\r\n };\r\n\r\n /**\r\n * Decide whether we need to get a private or public post and fetch\r\n * @param initialLoad\r\n */\r\n const getPost = async (initialLoad: boolean) => {\r\n props.clearFetchPost();\r\n let newPost: IPostView | null;\r\n\r\n try {\r\n // get the post\r\n if (props.isPublic && props.tenantId)\r\n newPost = await getPublicPost(initialLoad);\r\n else\r\n newPost = await getPrivatePost(initialLoad);\r\n\r\n // if post got, update state\r\n if (newPost && isMounted()) {\r\n setPost(newPost);\r\n setActiveLcid(props.currentUserPreferredLCID);\r\n\r\n }\r\n } catch (error) { }\r\n finally {\r\n if (isMounted())\r\n setIsLoading(false);\r\n }\r\n };\r\n\r\n if (isFirstRender || props.shouldFetch)\r\n getPost(isFirstRender);\r\n\r\n return () => {\r\n if (post) {\r\n if (props.isPublic && props.tenantId)\r\n postsApi.SendPublicPostClosedEvent(props.tenantId!, post.id, post.defaultLCID);\r\n else\r\n postsApi.SendPostClosedEvent(post.id, post.defaultLCID);\r\n }\r\n };\r\n }, [isFirstRender, isMounted, post, props]);\r\n\r\n const onSelectLanguage = (language: Language) => {\r\n setActiveLcid(language.lcid);\r\n };\r\n\r\n const onUpdateComments = (comments: Comment[]) => {\r\n if (!post) return;\r\n\r\n setPost({ ...post, comments });\r\n };\r\n\r\n const onUpdateCommentSubscriptions = (isPostNotificationsActive: boolean) => {\r\n if (!post) return;\r\n\r\n setPost({ ...post, isPostNotificationsActive });\r\n };\r\n\r\n const getTranslatedField = (field: string) => {\r\n if (!post) return;\r\n\r\n if (!post.translatedContent || !post.translatedContent[activeLcid])\r\n return post![field];\r\n\r\n return post!.translatedContent[activeLcid][field];\r\n };\r\n\r\n const getAvailableLanguages = (): JSX.Element => {\r\n if (!post || Object.keys(post.translatedContent).length < 2 || !props.lcidMappings)\r\n return <></>;\r\n\r\n const { lcidMappings } = props;\r\n const availableLcids: string[] = Object.keys(post.translatedContent);\r\n const availableLanguages: Language[] = availableLcids.map((lcid) => ({ language: lcidMappings[lcid] ? lcidMappings[lcid].languageShort : lcid, lcid }));\r\n\r\n return (\r\n <div className=\"available-languages\">\r\n <span className=\"emphasis\">Available In: </span>\r\n {availableLanguages\r\n .map<React.ReactNode>((language) =>\r\n <span key={language.lcid} onClick={() => onSelectLanguage(language)} className={language.lcid === activeLcid ? \"\" : \"inactive-language\"}>{language.language}</span>\r\n )\r\n .reduce((prev, curr) => [prev, \", \", curr])\r\n }\r\n </div>\r\n );\r\n };\r\n\r\n const title: string = getTranslatedField(\"title\");\r\n const tenantId = props.tenantId || props.configTenantId || \"\";\r\n\r\n return (\r\n <React.Fragment>\r\n <CustomCss enabled={props.tinyMceCustomCssEnabled} />\r\n {isLoading && <Loading />}\r\n {!isLoading && !post &&\r\n <div className=\"no-post-data\">Unfortunately, this post is no longer available.</div>}\r\n\r\n {!isLoading && post &&\r\n <div className=\"post-view\" ref={postRef} style={{position: \"relative\", overflowY: publicShareOpen || internalShareOpen ? \"hidden\" : \"auto\"}}>\r\n \r\n {publicShareOpen && tenantId !== undefined &&\r\n <PublicShareScreen \r\n onCloseDialog={() => setPublicShareOpen(false)}\r\n tenantName={props.tenantName}\r\n tenantId={tenantId}\r\n contentTitle={post.title}\r\n isAuthenticated={isAuthenticated}\r\n contentType={ContentType.Post}\r\n contentId={post.id}\r\n customShareUrl={post.customPublicUrl ?? \"\"}\r\n />\r\n }\r\n\r\n {internalShareOpen &&\r\n <InternalShareScreen \r\n onCloseDialog={() => setInternalShareOpen(false)}\r\n tenantName={props.tenantName}\r\n contentTitle={post.title}\r\n contentId={post.id}\r\n contentStyling={{marginTop: \"40%\"}}\r\n contentType={ContentType.Post}\r\n isPublic={post.postType === \"public\"}\r\n />\r\n }\r\n\r\n <div>\r\n <div className=\"view-page\">\r\n <HeroBanner bannerColor={post.bannerColor} imageUrl={post.imageUrl} attachedContent={post.attachedContent} />\r\n <PostTypeBanner {...props} {...post} full lcid={activeLcid} />\r\n <div className=\"page-content\">\r\n <div className=\"title\">\r\n <div>{title}</div>\r\n\r\n {(props.shareUrlsEnabled.toggleCompanyPortalUrl || props.shareUrlsEnabled.toggleSpUrl || props.shareUrlsEnabled.toggleTeamsUrl)\r\n &&\r\n <ShareButtonv2\r\n isPublic={post.postType === \"public\"}\r\n toggleInternalShare={(toSet) => { \r\n postRef.current?.scrollTo(0, 0);\r\n setInternalShareOpen(toSet)\r\n }}\r\n togglePublicShare={(toSet) => {\r\n postRef.current?.scrollTo(0, 0);\r\n setPublicShareOpen(toSet)\r\n }}\r\n isAuthenticated={isAuthenticated}\r\n />\r\n }\r\n </div>\r\n <div className=\"published-time\">Published {moment(post.publishTime).format(\"MMMM D, YYYY\")}</div>\r\n <div className=\"tags\">Topics: {post.tags.map((tag) => tag.name).join(\", \")}</div>\r\n <div className=\"author\">\r\n <Divider light />\r\n <div className=\"author-details\">\r\n <div className=\"author-avatar\" style={{ backgroundColor: post?.author.avatar.color }}>{post.author.name ? post.author.name[0] : \"\"}</div>\r\n <div>\r\n <div>Post By</div>\r\n {post && post.author && post.author.email\r\n ? <Link href={`mailto:${post.author.email}`} className=\"author-name\">{post.author.name}</Link>\r\n : <div className=\"author-name\">{post && post.author ? post.author.name : \"\"}</div>\r\n }\r\n </div>\r\n </div>\r\n <Divider light />\r\n </div>\r\n <BreakingFeaturedBanner activeLcid={activeLcid} detailed isBreaking={post.isBreaking} isFeatured={post.isFeatured} />\r\n {getAvailableLanguages()}\r\n <div dangerouslySetInnerHTML={{ __html: parseAnchors(getTranslatedField(\"body\")) }} className=\"body\"></div>\r\n {!!post.fileAttachments && !!post.fileAttachments.length &&\r\n <div className=\"documents\">\r\n <div className=\"documents-label\">Documents ({post.fileAttachments.length})</div>\r\n <div>\r\n {post.fileAttachments.map((fileAttachment) =>\r\n <Button\r\n key={fileAttachment.blobId}\r\n variant=\"outlined\"\r\n size=\"small\"\r\n onClick={() => postsApi.DownloadFile(fileAttachment.fileUrl!, fileAttachment.fileName, fileAttachment.fileExtension)}\r\n >\r\n {fileAttachment.fileName}\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n }\r\n <Compliance\r\n postId={post.id}\r\n complianceText={getTranslatedField(\"complianceText\")}\r\n postType={post.postType}\r\n stats={post.stats}\r\n />\r\n </div>\r\n </div>\r\n <Reactions\r\n reactionsEnabledOnTenant={props.reactionsEnabled}\r\n reactions={props.reactions}\r\n postType={post.postType}\r\n reactingEnabledOnPost={post.reactingEnabled}\r\n stats={post.stats}\r\n />\r\n </div>\r\n <div className=\"comments\">\r\n <Comments\r\n id={post.id}\r\n commentsEnabledOnTenant={props.commentsEnabled}\r\n commentsEnabledOnPost={post.commentingEnabled}\r\n comments={post.comments}\r\n isSubscribed={post.isPostNotificationsActive}\r\n showSubscription={post.userCommentNotificationSettings !== \"none\"}\r\n onUpdateComments={onUpdateComments}\r\n onUpdateCommentSubscriptions={onUpdateCommentSubscriptions}\r\n />\r\n </div>\r\n </div>}\r\n <ErrorSnackbar errorMessage={props.errorMessage} clearErrorMessage={props.clearErrorMessage} />\r\n </React.Fragment>\r\n );\r\n}\r\n\r\ninterface Language {\r\n language: string;\r\n lcid: string;\r\n}\r\n\r\ninterface ComponentProps {\r\n isPublic?: boolean;\r\n postId: string;\r\n tenantId?: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n errorMessage: state.posts.postView.errorMessage,\r\n shouldFetch: state.posts.postView.shouldFetch,\r\n lcidMappings: state.resources.lcidMappings,\r\n users: state.users.userList || [],\r\n reactions: state.settings.clientSettings.reactions,\r\n reactionsEnabled: state.settings.clientSettings.reactionSystem && state.settings.clientSettings.reactionSystem.enabled,\r\n commentsEnabled: state.settings.clientSettings.commentSystem && state.settings.clientSettings.commentSystem.enabled,\r\n currentUserPreferredLCID: state.settings.currentUser.preferredLCID,\r\n shareUrlsEnabled: state.settings.tenantSettings.shareUrlsConfig,\r\n tinyMceCustomCssEnabled: state.settings.tenantSettings.showFeatures.tinyMceCustomCssEnabled,\r\n tenantName: state.settings.tenantSettings.displayName,\r\n configTenantId: state.settings.tenantSettings.tenantId\r\n }),\r\n {\r\n clearErrorMessage: actions.clearPostViewErrorMessage,\r\n clearFetchPost: actions.clearFetchPost,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(PostView);\r\n","import React from \"react\";\r\nimport { Dialog, DialogProps, Theme } from \"@mui/material\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { CONTENT_MODAL_WIDTH } from \"utils/generalConstants\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\n\r\ninterface IDialogContentViewProps extends DialogProps {\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n dialog: {\r\n minWidth: 200,\r\n },\r\n })\r\n);\r\n\r\nconst DialogContentViewComponent: React.FunctionComponent<PropsWithRedux> = (props) => {\r\n const classes = useStyles();\r\n const { mobileAppBannerOpen, dispatch, ...rest } = props;\r\n\r\n return (\r\n <Dialog\r\n {...rest}\r\n sx={{\r\n marginTop: mobileAppBannerOpen ? 5 : 0\r\n }}\r\n PaperProps={{ style: { maxWidth: CONTENT_MODAL_WIDTH } }}\r\n classes={{ paper: classes.dialog }}\r\n maxWidth={\"md\"}\r\n fullWidth\r\n >\r\n {props.children}\r\n </Dialog>\r\n );\r\n}\r\n\r\nconst connector = connect((state: GlobalApplicationState, ownProps: IDialogContentViewProps) => ({\r\n ...ownProps,\r\n mobileAppBannerOpen: state.userPortalLayout.mobileAppBannerOpen\r\n}));\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport const DialogContentView = connector(DialogContentViewComponent);\r\n","import React from \"react\";\r\nimport { DialogProps, IconButton, Theme } from \"@mui/material\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\nimport PostView from \"./postView\";\r\nimport { DialogContentView } from \"modules/common/components/dialogs/dialogContentView\";\r\nimport { CONTENT_MODAL_WIDTH } from \"utils/generalConstants\";\r\n\r\ninterface IDialogPostViewProps extends DialogProps {\r\n tenantId?: string;\r\n postId?: string;\r\n isPublic?: boolean;\r\n onClose?: () => void;\r\n}\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n close: {\r\n position: \"absolute\",\r\n top: 0,\r\n right: 0,\r\n color: \"#ffffff\",\r\n zIndex: 2,\r\n },\r\n dialog: {\r\n minWidth: 200,\r\n }\r\n })\r\n);\r\n\r\nexport const DialogPostView: React.FunctionComponent<IDialogPostViewProps> = ({\r\n postId,\r\n onClose,\r\n isPublic = false,\r\n open,\r\n tenantId,\r\n ...props\r\n}) => {\r\n const classes = useStyles();\r\n\r\n return (\r\n <DialogContentView\r\n {...props}\r\n id=\"post-dialog\"\r\n open={open}\r\n PaperProps={{ style: { maxWidth: CONTENT_MODAL_WIDTH } }}\r\n classes={{ paper: classes.dialog }}\r\n onClose={onClose}\r\n >\r\n {props.children\r\n ? props.children\r\n : <>\r\n <IconButton onClick={onClose} className={classes.close} size=\"large\">\r\n <CloseIcon color=\"inherit\" />\r\n </IconButton>\r\n <PostView postId={postId!} isPublic={isPublic} tenantId={tenantId} />\r\n </>}\r\n </DialogContentView>\r\n );\r\n}\r\n","export enum CardType {\r\n Horizontal = \"horizontal-card\",\r\n Stacked = \"stacked-card\"\r\n}","import React from \"react\";\r\n\r\nimport \"./styles/emptyFeed.sass\";\r\n\r\nexport const EmptyFeed: React.FunctionComponent = () => {\r\n return <div className=\"empty-feed\">\r\n <img src=\"/images/thumbs-up.svg\" alt=\"thumbs up\"/>\r\n\r\n <br />\r\n You're all caught up here!\r\n </div>;\r\n};","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as actions from \"modules/posts/actionCreator\";\r\n\r\nimport { defaultPostFeedFilter, PostFeedFilters, PostFeedItem, Tag } from \"../../models\";\r\nimport Card from \"./components/layouts/card/Card\";\r\nimport Column from \"./components/layouts/column/Column\";\r\nimport Window from \"./components/layouts/window/Window\";\r\nimport List from \"./components/layouts/list/List\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { DialogPostView } from \"../post-view/dialogPostView\";\r\nimport { FeedLayout } from \"modules/portalPages/tinacms/models/common\";\r\nimport { EmptyFeed } from \"modules/common/components/feed/emptyFeed\";\r\nimport { FeedButtons } from \"../../../common/components/feed/feedButtons\";\r\n\r\nimport \"./styles/NewsFeed.sass\";\r\n\r\nclass PostFeed extends React.Component<PropsWithRedux, ComponentState> {\r\n _isMounted = false;\r\n\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n isFetching: true,\r\n canLoadMore: true,\r\n postsFeed: [],\r\n selectedPostId: \"\"\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n this._isMounted = true;\r\n this.fetchFeed();\r\n }\r\n\r\n public componentWillUnmount() {\r\n this._isMounted = false;\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.ignoreSubscriptions !== prevProps.ignoreSubscriptions || this.props.lockSubscriptions !== prevProps.lockSubscriptions || this.props.lockedToTopics !== prevProps.lockedToTopics || this.props.maxResults !== prevProps.maxResults || this.props.postTypes !== prevProps.postTypes)\r\n this.fetchFeed();\r\n }\r\n\r\n public render() {\r\n const { postsFeed } = this.state;\r\n\r\n const loadMore = this.props.hideLoadMore\r\n ? undefined\r\n : { canLoadMore: (this.state.canLoadMore), isFetching: this.state.isFetching, onFetchMore: this.fetchFeed }\r\n\r\n if (postsFeed.length === 0 && this.state.isFetching) return <Loading/>;\r\n\r\n return <div id=\"news-feed\" className={this.props.layout === FeedLayout.HorizontalBand ? \"horizontal-scrollable\" : \"\"}>\r\n {\r\n postsFeed.length === 0 && !this.state.isFetching\r\n ? <EmptyFeed />\r\n : this.getLayout({ ...this.props, ...this.state }, this.props.currentUser.preferredLCID)\r\n }\r\n <DialogPostView\r\n isPublic\r\n onClose={this.unselectPost}\r\n postId={this.state.selectedPostId}\r\n open={!!this.state.selectedPostId}\r\n />\r\n {\r\n this.props.layout !== FeedLayout.HorizontalBand &&\r\n <FeedButtons\r\n loadMore={loadMore}\r\n viewAll={this.props.hideViewAll\r\n ? undefined\r\n : { action: this.onViewAll }\r\n }\r\n />\r\n }\r\n </div>\r\n }\r\n\r\n private onViewAll = () => {\r\n const topicIds = this.props.lockedToTopics.map(t => t.id)\r\n this.props.setPostFeedFilters({...defaultPostFeedFilter, tags: topicIds, postTypes: this.props.postTypes});\r\n this.props.redirectTo(`/${this.props.tenantId}/posts`);\r\n }\r\n\r\n private fetchFeed = async (pageNumber: number = 1) => {\r\n this.setState({ isFetching: true });\r\n\r\n const filters: Partial<PostFeedFilters> = {\r\n ignoreSubscriptions: this.props.ignoreSubscriptions,\r\n lockSubscriptions: !!this.props.lockedToTopics.length,\r\n postTypes: !!this.props.postTypes.length ? this.props.postTypes : undefined,\r\n lockedTags: !!this.props.lockedToTopics.length ? this.props.lockedToTopics.map(topic => topic.id) : undefined\r\n };\r\n\r\n const postsToFetch = this.props.maxResults;\r\n\r\n try {\r\n const postsFeed = await this.props.fetchPostsFeed(filters, postsToFetch, pageNumber);\r\n \r\n if (!this._isMounted) return;\r\n\r\n this.setState({\r\n isFetching: false,\r\n canLoadMore: postsFeed.length === +postsToFetch,\r\n postsFeed: pageNumber === 1 ? [...postsFeed] : [...this.state.postsFeed, ...postsFeed]\r\n });\r\n }\r\n catch {\r\n this.setState({\r\n isFetching: false,\r\n canLoadMore: false,\r\n postsFeed: []\r\n }); \r\n }\r\n }\r\n\r\n private getLayout(props: ComponentProps & ComponentState, preferredLCID: string): JSX.Element {\r\n switch (props.layout) {\r\n case FeedLayout.HorizontalBand:\r\n return <Card {...props}\r\n cardCount={0}\r\n preferredLCID={preferredLCID}\r\n onPostSelected={this.selectPost}\r\n viewAll={this.props.hideViewAll ? undefined : this.onViewAll}\r\n loadMore={{\r\n canLoadMore: this.state.canLoadMore,\r\n isFetching: this.state.isFetching,\r\n onFetchMore: this.fetchFeed\r\n }}\r\n />;\r\n case FeedLayout.Column:\r\n return <Column {...props} preferredLCID={preferredLCID} onPostSelected={this.selectPost} />;\r\n case FeedLayout.Window:\r\n return <Window {...props} cardCount={props.cardCount || 3} preferredLCID={preferredLCID} onPostSelected={this.selectPost} />;\r\n case FeedLayout.List:\r\n return <List {...props} cardCount={props.cardCount || 10} preferredLCID={preferredLCID} onPostSelected={this.selectPost} />;\r\n case FeedLayout.StackedCard:\r\n return <Card {...props} cardCount={props.cardCount || 3} preferredLCID={preferredLCID} onPostSelected={this.selectPost} />;\r\n default:\r\n return <Card {...props} cardCount={0} preferredLCID={preferredLCID} onPostSelected={this.selectPost} />;\r\n }\r\n }\r\n\r\n private selectPost = (post: PostFeedItem) => {\r\n this.setState({ selectedPostId: post.id });\r\n if (!post.lastReadTime)\r\n this.setState({\r\n postsFeed: this.state.postsFeed.map(article => article.id === post.id && !post.lastReadTime\r\n ? { ...article, lastReadTime: new Date().toISOString() }\r\n : article\r\n )\r\n });\r\n }\r\n\r\n private unselectPost = () => {\r\n this.setState({ selectedPostId: \"\" });\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n cardCount?: number;\r\n hidePublishTime?: boolean;\r\n hideStats?: boolean;\r\n hideSummary?: boolean;\r\n hideTopics?: boolean;\r\n hideLoadMore?: boolean;\r\n hideViewAll?: boolean;\r\n ignoreSubscriptions?: boolean;\r\n lockSubscriptions?: boolean;\r\n layout: FeedLayout;\r\n lockedToTopics: Tag[];\r\n maxResults: number;\r\n postTypes: string[];\r\n}\r\n\r\ninterface ComponentState {\r\n isFetching: boolean;\r\n canLoadMore: boolean;\r\n postsFeed: PostFeedItem[];\r\n selectedPostId: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n currentUser: state.settings.currentUser,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n fetchPostsFeed: actions.fetchPostsFeedLocal,\r\n setPostFeedFilters: actions.setPostFeedFilters,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(PostFeed);\r\n","import React from \"react\";\r\nimport PluginWrapper from \"../../plugins/common/pluginWrapper\";\r\nimport { FeedLayout } from \"../../models/common\";\r\n\r\nexport const contentHeaderTemplate = {\r\n name: \"content_label\",\r\n label: \"Content\",\r\n component: \"section-label\"\r\n};\r\n\r\nexport const ignoreSubscriptionsTemplate = [\r\n {\r\n name: \"ignore_subscriptions\",\r\n label: \"Ignore employee's topic subscriptions\",\r\n component: \"checkbox\"\r\n },\r\n {\r\n name: \"ignore_subscriptions_spacing\",\r\n component: () => <PluginWrapper />\r\n },\r\n];\r\n\r\nexport const lockedToTopicsTemplate = (content: string) => ({\r\n name: \"locked_to_topics\",\r\n label: \"Lock to specific topics\",\r\n description: `The component will only load ${content}s tagged with topics selected. If none are selected, all topics are loaded.`,\r\n component: \"select-topics\"\r\n});\r\n\r\nexport const lockedToCategoryTagsTemplate = {\r\n name: \"locked_to_category_tags\",\r\n label: \"Lock to specific category tags\",\r\n description: `The component will only load documents tagged with category tags selected. If none are selected, all tags are loaded.`,\r\n component: \"select-category-tags\"\r\n};\r\n\r\ninterface INumericalOption {\r\n value: number,\r\n label: string;\r\n}\r\n\r\nconst numberOptions = (min: number, max: number) => {\r\n const options: INumericalOption[] = [];\r\n for (var i = min; i < max + 1; i++) {\r\n options.push({ value: i, label: i.toString() });\r\n }\r\n return options;\r\n};\r\n\r\nconst tileNumberTemplate = (content: string) => ({\r\n name: \"max_results\",\r\n label: \"Number of tiles\",\r\n description: `Select the maximum number of ${content} tiles to display`,\r\n component: \"select\",\r\n options: numberOptions(1, 12)\r\n});\r\n\r\nconst layoutTemplate = (content: string) => {\r\n const layoutOptions = [\r\n { value: FeedLayout.HorizontalBand, label: \"Horizontal Band\" },\r\n { value: FeedLayout.Window, label: \"Window\" },\r\n { value: FeedLayout.List, label: \"List\" },\r\n { value: FeedLayout.StackedCard, label: \"Stacked Cards\" }\r\n ];\r\n if (content.includes(\"news\")) layoutOptions.push({ value: FeedLayout.Column, label: \"Column\" });\r\n\r\n return {\r\n name: \"layout\",\r\n label: \"Layout\",\r\n description: `Select the layout of each ${content} tile`,\r\n component: \"select\",\r\n options: layoutOptions\r\n };\r\n};\r\n\r\nexport const stylingTemplate = (content: string) => ({\r\n header: {\r\n name: \"styling_label\",\r\n label: \"Styling\",\r\n component: \"section-label\"\r\n },\r\n layout: layoutTemplate(content),\r\n tiles: tileNumberTemplate(content),\r\n});\r\n\r\nconst hideButtons = [\r\n {\r\n name: \"hide_load_more\",\r\n label: \"Hide Load More button\",\r\n component: \"checkbox\"\r\n },\r\n {\r\n name: \"hide_view_all\",\r\n label: \"Hide View All button\",\r\n component: \"checkbox\"\r\n },\r\n];\r\n\r\nconst docsOptionalData = [\r\n {\r\n name: \"hide_file_icon\",\r\n label: \"Hide file icon\",\r\n component: \"checkbox\"\r\n },\r\n {\r\n name: \"hide_category_tags\",\r\n label: \"Hide category tags\",\r\n component: \"checkbox\"\r\n },\r\n {\r\n name: \"hide_action_icons\",\r\n label: \"Hide action icons\",\r\n component: \"checkbox\"\r\n },\r\n];\r\n\r\nconst contentOptionalData = [\r\n {\r\n name: \"hide_summary\",\r\n label: \"Hide summary\",\r\n component: \"checkbox\"\r\n },\r\n {\r\n name: \"hide_topics\",\r\n label: \"Hide topics\",\r\n component: \"checkbox\"\r\n }\r\n];\r\n\r\nconst postOptionalData = [\r\n {\r\n name: \"hide_publish_time\",\r\n label: \"Hide publish date\",\r\n component: \"checkbox\"\r\n },\r\n {\r\n name: \"hide_stats\",\r\n label: \"Hide activity stats\",\r\n component: \"checkbox\"\r\n },\r\n ...contentOptionalData\r\n];\r\n\r\nexport const optionalDataTemplate = {\r\n header: {\r\n name: \"optional_data_label\",\r\n label: \"Options\",\r\n description: \"Select data you want to hide.\",\r\n component: \"label\"\r\n },\r\n postData: postOptionalData,\r\n docsData: docsOptionalData,\r\n eventsData: contentOptionalData,\r\n buttons: hideButtons\r\n};\r\n","import React from \"react\";\r\n\r\nimport PluginWrapper from \"../../plugins/common/pluginWrapper\";\r\n\r\nimport PostFeed from \"modules/posts/components/post-feed/postFeed\";\r\nimport { INewsFeedConfig } from \"../../models/feed\";\r\nimport { FeedLayout } from \"../../models/common\";\r\nimport { contentHeaderTemplate, ignoreSubscriptionsTemplate, lockedToTopicsTemplate, optionalDataTemplate, stylingTemplate } from \"./templates\";\r\n\r\nconst NewsFeed: React.FunctionComponent<{ data: INewsFeedConfig, columnCount: number; }> = props => {\r\n const cardCount = props.data.layout === FeedLayout.Window || props.data.layout === FeedLayout.StackedCard\r\n ? -props.columnCount + 4 // calculates card count based on the type of column\r\n : 0;\r\n\r\n return (\r\n <PostFeed\r\n cardCount={cardCount}\r\n hidePublishTime={props.data.hide_publish_time}\r\n hideStats={props.data.hide_stats}\r\n hideSummary={props.data.hide_summary}\r\n hideTopics={props.data.hide_topics}\r\n hideLoadMore={props.data.hide_load_more}\r\n hideViewAll={props.data.hide_view_all}\r\n ignoreSubscriptions={props.data.ignore_subscriptions}\r\n lockSubscriptions={props.data.lockSubscriptions}\r\n layout={props.data.layout}\r\n lockedToTopics={props.data.locked_to_topics}\r\n maxResults={Number.parseInt(props.data.max_results)}\r\n postTypes={props.data.post_types}\r\n />\r\n );\r\n};\r\n\r\nexport const NewsFeedBlock: React.FunctionComponent<{ data: INewsFeedConfig, columnCount: number; }> = props => {\r\n return (\r\n <NewsFeed {...props} />\r\n );\r\n};\r\n\r\nconst postTypeTemplate = {\r\n name: \"post_types\",\r\n label: \"Lock to specific news types\",\r\n description: \"The component will only load posts with news types selected. If none are selected, all types are loaded.\",\r\n buttonLabel: \"Add news types\",\r\n component: \"select-items\",\r\n options: [\r\n { value: \"standard\", label: \"Standard\" },\r\n { value: \"mandatory\", label: \"Mandatory\" },\r\n { value: \"compliance\", label: \"Compliance\" },\r\n { value: \"public\", label: \"Public\" }\r\n ]\r\n};\r\n\r\nexport const NEWS_FEED_TEMPLATE = {\r\n key: \"news-feed-block\",\r\n label: \"News Feed\",\r\n defaultItem: {\r\n hide_topics: true,\r\n layout: FeedLayout.HorizontalBand,\r\n locked_to_topics: [],\r\n max_results: 6,\r\n post_types: []\r\n },\r\n fields: [\r\n contentHeaderTemplate,\r\n ...ignoreSubscriptionsTemplate,\r\n lockedToTopicsTemplate(\"post\"),\r\n postTypeTemplate,\r\n optionalDataTemplate.header,\r\n ...optionalDataTemplate.postData,\r\n ...optionalDataTemplate.buttons,\r\n {\r\n name: \"optional_data_spacing\",\r\n component: () => <PluginWrapper />\r\n },\r\n {\r\n name: \"content_hr\",\r\n component: \"hr\"\r\n },\r\n ...Object.values(stylingTemplate(\"news\"))\r\n ]\r\n};","import React from \"react\";\r\n\r\n\r\nconst Text: React.FunctionComponent<{ data: any }> = props => {\r\n return (\r\n <p dangerouslySetInnerHTML={{ __html: props.data.text }}></p>\r\n );\r\n};\r\n\r\nexport const TextBlock: React.FunctionComponent<{ data: any }> = props => {\r\n return (\r\n <Text data={props.data} />\r\n );\r\n};\r\n\r\nexport const TEXT_TEMPLATE = {\r\n key: \"text-block\",\r\n label: \"Text\",\r\n defaultItem: {\r\n text: \"\"\r\n },\r\n fields: [\r\n {\r\n name: \"text\",\r\n label: \"Rich text\",\r\n component: \"tinymce\"\r\n }\r\n ]\r\n};","import React from \"react\";\r\n\r\nimport { ICustomWidgetConfig } from \"../models/widget\";\r\nimport { debounce } from \"lodash\";\r\n\r\nimport \"../styles/customWidget.sass\";\r\n\r\nconst FETCH_WIDGET_TYPE = \"SPARROW_FETCH_WIDGET_H\";\r\nconst UPDATE_WIDGET_TYPE = \"SPARROW_UPDATE_WIDGET_H\";\r\nconst FETCH_REQUEST_WAIT_OFFSET = 1000;\r\n\r\nconst FETCH_HEIGHT_FTN = `async function (event) {\r\n if (event.data?.type !== \"${FETCH_WIDGET_TYPE}\") return;\r\n \r\n const delay = ms => new Promise(res => setTimeout(res, ms));\r\n\r\n for (let counter = 0, hprev = 0, h = 0; counter < 20 && (h === 0 || hprev !== h); counter++, hprev=h, h = window.document.body.clientHeight) {\r\n await delay(500);\r\n }\r\n\r\n event.source.postMessage(\r\n {height: window.document.body.clientHeight, type: \"${UPDATE_WIDGET_TYPE}\"},\r\n event.origin\r\n );\r\n}`;\r\n\r\nexport const CustomWidget: React.FunctionComponent<{ data: ICustomWidgetConfig, index: number }> = (props) => {\r\n const [height, setHeight] = React.useState<number | undefined>(undefined);\r\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\r\n\r\n const { htmlInput } = props.data;\r\n\r\n const fetchHeight = React.useRef(\r\n debounce(async () => {\r\n const iframe = iframeRef.current;\r\n\r\n if (iframe) {\r\n const iFrameContent = iframe.contentWindow;\r\n if (iFrameContent) {\r\n iFrameContent.postMessage({ type: FETCH_WIDGET_TYPE }, \"*\");\r\n }\r\n }\r\n }, FETCH_REQUEST_WAIT_OFFSET)\r\n ).current;\r\n\r\n React.useEffect(() => {\r\n fetchHeight();\r\n }, [iframeRef, htmlInput, fetchHeight]);\r\n\r\n\r\n React.useEffect(() => {\r\n const requestHeightMeasurement = (event) => {\r\n if (event.data?.type === UPDATE_WIDGET_TYPE) setHeight(event.data?.height);\r\n };\r\n window.addEventListener(\"message\", requestHeightMeasurement);\r\n\r\n return () => {\r\n window.removeEventListener(\"message\", requestHeightMeasurement);\r\n };\r\n }, []);\r\n\r\n React.useEffect(() => {\r\n window.addEventListener(\"resize\", fetchHeight);\r\n return () => {\r\n window.removeEventListener(\"resize\", fetchHeight);\r\n };\r\n }, [fetchHeight]);\r\n\r\n if (!htmlInput) return <div style={{ width: \"100%\", height: \"100px\" }}></div>;\r\n\r\n return (\r\n <div className=\"custom-widget-container\" style={{ height: height ? `${height}px` : \"100px\" }}>\r\n <iframe\r\n title={`iframe-${props.index}`}\r\n ref={iframeRef}\r\n className=\"widget-content\"\r\n sandbox=\"allow-scripts allow-forms\"\r\n srcDoc={`<head><meta http-equiv=\"Content-Security-Policy\" content=\"child-src 'self' https:;\"></meta></head><body style='margin: 0'>${htmlInput}</body><script> onmessage = ${FETCH_HEIGHT_FTN}</script>`}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport const CUSTOM_WIDGET_TEMPLATE = {\r\n key: \"custom-widget-block\",\r\n label: \"Custom Widget\",\r\n defaultItem: {\r\n htmlInput: \"\"\r\n },\r\n fields: [\r\n {\r\n name: \"htmlInput\",\r\n component: \"textarea\",\r\n label: \"Insert code\",\r\n },\r\n ]\r\n};","import * as React from \"react\";\r\n\r\nimport { EventType } from \"../../models\";\r\n\r\nimport \"../../styles/attendance.sass\";\r\n\r\nconst Attendance: React.FunctionComponent<ComponentProps> = props => {\r\n if (props.eventType === \"informational\")\r\n return <React.Fragment></React.Fragment>;\r\n\r\n const attendanceText = (): JSX.Element => {\r\n if (props.isCurrentUserAttendingInPerson)\r\n return <div className=\"attending-in-person\">Attending in-person</div>;\r\n else if (props.isCurrentUserAttendingOnline)\r\n return <div className=\"attending-online\">Attending online</div>;\r\n else if (props.isCurrentUserNotAttending)\r\n return <div className=\"not-attending\">Not attending</div>;\r\n else if (props.isCurrentUserOnWaitlist)\r\n return <div className=\"waitlisted\">Waitlisted</div>;\r\n else if (props.eventType === \"mandatory\")\r\n return <div className=\"response-required\">Response required</div>;\r\n \r\n return <div className=\"not-responded-yet\">No response yet</div>;\r\n }\r\n\r\n return (\r\n <div className=\"attendance\">\r\n {attendanceText()}\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n eventType: EventType;\r\n isCurrentUserAttendingInPerson: boolean;\r\n isCurrentUserAttendingOnline: boolean;\r\n isCurrentUserNotAttending: boolean;\r\n isCurrentUserOnWaitlist: boolean;\r\n}\r\n\r\nexport default Attendance;\r\n","import React from \"react\";\r\n\r\nimport Attendance from \"modules/events/components/attendance/attendance\";\r\nimport Topics from \"modules/posts/components/post-feed/components/topics/Topics\";\r\nimport FullStartDate from \"../dates/FullStartDate\";\r\nimport { EventFeedItem } from \"modules/events/models\";\r\nimport ContentTypeIcons from \"modules/common/components/banners/contentTypeIcons\";\r\nimport { FeedLayout } from \"modules/portalPages/tinacms/models/common\";\r\n\r\ninterface IEventInfo {\r\n event: EventFeedItem;\r\n layout?: FeedLayout;\r\n hideStartDate?: boolean;\r\n hideUnreadStatus?: boolean;\r\n hideRestrictedIcon?: boolean;\r\n hideTopics?: boolean;\r\n hideSummary?: boolean;\r\n}\r\n\r\nconst DOT_LENGTH = 3;\r\nconst LIST_EXCERPT_LENGTH = 150 - DOT_LENGTH;\r\nconst MAX_EXCERPT_LENGTH = 300 - DOT_LENGTH\r\n\r\nexport const EventInfo: React.FunctionComponent<IEventInfo> = ({\r\n event,\r\n layout,\r\n hideSummary = false,\r\n hideRestrictedIcon = false,\r\n hideStartDate = false,\r\n hideUnreadStatus = false,\r\n hideTopics = false\r\n}) => {\r\n const excerptLength = layout === FeedLayout.List ? LIST_EXCERPT_LENGTH : MAX_EXCERPT_LENGTH;\r\n const excerptToDisplay = event.excerpt.length > excerptLength\r\n ? event.excerpt.substring(0, excerptLength) + \"...\"\r\n : event.excerpt;\r\n\r\n const getTitle = (): JSX.Element => {\r\n return (\r\n <div className=\"title\">\r\n <ContentTypeIcons isRestricted={!hideRestrictedIcon && event.isRestricted} />\r\n <div>\r\n {event.title}\r\n </div>\r\n </div>);\r\n };\r\n\r\n return (\r\n <div className=\"info\">\r\n <div className=\"details\">\r\n {\r\n hideUnreadStatus\r\n ? getTitle()\r\n : <div className=\"first-line\">\r\n {getTitle()}\r\n {!event.lastViewTime && <div className=\"read-date unread\"> Unread </div>}\r\n </div>\r\n }\r\n\r\n {\r\n !hideStartDate &&\r\n <FullStartDate eventStartTime={event.eventStartTime} eventEndTime={event.eventEndTime} />\r\n }\r\n {!hideSummary && <div className=\"summary truncated-text-1\">{excerptToDisplay}</div>}\r\n {!hideTopics && <Topics topics={event.tags} />}\r\n </div>\r\n <Attendance {...event} />\r\n </div>\r\n );\r\n};","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport EventTypeBanner from \"modules/common/components/banners/eventTypeBanner\";\r\n\r\nimport { EventFeedItem } from \"../../../../../models\";\r\nimport DateBlock from \"../../../../date-block/dateBlock\";\r\nimport { EventInfo } from \"../eventInfo\";\r\n\r\nimport \"../../../../../../posts/components/post-feed/styles/ReadDate.sass\";\r\n\r\nconst Event: React.FunctionComponent<PropsWithRedux> = props => {\r\n const { event, onEventSelected } = props;\r\n\r\n if (!event) return (null);\r\n\r\n const selectEvent = () => onEventSelected ? onEventSelected(event.id) : null;\r\n\r\n return (\r\n <div onClick={selectEvent} className={`event ${props.cardCount ? `event-${props.cardCount}` : \"\"}`}>\r\n <div className=\"image-container\">\r\n <div\r\n style={{\r\n backgroundColor: event.imageUrl ? \"#DDE1E5\" : event.bannerColor,\r\n backgroundImage: event.imageUrl ? 'url(\"' + event.imageUrl + '\")' : \"\",\r\n backgroundSize: \"contain\"\r\n }}\r\n className=\"image\"\r\n >\r\n <EventTypeBanner eventType={event.eventType} isRestricted={event.isRestricted} lcid={event.preferredLCID} />\r\n {props.showReadingStatus && !event.lastViewTime && <div className=\"read-date unread unread-event\"> Unread </div>}\r\n <DateBlock eventStartTime={event.eventStartTime} eventEndTime={event.eventEndTime} isAllDayEvent={event.isAllDayEvent} />\r\n </div>\r\n </div>\r\n <EventInfo event={event} hideUnreadStatus hideRestrictedIcon hideSummary={props.hideSummary} hideTopics={props.hideTopics} />\r\n </div>\r\n );\r\n};\r\n\r\ninterface ComponentProps {\r\n event: EventFeedItem;\r\n onEventSelected: (eventId: string) => void;\r\n showReadingStatus?: boolean;\r\n hideSummary?: boolean;\r\n hideTopics?: boolean;\r\n cardCount?: number;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n currentUser: state.settings.currentUser\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(Event);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\n\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { EventFeedItem } from \"../../../../../models\";\r\nimport Event from \"./Event\";\r\n\r\nimport { FeedButtons } from \"modules/common/components/feed/feedButtons\";\r\nimport { ILoadMoreButton } from \"modules/common/components/feed/loadMoreButton\";\r\n\r\nimport \"../../../../../styles/attendance.sass\";\r\nimport \"../../../styles/visualCard.sass\";\r\nimport { CardType } from \"../../../models\";\r\n\r\nconst VisualCard: React.FunctionComponent<PropsWithRedux> = props => {\r\n const events = props.events ?? props.eventsFeed;\r\n\r\n return (\r\n <div className={`card ${props.cardType ?? \"\"}`}>\r\n {\r\n events.map(event =>\r\n <Event\r\n key={event.id}\r\n event={event}\r\n onEventSelected={props.onEventSelected}\r\n hideTopics={props.hideTopics}\r\n hideSummary={props.hideSummary}\r\n cardCount={props.cardCount}\r\n showReadingStatus={props.showReadingStatus}\r\n />\r\n )\r\n }\r\n {\r\n (props.viewAll || props.loadMore?.canLoadMore) &&\r\n <div className={\"event load-tile\"}>\r\n <FeedButtons\r\n inCard\r\n viewAll={props.viewAll ? { action: props.viewAll } : undefined}\r\n loadMore={props.loadMore}\r\n />\r\n </div>\r\n }\r\n </div>\r\n );\r\n};\r\n\r\ninterface IVisualCard {\r\n onEventSelected: (eventId: string) => void;\r\n events?: EventFeedItem[];\r\n loadMore?: ILoadMoreButton\r\n viewAll?: () => void;\r\n hideTopics?: boolean;\r\n hideSummary?: boolean;\r\n showReadingStatus?: boolean;\r\n cardType?: CardType;\r\n cardCount?: number;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IVisualCard) => ({\r\n ...ownProps,\r\n eventsFeed: state.events.eventsFeed.eventsFeed\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(VisualCard);","import { EventFeedFilters } from \"../../../models\";\r\n\r\ntype View = {\r\n [view: string]: {\r\n filters: Partial<EventFeedFilters>;\r\n sortAscending: boolean;\r\n };\r\n};\r\n\r\nconst ViewOptions: View = {\r\n my: {\r\n filters: {\r\n myEventResponses: [\"InPerson\", \"Online\",\"Waitlist\"],\r\n newerThan: new Date().toISOString()\r\n },\r\n sortAscending: true\r\n },\r\n open: {\r\n filters: {\r\n myEventResponses: [\"Undecided\"],\r\n newerThan: new Date().toISOString()\r\n },\r\n sortAscending: true\r\n },\r\n past: {\r\n filters: {\r\n olderThan: new Date().toISOString()\r\n },\r\n sortAscending: false\r\n },\r\n upcoming: {\r\n filters: {\r\n newerThan: new Date().toISOString()\r\n },\r\n sortAscending: true\r\n }\r\n};\r\n\r\nexport default ViewOptions;","import * as React from \"react\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport ButtonGroup from \"@mui/material/ButtonGroup\";\r\n\r\nimport ArrowRightIcon from \"@mui/icons-material/ArrowRight\";\r\n\r\n\r\nclass SignUp extends React.Component<ComponentProps, ComponentState> {\r\n public render() {\r\n if (!this.props.respondingEnabled)\r\n return (null);\r\n \r\n return (\r\n <div className=\"sign-up-button\">\r\n <ButtonGroup variant=\"contained\" color=\"primary\" disabled={!this.props.isResponseEditable}>\r\n <Button color=\"primary\" endIcon={<ArrowRightIcon />} onClick={this.props.onClick}>{this.currentSignUpText()}</Button>\r\n </ButtonGroup>\r\n </div>\r\n );\r\n }\r\n\r\n private currentSignUpText = (): string => {\r\n if (this.props.isCurrentUserAttendingInPerson ||\r\n this.props.isCurrentUserAttendingOnline ||\r\n this.props.isCurrentUserOnWaitlist ||\r\n this.props.isCurrentUserNotAttending)\r\n return \"Edit RSVP\";\r\n \r\n return \"RSVP now\";\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n respondingEnabled: boolean;\r\n isCurrentUserAttendingInPerson: boolean;\r\n isCurrentUserAttendingOnline: boolean;\r\n isCurrentUserNotAttending: boolean;\r\n isCurrentUserOnWaitlist: boolean;\r\n isResponseEditable: boolean;\r\n onClick: () => void;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nexport default SignUp;","import * as React from \"react\";\r\n\r\nimport { Answers, AttendanceType, CurrentUserResponse, EventView, Questions } from \"../../../models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Select from \"@mui/material/Select\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport ArrowBackIcon from \"@mui/icons-material/ArrowBack\";\r\n\r\n\r\nclass SignUpForm extends React.Component<ComponentProps, ComponentState> {\r\n constructor(props: ComponentProps) {\r\n super(props);\r\n\r\n this.state = {\r\n answers: props.isCurrentUserAttending && !!props.currentUserResponse ? props.currentUserResponse.answers : {},\r\n attendanceType: !!props.currentUserResponse ? props.currentUserResponse.attendanceType : \"NotAttending\"\r\n };\r\n }\r\n\r\n public render() {\r\n const { questions } = this.props;\r\n \r\n return (\r\n <React.Fragment>\r\n <div className=\"sign-up-header\">\r\n <IconButton onClick={this.onClose} size=\"large\">\r\n <ArrowBackIcon />\r\n </IconButton>\r\n <div>\r\n <Button variant=\"text\" onClick={this.onClose}>Cancel</Button>\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n disabled={this.state.attendanceType !== \"NotAttending\" && !!questions && Object.keys(questions).findIndex((questionNumber) => questions[questionNumber].isRequired && (!this.state.answers || !this.state.answers[questionNumber])) !== -1}\r\n onClick={this.onSignUp}\r\n >\r\n Submit\r\n </Button>\r\n </div>\r\n </div>\r\n <div className=\"sign-up-form\">\r\n <div>\r\n <div>RSVP Status</div>\r\n <div>\r\n <FormControl size=\"small\" fullWidth>\r\n <Select\r\n variant=\"outlined\"\r\n value={this.state.attendanceType || \"\"}\r\n fullWidth\r\n onChange={this.onChangeAttendanceType}\r\n >\r\n {(this.props.isInPersonAvailable || this.props.isCurrentUserAttendingInPerson) &&\r\n <MenuItem value=\"InPerson\">Attending in-person</MenuItem>\r\n }\r\n {(this.props.isOnlineAvailable || this.props.isCurrentUserAttendingOnline) &&\r\n <MenuItem value=\"Online\">Attending online</MenuItem>\r\n }\r\n {(this.props.isWaitlistAvailable || this.props.isCurrentUserOnWaitlist) &&\r\n <MenuItem value=\"Waitlist\">Waitlist</MenuItem>\r\n }\r\n <MenuItem value=\"NotAttending\">Not Attending</MenuItem>\r\n </Select>\r\n </FormControl>\r\n </div>\r\n </div>\r\n {!!questions && Object.keys(questions).map((questionNumber) => {\r\n const required = questions[questionNumber].isRequired;\r\n return (\r\n <div key={questionNumber}>\r\n <div>{questions[questionNumber].body}{required && \"*\"}</div>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.state.answers[questionNumber] || \"\"}\r\n placeholder=\"Enter text\"\r\n autoComplete=\"off\"\r\n fullWidth\r\n required={required}\r\n onChange={(ev) => this.onChangeAnswers(ev, questionNumber)}\r\n />\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private onChangeAnswers = (event, questionNumber: string) => {\r\n this.setState({\r\n answers: {\r\n ...this.state.answers,\r\n [questionNumber]: event.target.value\r\n }\r\n });\r\n }\r\n\r\n private onChangeAttendanceType = (event) => {\r\n this.setState({ attendanceType: event.target.value });\r\n }\r\n\r\n private onClose = () => {\r\n this.props.onClose();\r\n }\r\n\r\n private onSignUp = () => {\r\n this.props.onSignUp(this.state.attendanceType, this.state.answers).then((event) => {\r\n if (!!event)\r\n this.onClose();\r\n });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n respondingEnabled: boolean;\r\n currentUserResponse?: CurrentUserResponse;\r\n isCapacityAvailable: boolean;\r\n isCurrentUserAttending: boolean;\r\n isCurrentUserAttendingInPerson: boolean;\r\n isCurrentUserAttendingOnline: boolean;\r\n isCurrentUserNotAttending: boolean;\r\n isCurrentUserOnWaitlist: boolean;\r\n isInPersonAvailable: boolean;\r\n isOnlineAvailable: boolean;\r\n isResponseEditable: boolean;\r\n isWaitlistAvailable: boolean;\r\n questions: Questions;\r\n title: string;\r\n onSignUp: (attendanceType: AttendanceType, answers: Answers) => Promise<EventView>;\r\n onClose: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n answers: Answers;\r\n attendanceType: AttendanceType;\r\n}\r\n\r\nexport default SignUpForm;","import React, { useEffect, useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\n\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport CancelOutlinedIcon from \"@mui/icons-material/CancelOutlined\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { eventsApi } from 'api/instances';\r\nimport EventTypeBanner from \"modules/common/components/banners/eventTypeBanner\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport { Answers, AttendanceType, EventView as IEventView, RSVPType } from \"../../models\";\r\nimport Attendance from \"../attendance/attendance\";\r\nimport DateBlock from \"../date-block/dateBlock\";\r\nimport AddToCalendar from \"./components/addToCalendar\";\r\nimport Author from \"./components/author\";\r\nimport Body from \"./components/body\";\r\nimport CutoffTime from \"./components/cutoffTime\";\r\nimport EventTimes from \"./components/eventTimes\";\r\nimport FileAttachments from \"./components/fileAttachments\";\r\nimport Location from \"./components/location\";\r\nimport SignUp from \"./components/signUp\";\r\nimport SignUpForm from \"./components/signUpForm\";\r\nimport Tags from \"./components/tags\";\r\nimport Title from \"./components/title\";\r\nimport SnackbarWrapper from \"modules/common/components/snackbars/snackbarWrapper\";\r\nimport { ImageScale } from \"modules/posts/models\";\r\nimport { parseAnchors } from \"utils/htmlUtils\";\r\nimport HeroBanner from \"modules/common/components/heroBanner\";\r\nimport { CustomCss } from \"modules/common/components/customCss\";\r\n\r\nimport '../../../../styles/views.sass'\r\nimport ShareButtonv2 from \"modules/common/components/buttons/shareButtonv2\";\r\nimport InternalShareScreen from \"modules/sharing/internalShareScreen\";\r\nimport { ContentType } from \"modules/sharing/models\";\r\nimport { useDefaultLocale } from \"modules/common/hooks/useDefaultLocale\";\r\n\r\nconst EventView: React.FunctionComponent<PropsWithRedux> = ({\r\n eventId,\r\n tinyMceCustomCssEnabled,\r\n getEvent: proppedGetEvent,\r\n ...props\r\n}) => {\r\n const [activeLcid, setActiveLcid] = useState<string>(\"en-us\");\r\n const [event, setEvent] = useState<IEventView>();\r\n const [isLoading, setIsLoading] = useState<boolean>(true);\r\n const [showSignUpOptions, setShowSignUpOptions] = useState<boolean>(false);\r\n const [internalShareOpen, setInternalShareOpen] = useState<boolean>(false);\r\n\r\n const { currentUserResponse, respondingEnabled } = event || {};\r\n useDefaultLocale();\r\n\r\n // do not show download ics button if person has responded not attending\r\n const showAddToCalendar = !(respondingEnabled && currentUserResponse?.attendanceType === \"NotAttending\");\r\n\r\n useEffect(() => {\r\n const getEvent = async (eventId: string, initialLoad?: boolean) => {\r\n const event = await proppedGetEvent(eventId, ImageScale.Modal);\r\n\r\n if (!!event) {\r\n const newLcid: string = !!event.translatedContent![event.preferredLCID]\r\n ? event.preferredLCID\r\n : \"en-us\";\r\n\r\n setActiveLcid(newLcid)\r\n setEvent(event);\r\n\r\n if (initialLoad)\r\n eventsApi.sendEventOpenedEvent(eventId, activeLcid);\r\n }\r\n\r\n setIsLoading(false);\r\n }\r\n\r\n if (eventId) {\r\n getEvent(eventId, true);\r\n }\r\n }, [eventId, proppedGetEvent, activeLcid]);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (event)\r\n eventsApi.sendEventClosedEvent(event.id, event.preferredLCID);\r\n }\r\n }, [event]);\r\n\r\n const getAvailableLanguages = (): JSX.Element => {\r\n if (!event || Object.keys(event.translatedContent).length < 2 || !props.lcidMappings)\r\n return <></>;\r\n\r\n const { lcidMappings } = props;\r\n\r\n const availableLcids: string[] = Object.keys(event.translatedContent);\r\n const availableLanguages: Language[] = availableLcids.map((lcid) => ({ language: lcidMappings[lcid] ? lcidMappings[lcid].languageShort : lcid, lcid }));\r\n\r\n return (\r\n <div className=\"available-languages\">\r\n <span className=\"emphasis\">Available In: </span>\r\n {availableLanguages\r\n .map<React.ReactNode>((language) =>\r\n <span key={language.lcid} onClick={() => onSelectLanguage(language)} className={language.lcid === activeLcid\r\n ? \"\"\r\n : \"inactive-language\"}>{language.language}</span>\r\n )\r\n .reduce((prev, curr) => [prev, \", \", curr])\r\n }\r\n </div>\r\n );\r\n }\r\n\r\n const onHideSignUpOptions = () => {\r\n setShowSignUpOptions(false);\r\n }\r\n\r\n const onSelectLanguage = (language: Language) => {\r\n setActiveLcid(language.lcid);\r\n }\r\n\r\n const onShowSignUpOptions = () => {\r\n setShowSignUpOptions(true);\r\n }\r\n\r\n const onSignUp = async (attendanceType: AttendanceType, answers: Answers): Promise<IEventView> => {\r\n let rsvpType: RSVPType = \"initial\";\r\n\r\n if (event?.currentUserResponse && !event.isCurrentUserNotAttending && !event.isCurrentUserOnWaitlist) {\r\n if (attendanceType === \"InPerson\" && !event.isCurrentUserAttendingInPerson)\r\n rsvpType = \"changeStatus\";\r\n else if (attendanceType === \"Online\" && !event.isCurrentUserAttendingOnline)\r\n rsvpType = \"changeStatus\";\r\n else if (attendanceType === \"Waitlist\" || attendanceType === \"NotAttending\")\r\n rsvpType = \"initial\";\r\n else\r\n rsvpType = \"editAnswers\";\r\n }\r\n\r\n const newEvent = await props.rsvp(eventId, attendanceType, answers, rsvpType);\r\n\r\n if (newEvent) {\r\n setEvent(newEvent);\r\n\r\n props.updateEventFeed(\r\n props.eventsFeed.map(event => event.id === eventId\r\n ? {\r\n ...event,\r\n currentUserResponse: {\r\n answers,\r\n attendanceType\r\n },\r\n isCurrentUserAttending: attendanceType === \"InPerson\" || attendanceType === \"Online\",\r\n isCurrentUserAttendingInPerson: attendanceType === \"InPerson\",\r\n isCurrentUserAttendingOnline: attendanceType === \"Online\",\r\n isCurrentUserNotAttending: attendanceType === \"NotAttending\",\r\n isCurrentUserOnWaitlist: attendanceType === \"Waitlist\"\r\n }\r\n : event\r\n )\r\n );\r\n }\r\n\r\n return newEvent;\r\n }\r\n\r\n const getTitle = (): string => {\r\n let result = \"\";\r\n\r\n if (event && event.translatedContent)\r\n result = event.translatedContent[activeLcid].title;\r\n\r\n return result;\r\n\r\n }\r\n const title = getTitle();\r\n\r\n return (\r\n <>\r\n <CustomCss enabled={tinyMceCustomCssEnabled} />\r\n {isLoading\r\n ? <Loading />\r\n : (event\r\n ? <>\r\n <div className=\"event-views event-view\">\r\n {!!props.onClose &&\r\n <IconButton\r\n onClick={props.onClose}\r\n className=\"close-view-event-dialog\"\r\n size=\"large\">\r\n <CloseIcon color=\"inherit\" />\r\n </IconButton>\r\n }\r\n <div>\r\n <div className=\"view-page\">\r\n <HeroBanner bannerColor={event.bannerColor} imageUrl={event.imageUrl} attachedContent={event.attachedContent}>\r\n <EventTypeBanner eventType={event.eventType} isRestricted={event.isRestricted} full lcid={activeLcid} />\r\n <DateBlock eventStartTime={event.eventStartTime} eventEndTime={event.eventEndTime} eventTimes={event.eventTimes} isAllDayEvent={event.isAllDayEvent} />\r\n </HeroBanner>\r\n <div className=\"page-content\">\r\n <div className=\"content-heading\">\r\n <Title title={title} />\r\n </div>\r\n <Location location={event.location} locationLink={event.locationLink} locationLinkLabel={event.locationLinkLabel} />\r\n <EventTimes activeLcid={activeLcid} {...event} showAddToCalendar={showAddToCalendar} />\r\n <CutoffTime cutoffTime={event.cutoffTime} eventType={event.eventType} />\r\n <Tags tags={event.tags} />\r\n <Author author={event.author.name || \"\"} authorEmail={event.author.email} avatarColor={event.author.avatarColor} />\r\n {getAvailableLanguages()}\r\n <Body body={parseAnchors(event.translatedContent![activeLcid].body)} />\r\n <FileAttachments fileAttachments={event.fileAttachments} />\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"comments\">\r\n <div>Comments are not available for events yet.</div>\r\n </div>\r\n </div>\r\n <Paper elevation={6} className=\"sign-up\">\r\n <Collapse in={!showSignUpOptions}>\r\n <div className=\"sign-up-info\">\r\n <div>\r\n {showAddToCalendar && <AddToCalendar activeLcid={activeLcid} {...event} />}\r\n {(props.shareUrlsEnabled.toggleCompanyPortalUrl || props.shareUrlsEnabled.toggleSpUrl || props.shareUrlsEnabled.toggleTeamsUrl)\r\n &&\r\n <ShareButtonv2\r\n isPublic={false} //events cannot be public.\r\n isAuthenticated\r\n toggleInternalShare={(toSet) => setInternalShareOpen(toSet)}\r\n />\r\n }\r\n <Attendance {...event} />\r\n </div>\r\n <SignUp {...event} onClick={onShowSignUpOptions} />\r\n </div>\r\n </Collapse>\r\n <Collapse in={showSignUpOptions}>\r\n <SignUpForm {...event} title={title} onSignUp={onSignUp} onClose={onHideSignUpOptions} />\r\n </Collapse>\r\n </Paper>\r\n {/* success snackbar */}\r\n <SnackbarWrapper\r\n open={!!props.infoMessage.message}\r\n message={props.infoMessage.message}\r\n severity={props.infoMessage.severity}\r\n onClose={props.clearSuccessMessage}\r\n icon={\r\n props.infoMessage.icon === \"cancel\" ? (\r\n <CancelOutlinedIcon fontSize=\"inherit\" />\r\n ) : undefined\r\n }\r\n />\r\n {/* error snack bar */}\r\n <SnackbarWrapper open={!!props.errorMessage} onClose={props.clearErrorMessage} message={props.errorMessage} severity=\"error\" />\r\n <LoadingOverlay show={props.isSaving} styles={{ paddingTop: 150 }} />\r\n </>\r\n : <div>\r\n <div className=\"no-event-data\">Unfortunately, this event is no longer available.</div >\r\n </div>\r\n\r\n )}\r\n\r\n {internalShareOpen &&\r\n <InternalShareScreen \r\n onCloseDialog={() => setInternalShareOpen(false)}\r\n tenantName={props.tenantName}\r\n contentTitle={title}\r\n contentId={event?.id ?? \"\"}\r\n contentStyling={{marginTop: event?.imageUrl === \"\" ? \"5%\" : \"35%\"}}\r\n contentType={ContentType.Event}\r\n isPublic={false}\r\n />\r\n }\r\n </>\r\n );\r\n}\r\n\r\ninterface Language {\r\n language: string;\r\n lcid: string;\r\n}\r\n\r\ninterface ComponentProps {\r\n eventId: string;\r\n onClose?: () => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n errorMessage: state.events.errorMessage,\r\n eventsFeed: state.events.eventsFeed.eventsFeed,\r\n isFetching: state.events.isFetching,\r\n isSaving: state.events.isSaving,\r\n lcidMappings: state.resources.lcidMappings,\r\n infoMessage: state.events.infoMessage,\r\n shareUrlsEnabled: state.settings.tenantSettings.shareUrlsConfig,\r\n tinyMceCustomCssEnabled: state.settings.tenantSettings.showFeatures.tinyMceCustomCssEnabled,\r\n tenantName: state.settings.tenantSettings.displayName\r\n }),\r\n {\r\n clearErrorMessage: actions.clearErrorMessage,\r\n clearSuccessMessage: actions.clearSuccessMessage,\r\n getEvent: actions.getEvent,\r\n rsvp: actions.rsvp,\r\n updateEventFeed: actions.updateEventFeed\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(EventView);\r\n","import * as React from \"react\";\r\nimport Box from \"@mui/material/Box\";\r\n\r\nimport DateBlock from \"modules/events/components/date-block/dateBlock\";\r\nimport { EventFeedItem } from \"modules/events\";\r\nimport { EventInfo } from \"../eventInfo\";\r\nimport { IOptionalEventContent } from \"modules/portalPages/tinacms/models/feed\";\r\nimport { FeedLayout } from \"modules/portalPages/tinacms/models/common\";\r\n\r\nexport const Tile: React.FunctionComponent<IEventTile> = ({\r\n event,\r\n onClick,\r\n optionalEventContent\r\n}) => {\r\n if (!event) return (null);\r\n\r\n const selectPost = () => onClick(event.id);\r\n\r\n return (\r\n <div onClick={selectPost} className=\"event\">\r\n <Box position={\"relative\"}>\r\n <DateBlock eventStartTime={event.eventStartTime} eventEndTime={event.eventEndTime} isAllDayEvent={event.isAllDayEvent} />\r\n </Box>\r\n <EventInfo\r\n event={event}\r\n layout={FeedLayout.List}\r\n hideSummary={optionalEventContent.hideSummary}\r\n hideTopics={optionalEventContent.hideTopics}\r\n hideStartDate\r\n />\r\n </div>\r\n );\r\n};\r\n\r\ninterface IEventTile {\r\n event: EventFeedItem;\r\n onClick: (eventId: string) => void;\r\n optionalEventContent: IOptionalEventContent;\r\n}\r\n","import * as React from \"react\";\r\n\r\nimport { IOptionalEventContent } from \"modules/portalPages/tinacms/models/feed\";\r\nimport { Tile } from \"./Tile\";\r\nimport { EventFeedItem } from \"../../../../../models\";\r\n\r\nimport \"../../../styles/sectionList.sass\";\r\n\r\nconst List: React.FunctionComponent<IEventList> = (props: IEventList) => {\r\n return (\r\n <div className=\"list\">\r\n {\r\n props.eventFeed.map(event =>\r\n <Tile\r\n key={event.id}\r\n event={event}\r\n onClick={props.onClickEvent}\r\n optionalEventContent={props.optionalContent}\r\n />\r\n )\r\n }\r\n </div>\r\n );\r\n};\r\n\r\ninterface IEventList {\r\n eventFeed: EventFeedItem[];\r\n onClickEvent: (eventId: string) => void;\r\n optionalContent: IOptionalEventContent\r\n}\r\n\r\nexport default List;","import * as React from \"react\";\r\n\r\nimport { EventFeedItem } from \"modules/events\";\r\nimport { EventInfo } from \"../eventInfo\";\r\nimport EventTypeBanner from \"modules/common/components/banners/eventTypeBanner\";\r\n\r\nexport const Tile: React.FunctionComponent<ITileProps> = ({\r\n event,\r\n onClick,\r\n cardCount,\r\n hideSummary\r\n}) => {\r\n if (!event) return (null);\r\n\r\n const selectPost = () => onClick(event.id);\r\n\r\n return (\r\n <div className={`tile-cell tile-cell-${cardCount}`} onClick={selectPost}>\r\n <div className=\"tile\">\r\n <div\r\n style={{\r\n backgroundColor: event.imageUrl ? \"#DDE1E5\" : event.bannerColor,\r\n backgroundImage: event.imageUrl ? `url(\"${event.imageUrl}\")` : \"\",\r\n backgroundSize: \"contain\"\r\n }}\r\n className=\"image\"\r\n >\r\n <EventTypeBanner\r\n eventType={event.eventType}\r\n isRestricted={event.isRestricted}\r\n lcid={event.preferredLCID}\r\n eventTime={{\r\n startTime: event.eventStartTime,\r\n endTime: event.eventEndTime\r\n }}\r\n />\r\n {!event.lastViewTime && <div className=\"read-date unread unread-event\"> Unread </div>}\r\n <EventInfo\r\n event={event}\r\n hideSummary={hideSummary}\r\n hideTopics\r\n hideUnreadStatus\r\n hideRestrictedIcon\r\n hideStartDate\r\n />\r\n </div>\r\n\r\n <div className=\"gradient-overlay\"></div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\ninterface ITileProps {\r\n event: EventFeedItem;\r\n onClick: (eventId: string) => void;\r\n cardCount: number;\r\n hideSummary: boolean;\r\n}\r\n","import * as React from \"react\";\r\n\r\nimport { EventFeedItem } from \"../../../../../models\";\r\n\r\nimport { Tile } from \"./Tile\";\r\nimport \"../../../../../../common/components/feed/styles/windowFeed.sass\";\r\nimport \"./../../../styles/sectionWindow.sass\";\r\n\r\nexport const Window: React.FunctionComponent<IWindowProps> = props => {\r\n return (\r\n <div className=\"window\">\r\n {\r\n props.eventFeed.map(event =>\r\n <Tile\r\n key={event.id}\r\n event={event}\r\n onClick={props.onClickEvent}\r\n cardCount={props.cardCount}\r\n hideSummary={props.hideSummary}\r\n />\r\n )\r\n }\r\n </div>\r\n );\r\n};\r\n\r\ninterface IWindowProps {\r\n eventFeed: EventFeedItem[];\r\n onClickEvent: (eventId: string) => void;\r\n cardCount: number;\r\n hideSummary: boolean;\r\n}","import React from \"react\";\r\n\r\nimport { EventFeedItem, EventType, Tag } from \"modules/events/models\";\r\nimport { FeedLayout } from \"modules/portalPages/tinacms/models/common\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { actions } from \"modules/events\";\r\nimport { defaultEventsFeedFilter } from \"modules/events/reducer\";\r\nimport VisualCard from \"./components/layouts/visualCard/VisualCard\";\r\nimport ViewOptions from \"./consts/viewOptions\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { DialogContentView } from \"modules/common/components/dialogs/dialogContentView\";\r\nimport { EmptyFeed } from \"modules/common/components/feed/emptyFeed\";\r\nimport EventView from \"../event-views/eventView\";\r\nimport List from \"./components/layouts/list/List\";\r\nimport { Window } from \"./components/layouts/window/Window\";\r\nimport { IFeedOptionalFlags } from \"modules/portalPages/tinacms/models/feed\";\r\nimport { FeedButtons } from \"modules/common/components/feed/feedButtons\";\r\n\r\nimport \"./styles/sectionCard.sass\";\r\nimport { CardType } from \"./models\";\r\n\r\ninterface IEventFeedOptionalFlags extends IFeedOptionalFlags {\r\n ignoreSubscriptions: boolean;\r\n hideSummary: boolean;\r\n hideTopics: boolean;\r\n}\r\n\r\ninterface IEventFeedSection {\r\n layout: FeedLayout;\r\n cardCount: number;\r\n lockedToTopics: Tag[];\r\n eventTypes: EventType[];\r\n maxResults: number;\r\n optionalContent: IEventFeedOptionalFlags;\r\n refresh: boolean;\r\n resetRefresh: () => void;\r\n}\r\n\r\nconst EventFeedSection: React.FunctionComponent<PropsWithRedux> = (props: PropsWithRedux) => {\r\n const [events, setEvents] = React.useState<EventFeedItem[]>([]);\r\n const [isLoading, setIsLoading] = React.useState<boolean>(false);\r\n\r\n const [canLoadMore, setCanLoadMore] = React.useState<boolean>(true);\r\n const [selectedEventId, setSelectedEventId] = React.useState<string>(\"\");\r\n\r\n const currentFilters = {\r\n ...defaultEventsFeedFilter,\r\n ...ViewOptions[\"upcoming\"].filters,\r\n ignoreSubscriptions: props.optionalContent.ignoreSubscriptions,\r\n tags: props.lockedToTopics.map(t => t.id),\r\n eventTypes: props.eventTypes ?? []\r\n };\r\n\r\n const {\r\n fetchEventFeed,\r\n resetRefresh,\r\n maxResults,\r\n refresh,\r\n optionalContent\r\n } = props;\r\n\r\n const onFetchMore = React.useCallback(async (pageNumber: number) => {\r\n try {\r\n setIsLoading(true);\r\n const newEvents = await fetchEventFeed(currentFilters, pageNumber, maxResults);\r\n\r\n setEvents(pageNumber === 1 ? newEvents : [...events, ...newEvents]);\r\n setCanLoadMore(newEvents.length === +maxResults);\r\n }\r\n catch {\r\n setEvents([]);\r\n setCanLoadMore(false);\r\n }\r\n finally {\r\n resetRefresh();\r\n setIsLoading(false);\r\n }\r\n }, [currentFilters, maxResults, events, fetchEventFeed, resetRefresh])\r\n\r\n React.useEffect(() => {\r\n const fetchEvents = async () => await onFetchMore(1);\r\n\r\n if (!isLoading && refresh) fetchEvents();\r\n }, [isLoading, onFetchMore, refresh]);\r\n\r\n const onViewAll = () => {\r\n props.setEventFeedFilters(currentFilters);\r\n props.redirectTo(`/${props.tenantId}/events`);\r\n };\r\n\r\n const selectEvent = (eventId: string) => setSelectedEventId(eventId);\r\n\r\n const unselectEvent = () => setSelectedEventId(\"\");\r\n\r\n if (events.length === 0) {\r\n return isLoading\r\n ? <Loading />\r\n : <EmptyFeed />;\r\n }\r\n\r\n const loadMore = optionalContent.hideLoadMore\r\n ? undefined\r\n : { isFetching: isLoading, canLoadMore: canLoadMore, onFetchMore: onFetchMore}\r\n \r\n const optionalEventContent = {\r\n hideSummary: optionalContent.hideSummary,\r\n hideTopics: optionalContent.hideTopics\r\n }\r\n\r\n const horizontalBandLayout = () => <VisualCard\r\n events={events}\r\n onEventSelected={selectEvent}\r\n cardType={CardType.Horizontal}\r\n viewAll={optionalContent.hideViewAll ? undefined : onViewAll}\r\n loadMore={loadMore}\r\n hideSummary={optionalContent.hideSummary}\r\n hideTopics={optionalContent.hideTopics}\r\n showReadingStatus\r\n />;\r\n\r\n const getEventSection = (): JSX.Element => {\r\n switch (props.layout) {\r\n case FeedLayout.HorizontalBand:\r\n return horizontalBandLayout();\r\n\r\n case FeedLayout.StackedCard:\r\n return <VisualCard\r\n events={events}\r\n onEventSelected={selectEvent}\r\n cardType={CardType.Stacked}\r\n cardCount={props.cardCount}\r\n hideSummary={optionalContent.hideSummary}\r\n hideTopics={optionalContent.hideTopics}\r\n showReadingStatus\r\n />;\r\n\r\n case FeedLayout.List:\r\n return <List\r\n eventFeed={events}\r\n onClickEvent={selectEvent}\r\n optionalContent={optionalEventContent}\r\n />;\r\n\r\n case FeedLayout.Window:\r\n return <Window\r\n eventFeed={events}\r\n onClickEvent={selectEvent}\r\n cardCount={props.cardCount}\r\n hideSummary={optionalEventContent.hideSummary}\r\n />;\r\n\r\n default:\r\n return horizontalBandLayout();\r\n }\r\n };\r\n\r\n return (\r\n <div id=\"event-feed\" className=\"news-feed-section\">\r\n {getEventSection()}\r\n\r\n {\r\n props.layout !== FeedLayout.HorizontalBand &&\r\n <FeedButtons\r\n viewAll={props.optionalContent.hideViewAll ? undefined : { action: onViewAll }}\r\n loadMore={loadMore}\r\n />\r\n }\r\n <DialogContentView id=\"view-event-dialog\" open={!!selectedEventId} classes={{ paper: \"dialog-content\" }} onClose={unselectEvent}>\r\n <EventView eventId={selectedEventId} onClose={unselectEvent} />\r\n </DialogContentView>\r\n </div>\r\n );\r\n};\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IEventFeedSection) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n setEventFeedFilters: actions.setEventFeedFilters,\r\n fetchEventFeed: actions.fetchEventFeedLocal,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(EventFeedSection);\r\n","import { BANNER_TEMPLATE } from \"../components/banner\";\r\nimport { CUSTOM_WIDGET_TEMPLATE } from \"../components/customWidget\";\r\nimport { DOCUMENT_FEED_TEMPLATE } from \"../components/feed/docsFeed\";\r\nimport { EVENT_FEED_TEMPLATE } from \"../components/feed/eventsFeed\";\r\nimport { NEWS_FEED_TEMPLATE } from \"../components/feed/newsFeed\";\r\nimport { TEXT_TEMPLATE } from \"../components/text\";\r\n\r\nexport enum SectionType {\r\n Banner = \"banner\",\r\n NewsFeed = \"news-feed\",\r\n Text = \"text\",\r\n EventsFeed = \"events-feed\",\r\n DocumentFeed = \"document-feed\",\r\n CustomWidget = \"custom-widget\"\r\n}\r\n\r\nexport const COMPONENT_TEMPLATES = {\r\n [SectionType.Banner]: BANNER_TEMPLATE,\r\n [SectionType.NewsFeed]: NEWS_FEED_TEMPLATE,\r\n [SectionType.Text]: TEXT_TEMPLATE,\r\n [SectionType.EventsFeed]: EVENT_FEED_TEMPLATE,\r\n [SectionType.DocumentFeed]: DOCUMENT_FEED_TEMPLATE,\r\n [SectionType.CustomWidget]: CUSTOM_WIDGET_TEMPLATE\r\n}\r\n\r\nexport interface ISectionComponent {\r\n _template: SectionType\r\n}\r\n","import React from \"react\";\r\n\r\nimport { FeedLayout } from \"../../models/common\";\r\nimport { IEventsFeedConfig } from \"../../models/feed\";\r\nimport { contentHeaderTemplate, ignoreSubscriptionsTemplate, lockedToTopicsTemplate, optionalDataTemplate, stylingTemplate } from \"./templates\";\r\n\r\nimport EventFeedSection from \"modules/events/components/event-feed/eventFeedSection\";\r\n\r\nexport const EventsFeedBlock: React.FunctionComponent<{ data: IEventsFeedConfig, columnCount: number; }> = props => {\r\n const [refresh, setRefresh] = React.useState<boolean>(false);\r\n const {\r\n max_results,\r\n locked_to_topics,\r\n event_types,\r\n ignore_subscriptions\r\n } = props.data;\r\n\r\n React.useEffect(() => {\r\n setRefresh(true);\r\n }, [max_results, locked_to_topics, event_types, ignore_subscriptions]);\r\n\r\n // calculates card count based on the type of column\r\n const cardCount = -props.columnCount + 4;\r\n\r\n return (\r\n <EventFeedSection\r\n layout={props.data.layout}\r\n maxResults={Number.parseInt(props.data.max_results)}\r\n cardCount={cardCount}\r\n lockedToTopics={locked_to_topics}\r\n eventTypes={event_types}\r\n optionalContent={{\r\n ignoreSubscriptions: props.data.ignore_subscriptions,\r\n hideLoadMore: props.data.hide_load_more,\r\n hideViewAll: props.data.hide_view_all,\r\n hideSummary: props.data.hide_summary,\r\n hideTopics: props.data.hide_topics,\r\n }}\r\n refresh={refresh}\r\n resetRefresh={() => setRefresh(false)}\r\n />\r\n );\r\n};\r\n\r\nconst eventTypeTemplate = {\r\n name: \"event_types\",\r\n label: \"Lock to specific event types\",\r\n description: \"The component will only load events with event types selected. If none are selected, all types are loaded.\",\r\n buttonLabel: \"Add event types\",\r\n component: \"select-items\",\r\n options: [\r\n { value: \"standard\", label: \"Standard RSVP\" },\r\n { value: \"mandatory\", label: \"Mandatory RSVP\" },\r\n { value: \"informational\", label: \"Informational\" }\r\n ]\r\n};\r\n\r\nexport const EVENT_FEED_TEMPLATE = {\r\n key: \"events-feed-block\",\r\n label: \"Events Feed\",\r\n defaultItem: {\r\n layout: FeedLayout.HorizontalBand,\r\n max_results: 6,\r\n locked_to_topics: [],\r\n event_types: [],\r\n ignore_subscriptions: false,\r\n hide_topics: false,\r\n hide_summary: false,\r\n hide_load_more: false,\r\n hide_view_all: false,\r\n },\r\n fields: [\r\n contentHeaderTemplate,\r\n ...ignoreSubscriptionsTemplate,\r\n lockedToTopicsTemplate(\"event\"),\r\n eventTypeTemplate,\r\n optionalDataTemplate.header,\r\n ...optionalDataTemplate.eventsData,\r\n ...optionalDataTemplate.buttons,\r\n ...Object.values(stylingTemplate(\"event\"))\r\n ]\r\n};","export type ArticleType = \"post\" | \"event\" | \"document\";\r\n\r\nexport class ShareUtil {\r\n private tenantId: string;\r\n private location: string;\r\n private isPublic?: boolean;\r\n constructor(tenantId: string, isPublic?: boolean) {\r\n this.tenantId = tenantId;\r\n this.location = window.location.href;\r\n this.isPublic = isPublic;\r\n }\r\n\r\n public getPortalUrl = (baseUrl: string, articleType: ArticleType, articleId: string): string => {\r\n let segments: string[] = [];\r\n\r\n if (!this.tenantId) {\r\n segments = this.location.split(\"/public/\");\r\n\r\n return `${segments[0]}/public/${articleType}s/${articleId}`;\r\n } else {\r\n segments = this.location.split(this.tenantId);\r\n\r\n if (!baseUrl || this.isPublic) {\r\n return `${segments[0]}${this.tenantId}/${this.isPublic ? \"public/\" : \"\"}${articleType}s/${articleId}`;\r\n }\r\n else {\r\n return `${baseUrl}${articleId}`;\r\n }\r\n }\r\n };\r\n\r\n}","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { ShareUtil } from \"modules/common/components/utils/shareUtils\";\r\n\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport LinkIcon from '@mui/icons-material/Link';\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\nimport copy from \"copy-to-clipboard\";\r\nimport { Alert, AlertTitle, Button, Snackbar } from \"@mui/material\";\r\n\r\nexport const DocumentShareButton: React.FunctionComponent<PropsWithRedux> = (props) => {\r\n const [isCopying, setIsCopying] = React.useState<boolean>(false);\r\n\r\n const handleShare = () => {\r\n const shareUtil = new ShareUtil(props.tenantId);\r\n const url = shareUtil.getPortalUrl(\"\", \"document\", props.documentId ?? \"\");\r\n setIsCopying(true);\r\n copy(url);\r\n };\r\n\r\n const onCloseSnackbar = () => setIsCopying(false);\r\n\r\n return (\r\n <div>\r\n {\r\n props.children\r\n ? <Button title=\"Share\" size=\"small\" onClick={handleShare} startIcon={<LinkIcon fontSize=\"small\" />}>\r\n {props.children}\r\n </Button>\r\n : <IconButton title=\"Share\" size=\"small\" onClick={handleShare}>\r\n <LinkIcon fontSize=\"small\" />\r\n </IconButton>\r\n }\r\n <Snackbar\r\n open={isCopying}\r\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\r\n style={{ position: \"fixed\" }}\r\n autoHideDuration={6000}\r\n onClose={onCloseSnackbar}\r\n >\r\n <Alert variant=\"filled\" icon={false}\r\n style={{backgroundColor: \"#303030\", justifyContent: \"center\"}}\r\n action={\r\n <IconButton onClick={onCloseSnackbar} size=\"medium\" color=\"inherit\">\r\n <CloseIcon />\r\n </IconButton>\r\n }\r\n >\r\n <AlertTitle>Link copied.</AlertTitle>\r\n </Alert>\r\n </Snackbar>\r\n </div>\r\n );\r\n};\r\n\r\ninterface ComponentProps {\r\n documentId: string;\r\n children?: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id,\r\n }),\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(DocumentShareButton);","import React from \"react\";\r\n\r\nimport SaveAltIcon from \"@mui/icons-material/SaveAlt\";\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\n\r\nimport { DocumentFeedItem } from \"modules/documents/models\";\r\nimport DocumentShareButton from \"./documentShareButton\";\r\n\r\ninterface IDocumentActionButtons {\r\n document: DocumentFeedItem;\r\n onDownloadDocument: (document: DocumentFeedItem) => Promise<void>;\r\n onInspectDocument: (document: DocumentFeedItem) => void;\r\n}\r\n\r\nexport const DocumentActionButtons: React.FunctionComponent<IDocumentActionButtons> = ({\r\n document,\r\n onDownloadDocument,\r\n onInspectDocument\r\n}) => {\r\n return (<React.Fragment>\r\n <IconButton title=\"Download\" size=\"small\" onClick={async () => await onDownloadDocument(document)}>\r\n <SaveAltIcon fontSize=\"small\" />\r\n </IconButton>\r\n <IconButton title=\"More Info\" size=\"small\" onClick={() => onInspectDocument(document)}>\r\n <InfoOutlinedIcon fontSize=\"small\" />\r\n </IconButton>\r\n <DocumentShareButton documentId={document.id}></DocumentShareButton>\r\n </React.Fragment>);\r\n};\r\n","import React from \"react\";\r\n\r\nimport { DocumentFeedItem } from \"../../../../../models\";\r\n\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\n\r\nimport { DocumentActionButtons } from \"../../documentActionButtons\";\r\nimport { useDefaultLocale } from \"modules/common/hooks/useDefaultLocale\";\r\nimport { IDocumentFeedOptionalFlags } from \"modules/portalPages/tinacms/models/feed\";\r\n\r\nconst MAX_DOC_TITLE_LENGTH = 100;\r\n\r\nconst Document: React.FunctionComponent<IFeedDocumentProps> = props => {\r\n useDefaultLocale();\r\n\r\n const { document } = props;\r\n\r\n const getNoveltyBanner = (): JSX.Element => {\r\n if (document.isNew) return <div className=\"new inline-banner\">New</div>;\r\n\r\n if (document.isUpdated) return <div className=\"updated inline-banner\">Updated</div>;\r\n\r\n return <></>;\r\n };\r\n\r\n const getDocumentTitle = (): JSX.Element => {\r\n const title = document.title || `${document.fileName}.${document.fileType}`;\r\n\r\n const processedTitle = title.length > MAX_DOC_TITLE_LENGTH\r\n ? `${title.substring(0, MAX_DOC_TITLE_LENGTH - 3)}...`\r\n : title;\r\n\r\n return (\r\n <React.Fragment>\r\n {getNoveltyBanner()}\r\n <b>{processedTitle}</b>\r\n </React.Fragment>\r\n );\r\n };\r\n\r\n const getCategoryTags = (): JSX.Element => {\r\n if (document.tags.length <= 0) return <></>;\r\n\r\n const categoryTags = document.tags\r\n .map(tag => tag.name)\r\n .join(\", \");\r\n\r\n return (<div className=\"one-line-ellipsis\">\r\n Category tags: {categoryTags}\r\n </div>);\r\n };\r\n\r\n return (\r\n <TableRow\r\n key={document.id}\r\n className=\"document\"\r\n onClick={async () => await props.onDocumentSelected(document)}\r\n hover\r\n >\r\n {\r\n !props.optionalSettings.hideFileIcon &&\r\n <TableCell align=\"center\" padding=\"none\" className=\"with-divider file-icon\">\r\n <img src={`/images/icons/documents/${document.fileType}-list.png`} alt={document.fileType} className=\"file-type\" />\r\n </TableCell>\r\n }\r\n\r\n <TableCell component=\"th\" scope=\"row\" className=\"with-divider\">\r\n {getDocumentTitle()}\r\n {\r\n !props.optionalSettings.hideCategoryTags\r\n && <div> {getCategoryTags()} </div>\r\n }\r\n </TableCell>\r\n\r\n <TableCell align=\"center\" onClick={(ev) => ev.stopPropagation()}\r\n className=\"with-divider last-cell\">\r\n {document.isUnread && <div className=\"unread\">Unread</div>}\r\n <div className=\"action-buttons\">\r\n {\r\n !props.optionalSettings.hideActionIcons &&\r\n <DocumentActionButtons\r\n document={document}\r\n onDownloadDocument={props.onDownloadDocument}\r\n onInspectDocument={props.onInspectDocument}\r\n />\r\n }\r\n </div>\r\n </TableCell>\r\n </TableRow>\r\n );\r\n};\r\n\r\ninterface IFeedDocumentProps {\r\n document: DocumentFeedItem;\r\n onDocumentSelected: (document: DocumentFeedItem) => Promise<void>;\r\n onDownloadDocument: (document: DocumentFeedItem) => Promise<void>;\r\n onInspectDocument: (document: DocumentFeedItem) => void;\r\n optionalSettings: IDocumentFeedOptionalFlags;\r\n}\r\n\r\nexport default Document;","export const VIEWABLE_FILE_TYPES = [\"jpeg\", \"jpg\", \"pdf\", \"png\", \"txt\"];","import { documentsApi } from \"api/instances\";\r\nimport { VIEWABLE_FILE_TYPES } from \"modules/documents/constants\";\r\nimport { DocumentFeedItem } from \"modules/documents/models\";\r\nimport { getMimeType } from \"modules/documents/utilities/getMimeType\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\n\r\nexport class DocumentActions {\r\n private updateAction?: () => void;\r\n\r\n constructor(updateAction?: () => void) {\r\n this.updateAction = updateAction;\r\n }\r\n\r\n private update = () => {\r\n if (this.updateAction) this.updateAction();\r\n }\r\n\r\n public download = async (selectedDocument: DocumentFeedItem) => {\r\n const file = {\r\n name: `${selectedDocument.fileName}.${selectedDocument.fileType}`\r\n };\r\n\r\n try {\r\n const data = await documentsApi.GetDocumentFile(selectedDocument.id);\r\n\r\n new FileDownloader(file).downloadDoc(data);\r\n this.update();\r\n }\r\n catch (_) { }\r\n };\r\n\r\n public openInNew = async (selectedDocument: DocumentFeedItem) => {\r\n try {\r\n const file = await documentsApi.GetDocumentFile(selectedDocument.id);\r\n \r\n const blob = new Blob([file], { type: getMimeType(selectedDocument.fileType) });\r\n const fileURL = URL.createObjectURL(blob);\r\n const link = document.createElement(\"a\");\r\n link.href = fileURL;\r\n window.open(fileURL);\r\n\r\n this.update();\r\n }\r\n catch (_) {}\r\n };\r\n\r\n public select = async (selectedDocument: DocumentFeedItem) => {\r\n if (VIEWABLE_FILE_TYPES.includes(selectedDocument.fileType.toLowerCase())) {\r\n await this.openInNew(selectedDocument);\r\n }\r\n else {\r\n await this.download(selectedDocument);\r\n }\r\n };\r\n}","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { DocumentFeedItem } from \"../../../models\";\r\n\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\n\r\nimport Divider from \"@mui/material/Divider\";\r\nimport moment from \"moment\";\r\nimport { dateOptions } from \"utils/dateFormatting\";\r\n\r\n\r\nconst DocumentViewMoreInfo: React.FunctionComponent<PropsWithRedux> = props => {\r\n const { view } = props;\r\n\r\n return (\r\n <div>\r\n <div className=\"document-info-properties\">\r\n <div>\r\n <div>Document title</div>\r\n <div className=\"\">\r\n {view.title || `${view.fileName}.${view.fileType}`}\r\n </div>\r\n </div>\r\n </div>\r\n {(!!view.description || !!view.lcid) &&\r\n <React.Fragment>\r\n <div className=\"document-info-properties\">\r\n {!!view.description &&\r\n <div>\r\n <div>Description</div>\r\n <div>{view.description}</div>\r\n </div>\r\n }\r\n {!!view.lcid &&\r\n <div>\r\n <div>Language</div>\r\n <div>{props.lcidMappings[view.lcid].language}</div>\r\n </div>\r\n }\r\n </div>\r\n <Divider />\r\n </React.Fragment>\r\n }\r\n <div className=\"document-info-properties\">\r\n <div>\r\n <div className=\"revision\">\r\n <span>Version no.</span>\r\n <InfoHover>No. of times the file has been replaced. Version 1 is the initial file uploaded.</InfoHover>\r\n </div>\r\n <div>{view.revisions}</div>\r\n </div>\r\n </div>\r\n <Divider />\r\n <div className=\"document-info-properties\">\r\n <div>\r\n <div>Last modified</div>\r\n <div className=\"\">\r\n {moment(view.lastUpdatedDate).format(dateOptions.basicFormatting)}\r\n </div>\r\n </div>\r\n </div>\r\n {!!view.tags && !!view.tags.length &&\r\n <React.Fragment>\r\n <div className=\"document-info-properties\">\r\n <div>\r\n <div>Category tags</div>\r\n <div className=\"category-tags\">\r\n {view.tags.map(tag => tag.name).join(\", \")}\r\n </div>\r\n </div>\r\n </div>\r\n </React.Fragment>\r\n }\r\n </div>\r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n view: DocumentFeedItem;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n lcidMappings: state.resources.lcidMappings\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(DocumentViewMoreInfo);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Snackbar from \"@mui/material/Snackbar\";\r\nimport Alert from '@mui/material/Alert';\r\nimport { Button, DialogActions, DialogContent, DialogTitle, Typography } from \"@mui/material\";\r\n\r\nimport VisibilityOutlinedIcon from '@mui/icons-material/VisibilityOutlined';\r\nimport FileDownloadOutlinedIcon from '@mui/icons-material/FileDownloadOutlined';\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport DocumentMoreInfo from \"./components/documentViewMoreInfo\";\r\nimport { DocumentFeedItem } from \"../../models\";\r\n\r\nimport \"../../styles/documentViews.sass\";\r\nimport DocumentShareButton from \"../document-feed/components/documentShareButton\";\r\n\r\nexport const DocumentView: React.FunctionComponent<PropsWithRedux> = (props) => {\r\n const onClose = () => props.onClose();\r\n\r\n const handlePreview = () => {\r\n if (props.view) {\r\n props.onViewDocument(props.view);\r\n onClose();\r\n }\r\n };\r\n\r\n const handleDownload = () => {\r\n if (props.view) {\r\n props.onDownloadDocument(props.view);\r\n onClose();\r\n }\r\n }\r\n\r\n const canPreview = (): boolean => props.view?.fileType === \"jpeg\"\r\n || props.view?.fileType === \"jpg\"\r\n || props.view?.fileType === \"pdf\"\r\n || props.view?.fileType === \"png\"\r\n || props.view?.fileType === \"txt\";\r\n\r\n const getPreviewButton = (): JSX.Element => {\r\n if (!canPreview()) return <></>;\r\n\r\n return <Button\r\n onClick={handlePreview}\r\n variant=\"outlined\"\r\n startIcon={<VisibilityOutlinedIcon />}\r\n style={{ marginRight: \"10px\" }}\r\n >\r\n PREVIEW\r\n </Button>;\r\n };\r\n\r\n const getDialogFooter = (): JSX.Element => <DialogActions className=\"action-section doc-footer\">\r\n <DocumentShareButton documentId={props.view?.id ?? \"\"}>\r\n COPY LINK\r\n </DocumentShareButton>\r\n\r\n <div>\r\n {getPreviewButton()}\r\n <Button onClick={handleDownload} variant=\"contained\" startIcon={<FileDownloadOutlinedIcon />}>\r\n DOWNLOAD\r\n </Button>\r\n </div>\r\n </DialogActions>;\r\n\r\n const getDialogHeader = (): JSX.Element => <DialogTitle>\r\n <div className=\"action-section\">\r\n <Typography variant=\"h2\" marginY=\"auto\"> More Information </Typography>\r\n <IconButton onClick={onClose} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </DialogTitle>;\r\n\r\n if (!props.view) return <React.Fragment />;\r\n return (\r\n <>\r\n <Dialog\r\n open={props.show}\r\n onClose={onClose}\r\n classes={{ paper: \"document-view-paper\" }}\r\n className=\"document-view\"\r\n >\r\n {getDialogHeader()}\r\n\r\n <DialogContent>\r\n <DocumentMoreInfo view={props.view} />\r\n </DialogContent>\r\n\r\n {getDialogFooter()}\r\n <LoadingOverlay show={props.isSaving || props.isUploading} styles={{ paddingTop: 150 }} />\r\n </Dialog>\r\n <Snackbar open={!!props.errorMessage} anchorOrigin={{ vertical: \"top\", horizontal: \"right\" }} autoHideDuration={6000} onClose={props.clearErrorMessage}>\r\n <Alert variant=\"filled\" severity=\"error\" elevation={6} onClose={props.clearErrorMessage}>{props.errorMessage}</Alert>\r\n </Snackbar>\r\n </>\r\n );\r\n};\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n view: DocumentFeedItem | undefined;\r\n onDownloadDocument: (document: DocumentFeedItem) => Promise<void>;\r\n onViewDocument: (document: DocumentFeedItem) => Promise<void>;\r\n onClose: () => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id,\r\n errorMessage: state.documents.errorMessage,\r\n isSaving: state.documents.isSaving,\r\n isUploading: state.documents.isUploading\r\n }),\r\n {\r\n clearErrorMessage: actions.clearErrorMessage\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(DocumentView);","import React from \"react\";\r\n\r\nimport Table from '@mui/material/Table';\r\nimport TableBody from \"@mui/material/TableBody\";\r\n\r\nimport Document from \"./document\";\r\nimport { DocumentFeedItem } from \"modules/documents/models\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { actions } from \"modules/documents\";\r\nimport { defaultDocumentFeedFilters } from \"modules/documents/reducer\";\r\nimport { UserCategoryTag } from \"modules/categorytags\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport { FeedButtons } from \"modules/common/components/feed/feedButtons\";\r\n\r\nimport { DocumentActions } from \"../../../documentActions\";\r\nimport DocumentView from \"modules/documents/components/document-views/documentView\";\r\nimport { push } from \"react-router-redux\";\r\nimport { EmptyFeed } from \"modules/common/components/feed/emptyFeed\";\r\nimport { IDocumentFeedOptionalFlags } from \"modules/portalPages/tinacms/models/feed\";\r\n\r\nimport \"../../../../../styles/layouts/list.sass\";\r\nimport \"../../../../../styles/layouts/feed.sass\";\r\n\r\n\r\ninterface IDocumentFeedSection {\r\n lockedToCategoryTags: UserCategoryTag[];\r\n maxResults: number;\r\n optionalContent: IDocumentFeedOptionalFlags;\r\n refresh: boolean;\r\n resetRefresh: () => void;\r\n}\r\n\r\nconst DocumentFeedSection: React.FunctionComponent<IDocumentFeedSection> = (props: PropsWithRedux) => {\r\n const [documents, setDocuments] = React.useState<DocumentFeedItem[]>([]);\r\n const [isLoadingMore, setIsLoadingMore] = React.useState<boolean>(false);\r\n const [isLoadingFile, setIsLoadingFile] = React.useState<boolean>(false);\r\n\r\n const [canLoadMore, setCanLoadMore] = React.useState<boolean>(true);\r\n const [selectedDocument, setSelectedDocument] = React.useState<DocumentFeedItem>();\r\n\r\n const {\r\n fetchDocumentFeed,\r\n resetRefresh,\r\n maxResults,\r\n refresh\r\n } = props;\r\n\r\n const currentFilters = {\r\n ...defaultDocumentFeedFilters,\r\n tags: props.lockedToCategoryTags.map(ct => ct.id)\r\n };\r\n\r\n const onFetchMore = React.useCallback( async (pageNumber: number) => {\r\n try {\r\n setIsLoadingMore(true);\r\n const newDocs = await fetchDocumentFeed(pageNumber, currentFilters, maxResults);\r\n\r\n setDocuments(pageNumber === 1 ? newDocs : [...documents, ...newDocs]);\r\n setCanLoadMore(newDocs.length === maxResults);\r\n }\r\n catch {\r\n setDocuments([]);\r\n setCanLoadMore(false);\r\n }\r\n finally {\r\n resetRefresh();\r\n setIsLoadingMore(false);\r\n }\r\n }, [currentFilters, maxResults, documents, fetchDocumentFeed, resetRefresh]);\r\n\r\n React.useEffect(() => {\r\n const fetchDocuments = async () => await onFetchMore(1);\r\n\r\n if (!isLoadingMore && refresh) fetchDocuments();\r\n }, [isLoadingMore, onFetchMore, refresh]);\r\n\r\n const onSelectDocument = async (document: DocumentFeedItem) => {\r\n const action = new DocumentActions();\r\n setIsLoadingFile(true)\r\n await action.select(document);\r\n setIsLoadingFile(false)\r\n };\r\n\r\n const onDownloadDocument = async (document: DocumentFeedItem) => {\r\n setIsLoadingFile(true);\r\n const action = new DocumentActions();\r\n await action.download(document);\r\n setIsLoadingFile(false)\r\n };\r\n\r\n const onViewDocument = async (selectedDocument: DocumentFeedItem) => {\r\n setIsLoadingFile(true)\r\n const action = new DocumentActions();\r\n await action.openInNew(selectedDocument);\r\n setIsLoadingFile(false)\r\n };\r\n\r\n const onInspectDocument = (document: DocumentFeedItem) => {\r\n setSelectedDocument(document);\r\n };\r\n\r\n const getDocumentFeed = () => <TableBody className=\"list\">\r\n {documents.map(document => (\r\n <Document\r\n key={document.id}\r\n document={document}\r\n onDocumentSelected={onSelectDocument}\r\n onDownloadDocument={onDownloadDocument}\r\n onInspectDocument={onInspectDocument}\r\n optionalSettings={props.optionalContent}\r\n />\r\n ))}\r\n </TableBody>;\r\n\r\n const onViewAll = () => {\r\n props.setDocumentFeedFilters(currentFilters);\r\n props.redirectTo(`/${props.tenantId}/documents`);\r\n };\r\n\r\n if (documents.length === 0) {\r\n return isLoadingMore\r\n ? <Loading />\r\n : <EmptyFeed />;\r\n }\r\n\r\n const loadMore = props.optionalContent.hideLoadMore\r\n ? undefined\r\n : { isFetching: isLoadingMore, canLoadMore: canLoadMore, onFetchMore: onFetchMore}\r\n\r\n return (\r\n <React.Fragment>\r\n <Table id=\"document-feed\" className=\"portal-page-doc-feed\">\r\n {getDocumentFeed()}\r\n </Table>\r\n <FeedButtons\r\n viewAll={props.optionalContent.hideViewAll ? undefined : { action: onViewAll }}\r\n loadMore={loadMore}\r\n />\r\n \r\n <DocumentView\r\n show={!!selectedDocument}\r\n view={selectedDocument}\r\n onDownloadDocument={onDownloadDocument}\r\n onViewDocument={onViewDocument}\r\n onClose={() => setSelectedDocument(undefined)}\r\n />\r\n <LoadingOverlay show={isLoadingFile} />\r\n </React.Fragment>\r\n );\r\n};\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IDocumentFeedSection) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n setDocumentFeedFilters: actions.setDocumentFeedFilters,\r\n fetchDocumentFeed: actions.getDocumentFeedLocal,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(DocumentFeedSection);\r\n","import React from \"react\";\r\n\r\nimport { IDocumentsFeedConfig } from \"../../models/feed\";\r\nimport { contentHeaderTemplate, lockedToCategoryTagsTemplate, optionalDataTemplate, stylingTemplate } from \"./templates\";\r\nimport DocumentFeedSection from \"modules/documents/components/document-feed/components/layouts/feed/documentFeedSection\";\r\n\r\nexport const DocumentsFeedBlock: React.FunctionComponent<{ data: IDocumentsFeedConfig }> = props => {\r\n const [refresh, setRefresh] = React.useState<boolean>(false);\r\n const {\r\n max_results,\r\n locked_to_category_tags\r\n } = props.data;\r\n\r\n React.useEffect(() => setRefresh(true), [max_results, locked_to_category_tags])\r\n\r\n return (\r\n <DocumentFeedSection\r\n maxResults={Number.parseInt(props.data.max_results)}\r\n lockedToCategoryTags={props.data.locked_to_category_tags}\r\n optionalContent={{\r\n hideLoadMore: props.data.hide_load_more,\r\n hideViewAll: props.data.hide_view_all,\r\n hideActionIcons: props.data.hide_action_icons,\r\n hideCategoryTags: props.data.hide_category_tags,\r\n hideFileIcon: props.data.hide_file_icon\r\n }}\r\n refresh={refresh}\r\n resetRefresh={() => setRefresh(false)}\r\n />\r\n );\r\n};\r\n\r\nconst styling = stylingTemplate(\"document\");\r\n\r\nexport const DOCUMENT_FEED_TEMPLATE = {\r\n key: \"documents-feed-block\",\r\n label: \"Documents Feed\",\r\n defaultItem: {\r\n max_results: 6,\r\n locked_to_category_tags: [],\r\n hide_load_more: false,\r\n hide_view_all: false,\r\n },\r\n fields: [\r\n contentHeaderTemplate,\r\n lockedToCategoryTagsTemplate,\r\n optionalDataTemplate.header,\r\n ...optionalDataTemplate.docsData,\r\n ...optionalDataTemplate.buttons,\r\n styling.header,\r\n styling.tiles\r\n ]\r\n};","import React from \"react\";\r\n\r\nimport Paper from \"@mui/material/Paper\";\r\n\r\nimport { BannerBlock } from \"./banner\";\r\nimport { NewsFeedBlock } from \"./feed/newsFeed\";\r\nimport { TextBlock } from \"./text\";\r\nimport { CustomWidget } from \"./customWidget\";\r\nimport { EventsFeedBlock } from \"./feed/eventsFeed\";\r\nimport { DocumentsFeedBlock } from \"./feed/docsFeed\";\r\n\r\nimport { COMPONENT_TEMPLATES, SectionType, ISectionComponent } from \"../models/section\";\r\nimport { IDocumentsFeedConfig, IEventsFeedConfig, INewsFeedConfig } from \"../models/feed\";\r\nimport { ICustomWidgetConfig } from \"../models/widget\";\r\n\r\nconst Section: React.FunctionComponent<{ components: any[], columnCount: number }> = props => {\r\n if (!props.components)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n return (\r\n <React.Fragment>\r\n {props.components.map((component: ISectionComponent, index: number) => {\r\n switch(component._template) {\r\n case SectionType.Banner:\r\n return <BannerBlock key={index} data={component} />;\r\n case SectionType.NewsFeed:\r\n return <NewsFeedBlock key={index} data={component as INewsFeedConfig} columnCount={props.columnCount} />;\r\n case SectionType.Text:\r\n return <TextBlock key={index} data={component} />;\r\n case SectionType.EventsFeed:\r\n return <EventsFeedBlock key={index} data={component as IEventsFeedConfig} columnCount={props.columnCount}/>\r\n case SectionType.DocumentFeed:\r\n return <DocumentsFeedBlock key={index} data={component as IDocumentsFeedConfig}/>\r\n case SectionType.CustomWidget:\r\n return <CustomWidget key={index} index={index} data={component as ICustomWidgetConfig}/>\r\n default:\r\n return <React.Fragment></React.Fragment>;\r\n }\r\n })}\r\n </React.Fragment>\r\n );\r\n};\r\n\r\nexport const OneColumnBlock: React.FunctionComponent<{ data: any }> = props => {\r\n const { data } = props;\r\n \r\n return (\r\n <div className=\"section-block\">\r\n <Paper\r\n className=\"section-block-one-column-mui-paper\"\r\n style={{\r\n backgroundColor: data.column_1_data.background_color,\r\n backgroundImage: !!data.column_1_data.background_image ? `url('${data.column_1_data.background_image.fileUrl}')` : \"\"\r\n }}\r\n >\r\n <Section components={data.column_1_data.components} columnCount={1} />\r\n </Paper>\r\n </div>\r\n );\r\n};\r\n\r\nexport const TwoColumnsBlock: React.FunctionComponent<{ data: any }> = props => {\r\n const { data } = props;\r\n\r\n let leftColumnClassName: string = \"\";\r\n let rightColumnClassName: string = \"\";\r\n\r\n if (data.ratio === \"one_third\") {\r\n leftColumnClassName = \"one-third-column\";\r\n rightColumnClassName = \"two-thirds-column\";\r\n } else if (data.ratio === \"two_thirds\") {\r\n leftColumnClassName = \"two-thirds-column\";\r\n rightColumnClassName = \"one-third-column\";\r\n }\r\n\r\n return (\r\n <div className=\"section-block two-columns\">\r\n <Paper\r\n style={{\r\n backgroundColor: data.column_1_data.background_color,\r\n backgroundImage: !!data.column_1_data.background_image ? `url('${data.column_1_data.background_image.fileUrl}')` : \"\"\r\n }}\r\n className={`${leftColumnClassName} section-block-two-column-left-mui-paper`}\r\n >\r\n <Section components={data.column_1_data.components} columnCount={2} />\r\n </Paper>\r\n <Paper\r\n style={{\r\n backgroundColor: data.column_2_data.background_color,\r\n backgroundImage: !!data.column_2_data.background_image ? `url('${data.column_2_data.background_image.fileUrl}')` : \"\"\r\n }}\r\n className={`${rightColumnClassName} section-block-two-column-right-mui-paper`}\r\n >\r\n <Section components={data.column_2_data.components} columnCount={2} />\r\n </Paper>\r\n </div>\r\n );\r\n};\r\n\r\nexport const ThreeColumnsBlock: React.FunctionComponent<{ data: any }> = props => {\r\n const { data } = props;\r\n\r\n return (\r\n <div className=\"section-block three-columns\">\r\n <Paper\r\n className=\"section-block-three-column-left-mui-paper\"\r\n style={{\r\n backgroundColor: data.column_1_data.background_color,\r\n backgroundImage: !!data.column_1_data.background_image ? `url('${data.column_1_data.background_image.fileUrl}')` : \"\"\r\n }}\r\n >\r\n <Section components={data.column_1_data.components} columnCount={3} />\r\n </Paper>\r\n <Paper\r\n className=\"section-block-three-column-center-mui-paper\"\r\n style={{\r\n backgroundColor: data.column_2_data.background_color,\r\n backgroundImage: !!data.column_2_data.background_image ? `url('${data.column_2_data.background_image.fileUrl}')` : \"\"\r\n }}\r\n >\r\n <Section components={data.column_2_data.components} columnCount={3} />\r\n </Paper>\r\n <Paper\r\n className=\"section-block-three-column-right-mui-paper\"\r\n style={{\r\n backgroundColor: data.column_3_data.background_color,\r\n backgroundImage: !!data.column_3_data.background_image ? `url('${data.column_3_data.background_image.fileUrl}')` : \"\"\r\n }}\r\n >\r\n <Section components={data.column_3_data.components} columnCount={3} />\r\n </Paper>\r\n </div>\r\n );\r\n};\r\n\r\n\r\nconst column_1_components = {\r\n name: \"components\",\r\n label: \"Column Components\",\r\n component: \"blocks\",\r\n templates: COMPONENT_TEMPLATES\r\n};\r\n\r\nconst column_2_components = \r\n{\r\n name: \"components\",\r\n label: \"Column Components\",\r\n component: \"blocks\",\r\n templates: COMPONENT_TEMPLATES\r\n};\r\n\r\nconst column_3_components = {\r\n name: \"components\",\r\n label: \"Column Components\",\r\n component: \"blocks\",\r\n templates: COMPONENT_TEMPLATES\r\n};\r\n\r\nconst hr = {\r\n name: \"hr\",\r\n component: \"hr\"\r\n};\r\n\r\n\r\nconst column_styling_label = {\r\n name: \"column_styling_label\",\r\n label: \"Column Styling\",\r\n component: \"section-label\"\r\n};\r\n\r\nconst background_image = {\r\n name: \"background_image\",\r\n label: \"Background image\",\r\n description: \"Select an image as the background of this column\",\r\n component: \"image\"\r\n};\r\n\r\nconst background_color = {\r\n name: \"background_color\",\r\n label: \"Background color\",\r\n description: \"Select a color as the background of this column\",\r\n component: \"color\"\r\n};\r\n\r\n\r\nconst column_1_components_and_styling = {\r\n name: \"column_1_data\",\r\n label: \"Column 1\",\r\n component: \"group\",\r\n fields: [\r\n column_1_components,\r\n hr,\r\n column_styling_label,\r\n background_image,\r\n background_color\r\n ]\r\n};\r\n\r\nconst column_2_components_and_styling = {\r\n name: \"column_2_data\",\r\n label: \"Column 2\",\r\n component: \"group\",\r\n fields: [\r\n column_2_components,\r\n hr,\r\n column_styling_label,\r\n background_image,\r\n background_color\r\n ]\r\n};\r\n\r\nconst column_3_components_and_styling = {\r\n name: \"column_3_data\",\r\n label: \"Column 3\",\r\n component: \"group\",\r\n fields: [\r\n column_3_components,\r\n hr,\r\n column_styling_label,\r\n background_image,\r\n background_color\r\n ]\r\n};\r\n\r\n\r\nexport const one_column_template = {\r\n key: \"one-column-block\",\r\n label: \"1-column\",\r\n defaultItem: {\r\n label: \"1-column\",\r\n column_1_data: {\r\n components: [],\r\n background_image: \"\",\r\n background_color: \"\"\r\n }\r\n },\r\n itemProps: (item: any) => ({\r\n label: item.label\r\n }),\r\n fields: [\r\n {\r\n name: \"section_label\",\r\n label: \"1-column page section\",\r\n component: \"section-label\"\r\n },\r\n {\r\n name: \"label\",\r\n label: \"Section label\",\r\n description: \"Ex. Header Section, Section 2, Section 3\",\r\n component: \"text\"\r\n },\r\n {\r\n name: \"hr\",\r\n component: \"hr\"\r\n },\r\n column_1_components_and_styling\r\n ]\r\n};\r\n\r\nexport const two_columns_template = {\r\n key: \"two-columns-block\",\r\n label: \"2-column\",\r\n defaultItem: {\r\n label: \"2-column\",\r\n ratio: \"half\",\r\n column_1_data: {\r\n components: [],\r\n background_image: \"\",\r\n background_color: \"\"\r\n },\r\n column_2_data: {\r\n components: [],\r\n background_image: \"\",\r\n background_color: \"\"\r\n }\r\n },\r\n itemProps: (item: any) => ({\r\n label: item.label\r\n }),\r\n fields: [\r\n {\r\n name: \"section_label\",\r\n label: \"2-column page section\",\r\n component: \"section-label\"\r\n },\r\n {\r\n name: \"label\",\r\n label: \"Section label\",\r\n description: \"Ex. Header Section, Section 2, Section 3\",\r\n component: \"text\"\r\n },\r\n {\r\n name: \"ratio\",\r\n label: \"Ratio\",\r\n component: \"select\",\r\n options: [\r\n { value: \"half\", label: \"1:1\" },\r\n { value: \"two_thirds\", label: \"2:1\" },\r\n { value: \"one_third\", label: \"1:2\" }\r\n ]\r\n },\r\n {\r\n name: \"hr\",\r\n component: \"hr\"\r\n },\r\n {\r\n name: \"column_label\",\r\n label: \"Column Components & Styling\",\r\n component: \"section-label\"\r\n },\r\n column_1_components_and_styling,\r\n column_2_components_and_styling\r\n ]\r\n};\r\n\r\nexport const three_columns_template = {\r\n key: \"three-columns-block\",\r\n label: \"3-column\",\r\n defaultItem: {\r\n label: \"3-column\",\r\n column_1_data: {\r\n components: [],\r\n background_image: \"\",\r\n background_color: \"\"\r\n },\r\n column_2_data: {\r\n components: [],\r\n background_image: \"\",\r\n background_color: \"\"\r\n },\r\n column_3_data: {\r\n components: [],\r\n background_image: \"\",\r\n background_color: \"\"\r\n }\r\n },\r\n itemProps: (item: any) => ({\r\n label: item.label\r\n }),\r\n fields: [\r\n {\r\n name: \"section_label\",\r\n label: \"3-column page section\",\r\n component: \"section-label\"\r\n },\r\n {\r\n name: \"label\",\r\n label: \"Section label\",\r\n description: \"Ex. Header Section, Section 2, Section 3\",\r\n component: \"text\"\r\n },\r\n {\r\n name: \"hr\",\r\n component: \"hr\"\r\n },\r\n {\r\n name: \"column_label\",\r\n label: \"Column Components & Styling\",\r\n component: \"section-label\"\r\n },\r\n column_1_components_and_styling,\r\n column_2_components_and_styling,\r\n column_3_components_and_styling\r\n ]\r\n};","import React, { useEffect, useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { BannerBlock } from \"./components/banner\";\r\nimport { NavigationBlock } from \"./components/navigation\";\r\nimport { OneColumnBlock, TwoColumnsBlock, ThreeColumnsBlock } from \"./components/section\";\r\nimport { DialogPostView } from \"modules/posts/components/post-view/dialogPostView\";\r\nimport { validGuidRegex } from \"utils/regexUserValidation\";\r\n\r\n\r\nconst Page: React.FunctionComponent<PropsWithRedux> = props => {\r\n const { data } = props;\r\n const [selectedPostId, setSelectedPostId] = useState(\"\");\r\n\r\n //Gets the post ID from the URL.\r\n useEffect(() => {\r\n let lastIndex = window.location.href.split(\"/\").pop();\r\n //Make sure we are not editing a page by checking if admin/portPages\r\n let isEditingPage = window.location.href.includes(\"admin/portalPages\");\r\n if (!isEditingPage) {\r\n setSelectedPostId(lastIndex && lastIndex.match(validGuidRegex) ? lastIndex : \"\")\r\n }\r\n }, [])\r\n\r\n return (\r\n <div className=\"portal-page\">\r\n {data.navigation && data.navigation.enabled &&\r\n <NavigationBlock key=\"navigation\" data={data.navigation} isInEditMode={props.isInEditMode} />\r\n }\r\n {data.header && data.header.enabled &&\r\n <div className=\"header\" style={{ marginTop: \"0px\", marginBottom: \"0px\" }}>\r\n <BannerBlock key=\"header\" data={data.header} />\r\n </div>\r\n }\r\n {data.page_sections &&\r\n data.page_sections.map((page_section: any, index: number) => {\r\n switch (page_section._template) {\r\n case \"one_column\":\r\n return <OneColumnBlock key={index} data={page_section} />;\r\n case \"two_column\":\r\n return <TwoColumnsBlock key={index} data={page_section} />;\r\n case \"three_column\":\r\n return <ThreeColumnsBlock key={index} data={page_section} />;\r\n default:\r\n return <React.Fragment></React.Fragment>;\r\n }\r\n })}\r\n <DialogPostView\r\n isPublic\r\n onClose={() => { setSelectedPostId(\"\") }}\r\n postId={selectedPostId}\r\n open={!!selectedPostId} />\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n data: any;\r\n isInEditMode?: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(Page);\r\n","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport MoreOptionsButton from \"modules/common/components/buttons/moreOptionsButton\";\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport { PortalPage, PortalPagesListItem } from \"../../models\";\r\n\r\nimport Divider from \"@mui/material/Divider\";\r\nimport List from \"@mui/material/List\";\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\n\r\n\r\nconst PreviewOptions: React.FunctionComponent<PropsWithRedux> = props => {\r\n const { portalPagesListItem } = props;\r\n\r\n return (\r\n <div>\r\n <MoreOptionsButton text=\"Actions\">\r\n <List disablePadding>\r\n <MoreOptionsItem\r\n text=\"Open in page editor\"\r\n onClick={() => {\r\n props.hidePreview();\r\n props.redirectTo(\"/\" + props.tenantId + \"/admin/portalPages/edit/\" + props.portalPage.draftId);\r\n }}\r\n />\r\n {!portalPagesListItem.isHome &&\r\n <Divider light />\r\n }\r\n {!portalPagesListItem.isHome && portalPagesListItem.state === \"Enabled\" &&\r\n <MoreOptionsItem\r\n text=\"Set as homepage\"\r\n onClick={async () => {\r\n props.hidePreview();\r\n if (await confirm.show({\r\n text: \"You are about to set Leaders Hub as the Homepage. This will change the page settings including the URL and the audiences who can access the page.<br /><br />\"+\r\n \"Do you want to continue?\",\r\n title: \"Set as homepage\"\r\n }))\r\n props.setPortalPageAsHome(portalPagesListItem.id);\r\n }}\r\n />\r\n }\r\n {(portalPagesListItem.state === \"Draft\" || portalPagesListItem.hasPendingDraft) &&\r\n <MoreOptionsItem\r\n text={portalPagesListItem.hasPendingDraft\r\n ? portalPagesListItem.state === \"Enabled\"\r\n ? \"Publish changes\"\r\n : \"Publish with changes\"\r\n : \"Publish now\"\r\n }\r\n onClick={() => {\r\n props.hidePreview();\r\n props.publishDraft(portalPagesListItem.draftId);\r\n }}\r\n />\r\n }\r\n {!portalPagesListItem.isHome && portalPagesListItem.state === \"Enabled\" &&\r\n <MoreOptionsItem\r\n text=\"Disable\"\r\n onClick={() => {\r\n props.hidePreview();\r\n props.disablePortalPage(portalPagesListItem.id);\r\n }}\r\n />\r\n }\r\n {portalPagesListItem.state === \"Disabled\" &&\r\n <MoreOptionsItem\r\n text=\"Enable\"\r\n onClick={() => {\r\n props.hidePreview();\r\n props.enablePortalPage(portalPagesListItem.id);\r\n }}\r\n />\r\n }\r\n {!portalPagesListItem.isHome &&\r\n <MoreOptionsItem\r\n text=\"Delete\"\r\n onClick={async () => {\r\n props.hidePreview();\r\n if (portalPagesListItem.state === \"Draft\") {\r\n if (await confirm.show({ text: \"Are you sure you want to delete this draft?\", title: \"Delete draft\" }))\r\n props.deleteDraft(portalPagesListItem.draftId);\r\n } else {\r\n if (await confirm.show({ text: \"Are you sure you want to delete this page?\", title: \"Delete page\" }))\r\n props.deletePortalPage(portalPagesListItem.id);\r\n }\r\n }}\r\n />\r\n }\r\n </List>\r\n </MoreOptionsButton>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n portalPage: PortalPage;\r\n portalPagesListItem: PortalPagesListItem;\r\n onShowPortalPageDetails: (portalPage: PortalPagesListItem) => void;\r\n onShowPortalPageTitle: (portalPage: PortalPagesListItem) => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n deleteDraft: actions.deleteDraft,\r\n deletePortalPage: actions.deletePortalPage,\r\n disablePortalPage: actions.disablePortalPage,\r\n enablePortalPage: actions.enablePortalPage,\r\n getDraft: actions.getDraft,\r\n hidePreview: actions.hidePreview,\r\n publishDraft: actions.publishDraft,\r\n redirectTo: push,\r\n setPortalPageAsHome: actions.setPortalPageAsHome\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(PreviewOptions);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { PortalPagesListItem } from \"../../models\";\r\n\r\nimport Page from \"../../tinacms/page\";\r\n\r\nimport PreviewOptions from \"../action-buttons/previewOptions\";\r\n\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\n\r\nclass PortalPagePreview extends React.Component<PropsWithRedux, ComponentState> {\r\n public render() {\r\n const { portalPagesListItem, preview } = this.props;\r\n\r\n if (!portalPagesListItem || !preview)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n return (\r\n <Dialog id=\"portal-page-preview\" open={this.props.showPreview} maxWidth=\"lg\" onClose={this.onClose}>\r\n <DialogTitle className=\"portal-page-preview-header\">\r\n <div className=\"portal-page-preview-header-title\">\r\n <Typography variant=\"h2\">Preview {preview.title}</Typography>\r\n <div>\r\n <PreviewOptions portalPage={preview} portalPagesListItem={portalPagesListItem} onShowPortalPageDetails={this.props.onShowPortalPageDetails} onShowPortalPageTitle={this.props.onShowPortalPageTitle} />\r\n <IconButton onClick={this.onClose} size=\"large\"><CloseIcon /></IconButton>\r\n </div>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent>\r\n <div>Page URL: {preview.url}</div>\r\n <div className=\"preview-disclaimer\">Preview varies based on device and/or platform.</div>\r\n <div className=\"portal-page-preview-page\">\r\n <Page data={preview.portalPageJson[0]} isInEditMode />\r\n </div>\r\n </DialogContent>\r\n </Dialog>\r\n );\r\n }\r\n\r\n private onClose = () => {\r\n this.props.hidePreview();\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n portalPagesListItem: PortalPagesListItem | undefined;\r\n onShowPortalPageDetails: (portalPage: PortalPagesListItem) => void;\r\n onShowPortalPageTitle: (portalPage: PortalPagesListItem) => void;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n preview: state.portalPages.preview,\r\n showPreview: state.portalPages.showPreview,\r\n tenant: state.tenant.id\r\n }),\r\n {\r\n hidePreview: actions.hidePreview,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(PortalPagePreview);","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport { PortalPagesFilterValues, PortalPagesListingPage, PortalPagesListItem, PortalPageState } from \"../../models\";\r\nimport moment from \"moment\";\r\n\r\nimport AudienceChipLabels from \"modules/common/components/chips/audienceChipLabels\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport MorePortalPageOptions from \"../action-buttons/morePortalPageOptions\";\r\nimport ModifyPortalPageDetailsDialog from \"../dialogs/modifyPortalPageDetailsDialog\";\r\nimport ModifyPortalPageTitleDialog from \"../dialogs/modifyPortalPageTitleDialog\";\r\nimport PortalPagesFilters from \"../portal-pages-filters/portalPagesFilters\";\r\nimport PortalPagePreview from \"../portal-pages-views/portalPagePreview\";\r\n\r\nimport TabContent from \"pages/common/tabContent\";\r\nimport TabContentToolbar from \"pages/common/tabContentToolbar\";\r\n\r\nimport confirm from \"utils/notyPopups\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableContainer from \"@mui/material/TableContainer\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport BlockIcon from \"@mui/icons-material/Block\";\r\nimport CheckCircleOutlineIcon from \"@mui/icons-material/CheckCircleOutline\";\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\nimport DeleteIcon from \"@mui/icons-material/Delete\";\r\nimport EditIcon from \"@mui/icons-material/Edit\";\r\nimport HomeOutlinedIcon from \"@mui/icons-material/HomeOutlined\";\r\nimport { InfoOutlined } from \"@mui/icons-material/\";\r\nimport VisibilityIcon from \"@mui/icons-material/Visibility\";\r\nimport { SortStyle } from \"utils/managementUtils\";\r\nimport ArrowDownward from \"@mui/icons-material/ArrowDownward\";\r\nimport ArrowUpward from \"@mui/icons-material/ArrowUpward\";\r\nimport Cookies from \"js-cookie\";\r\nimport Paging from \"modules/common/components/paging\";\r\nimport ManagementEmptyResults from \"modules/common/components/managementEmptyResults\";\r\nimport { ROWS_PER_PAGE_COOKIE_NAMES } from \"utils/cookie\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport { setShouldDisplayNav } from \"modules/adminLayout/actionCreator\";\r\n\r\n\r\ninterface HeaderCell {\r\n disablePadding: boolean;\r\n id: string;\r\n label: string;\r\n ascValue?: SortStyle;\r\n descValue?: SortStyle;\r\n clickable?: boolean;\r\n}\r\n\r\n\r\nclass PortalPagesList extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n filters: { ...this.getDefaultFilterValues() },\r\n hasFiltersApplied: false,\r\n isPagedLoad: false,\r\n portalPageDetails: undefined,\r\n selectedItems: [],\r\n showPortalPageDetails: false,\r\n showPortalPageTitle: false,\r\n sortMethod: props.initialSort\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n\r\n if (!this.props.shouldDisplayNav)\r\n this.props.setShouldDisplayNav(true);\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.page.id !== prevProps.page.id) {\r\n this.setState({ selectedItems: [] });\r\n }\r\n\r\n if (this.props.hasRefreshed && !prevProps.hasRefreshed) {\r\n this.setState({ filters: { ...this.getDefaultFilterValues() }, hasFiltersApplied: false });\r\n }\r\n }\r\n\r\n public render() {\r\n const { page } = this.props;\r\n\r\n if (!this.props.show)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n if (page.isFetching && !this.state.isPagedLoad)\r\n return <Loading />;\r\n\r\n return (\r\n <div className=\"portal-pages-list\">\r\n {this.getToolbar()}\r\n <TabContent>\r\n {this.getFilter()}\r\n {this.getList()}\r\n <PortalPagePreview portalPagesListItem={this.state.portalPageDetails} onShowPortalPageDetails={this.onShowPortalPageDetails} onShowPortalPageTitle={this.onShowPortalPageTitle} />\r\n <ModifyPortalPageDetailsDialog show={this.state.showPortalPageDetails} portalPage={this.state.portalPageDetails} onClose={this.onHidePortalPageDetails} />\r\n <ModifyPortalPageTitleDialog show={this.state.showPortalPageTitle} portalPage={this.state.portalPageDetails} onClose={this.onHidePortalPageTitle} />\r\n </TabContent>\r\n </div>\r\n );\r\n }\r\n\r\n private formatModifiedTime = (time?: string, hasBeenPreviouslyPublished?: boolean): JSX.Element => {\r\n if (time) {\r\n return (\r\n <div className=\"portal-page-time\">\r\n <span>{moment(new Date(time)).format(\"MMM D, YYYY, h:mmA\")}</span>\r\n {hasBeenPreviouslyPublished &&\r\n <div title=\"This is a draft of a currently published page.\">\r\n <CheckCircleOutlineIcon className=\"modified-time\" />\r\n </div>\r\n }\r\n </div>\r\n );\r\n }\r\n return <div>-</div>;\r\n }\r\n\r\n private formatPublishedTime = (time?: string, hasPendingDraft?: boolean): JSX.Element => {\r\n if (time) {\r\n return (\r\n <div className=\"portal-page-time\">\r\n <span>{moment(new Date(time)).format(\"MMM D, YYYY, h:mmA\")}</span>\r\n {hasPendingDraft &&\r\n <HoverText label={<InfoOutlined style={{ color: \"#e6911a\" }} />} underline={false} inline>\r\n You have unpublished, saved changes to this page.\r\n </HoverText>}\r\n </div>\r\n );\r\n }\r\n return <div>-</div>;\r\n }\r\n\r\n private formatState = (state: PortalPageState): JSX.Element => {\r\n if (state === \"Disabled\")\r\n return <span className=\"portal-page-state grey\">{state}</span>;\r\n else if (state === \"Draft\")\r\n return <span className=\"portal-page-state yellow\">{state}</span>;\r\n else\r\n return <span className=\"portal-page-state green\">{state}</span>;\r\n }\r\n\r\n private formatTitle = (title: string, isHome: boolean): JSX.Element => {\r\n return (\r\n <div className=\"portal-page-title\">\r\n <span>{title}</span>\r\n {isHome &&\r\n <div title=\"This is your homepage.\">\r\n <HomeOutlinedIcon fontSize=\"small\" />\r\n </div>\r\n }\r\n </div>\r\n );\r\n }\r\n\r\n\r\n private getDefaultFilterValues = (): Partial<PortalPagesFilterValues> => {\r\n const filters: Partial<PortalPagesFilterValues> = {\r\n audiences: [],\r\n currentFilter: [],\r\n publishedFromDate: \"\",\r\n publishedToDate: \"\",\r\n searchText: \"\"\r\n };\r\n return filters;\r\n }\r\n\r\n\r\n private getFilter = (): JSX.Element => {\r\n return (\r\n <PortalPagesFilters\r\n id={this.props.page.id}\r\n filters={this.state.filters}\r\n onChangeFilters={this.onChangeFilters}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n );\r\n }\r\n\r\n //Default to descending, if currently descending make it ascending.\r\n private onClickHeader = (descValue: SortStyle | undefined, ascValue: SortStyle | undefined) => {\r\n const rowsPerPage = Cookies.get(ROWS_PER_PAGE_COOKIE_NAMES.DEFAULT);\r\n\r\n if(descValue === undefined || ascValue === undefined) {\r\n return;\r\n }\r\n\r\n if(this.state.sortMethod === descValue) {\r\n this.setState({sortMethod: ascValue, filters: {...this.state.filters, sortType: ascValue}}, () => {\r\n this.onChangePage(0, Number(rowsPerPage) ?? 10);\r\n });\r\n }\r\n else {\r\n this.setState({sortMethod: descValue, filters: {...this.state.filters, sortType: descValue}}, () => {\r\n this.onChangePage(0, Number(rowsPerPage) ?? 10);\r\n });\r\n }\r\n }\r\n\r\n private getHeader = (): HeaderCell[] => {\r\n const { page } = this.props;\r\n\r\n let header: HeaderCell[] = [\r\n { id: \"title\", disablePadding: true, label: \"Page title\", descValue: SortStyle.titleDesc, ascValue: SortStyle.titleAsc, clickable: true },\r\n { id: \"options\", disablePadding: true, label: \"\" }\r\n ];\r\n\r\n if (page.id === \"all\")\r\n header.push({ id: \"state\", disablePadding: false, label: \"State\", descValue: SortStyle.stateDesc, ascValue: SortStyle.stateAsc, clickable: true });\r\n\r\n if (page.id !== \"drafts\")\r\n header.push({ id: \"publishDate\", disablePadding: false, label: \"Publish date\", descValue: SortStyle.publishDesc, ascValue: SortStyle.publishAsc, clickable: true });\r\n if (page.id === \"drafts\")\r\n header.push({ id: \"lastModifiedTime\", disablePadding: false, label: \"Last saved\", descValue: SortStyle.modifiedDesc, ascValue: SortStyle.modifiedAsc, clickable: true });\r\n\r\n header.push({ id: \"lastModifiedBy\", disablePadding: false, label: \"Last modified by\", descValue: SortStyle.authorDesc, ascValue: SortStyle.authorAsc, clickable: true });\r\n header.push({ id: \"audiences\", disablePadding: false, label: \"Accessible to\" });\r\n\r\n return header;\r\n }\r\n\r\n private getList = (): JSX.Element => {\r\n const { page } = this.props;\r\n const { selectedItems } = this.state;\r\n\r\n const rowCount = page.portalPages.length || 10;\r\n\r\n if (page.isFetching)\r\n return <Loading />;\r\n\r\n if (!page.portalPages.length)\r\n return (\r\n <ManagementEmptyResults searchType={\"Portal Pages\"} hasFilters={this.state.hasFiltersApplied}/>\r\n );\r\n\r\n return (\r\n <React.Fragment>\r\n {this.state.hasFiltersApplied &&\r\n <Typography variant=\"h2\" className=\"portal-page-results\">Results</Typography>\r\n }\r\n <TableContainer>\r\n <Table size=\"medium\">\r\n <TableHead>\r\n <TableRow>\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n color=\"primary\"\r\n indeterminate={selectedItems.length > 0 && selectedItems.length < rowCount}\r\n checked={rowCount > 0 && selectedItems.length === rowCount}\r\n onChange={this.onSelectAllPortalPages}\r\n inputProps={{ \"aria-label\": \"select all pages\" }}\r\n />\r\n </TableCell>\r\n {this.getHeader().map((headerCell) => {\r\n if (headerCell.id === \"options\")\r\n return <TableCell key={headerCell.id} padding=\"checkbox\"></TableCell>\r\n\r\n return (\r\n <TableCell\r\n key={headerCell.id}\r\n align={headerCell.disablePadding ? \"left\" : \"center\"}\r\n padding={headerCell.disablePadding ? \"none\" : \"normal\"}\r\n onClick={() => this.onClickHeader(headerCell.descValue, headerCell.ascValue)}\r\n style={{cursor: headerCell.clickable ? \"pointer\" : \"\"}}\r\n >\r\n {headerCell.label}\r\n {this.state.sortMethod === headerCell.ascValue && <ArrowUpward htmlColor=\"#7A7A7A\" style={{position: \"relative\", top: \"8px\", paddingLeft: \"2px\"}}/>}\r\n {this.state.sortMethod === headerCell.descValue && <ArrowDownward htmlColor=\"#7A7A7A\" style={{position: \"relative\", top: \"8px\", paddingLeft: \"2px\"}}/>}\r\n </TableCell>\r\n );\r\n })}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {page.portalPages\r\n .map((portalPage, index) => this.getListItem(portalPage, index))\r\n }\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n <Paging\r\n currentPage={page.currentPage}\r\n items={page.portalPages}\r\n totalItems={page.totalPortalPages}\r\n totalPages={page.totalPages}\r\n onChangePage={this.onChangePage}\r\n resetSelection={this.resetSelection}\r\n />\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private getListItem = (portalPage: PortalPagesListItem, index: number): JSX.Element => {\r\n const isPortalPageSelected = this.isPortalPageSelected(portalPage);\r\n const labelId = `portal-page-list-checkbox-${index}`;\r\n\r\n return (\r\n <React.Fragment key={portalPage.id}>\r\n <TableRow\r\n hover\r\n onClick={(ev) => this.onPreviewClickedPortalPage(ev, portalPage)}\r\n role=\"checkbox\"\r\n aria-checked={isPortalPageSelected}\r\n tabIndex={-1}\r\n key={portalPage.id}\r\n selected={isPortalPageSelected}\r\n >\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n color=\"primary\"\r\n checked={isPortalPageSelected}\r\n inputProps={{ \"aria-labelledby\": labelId }}\r\n onClick={(ev) => this.onSelectPortalPage(ev, portalPage)}\r\n />\r\n </TableCell>\r\n <TableCell component=\"th\" id={labelId} scope=\"row\" padding=\"none\">{this.formatTitle(portalPage.title, portalPage.isHome)}</TableCell>\r\n <TableCell padding=\"checkbox\">\r\n <MorePortalPageOptions portalPage={portalPage} onPreviewPortalPage={() => this.onPreviewPortalPage(portalPage)} onSelection={this.onClearAllPortalPages} />\r\n </TableCell>\r\n {this.props.page.id === \"all\" && <TableCell align=\"center\">{this.formatState(portalPage.state)}</TableCell>}\r\n {this.props.page.id !== \"drafts\"\r\n ? <TableCell align=\"center\">{this.formatPublishedTime(portalPage.publishDate, portalPage.hasPendingDraft)}</TableCell>\r\n : <TableCell align=\"center\">{this.formatModifiedTime(portalPage.lastModifiedTime, portalPage.hasBeenPreviouslyPublished)}</TableCell>\r\n }\r\n <TableCell align=\"center\">{portalPage.lastModifiedBy}</TableCell>\r\n <TableCell align=\"center\"><AudienceChipLabels audienceIds={portalPage.audiences} audiences={this.props.audiences} /></TableCell>\r\n </TableRow>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private getToolbar = (): JSX.Element => {\r\n const { selectedItems } = this.state;\r\n\r\n const isOnlyHomeSelected = selectedItems.length === 1 && selectedItems[0].isHome;\r\n\r\n if (!selectedItems.length)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n return (\r\n <TabContentToolbar>\r\n <div>\r\n {this.getToolbarIcon(`${selectedItems.length} selected`, <ClearIcon />, this.onClearAllPortalPages)}\r\n </div>\r\n <div>\r\n {selectedItems.length === 1 &&\r\n <React.Fragment>\r\n {this.getToolbarIcon(\"Open in page editor\", <EditIcon />, this.onEditPortalPage)}\r\n {this.getToolbarIcon(\"Preview\", <VisibilityIcon />, () => this.onPreviewPortalPage(selectedItems[0]))}\r\n {selectedItems[0].state === \"Disabled\" && this.getToolbarIcon(\"Enable\", <CheckCircleOutlineIcon />, this.onEnablePortalPage)}\r\n {selectedItems[0].state === \"Enabled\" && this.getToolbarIcon(\"Disable\", <BlockIcon style={{ transform: \"rotate(90deg)\" }} />, this.onDisablePortalPage)}\r\n {/* {this.getToolbarIcon(\"Duplicate\", <FileCopyIcon />, this.onClonePortalPage)} */}\r\n </React.Fragment>\r\n }\r\n {!isOnlyHomeSelected && this.getToolbarIcon(\"Delete\", <DeleteIcon />, this.onDeletePortalPages)}\r\n </div>\r\n </TabContentToolbar>\r\n );\r\n }\r\n\r\n private getToolbarIcon = (title: string, icon: React.ReactNode, onClick: () => void) => {\r\n return (\r\n <Button aria-label={title.toLowerCase()} color=\"primary\" startIcon={icon} onClick={onClick}>\r\n {title}\r\n </Button>\r\n );\r\n }\r\n\r\n\r\n private isPortalPageSelected = (portalPage: PortalPagesListItem): boolean => {\r\n return this.state.selectedItems.findIndex((selectedItem) => selectedItem.id === portalPage.id) !== -1;\r\n }\r\n\r\n\r\n private onChangeFilters = (filters: Partial<PortalPagesFilterValues>) => {\r\n const updatedFilters = { ...this.state.filters, ...filters };\r\n this.setState({ filters: updatedFilters, hasFiltersApplied: true, isPagedLoad: true });\r\n this.props.fetchPage(1, updatedFilters);\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.setState({ hasFiltersApplied: false, filters: { ...this.getDefaultFilterValues() }, isPagedLoad: true });\r\n this.props.fetchPage(1, {});\r\n }\r\n\r\n\r\n private onClearAllPortalPages = () => {\r\n this.setState({ selectedItems: [] });\r\n }\r\n\r\n private onClonePortalPage = () => {\r\n // this.props.clonePortalPage(this.state.selectedItems[0].draftId).then((response) => {\r\n // if (!!response) {\r\n // this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/portalPages/edit/\" + response.id);\r\n // this.onClearAllPortalPages();\r\n // }\r\n // });\r\n }\r\n\r\n private onDeletePortalPages = async () => {\r\n if (this.state.selectedItems.length === 1) {\r\n const selectedItem: PortalPagesListItem = this.state.selectedItems[0];\r\n if (selectedItem.state === \"Draft\" && !selectedItem.isHome) {\r\n if (await confirm.show({\r\n text: `You're about to permanently delete '${selectedItem.title}'. You cannot undo this action. Are you sure?`,\r\n title: \"Delete Draft\",\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\"\r\n }))\r\n this.props.deleteDraft(selectedItem.draftId);\r\n } else {\r\n if(!selectedItem.isHome) {\r\n if (await confirm.show({\r\n text: `You're about to permanently delete '${selectedItem.title}'. You cannot undo this action. Are you sure?`,\r\n title: \"Delete Portal Page\",\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\"\r\n }))\r\n this.props.deletePortalPage(selectedItem.id);\r\n }\r\n }\r\n this.onClearAllPortalPages();\r\n } else {\r\n let validDeletionItems = this.state.selectedItems.filter(s => !s.isHome);\r\n\r\n if (this.props.page.id === \"drafts\") {\r\n if (await confirm.show({\r\n text: \"Are you sure you want to delete these drafts?\",\r\n title: \"Delete Drafts\",\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\"\r\n })) {\r\n this.props.deletePortalPages(validDeletionItems);\r\n this.onClearAllPortalPages();\r\n }\r\n } else {\r\n if (await confirm.show({\r\n text: \"Are you sure you want to delete these pages?\",\r\n title: \"Delete Portal Pages\",\r\n yesColor: \"#a80000\",\r\n yesText: \"Delete\",\r\n noText: \"Cancel\"\r\n })) {\r\n this.props.deletePortalPages(validDeletionItems);\r\n this.onClearAllPortalPages();\r\n }\r\n }\r\n }\r\n }\r\n\r\n private onEnablePortalPage = () => {\r\n this.props.enablePortalPage(this.state.selectedItems[0].id).then(() => {\r\n this.onClearAllPortalPages();\r\n });\r\n }\r\n\r\n private onEditPortalPage = () => {\r\n this.props.redirectTo(\"/\" + this.props.tenant + \"/admin/portalPages/edit/\" + this.state.selectedItems[0].draftId);\r\n }\r\n\r\n private onDisablePortalPage = () => {\r\n this.props.disablePortalPage(this.state.selectedItems[0].id).then(() => {\r\n this.onClearAllPortalPages();\r\n });\r\n }\r\n\r\n private onPreviewPortalPage = (portalPage: PortalPagesListItem) => {\r\n this.setState({ portalPageDetails: portalPage });\r\n this.props.getDraft(portalPage.draftId).then((draft) => {\r\n this.props.showPreview(draft);\r\n });\r\n }\r\n\r\n private onSelectAllPortalPages = () => {\r\n if (this.state.selectedItems.length === this.props.page.portalPages.length)\r\n this.setState({ selectedItems: [] });\r\n else\r\n this.setState({ selectedItems: this.props.page.portalPages });\r\n }\r\n\r\n private onSelectPortalPage = (ev, portalPage: PortalPagesListItem) => {\r\n ev.stopPropagation();\r\n let selectedItems = this.state.selectedItems.slice();\r\n\r\n if (selectedItems.findIndex((selectedItem) => selectedItem.draftId === portalPage.draftId) === -1)\r\n selectedItems = selectedItems.concat([portalPage]);\r\n else\r\n selectedItems = selectedItems.filter(selectedItem => selectedItem.draftId !== portalPage.draftId);\r\n\r\n this.setState({ selectedItems });\r\n }\r\n\r\n private onPreviewClickedPortalPage = (ev, portalPage: PortalPagesListItem) => {\r\n this.setState({ portalPageDetails: portalPage });\r\n this.props.getDraft(portalPage.draftId).then((draft) => {\r\n this.props.showPreview(draft);\r\n });\r\n }\r\n\r\n private onHidePortalPageDetails = () => {\r\n this.setState({ portalPageDetails: undefined, showPortalPageDetails: false });\r\n }\r\n\r\n private onHidePortalPageTitle = () => {\r\n this.setState({ portalPageDetails: undefined, showPortalPageTitle: false });\r\n }\r\n\r\n private onShowPortalPageDetails = (portalPage: PortalPagesListItem) => {\r\n this.setState({ portalPageDetails: portalPage, showPortalPageDetails: true });\r\n }\r\n\r\n private onShowPortalPageTitle = (portalPage: PortalPagesListItem) => {\r\n this.setState({ portalPageDetails: portalPage, showPortalPageTitle: true });\r\n }\r\n\r\n private resetSelection = () => {\r\n this.setState({selectedItems: []});\r\n }\r\n\r\n private onChangePage = (page: number, pageAmount: number) => {\r\n this.props.fetchPage(page + 1, this.state.filters, pageAmount);\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n page: PortalPagesListingPage;\r\n hasRefreshed?: boolean;\r\n fetchPage: (pageNumber: number, filters: Partial<PortalPagesFilterValues>, pageAmount?: number) => void;\r\n initialSort: SortStyle;\r\n}\r\n\r\ninterface ComponentState {\r\n filters: Partial<PortalPagesFilterValues>;\r\n hasFiltersApplied: boolean;\r\n isPagedLoad: boolean;\r\n portalPageDetails: PortalPagesListItem | undefined;\r\n selectedItems: PortalPagesListItem[];\r\n showPortalPageDetails: boolean;\r\n showPortalPageTitle: boolean;\r\n sortMethod: SortStyle;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences,\r\n tenant: state.tenant.id,\r\n shouldDisplayNav: state.adminLayout.shouldDisplayNav\r\n }),\r\n {\r\n // clonePortalPage: actions.clonePortalPage,\r\n deleteDraft: actions.deleteDraft,\r\n deletePortalPage: actions.deletePortalPage,\r\n deletePortalPages: actions.deletePortalPages,\r\n disablePortalPage: actions.disablePortalPage,\r\n enablePortalPage: actions.enablePortalPage,\r\n getDraft: actions.getDraft,\r\n redirectTo: push,\r\n showPreview: actions.showPreview,\r\n setShouldDisplayNav\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(PortalPagesList);\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport { PortalPagesFilterValues, PortalPagesListingPage } from \"../../models\";\r\n\r\nimport PortalPagesList from \"./portalPagesList\";\r\n\r\nimport Tabs from \"pages/common/tabs\";\r\n\r\n\r\nimport \"../../styles/portalPagesListing.sass\";\r\nimport { SortStyle } from \"utils/managementUtils\";\r\n\r\n\r\nconst allTab: number = 0;\r\nconst enabledTab: number = 1;\r\nconst draftTab: number = 2;\r\nconst disabledTab: number = 3;\r\n\r\n\r\nclass PortalPagesListing extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n hasRefreshed: false,\r\n selectedTab: 0\r\n };\r\n }\r\n\r\n public componentWillMount() {\r\n if (this.props.isInitialLoad || this.props.shouldFetch) {\r\n this.fetchLists();\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.shouldFetch && (this.props.shouldFetch !== prevProps.shouldFetch)) {\r\n this.fetchLists();\r\n }\r\n }\r\n\r\n public render() {\r\n const { selectedTab } = this.state;\r\n\r\n return (\r\n <React.Fragment>\r\n <div className=\"portal-pages-listing\">\r\n <Tabs\r\n tabs={[\r\n { label: this.getTabLabel(\"All\", this.props.all), id: \"all-portal-pages-tab\" },\r\n { label: this.getTabLabel(\"Enabled\", this.props.enabled), dotColor: \"green\", id: \"enabled-portal-pages-tab\" },\r\n { label: this.getTabLabel(\"Drafts\", this.props.drafts), dotColor: \"yellow\", id: \"drafts-portal-pages-tab\" },\r\n { label: this.getTabLabel(\"Disabled\", this.props.disabled), dotColor: \"grey\", id: \"disabled-portal-pages-tab\" }\r\n ]}\r\n selectedTab={selectedTab}\r\n onSelectTab={this.onSelectTab}\r\n />\r\n <PortalPagesList show={selectedTab === allTab} page={this.props.all} hasRefreshed={this.state.hasRefreshed} fetchPage={this.fetchAll} initialSort={SortStyle.publishDesc}/>\r\n <PortalPagesList show={selectedTab === enabledTab} page={this.props.enabled} hasRefreshed={this.state.hasRefreshed} fetchPage={this.fetchEnabled} initialSort={SortStyle.publishDesc}/>\r\n <PortalPagesList show={selectedTab === draftTab} page={this.props.drafts} hasRefreshed={this.state.hasRefreshed} fetchPage={this.fetchDrafts} initialSort={SortStyle.modifiedDesc}/>\r\n <PortalPagesList show={selectedTab === disabledTab} page={this.props.disabled} hasRefreshed={this.state.hasRefreshed} fetchPage={this.fetchDisabled} initialSort={SortStyle.publishDesc}/>\r\n </div>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n\r\n private fetchLists = () => {\r\n this.setState({ hasRefreshed: false }, () => this.setState({ hasRefreshed: true }));\r\n this.fetchAll(1, {sortType: SortStyle.publishDesc});\r\n this.fetchEnabled(1, {sortType: SortStyle.publishDesc});\r\n this.fetchDrafts(1, {sortType: SortStyle.modifiedDesc});\r\n this.fetchDisabled(1, {sortType: SortStyle.publishDesc});\r\n this.props.clearShouldFetch();\r\n }\r\n\r\n\r\n private fetchAll = (pageNumber: number, filters: Partial<PortalPagesFilterValues>, pageAmount?: number) => {\r\n !this.props.all.isFetching &&\r\n this.props.getAll(pageNumber, filters, pageAmount);\r\n }\r\n\r\n private fetchEnabled = (pageNumber: number, filters: Partial<PortalPagesFilterValues>, pageAmount?: number) => {\r\n !this.props.enabled.isFetching &&\r\n this.props.getEnabled(pageNumber, filters, pageAmount);\r\n }\r\n\r\n private fetchDrafts = (pageNumber: number, filters: Partial<PortalPagesFilterValues>, pageAmount?: number) => {\r\n !this.props.drafts.isFetching &&\r\n this.props.getDrafts(pageNumber, filters, pageAmount);\r\n }\r\n\r\n private fetchDisabled = (pageNumber: number, filters: Partial<PortalPagesFilterValues>, pageAmount?: number) => {\r\n !this.props.disabled.isFetching &&\r\n this.props.getDisabled(pageNumber, filters, pageAmount);\r\n }\r\n\r\n private getTabLabel = (label: string, page: PortalPagesListingPage): string => {\r\n if (!!page.currentPage)\r\n return `${label} (${page.totalPortalPages})`;\r\n return label;\r\n }\r\n\r\n private onSelectTab = (tabIndex: number) => {\r\n this.setState({ ...this.state, selectedTab: tabIndex });\r\n }\r\n}\r\n \r\n\r\ninterface ComponentProps {\r\n}\r\n\r\ninterface ComponentState {\r\n hasRefreshed: boolean;\r\n selectedTab: number;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n all: state.portalPages.all,\r\n enabled: state.portalPages.enabled,\r\n drafts: state.portalPages.drafts,\r\n disabled: state.portalPages.disabled,\r\n isFetching: state.portalPages.isFetching,\r\n isInitialLoad: state.portalPages.isInitialLoad,\r\n shouldFetch: state.portalPages.shouldFetch,\r\n tenantSettings: state.settings.tenantSettings,\r\n tenant: state.tenant.id\r\n }),\r\n {\r\n clearShouldFetch: actions.clearShouldFetch,\r\n getAll: actions.getPortalPages,\r\n getDisabled: actions.getDisabledPortalPages,\r\n getDrafts: actions.getDraftPortalPages,\r\n getEnabled: actions.getEnabledPortalPages,\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(PortalPagesListing);","import React, { useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Tutorial, { Slide } from \"modules/common/components/tutorial\";\r\n\r\nimport Cookies, { COMMON_COOKIE_KEYS } from \"utils/cookie\";\r\n\r\n\r\nconst TUTORIAL_SLIDES: Slide[] = [\r\n {\r\n title: \"Introducing Portal Pages\",\r\n content: (\r\n <div>Your company portal now allows you to create custom pages that can display content targeted to the page purpose. For example, easily create an HR page to display HR news, policies, and events. Pages can also be secured to one or more audiences.</div>\r\n )\r\n },\r\n {\r\n title: \"Portal Pages\",\r\n content: (\r\n <div>\r\n You can manage, create, edit, or delete your portal pages in the Portal Pages section of your Admin Portal. Please note that only administrators can access this section.\r\n <br /><br />\r\n The <span className=\"emphasis\">All</span> tab includes all your enabled, disabled, and draft pages. <span className=\"emphasis\">Enabled</span> is a filtered view of pages that are live, while <span className=\"emphasis\">Disabled</span> lists the inactive pages. <span className=\"emphasis\">Drafts</span> consist of not only pages that are under construction, but also live pages that have saved but unpublished changes to them.\r\n </div>\r\n )\r\n },\r\n {\r\n title: \"Creating Portal Pages\",\r\n content: (\r\n <div>\r\n <span className=\"emphasis\">Step 1.</span> When you create a new portal page, you’ll set the page title, the page URL, and optionally which audiences have access to that page.\r\n <br /><br />\r\n To create a private page, specify which audiences you want to grant access to the page. If you don’t restrict your page, the page and its contents will be accessible and visible to all users in your organization.\r\n </div>\r\n )\r\n },\r\n {\r\n title: \"Creating Portal Pages: Page Editor\",\r\n content: (\r\n <div>\r\n <span className=\"emphasis\">Step 2.</span> After you’ve set up the basic page details, it’s time to customize your page!\r\n <br /><br />\r\n The <span className=\"emphasis\">Page Editor</span> previews your portal page and allows you with the help of Portal Page Components to customize its content. <span className=\"emphasis\">Components</span> are widgets that you plugin to your page, they are used to personalize your banner, your page sections, and more.\r\n </div>\r\n )\r\n },\r\n {\r\n title: \"Global Components\",\r\n content: (\r\n <div>\r\n <span className=\"emphasis\">Global Components</span> are reusable and uniform components that you can add to your portal pages. When a global component is edited or modified, changes are reflected in all the pages using the component.\r\n <br /><br />\r\n The <span className=\"emphasis\">Navigation Bar</span> is a global component. This component is located at the top of your pages, and helps your employees locate and access portal pages you wish to include on the <span className=\"emphasis\">Navigation List</span>.\r\n <br /><br />\r\n <span className=\"emphasis\">Take note!</span> Private pages are only visible to employees that are part of their target audiences.\r\n </div>\r\n )\r\n }\r\n];\r\n\r\nconst PortalPagesTutorial: React.FunctionComponent<PropsWithRedux> = props => {\r\n const [showTutorial] = useState(Cookies.isFirstSet(COMMON_COOKIE_KEYS.PORTAL_PAGES_VISITED));\r\n\r\n return (\r\n <Tutorial openOnLoad={showTutorial} slides={TUTORIAL_SLIDES} imageSrc=\"/images/tutorials/portal-pages/portal-pages\" />\r\n );\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(PortalPagesTutorial);","import * as React from \"react\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as actions from \"../actionCreator\";\r\nimport * as audiencesActions from \"modules/audiences/actionCreator\";\r\n\r\nimport GlobalComponentsDrawer from \"../components/dialogs/globalComponentsDrawer\";\r\nimport MoreOptions from \"../components/action-buttons/moreOptions\";\r\nimport NewPortalPage from \"../components/action-buttons/newPortalPage\";\r\nimport NewPortalPageDialog from \"../components/dialogs/newPortalPageDialog\";\r\nimport PortalPagesListing from \"../components/portal-pages-listing/portalPagesListing\";\r\nimport PortalPagesTutorial from \"../components/dialogs/portalPagesTutorial\";\r\n\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Header from \"pages/common/header\";\r\nimport MainContent from \"pages/common/mainContent\";\r\n\r\nimport \"../styles/dialogs.sass\";\r\n\r\n\r\nclass PortalPagesManagementPage extends React.Component<PropsWithRedux, {}> {\r\n public componentDidMount() {\r\n if (!this.props.audiences.length)\r\n this.props.getAudiences();\r\n }\r\n\r\n public render() {\r\n return (\r\n <BasePage fullWidth>\r\n <Header\r\n title={\r\n <React.Fragment>\r\n <span>Manage Portal Pages</span>\r\n <PortalPagesTutorial />\r\n </React.Fragment>\r\n }\r\n rightComponent={\r\n <React.Fragment>\r\n <MoreOptions />\r\n <NewPortalPage />\r\n </React.Fragment>\r\n }\r\n />\r\n <MainContent>\r\n <div className=\"authoring-page\">\r\n <PortalPagesListing />\r\n <GlobalComponentsDrawer />\r\n <NewPortalPageDialog />\r\n <ErrorSnackbar errorMessage={this.props.errorMessage} clearErrorMessage={this.props.clearErrorMessage} />\r\n <LoadingOverlay absolute={true} show={this.props.isDeleting || this.props.isFetching || this.props.isSaving} />\r\n </div>\r\n </MainContent>\r\n </BasePage>\r\n );\r\n }\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences,\r\n errorMessage: state.portalPages.errorMessage,\r\n isDeleting: state.portalPages.isDeleting,\r\n isFetching: state.portalPages.isFetching,\r\n isSaving: state.portalPages.isSaving\r\n }),\r\n {\r\n clearErrorMessage: actions.clearErrorMessage,\r\n getAudiences: audiencesActions.getAudiences\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(PortalPagesManagementPage);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport * as actions from \"modules/portalPages/actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\n\r\nclass BackToManagePortalPagesDialog extends React.Component<PropsWithRedux, ComponentState> {\r\n public render() {\r\n return (\r\n <Dialog open={this.props.show} maxWidth={false} onClose={this.onClose}>\r\n <DialogTitle className=\"portal-pages-dialog-header\">\r\n <div className=\"portal-pages-dialog-header-title\">\r\n <Typography variant=\"h2\">Back to Manage Portal Pages</Typography>\r\n <IconButton onClick={this.onClose} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent className=\"portal-page-dialog-content\">\r\n <div>You are about to leave the page editor.<br /><br />Do you want to continue?</div>\r\n </DialogContent>\r\n <DialogActions className=\"portal-pages-dialog-footer\">\r\n <Button variant=\"text\" onClick={this.onBack}>Discard</Button>\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onSave}>Save & exit</Button>\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n onClick={this.onClose}\r\n >\r\n Keep editing\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n }\r\n\r\n private onBack = () => {\r\n this.props.redirectTo(\"/\" + this.props.tenantId + \"/admin/portalPages\");\r\n this.onClose();\r\n }\r\n\r\n private onClose = () => {\r\n this.props.hideBackToPortalPages();\r\n }\r\n\r\n private onSave = () => {\r\n this.props.saveDraft(this.props.draftId, this.props.data).then((succeeded) => {\r\n if (succeeded)\r\n this.props.redirectTo(\"/\" + this.props.tenantId + \"/admin/portalPages\");\r\n });\r\n this.onClose();\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n draftId: string;\r\n data: string;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n show: state.portalPages.showBackToPortalPages,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n redirectTo: push,\r\n saveDraft: actions.saveDraft,\r\n hideBackToPortalPages: actions.hideBackToPortalPages\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(BackToManagePortalPagesDialog);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport * as actions from \"modules/portalPages/actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\n\r\nclass GoToNavigationItemsDialog extends React.Component<PropsWithRedux, ComponentState> {\r\n public render() {\r\n return (\r\n <Dialog open={this.props.show} maxWidth={false} onClose={this.onClose}>\r\n <DialogTitle className=\"portal-pages-dialog-header\">\r\n <div className=\"portal-pages-dialog-header-title\">\r\n <Typography variant=\"h2\">Edit Navigation Items</Typography>\r\n <IconButton onClick={this.onClose} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent className=\"portal-page-dialog-content\">\r\n <div>\r\n You are about to leave the page editor. Changes made to the navigation items will save across all pages that use this component.<br /><br />\r\n Changes made to this page will be saved.<br />\r\n Do you want to continue?\r\n </div>\r\n </DialogContent>\r\n <DialogActions className=\"portal-pages-dialog-footer\">\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onClose}>No</Button>\r\n <Button variant=\"contained\" color=\"primary\" onClick={this.onSave}>Yes</Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n }\r\n\r\n private onClose = () => {\r\n this.props.hideGoToNavigationItems();\r\n }\r\n\r\n private onSave = () => {\r\n this.props.saveDraft(this.props.draftId, this.props.data).then((succeeded) => {\r\n if (succeeded)\r\n this.props.redirectTo(\"/\" + this.props.tenantId + \"/admin/portalPages/navigation\");\r\n });\r\n this.onClose();\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n draftId: string;\r\n data: string;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n show: state.portalPages.showGoToNavigationItems,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n redirectTo: push,\r\n saveDraft: actions.saveDraft,\r\n hideGoToNavigationItems: actions.hideGoToNavigationItems\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(GoToNavigationItemsDialog);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport * as actions from \"modules/portalPages/actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { PortalPage } from \"modules/portalPages/models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\n\r\nclass PublishChangesDialog extends React.Component<PropsWithRedux, ComponentState> {\r\n public render() {\r\n return (\r\n <Dialog open={this.props.showPublishChanges} maxWidth={false} onClose={this.onClose}>\r\n <DialogTitle className=\"portal-pages-dialog-header\">\r\n <div className=\"portal-pages-dialog-header-title\">\r\n <Typography variant=\"h2\">Publish changes</Typography>\r\n <IconButton onClick={this.onClose} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent className=\"portal-page-dialog-content\">\r\n <div>\r\n <span>Recent changes in page details were made. These changes will not be applied until the page is published. Would you like to publish now?</span>\r\n <br /><br />\r\n <span>Any changes made in the page editor will also be saved and published.</span>\r\n </div>\r\n </DialogContent>\r\n <DialogActions className=\"portal-pages-dialog-footer\">\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onClose}>Keep editing</Button>\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n onClick={this.onPublish}\r\n >\r\n Publish\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n }\r\n\r\n private onPublish = () => {\r\n this.onClose();\r\n this.props.saveDraft(this.props.page.draftId, this.props.data).then((succeeded) => {\r\n if (succeeded) {\r\n this.props.clearChangedSinceSaved();\r\n this.props.publishDraft(this.props.page.draftId).then((succeeded) => {\r\n if (succeeded)\r\n this.props.redirectTo(\"/\" + this.props.tenantId + \"/admin/portalPages\");\r\n });\r\n }\r\n });\r\n }\r\n\r\n private onClose = () => {\r\n this.props.hidePublishChanges();\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n data: string;\r\n page: PortalPage;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n showPublishChanges: state.portalPages.showPublishChanges,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n clearChangedSinceSaved: actions.clearChangedSinceSaved,\r\n hidePublishChanges: actions.hidePublishChanges,\r\n redirectTo: push,\r\n publishDraft: actions.publishDraft,\r\n saveDraft: actions.saveDraft\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(PublishChangesDialog);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport * as actions from \"modules/portalPages/actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { PortalPage } from \"modules/portalPages/models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\n\r\nclass PublishDialog extends React.Component<PropsWithRedux, ComponentState> {\r\n public render() {\r\n return (\r\n <Dialog open={this.props.show} maxWidth={false} onClose={this.onClose}>\r\n <DialogTitle className=\"portal-pages-dialog-header\">\r\n <div className=\"portal-pages-dialog-header-title\">\r\n <Typography variant=\"h2\">Publish portal page</Typography>\r\n <IconButton onClick={this.onClose} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n </DialogTitle>\r\n <DialogContent className=\"portal-page-dialog-content\">\r\n <div>\r\n <span>Your changes have been saved. Would you like to publish your changes?</span>\r\n </div>\r\n </DialogContent>\r\n <DialogActions className=\"portal-pages-dialog-footer\">\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onClose}>Keep editing</Button>\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n onClick={this.onPublish}\r\n >\r\n {this.props.page.hasBeenPreviouslyPublished\r\n ? this.props.page.state === \"Enabled\"\r\n ? \"Publish changes\"\r\n : \"Publish with changes\"\r\n : \"Publish\"\r\n }\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n }\r\n\r\n private onPublish = () => {\r\n this.onClose();\r\n this.props.publishDraft(this.props.page.draftId).then((succeeded) => {\r\n if (succeeded)\r\n this.props.redirectTo(\"/\" + this.props.tenantId + \"/admin/portalPages\");\r\n });\r\n }\r\n\r\n private onClose = () => {\r\n this.props.onClose();\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n page: PortalPage;\r\n onClose: () => void;\r\n}\r\n\r\ninterface ComponentState {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n redirectTo: push,\r\n publishDraft: actions.publishDraft\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(PublishDialog);","import React, { useEffect, useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"modules/portalPages/actionCreator\";\r\nimport * as audiencesActions from \"modules/audiences/actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { PortalPage } from \"modules/portalPages/models\";\r\n\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport { banner_fields } from \"./components/banner\";\r\nimport { one_column_template, two_columns_template, three_columns_template } from \"./components/section\";\r\nimport BackToManagePortalPagesDialog from \"./dialogs/backToManagePortalPagesDialog\";\r\nimport GoToNavigationItemsDialog from \"./dialogs/goToNavigationItemsDialog\";\r\nimport PublishChangesDialog from \"./dialogs/publishChangesDialog\";\r\nimport PublishDialog from \"./dialogs/publishDialog\";\r\nimport Page from \"./page\";\r\n\r\nimport { useCMS, useForm, usePlugin } from \"tinacms\";\r\n\r\n\r\nconst Editor: React.FunctionComponent<PropsWithRedux> = props => {\r\n const [showPublishDialog, setShowPublishDialog] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!props.audiences.length) {\r\n props.getAudiences();\r\n }\r\n }, [props]);\r\n\r\n useCMS();\r\n \r\n const pageConfig = {\r\n id: \"page-config\",\r\n label: \"Edit portal page\",\r\n fields: [\r\n {\r\n name: \"command_bar\",\r\n page: props.page,\r\n component: \"command-bar\"\r\n },\r\n {\r\n name: \"command_bar_hr\",\r\n component: \"hr\"\r\n },\r\n {\r\n name: \"page_details_label\",\r\n label: \"Page details\",\r\n component: \"section-label\"\r\n },\r\n {\r\n name: \"page_details\",\r\n page: props.page,\r\n component: \"page-details\"\r\n },\r\n {\r\n name: \"page_details_hr\",\r\n component: \"hr\"\r\n },\r\n {\r\n name: \"navigation\",\r\n label: \"Navigation Bar\",\r\n component: \"group\",\r\n fields: [\r\n {\r\n name: \"enabled\",\r\n label: \"Enable navigation bar\",\r\n component: \"mui-toggle\"\r\n },\r\n {\r\n name: \"edit_navigation_items\",\r\n label: \"Edit Navigation Items\",\r\n component: \"edit-navigation-items\"\r\n }\r\n ]\r\n },\r\n {\r\n name: \"navigation_bar_hr\",\r\n component: \"hr\"\r\n },\r\n {\r\n name: \"header\",\r\n label: \"Header\",\r\n component: \"group\",\r\n fields: [\r\n {\r\n name: \"enabled\",\r\n label: \"Enable header\",\r\n component: \"mui-toggle\"\r\n },\r\n {\r\n name: \"enabled_hr\",\r\n component: \"hr\"\r\n }\r\n ].concat(banner_fields as any[])\r\n },\r\n {\r\n name: \"header-hr\",\r\n component: \"hr\"\r\n },\r\n {\r\n name: \"page_sections\",\r\n label: \"Page Sections\",\r\n component: \"blocks\",\r\n templates: {\r\n \"one_column\": one_column_template,\r\n \"two_column\": two_columns_template,\r\n \"three_column\": three_columns_template\r\n }\r\n }\r\n ],\r\n initialValues: props.page.portalPageJson[0],\r\n onChange: () => {\r\n props.hasChangedSinceSaved();\r\n },\r\n buttons: {\r\n save: \"Save\",\r\n reset: \"Reset\"\r\n },\r\n onSubmit: async (data) => {\r\n props.saveDraft(props.page.draftId, data).then((succeeded) => {\r\n if (succeeded) {\r\n props.clearChangedSinceSaved();\r\n setShowPublishDialog(true);\r\n }\r\n });\r\n },\r\n reset: () => {\r\n props.clearChangedSinceSaved();\r\n }\r\n };\r\n\r\n const [data, form] = useForm(pageConfig, { fields: pageConfig.fields });\r\n\r\n usePlugin(form);\r\n\r\n return (\r\n <React.Fragment>\r\n <Page data={data} isInEditMode />\r\n <BackToManagePortalPagesDialog draftId={props.page.draftId} data={data} />\r\n <GoToNavigationItemsDialog draftId={props.page.draftId} data={data} />\r\n <PublishChangesDialog page={props.page} data={data} />\r\n <PublishDialog show={showPublishDialog} page={props.page} onClose={() => setShowPublishDialog(false)} />\r\n <ErrorSnackbar errorMessage={props.errorMessage} clearErrorMessage={props.clearErrorMessage} />\r\n <LoadingOverlay absolute={true} show={props.isFetchingImage || props.isSaving} />\r\n </React.Fragment>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n page: PortalPage;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences,\r\n errorMessage: state.portalPages.errorMessage,\r\n isFetchingImage: state.gallery.isFetching,\r\n isSaving: state.portalPages.isSaving,\r\n showModifyPortalPageDetails: state.portalPages.showModifyPortalPageDetails,\r\n showModifyPortalPageTitle: state.portalPages.showModifyPortalPageTitle\r\n }),\r\n {\r\n clearChangedSinceSaved: actions.clearChangedSinceSaved,\r\n clearErrorMessage: actions.clearErrorMessage,\r\n getAudiences: audiencesActions.getAudiences,\r\n hasChangedSinceSaved: actions.hasChangedSinceSaved,\r\n saveDraft: actions.saveDraft\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(Editor);","import * as React from \"react\";\r\n\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\r\n\r\n\r\nconst MuiCheckbox: React.FunctionComponent<{ input, meta, field }> = props => {\r\n return (\r\n <div className=\"mui-checkbox\">\r\n <FormControlLabel\r\n control={\r\n <Checkbox\r\n color=\"primary\"\r\n size=\"small\"\r\n checked={!!props.input.value}\r\n onChange={(ev, checked) => props.input.onChange(checked)}\r\n />\r\n }\r\n label={props.field.label}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport default MuiCheckbox;","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport * as actions from \"modules/portalPages/actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { PortalPage } from \"modules/portalPages/models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport ChevronLeftIcon from \"@mui/icons-material/ChevronLeft\";\r\nimport SaveIcon from \"@mui/icons-material/Save\";\r\n\r\n\r\nconst CommandBar: React.FunctionComponent<{ input, meta, field } & PropsWithRedux> = props => {\r\n return (\r\n <div className=\"command-bar\">\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n startIcon={<ChevronLeftIcon fontSize=\"small\" />}\r\n onClick={() => props.showBackToPortalPages()}\r\n className=\"text-button\"\r\n >\r\n <span>Back to Manage Portal Pages</span>\r\n </Button>\r\n {props.field.page.hasBeenPreviouslyPublished &&\r\n <div title={`This page is ${props.field.page.state}; however, you have unpublished, saved changes to this page.`} className=\"unpublished-changes-icon\">\r\n <SaveIcon />\r\n </div>\r\n }\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n page: PortalPage;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n redirectTo: push,\r\n showBackToPortalPages: actions.showBackToPortalPages\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(CommandBar);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport * as actions from \"modules/portalPages/actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\n\r\nimport LaunchIcon from \"@mui/icons-material/Launch\";\r\n\r\n\r\nconst EditNavigationItems: React.FunctionComponent<{ input, meta, field } & PropsWithRedux> = props => {\r\n return (\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n endIcon={<LaunchIcon />}\r\n onClick={() => props.showGoToNavigationItems()}\r\n className=\"text-button\"\r\n >\r\n {props.field.label}\r\n </Button>\r\n );\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id\r\n }),\r\n {\r\n redirectTo: push,\r\n showGoToNavigationItems: actions.showGoToNavigationItems\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(EditNavigationItems);","import styled from \"styled-components\";\r\n\r\nconst Description = styled.span`\r\n color: var(--tina-color-grey-6);\r\n display: block;\r\n font-size: var(--tina-font-size-0);\r\n font-style: italic;\r\n font-weight: lighter;\r\n margin: 0;\r\n padding-top: 4px;\r\n white-space: normal;\r\n`;\r\n\r\nexport default Description;","import styled from \"styled-components\";\r\n\r\nconst Label = styled.label`\r\n color: var(--tina-color-grey-8);\r\n display: block;\r\n font-size: var(--tina-font-size-1);\r\n font-weight: 600;\r\n letter-spacing: 0.01em;\r\n line-height: 1.35;\r\n margin-bottom: 8px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n width: 100%;\r\n`;\r\n\r\nexport default Label;","import React, { useState } from \"react\";\r\nimport * as galleryActions from \"modules/gallery/actionCreator\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Description from \"./common/description\";\r\nimport Label from \"./common/label\";\r\nimport PluginWrapper from \"./common/pluginWrapper\";\r\n\r\nimport ImageGalleryDialog from \"modules/common/components/authoring/dialogs/imageGalleryDialog\";\r\nimport { Icons } from \"modules/common/icons\";\r\n\r\nimport { AttachedFile } from \"modules/gallery/models\";\r\n\r\nimport IconButton from \"@mui/material/IconButton\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\n\r\nconst Image: React.FunctionComponent<PropsWithRedux> = props => {\r\n const [showImageGallery, setShowImageGallery] = useState(false);\r\n return (\r\n <PluginWrapper>\r\n <Label>\r\n {props.field.label}\r\n {props.field.description &&\r\n <Description>{props.field.description}</Description>\r\n }\r\n </Label>\r\n {!!props.input.value &&\r\n <div className=\"image\">\r\n <img src={props.input.value.fileUrl} alt=\"\" />\r\n <IconButton onClick={() => props.input.onChange(undefined)} size=\"large\"><CloseIcon /></IconButton>\r\n </div>\r\n }\r\n <p onClick={() => setShowImageGallery(true)} className=\"empty-image-target\">\r\n <Icons.AddImage width=\"40px\" height=\"40px\" />\r\n <span className=\"instruction\">Select an image</span>\r\n </p>\r\n <ImageGalleryDialog\r\n show={showImageGallery}\r\n allowLink\r\n onApply={(image: AttachedFile[]) => {\r\n if (!image[0].ospreyId)\r\n props.input.onChange(image[0]);\r\n else\r\n props.getImage(image[0].ospreyId).then((fullsizeImage) => {\r\n props.input.onChange(fullsizeImage);\r\n });\r\n }}\r\n onClose={() => setShowImageGallery(false)}\r\n />\r\n </PluginWrapper>\r\n );\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: { input, meta, field }) => ({\r\n ...ownProps\r\n }),\r\n {\r\n getImage: galleryActions.getImage\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(Image);","import * as React from \"react\";\r\n\r\nimport Description from \"./common/description\";\r\nimport TinaLabel from \"./common/label\";\r\n\r\n\r\nfunction Label({ input, meta, field }) {\r\n return (\r\n <TinaLabel>\r\n {field.label}\r\n {field.description &&\r\n <Description>{field.description}</Description>\r\n }\r\n </TinaLabel>\r\n );\r\n}\r\n\r\nexport default Label;","import * as React from \"react\";\r\n\r\nimport Label from \"./common/label\";\r\n\r\nimport Switch from \"@mui/material/Switch\";\r\n\r\n\r\nconst MuiToggle: React.FunctionComponent<{ input, meta, field }> = props => {\r\n return (\r\n <div className=\"mui-toggle\">\r\n <Label>{props.field.label}</Label>\r\n <Switch\r\n color=\"primary\"\r\n checked={!!props.input.value}\r\n onChange={(ev, checked) => props.input.onChange(checked)}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport default MuiToggle;","import React, { useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"modules/portalPages/actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport ModifyPortalPageDetailsDialog from \"modules/portalPages/components/dialogs/modifyPortalPageDetailsDialog\";\r\nimport ModifyPortalPageTitleDialog from \"modules/portalPages/components/dialogs/modifyPortalPageTitleDialog\";\r\n\r\n\r\nimport PluginWrapper from \"./common/pluginWrapper\";\r\n\r\nimport { Audience } from \"modules/audiences/models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\n\r\nimport EditIcon from \"@mui/icons-material/Edit\";\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\n\r\n\r\nconst PageDetails: React.FunctionComponent<{ input, meta, field } & PropsWithRedux> = props => {\r\n const [showModifyPortalPageDetails, setShowModifyPortalPageDetails] = useState(false);\r\n const [showModifyPortalPageTitle, setShowModifyPortalPageTitle] = useState(false);\r\n\r\n const matchedAudiences: Audience[] = (props.field.page.audiences || []).map((audienceId) => {\r\n const matchedAudience = !!props.audiences ? props.audiences.find((audience) => audience.id === audienceId) : null;\r\n if (!matchedAudience)\r\n return {\r\n id: \"\",\r\n displayName: \"\",\r\n description: \"\",\r\n enabled: false,\r\n type: \"\"\r\n };\r\n return matchedAudience;\r\n }).filter((audience) => !!audience.id);\r\n\r\n return (\r\n <PluginWrapper>\r\n <div className=\"page-details\">\r\n <div className=\"page-detail\">\r\n <div>Page title</div>\r\n <div>{props.field.page.title}</div>\r\n </div>\r\n <div className=\"page-detail\">\r\n <div>Page URL</div>\r\n <div>/{props.field.page.url}</div>\r\n </div>\r\n <div className=\"page-detail\">\r\n <div>Accessible to</div>\r\n {(!props.field.page.audiences || !props.field.page.audiences.length)\r\n ? <div>All users</div>\r\n : <div>{matchedAudiences.map(audience => audience.displayName).join(\", \")}</div>\r\n }\r\n </div>\r\n <div className=\"page-details-info\">\r\n <InfoOutlinedIcon />\r\n <div>Changes to Page Details will not be applied until the page is published.</div>\r\n </div>\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n startIcon={<EditIcon />}\r\n onClick={() => {\r\n if (props.field.page.isHome)\r\n setShowModifyPortalPageTitle(true);\r\n else\r\n setShowModifyPortalPageDetails(true);\r\n }}\r\n className=\"text-button\"\r\n >\r\n <span>\r\n {props.field.page.isHome\r\n ? \"Modify page title\"\r\n : \"Modify page details\"\r\n }\r\n </span>\r\n </Button>\r\n <ModifyPortalPageDetailsDialog\r\n show={showModifyPortalPageDetails}\r\n portalPage={{ ...props.field.page, state: \"Draft\" }}\r\n onSuccess={() => props.showPublishChanges()}\r\n onClose={() => setShowModifyPortalPageDetails(false)}\r\n />\r\n <ModifyPortalPageTitleDialog\r\n show={showModifyPortalPageTitle}\r\n portalPage={{ ...props.field.page, state: \"Draft\" }}\r\n onSuccess={() => props.showPublishChanges()}\r\n onClose={() => setShowModifyPortalPageTitle(false)}\r\n />\r\n </div>\r\n </PluginWrapper>\r\n );\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n audiences: state.audiences.audiences\r\n }),\r\n {\r\n showPublishChanges: actions.showPublishChanges\r\n }\r\n);\r\ntype PropsWithRedux = { input, meta, field } & ConnectedProps<typeof connector>;\r\n\r\nexport default connector(PageDetails);","import * as React from \"react\";\r\n\r\nimport Description from \"./common/description\";\r\nimport Label from \"./common/label\";\r\nimport PluginWrapper from \"./common/pluginWrapper\";\r\n\r\nimport Slider from \"@mui/material/Slider\";\r\n\r\n\r\nconst PercentageSlider: React.FunctionComponent<{ input, meta, field }> = props => {\r\n return (\r\n <PluginWrapper>\r\n {props.field.label &&\r\n <Label>\r\n {props.field.label}\r\n {props.field.description &&\r\n <Description>{props.field.description}</Description>\r\n }\r\n </Label>\r\n }\r\n <Slider\r\n value={props.input.value || 0}\r\n step={1}\r\n marks={[\r\n { value: 0, label: \"0%\" },\r\n { value: 100, label: \"100%\" }\r\n ]}\r\n valueLabelDisplay=\"auto\"\r\n onChange={(ev, checked) => props.input.onChange(checked)}\r\n className={props.field.label ? \"\" : \"percentage-slider\"}\r\n />\r\n </PluginWrapper>\r\n );\r\n}\r\n\r\nexport default PercentageSlider;","import * as React from \"react\";\r\n\r\n\r\nfunction SectionLabel({ input, meta, field }) {\r\n return (\r\n <div className=\"section-label\">\r\n {field.label}\r\n </div>\r\n );\r\n}\r\n\r\nexport default SectionLabel;","import * as React from \"react\";\r\n\r\nimport Description from \"./common/description\";\r\nimport Label from \"./common/label\";\r\nimport PluginWrapper from \"./common/pluginWrapper\";\r\n\r\nimport { ITinaProps } from \"../models/common\";\r\nimport { IdNamePair } from \"modules/common/models\";\r\nimport MultiselectAndChipsWithSearch from \"modules/common/components/forms/inputs/multiSelectAndChipsWithSearch\";\r\n\r\nexport const SelectItems: React.FunctionComponent<ITinaProps<string[]>> = (props: ITinaProps<string[]>) => {\r\n\r\n const items = props.input.value\r\n ? props.input.value.map(value => ({ id: value, name: props.field.options?.find(option => option.value === value)?.label ?? \"\" }))\r\n : [];\r\n const [selectedItems, setSelectedItems] = React.useState<IdNamePair<string, string>[]>(items);\r\n\r\n const onToggleItemsList = (items: IdNamePair<string, string>[]) => {\r\n props.input.onChange(items.map(i => i.id));\r\n setSelectedItems(items);\r\n };\r\n\r\n return <PluginWrapper>\r\n <Label>\r\n {props.field.label}\r\n {props.field.description &&\r\n <Description>{props.field.description}</Description>\r\n }\r\n </Label>\r\n <MultiselectAndChipsWithSearch\r\n defaultOptions={props.field.options?.map(t => ({ id: t.value, name: t.label })) ?? []}\r\n selectedOptions={selectedItems}\r\n buttonText={props.field.buttonLabel}\r\n buttonClassName=\"add-text-button\"\r\n onChange={onToggleItemsList}\r\n nestingAllowed={false}\r\n buttonId=\"add-text-button\"\r\n />\r\n </PluginWrapper>;\r\n};\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport * as settingsActions from \"modules/settings/actionCreator\";\r\n\r\nimport { Tag } from \"modules/common/components/authoring/models\";\r\n\r\nimport Description from \"./common/description\";\r\nimport Label from \"./common/label\";\r\nimport PluginWrapper from \"./common/pluginWrapper\";\r\n\r\nimport { ITinaProps } from \"../models/common\";\r\nimport MultiselectAndChipsWithSearch from \"modules/common/components/forms/inputs/multiSelectAndChipsWithSearch\";\r\nimport { MultiSelectTopic, MultiSelectTopicGroup } from \"modules/settings\";\r\n\r\nconst SelectTopics: React.FunctionComponent<PropsWithRedux> = (props: PropsWithRedux) => {\r\n const {\r\n shouldFetch,\r\n tagGroups,\r\n } = props.tagSettings;\r\n\r\n const { getUserTagSettings } = props;\r\n\r\n React.useEffect(() => {\r\n if (shouldFetch || tagGroups.length === 0) getUserTagSettings();\r\n }, [shouldFetch, tagGroups, getUserTagSettings])\r\n\r\n const getProcessedTopicList = (): MultiSelectTopicGroup[] => {\r\n return tagGroups\r\n .filter(tg => !tg.tags.every(topic => topic.disabled))\r\n .map(tg => ({\r\n id: tg.id,\r\n name: tg.name,\r\n tags: tg.tags.map(t => ({ id: t.id, name: t.name, restricted: t.restricted ?? false }))\r\n }));\r\n };\r\n\r\n const onUpdateTopics = (topics: MultiSelectTopic[]) => props.input.onChange(topics);\r\n\r\n return (\r\n <PluginWrapper>\r\n <Label>\r\n {props.field.label}\r\n {props.field.description &&\r\n <Description>{props.field.description}</Description>\r\n }\r\n </Label>\r\n <MultiselectAndChipsWithSearch\r\n defaultOptions={getProcessedTopicList().map(t => ({ id: t.id, name: t.name, children: t.tags }))}\r\n selectedOptions={props.input.value.map(t => ({ id: t.id, name: t.name, restricted: t.restricted ?? false }))}\r\n buttonText=\"Add Topics\"\r\n buttonClassName=\"regular-case-button\"\r\n onChange={onUpdateTopics}\r\n buttonId=\"add-topics-button\"\r\n />\r\n </PluginWrapper>\r\n )\r\n}\r\n\r\ninterface ISelectTopics { }\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ISelectTopics) => ({\r\n ...ownProps,\r\n tagSettings: state.settings.tagSettings\r\n }),\r\n {\r\n getUserTagSettings: settingsActions.getUserTagSettings\r\n }\r\n);\r\n\r\ntype PropsWithRedux = ITinaProps<Tag[]> & ConnectedProps<typeof connector>;\r\n\r\nexport default connector(SelectTopics);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\n\r\nimport Description from \"./common/description\";\r\nimport Label from \"./common/label\";\r\nimport PluginWrapper from \"./common/pluginWrapper\";\r\n\r\nimport { ITinaProps } from \"../models/common\";\r\nimport MultiselectAndChipsWithSearch from \"modules/common/components/forms/inputs/multiSelectAndChipsWithSearch\";\r\nimport { actions, UserCategoryTag } from \"modules/categorytags\";\r\n\r\nconst SelectCategoryTags: React.FunctionComponent<PropsWithRedux> = (props: PropsWithRedux) => {\r\n const {\r\n shouldFetch,\r\n categoryTags,\r\n isInitialLoad,\r\n getUserCategoryTags\r\n } = props;\r\n\r\n React.useEffect(() => {\r\n if (shouldFetch || isInitialLoad) getUserCategoryTags();\r\n }, [shouldFetch, isInitialLoad, getUserCategoryTags]);\r\n\r\n const onUpdateCategoryTags = (ct: UserCategoryTag[]) => props.input.onChange(ct);\r\n\r\n return (\r\n <PluginWrapper>\r\n <Label>\r\n {props.field.label}\r\n {props.field.description &&\r\n <Description>{props.field.description}</Description>\r\n }\r\n </Label>\r\n <MultiselectAndChipsWithSearch\r\n defaultOptions={categoryTags}\r\n selectedOptions={props.input.value}\r\n buttonText=\"Add category tags\"\r\n buttonClassName=\"regular-case-button\"\r\n onChange={onUpdateCategoryTags}\r\n truncateAtIndex={categoryTags.length}\r\n nestingAllowed={false}\r\n buttonId=\"add-category-tags-button\"\r\n />\r\n </PluginWrapper>\r\n );\r\n};\r\n\r\ninterface ISelectCategoryTags { }\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ISelectCategoryTags) => ({\r\n ...ownProps,\r\n categoryTags: state.categoryTags.userCategoryTags,\r\n shouldFetch: state.categoryTags.shouldFetch,\r\n isInitialLoad: state.categoryTags.isInitialLoad\r\n }),\r\n {\r\n getUserCategoryTags: actions.getUserCategoryTags\r\n }\r\n);\r\n\r\ntype PropsWithRedux = ITinaProps<UserCategoryTag[]> & ConnectedProps<typeof connector>;\r\n\r\nexport default connector(SelectCategoryTags);","import * as React from \"react\";\r\n\r\nimport { Body } from \"modules/common/components/authoring/body\";\r\n\r\nimport Label from \"./common/label\";\r\n\r\n\r\nfunction TinyMCE({ input, meta, field }) {\r\n return (\r\n <div className=\"tinymce\">\r\n {field.label &&\r\n <Label>{field.label}</Label>\r\n }\r\n <Body\r\n body={input.value}\r\n livePreview\r\n floatingToolbar\r\n lcid=\"en-us\"\r\n onChange={(value) => input.onChange(value)}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport default TinyMCE;\r\n","import React from \"react\";\r\n\r\nimport { TinaCMS, TinaProvider } from \"tinacms\";\r\n\r\nimport Checkbox from \"./plugins/checkbox\";\r\nimport CommandBar from \"./plugins/commandBar\";\r\nimport EditNavigationItems from \"./plugins/editNavigationItems\";\r\nimport Image from \"./plugins/image\";\r\nimport Label from \"./plugins/label\";\r\nimport MuiToggle from \"./plugins/muiToggle\";\r\nimport PageDetails from \"./plugins/pageDetails\";\r\nimport PercentageSlider from \"./plugins/percentageSlider\";\r\nimport SectionLabel from \"./plugins/sectionLabel\";\r\nimport { SelectItems } from \"./plugins/selectItems\";\r\nimport SelectTopics from \"./plugins/selectTopics\";\r\nimport SelectCategoryTags from \"./plugins/selectCategoryTags\";\r\nimport TinyMCE from \"./plugins/tinyMCE\";\r\n\r\nimport \"../styles/page.sass\";\r\n\r\n\r\nconst Setup: React.FunctionComponent<{}> = props => {\r\n const cms = new TinaCMS({\r\n enabled: true,\r\n sidebar: {\r\n position: \"displace\"\r\n }\r\n });\r\n\r\n cms.plugins.remove({\r\n __type: \"screen\",\r\n name: \"Media Manager\"\r\n });\r\n\r\n cms.fields.add({ name: \"checkbox\", Component: Checkbox });\r\n cms.fields.add({ name: \"command-bar\", Component: CommandBar });\r\n cms.fields.add({ name: \"edit-navigation-items\", Component: EditNavigationItems });\r\n cms.fields.add({ name: \"hr\", Component: () => <hr /> });\r\n cms.fields.add({ name: \"image\", Component: Image });\r\n cms.fields.add({ name: \"label\", Component: Label });\r\n cms.fields.add({ name: \"mui-toggle\", Component: MuiToggle });\r\n cms.fields.add({ name: \"page-details\", Component: PageDetails });\r\n cms.fields.add({ name: \"percentage-slider\", Component: PercentageSlider });\r\n cms.fields.add({ name: \"section-label\", Component: SectionLabel });\r\n cms.fields.add({ name: \"select-items\", Component: SelectItems });\r\n cms.fields.add({ name: \"select-topics\", Component: SelectTopics });\r\n cms.fields.add({ name: \"select-category-tags\", Component: SelectCategoryTags });\r\n cms.fields.add({ name: \"tinymce\", Component: TinyMCE });\r\n\r\n if (!cms.sidebar!.isOpen)\r\n cms.sidebar!.isOpen = true;\r\n\r\n return (\r\n <TinaProvider cms={cms}>\r\n {props.children}\r\n </TinaProvider >\r\n );\r\n}\r\n\r\nexport default Setup;","import { useEffect, useState } from \"react\";\r\n\r\nimport { ICustomCssModelv1 } from \"api/files\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { fetchCustomCss } from \"modules/portalPages/actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport useIsMounted from \"../useIsMounted\";\r\nimport { useHistory } from \"react-router\";\r\n\r\ntype UseCustomPortalPagesCssContentReturnType = {\r\n customCss?: ICustomCssModelv1;\r\n fetching: boolean;\r\n}\r\n\r\n/**\r\n * Fetch custom css file from blob storage\r\n * @param pageId - DraftId of the page for which to fetch the custom css\r\n * @returns UseCustomPortalPagesCssContentReturnType\r\n */\r\nexport const useCustomPortalPageCssContent = (pageId: string): UseCustomPortalPagesCssContentReturnType => {\r\n const [isLoadingCss, setIsLoadingCss] = useState<boolean>(false);\r\n\r\n const customCssState = useSelector((state: GlobalApplicationState) => state.portalPages.customCss[pageId]);\r\n const fetchingCss = useSelector((state: GlobalApplicationState) => state.portalPages.fetchingCss[pageId]);\r\n\r\n const dispatch = useDispatch();\r\n const isMounted = useIsMounted();\r\n const { location: { pathname } } = useHistory();\r\n\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n try {\r\n setIsLoadingCss(true);\r\n if (pageId && !customCssState && !fetchingCss && !customCssState) {\r\n await dispatch(fetchCustomCss(pageId, pathname));\r\n }\r\n } catch (error) {} \r\n finally {\r\n if (isMounted()) {\r\n setIsLoadingCss(false);\r\n }\r\n }\r\n };\r\n\r\n fetchData();\r\n }, [pageId, fetchingCss, customCssState, dispatch, isMounted]);\r\n\r\n return {\r\n customCss: customCssState,\r\n fetching: isLoadingCss\r\n };\r\n}\r\n","import { useEffect, useState } from \"react\";\r\n\r\nimport { ICustomCssModelv1 } from \"api/files\";\r\nimport useIsMounted from \"../useIsMounted\";\r\n\r\ntype UseCustomLoadCustomCssStylesReturnType = {\r\n isLoadingStyles: boolean;\r\n}\r\n\r\n/**\r\n * Load custom CSS into document head\r\n * @param customCss - the css model to load\r\n * @returns isLoadingStyles - boolean indicating if the styles are loading\r\n */\r\nexport const useLoadCustomCssStyles = (customCss: ICustomCssModelv1 | undefined): UseCustomLoadCustomCssStylesReturnType => {\r\n const isMounted = useIsMounted();\r\n const [isLoadingStyles, setIsLoadingStyles] = useState<boolean>(false);\r\n\r\n useEffect(() => {\r\n if (customCss?.sasUrl) {\r\n setIsLoadingStyles(true);\r\n const existingLinkEl = document.querySelector(`link[href=\"${customCss.sasUrl}\"]`);\r\n \r\n if (!existingLinkEl) {\r\n const linkEl = document.createElement(\"link\");\r\n linkEl.setAttribute(\"rel\", \"stylesheet\");\r\n linkEl.setAttribute(\"type\", \"text/css\");\r\n linkEl.setAttribute(\"href\", customCss.sasUrl);\r\n linkEl.setAttribute(\"id\", \"custom-portal-page-styles\");\r\n \r\n // Listen for the load event to know when the CSS has been applied\r\n linkEl.onload = () => {\r\n if (isMounted()) {\r\n setIsLoadingStyles(false);\r\n }\r\n };\r\n \r\n document.head.appendChild(linkEl);\r\n \r\n return () => {\r\n document.head.removeChild(linkEl);\r\n };\r\n } else {\r\n if (isMounted()) setIsLoadingStyles(false);\r\n }\r\n }\r\n }, [customCss?.sasUrl, isMounted]);\r\n\r\n return {\r\n isLoadingStyles\r\n };\r\n};","import React from \"react\";\r\n\r\nimport { PortalPage } from \"../../models\";\r\n\r\nimport TinaEditor from \"../../tinacms/editor\";\r\nimport TinaCMSWrapper from \"../../tinacms/setup\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { useCustomPortalPageCssContent } from \"modules/common/hooks/data/useCustomPortalPagesCssContent\";\r\nimport { useLoadCustomCssStyles } from \"modules/common/hooks/data/useLoadCustomCssStyles\";\r\n\r\nconst PortalPagesEditor: React.FunctionComponent<PortalPagesEditorProps> = props => {\r\n const { customCss, fetching } = useCustomPortalPageCssContent(props.portalPage.draftId);\r\n const { isLoadingStyles } = useLoadCustomCssStyles(customCss);\r\n\r\n if (fetching || isLoadingStyles) return <Loading />;\r\n return <TinaCMSWrapper> <TinaEditor page={props.portalPage} /> </TinaCMSWrapper>;\r\n}\r\n\r\ninterface PortalPagesEditorProps {\r\n portalPage: PortalPage;\r\n onChangePortalPage: (page: Partial<PortalPage>) => void;\r\n}\r\n\r\nexport default PortalPagesEditor;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { push } from \"react-router-redux\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport { PortalPage } from \"../../models\";\r\nimport PortalPagesEditor from \"./portalPagesEditor\";\r\nimport { setShouldDisplayNav } from \"modules/adminLayout/actionCreator\";\r\n\r\n\r\nclass PortalPagesCreation extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n portalPage: {},\r\n hasError: false,\r\n isFetching: true\r\n };\r\n }\r\n\r\n componentWillMount() {\r\n const draftId = this.props.match.params.draftId;\r\n if (!!draftId) {\r\n this.props.clearChangedSinceSaved();\r\n this.getDraft(draftId);\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.props.setShouldDisplayNav(false);\r\n }\r\n\r\n componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (!!this.props.match.params.draftId && (this.props.match.params.draftId !== prevProps.match.params.draftId)) {\r\n this.setState({ portalPage: {}, hasError: false, isFetching: true });\r\n } else if (this.props.shouldUpdateDraft && !prevProps.shouldUpdateDraft) {\r\n this.updateDraft(this.props.match.params.draftId);\r\n }\r\n }\r\n\r\n public render() {\r\n return (\r\n <div>\r\n <div className=\"portal-pages-page\">\r\n {this.state.isFetching\r\n ? <Loading />\r\n : this.state.hasError\r\n ? <div className=\"no-portal-page-data\">This page could not be loaded.</div>\r\n : <PortalPagesEditor portalPage={this.state.portalPage as PortalPage} onChangePortalPage={this.onChangePortalPage} />\r\n }\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n private getDraft = (draftId: string) => {\r\n this.props.getDraft(draftId).then((portalPage) => {\r\n if (!!portalPage) {\r\n this.setState({ portalPage, hasError: false, isFetching: false });\r\n } else {\r\n this.setState({ hasError: true, isFetching: false });\r\n }\r\n });\r\n }\r\n\r\n private updateDraft = (draftId: string) => {\r\n this.props.getDraft(draftId).then((portalPage) => {\r\n if (!!portalPage)\r\n this.setState({ portalPage: { ...this.state.portalPage, audiences: portalPage.audiences, title: portalPage.title, url: portalPage.url }});\r\n })\r\n }\r\n\r\n private onChangePortalPage = (value: Partial<PortalPage>) => {\r\n const portalPage = { ...this.state.portalPage, ...value };\r\n this.setState({\r\n ...this.state,\r\n portalPage: portalPage\r\n });\r\n this.props.hasChangedSinceSaved();\r\n }\r\n}\r\n\r\n\r\ninterface RouteParams {\r\n tenant: string;\r\n draftId: string;\r\n}\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\ninterface ComponentState {\r\n portalPage: Partial<PortalPage>;\r\n hasError: boolean;\r\n isFetching: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps<RouteParams>) => ({\r\n ...ownProps,\r\n shouldUpdateDraft: state.portalPages.shouldUpdateDraft\r\n }),\r\n {\r\n clearChangedSinceSaved: actions.clearChangedSinceSaved,\r\n getDraft: actions.getDraft,\r\n hasChangedSinceSaved: actions.hasChangedSinceSaved,\r\n redirectTo: push,\r\n setShouldDisplayNav\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(PortalPagesCreation);\r\n","import React from \"react\";\r\nimport moment from \"moment\";\r\n\r\nimport { DocumentFeedItem } from \"../../../../../models\";\r\nimport { DocumentActionButtons } from \"../../documentActionButtons\";\r\nimport { useDefaultLocale } from \"modules/common/hooks/useDefaultLocale\";\r\n\r\nconst Document: React.FunctionComponent<ComponentProps> = props => {\r\n useDefaultLocale();\r\n\r\n const { document } = props;\r\n\r\n return (\r\n <div\r\n onClick={async () => await props.onDocumentSelected(document)}\r\n className=\"document\"\r\n >\r\n <div className=\"details\">\r\n {document.isNew\r\n ? <div className=\"new\">New</div>\r\n : document.isUpdated &&\r\n <div className=\"updated\">Updated</div>\r\n }\r\n <img src={`/images/icons/documents/${document.fileType}.png`} alt={document.fileType} className=\"file-type\" />\r\n <div title={document.title || `${document.fileName}.${document.fileType}`} className=\"title\">{document.title || `${document.fileName}.${document.fileType}`}</div>\r\n {!!document.tags.length &&\r\n <div>Category tags: {document.tags.slice(0, 3).map(tag => tag.name).join(\", \")}{document.tags.length > 3 ? `, ... +${document.tags.length - 3}` : \"\"}</div>\r\n }\r\n </div>\r\n <div className=\"footer\">\r\n {document.isUnread\r\n ? <div className=\"unread\">Unread</div>\r\n : <div className=\"read\">Read {moment(document.lastReadDate).fromNow()}</div>\r\n }\r\n <div onClick={(ev) => ev.stopPropagation()} className=\"footer-options\">\r\n <DocumentActionButtons\r\n document={document}\r\n onDownloadDocument={props.onDownloadDocument}\r\n onInspectDocument={props.onInspectDocument}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n document: DocumentFeedItem;\r\n onDocumentSelected: (document: DocumentFeedItem) => Promise<void>;\r\n onDownloadDocument: (document: DocumentFeedItem) => Promise<void>;\r\n onInspectDocument: (document: DocumentFeedItem) => void;\r\n}\r\n\r\nexport default Document;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { DocumentFeedItem } from \"../../../../../models\";\r\nimport Document from \"./document\";\r\n\r\n\r\nimport \"../../../../../styles/layouts/card.sass\";\r\n\r\n\r\nconst Card: React.FunctionComponent<PropsWithRedux> = props => {\r\n return (\r\n <div className=\"card\">\r\n {props.documents.map(document => (\r\n <Document\r\n key={document.id}\r\n {...props}\r\n document={document}\r\n />\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n onDocumentSelected: (document: DocumentFeedItem) => Promise<void>;\r\n onDownloadDocument: (document: DocumentFeedItem) => Promise<void>;\r\n onInspectDocument: (document: DocumentFeedItem) => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n documents: state.documents.documentFeed.documentFeed.documents\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(Card);","import React from \"react\";\r\n\r\nimport { DocumentFeedItem } from \"../../../../../models\";\r\n\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\n\r\nimport moment from \"moment\";\r\nimport { dateOptions } from \"utils/dateFormatting\";\r\n\r\nimport { DocumentActionButtons } from \"../../documentActionButtons\";\r\nimport { useDefaultLocale } from \"modules/common/hooks/useDefaultLocale\";\r\n\r\n\r\nconst Document: React.FunctionComponent<ComponentProps> = props => {\r\n useDefaultLocale();\r\n\r\n const { document } = props;\r\n\r\n return (\r\n <TableRow\r\n hover\r\n onClick={async () => await props.onDocumentSelected(document)}\r\n key={document.id}\r\n className=\"document\"\r\n >\r\n <TableCell align=\"center\">\r\n <img src={`/images/icons/documents/${document.fileType}-list.png`} alt={document.fileType} className=\"file-type\" />\r\n </TableCell>\r\n <TableCell component=\"th\" scope=\"row\">{document.title || `${document.fileName}.${document.fileType}`}</TableCell>\r\n <TableCell align=\"center\">\r\n {document.isNew\r\n ? <div className=\"new\">New</div>\r\n : document.isUpdated &&\r\n <div className=\"updated\">Updated</div>\r\n }\r\n </TableCell>\r\n <TableCell align=\"center\">{moment(document.lastUpdatedDate).format(dateOptions.basicFormatting)}</TableCell>\r\n <TableCell align=\"center\">\r\n {!!document.tags.length &&\r\n <div>{document.tags.slice(0, 3).map(tag => tag.name).join(\", \")}{document.tags.length > 3 ? `, ... +${document.tags.length - 3}` : \"\"}</div>\r\n }\r\n </TableCell>\r\n <TableCell align=\"center\">\r\n {document.isUnread\r\n ? <div className=\"unread\">Unread</div>\r\n : <div className=\"read\">Read {moment(document.lastReadDate).fromNow()}</div>\r\n }\r\n </TableCell>\r\n <TableCell align=\"center\" onClick={(ev) => ev.stopPropagation()}>\r\n <DocumentActionButtons\r\n document={document}\r\n onDownloadDocument={props.onDownloadDocument}\r\n onInspectDocument={props.onInspectDocument}\r\n />\r\n </TableCell>\r\n </TableRow>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n document: DocumentFeedItem;\r\n onDocumentSelected: (document: DocumentFeedItem) => Promise<void>;\r\n onDownloadDocument: (document: DocumentFeedItem) => Promise<void>;\r\n onInspectDocument: (document: DocumentFeedItem) => void;\r\n}\r\n\r\nexport default Document;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { DocumentFeedItem } from \"../../../../../models\";\r\nimport Document from \"./document\";\r\n\r\nimport Table from \"@mui/material/Table\";\r\nimport TableBody from \"@mui/material/TableBody\";\r\nimport TableCell from \"@mui/material/TableCell\";\r\nimport TableContainer from \"@mui/material/TableContainer\";\r\nimport TableHead from \"@mui/material/TableHead\";\r\nimport TableRow from \"@mui/material/TableRow\";\r\n\r\n\r\nimport \"../../../../../styles/layouts/list.sass\";\r\n\r\n\r\ninterface Header {\r\n alignment: \"center\" | \"left\";\r\n label: string;\r\n}\r\n\r\nconst Headers: Header[] = [\r\n { alignment: \"center\", label: \"\" },\r\n { alignment: \"left\", label: \"Document title\" },\r\n { alignment: \"center\", label: \"\"},\r\n { alignment: \"center\", label: \"Last modified\" },\r\n { alignment: \"center\", label: \"Category tags\" },\r\n { alignment: \"center\", label: \"Read status\" },\r\n { alignment: \"center\", label: \"Actions\" }\r\n];\r\n\r\nconst List: React.FunctionComponent<PropsWithRedux> = props => {\r\n return (\r\n <div className=\"list\">\r\n <TableContainer>\r\n <Table size=\"medium\">\r\n <TableHead>\r\n <TableRow>\r\n {Headers.map((header, index) =>\r\n <TableCell\r\n key={index}\r\n align={header.alignment}\r\n padding=\"normal\"\r\n >\r\n {header.label}\r\n </TableCell>\r\n )}\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {props.documents.map(document => (\r\n <Document\r\n key={document.id}\r\n {...props}\r\n document={document}\r\n />\r\n ))}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n onDocumentSelected: (document: DocumentFeedItem) => Promise<void>;\r\n onDownloadDocument: (document: DocumentFeedItem) => Promise<void>;\r\n onInspectDocument: (document: DocumentFeedItem) => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n documents: state.documents.documentFeed.documentFeed.documents\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(List);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\n// import Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport LockOutlinedIcon from \"@mui/icons-material/LockOutlined\";\r\n\r\n\r\nconst RequestAccess: React.FunctionComponent<PropsWithRedux> = props => {\r\n return (\r\n <Dialog\r\n open={props.show}\r\n maxWidth={false}\r\n scroll=\"paper\"\r\n onClose={props.onClose}\r\n classes={{ paper: \"document-request-access\" }}\r\n >\r\n <div className=\"close-command\">\r\n <IconButton onClick={props.onClose} size=\"large\">\r\n <CloseIcon />\r\n </IconButton>\r\n </div>\r\n <div className=\"request-access-image\">\r\n <LockOutlinedIcon color=\"primary\" className=\"request-access-icon\" />\r\n </div>\r\n <div className=\"request-access-title\">Request Access</div>\r\n <div className=\"request-access-message\">Your account does not have access to this document. You can request access from your administrator.</div>\r\n {/* TODO: Waiting for the backend */}\r\n {/* <div className=\"request-access-option\">\r\n <Button variant=\"contained\" color=\"primary\">Request access</Button>\r\n </div> */}\r\n </Dialog>\r\n );\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean\r\n onClose: () => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(RequestAccess);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport AuthoringSearch from \"modules/common/components/filters/authoringSearch\";\r\nimport FilterContainer from \"modules/common/components/filters/filterContainer\";\r\nimport FilterDropdown from \"modules/common/components/filters/filterDropdown\";\r\n\r\nimport { CategoryTag, DocumentFeedFilters as IDocumentFeedFilters } from \"../../models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Chip from \"@mui/material/Chip\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\n\r\n\r\nimport moment from \"moment\";\r\n\r\n\r\ninterface Option {\r\n id: string;\r\n text: string;\r\n}\r\n\r\nclass DocumentFeedFilters extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n canSearch: !!props.filters.tags!.length || !!props.filters.lcids!.length || !!props.filters.textToSearch,\r\n textToSearch: props.filters.textToSearch || \"\"\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.filters.textToSearch !== prevProps.filters.textToSearch)\r\n this.setState({ textToSearch: this.props.filters.textToSearch || \"\" });\r\n }\r\n\r\n public render() {\r\n const { filters } = this.props;\r\n\r\n const availableLanguages: Option[] = this.getAvailableLanguages();\r\n\r\n return (\r\n <FilterContainer\r\n filters={\r\n <React.Fragment>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.state.textToSearch}\r\n placeholder=\"Search title, key words or author\"\r\n InputProps={{\r\n startAdornment: <SearchIcon className=\"search-icon\" />\r\n }}\r\n onChange={this.onUpdateTextToSearch}\r\n onKeyUp={this.onKeyUp}\r\n className=\"text-to-search\"\r\n />\r\n <div className=\"filter-options-group\">\r\n {availableLanguages.length > 1 &&\r\n <FilterDropdown text=\"Language\">\r\n <List disablePadding>\r\n {availableLanguages.map((language) =>\r\n <ListItem key={language.id} dense button onClick={() => this.onChangeLcids(language.id)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!filters.lcids!.find((lcid) => lcid === language.id)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={language.text} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </FilterDropdown>\r\n }\r\n </div>\r\n {this.props.categoryTags.length > 0 &&\r\n <FilterDropdown\r\n text=\"Category tags\"\r\n footer={\r\n <div>\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onClearCategoryTags}>Clear all</Button>\r\n </div>\r\n }\r\n >\r\n <List disablePadding className=\"category-tags\">\r\n {this.props.categoryTags.map((tag) =>\r\n <ListItem key={tag.id} dense button onClick={() => this.onChangeCategoryTags(tag)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!filters.tags!.find((selectedTag) => selectedTag === tag.id)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={tag.name} />\r\n </ListItem>\r\n )}\r\n </List>\r\n </FilterDropdown>\r\n }\r\n </React.Fragment>\r\n }\r\n filterCommands={\r\n <AuthoringSearch\r\n canSearch={this.state.canSearch}\r\n onApplyFilters={this.onChangeTextToSearch}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n }\r\n filterSelection={this.getFilterSelection()}\r\n />\r\n );\r\n }\r\n\r\n\r\n private getAvailableLanguages = (): Option[] => {\r\n if (!this.props.clientSettings || !this.props.lcidMappings)\r\n return [];\r\n\r\n let availableLanguages: Option[] = [];\r\n Object.keys(this.props.clientSettings.translatedContent).map((lcid) => {\r\n if (!!this.props.lcidMappings[lcid])\r\n availableLanguages.push({ id: lcid, text: this.props.lcidMappings[lcid].language });\r\n return lcid;\r\n });\r\n return availableLanguages;\r\n }\r\n\r\n private getFilterSelection = (): JSX.Element | undefined => {\r\n const { categoryTags, filters, lcidMappings } = this.props;\r\n\r\n if (!filters.textToSearch && !filters.lcids!.length && !filters.availabilities!.length && !filters.tags!.length)\r\n return undefined;\r\n\r\n return (\r\n <React.Fragment>\r\n {!!filters.textToSearch &&\r\n <Chip\r\n key=\"search-text\"\r\n label={`\"${filters.textToSearch}\"`}\r\n onDelete={this.onClearTextToSearch}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n }\r\n {filters.lcids!.map((selectedLcid) =>\r\n <Chip\r\n key={selectedLcid}\r\n label={lcidMappings[selectedLcid].language}\r\n onDelete={() => this.onClearLcid(selectedLcid)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n {categoryTags.length && filters.tags?.map((selectedTag) =>\r\n <Chip\r\n key={selectedTag}\r\n label={categoryTags.find((tag) => tag.id === selectedTag)?.name}\r\n onDelete={() => this.onClearCategoryTag(selectedTag)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n\r\n private onChangeCategoryTags = (tag: CategoryTag) => {\r\n const hasTag: boolean = !!this.props.filters.tags!.find((selectedTag) => selectedTag === tag.id);\r\n if (hasTag)\r\n this.onChangeFilters({ tags: this.props.filters.tags!.filter((selectedTag) => selectedTag !== tag.id) });\r\n else\r\n this.onChangeFilters({ tags: this.props.filters.tags!.concat([tag.id]) });\r\n }\r\n\r\n private onChangeFilters = (value: Partial<IDocumentFeedFilters>) => {\r\n this.props.onChangeFilters({ ...this.props.filters, textToSearch: this.state.textToSearch, ...value });\r\n \r\n let currentFilters = {...this.props.filters, ...value};\r\n if ( currentFilters.availabilities?.length === 0 && currentFilters.lcids?.length === 0 && currentFilters.tags?.length === 0 && this.state.textToSearch === \"\") {\r\n this.clearCanSearch();\r\n }\r\n else {\r\n this.setCanSearch();\r\n }\r\n }\r\n\r\n private onChangeLcids = (lcid: string) => {\r\n const hasSelectedLcid: boolean = !!this.props.filters.lcids!.find((selectedLcid) => selectedLcid === lcid);\r\n if (hasSelectedLcid)\r\n this.onChangeFilters({ lcids: this.props.filters.lcids!.filter((selectedLcid) => selectedLcid !== lcid) });\r\n else\r\n this.onChangeFilters({ lcids: this.props.filters.lcids!.concat([lcid]) });\r\n }\r\n \r\n private onChangeTextToSearch = () => {\r\n this.onChangeFilters({ textToSearch: this.state.textToSearch });\r\n }\r\n\r\n private onClearCategoryTag = (tag: string) => {\r\n this.onChangeFilters({ tags: this.props.filters.tags!.filter((selectedTag) => selectedTag !== tag) });\r\n }\r\n\r\n private onClearCategoryTags = () => {\r\n this.onChangeFilters({ tags: [] });\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.clearCanSearch();\r\n this.props.onClearFilters();\r\n }\r\n\r\n private onClearLcid = (lcid: string) => {\r\n this.onChangeFilters({ lcids: this.props.filters.lcids!.filter((selectedLcid) => selectedLcid !== lcid) });\r\n }\r\n\r\n private onClearTextToSearch = () => {\r\n this.onChangeFilters({ textToSearch: \"\" });\r\n\r\n if(this.hasNoFilters()) {\r\n this.clearCanSearch();\r\n }\r\n }\r\n \r\n private onKeyUp = (key) => {\r\n if (key.keyCode === 13)\r\n this.onChangeTextToSearch();\r\n }\r\n\r\n private onUpdateTextToSearch = (event) => {\r\n this.setState({ textToSearch: event.target.value });\r\n\r\n if(event.target.value !== \"\" && !this.state.canSearch) {\r\n this.setState({canSearch: true});\r\n }\r\n else if(event.target.value === \"\" && this.hasNoFilters()) {\r\n this.setState({canSearch: false});\r\n }\r\n }\r\n\r\n private hasNoFilters = () => {\r\n return (\r\n this.props.filters.availabilities?.length === 0 \r\n && this.props.filters.lcids?.length === 0 \r\n && this.props.filters.tags?.length === 0);\r\n }\r\n\r\n private clearCanSearch = () => {\r\n this.setState({ canSearch: false });\r\n }\r\n\r\n private setCanSearch = () => {\r\n this.setState({ canSearch: true });\r\n }\r\n}\r\n \r\n\r\ninterface ComponentProps {\r\n filters: Partial<IDocumentFeedFilters>;\r\n onChangeFilters: (filters: Partial<IDocumentFeedFilters>) => void;\r\n onClearFilters: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n canSearch: boolean;\r\n textToSearch: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n categoryTags: state.categoryTags.userCategoryTags,\r\n clientSettings: state.settings.clientSettings,\r\n lcidMappings: state.resources.lcidMappings,\r\n showFilters: state.documents.documentFeed.showFilters\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(DocumentFeedFilters);","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as actions from \"modules/documents/actionCreator\";\r\n\r\nimport IconButton from \"@mui/material/IconButton\";\r\n\r\nimport ViewListIcon from \"@mui/icons-material/ViewList\";\r\nimport ViewModuleIcon from \"@mui/icons-material/ViewModule\";\r\n\r\n\r\nconst LayoutSelection: React.FunctionComponent<PropsWithRedux> = props => {\r\n let option: JSX.Element = (\r\n <IconButton size=\"small\" onClick={() => props.setDocumentFeedLayout(\"list\")}>\r\n <ViewListIcon fontSize=\"small\" />\r\n </IconButton>\r\n );\r\n\r\n if (props.layout === \"list\") {\r\n option = (\r\n <IconButton size=\"small\" onClick={() => props.setDocumentFeedLayout(\"card\")}>\r\n <ViewModuleIcon fontSize=\"small\" />\r\n </IconButton>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"layout-selection\">{option}</div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n layout: state.documents.documentFeed.layout\r\n }),\r\n {\r\n setDocumentFeedLayout: actions.setDocumentFeedLayout\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(LayoutSelection);","import React, { useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { DocumentsSort } from \"../../../models\";\r\n\r\nimport List from \"@mui/material/List\";\r\nimport Popover from \"@mui/material/Popover\";\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\n\r\ninterface SortOption {\r\n text: string;\r\n value: DocumentsSort;\r\n}\r\n\r\nconst SortOptions: SortOption[] = [\r\n { text: \"Recently viewed\", value: \"readDescending\" },\r\n { text: \"Newest / Recently updated\", value: \"updatedDescending\" },\r\n { text: \"Oldest first\", value: \"updatedAscending\" },\r\n { text: \"A-Z\", value: \"titleAscending\" },\r\n { text: \"Z-A\", value: \"titleDescending\" }\r\n];\r\n\r\nconst SortSelection: React.FunctionComponent<PropsWithRedux> = props => {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n\r\n const hideAnchorEl = () => setAnchorEl(null);\r\n\r\n return (\r\n <div>\r\n <div onClick={(ev: any) => setAnchorEl(ev.currentTarget)} className=\"sort-selection\">\r\n <span>Sort by</span>\r\n <span className=\"selected-sort\">{SortOptions.find((option) => option.value === props.sort)!.text}</span>\r\n </div>\r\n <Popover\r\n open={!!anchorEl}\r\n anchorEl={anchorEl}\r\n onClose={hideAnchorEl}\r\n anchorOrigin={{\r\n vertical: \"bottom\",\r\n horizontal: \"left\"\r\n }}\r\n >\r\n <List disablePadding>\r\n {SortOptions.map((option) =>\r\n <MoreOptionsItem\r\n key={option.value}\r\n text={option.text}\r\n onClick={() => {\r\n props.onChangeSort(option.value);\r\n hideAnchorEl();\r\n }}\r\n />\r\n )}\r\n </List>\r\n </Popover>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n onChangeSort: (sort: DocumentsSort) => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n sort: state.documents.documentFeed.filters.sort\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(SortSelection);","import React from \"react\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Tabs from \"@mui/material/Tabs\";\r\n\r\nimport { Theme } from \"@mui/material/styles\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n customTab: {\r\n borderRadius: 24,\r\n flexShrink: 0\r\n },\r\n flexContainer: {\r\n \"& > button\": {\r\n margin: \"0 8px\",\r\n \"&:first-child\": {\r\n marginLeft: 0\r\n },\r\n \"&.selected\": {\r\n border: \"1px solid\",\r\n borderColor: theme.palette.primary.main,\r\n padding: \"5px 15px\"\r\n }\r\n }\r\n },\r\n root: {\r\n position: \"relative\",\r\n marginBottom: 10\r\n },\r\n scrollButtons: {\r\n position: \"absolute\",\r\n top: 0,\r\n bottom: 11.5,\r\n backgroundColor: theme.palette.background.paper,\r\n opacity: 1,\r\n zIndex: 1,\r\n \"&:first-child\": {\r\n left: 0\r\n },\r\n \"&:last-child\": {\r\n right: 0\r\n }\r\n }\r\n })\r\n);\r\n\r\nconst RoundedTab = ({selectedTab, value, label, onChangeTab}) => {\r\n const classes = useStyles();\r\n\r\n const selected: boolean = selectedTab === value;\r\n\r\n return (\r\n <Button\r\n variant={selected ? \"contained\" : \"outlined\"}\r\n color=\"primary\"\r\n disableElevation\r\n onClick={() => onChangeTab(value)}\r\n className={`${classes.customTab} ${selected ? \"selected\" : \"\"}`}\r\n >\r\n {label}\r\n </Button>\r\n );\r\n}\r\n\r\nconst RoundedTabs: React.FunctionComponent<ComponentProps> = props => {\r\n const classes = useStyles();\r\n\r\n return (\r\n <Tabs\r\n value={props.selectedTab}\r\n variant=\"scrollable\"\r\n scrollButtons\r\n TabIndicatorProps={{ style: { display: \"none\" } }}\r\n classes={{\r\n flexContainer: classes.flexContainer,\r\n root: classes.root,\r\n scrollButtons: classes.scrollButtons\r\n }}\r\n className={props.className}\r\n allowScrollButtonsMobile>\r\n {props.tabs.map((tab) => (\r\n <RoundedTab key={tab.value} value={tab.value} label={tab.label} {...props} />\r\n ))}\r\n </Tabs>\r\n );\r\n}\r\n\r\ninterface Tab {\r\n label: string;\r\n value: string;\r\n}\r\n\r\ninterface ComponentProps {\r\n tabs: Tab[];\r\n selectedTab: string;\r\n onChangeTab: (tab: string) => void;\r\n className?: string;\r\n}\r\n\r\nexport default RoundedTabs;","import React from \"react\";\r\n\r\nimport { DocumentsView } from \"../../../models\";\r\n\r\nimport RoundedTabs from \"modules/common/components/roundedTabs\";\r\n\r\n\r\nconst Views: React.FunctionComponent<ComponentProps> = props => {\r\n return (\r\n <RoundedTabs\r\n tabs={[\r\n { label: \"All\", value: \"all\" },\r\n { label: \"Recently Updated\", value: \"recentlyUpdated\" },\r\n { label: \"Unread\", value: \"unread\" }\r\n ]}\r\n selectedTab={props.view}\r\n onChangeTab={props.onChangeView}\r\n />\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n view: DocumentsView;\r\n onChangeView: (view: DocumentsView) => void;\r\n}\r\n\r\nexport default Views;","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as actions from \"modules/documents/actionCreator\";\r\nimport * as categoryTagsActions from \"modules/categorytags/actionCreator\";\r\nimport moment from \"moment\";\r\n\r\nimport Loading from \"modules/common/components/loading\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\n\r\nimport { DocumentFeedFilters, DocumentFeedItem, DocumentsSort, DocumentsView } from \"../../models\";\r\nimport { defaultDocumentFeedFilters } from \"../../reducer\";\r\n\r\nimport Card from \"./components/layouts/card\";\r\nimport List from \"./components/layouts/list\";\r\nimport RequestAccess from \"./components/requestAccess\";\r\nimport DocumentView from \"../document-views/documentView\";\r\n\r\nimport Filters from \"../document-filters/documentFeedFilters\";\r\nimport LayoutSelection from \"./components/layoutSelection\";\r\nimport SortSelection from \"./components/sortSelection\";\r\nimport Views from \"./components/views\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport { DocumentActions } from \"./documentActions\";\r\n\r\nimport \"../../styles/documentFeed.sass\";\r\nimport \"../../styles/documentViews.sass\";\r\n\r\nclass DocumentFeed extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n isDownloading: false,\r\n isLoading: false,\r\n selectedDocument: undefined,\r\n showRequestAccess: false,\r\n };\r\n }\r\n \r\n public componentWillMount() {\r\n if (!!this.props.categoryTags && !this.props.categoryTags.length)\r\n this.props.getCategoryTags();\r\n\r\n if (!!this.props.selectedDocumentId) {\r\n this.props.getDocumentDetails(this.props.selectedDocumentId).then((selectedDocument) => {\r\n if (!!selectedDocument)\r\n this.setState({ selectedDocument });\r\n else\r\n this.onShowRequestAccess();\r\n });\r\n }\r\n\r\n if (this.props.shouldFetch) {\r\n this.fetchFeed(1, this.props.filters);\r\n }\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.shouldFetch && (this.props.shouldFetch !== prevProps.shouldFetch)) {\r\n this.fetchFeed(1, this.props.filters);\r\n }\r\n }\r\n\r\n public render() {\r\n const { documentFeed } = this.props;\r\n\r\n if (this.props.shouldFetch || !this.props.currentUser.userId)\r\n return <Loading />;\r\n\r\n return (\r\n <React.Fragment>\r\n <Filters\r\n filters={this.props.filters}\r\n onChangeFilters={this.onChangeFilters}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n <div className=\"view-bar\">\r\n <Views view={this.props.filters.view!} onChangeView={this.changeView} />\r\n <div className=\"view-options\">\r\n <SortSelection onChangeSort={this.changeSort} />\r\n <LayoutSelection />\r\n </div>\r\n </div>\r\n {(!documentFeed.documents.length && this.props.isFetching)\r\n ? (\r\n <Loading />\r\n )\r\n : (\r\n <React.Fragment>\r\n {this.props.filtersApplied &&\r\n <Typography variant=\"h2\" className=\"feed-results\">Results</Typography>\r\n }\r\n {documentFeed.documents.length === 0\r\n ? <div className=\"no-feed\">No documents were found</div>\r\n : this.getLayout()\r\n }\r\n {this.props.canLoadMore && (\r\n this.props.isFetching\r\n ? <Loading />\r\n : <div className=\"feed-buttons\">\r\n <Button variant=\"text\" color=\"primary\" onClick={this.continueFetching}>Load more documents</Button>\r\n </div>\r\n )}\r\n </React.Fragment>\r\n )\r\n }\r\n <DocumentView\r\n show={!!this.state.selectedDocument}\r\n view={this.state.selectedDocument}\r\n onDownloadDocument={this.downloadDocument}\r\n onViewDocument={this.viewDocument}\r\n onClose={this.unselectDocument} />\r\n <RequestAccess show={this.state.showRequestAccess} onClose={this.onCloseRequestAccess} />\r\n <LoadingOverlay absolute={true} show={this.state.isDownloading || this.state.isLoading} />\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n\r\n private changeSort = (sort: DocumentsSort) => {\r\n if (sort !== this.props.filters.sort && !this.props.isFetching) {\r\n this.props.clearDocumentFeed();\r\n this.fetchFeed(1, { ...this.props.filters, sort });\r\n }\r\n }\r\n\r\n private changeView = (view: DocumentsView) => {\r\n if (view !== this.props.filters.view && !this.props.isFetching) {\r\n this.props.clearDocumentFeed();\r\n this.fetchFeed(1, { ...this.props.filters, view });\r\n }\r\n }\r\n\r\n private continueFetching = () => {\r\n this.fetchFeed(this.props.documentFeed.currentPage + 1, this.props.filters);\r\n }\r\n\r\n private updateAction = (selectedDocumentId: string) => {\r\n this.props.updateDocumentFeed(this.props.documentFeed.documents.map((document) => {\r\n if (document.id === selectedDocumentId)\r\n return {\r\n ...document,\r\n isUnread: false,\r\n lastReadDate: new Date().toISOString()\r\n };\r\n return document;\r\n }));\r\n }\r\n\r\n private downloadDocument = async (selectedDocument: DocumentFeedItem) => {\r\n this.setState({ isDownloading: true });\r\n const action = new DocumentActions(() => this.updateAction(selectedDocument.id));\r\n await action.download(selectedDocument);\r\n this.setState({ isDownloading: false });\r\n }\r\n\r\n private fetchFeed = (pageNumber: number, filters: Partial<DocumentFeedFilters>, hasFiltersApplied: boolean = this.props.filtersApplied) => {\r\n this.props.getDocumentFeed(pageNumber, filters, hasFiltersApplied);\r\n }\r\n\r\n private getLayout(): JSX.Element {\r\n if (this.props.layout === \"card\")\r\n return <Card onDocumentSelected={this.selectDocument} onDownloadDocument={this.downloadDocument} onInspectDocument={this.inspectDocument} />;\r\n else\r\n return <List onDocumentSelected={this.selectDocument} onDownloadDocument={this.downloadDocument} onInspectDocument={this.inspectDocument} />;\r\n }\r\n\r\n private selectDocument = async (selectedDocument: DocumentFeedItem) => {\r\n this.setState({ isDownloading: true });\r\n const action = new DocumentActions(() => this.updateAction(selectedDocument.id))\r\n await action.select(selectedDocument);\r\n this.setState({ isDownloading: false });\r\n }\r\n\r\n private inspectDocument = (selectedDocument: DocumentFeedItem) => {\r\n this.setState({selectedDocument})\r\n }\r\n\r\n private unselectDocument = () => {\r\n this.setState({ selectedDocument: undefined });\r\n }\r\n\r\n private viewDocument = async (selectedDocument: DocumentFeedItem) => {\r\n this.setState({ isDownloading: true });\r\n const action = new DocumentActions(() => this.updateAction(selectedDocument.id))\r\n await action.openInNew(selectedDocument);\r\n this.setState({ isDownloading: false });\r\n }\r\n\r\n private onChangeFilters = (filters: Partial<DocumentFeedFilters>) => {\r\n this.props.clearDocumentFeed();\r\n this.fetchFeed(1, { ...this.props.filters, ...filters }, true);\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.props.clearDocumentFeed();\r\n this.fetchFeed(1, { ...defaultDocumentFeedFilters, sort: this.props.filters.sort, view: this.props.filters.view }, false);\r\n }\r\n\r\n private onCloseRequestAccess = () => {\r\n this.setState({ showRequestAccess: false });\r\n }\r\n\r\n private onShowRequestAccess = () => {\r\n this.setState({ showRequestAccess: true });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n selectedDocumentId?: string;\r\n}\r\n\r\ninterface ComponentState {\r\n isDownloading: boolean;\r\n isLoading: boolean;\r\n selectedDocument: DocumentFeedItem | undefined;\r\n showRequestAccess: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n categoryTags: state.categoryTags.userCategoryTags,\r\n documentFeed: state.documents.documentFeed.documentFeed,\r\n canLoadMore: state.documents.documentFeed.documentFeed.currentPage < state.documents.documentFeed.documentFeed.totalPages,\r\n filters: state.documents.documentFeed.filters,\r\n filtersApplied: state.documents.documentFeed.filtersApplied,\r\n isFetching: state.documents.documentFeed.isFetching,\r\n layout: state.documents.documentFeed.layout,\r\n selectedView: state.documents.documentFeed.filters.view,\r\n shouldFetch: state.documents.documentFeed.shouldFetch,\r\n currentUser: state.settings.currentUser\r\n }),\r\n {\r\n clearDocumentFeed: actions.clearDocumentFeed,\r\n getCategoryTags: categoryTagsActions.getUserCategoryTags,\r\n getDocumentDetails: actions.getDocumentDetails,\r\n getDocumentFeed: actions.getDocumentFeed,\r\n hideDocumentFeedFilters: actions.hideDocumentFeedFilters,\r\n updateDocumentFeed: actions.updateDocumentFeed\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(DocumentFeed);","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport BasePage from \"../common/basePage\";\r\nimport Header from \"../common/header\";\r\nimport MainContent from \"../common/mainContent\";\r\n\r\nimport DocumentFeed from \"modules/documents/components/document-feed/documentFeed\";\r\n\r\n\r\nconst DocumentsPage: React.FunctionComponent<PropsWithRedux> = props => {\r\n return (\r\n <BasePage fullWidth>\r\n <Header\r\n title=\"Documents\"\r\n />\r\n <MainContent id=\"document-feed\" addPadding>\r\n <DocumentFeed selectedDocumentId={props.match.params.documentId} />\r\n </MainContent>\r\n </BasePage>\r\n );\r\n}\r\n\r\n\r\ninterface RouteParams {\r\n documentId: string;\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps<RouteParams>) => ({\r\n ...ownProps\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(DocumentsPage);","import { SelectOption } from \"modules/common/models\";\r\nimport { TagSettings } from \"modules/settings\";\r\n\r\nexport const getAvailableTags = (\r\n tagSettings: TagSettings,\r\n tagCounts: { [key: string]: number; } | undefined\r\n): SelectOption[] => {\r\n if (!tagSettings)\r\n return [];\r\n \r\n let availableTags: SelectOption[] = [];\r\n\r\n tagSettings.tagGroups.forEach((tagGroup) => {\r\n\r\n if (tagGroup.tags.length) {\r\n\r\n availableTags.push({ key: tagGroup.id, text: tagGroup.name, type: \"header\" });\r\n\r\n tagGroup.tags.forEach((tag) => {\r\n \r\n if (!tag.disabled) {\r\n \r\n let postCount = tagCounts && tagCounts[tag.id] ? tagCounts[tag.id] : 0;\r\n \r\n availableTags.push({ \r\n key: tag.id, \r\n text: tagCounts ? `${tag.name} (${postCount})` : tag.name,\r\n type: \"item\"\r\n });\r\n }\r\n\r\n });\r\n }\r\n\r\n });\r\n\r\n return availableTags;\r\n}","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { EventFeedFilters } from \"../../../../models\";\r\n\r\nimport AuthoringSearch from \"modules/common/components/filters/authoringSearch\";\r\nimport FilterContainer from \"modules/common/components/filters/filterContainer\";\r\nimport FilterDropdown from \"modules/common/components/filters/filterDropdown\";\r\n\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Chip from \"@mui/material/Chip\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport ListSubheader from \"@mui/material/ListSubheader\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport { SelectOption } from \"modules/common/models\";\r\nimport { tagsApi } from \"api/instances\";\r\nimport { getAvailableTags } from \"utils/filterTagsUtils\";\r\n\r\n\r\nconst availableEventTypes: SelectOption[] = [\r\n { key: \"standard\", text: \"Standard\", type: \"item\" },\r\n { key: \"mandatory\", text: \"Mandatory\", type: \"item\" },\r\n { key: \"informational\", text: \"Informational\", type: \"item\" }\r\n];\r\n\r\nclass Filters extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n canSearch: !!props.filters.eventTypes!.length || !!props.filters.tags!.length || !!props.filters.textToSearch,\r\n lcidToSearch: props.filters.lcidToSearch || \"\",\r\n textToSearch: props.filters.textToSearch || \"\",\r\n tagEventCounts: undefined, // populate after tags are retrieved / component is mounted\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.filters.lcidToSearch !== prevProps.filters.lcidToSearch)\r\n this.setState({ lcidToSearch: this.props.filters.lcidToSearch || \"\" });\r\n\r\n if (this.props.filters.textToSearch !== prevProps.filters.textToSearch)\r\n this.setState({ textToSearch: this.props.filters.textToSearch || \"\" });\r\n }\r\n\r\n public async componentDidMount() {\r\n this.setState({ tagEventCounts: await tagsApi.getTagEventCounts() });\r\n }\r\n\r\n public render() {\r\n const { filters } = this.props;\r\n\r\n const availableTags: SelectOption[] = getAvailableTags(this.props.tagSettings, this.state.tagEventCounts);\r\n\r\n return (\r\n <FilterContainer\r\n filters={\r\n <React.Fragment>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.state.textToSearch}\r\n placeholder=\"Search events\"\r\n InputProps={{\r\n startAdornment: (\r\n <SearchIcon className=\"search-icon\" />\r\n ),\r\n }}\r\n onChange={this.onUpdateTextToSearch}\r\n onKeyUp={this.onKeyUp}\r\n className=\"text-to-search\"\r\n />\r\n <FilterDropdown text=\"Topics\">\r\n <List disablePadding>\r\n {availableTags.map((availableTag) => {\r\n if (availableTag.type === \"header\")\r\n return <ListSubheader key={availableTag.key} disableSticky className=\"select-popover-group-header\">{availableTag.text}</ListSubheader>;\r\n return (\r\n <ListItem key={availableTag.key} dense button onClick={() => this.onChangeTags(availableTag.key)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!filters.tags!.find((selectedTag) => selectedTag === availableTag.key)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={availableTag.text} />\r\n </ListItem>\r\n );\r\n })}\r\n </List>\r\n </FilterDropdown>\r\n <FilterDropdown text=\"Types\">\r\n <List disablePadding>\r\n {availableEventTypes.map((availableEventType) => (\r\n <ListItem key={availableEventType.key} dense button onClick={() => this.onChangeEventTypes(availableEventType.key)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!filters.eventTypes!.find((selectedEventType) => selectedEventType === availableEventType.key)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={availableEventType.text} />\r\n </ListItem>\r\n ))}\r\n </List>\r\n </FilterDropdown>\r\n </React.Fragment>\r\n }\r\n filterCommands={\r\n <AuthoringSearch\r\n canSearch={this.state.canSearch}\r\n onApplyFilters={this.onChangeTextToSearch}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n }\r\n filterSelection={this.getFilterSelection()}\r\n />\r\n );\r\n }\r\n\r\n private getFilterSelection = (): JSX.Element | undefined => {\r\n const { filters } = this.props;\r\n\r\n if (!filters.textToSearch && !filters.tags!.length && !filters.eventTypes!.length)\r\n return undefined;\r\n\r\n const availableTags: SelectOption[] = getAvailableTags(this.props.tagSettings, this.state.tagEventCounts);\r\n\r\n return (\r\n <React.Fragment>\r\n {!!filters.textToSearch &&\r\n <Chip\r\n key=\"search-text\"\r\n label={`\"${filters.textToSearch}\"`}\r\n onDelete={this.onClearTextToSearch}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n }\r\n {filters.tags!.map((selectedTag) =>\r\n <Chip\r\n key={selectedTag}\r\n label={availableTags.find((tag) => tag.key === selectedTag)!.text}\r\n onDelete={() => this.onClearTag(selectedTag)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n {filters.eventTypes!.map((selectedEventType) =>\r\n <Chip\r\n key={selectedEventType}\r\n label={availableEventTypes.find((eventType) => eventType.key === selectedEventType)!.text}\r\n onDelete={() => this.onClearEventType(selectedEventType)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n \r\n private onChangeFilters = (value: Partial<EventFeedFilters>) => {\r\n this.props.onChangeFilters({ ...this.props.filters, lcidToSearch: this.state.lcidToSearch, textToSearch: this.state.textToSearch, ...value, ignoreSubscriptions: true });\r\n\r\n let currentFilters = {...this.props.filters, ...value};\r\n if ( currentFilters.eventTypes?.length === 0 && currentFilters.eventStates?.length === 0 && currentFilters.tags?.length === 0 && this.state.textToSearch === \"\") {\r\n this.clearCanSearch();\r\n }\r\n else {\r\n this.setCanSearch();\r\n }\r\n }\r\n\r\n private onChangeEventTypes = (currentEventType: string) => {\r\n const hasSelectedEventType: boolean = !!this.props.filters.eventTypes!.find((selectedEventType) => selectedEventType === currentEventType);\r\n if (hasSelectedEventType)\r\n this.onChangeFilters({ eventTypes: this.props.filters.eventTypes!.filter((selectedEventType) => selectedEventType !== currentEventType) });\r\n else\r\n this.onChangeFilters({ eventTypes: this.props.filters.eventTypes!.concat([currentEventType]) });\r\n }\r\n\r\n private onChangeLcidToSearch = (lcidToSearch: string) => {\r\n this.onChangeFilters({ lcidToSearch });\r\n }\r\n\r\n private onChangeTags = (currentTag: string) => {\r\n const hasSelectedTag: boolean = !!this.props.filters.tags!.find((selectedTag) => selectedTag === currentTag);\r\n if (hasSelectedTag)\r\n this.onChangeFilters({ tags: this.props.filters.tags!.filter((selectedTag) => selectedTag !== currentTag) });\r\n else\r\n this.onChangeFilters({ tags: this.props.filters.tags!.concat([currentTag]) });\r\n }\r\n\r\n private onChangeTextToSearch = () => {\r\n this.onChangeFilters({ textToSearch: this.state.textToSearch });\r\n }\r\n \r\n private onClearEventType = (eventType: string) => {\r\n this.onChangeFilters({ eventTypes: this.props.filters.eventTypes!.filter((selectedEventType) => selectedEventType !== eventType) });\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.clearCanSearch();\r\n this.props.onClearFilters();\r\n }\r\n\r\n private onClearTag = (tag: string) => {\r\n this.onChangeFilters({ tags: this.props.filters.tags!.filter((selectedTag) => selectedTag !== tag) });\r\n }\r\n\r\n private onClearTextToSearch = () => {\r\n this.onChangeFilters({ textToSearch: \"\" });\r\n\r\n if(this.hasNoFilters()) {\r\n this.clearCanSearch();\r\n }\r\n }\r\n\r\n private onKeyUp = (key) => {\r\n if (key.keyCode === 13)\r\n this.onChangeTextToSearch();\r\n }\r\n\r\n private onUpdateTextToSearch = (event) => {\r\n this.setState({ textToSearch: event.target.value });\r\n\r\n if(event.target.value !== \"\" && !this.state.canSearch) {\r\n this.setState({canSearch: true});\r\n }\r\n else if(event.target.value === \"\" && this.hasNoFilters()) {\r\n this.setState({canSearch: false});\r\n }\r\n }\r\n\r\n private hasNoFilters = () => {\r\n return (this.props.filters.eventTypes?.length === 0 \r\n && this.props.filters.eventStates?.length === 0 \r\n && this.props.filters.tags?.length === 0);\r\n }\r\n \r\n private clearCanSearch = () => {\r\n this.setState({ canSearch: false });\r\n }\r\n\r\n private setCanSearch = () => {\r\n this.setState({ canSearch: true });\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n onChangeFilters: (filters: Partial<EventFeedFilters>) => void;\r\n onClearFilters: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n canSearch: boolean;\r\n lcidToSearch: string;\r\n textToSearch: string;\r\n tagEventCounts: { [key: string]: number; } | undefined;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n filters: state.events.eventsFeed.filters,\r\n clientSettings: state.settings.clientSettings,\r\n lcidMappings: state.resources.lcidMappings,\r\n tagSettings: state.settings.tagSettings\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(Filters);","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport RoundedTabs from \"modules/common/components/roundedTabs\";\r\n\r\n\r\nconst Views: React.FunctionComponent<PropsWithRedux> = props => {\r\n return (\r\n <RoundedTabs\r\n tabs={[\r\n { label: \"Upcoming\", value: \"upcoming\" },\r\n { label: \"Open for RSVP\", value: \"open\" },\r\n { label: \"My events\", value: \"my\" },\r\n { label: \"Past\", value: \"past\" }\r\n ]}\r\n selectedTab={props.selectedView}\r\n onChangeTab={props.onChangeView}\r\n />\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n onChangeView: (view: string) => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n selectedView: state.events.eventsFeed.selectedView\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(Views);","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport * as settingsActions from \"modules/settings/actionCreator\";\r\nimport moment from \"moment\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport * as actions from \"modules/events/actionCreator\";\r\nimport { DialogContentView } from \"modules/common/components/dialogs/dialogContentView\";\r\nimport { FeedButtons } from \"modules/common/components/feed/feedButtons\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport Filters from \"./components/filters/Filters\";\r\nimport Views from \"./components/views/Views\";\r\n\r\nimport { EventFeedFilters } from \"../../models\";\r\nimport EventView from \"../event-views/eventView\";\r\nimport VisualCard from \"./components/layouts/visualCard/VisualCard\";\r\nimport ViewOptions from \"./consts/viewOptions\";\r\n\r\nimport \"../../styles/eventFeed.sass\";\r\nimport \"../../styles/attendance.sass\";\r\n\r\n\r\nclass EventFeed extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n selectedEventId: props.selectedEventId || \"\",\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n\r\n this.props.getTenantConfig();\r\n\r\n if (this.props.shouldFetch) {\r\n this.fetchFeed({...ViewOptions[this.props.selectedView].filters, ...this.props.filters}, true, ViewOptions[this.props.selectedView].sortAscending, 1);\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.shouldFetch && (this.props.shouldFetch !== prevProps.shouldFetch)) {\r\n this.fetchFeed({...ViewOptions[this.props.selectedView].filters, ...this.props.filters}, true, ViewOptions[this.props.selectedView].sortAscending, 1);\r\n }\r\n }\r\n\r\n public render() {\r\n const { eventsFeed } = this.props;\r\n\r\n if (this.props.shouldFetch || !this.props.currentUser.userId)\r\n return <Loading />;\r\n\r\n return (\r\n <React.Fragment>\r\n <Filters\r\n onChangeFilters={this.onChangeFilters}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n <div>\r\n <Views onChangeView={this.changeView} />\r\n {(!eventsFeed.length && this.props.fetching)\r\n ? (\r\n <Loading />\r\n )\r\n : (\r\n <React.Fragment>\r\n {this.props.filtersApplied &&\r\n <Typography variant=\"h2\" className=\"feed-results\">Results</Typography>\r\n }\r\n {eventsFeed.length === 0\r\n ? <div className=\"no-feed\">No events were found</div>\r\n : this.getLayout()\r\n }\r\n <FeedButtons\r\n loadMore={{\r\n isFetching: this.props.fetching,\r\n canLoadMore: this.props.canLoadMore,\r\n onFetchMore: this.continueFetching\r\n }}\r\n />\r\n </React.Fragment>\r\n )\r\n }\r\n <DialogContentView id=\"view-event-dialog\" open={!!this.state.selectedEventId} classes={{ paper: \"dialog-content\" }} onClose={this.unselectEvent}>\r\n <EventView eventId={this.state.selectedEventId} onClose={this.unselectEvent} />\r\n </DialogContentView>\r\n </div>\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n\r\n private onChangeFilters = (filters: Partial<EventFeedFilters>) => {\r\n const updatedFilters = { ...this.props.filters, ...filters };\r\n this.props.clearEventFeed();\r\n this.props.setEventFeedFilters(updatedFilters);\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.props.clearEventFeedFilters();\r\n this.props.clearEventFeed();\r\n }\r\n\r\n private changeView = (view: string) => {\r\n if (view !== this.props.selectedView && !this.props.fetching) {\r\n this.props.setEventFeedView(view);\r\n this.props.clearEventFeed();\r\n this.fetchFeed({ ...ViewOptions[view].filters, ...this.props.filters }, this.props.filtersApplied, ViewOptions[view].sortAscending, 1);\r\n }\r\n }\r\n\r\n\r\n private continueFetching = (newPage: number) => {\r\n const { filters } = this.props;\r\n\r\n const sortAscending: boolean = ViewOptions[this.props.selectedView].sortAscending;\r\n\r\n const updatedFilters = {\r\n ...filters,\r\n ...ViewOptions[this.props.selectedView].filters,\r\n };\r\n this.fetchFeed(updatedFilters, this.props.filtersApplied, sortAscending, newPage);\r\n }\r\n\r\n\r\n private fetchFeed = (filters: Partial<EventFeedFilters>, filtersApplied: boolean, sortAscending: boolean, pageNumber: number) => {\r\n this.props.getEventFeed(filters, filtersApplied, sortAscending, pageNumber);\r\n }\r\n\r\n\r\n private getLayout(): JSX.Element {\r\n return <VisualCard onEventSelected={this.selectEvent} cardCount={3}/>;\r\n }\r\n\r\n private selectEvent = (eventId: string) => {\r\n this.setState({ selectedEventId: eventId });\r\n }\r\n\r\n private unselectEvent = () => {\r\n this.setState({ selectedEventId: \"\" });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n selectedEventId?: string;\r\n}\r\n\r\ninterface ComponentState {\r\n selectedEventId: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n eventsFeed: state.events.eventsFeed.eventsFeed,\r\n canLoadMore: state.events.eventsFeed.canLoadMore,\r\n fetching: state.events.eventsFeed.fetching,\r\n filters: state.events.eventsFeed.filters,\r\n filtersApplied: state.events.eventsFeed.filtersApplied,\r\n selectedView: state.events.eventsFeed.selectedView,\r\n shouldFetch: state.events.eventsFeed.shouldFetch,\r\n currentUser: state.settings.currentUser,\r\n }),\r\n {\r\n clearEventFeed: actions.clearEventFeed,\r\n clearEventFeedFilters: actions.clearEventFeedFilters,\r\n getEventFeed: actions.getEventFeed,\r\n setEventFeedFilters: actions.setEventFeedFilters,\r\n setEventFeedView: actions.setEventFeedView,\r\n getTenantConfig: settingsActions.getTenantSettings\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(EventFeed);\r\n","import { useEffect } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\n\r\nimport { useIsMobileDevice } from \"./useIsMobileDevice\";\r\nimport cookies from \"utils/cookie\";\r\nimport { setMobileAppBannerOpen } from \"modules/userPortalLayout/actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nexport const useOpenMobileAppBanner = () => {\r\n const { isMobile } = useIsMobileDevice();\r\n const userEmail = useSelector((state: GlobalApplicationState) => state.settings.currentUser.email);\r\n const dispatch = useDispatch();\r\n\r\n useEffect(() => {\r\n return () => {\r\n dispatch(setMobileAppBannerOpen(false));\r\n }\r\n }, [dispatch]);\r\n\r\n useEffect(() => {\r\n const shouldShow = isMobile && !cookies.getMobileAppBannerClosed(userEmail);\r\n dispatch(setMobileAppBannerOpen(shouldShow));\r\n }, [dispatch, userEmail, isMobile]);\r\n}\r\n","\r\nexport type UseIsMobileDeviceReturnType = {\r\n isMobile: boolean;\r\n}\r\n\r\n/**\r\n * Detect mobile device by feature detection\r\n */\r\nexport const useIsMobileDevice = (): UseIsMobileDeviceReturnType => {\r\n const isMobileDevice = \"ontouchstart\" in document.documentElement;\r\n\r\n return {\r\n isMobile: isMobileDevice\r\n };\r\n}\r\n","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport BasePage from \"../common/basePage\";\r\nimport Header from \"../common/header\";\r\nimport MainContent from \"../common/mainContent\";\r\n\r\nimport EventsFeed from \"modules/events/components/event-feed/eventFeed\";\r\nimport { useOpenMobileAppBanner } from \"modules/common/hooks/useOpenMobileAppBanner\";\r\n\r\n\r\nconst EventsPage: React.FunctionComponent<PropsWithRedux> = props => {\r\n useOpenMobileAppBanner();\r\n\r\n return (\r\n <BasePage fullWidth>\r\n <Header\r\n title=\"Events\"\r\n />\r\n <MainContent id=\"event-feed\" addPadding>\r\n <EventsFeed selectedEventId={props.match.params.eventId} />\r\n </MainContent>\r\n </BasePage>\r\n );\r\n}\r\n\r\n\r\ninterface RouteParams {\r\n eventId: string;\r\n}\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps<RouteParams>) => ({\r\n ...ownProps\r\n }),\r\n {\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(EventsPage);\r\n","import * as React from \"react\";\r\n\r\nimport TenantLink from \"modules/common/components/tenantLink\";\r\n\r\nimport BasePage from \"../common/basePage\";\r\nimport MainContent from \"../common/mainContent\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\n\r\nconst PageNotFound: React.FunctionComponent<{}> = props => {\r\n return (\r\n <BasePage>\r\n <MainContent addPadding>\r\n <div id=\"page-not-found\">\r\n <img src=\"/images/404.png\" alt=\"404 banner\" />\r\n <Typography variant=\"h1\">Sorry! We can't find what you're looking for.</Typography>\r\n <div>It may have been removed, changed, or is temporarily unavailable.</div>\r\n <div>Explore other sections while we fix the problem!</div>\r\n <TenantLink to=\"~/home\">\r\n <Button variant=\"text\" color=\"primary\">Back to Home</Button>\r\n </TenantLink>\r\n </div>\r\n </MainContent>\r\n </BasePage>\r\n );\r\n}\r\n\r\nexport default PageNotFound;","import * as React from \"react\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport * as actions from \"../../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Loading from \"modules/common/components/loading\";\r\nimport PageNotFound from \"pages/pageNotFound/pageNotFound\";\r\nimport Page from \"../../tinacms/page\";\r\n\r\nimport { NavigationItem } from \"../../models\";\r\nimport { useCustomPortalPageCssContent } from \"modules/common/hooks/data/useCustomPortalPagesCssContent\";\r\nimport { useLoadCustomCssStyles } from \"modules/common/hooks/data/useLoadCustomCssStyles\";\r\nimport useIsMounted from \"modules/common/hooks/useIsMounted\";\r\n\r\ninterface PortalPageViewProps {\r\n portalPageUrl: string;\r\n}\r\n\r\nconst PortalPageView = ({ portalPageUrl, getNavigationItemByURL }: PropsWithRedux) => {\r\n const isMounted = useIsMounted();\r\n const [isLoading, setIsLoading] = useState<boolean>(true);\r\n const [navigationItem, setNavigationItem] = useState<NavigationItem | undefined>(undefined);\r\n const { customCss, fetching } = useCustomPortalPageCssContent(navigationItem?.sourceDraftId || \"\");\r\n const { isLoadingStyles } = useLoadCustomCssStyles(customCss);\r\n\r\n useEffect(() => {\r\n const getNavigationItemByPortalPageURL = async () => {\r\n try {\r\n setIsLoading(true);\r\n const url: string = portalPageUrl || \"home\";\r\n const item = await getNavigationItemByURL(url);\r\n\r\n if (isMounted()) setNavigationItem(item);\r\n } finally {\r\n if (isMounted()) {\r\n setIsLoading(false);\r\n }\r\n }\r\n };\r\n \r\n getNavigationItemByPortalPageURL();\r\n }, [portalPageUrl, getNavigationItemByURL, isMounted]);\r\n\r\n if (isLoading || fetching || isLoadingStyles) return <Loading />;\r\n if (!navigationItem) return <PageNotFound />;\r\n \r\n return <Page data={navigationItem.portalPageJson[0]} />;\r\n};\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: PortalPageViewProps) => ({\r\n ...ownProps,\r\n tenant: state.tenant.id,\r\n tenantSettings: state.settings.clientSettings,\r\n }),\r\n {\r\n getNavigationItemByURL: actions.getNavigationItemByURL,\r\n redirectTo: push,\r\n }\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(PortalPageView);\r\n","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { tagsApi } from \"api/instances\";\r\n\r\nimport { PostFeedFilters } from \"../../../../models\";\r\n\r\nimport AuthoringSearch from \"modules/common/components/filters/authoringSearch\";\r\nimport FilterContainer from \"modules/common/components/filters/filterContainer\";\r\nimport FilterDropdown from \"modules/common/components/filters/filterDropdown\";\r\n\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Chip from \"@mui/material/Chip\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport ListSubheader from \"@mui/material/ListSubheader\";\r\nimport TextField from \"@mui/material/TextField\";\r\n\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport { SelectOption } from \"modules/common/models\";\r\nimport { getAvailableTags } from \"utils/filterTagsUtils\";\r\n\r\n\r\nconst availablePostTypes: SelectOption[] = [\r\n { key: \"standard\", text: \"Standard\", type: \"item\" },\r\n { key: \"mandatory\", text: \"Mandatory\", type: \"item\" },\r\n { key: \"compliance\", text: \"Compliance\", type: \"item\" },\r\n { key: \"public\", text: \"Public\", type: \"item\" }\r\n];\r\n\r\nclass Filters extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n canSearch: !!props.filters.postTypes!.length || !!props.filters.tags!.length || !!props.filters.textToSearch,\r\n lcidToSearch: props.filters.lcidToSearch || \"\",\r\n textToSearch: props.filters.textToSearch || \"\",\r\n tagPostCounts: undefined, // populate after tags are retrieved / component is mounted\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.filters.lcidToSearch !== prevProps.filters.lcidToSearch)\r\n this.setState({ lcidToSearch: this.props.filters.lcidToSearch || \"\" });\r\n \r\n if (this.props.filters.textToSearch !== prevProps.filters.textToSearch)\r\n this.setState({ textToSearch: this.props.filters.textToSearch || \"\" });\r\n }\r\n\r\n public async componentDidMount() {\r\n this.setState({ tagPostCounts: await tagsApi.getTagPostCounts() });\r\n }\r\n\r\n public render() {\r\n const { filters } = this.props;\r\n\r\n const availableTags: SelectOption[] = getAvailableTags(this.props.tagSettings, this.state.tagPostCounts);\r\n\r\n return (\r\n <FilterContainer\r\n filters={\r\n <React.Fragment>\r\n <TextField\r\n variant=\"outlined\"\r\n size=\"small\"\r\n value={this.state.textToSearch}\r\n placeholder=\"Search posts\"\r\n InputProps={{\r\n startAdornment: (\r\n <SearchIcon className=\"search-icon\" />\r\n ),\r\n }}\r\n onChange={this.onUpdateTextToSearch}\r\n onKeyUp={this.onKeyUp}\r\n className=\"text-to-search\"\r\n />\r\n <FilterDropdown text=\"Topics\">\r\n <List disablePadding>\r\n {availableTags.map((availableTag) => {\r\n if (availableTag.type === \"header\")\r\n return <ListSubheader key={availableTag.key} disableSticky className=\"select-popover-group-header\">{availableTag.text}</ListSubheader>;\r\n return (\r\n <ListItem key={availableTag.key} dense button onClick={() => this.onChangeTags(availableTag.key)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!filters.tags!.find((selectedTag) => selectedTag === availableTag.key)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={availableTag.text} />\r\n </ListItem>\r\n );\r\n })}\r\n </List>\r\n </FilterDropdown>\r\n <FilterDropdown text=\"Types\">\r\n <List disablePadding>\r\n {availablePostTypes.map((availablePostType) => (\r\n <ListItem key={availablePostType.key} dense button onClick={() => this.onChangePostTypes(availablePostType.key)}>\r\n <ListItemIcon className=\"callout-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!filters.postTypes!.find((selectedPostType) => selectedPostType === availablePostType.key)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={availablePostType.text} />\r\n </ListItem>\r\n ))}\r\n </List>\r\n </FilterDropdown>\r\n </React.Fragment>\r\n }\r\n filterCommands={\r\n <AuthoringSearch\r\n canSearch={this.state.canSearch}\r\n onApplyFilters={this.onChangeTextToSearch}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n }\r\n filterSelection={this.getFilterSelection()}\r\n />\r\n );\r\n }\r\n\r\n\r\n private getFilterSelection = (): JSX.Element | undefined => {\r\n const { filters } = this.props;\r\n\r\n if (!filters.textToSearch && !filters.tags!.length && !filters.postTypes!.length)\r\n return undefined;\r\n\r\n const availableTags: SelectOption[] = getAvailableTags(this.props.tagSettings, this.state.tagPostCounts);\r\n\r\n return (\r\n <React.Fragment>\r\n {!!filters.textToSearch &&\r\n <Chip\r\n key=\"search-text\"\r\n label={`\"${filters.textToSearch}\"`}\r\n onDelete={this.onClearTextToSearch}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n }\r\n {filters.tags!.map((selectedTag) =>\r\n <Chip\r\n key={selectedTag}\r\n label={availableTags.find((tag) => tag.key === selectedTag)!.text}\r\n onDelete={() => this.onClearTag(selectedTag)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n {filters.postTypes!.map((selectedPostType) =>\r\n <Chip\r\n key={selectedPostType}\r\n label={availablePostTypes.find((postType) => postType.key === selectedPostType)!.text}\r\n onDelete={() => this.onClearPostType(selectedPostType)}\r\n deleteIcon={<CloseIcon />}\r\n />\r\n )}\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n\r\n private onChangeFilters = (value: Partial<PostFeedFilters>) => {\r\n this.props.onChangeFilters({ ...this.props.filters, lcidToSearch: this.state.lcidToSearch, textToSearch: this.state.textToSearch, ...value, ignoreSubscriptions: true });\r\n \r\n let currentFilters = {...this.props.filters, ...value};\r\n if ( currentFilters.postTypes?.length === 0 && currentFilters.postStates?.length === 0 && currentFilters.tags?.length === 0 && this.state.textToSearch === \"\") {\r\n this.clearCanSearch();\r\n }\r\n else {\r\n this.setCanSearch();\r\n }\r\n }\r\n\r\n private onChangeLcidToSearch = (lcidToSearch: string) => {\r\n this.onChangeFilters({ lcidToSearch });\r\n }\r\n\r\n private onChangePostTypes = (currentPostType: string) => {\r\n const hasSelectedPostType: boolean = !!this.props.filters.postTypes!.find((selectedPostType) => selectedPostType === currentPostType);\r\n if (hasSelectedPostType)\r\n this.onChangeFilters({ postTypes: this.props.filters.postTypes!.filter((selectedPostType) => selectedPostType !== currentPostType) });\r\n else\r\n this.onChangeFilters({ postTypes: this.props.filters.postTypes!.concat([currentPostType]) });\r\n }\r\n\r\n private onChangeTags = (currentTag: string) => {\r\n const hasSelectedTag: boolean = !!this.props.filters.tags!.find((selectedTag) => selectedTag === currentTag);\r\n if (hasSelectedTag)\r\n this.onChangeFilters({ tags: this.props.filters.tags!.filter((selectedTag) => selectedTag !== currentTag) });\r\n else\r\n this.onChangeFilters({ tags: this.props.filters.tags!.concat([currentTag]) });\r\n }\r\n\r\n private onChangeTextToSearch = () => {\r\n this.onChangeFilters({ textToSearch: this.state.textToSearch });\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.clearCanSearch();\r\n this.props.onClearFilters();\r\n }\r\n\r\n private onClearPostType = (postType: string) => {\r\n this.onChangeFilters({ postTypes: this.props.filters.postTypes!.filter((selectedPostType) => selectedPostType !== postType) });\r\n }\r\n\r\n private onClearTag = (tag: string) => {\r\n this.onChangeFilters({ tags: this.props.filters.tags!.filter((selectedTag) => selectedTag !== tag) });\r\n }\r\n\r\n private onClearTextToSearch = () => {\r\n this.onChangeFilters({ textToSearch: \"\" });\r\n\r\n if(this.hasNoFilters()) {\r\n this.setState({canSearch: false});\r\n }\r\n }\r\n\r\n private onKeyUp = (key) => {\r\n if (key.keyCode === 13)\r\n this.onChangeTextToSearch();\r\n }\r\n\r\n private onUpdateLcidToSearch = (event) => {\r\n this.setState({ lcidToSearch: event.target.value });\r\n if (!!this.props.filters.textToSearch)\r\n this.onChangeLcidToSearch(event.target.value);\r\n }\r\n\r\n private onUpdateTextToSearch = (event) => {\r\n this.setState({ textToSearch: event.target.value });\r\n\r\n if(event.target.value !== \"\" && !this.state.canSearch) {\r\n this.setState({canSearch: true});\r\n }\r\n else if(event.target.value === \"\" && this.hasNoFilters()) {\r\n this.setState({canSearch: false});\r\n }\r\n }\r\n\r\n private hasNoFilters = () => {\r\n return (\r\n this.props.filters.postTypes?.length === 0 \r\n && this.props.filters.postStates?.length === 0 \r\n && this.props.filters.tags?.length === 0);\r\n }\r\n\r\n private clearCanSearch = () => {\r\n this.setState({ canSearch: false });\r\n }\r\n\r\n private setCanSearch = () => {\r\n this.setState({ canSearch: true });\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n onChangeFilters: (filters: Partial<PostFeedFilters>) => void;\r\n onClearFilters: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n canSearch: boolean;\r\n lcidToSearch: string;\r\n textToSearch: string;\r\n tagPostCounts: { [key: string]: number; } | undefined;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n filters: state.posts.postsFeed.filters,\r\n clientSettings: state.settings.clientSettings,\r\n lcidMappings: state.resources.lcidMappings,\r\n tagSettings: state.settings.tagSettings\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(Filters);","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport * as actions from \"modules/posts/actionCreator\";\r\nimport * as settingsActions from \"modules/settings/actionCreator\";\r\n\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { PostFeedFilters, PostFeedItem } from \"../../models\";\r\nimport { DialogPostView } from \"../post-view/dialogPostView\";\r\nimport Filters from \"./components/filters/Filters\";\r\nimport Card from \"./components/layouts/card/Card\";\r\n\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\nimport { FeedButtons } from \"../../../common/components/feed/feedButtons\";\r\nimport \"./styles/NewsFeed.sass\";\r\n\r\n\r\nclass MyFeed extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n selectedPostId: props.selectedPostId || \"\",\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n this.props.getTenantConfig();\r\n if (this.props.shouldFetch) {\r\n this.fetchFeed({...this.props.filters}, true, 1);\r\n }\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.shouldFetch && (this.props.shouldFetch !== prevProps.shouldFetch)) {\r\n this.fetchFeed({...this.props.filters}, true, 1);\r\n }\r\n }\r\n\r\n public render() {\r\n const { postsFeed } = this.props;\r\n\r\n if (this.props.shouldFetch || !this.props.currentUser.layout)\r\n return <Loading />;\r\n\r\n return (\r\n <div id=\"news-feed\">\r\n <Filters\r\n onChangeFilters={this.onChangeFilters}\r\n onClearFilters={this.onClearFilters}\r\n />\r\n <div>\r\n {(!postsFeed.length && this.props.fetching)\r\n ? <Loading />\r\n : <React.Fragment>\r\n {this.props.filtersApplied &&\r\n <Typography variant=\"h2\" className=\"feed-results\">Results</Typography>\r\n }\r\n {postsFeed.length === 0\r\n ? <div className=\"no-feed\">No posts were found</div>\r\n : this.getLayout(this.props)\r\n }\r\n <FeedButtons\r\n loadMore={{\r\n isFetching: this.props.fetching,\r\n canLoadMore: this.props.canLoadMore,\r\n onFetchMore: this.continueFetching\r\n }}\r\n />\r\n </React.Fragment>\r\n }\r\n <DialogPostView\r\n isPublic\r\n onClose={this.unselectPost}\r\n postId={this.state.selectedPostId}\r\n open={!!this.state.selectedPostId}\r\n />\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n\r\n private onChangeFilters = (filters: Partial<PostFeedFilters>) => {\r\n const updatedFilters = { ...this.props.filters, ...filters };\r\n this.props.clearPostFeed();\r\n this.props.setPostFeedFilters(updatedFilters);\r\n }\r\n\r\n private onClearFilters = () => {\r\n this.props.clearPostFeedFilters();\r\n this.props.clearPostFeed();\r\n }\r\n\r\n private continueFetching = (pageNumber: number) => {\r\n const updatedFilters = {\r\n ...this.props.filters,\r\n };\r\n this.fetchFeed(updatedFilters, this.props.filtersApplied, pageNumber);\r\n }\r\n\r\n\r\n private fetchFeed = (filters: Partial<PostFeedFilters>, filtersApplied: boolean, pageNumber: number) => {\r\n this.props.fetchPostsFeed(filters, filtersApplied, pageNumber);\r\n }\r\n\r\n\r\n /** FUTURE FUNCTIONALITY\r\n * For now, the user portal will all use the 3-card layout.\r\n */\r\n private getLayout(props: PropsWithRedux): JSX.Element {\r\n // switch (this.props.currentUser.layout) {\r\n // case \"card\":\r\n // return <Card cardCount={3} postsFeed={props.postsFeed} onPostSelected={this.selectPost} />;\r\n // case \"column\":\r\n // return <Column cardCount={3} postsFeed={props.postsFeed} preferredLCID={props.currentUser.preferredLCID} onPostSelected={this.selectPost} />;\r\n // case \"window\":\r\n // return <Window cardCount={3} postsFeed={props.postsFeed} preferredLCID={props.currentUser.preferredLCID} onPostSelected={this.selectPost} />;\r\n // default:\r\n // return <Card cardCount={3} postsFeed={props.postsFeed} preferredLCID={props.currentUser.preferredLCID} onPostSelected={this.selectPost} />;\r\n // }\r\n return <Card cardCount={3} postsFeed={props.postsFeed} preferredLCID={props.currentUser.preferredLCID} onPostSelected={this.selectPost} />;\r\n }\r\n\r\n private selectPost = (post: PostFeedItem) => {\r\n this.setState({ selectedPostId: post.id });\r\n if (!post.lastReadTime)\r\n this.props.updatePostsFeed(\r\n this.props.postsFeed.map(article => article.id === post.id && !post.lastReadTime\r\n ? { ...article, lastReadTime: new Date().toISOString() }\r\n : article\r\n )\r\n );\r\n }\r\n\r\n private unselectPost = () => {\r\n this.setState({ selectedPostId: \"\" });\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n selectedPostId?: string;\r\n}\r\n\r\ninterface ComponentState {\r\n selectedPostId: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n postsFeed: state.posts.postsFeed.postsFeed,\r\n canLoadMore: state.posts.postsFeed.canLoadMore,\r\n fetching: state.posts.postsFeed.fetching,\r\n filters: state.posts.postsFeed.filters,\r\n filtersApplied: state.posts.postsFeed.filtersApplied,\r\n shouldFetch: state.posts.postsFeed.shouldFetch,\r\n currentUser: state.settings.currentUser\r\n }),\r\n {\r\n clearPostFeed: actions.clearPostFeed,\r\n clearPostFeedFilters: actions.clearPostFeedFilters,\r\n fetchPostsFeed: actions.fetchPostsFeed,\r\n setPostFeedFilters: actions.setPostFeedFilters,\r\n updatePostsFeed: actions.updatePostsFeed,\r\n getTenantConfig: settingsActions.getTenantSettings\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(MyFeed);\r\n","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport BasePage from \"../common/basePage\";\r\nimport Header from \"../common/header\";\r\nimport MainContent from \"../common/mainContent\";\r\n\r\nimport MyFeed from \"modules/posts/components/post-feed/myFeed\";\r\nimport { useOpenMobileAppBanner } from \"modules/common/hooks/useOpenMobileAppBanner\";\r\n\r\n\r\nconst PostsPage: React.FunctionComponent<PropsWithRedux> = props => {\r\n useOpenMobileAppBanner();\r\n\r\n return (\r\n <BasePage fullWidth>\r\n <Header\r\n title=\"My Feed\"\r\n />\r\n <MainContent addPadding>\r\n <MyFeed selectedPostId={props.match.params.postId} />\r\n </MainContent>\r\n </BasePage>\r\n );\r\n}\r\n\r\n\r\ninterface RouteParams {\r\n postId: string;\r\n}\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps<RouteParams>) => ({\r\n ...ownProps\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(PostsPage);\r\n","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Loading from \"modules/common/components/loading\";\r\nimport PortalPageView from \"modules/portalPages/components/portal-pages-views/portalPageView\";\r\nimport PostsPage from \"pages/posts/postsPage\";\r\n\r\nclass HomePage extends React.Component<PropsWithRedux, {}> {\r\n public render() {\r\n if (!!this.props.id && !this.props.portalPagesEnabled)\r\n return <PostsPage {...this.props} />;\r\n\r\n if (this.props.navigation.shouldFetch || this.props.navigation.isFetching)\r\n return <Loading />;\r\n \r\n if (this.props.portalPagesEnabled && !!this.props.navigation.navigationItems.length)\r\n return (\r\n <PortalPageView portalPageUrl=\"\" />\r\n );\r\n \r\n return (\r\n <PostsPage {...this.props} />\r\n );\r\n }\r\n}\r\n\r\ninterface RouteParams {\r\n portalPageId: string;\r\n postId: string;\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps<RouteParams>) => ({\r\n ...ownProps,\r\n id: state.settings.clientSettings.id,\r\n navigation: state.portalPages.navigation,\r\n portalPagesEnabled: state.settings.clientSettings.portalPagesEnabled\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(HomePage);\r\n","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport PortalPageView from \"modules/portalPages/components/portal-pages-views/portalPageView\";\r\n\r\n\r\nconst PortalPagesPage: React.FunctionComponent<PropsWithRedux> = props => {\r\n return (\r\n <PortalPageView portalPageUrl={props.match.params.portalPageUrl} />\r\n );\r\n}\r\n\r\n\r\ninterface RouteParams {\r\n portalPageUrl: string;\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps<RouteParams>) => ({\r\n ...ownProps\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(PortalPagesPage);","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { postsApi } from \"api/instances\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { PostFeedFilters, PostFeedItem } from \"../../models\";\r\nimport Card from \"./components/layouts/card/Card\";\r\nimport { DialogPostView } from \"../post-view/dialogPostView\";\r\n\r\nimport \"./styles/NewsFeed.sass\";\r\nimport { FeedButtons } from \"../../../common/components/feed/feedButtons\";\r\n\r\nclass PublicFeed extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n canLoadMore: false,\r\n isFetching: true,\r\n postsFeed: [],\r\n selectedPostId: props.selectedPostId || \"\"\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n this.fetchFeed({}, 1);\r\n }\r\n\r\n public render() {\r\n const { postsFeed } = this.state;\r\n\r\n if (this.state.postsFeed.length === 0 && this.state.isFetching)\r\n return <Loading />;\r\n\r\n return (\r\n <div id=\"news-feed\">\r\n {postsFeed.length === 0\r\n ? <div className=\"no-feed\">No posts were found</div>\r\n : this.getLayout({ ...this.props, ...this.state })\r\n }\r\n <FeedButtons\r\n loadMore={{\r\n isFetching: this.state.isFetching,\r\n canLoadMore: this.state.canLoadMore,\r\n onFetchMore: this.continueFetching\r\n }}\r\n />\r\n <DialogPostView\r\n isPublic\r\n open={!!this.state.selectedPostId}\r\n tenantId={this.props.tenantId}\r\n onClose={this.unselectPost}\r\n postId={this.state.selectedPostId}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n private continueFetching = (pageNumber: number) => {\r\n this.fetchFeed({}, pageNumber);\r\n }\r\n\r\n\r\n private fetchFeed = (filters: Partial<PostFeedFilters>, pageNumber: number) => {\r\n this.setState({ isFetching: true });\r\n\r\n postsApi.GetPublicFeed(this.props.tenantId, filters, pageNumber)\r\n .then((postsFeed) => {\r\n this.setState({ canLoadMore: postsFeed.length === 12, isFetching: false, postsFeed: this.state.postsFeed.concat(postsFeed) });\r\n })\r\n .catch(_ => {\r\n this.setState({ canLoadMore: false, isFetching: false, postsFeed: [] });\r\n });\r\n }\r\n\r\n\r\n private getLayout(props: ComponentProps & ComponentState): JSX.Element {\r\n return <Card {...props} cardCount={3} hideReadDate preferredLCID=\"en-us\" onPostSelected={this.selectPost} />;\r\n }\r\n\r\n private selectPost = (post: PostFeedItem) => {\r\n this.setState({ selectedPostId: post.id });\r\n if (!post.lastReadTime)\r\n this.setState({\r\n postsFeed: this.state.postsFeed.map(article => article.id === post.id && !post.lastReadTime\r\n ? { ...article, lastReadTime: new Date().toISOString() }\r\n : article\r\n )\r\n });\r\n }\r\n\r\n private unselectPost = () => {\r\n this.setState({ selectedPostId: \"\" });\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n selectedPostId?: string;\r\n tenantId: string;\r\n}\r\n\r\ninterface ComponentState {\r\n canLoadMore: boolean;\r\n isFetching: boolean;\r\n postsFeed: PostFeedItem[];\r\n selectedPostId: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\nexport default connector(PublicFeed);\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { RouteComponentProps, useHistory, withRouter } from \"react-router-dom\";\r\n\r\nimport BasePage from \"../common/basePage\";\r\nimport Header from \"../common/header\";\r\nimport MainContent from \"../common/mainContent\";\r\nimport PublicFeed from \"modules/posts/components/post-feed/publicFeed\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { useIsAuthenticated } from \"@azure/msal-react\";\r\nimport useIsMounted from \"modules/common/hooks/useIsMounted\";\r\nimport tenantManagementUtils, { ISelectOpt } from \"utils/tenantManagementUtils\";\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\n\r\nconst PublicPostsPage: React.FunctionComponent<RouteComponentProps<RouteParams>> = ({\r\n ...props\r\n}) => {\r\n const [fetching, setFetching] = useState<boolean>(true);\r\n const [errorMessage, setErrorMessage] = useState<string>();\r\n const isAuthenticated = useIsAuthenticated();\r\n const history = useHistory();\r\n const isMounted = useIsMounted();\r\n const { tenant: requestTenantId, postId } = props.match.params;\r\n\r\n useEffect(() => {\r\n // grab authenticated user's tenants and see if they match the public post's\r\n // if so, send user to private feed\r\n const loadTenants = async () => {\r\n try {\r\n setFetching(true)\r\n\r\n const res: ISelectOpt[] = await tenantManagementUtils.setupTenantUserData();\r\n const userBelongsToTenant = res.some((opt: ISelectOpt) => opt.value === requestTenantId);\r\n\r\n if (userBelongsToTenant)\r\n history.push(`/${requestTenantId}/posts/${postId}`);\r\n } catch (err) {\r\n setErrorMessage(\"An error has occured. Please try again later.\");\r\n }\r\n finally {\r\n setFetching(false);\r\n }\r\n };\r\n\r\n if (isAuthenticated)\r\n loadTenants();\r\n else\r\n setFetching(false);\r\n }, [isMounted, history, isAuthenticated, requestTenantId, postId]);\r\n\r\n return (\r\n <BasePage fullWidth>\r\n <Header\r\n title=\"Public Feed\"\r\n />\r\n <MainContent addPadding>\r\n {fetching\r\n ? <Loading />\r\n : <PublicFeed tenantId={requestTenantId} selectedPostId={postId} />}\r\n </MainContent>\r\n {errorMessage && <ErrorSnackbar errorMessage={errorMessage} clearErrorMessage={() => setErrorMessage(undefined)} />}\r\n </BasePage>\r\n );\r\n}\r\n\r\ninterface RouteParams {\r\n tenant: string;\r\n postId: string;\r\n}\r\n\r\nexport default withRouter(PublicPostsPage);\r\n","import React from \"react\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\n\r\nimport BasePage from \"../common/basePage\";\r\nimport Header from \"../common/header\";\r\nimport MainContent from \"../common/mainContent\";\r\n\r\nimport queryString from 'query-string';\r\n\r\n\r\nconst PublicNewsletterUnsubscribedPage: React.FunctionComponent<RouteComponentProps<RouteParams>> = props => {\r\n return (\r\n <BasePage fullWidth>\r\n <Header\r\n title=\"Confirmation\"\r\n />\r\n <MainContent addPadding>\r\n <div>\r\n You have unsubscribed from <span style={{fontStyle:\"italic\", fontWeight:\"bold\"}}>{queryString.parse(props.location.search).newsletter}</span>.\r\n </div>\r\n </MainContent>\r\n </BasePage>\r\n );\r\n}\r\n\r\ninterface RouteParams {\r\n tenant: string;\r\n}\r\n\r\nexport default PublicNewsletterUnsubscribedPage;","import React from \"react\";\r\n\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Select from \"@mui/material/Select\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport { SelectOption } from \"modules/common/models\";\r\n\r\n\r\ninterface SelectFieldProps {\r\n description?: string;\r\n label: string;\r\n options: SelectOption[];\r\n value: string;\r\n disabled?: boolean;\r\n onChange: (event: any) => void;\r\n}\r\n\r\nconst SelectField: React.FunctionComponent<SelectFieldProps> = props => {\r\n return (\r\n <div className=\"section-field\">\r\n <div className=\"section-input-field-heading\">\r\n <label>{props.label}</label>\r\n </div>\r\n <div className=\"section-input-field\">\r\n <FormControl variant=\"outlined\" size=\"small\" fullWidth>\r\n <Select\r\n value={props.value}\r\n fullWidth\r\n disabled={props.disabled}\r\n onChange={(event) => {\r\n if (event.target.value !== props.value)\r\n props.onChange(event);\r\n }}\r\n >\r\n {props.options.map((option) => <MenuItem key={option.key} value={option.key}>{option.text}</MenuItem>)}\r\n </Select>\r\n {props.description &&\r\n <Typography variant=\"caption\">{props.description}</Typography>\r\n }\r\n </FormControl>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default SelectField;","import React from \"react\";\r\n\r\nimport FormControl from \"@mui/material/FormControl\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\nimport Select from \"@mui/material/Select\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport { SelectOption } from \"modules/common/models\";\r\n\r\n\r\ninterface DialogSelectFieldProps {\r\n description?: string;\r\n label: string;\r\n options: SelectOption[];\r\n value: string;\r\n disabled?: boolean;\r\n onChange: (event: any) => void;\r\n}\r\n\r\nconst DialogSelectField: React.FunctionComponent<DialogSelectFieldProps> = props => {\r\n return (\r\n <div className=\"dialog-field\">\r\n <div className=\"dialog-field-heading\">\r\n <label>{props.label}</label>\r\n </div>\r\n <div>\r\n <FormControl variant=\"outlined\" size=\"small\" fullWidth>\r\n <Select\r\n value={props.value}\r\n fullWidth\r\n disabled={props.disabled}\r\n onChange={(event) => {\r\n if (event.target.value !== props.value)\r\n props.onChange(event);\r\n }}\r\n >\r\n {props.options.map((option) => <MenuItem key={option.key} value={option.key}>{option.text}</MenuItem>)}\r\n </Select>\r\n {props.description &&\r\n <Typography variant=\"caption\">{props.description}</Typography>\r\n }\r\n </FormControl>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default DialogSelectField;","import React from \"react\";\r\n\r\nimport Switch from \"@mui/material/Switch\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\n\r\ninterface DialogSwitchFieldProps {\r\n description?: string;\r\n label: string;\r\n value: boolean;\r\n disabled?: boolean;\r\n onChange: (event: any, checked: boolean) => void;\r\n}\r\n\r\nconst DialogSwitchField: React.FunctionComponent<DialogSwitchFieldProps> = props => {\r\n return (\r\n <div className=\"dialog-field dialog-switch-field\">\r\n <div className=\"dialog-field-heading\">\r\n <label>{props.label}</label>\r\n {props.description &&\r\n <Typography variant=\"caption\">{props.description}</Typography>\r\n }\r\n </div>\r\n <div>\r\n <Switch\r\n color=\"primary\"\r\n checked={props.value}\r\n disabled={props.disabled}\r\n onChange={props.onChange}\r\n />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default DialogSwitchField;","import React, { useEffect, useState } from \"react\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport PhoneInput from \"react-phone-input-2\";\r\nimport { Button, Grid, useTheme } from \"@mui/material\";\r\nimport 'react-phone-input-2/lib/material.css'\r\nimport \"modules/profile/styles/profile.sass\";\r\nimport { removeLeftoverCountryCode, setVerify } from \"utils/phoneInputFunctions\";\r\nimport { removeNonDigits } from \"utils/regexUserValidation\";\r\n\r\ninterface PhoneFieldProps {\r\n description?: string;\r\n label: string;\r\n value: string;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n country: string;\r\n enableSearch: boolean;\r\n autoFormat: boolean;\r\n specialLabel?: string;\r\n disabledDropDown?: boolean;\r\n onChange?: (event: any) => void;\r\n onVerifySms?: () => void;\r\n}\r\nconst PhoneField: React.FunctionComponent<PhoneFieldProps> = (props) => {\r\n const styles = useTheme();\r\n const [isActive, setActive] = useState(false);\r\n const [isVerifyDisabled, setVerifyDisabled] = useState(false);\r\n\r\n const disabledColor = \"#3b78ab\";\r\n const currSecondStyles = styles.palette.secondary.main\r\n\r\n const styleInputClasses = \"MuiOutlinedInput-input MuiInputBase-inputMarginDense MuiOutlinedInput-inputMarginDense react-tel-input\";\r\n\r\n useEffect(() => {\r\n }, [isActive, isVerifyDisabled])\r\n\r\n return (\r\n <div className=\"section-field\">\r\n <div className=\"section-input-field-heading\">\r\n <label>{props.label}</label>\r\n </div>\r\n <div className=\"section-input-field\">\r\n <PhoneInput\r\n inputClass={ styleInputClasses }\r\n inputStyle={{ boxShadow: \"none\", border: isActive && !props.disabled ? \"solid 2px \" + currSecondStyles : \"\", width: \"100%\", padding: \"10.5px 14.5px 10.5px 50px\" }}\r\n searchStyle={{ width: \"93%\", padding: \"4px\", height: \"40px\", maxHeight: \"100%\" }}\r\n dropdownStyle={{ maxHeight: \"320px\" }}\r\n searchPlaceholder=\"Search country\"\r\n key={props.value}\r\n autoFormat={props.autoFormat}\r\n country={props.country}\r\n value={props.value}\r\n disableDropdown={props.disabledDropDown ?? true}\r\n enableSearch={props.enableSearch}\r\n placeholder={props.disabled ? \"\" : props.placeholder}\r\n disabled={props.disabled}\r\n specialLabel={props.specialLabel ?? \"\"}\r\n onFocus={() => setActive(true)}\r\n onChange={(e) => {\r\n setVerifyDisabled(setVerify(e));\r\n }}\r\n onBlur={(event) => {\r\n event.target.value = removeLeftoverCountryCode(event.target.value);\r\n //Clean the values as it was causing minor bugs in the front end.\r\n event.target.value= event.target.value.replace(removeNonDigits, '');\r\n\r\n if (!!props.onChange && event.target.value !== props.value) props.onChange(event);\r\n \r\n setActive(false);\r\n }}\r\n />\r\n <Grid justifyContent=\"space-between\" container >\r\n <Grid item>\r\n {props.description && <Typography variant=\"caption\">{props.description}</Typography>}\r\n </Grid>\r\n <Grid item>\r\n {props.onVerifySms &&\r\n <Button disabled={isVerifyDisabled} onClick={props.onVerifySms} style={{ color: isVerifyDisabled ? \"\" : disabledColor, height: '20px', textDecoration: \"underline\", background: \"transparent\", fontSize: \"11px\" }}>\r\n Verify mobile number\r\n </Button>\r\n}\r\n </Grid>\r\n </Grid>\r\n </div>\r\n </div>\r\n );\r\n};\r\nexport default PhoneField;","import React, { useState } from \"react\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Dialog from \"@mui/material/Dialog\";\r\nimport DialogActions from \"@mui/material/DialogActions\";\r\nimport DialogContent from \"@mui/material/DialogContent\";\r\nimport DialogContentText from \"@mui/material/DialogContentText\";\r\nimport DialogTitle from \"@mui/material/DialogTitle\";\r\nimport PhoneField from \"../common/phoneField\";\r\n\r\n\r\nconst PreferredSMSPhoneDialog: React.FunctionComponent<ComponentProps> = props => {\r\n const [preferredSMSPhone, setPreferredSMSPhone] = useState(props.preferredSMSPhone);\r\n\r\n return (\r\n <Dialog\r\n open={props.show}\r\n onClose={props.onClose}\r\n classes={{ container: \"my-profile-confirmation-dialog\", paper: \"my-profile-confirmation-dialog-paper\" }}\r\n >\r\n <DialogTitle>SMS notifications & alerts</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText>Add and save your mobile number to turn on SMS notifications and alerts.</DialogContentText>\r\n <PhoneField\r\n label=\"\"\r\n specialLabel=\"Mobile No.\"\r\n country={\"us\"}\r\n enableSearch={false}\r\n autoFormat={true}\r\n disabledDropDown={true}\r\n placeholder=\"Enter mobile number\"\r\n value={preferredSMSPhone}\r\n onChange={(event) => setPreferredSMSPhone(event.target.value)}\r\n />\r\n </DialogContent>\r\n <DialogActions>\r\n <Button variant=\"text\" color=\"info\" onClick={props.onClose}>Cancel</Button>\r\n <Button variant=\"text\" color=\"primary\" disabled={!preferredSMSPhone} onClick={() => props.onChange(preferredSMSPhone)}>Save</Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n preferredSMSPhone: string;\r\n onChange: (preferredSMSPhone: string) => void;\r\n onClose: () => void;\r\n}\r\n\r\nexport default PreferredSMSPhoneDialog;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { CommentNotificationSettings } from \"modules/settings/models\";\r\nimport DialogSelectField from \"./common/dialogSelectField\";\r\nimport DialogSwitchField from \"./common/dialogSwitchField\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport Drawer from \"@mui/material/Drawer\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport Paper from \"@mui/material/Paper\";\r\n\r\nimport ArrowBackIcon from \"@mui/icons-material/ArrowBack\";\r\nimport PreferredSMSPhoneDialog from \"./dialogs/preferredSMSPhoneDialog\";\r\n\r\n\r\nclass Notifications extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n hasChanges: false,\r\n chatEnabled: props.userSettings.chatEnabled,\r\n commentNotificationSettings: props.userSettings.commentNotificationSettings,\r\n preferredSMSConsent: props.userSettings.preferredSMSConsent,\r\n preferredSMSPhone: props.userSettings.preferredSMSPhone,\r\n sendNotificationsWhenAuthor: props.userSettings.sendNotificationsWhenAuthor,\r\n showPreferredSMSPhoneDialog: false,\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (this.props.show && prevProps.show !== this.props.show)\r\n this.onReset();\r\n }\r\n\r\n public render() {\r\n const { commentsEnabled, notificationSettings } = this.props;\r\n const commentNotificationsEnabled = notificationSettings.postCommentCreatedTeamsAttempt.toggle || notificationSettings.postCommentCreatedMobileAttempt.toggle;\r\n const showCommentOptions = commentsEnabled && commentNotificationsEnabled;\r\n\r\n return (\r\n <Drawer anchor=\"right\" open={this.props.show} onClose={this.onSave} classes={{ paper: \"my-profile-dialog-drawer\" }} className=\"my-profile-dialog\">\r\n <Paper square elevation={0} className=\"my-profile-dialog-header\">\r\n <IconButton onClick={this.onSave} size=\"large\">\r\n <ArrowBackIcon />\r\n </IconButton>\r\n <div>Notifications</div>\r\n </Paper>\r\n {showCommentOptions &&\r\n <>\r\n <DialogSwitchField\r\n label=\"Notify me of comments for posts I've published or authored\"\r\n value={this.state.sendNotificationsWhenAuthor}\r\n onChange={this.onChangeSendNotificationsWhenAuthor}\r\n />\r\n <DialogSelectField\r\n label=\"Notify me of comments on\"\r\n options={[\r\n { key: \"accessible\", text: \"All posts I have access to\", type: \"item\" },\r\n { key: \"engaged\", text: \"All posts I have commented on or reacted to\", type: \"item\" },\r\n { key: \"subscribed\", text: \"All posts I'm subscribed to\", type: \"item\" },\r\n { key: \"none\", text: \"None\", type: \"item\" }\r\n ]}\r\n value={this.state.commentNotificationSettings}\r\n onChange={this.onChangeCommentNotificationSettings}\r\n />\r\n </>\r\n }\r\n {this.props.chatEnabled &&\r\n <DialogSwitchField\r\n label=\"Receive chat notifications\"\r\n description=\"Get notified whenever you receive a new chat message\"\r\n value={this.state.chatEnabled}\r\n onChange={this.onChangeChatEnabled}\r\n />\r\n }\r\n <DialogSwitchField\r\n label=\"SMS notifications & alerts\"\r\n description=\"Send me notifications via SMS\"\r\n value={!!this.state.preferredSMSConsent}\r\n onChange={this.onChangePreferredSMSConsent}\r\n />\r\n <Divider light />\r\n <div className=\"reset-dialog\">\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onReset}>Reset notifications</Button>\r\n </div>\r\n <PreferredSMSPhoneDialog\r\n show={this.state.showPreferredSMSPhoneDialog}\r\n preferredSMSPhone={this.state.preferredSMSPhone}\r\n onChange={this.onChangePreferredSMSPhone}\r\n onClose={this.onHidePreferredSMSPhoneDialog}\r\n />\r\n </Drawer>\r\n );\r\n }\r\n\r\n\r\n private onSave = () => {\r\n if (this.state.hasChanges)\r\n this.props.saveUserSettings({\r\n chatEnabled: this.state.chatEnabled,\r\n commentNotificationSettings: this.state.commentNotificationSettings,\r\n preferredSMSConsent: this.state.preferredSMSPhone !== this.props.userSettings.preferredSMSPhone ? null : this.state.preferredSMSConsent,\r\n preferredSMSPhone: this.state.preferredSMSPhone,\r\n sendNotificationsWhenAuthor: this.state.sendNotificationsWhenAuthor,\r\n });\r\n this.props.onClose();\r\n }\r\n\r\n\r\n private onChangeChatEnabled = (event, checked) => {\r\n this.setState({ hasChanges: true, chatEnabled: checked });\r\n }\r\n\r\n private onChangeCommentNotificationSettings = (event) => {\r\n this.setState({ hasChanges: true, commentNotificationSettings: event.target.value });\r\n }\r\n\r\n private onChangePreferredSMSConsent = (event, checked) => {\r\n if (!checked) {\r\n this.setState({ hasChanges: true, preferredSMSConsent: false });\r\n } else {\r\n if (!this.state.preferredSMSPhone)\r\n this.onShowPreferredSMSPhoneDialog();\r\n else\r\n this.setState({ hasChanges: true, preferredSMSConsent: true });\r\n }\r\n }\r\n\r\n private onChangePreferredSMSPhone = (preferredSMSPhone: string) => {\r\n const preferredSMSConsent: boolean | null = !!preferredSMSPhone ? true : null;\r\n\r\n this.props.saveUserSettings({\r\n preferredSMSConsent,\r\n preferredSMSPhone\r\n });\r\n this.setState({ preferredSMSConsent, preferredSMSPhone, showPreferredSMSPhoneDialog: false });\r\n }\r\n\r\n private onChangeSendNotificationsWhenAuthor = (event, checked) => {\r\n this.setState({ hasChanges: true, sendNotificationsWhenAuthor: checked });\r\n }\r\n\r\n private onReset = () => {\r\n this.setState({\r\n hasChanges: false,\r\n chatEnabled: this.props.userSettings.chatEnabled,\r\n commentNotificationSettings: this.props.userSettings.commentNotificationSettings,\r\n preferredSMSConsent: this.props.userSettings.preferredSMSConsent,\r\n preferredSMSPhone: this.props.userSettings.preferredSMSPhone,\r\n sendNotificationsWhenAuthor: this.props.userSettings.sendNotificationsWhenAuthor,\r\n });\r\n }\r\n\r\n\r\n private onHidePreferredSMSPhoneDialog = () => {\r\n this.setState({ showPreferredSMSPhoneDialog: false });\r\n }\r\n\r\n private onShowPreferredSMSPhoneDialog = () => {\r\n this.setState({ showPreferredSMSPhoneDialog: true });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n onClose: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n hasChanges: boolean;\r\n chatEnabled: boolean;\r\n commentNotificationSettings: CommentNotificationSettings;\r\n preferredSMSConsent: boolean | null;\r\n preferredSMSPhone: string;\r\n sendNotificationsWhenAuthor: boolean;\r\n showPreferredSMSPhoneDialog: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n chatEnabled: state.settings.clientSettings.chatEnabled,\r\n userSettings: state.profile.userSettings!,\r\n commentsEnabled: state.settings.clientSettings.commentSystem.enabled,\r\n notificationSettings: state.settings.notificationSettings.settings\r\n }),\r\n {\r\n saveUserSettings: actions.saveUserSettings\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(Notifications);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport { ClientSettingsTag, ClientSettingsTagGroup } from \"modules/settings/models\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Checkbox from \"@mui/material/Checkbox\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport Drawer from \"@mui/material/Drawer\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport List from \"@mui/material/List\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport Paper from \"@mui/material/Paper\";\r\n\r\nimport ArrowBackIcon from \"@mui/icons-material/ArrowBack\";\r\nimport LockIcon from \"@mui/icons-material/Lock\";\r\n\r\n\r\nclass TagSubscriptions extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n hasChanges: false,\r\n subscribedTags: props.userSettings.subscribedTags\r\n };\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if ((this.props.show && prevProps.show !== this.props.show) ||\r\n prevProps.userSettings.subscribedTags.length !== this.props.userSettings.subscribedTags.length)\r\n this.setState({ hasChanges: false, subscribedTags: this.props.userSettings.subscribedTags });\r\n }\r\n\r\n public render() {\r\n return (\r\n <Drawer anchor=\"right\" open={this.props.show} onClose={this.onSave} classes={{ paper: \"my-profile-dialog-drawer\" }} className=\"my-profile-dialog\">\r\n <Paper square elevation={0} className=\"my-profile-dialog-header\">\r\n <IconButton onClick={this.onSave} size=\"large\">\r\n <ArrowBackIcon />\r\n </IconButton>\r\n <div>Edit topic subscriptions</div>\r\n </Paper>\r\n <List>\r\n {this.props.tagSettings.tagGroups.map((tagGroup) => {\r\n const tagGroupChecked: boolean = tagGroup.tags.filter((tag) => !!this.state.subscribedTags.find((subscribedTag) => subscribedTag === tag.id)).length === tagGroup.tags.length;\r\n const tagGroupDisabled: boolean = tagGroup.tags.filter((tag) => tag.mandatory).length === tagGroup.tags.length;\r\n return (\r\n <React.Fragment key={tagGroup.id}>\r\n <ListItem dense button disabled={tagGroupDisabled} onClick={() => this.onSelectTagGroup(tagGroup, !tagGroupChecked)}>\r\n <ListItemIcon className=\"tags-list-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={tagGroupChecked}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={tagGroup.name} classes={{ primary: \"tags-list-tag-group-text\" }} />\r\n </ListItem>\r\n <List disablePadding className=\"tags-list-tags\">\r\n {tagGroup.tags.map((tag) =>\r\n <ListItem key={tag.id} dense button disabled={tag.mandatory} onClick={() => this.onSelectTag(tag)}>\r\n <ListItemIcon className=\"tags-list-checkbox\">\r\n <Checkbox\r\n edge=\"start\"\r\n tabIndex={-1}\r\n disableRipple\r\n size=\"small\"\r\n color=\"primary\"\r\n checked={!!this.state.subscribedTags.find((subscribedTag) => subscribedTag === tag.id)}\r\n />\r\n </ListItemIcon>\r\n <ListItemText primary={tag.name} />\r\n {tag.restricted && <LockIcon fontSize=\"small\" className=\"restricted-tag-icon\" />}\r\n </ListItem>\r\n )}\r\n </List>\r\n </React.Fragment>\r\n );\r\n })}\r\n </List>\r\n <Divider light />\r\n <div className=\"reset-dialog\">\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onReset}>Reset subscriptions</Button>\r\n </div>\r\n </Drawer>\r\n );\r\n }\r\n\r\n\r\n private onSave = () => {\r\n if (this.state.hasChanges)\r\n this.props.saveUserSettings({ subscribedTags: this.state.subscribedTags });\r\n this.props.onClose();\r\n }\r\n\r\n private onReset = () => {\r\n this.setState({ hasChanges: false, subscribedTags: this.props.userSettings.subscribedTags });\r\n }\r\n\r\n private onChangeSubscribedTags = (subscribedTags: string[]) => {\r\n this.setState({ hasChanges: true, subscribedTags });\r\n }\r\n \r\n private onSelectTag = (tag: ClientSettingsTag) => {\r\n const hasSelectedTag: boolean = !!this.state.subscribedTags.find((subscribedTag) => subscribedTag === tag.id);\r\n if (hasSelectedTag)\r\n this.onChangeSubscribedTags(this.state.subscribedTags.filter((subscribedTag) => subscribedTag !== tag.id));\r\n else\r\n this.onChangeSubscribedTags(this.state.subscribedTags.concat(tag.id));\r\n }\r\n\r\n private onSelectTagGroup = (tagGroup: ClientSettingsTagGroup, checked: boolean) => {\r\n let tags: string[] = this.state.subscribedTags.slice();\r\n\r\n if (checked) {\r\n tagGroup.tags.map((tag) => {\r\n tags.push(tag.id);\r\n return tag;\r\n });\r\n tags = tags.filter((tag) => tag);\r\n } else {\r\n tagGroup.tags.map((tag) => {\r\n if (!tag.mandatory)\r\n tags = tags.filter((tagToFilter) => tagToFilter !== tag.id);\r\n return tag;\r\n });\r\n }\r\n\r\n this.onChangeSubscribedTags(tags);\r\n }\r\n}\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n onClose: () => void;\r\n}\r\n\r\ninterface ComponentState {\r\n hasChanges: boolean;\r\n subscribedTags: string[];\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n tagSettings: state.settings.tagSettings,\r\n userSettings: state.profile.userSettings!\r\n }),\r\n {\r\n saveUserSettings: actions.saveUserSettings\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(TagSubscriptions);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport moment from \"moment\";\r\n\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { ClientSettingsTag, ClientSettingsTagGroup } from \"modules/settings/models\";\r\nimport SelectField from \"./common/selectField\";\r\nimport Notifications from \"./notifications\";\r\nimport TagSubscriptions from \"./tagSubscriptions\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Collapse from \"@mui/material/Collapse\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport Chip from \"@mui/material/Chip\";\r\n\r\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\r\nimport { SelectOption } from \"modules/common/models\";\r\n\r\n\r\nclass Preferences extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n showEditNotifications: false,\r\n showEditTopicSubscriptions: false,\r\n showMoreTopics: false\r\n };\r\n }\r\n\r\n public componentDidMount() {\r\n moment.locale(\"en\");\r\n }\r\n\r\n public render() {\r\n const { userSettings } = this.props;\r\n\r\n const availableLanguages: SelectOption[] = this.getAvailableLanguages();\r\n const tagGroups: ClientSettingsTagGroup[] = this.getTags();\r\n const showTopicsOption: boolean = this.checkShouldShowTopicsOption(tagGroups);\r\n\r\n if (!userSettings)\r\n return <Loading />;\r\n\r\n return (\r\n <section>\r\n <div className=\"section-heading\">\r\n <Typography variant=\"h2\">Preferences<InfoHover>Customize personal setting for your feeds, notifications, and more.</InfoHover></Typography>\r\n </div>\r\n {availableLanguages.length > 1 &&\r\n <SelectField\r\n description=\"If a post is available in the selected language preference, it will display this preference first.\"\r\n label=\"Preferred language\"\r\n options={availableLanguages}\r\n value={userSettings.preferredLCID}\r\n onChange={this.onChangePreferredLCID}\r\n />\r\n }\r\n <div className=\"section-field section-field-button\" onClick={this.onShowEditNotifications}>\r\n <div>\r\n <label>Notifications</label>\r\n <Typography variant=\"caption\" className=\"italicized-description\">{this.getNotificationsDescription()}</Typography>\r\n </div>\r\n <ChevronRightIcon />\r\n </div>\r\n <div className=\"section-field section-field-selection\">\r\n <div>\r\n <label>Topic Subscriptions</label>\r\n <Typography variant=\"caption\">Select topics of interest to filter what content will be prioritized on your feeds.</Typography>\r\n </div>\r\n <Button variant=\"text\" color=\"primary\" onClick={this.onShowEditTopicSubscriptions}>Edit Topic Subscriptions</Button>\r\n </div>\r\n <div id=\"subscribed-tags-bubbles\">\r\n {tagGroups.map((tagGroup) => {\r\n return (\r\n <div key={tagGroup.id} className=\"tag-group\">\r\n <div className=\"tag-group-name\">{tagGroup.name}</div>\r\n <div>\r\n {tagGroup.tags.slice(0, 4).map((tag, index) => (\r\n <Chip className=\"chip-styling\" key={tag.id} label={tag.name}/>\r\n ))}\r\n {tagGroup.tags.length === 5 &&\r\n <Chip key={tagGroup.tags[4].id} label={tagGroup.tags[4].name} className=\"chip-styling\"/>\r\n }\r\n {tagGroup.tags.length > 5 &&\r\n <React.Fragment>\r\n <Collapse in={this.state.showMoreTopics}>\r\n {tagGroup.tags.slice(4).map((tag) => (\r\n <Chip key={tag.id} label={tag.name} className=\"chip-styling\"/>\r\n ))}\r\n </Collapse>\r\n <Collapse appear={true} in={!this.state.showMoreTopics}>\r\n <Chip key={`${tagGroup.id}-more`} label={`+${tagGroup.tags.length - 4}`} className=\"chip-styling\"/>\r\n </Collapse>\r\n </React.Fragment>\r\n }\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n {showTopicsOption &&\r\n <div className=\"show-more-topics-option\">\r\n {this.state.showMoreTopics\r\n ? <Button variant=\"text\" color=\"primary\" onClick={this.onShowLessTopics}>See less topics</Button>\r\n : <Button variant=\"text\" color=\"primary\" onClick={this.onShowMoreTopics}>See all topics</Button>\r\n }\r\n </div>\r\n }\r\n <Notifications\r\n show={this.state.showEditNotifications}\r\n onClose={this.onCloseEditNotifications}\r\n />\r\n <TagSubscriptions\r\n show={this.state.showEditTopicSubscriptions}\r\n onClose={this.onCloseEditTopicSubscriptions}\r\n />\r\n </section>\r\n );\r\n }\r\n\r\n private checkShouldShowTopicsOption = (topics: ClientSettingsTagGroup[]): boolean => {\r\n return !!topics.find((tagGroup) => tagGroup.tags.length > 5);\r\n }\r\n\r\n private getAvailableLanguages = (): SelectOption[] => {\r\n if (!this.props.clientSettings || !this.props.lcidMappings)\r\n return [];\r\n\r\n let availableLanguages: SelectOption[] = [];\r\n Object.keys(this.props.clientSettings.translatedContent).map((lcid) => {\r\n if (!!this.props.lcidMappings[lcid])\r\n availableLanguages.push({ key: lcid, text: this.props.lcidMappings[lcid].language, type: \"item\" });\r\n return lcid;\r\n });\r\n return availableLanguages;\r\n }\r\n\r\n private getTags = (): ClientSettingsTagGroup[] => {\r\n if (!this.props.tagSettings)\r\n return [];\r\n \r\n let tags: ClientSettingsTagGroup[] = [];\r\n this.props.tagSettings.tagGroups.map((tagGroup) => {\r\n if (tagGroup.tags.length && !!tagGroup.tags.find((tag) => this.props.userSettings.subscribedTags.includes(tag.id) && !tag.disabled)) {\r\n let subscribedTags: ClientSettingsTag[] = tagGroup.tags.filter((tag) => this.props.userSettings.subscribedTags.includes(tag.id) && !tag.disabled);\r\n tags.push({\r\n ...tagGroup,\r\n tags: subscribedTags\r\n });\r\n }\r\n return tagGroup;\r\n });\r\n return tags;\r\n }\r\n\r\n private getNotificationsDescription = () => {\r\n const { clientSettings, userSettings } = this.props;\r\n\r\n if ((!clientSettings.chatEnabled || !userSettings.chatEnabled) && userSettings.commentNotificationSettings === \"none\" && !userSettings.preferredSMSConsent && !userSettings.sendNotificationsWhenAuthor)\r\n return \"All preferences disabled\";\r\n else if ((!clientSettings.chatEnabled || userSettings.chatEnabled) && userSettings.commentNotificationSettings !== \"none\" && userSettings.preferredSMSConsent && userSettings.sendNotificationsWhenAuthor)\r\n return \"All preferences enabled\";\r\n else\r\n return \"Custom preferences set\";\r\n }\r\n\r\n private onChangePreferredLCID = (event) => {\r\n this.props.saveUserSettings({ preferredLCID: event.target.value });\r\n }\r\n\r\n private onCloseEditNotifications = () => {\r\n this.setState({ showEditNotifications: false });\r\n }\r\n\r\n private onCloseEditTopicSubscriptions = () => {\r\n this.setState({ showEditTopicSubscriptions: false });\r\n }\r\n\r\n private onShowEditNotifications = () => {\r\n this.setState({ showEditNotifications: true });\r\n }\r\n\r\n private onShowEditTopicSubscriptions = () => {\r\n this.setState({ showEditTopicSubscriptions: true });\r\n }\r\n\r\n private onShowLessTopics = () => {\r\n this.setState({\r\n showMoreTopics: false\r\n });\r\n }\r\n\r\n private onShowMoreTopics = () => {\r\n this.setState({\r\n showMoreTopics: true\r\n });\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\ninterface ComponentState {\r\n showEditNotifications: boolean;\r\n showEditTopicSubscriptions: boolean;\r\n showMoreTopics: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n clientSettings: state.settings.clientSettings,\r\n lcidMappings: state.resources.lcidMappings,\r\n tagSettings: state.settings.tagSettings,\r\n userSettings: state.profile.userSettings!\r\n }),\r\n {\r\n saveUserSettings: actions.saveUserSettings\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(Preferences);","import React from \"react\";\r\n\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\n\r\ninterface InputFieldProps {\r\n description?: string;\r\n label: string;\r\n error?: boolean;\r\n value: string;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n required?: boolean;\r\n helperText?: string;\r\n onChange?: (event: any) => void;\r\n onCheckEmptyField?: (event: any) => void;\r\n}\r\n\r\nconst InputField: React.FunctionComponent<InputFieldProps> = props => {\r\n return (\r\n <div className=\"section-field\">\r\n <div className=\"section-input-field-heading\">\r\n {props.required ? <label className={\"control-label\"}>{props.label}</label> : <label>{props.label}</label>}\r\n </div>\r\n <div className=\"section-input-field\">\r\n <TextField\r\n key={props.value}\r\n variant=\"outlined\"\r\n size=\"small\"\r\n error={props.error}\r\n helperText={props.helperText}\r\n defaultValue={props.value}\r\n placeholder={props.disabled ? \"\" : props.placeholder}\r\n fullWidth\r\n autoComplete=\"off\"\r\n disabled={props.disabled}\r\n onBlur={(event) => {\r\n if (!!props.onChange && event.target.value !== props.value)\r\n props.onChange(event);\r\n }}\r\n onChange={(event) => {\r\n if (!!props.onCheckEmptyField && event.target.value !== props.value)\r\n props.onCheckEmptyField(event);\r\n }}\r\n />\r\n {props.description &&\r\n <Typography variant=\"caption\">{props.description}</Typography>\r\n }\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default InputField;","import React, { useState } from \"react\";\r\n\r\nimport Switch from \"@mui/material/Switch\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\n\r\ninterface InputSwitchFieldProps {\r\n description?: string;\r\n label: string;\r\n value: string;\r\n placeholder?: string;\r\n onChange: (event: any) => void;\r\n onClear: () => void;\r\n}\r\n\r\nconst InputSwitchField: React.FunctionComponent<InputSwitchFieldProps> = props => {\r\n const [disabled, setDisabled] = useState(!props.value);\r\n\r\n return (\r\n <div className=\"section-field\">\r\n <div className=\"section-input-field-heading\">\r\n <label>{props.label}</label>\r\n </div>\r\n <div className=\"section-input-switch-field\">\r\n <Switch\r\n color=\"primary\"\r\n checked={!disabled}\r\n onChange={() => {\r\n if (!disabled && !!props.value)\r\n props.onClear();\r\n setDisabled(!disabled);\r\n }}\r\n />\r\n <TextField\r\n key={props.value}\r\n variant=\"outlined\"\r\n size=\"small\"\r\n defaultValue={props.value}\r\n placeholder={disabled ? \"\" : props.placeholder}\r\n fullWidth\r\n autoComplete=\"off\"\r\n disabled={disabled}\r\n onBlur={(event) => {\r\n if (event.target.value !== props.value)\r\n props.onChange(event);\r\n }}\r\n />\r\n {props.description &&\r\n <Typography variant=\"caption\">{props.description}</Typography>\r\n }\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default InputSwitchField;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport * as actions from \"../actionCreator\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport InputField from \"./common/inputField\";\r\nimport InputSwitchField from \"./common/inputSwitchField\";\r\nimport PhoneField from \"./common/phoneField\";\r\n\r\nimport Typography from \"@mui/material/Typography\";\r\nimport SuccessSnackbar from \"modules/common/components/snackbars/successSnackbar\";\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\n\r\n\r\nclass ProfileDetails extends React.Component<PropsWithRedux, ComponentState> {\r\n constructor(props: PropsWithRedux) {\r\n super(props);\r\n\r\n this.state = {\r\n showVerifySuccessMessage: null,\r\n showVerifyErrorMessage: null,\r\n showPreferredSMSPhoneMessage: false,\r\n errorFirstName: false,\r\n errorLastName: false\r\n };\r\n }\r\n\r\n public render() {\r\n const { userSettings, localAccountPrefix } = this.props;\r\n\r\n const subdomain = window.location.host.split(\".\")[0];\r\n const localIdToDisplay = localAccountPrefix && subdomain.toLowerCase() === localAccountPrefix.toLowerCase()\r\n ? userSettings.localId.replace(subdomain, \"\")\r\n : userSettings.localId;\r\n\r\n return (\r\n <React.Fragment>\r\n <section>\r\n <div className=\"section-heading\">\r\n <Typography variant=\"h2\">Profile Details</Typography>\r\n </div>\r\n <InputField\r\n label=\"First Name\"\r\n required={true}\r\n helperText={this.state.errorFirstName ? \"Enter first name\" : ''}\r\n value={userSettings.firstName}\r\n error={this.state.errorFirstName}\r\n disabled={!userSettings.isSocialUser && !userSettings.isSparrowLocalUser}\r\n onChange={this.onChangeFirstName}\r\n onCheckEmptyField={this.onCheckEmptyFirstName}\r\n />\r\n <InputSwitchField\r\n label=\"Preferred Name\"\r\n value={userSettings.preferredName}\r\n placeholder=\"Enter preferred name\"\r\n onChange={this.onChangeNickname}\r\n onClear={this.onClearNickname}\r\n />\r\n <InputField\r\n label=\"Last Name\"\r\n required={true}\r\n helperText={this.state.errorLastName ? \"Enter last name\" : ''}\r\n value={userSettings.lastName}\r\n error={this.state.errorLastName}\r\n disabled={!userSettings.isSocialUser && !userSettings.isSparrowLocalUser}\r\n onChange={this.onChangeLastName}\r\n onCheckEmptyField={this.onCheckEmptyLastName}\r\n />\r\n <InputField\r\n description=\"Users with Work Accounts cannot change their email address.\"\r\n label=\"Email\"\r\n value={userSettings.email}\r\n disabled={true}\r\n onChange={this.onChangeEmail}\r\n />\r\n <PhoneField\r\n description=\"Verify and opt-in your new mobile number to receive SMS notifications and alerts.\"\r\n label=\"Mobile No.\"\r\n country={\"us\"}\r\n enableSearch={true}\r\n autoFormat={true}\r\n disabledDropDown={userSettings.isWorkAccount}\r\n disabled={userSettings.isWorkAccount}\r\n placeholder=\"Enter mobile number\"\r\n value={userSettings.preferredSMSPhone}\r\n onVerifySms={this.sendSMSVerifyMessage}\r\n onChange={this.onChangePreferredSMSPhone}\r\n />\r\n </section>\r\n {userSettings.isSparrowLocalUser &&\r\n <section>\r\n <InputField\r\n disabled={true}\r\n label={\"User ID\"}\r\n value={localIdToDisplay}\r\n description=\"Used as the username for this account.\"\r\n />\r\n </section>\r\n }\r\n <SuccessSnackbar successMessage={this.state.showVerifySuccessMessage || \"\"} clearSuccessMessage={() => this.setState({ showVerifySuccessMessage: null })} />\r\n <ErrorSnackbar errorMessage={this.state.showVerifyErrorMessage || \"\"} clearErrorMessage={() => this.setState({ showVerifyErrorMessage: null })} />\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private onChangeEmail = (event) => {\r\n this.props.saveUserSettings({ email: event.target.value });\r\n }\r\n\r\n private onChangeFirstName = (event) => {\r\n if(event.target.value !== \"\") {\r\n this.props.saveUserSettings({ firstName: event.target.value });\r\n } else {\r\n this.setState({errorFirstName: true})\r\n }\r\n }\r\n\r\n private onCheckEmptyFirstName = (event) => {\r\n if(!event.target.value) {\r\n this.setState({errorFirstName: true})\r\n } else {\r\n this.setState({errorFirstName: false})\r\n }\r\n }\r\n\r\n private onChangeLastName = (event) => {\r\n if(event.target.value) {\r\n this.props.saveUserSettings({ lastName: event.target.value });\r\n } else {\r\n this.setState({errorLastName: true})\r\n }\r\n }\r\n\r\n private onCheckEmptyLastName = (event) => {\r\n if(!event.target.value) {\r\n this.setState({errorLastName: true})\r\n } else {\r\n this.setState({errorLastName: false})\r\n }\r\n }\r\n\r\n private onChangeNickname = (event) => {\r\n this.props.saveUserSettings({ preferredName: event.target.value });\r\n }\r\n\r\n private onChangePreferredSMSPhone = (event) => {\r\n this.props.saveUserSettings({ preferredSMSPhone: event.target.value, preferredSMSConsent: null });\r\n }\r\n\r\n private onClearNickname = () => {\r\n this.props.saveUserSettings({ preferredName: \"\" });\r\n }\r\n private sendSMSVerifyMessage = () => {\r\n this.props.sendSMSVerify()\r\n .then((response) => {\r\n if(response === true) {\r\n this.setState({ showVerifySuccessMessage: \"An SMS verification and opt-in invite was sent to your number.\" })\r\n } else {\r\n this.setState({ showVerifySuccessMessage: \"Something went wrong. Please try again.\" })\r\n }\r\n })\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\ninterface ComponentState {\r\n showVerifySuccessMessage: string | null;\r\n showVerifyErrorMessage: string | null;\r\n showPreferredSMSPhoneMessage: boolean;\r\n errorFirstName: boolean;\r\n errorLastName: boolean;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n userSettings: state.profile.userSettings!,\r\n syncLevel: state.settings.tenantSettings.syncConfig.syncLevel,\r\n localAccountPrefix: state.settings.tenantSettings.localAccountPrefix\r\n }),\r\n {\r\n saveUserSettings: actions.saveUserSettings,\r\n sendSMSVerify: actions.sendSMSVerifyRequest\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default connector(ProfileDetails);\r\n","import React from \"react\"\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport * as actions from \"../actionCreator\";\r\nimport * as settingsActions from \"modules/settings/actionCreator\";\r\nimport { withRouter, RouteComponentProps } from \"react-router\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport Preferences from \"modules/profile/components/preferences\";\r\nimport ProfileDetails from \"modules/profile/components/profileDetails\";\r\n\r\nimport Divider from \"@mui/material/Divider\";\r\n\r\n\r\nclass Details extends React.Component<PropsWithRedux, {}> {\r\n public componentDidMount() {\r\n if (!!this.props.currentUser.userId)\r\n this.initializeUserSettings();\r\n \r\n if(!!this.props.tenantSettings)\r\n this.props.getTenantConfig();\r\n }\r\n\r\n public componentDidUpdate(prevProps: PropsWithRedux) {\r\n if (prevProps.currentUser.userId !== this.props.currentUser.userId)\r\n this.initializeUserSettings();\r\n }\r\n\r\n public render() {\r\n if (this.props.isInitialLoad || !this.props.userSettings)\r\n return <Loading />;\r\n \r\n return (\r\n <React.Fragment>\r\n <ProfileDetails />\r\n <Divider light />\r\n <Preferences />\r\n <ErrorSnackbar errorMessage={this.props.errorMessage} clearErrorMessage={this.props.clearErrorMessage} />\r\n </React.Fragment>\r\n );\r\n }\r\n\r\n private initializeUserSettings = () => {\r\n this.props.initializeUserSettings(this.props.currentUser);\r\n }\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n currentUser: state.settings.currentUser,\r\n errorMessage: state.profile.errorMessage,\r\n isInitialLoad: state.profile.isInitialLoad,\r\n isSaving: state.profile.isSaving,\r\n userSettings: state.profile.userSettings,\r\n tenantSettings: state.settings.tenantSettings\r\n }),\r\n {\r\n clearErrorMessage: actions.clearErrorMessage,\r\n initializeUserSettings: actions.initializeUserSettings,\r\n getTenantConfig: settingsActions.getTenantSettings\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default withRouter(connector(Details));","import React, { useRef, useState } from \"react\";\r\n\r\nimport Popover from \"@mui/material/Popover\";\r\nimport { Theme } from \"@mui/material/styles\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\n\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n message: {\r\n color: theme.palette.primary.main,\r\n fontSize: 12,\r\n fontStyle: \"italic\",\r\n marginTop: 15,\r\n textDecoration: \"underline\"\r\n }\r\n })\r\n);\r\n\r\n\r\nconst UnableToEditMessage: React.FunctionComponent<{}> = props => {\r\n const [showPopover, setShowPopover] = useState(false);\r\n const popoverRef = useRef(null);\r\n\r\n const classes = useStyles();\r\n\r\n return (\r\n <React.Fragment>\r\n <div\r\n ref={popoverRef}\r\n onMouseEnter={() => setShowPopover(true)}\r\n onMouseLeave={() => setShowPopover(false)}\r\n className={classes.message}\r\n >\r\n Why can't I edit other fields?\r\n </div>\r\n <Popover\r\n open={showPopover}\r\n anchorEl={popoverRef.current}\r\n anchorOrigin={{\r\n vertical: \"bottom\",\r\n horizontal: \"left\"\r\n }}\r\n transformOrigin={{\r\n vertical: \"top\",\r\n horizontal: \"left\"\r\n }}\r\n PaperProps={{\r\n onMouseEnter: () => setShowPopover(true),\r\n onMouseLeave: () => setShowPopover(false),\r\n style: {\r\n maxWidth: 250\r\n }\r\n }}\r\n style={{ pointerEvents: \"none\" }}\r\n onClose={() => setShowPopover(false)}\r\n classes={{\r\n paper: \"help-text-description\"\r\n }}\r\n >\r\n Fields that are synced from a third-party provider cannot be edited through Sparrow.\r\n </Popover>\r\n </React.Fragment>\r\n );\r\n}\r\n\r\nexport default UnableToEditMessage;","import * as React from \"react\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { withRouter, RouteComponentProps } from \"react-router\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Avatar from \"modules/common/components/avatar\";\r\nimport UnableToEditMessage from \"./unableToEditMessage\";\r\n\r\nimport { generateColor } from \"utils/colorGenerator\";\r\nimport { getRole } from \"utils/getRole\";\r\n\r\nimport Divider from \"@mui/material/Divider\";\r\n\r\n\r\nconst Account: React.FunctionComponent<PropsWithRedux> = props => {\r\n const { userSettings } = props;\r\n\r\n if (!userSettings)\r\n return <React.Fragment></React.Fragment>;\r\n\r\n return (\r\n <div className=\"account-info\">\r\n <div>\r\n <div className=\"avatar\">\r\n <Avatar firstname={props.userSettings.firstName} lastname={props.userSettings.lastName} color={generateColor(props.userSettings.userId)} />\r\n </div>\r\n <div className=\"full-name\">{`${userSettings.firstName} ${userSettings.lastName}`}</div>\r\n <div className=\"email\">{userSettings.email}</div>\r\n </div>\r\n <div>\r\n <Divider light />\r\n <div className=\"account-data\">\r\n <div className=\"account-type\">\r\n <div>Account type</div>\r\n <div>{userSettings.isSparrowLocalUser ? \"Sparrow Account\" : userSettings.isSocialUser ? \"Social account\" : \"Work account\"}</div>\r\n </div>\r\n <div>\r\n <div>Permission</div>\r\n <div>{getRole(userSettings)}</div>\r\n </div>\r\n </div>\r\n <Divider light />\r\n <UnableToEditMessage />\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n userSettings: state.profile.userSettings!\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default withRouter(connector(Account));","import * as React from \"react\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { withRouter, RouteComponentProps } from \"react-router\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\n\r\nconst ProfileBanner: React.FunctionComponent<PropsWithRedux> = props => {\r\n const { userSettings } = props;\r\n\r\n if (!userSettings)\r\n return <React.Fragment></React.Fragment>;\r\n \r\n return (\r\n <div className=\"profile-banner\"></div>\r\n );\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n userSettings: state.profile.userSettings\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default withRouter(connector(ProfileBanner));","import React from \"react\"\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { withRouter, RouteComponentProps } from \"react-router\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Loading from \"modules/common/components/loading\";\r\n\r\nimport Account from \"modules/profile/components/account\";\r\nimport ProfileBanner from \"modules/profile/components/profileBanner\";\r\n\r\n\r\nclass User extends React.Component<PropsWithRedux, {}> {\r\n public render() {\r\n if (this.props.isInitialLoad || !this.props.userSettings)\r\n return <Loading />;\r\n \r\n return (\r\n <React.Fragment>\r\n <ProfileBanner />\r\n <Account />\r\n </React.Fragment>\r\n );\r\n }\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n isInitialLoad: state.profile.isInitialLoad,\r\n userSettings: state.profile.userSettings\r\n }),\r\n {\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps<typeof connector>;\r\n\r\nexport default withRouter(connector(User));","import React from \"react\"\r\n\r\nimport BasePage from \"../common/basePage\";\r\nimport Columns from \"../common/columns\";\r\nimport MainContent from \"../common/mainContent\";\r\n\r\nimport Details from \"modules/profile/containers/details\";\r\nimport User from \"modules/profile/containers/user\";\r\n\r\n\r\nimport \"modules/profile/styles/profile.sass\";\r\n\r\n\r\nconst UserPage: React.FunctionComponent<{}> = props => {\r\n return (\r\n <BasePage>\r\n <Columns\r\n slim\r\n leftComponent={\r\n <div>\r\n <MainContent id=\"my-account\" addPadding>\r\n <User />\r\n </MainContent>\r\n </div>\r\n }\r\n rightComponent={\r\n <MainContent id=\"user-profile\" addPadding>\r\n <Details />\r\n </MainContent>\r\n }\r\n />\r\n </BasePage>\r\n );\r\n}\r\n\r\nexport default UserPage;","import React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport Loading from \"modules/common/components/loading\";\r\nimport TenantLink from \"modules/common/components/tenantLink\";\r\n\r\nimport BasePage from \"../common/basePage\";\r\nimport MainContent from \"../common/mainContent\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\n\r\nconst WelcomePage: React.FunctionComponent<PropsWithRedux> = props => {\r\n if (!props.client)\r\n return (\r\n <BasePage>\r\n <MainContent addPadding>\r\n <Loading />\r\n </MainContent>\r\n </BasePage>\r\n );\r\n\r\n return (\r\n <BasePage>\r\n <MainContent id=\"welcome-message\" addPadding>\r\n <div className=\"welcome-message-content\">\r\n <div className=\"welcome-feed\">\r\n <img src=\"/images/welcome-feed.png\" alt=\"\" />\r\n </div>\r\n <div>\r\n <Typography variant=\"h1\" className=\"welcome-header\">Welcome to {props.client}!</Typography>\r\n <div className=\"welcome-text\">\r\n <div>Your account has now been created.</div>\r\n <div>Go to your feed for the latest company news and announcements.{(props.androidAppUrl || props.iosAppUrl) ? \" You can also download the app to get real-time updates on-the-go!\" : \"\"}</div>\r\n </div>\r\n <div className=\"invited-user-platforms\">\r\n {props.androidAppUrl &&\r\n <div>\r\n <a href={props.androidAppUrl}>\r\n <img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png' className=\"google-play-button\" />\r\n </a>\r\n </div>\r\n }\r\n {props.iosAppUrl &&\r\n <div>\r\n <a href={props.iosAppUrl}>\r\n <svg id=\"livetype\" xmlns=\"http://www.w3.org/2000/svg\" width=\"215\" height=\"80\" viewBox=\"0 0 119.66407 40\" className=\"app-store-button\">\r\n <title>Download on the Apple App Store\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n }\r\n
    \r\n
    \r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n androidAppUrl: state.settings.clientSettings.androidAppUrl,\r\n client: state.settings.clientSettings.displayName,\r\n iosAppUrl: state.settings.clientSettings.iosAppUrl\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\nexport default connector(WelcomePage);","import * as React from \"react\";\r\nimport MsalAuthModule from \"./msalAuthModule\";\r\nimport useQueryParams, { QUERY_PARAM_KEYS } from \"modules/common/hooks/useQueryParams\";\r\nimport { linkApi } from \"api/instances\";\r\nimport useIsMounted from \"modules/common/hooks/useIsMounted\";\r\nimport { InteractionStatus } from \"@azure/msal-browser\";\r\nimport LoginLayout from \"routes/_layout/login/loginLayout\";\r\nimport { useIsAuthenticated, useMsal } from \"@azure/msal-react\";\r\nimport { useEffect, useMemo, useState } from \"react\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { Button, Theme } from \"@mui/material\";\r\nimport createStyles from '@mui/styles/createStyles';\r\nimport makeStyles from '@mui/styles/makeStyles';\r\nimport { Link } from \"react-router-dom\";\r\nimport { ExpiryLink } from \"api/links\";\r\nimport CheckCircleIcon from '@mui/icons-material/CheckCircle';\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n createStyles({\r\n title: {\r\n fontWeight: \"bold\",\r\n },\r\n success: {\r\n fontWeight: 500,\r\n color: \"#376632\",\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n justifyContent: \"flex-start\",\r\n alignItems: \"center\"\r\n },\r\n checkIcon: {\r\n marginRight: \"1rem\"\r\n },\r\n action: {\r\n alignSelf: \"center\",\r\n color: \"rgb(59, 120, 171)\",\r\n marginTop: \"1rem\",\r\n \"&:hover\": {\r\n color: \"#23527c\",\r\n background: \"transparent\"\r\n }\r\n },\r\n underline: {\r\n textDecoration: \"underline\"\r\n },\r\n container: {\r\n display: \"flex\",\r\n flexDirection: \"column\"\r\n },\r\n })\r\n);\r\n\r\ninterface IErrorMessage {\r\n title: string;\r\n body: string;\r\n action: JSX.Element;\r\n}\r\n\r\nconst Invitation: React.FunctionComponent = (props) => {\r\n const classes = useStyles();\r\n const { inProgress } = useMsal();\r\n const query = useQueryParams();\r\n const isAuthenticated = useIsAuthenticated();\r\n const isMounted = useIsMounted();\r\n\r\n const [token] = useState(query.get(QUERY_PARAM_KEYS.INVITE_TOKEN));\r\n const [tenantName] = useState(query.get(QUERY_PARAM_KEYS.TENANT_NAME));\r\n const [tenantIdQueryParam] = useState(query.get(QUERY_PARAM_KEYS.TENANT_ID));\r\n const [isResetPasswordQueryParam] = useState(query.get(QUERY_PARAM_KEYS.IS_RESET_PASSWORD_LINK) === \"true\");\r\n\r\n const [loading, setLoading] = useState(true);\r\n const [expiryLink, setExpiryLink] = useState();\r\n const [isResending, setIsResending] = useState();\r\n const [resentSuccess, setResentSuccess] = useState();\r\n const [resentError, setResentError] = useState();\r\n\r\n const loadingComponent = useMemo(() => , []);\r\n const GENERIC_ERROR_MESSAGE = useMemo(() => ({\r\n title: \"Something went wrong\",\r\n body: \"Please try again later.\",\r\n action: Login with existing account\r\n }), [classes.action, classes.underline]);\r\n\r\n const INVITE_USED_ERROR_MESSAGE = useMemo(() => ({\r\n title: \"Something went wrong\",\r\n body: `This ${expiryLink?.isPasswordResetLink ? \"link\" : \"invite \"} has already been used. Please contact your administrators, internal communications team, HR or IT department for more details.`,\r\n action: Login with existing account\r\n }), [classes.action, classes.underline, expiryLink]);\r\n\r\n const INVITE_DOESNT_EXIST_ERROR_MESSAGE = useMemo(() => ({\r\n title: \"Something went wrong\",\r\n body: `Oops, looks like this ${expiryLink?.isPasswordResetLink ? \"link\" : \"invite \"} doesn't exist. Please contact your administrators, internal communications team, HR or IT department for more details.`,\r\n action: Login with existing account\r\n }), [classes.action, classes.underline, expiryLink]);\r\n\r\n const INVITE_EXPIRED_ERROR_MESSAGE = useMemo(() => {\r\n /**\r\n * Send a new reset password link\r\n */\r\n const sendNewResetPasswordLink = async (): Promise => {\r\n if (!token) return false;\r\n\r\n await linkApi.resendSparrowAccountPasswordResetLink(token);\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * Send a new social invite link\r\n */\r\n const sendNewSocialInviteLink = async (): Promise => {\r\n if (!token || !tenantIdQueryParam) return false;\r\n\r\n await linkApi.resendSocialInvite(tenantIdQueryParam, token);\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * Resend a new invite or reset password link\r\n */\r\n const onRequestNew = async () => {\r\n if (!expiryLink) return;\r\n let success = false;\r\n setIsResending(true);\r\n\r\n try {\r\n const { isPasswordResetLink } = expiryLink;\r\n if (isPasswordResetLink)\r\n success = await sendNewResetPasswordLink();\r\n else\r\n success = await sendNewSocialInviteLink();\r\n } catch (error) {\r\n success = false;\r\n } finally {\r\n setIsResending(false);\r\n if (success)\r\n setResentSuccess(true);\r\n else\r\n setResentError(true);\r\n }\r\n };\r\n\r\n return {\r\n title: `Oops, looks like this ${expiryLink?.isPasswordResetLink ? \"password reset link\" : \"invite\"} has expired`,\r\n body: \"You can request a new one by clicking the button below or contact your administrator or communications team.\",\r\n action: <>{isResending\r\n ? loadingComponent\r\n : }\r\n \r\n }\r\n }, [classes.action, expiryLink, isResending, loadingComponent, tenantIdQueryParam, token]);\r\n\r\n useEffect(() => {\r\n const validateToken = async () => {\r\n if (isAuthenticated) return;\r\n\r\n if (token) {\r\n try {\r\n const expiryLink = await linkApi.getExpiryLink(token, tenantIdQueryParam, isResetPasswordQueryParam);\r\n if (isMounted()) {\r\n setExpiryLink(expiryLink);\r\n\r\n if (!expiryLink.isExists || !expiryLink.isEnabled)\r\n setLoading(false);\r\n }\r\n } catch (error) {\r\n if (isMounted()) {\r\n setLoading(false);\r\n }\r\n }\r\n } else {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n validateToken();\r\n }, [token, tenantName, tenantIdQueryParam, isMounted, isAuthenticated, isResetPasswordQueryParam]);\r\n\r\n // see if we should redirect to invite journey\r\n useEffect(() => {\r\n const inviteAsync = async () => {\r\n if (token && inProgress === InteractionStatus.None) {\r\n localStorage.clear();\r\n\r\n if (isResetPasswordQueryParam)\r\n await MsalAuthModule.getInstance().resetSparrowPassword(token);\r\n else\r\n await MsalAuthModule.getInstance().invite(token, tenantName || \"\");\r\n }\r\n }\r\n\r\n if (expiryLink) {\r\n const { isEnabled, isExists, isExpired, isUsed } = expiryLink;\r\n if (isEnabled && isExists && !isExpired && !isUsed)\r\n inviteAsync();\r\n else\r\n setLoading(false);\r\n }\r\n }, [expiryLink, inProgress, token, tenantName, isAuthenticated, isResetPasswordQueryParam]);\r\n\r\n // set title once done loading\r\n useEffect(() => {\r\n if (loading === false) document.title = \"Sparrow Connected\";\r\n }, [loading]);\r\n\r\n /**\r\n * Calculates if there was an error depending on state\r\n * @returns IErrorMessage or null\r\n */\r\n const getErrorMessage = (): IErrorMessage => {\r\n let errorMessage;\r\n if (resentSuccess) return errorMessage;\r\n\r\n if (expiryLink) {\r\n const { isUsed, isExpired, isExists, isEnabled } = expiryLink;\r\n if (isUsed)\r\n errorMessage = INVITE_USED_ERROR_MESSAGE;\r\n else if (isExpired)\r\n errorMessage = INVITE_EXPIRED_ERROR_MESSAGE;\r\n else if (!isExists || !isEnabled) {\r\n errorMessage = INVITE_DOESNT_EXIST_ERROR_MESSAGE;\r\n }\r\n } else if (!loading || resentError) {\r\n errorMessage = GENERIC_ERROR_MESSAGE;\r\n }\r\n\r\n return errorMessage;\r\n };\r\n\r\n const errorMessage = getErrorMessage();\r\n\r\n return (\r\n \r\n {(loading || isAuthenticated) && loadingComponent}\r\n {errorMessage &&\r\n
    \r\n

    {errorMessage.title}

    \r\n

    {errorMessage.body}

    \r\n <>{errorMessage.action}\r\n
    \r\n }\r\n {resentSuccess && expiryLink &&
    \r\n

    \r\n \r\n {expiryLink?.isPasswordResetLink ? \"Password reset link\" : \"Invite\"} sent!\r\n

    \r\n

    Check your email. {expiryLink.maskedEmail && <>We have sent a new {expiryLink.isPasswordResetLink ? \"link\" : \"invite\"} to {expiryLink.maskedEmail}.}

    \r\n Back to login\r\n
    }\r\n
    \r\n );\r\n};\r\nexport default Invitation;\r\n","import * as React from \"react\";\r\nimport { useState } from \"react\";\r\nimport { AuthenticationResult } from \"@azure/msal-browser\";\r\nimport { Redirect } from \"react-router\";\r\n\r\nimport MsalAuthModule, { ICustomState } from \"./msalAuthModule\";\r\nimport useIsMounted from \"modules/common/hooks/useIsMounted\";\r\nimport { QUERY_PARAM_KEYS } from \"modules/common/hooks/useQueryParams\";\r\n\r\nconst AuthRedirectHandler: React.FunctionComponent<{}> = (props) => {\r\n const [handlingRedirectResponse, setHandlingRedirectResponse] = useState();\r\n const [redirectTo, setRedirectTo] = useState();\r\n const isMounted = useIsMounted();\r\n\r\n React.useEffect(() => {\r\n const handleAuthRedirectResult = (redirectResponse: AuthenticationResult | null) => {\r\n try {\r\n if (redirectResponse) {\r\n setHandlingRedirectResponse(true);\r\n let jsonStr = redirectResponse.state || \"{}\";\r\n let { originatedFrom }: ICustomState = JSON.parse(jsonStr);\r\n\r\n if (originatedFrom && !originatedFrom.includes(\"/invitation?inviteToken\") && !originatedFrom.includes(QUERY_PARAM_KEYS.SIGNED_OUT_SUCCESS)) {\r\n let url = new URL(originatedFrom);\r\n if (isMounted()) setRedirectTo(url.pathname + url.search);\r\n }\r\n }\r\n } catch (error) {\r\n // defualt to redirect to home\r\n if (isMounted()) setRedirectTo(undefined);\r\n } finally {\r\n if (isMounted()) setHandlingRedirectResponse(false);\r\n }\r\n };\r\n\r\n MsalAuthModule.getInstance().initRedirectHandler(handleAuthRedirectResult);\r\n }, [isMounted]);\r\n\r\n return (\r\n <>\r\n {handlingRedirectResponse\r\n ? <>\r\n : (redirectTo\r\n ? \r\n : props.children)}\r\n \r\n )\r\n};\r\n\r\nexport default AuthRedirectHandler;\r\n","import * as React from \"react\";\r\n\r\nimport TenantLink from \"modules/common/components/tenantLink\";\r\n\r\nimport BasePage from \"../common/basePage\";\r\nimport MainContent from \"../common/mainContent\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport { Box, Grid } from \"@mui/material\";\r\nimport makeStyles from \"@mui/styles/makeStyles\";\r\n\r\nconst useStyles = makeStyles({\r\n root: {\r\n minHeight: \"75vh\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"center\"\r\n }\r\n });\r\n\r\nconst PageForbidden: React.FunctionComponent<{}> = props => {\r\n const classes = useStyles();\r\n return (\r\n \r\n \r\n \r\n
    \r\n \r\n \r\n \"403\r\n \r\n \r\n \r\n \r\n Looks like you don’t have access.\r\n \r\n \r\n \r\n \r\n Sorry, you don’t have permission to use the admin side of the portal.\r\n Contact your administrators, managers or internal\r\n communications team to request access.\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n );\r\n}\r\n\r\nexport default PageForbidden;","import * as React from \"react\";\r\n\r\nimport TenantLink from \"modules/common/components/tenantLink\";\r\n\r\nimport BasePage from \"../common/basePage\";\r\nimport MainContent from \"../common/mainContent\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport { Box, Grid } from \"@mui/material\";\r\nimport makeStyles from \"@mui/styles/makeStyles\";\r\n\r\nconst useStyles = makeStyles({\r\n root: {\r\n minHeight: \"75vh\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"center\"\r\n }\r\n });\r\n\r\nconst AdminPageForbidden: React.FunctionComponent<{}> = props => {\r\n const classes = useStyles();\r\n return (\r\n \r\n \r\n \r\n
    \r\n \r\n \r\n \"403\r\n \r\n \r\n \r\n \r\n Looks like you don’t have access.\r\n \r\n \r\n \r\n \r\n Sorry, you don’t have permission to use the admin side of the portal.\r\n Contact your administrators, managers or internal\r\n communications team to request access.\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n );\r\n}\r\n\r\nexport default AdminPageForbidden;","import { Grid } from '@mui/material';\r\nimport * as React from 'react';\r\n\r\n//Generic component meant for a single component to take up the screen. Examples would be downloadReportPage.tsx and accessRestricted.tsx. \r\nconst NoticeWebpage : React.FunctionComponent = (props) => {\r\n return (\r\n \r\n \r\n \r\n {props.imageComponent}\r\n \r\n \r\n \r\n \r\n {props.titleComponent}\r\n \r\n \r\n \r\n \r\n {props.bodyComponent}\r\n \r\n \r\n \r\n \r\n {props.buttonComponent}\r\n \r\n \r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps { \r\n imageComponent: React.ReactFragment\r\n titleComponent: React.ReactFragment\r\n bodyComponent: React.ReactFragment\r\n buttonComponent: React.ReactFragment\r\n}\r\n\r\nexport default NoticeWebpage;","import { Button, Typography } from '@mui/material';\r\nimport TenantLink from 'modules/common/components/tenantLink';\r\nimport NoticeWebpage from 'modules/common/noticeWebpage';\r\nimport * as React from 'react';\r\n\r\nconst AccessRestricted : React.FunctionComponent<{}> = () => {\r\n return (\r\n }\r\n titleComponent={Looks like you don't have access}\r\n bodyComponent={\r\n \r\n Sorry, you don't have permissions to access this report.\r\n Contact your administrator or regenerate the report.\r\n \r\n }\r\n buttonComponent={\r\n \r\n \r\n \r\n }\r\n />\r\n );\r\n}\r\n\r\nexport default AccessRestricted;","import { Button, Typography } from '@mui/material';\r\nimport TenantLink from 'modules/common/components/tenantLink';\r\nimport NoticeWebpage from 'modules/common/noticeWebpage';\r\nimport * as React from 'react';\r\n\r\n\r\nconst ReportExpired : React.FunctionComponent = (props) => {\r\n return (\r\n }\r\n titleComponent={Report is no longer available}\r\n bodyComponent={\r\n \r\n Report links expire after {props.expiryDays} days.\r\n Please generate your report again.\r\n \r\n }\r\n buttonComponent={\r\n \r\n \r\n \r\n }\r\n />\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n expiryDays: number;\r\n}\r\n\r\nexport default ReportExpired;","import { Box, Button, Link, Typography } from '@mui/material';\r\nimport { reportsApi } from 'api/instances';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport TenantLink from 'modules/common/components/tenantLink';\r\nimport BasePage from 'pages/common/basePage';\r\nimport MainContent from 'pages/common/mainContent';\r\nimport * as React from 'react';\r\nimport { useEffect } from 'react';\r\nimport { ConnectedProps, connect } from 'react-redux';\r\nimport { RouteComponentProps } from 'react-router';\r\nimport { ReportDetails } from './models';\r\nimport moment from 'moment';\r\nimport Loading from 'modules/common/components/loading';\r\nimport AccessRestricted from './accessRestricted';\r\nimport ReportExpired from './reportExpired';\r\nimport NoticeWebpage from 'modules/common/noticeWebpage';\r\nimport { FileDownloader } from 'utils/fileDownloader';\r\n\r\ninterface RouteParams {\r\n reportId: string;\r\n}\r\n\r\nconst DownloadReportPage : React.FunctionComponent = (props) => {\r\n const reportId = props.match.params.reportId;\r\n const userId = props.userId;\r\n\r\n const [isLoading, setIsLoading] = React.useState(false);\r\n const [reportInfo, setReportInfo] = React.useState(null)\r\n const [reportString, setReportString] = React.useState(\"\");\r\n const [isRestricted, setIsRestricted] = React.useState(false);\r\n const [isExpired, setIsExpired] = React.useState(false);\r\n const [firstLoad, setFirstLoad] = React.useState(true);\r\n\r\n const processDownload = (reportData: string = reportString, reportName: string) => {\r\n const file = {\r\n name: reportName,\r\n type: isBinaryFile(reportName) ? \"application/x-zip-compressed\" : FileDownloader.DEFAULT_FILE_TYPE\r\n }\r\n new FileDownloader(file).downloadBlob(reportData)\r\n reportsApi.SetReportDownloaded(reportId); //We don't need to wait for this to complete, this is just for us to log.\r\n }\r\n\r\n const isBinaryFile = (reportName: string) => {\r\n const fileExtension = reportName.substring(reportName.lastIndexOf(\".\") + 1);\r\n return fileExtension === \"zip\" || fileExtension === \"xlsx\";\r\n }\r\n\r\n useEffect(() => {\r\n setIsLoading(true);\r\n let reportInfo;\r\n\r\n reportsApi.GetReportInfo(reportId).then(result => {\r\n reportInfo = result;\r\n setReportInfo(result);\r\n\r\n if(reportInfo !== null) {\r\n\r\n //Not the person who generated the report.\r\n if(reportInfo.userId !== userId) {\r\n setIsRestricted(true);\r\n return;\r\n }\r\n\r\n //Report is expired.\r\n if(moment(reportInfo.createdTime).add(7, \"days\") < moment(new Date())) {\r\n setIsExpired(true);\r\n return;\r\n }\r\n \r\n //If passes all checks, fetch the csv and auto download here.\r\n reportsApi.GetReportForDownload(reportId).then((result) => {\r\n \r\n const resultData = isBinaryFile(reportInfo.reportName) ? result : new TextDecoder().decode(result)\r\n setReportString(resultData)\r\n\r\n if(firstLoad && !!result) {\r\n setFirstLoad(false);\r\n processDownload(resultData, reportInfo.reportName);\r\n }\r\n });\r\n } \r\n }).finally(() => {\r\n setIsLoading(false);\r\n });\r\n }, [userId]);\r\n\r\n return (\r\n \r\n \r\n \r\n
    \r\n {isLoading \r\n ? \r\n : <>\r\n {(!isRestricted && !isExpired && !!reportInfo) ? \r\n }\r\n titleComponent={\r\n \r\n Thanks for downloading the\r\n {reportInfo?.reportType}!\r\n \r\n }\r\n bodyComponent={\r\n \r\n If your download doesn't start after 30 seconds,\r\n processDownload(reportString, reportInfo!.reportName)} style={{color: \"#3b78ab\"}}>\r\n click here to download manually.\r\n \r\n \r\n }\r\n buttonComponent={\r\n \r\n \r\n \r\n }\r\n />\r\n : <> {(isRestricted) ? : } \r\n }\r\n \r\n }\r\n
    \r\n
    \r\n \r\n
    \r\n );\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: RouteComponentProps) =>\r\n ({\r\n ...ownProps,\r\n tenant: state.tenant.id,\r\n userId: state.settings.currentUser.userId,\r\n expiryDays: state.settings.tenantSettings.reportExpiryDays\r\n }),\r\n {\r\n \r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(DownloadReportPage);\r\n","import * as React from \"react\";\r\n\r\nimport TenantLink from \"modules/common/components/tenantLink\";\r\n\r\nimport BasePage from \"../common/basePage\";\r\nimport MainContent from \"../common/mainContent\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Typography from \"@mui/material/Typography\";\r\n\r\n\r\nconst AdminPageNotFound: React.FunctionComponent<{}> = props => {\r\n return (\r\n \r\n \r\n
    \r\n \"404\r\n Sorry! We can't find what you're looking for.\r\n
    It may have been removed, changed, or is temporarily unavailable.
    \r\n
    Explore other sections while we fix the problem!
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n}\r\n\r\nexport default AdminPageNotFound;","import React, { useState } from \"react\";\r\n\r\nimport { Button, Dialog, DialogActions, DialogContent, DialogTitle, Divider, Grid, IconButton, TextField, Typography } from \"@mui/material\";\r\nimport { checkValidTenantName, emailRegex, validGuidRegex } from \"utils/regexUserValidation\";\r\n\r\nimport CloseOutlinedIcon from '@mui/icons-material/CloseOutlined';\r\nimport LoadingSpinner from \"modules/common/components/loadingSpinner\";\r\nimport \"../../styles/tenantManagement.sass\"\r\n\r\nconst NewTenantCreationDialog: React.FunctionComponent = props => {\r\n const [firstNameValid, setFirstNameValid] = useState(false);\r\n const [lastNameValid, setLastNameValid] = useState(false);\r\n const [emailValid, setEmailValid] = useState(false);\r\n const [tenantNameValid, setTenantNameValid] = useState(false);\r\n const [azureTenantIdValid, setAzureTenantIdValid] = useState(false);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Create New Tenant\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n \r\n \r\n Tenant Name\r\n \r\n \r\n {\r\n props.onUpdateTenantName(e);\r\n checkTenantNameValid(e);\r\n }}\r\n fullWidth={true}\r\n size=\"small\"\r\n variant=\"outlined\"\r\n />\r\n \r\n \r\n First Name\r\n \r\n \r\n {\r\n props.onUpdateFirstName(e);\r\n checkFirstNameValid(e);\r\n }}\r\n fullWidth={true}\r\n size=\"small\"\r\n variant=\"outlined\"\r\n />\r\n \r\n \r\n Last Name\r\n \r\n \r\n {\r\n props.onUpdateLastName(e);\r\n checkLastNameValid(e);\r\n }}\r\n fullWidth={true}\r\n size=\"small\"\r\n variant=\"outlined\"\r\n />\r\n \r\n \r\n Email\r\n \r\n \r\n {\r\n props.onUpdateEmail(e);\r\n checkEmailValid(e);\r\n }}\r\n fullWidth={true}\r\n size=\"small\"\r\n variant=\"outlined\"\r\n />\r\n \r\n \r\n AD Tenant ID (optional)\r\n \r\n \r\n {\r\n props.onUpdateAzureADTenantId(e);\r\n checkAzureTenantIdValid(e);\r\n }}\r\n fullWidth={true}\r\n size=\"small\"\r\n variant=\"outlined\"\r\n />\r\n \r\n \r\n
    \r\n
    \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n\r\n function checkTenantNameValid(event: any) {\r\n setTenantNameValid(event.target.value.length <= 0 || !event.target.value.match(checkValidTenantName));\r\n }\r\n\r\n function checkFirstNameValid(event: any) {\r\n setFirstNameValid(event.target.value.length <= 0);\r\n }\r\n\r\n function checkLastNameValid(event: any) {\r\n setLastNameValid(event.target.value.length <= 0);\r\n }\r\n\r\n function checkEmailValid(event: any) {\r\n setEmailValid(event.target.value.length <= 0 || !event.target.value.match(emailRegex));\r\n }\r\n\r\n function checkAzureTenantIdValid(event: any) {\r\n setAzureTenantIdValid(event.target.value.length > 0 && !event.target.value.match(validGuidRegex));\r\n }\r\n}\r\n\r\n\r\ninterface ComponentProps {\r\n show: boolean;\r\n disabledCreate: boolean;\r\n isLoading: boolean;\r\n onUpdateFirstName: (event) => void;\r\n onUpdateLastName: (event) => void;\r\n onUpdateEmail: (event) => void;\r\n onUpdateTenantName: (event) => void;\r\n onUpdateAzureADTenantId: (event) => void;\r\n onCreate: () => Promise;\r\n onClose: () => void;\r\n}\r\n\r\nexport default NewTenantCreationDialog;","import React, { useEffect, useState } from \"react\";\r\n\r\nimport { tenantManagementApi } from \"api/instances\";\r\nimport NewTenantCreationDialog from \"../dialogs/newTenantCreationDialog\";\r\nimport { TenantCreation } from \"modules/tenantManagement/models\";\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport SuccessSnackbar from \"modules/common/components/snackbars/successSnackbar\";\r\nimport { checkValidTenantName, emailRegex, validGuidRegex } from \"utils/regexUserValidation\";\r\nimport Button from \"@mui/material/Button\";\r\n\r\nconst NewTenant: React.FunctionComponent = props => {\r\n const [showDialog, setShowDialog] = useState(false);\r\n const [disableCreate, setDisableCreate] = useState(true);\r\n const [isLoading, setIsLoading] = useState(false); \r\n\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const [successMessage, setSuccessMessage] = useState(\"\");\r\n\r\n const [firstName, setFirstName] = useState(\"\");\r\n const [lastName, setLastName] = useState(\"\");\r\n const [email, setEmail] = useState(\"\");\r\n const [tenantName, setTenantName] = useState(\"\");\r\n const [azureTenantId, setAzureTenantId] = useState(\"\");\r\n\r\n //Validation\r\n const [emailNotValid, setEmailNotValid] = useState(true);\r\n const [tenantNameNotValid, setTenantNameNotValid] = useState(true);\r\n const [azureTenantIdNotValid, setAzureTenantIdNotValid] = useState(true);\r\n\r\n useEffect(() => {\r\n if(!emailNotValid && email && !tenantNameNotValid && tenantName && firstName && lastName){\r\n setDisableCreate(false);\r\n } else if((!azureTenantIdNotValid && azureTenantId.length > 0) && !emailNotValid && email && !tenantNameNotValid && tenantName && firstName && lastName) {\r\n setDisableCreate(false); \r\n } else {\r\n setDisableCreate(true); \r\n }\r\n }, [firstName, lastName, email, tenantName, azureTenantId, azureTenantIdNotValid, emailNotValid, tenantNameNotValid]);\r\n\r\n function onClose () {\r\n setShowDialog(false);\r\n };\r\n \r\n\r\n async function onCreate() {\r\n setIsLoading(true);\r\n\r\n const tenantDetails: TenantCreation = {\r\n firstName: firstName,\r\n lastName: lastName,\r\n email: email,\r\n tenantName: tenantName,\r\n azureTenantId: azureTenantId ?? \"\",\r\n };\r\n\r\n await tenantManagementApi.CreateNewTenant(tenantDetails)\r\n .then(() => {\r\n setSuccessMessage(\"New tenant is being created\");\r\n }).catch(() => {\r\n setErrorMessage(\"Oops, something went wrong. Please try again\");\r\n })\r\n\r\n setIsLoading(false);\r\n setShowDialog(false);\r\n }\r\n\r\n function onOpenDialog () {\r\n setShowDialog(true);\r\n }\r\n\r\n function onUpdateTenantName (event: any) {\r\n setTenantName(event.target.value);\r\n setTenantNameNotValid(!checkValidTenantName.test(event.target.value));\r\n }\r\n\r\n function onUpdateFirstName (event: any) {\r\n setFirstName(event.target.value);\r\n }\r\n\r\n function onUpdateLastName (event: any) {\r\n setLastName(event.target.value);\r\n }\r\n\r\n function onUpdateEmail (event: any) {\r\n setEmail(event.target.value);\r\n setEmailNotValid(!emailRegex.test(event.target.value));\r\n }\r\n\r\n function onUpdateAzureADTenantId (event: any) {\r\n setAzureTenantId(event.target.value);\r\n setAzureTenantIdNotValid(!validGuidRegex.test(event.target.value));\r\n }\r\n\r\n return (\r\n
    \r\n \r\n {showDialog && (\r\n \r\n )}\r\n setErrorMessage(\"\")} />\r\n setSuccessMessage(\"\")} />\r\n
    \r\n );\r\n}\r\n\r\ninterface ComponentProps { }\r\n\r\nexport default NewTenant;\r\n","import * as React from \"react\";\r\n\r\nimport Button from \"@mui/material/Button\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport IconButton from \"@mui/material/IconButton\";\r\nimport ClearIcon from \"@mui/icons-material/Clear\";\r\n\r\nconst TenantFilterButtons: React.FunctionComponent = props => {\r\n return (\r\n \r\n \r\n \r\n {props.onCloseFilters &&\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n \r\n );\r\n}\r\n \r\n\r\ninterface ComponentProps {\r\n canSearch: boolean;\r\n onApplyFilters: () => void;\r\n onClearFilters: () => void;\r\n onCloseFilters?: () => void;\r\n}\r\n\r\nexport default TenantFilterButtons;","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport TextField from \"@mui/material/TextField\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\n\r\nconst TenantFilter: React.FunctionComponent = ({\r\n textToSearch,\r\n searchTextPlaceholder,\r\n onUpdateTextToSearch\r\n}) => {\r\n return (\r\n <>\r\n \r\n \r\n }}\r\n onChange={(e) => {\r\n onUpdateTextToSearch(e)\r\n }}\r\n className=\"text-to-search\"\r\n />\r\n \r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n textToSearch: string;\r\n searchTextPlaceholder?: string;\r\n onUpdateTextToSearch: (event) => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(TenantFilter);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport FilterContainer from \"modules/common/components/filters/filterContainer\";\r\nimport TenantFilterButtons from \"./tenantFilterButtons\";\r\nimport TenantSearch from \"./tenantSearch\";\r\n\r\n\r\nconst TenantFilter: React.FunctionComponent = ({\r\n textToSearch,\r\n searchTextPlaceholder,\r\n canSearch,\r\n onUpdateTextToSearch\r\n}) => {\r\n\r\n \r\n return (\r\n \r\n \r\n
    \r\n }\r\n filterCommands={}\r\n />\r\n );\r\n}\r\n\r\ninterface ComponentProps {\r\n textToSearch: string;\r\n searchTextPlaceholder?: string;\r\n canSearch: boolean;\r\n onUpdateTextToSearch: (event) => void;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(TenantFilter);","import * as React from \"react\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport TenantFilter from \"../filters/tenantFilter\";\r\nimport { Table, TableBody, TableContainer, TableHead, TableRow } from \"@mui/material\";\r\n\r\nconst TenantListing: React.FunctionComponent = () => {\r\n const [textToSearch, setTextToSearch] = React.useState(\"\");\r\n const [canSearch, setCanSearch] = React.useState(false);\r\n\r\n /* Gave the page some look, functionality is currently disabled until the next iteration. */\r\n const getFilter = (): JSX.Element => {\r\n return (\r\n \r\n );\r\n }\r\n\r\n /*\r\n Will be used in the next iteration, this is just set up and ready for now.\r\n */\r\n const getList = (): JSX.Element => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n \r\n );\r\n };\r\n\r\n const onChangeSearch = (event: any) => {\r\n if(event.target.value.length > 0) {\r\n setCanSearch(true)\r\n } else {\r\n setCanSearch(false)\r\n }\r\n\r\n setTextToSearch(event.target.value);\r\n }\r\n \r\n return (\r\n <>\r\n {getFilter()}\r\n {getList()}\r\n \r\n );\r\n}\r\n\r\ninterface ComponentProps {}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps\r\n })\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(TenantListing);","import * as React from \"react\"\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Header from \"pages/common/header\";\r\nimport MainContent from \"pages/common/mainContent\";\r\nimport NewTenant from \"./action-buttons/newTenant\";\r\nimport TenantListing from \"./tenant-listing/tenantListing\";\r\n\r\n\r\nclass TenantManagementPage extends React.Component<{}, {}> {\r\n public render() {\r\n return (\r\n \r\n \r\n \r\n \r\n }\r\n />\r\n \r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n\r\n\r\nexport default TenantManagementPage;","import { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\nimport RequireRole from \"modules/common/components/requireRole\";\r\nimport PageForbidden from \"pages/pageForbidden/pageForbidden\";\r\nimport * as React from \"react\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { Route, RouteComponentProps, withRouter } from \"react-router\";\r\n\r\nconst AuthRoute: React.FunctionComponent = ({\r\n path,\r\n roleName,\r\n component,\r\n exact = false,\r\n children,\r\n}) => {\r\n return }>\r\n \r\n {children}\r\n \r\n ;\r\n};\r\n\r\ninterface ComponentProps {\r\n path: string;\r\n exact?: boolean;\r\n roleName: UserRoleStrings;\r\n component?: React.ComponentType;\r\n};\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps ) => ({\r\n ...ownProps,\r\n }),\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default withRouter(connector(AuthRoute));\r\n","import { useEffect, useRef, useState } from \"react\";\r\n\r\nimport { IMobileConfig } from \"modules/settings\";\r\nimport useIsMounted from \"../useIsMounted\";\r\nimport { settingsApi } from \"api/instances\";\r\n\r\nexport type IUseMobileConfigReturn = {\r\n mobileConfig: IMobileConfig | undefined;\r\n isError: boolean;\r\n isLoading: boolean;\r\n};\r\n\r\n// Move to redux if we start using in multiple places\r\nexport const useMobileConfig = (): IUseMobileConfigReturn => {\r\n const [mobileConfig, setMobileConfig] = useState();\r\n const [isError, setIsError] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const isMounted = useIsMounted();\r\n const fetched = useRef(false);\r\n\r\n useEffect(() => {\r\n const fetchMobileConfig = async () => {\r\n try {\r\n fetched.current = true;\r\n setIsLoading(true);\r\n const { data } = await settingsApi.getMobileConfig();\r\n\r\n if (isMounted()) setMobileConfig(data);\r\n } catch (err) {\r\n if (isMounted()) setIsError(true);\r\n } finally {\r\n if (isMounted()) setIsLoading(false);\r\n }\r\n };\r\n\r\n if (!fetched.current) fetchMobileConfig();\r\n }, [mobileConfig, isMounted]);\r\n\r\n return {\r\n mobileConfig,\r\n isError,\r\n isLoading,\r\n };\r\n};\r\n","import React, { useState } from \"react\";\r\nimport { MenuItem, FormControlLabel, Checkbox, Select, TextField } from \"@mui/material\";\r\n\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport { HomeScreenType, HOME_SCREEN_TYPE_MAP } from \"modules/homeScreens/models\";\r\nimport { InputCounter } from \"modules/common/components/forms/inputs/inputCounter\";\r\n\r\ninterface IHomeScreenTypeSelectProps {\r\n value: HomeScreenType;\r\n showFeed: boolean;\r\n publishedBandsCount: number;\r\n isLoading: boolean;\r\n feedHeader: string | null;\r\n onChangeShowFeed: (checked: boolean) => void;\r\n onChangeFeedHeader: (header: string) => void;\r\n onChangeScreenType: (newType: HomeScreenType) => void;\r\n}\r\n\r\nexport const HomeScreenTypeSelect: React.FunctionComponent = ({\r\n value,\r\n showFeed,\r\n feedHeader,\r\n publishedBandsCount,\r\n isLoading,\r\n onChangeShowFeed,\r\n onChangeScreenType,\r\n onChangeFeedHeader,\r\n}) => {\r\n const [isHeaderFocused, setIsHeaderFocused] = useState(false);\r\n const isError = value === HomeScreenType.ContentBands && publishedBandsCount === 0;\r\n\r\n return (\r\n
    \r\n onChangeScreenType(evt.target.value as HomeScreenType)}\r\n className=\"select\"\r\n >\r\n {HOME_SCREEN_TYPE_MAP[HomeScreenType.MyFeed]}\r\n {HOME_SCREEN_TYPE_MAP[HomeScreenType.ContentBands]}\r\n \r\n {value === HomeScreenType.ContentBands && (\r\n <>\r\n onChangeShowFeed(evt.target.checked)}\r\n />\r\n }\r\n label={Show My Feed below content bands}\r\n />\r\n {showFeed && (\r\n <>\r\n ) =>\r\n onChangeFeedHeader(evt.target.value.substring(0, 35))\r\n }\r\n size=\"small\"\r\n inputProps={{\r\n onBlur: () => {\r\n setIsHeaderFocused(false);\r\n },\r\n onFocus: () => {\r\n setIsHeaderFocused(true);\r\n },\r\n }}\r\n />\r\n }\r\n label={\r\n Header}>\r\n This text appears in between the last band and on top of the posts feed.\r\n \r\n }\r\n />\r\n \r\n \r\n )}\r\n \r\n )}\r\n {isError && !isLoading && (\r\n Publish at least 1 content band to use as home screen.\r\n )}\r\n
    \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { useDispatch } from \"react-redux\";\r\n\r\nimport { IHomeScreenConfig, HomeScreenType, HOME_SCREEN_PLATFORM_MAP } from \"modules/homeScreens/models\";\r\nimport { homeScreensSlice } from \"modules/homeScreens/reducer\";\r\nimport { HomeScreenTypeSelect } from \"./homeScreenSelect\";\r\n\r\ninterface IHomeScreenSettingsFormProps {\r\n config: IHomeScreenConfig;\r\n publishedBandsCount: number;\r\n isLoading: boolean;\r\n}\r\n\r\nexport const HomeScreenSettingsForm: React.FunctionComponent = ({\r\n config,\r\n publishedBandsCount,\r\n isLoading,\r\n}) => {\r\n const dispatch = useDispatch();\r\n\r\n const onChangeHomeScreenType = (newType: HomeScreenType) => {\r\n dispatch({\r\n type: homeScreensSlice.actions.SET_HOME_SCREEN_TYPE,\r\n payload: {\r\n platform: config.platform,\r\n homeScreenType: newType,\r\n },\r\n });\r\n };\r\n\r\n const onChangeShowFeed = (checked: boolean) => {\r\n dispatch({\r\n type: homeScreensSlice.actions.SET_SHOW_FEED_BELOW,\r\n payload: {\r\n platform: config.platform,\r\n show: checked,\r\n },\r\n });\r\n };\r\n\r\n const onChangeFeedHeader = (newHeader: string) => {\r\n dispatch({\r\n type: homeScreensSlice.actions.SET_HEADER_TEXT,\r\n payload: {\r\n text: newHeader,\r\n platform: config.platform,\r\n },\r\n });\r\n };\r\n\r\n return (\r\n <>\r\n
    \r\n {HOME_SCREEN_PLATFORM_MAP[config.platform]}\r\n \r\n
    \r\n \r\n );\r\n};\r\n","import React, { useMemo } from \"react\";\r\nimport { Button } from \"@mui/material\";\r\n\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\nimport { HomeScreenType, IHomeScreenConfig } from \"modules/homeScreens/models\";\r\nimport { useDispatch } from \"react-redux\";\r\nimport { homeScreensSlice } from \"modules/homeScreens/reducer\";\r\nimport { HomeScreenSettingsForm } from \"./homeScreenSettingsForm\";\r\n\r\ninterface IHomeScreenSettingsProps {\r\n homeScreenConfigs: IHomeScreenConfig[];\r\n pristineConfigs: IHomeScreenConfig[];\r\n publishedBandsCount: number;\r\n isLoading: boolean;\r\n onSave: () => Promise;\r\n}\r\n\r\nexport const HomeScreenSettings: React.FunctionComponent = ({\r\n homeScreenConfigs,\r\n pristineConfigs,\r\n publishedBandsCount,\r\n isLoading,\r\n onSave,\r\n}) => {\r\n const dispatch = useDispatch();\r\n\r\n /**\r\n * Reset configs to saved values\r\n */\r\n const onReset = () => {\r\n dispatch({ type: homeScreensSlice.actions.RESET_CONFIGS });\r\n };\r\n\r\n const isPristine = useMemo(() => {\r\n // start off by checking lengths\r\n let isPristine = pristineConfigs.length === homeScreenConfigs.length;\r\n\r\n // lengths are equal, check pristine config properties against current changes\r\n if (isPristine) {\r\n for (let i = 0; i < pristineConfigs.length; i++) {\r\n const pristineConfig = pristineConfigs[i];\r\n // grab the same config from current changes\r\n let current = homeScreenConfigs.find((currConfig: IHomeScreenConfig) => pristineConfig.id === currConfig.id);\r\n\r\n // check each property\r\n if (current) {\r\n let keys = Object.keys(current);\r\n isPristine = !keys.some((key: string) => current![key] !== pristineConfig[key]);\r\n }\r\n\r\n // early exit if there are already changes compared to pristine\r\n if (!isPristine) break;\r\n }\r\n }\r\n\r\n return isPristine;\r\n }, [homeScreenConfigs, pristineConfigs]);\r\n\r\n const isError =\r\n homeScreenConfigs.some((c: IHomeScreenConfig) => c.homeScreenType === HomeScreenType.ContentBands) && publishedBandsCount === 0;\r\n\r\n return (\r\n <>\r\n \r\n Home Screens\r\n Select your organization's home screen for each channel.\r\n \r\n {homeScreenConfigs.map((config: IHomeScreenConfig) => (\r\n \r\n ))}\r\n
    \r\n \r\n RESET\r\n \r\n await onSave()}\r\n >\r\n SAVE CHANGES\r\n \r\n
    \r\n \r\n );\r\n};\r\n","// a wrapper around assert.deepStrictEqual to return boolean values\r\n\r\nimport { AssertionError, deepStrictEqual } from \"assert\"\r\n\r\nexport const deepStrictEqualWrapper = (actual: any, expected: any): boolean => {\r\n try {\r\n deepStrictEqual(actual, expected, \"NOT_EQUAL\");\r\n\r\n return true;\r\n } catch (error) {\r\n if (error instanceof AssertionError && error.message === \"NOT_EQUAL\")\r\n return false;\r\n\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Checks if two arrays have the same elements in the same order.\r\n * @param array1 First array to compare.\r\n * @param array2 Second array to compare.\r\n * @returns True if both arrays have the same elements in the same order, false otherwise.\r\n */\r\nexport function arraysEqual(array1: T[], array2: T[]): boolean {\r\n if (array1.length !== array2.length) {\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < array1.length; i++) {\r\n if (array1[i] !== array2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n","import React, { useMemo } from \"react\";\r\nimport { useHistory } from \"react-router\";\r\nimport { useSelector } from \"react-redux\";\r\n\r\nimport { Button, Link } from \"@mui/material\";\r\nimport { EditOutlined, InfoOutlined, VisibilityOutlined } from \"@mui/icons-material\";\r\n\r\nimport { castBandToComparableSettings } from \"modules/common/hooks/data/useContentBands\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { IContentBand, IContentBandSettings } from \"modules/contentBands/models\";\r\nimport { deepStrictEqualWrapper } from \"utils/equalityUtils\";\r\n\r\nimport \"../../styles/contentBandsButton.sass\";\r\n\r\ninterface IContentBandsInput {\r\n contentBands: IContentBand[];\r\n publishedBands: IContentBand[];\r\n onEdit: () => void;\r\n onPreview: () => void;\r\n}\r\n\r\nexport const ContentBandsButtons: React.FunctionComponent = ({ contentBands, publishedBands, onEdit, onPreview }) => {\r\n const { portalPagesEnabled } = useSelector((state: GlobalApplicationState) => state.settings.tenantSettings.showFeatures);\r\n const { id: tenantId } = useSelector((state:GlobalApplicationState) => state.tenant);\r\n const publishCount = publishedBands.length;\r\n const history = useHistory();\r\n\r\n const isUnpublishedChanges = useMemo(() => {\r\n const comparableContentBands = contentBands.map(castBandToComparableSettings);\r\n const comparablePublishedBands = publishedBands.map(castBandToComparableSettings);\r\n\r\n return comparableContentBands.some(\r\n (cb: Partial, idx: number) => !deepStrictEqualWrapper(cb, comparablePublishedBands[idx])\r\n );\r\n }, [contentBands, publishedBands]);\r\n\r\n return (\r\n
    \r\n

    Content Bands

    \r\n

    \r\n Use{\" \"}\r\n \r\n Content Bands\r\n \r\n {\" \"}to customize and filter posts and events that appear on the home screens of your Mobile or MS Teams apps.\r\n {portalPagesEnabled && (\r\n \r\n {\" \"}Go to {\" \"}\r\n history.push(`/${tenantId}/admin/portalPages`)}>\r\n portal pages\r\n \r\n {\" \"}to edit your Company Portal’s homepage.\r\n \r\n )}\r\n

    \r\n
    \r\n
    \r\n {publishCount === 0 ? (\r\n \r\n No bands published\r\n \r\n ) : (\r\n \r\n {publishCount} band{publishCount === 1 ? \"\" : \"s\"} published\r\n \r\n )}\r\n {isUnpublishedChanges && (\r\n } underline={false} inline>\r\n There are unpublished changes to your content bands.\r\n \r\n )}\r\n
    \r\n }\r\n disabled={publishCount < 1}\r\n classes={{\r\n startIcon: \"start-icon\",\r\n }}\r\n onClick={onPreview}\r\n >\r\n PREVIEW\r\n \r\n }\r\n classes={{\r\n startIcon: \"start-icon\",\r\n }}\r\n onClick={onEdit}\r\n >\r\n EDIT\r\n \r\n
    \r\n
    \r\n );\r\n};\r\n","import { useEffect } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\n\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { fetchHomeScreenConfigs } from \"modules/homeScreens/reducer\";\r\nimport { HomeScreensStateStatus, IHomeScreenConfig } from \"modules/homeScreens/models\";\r\n\r\nexport type UseHomeScreenConfigsType = {\r\n homeScreenConfigs: IHomeScreenConfig[] | undefined;\r\n pristineConfigs: IHomeScreenConfig[] | undefined;\r\n isLoading: boolean;\r\n successMessage: string | undefined;\r\n};\r\n\r\n/**\r\n * Fetches home screen configs into redux if not there\r\n */\r\nexport const useHomeScreenConfigs = (): UseHomeScreenConfigsType => {\r\n const { homeScreenConfigs, status, pristineConfigs, successMessage } = useSelector((state: GlobalApplicationState) => state.homeScreenConfigs);\r\n const dispatch = useDispatch();\r\n\r\n useEffect(() => {\r\n if (homeScreenConfigs === undefined) dispatch(fetchHomeScreenConfigs());\r\n }, [homeScreenConfigs, dispatch]);\r\n\r\n return {\r\n homeScreenConfigs,\r\n successMessage,\r\n pristineConfigs,\r\n isLoading: status === HomeScreensStateStatus.Loading,\r\n };\r\n};\r\n","import React, { useMemo } from \"react\";\r\n\r\nimport DateBlock from \"modules/events/components/date-block/dateBlock\";\r\nimport { IContentBandLayoutProps } from \"./contentBandLayoutPreview\";\r\n\r\ninterface IContentBandCardLayoutProps extends IContentBandLayoutProps {\r\n rightHeroBadge?: JSX.Element; // component to render top right corner of hero\r\n fullTitle?: boolean;\r\n}\r\n\r\nexport const ContentBandCard: React.FunctionComponent = ({\r\n bannerColor = \"#2196f3\",\r\n settings,\r\n heroUrl,\r\n title,\r\n leftInfo,\r\n rightInfo,\r\n rightHeroBadge,\r\n leftHeroBadge,\r\n dateBlock,\r\n fullTitle = false,\r\n size = \"sm\",\r\n}) => {\r\n const { displayFullTitles } = settings;\r\n\r\n const usableTitle = useMemo(\r\n () => (displayFullTitles ? title : `${title.length > 55 ? title.substring(0, 52).trim() + \"...\" : title}`),\r\n [displayFullTitles, title]\r\n );\r\n\r\n return (\r\n
    \r\n \r\n
    \r\n {leftHeroBadge}\r\n \r\n {rightHeroBadge}\r\n
    \r\n
    \r\n {dateBlock && }\r\n \r\n
    \r\n

    {usableTitle}

    \r\n
    \r\n {leftInfo}\r\n {rightInfo &&
    {rightInfo}
    }\r\n
    \r\n
    \r\n \r\n );\r\n};\r\n","import React, { useMemo } from \"react\";\r\nimport { Chip } from \"@mui/material\";\r\nimport moment from \"moment\";\r\n\r\nimport { IContentBandLayoutProps } from \"./contentBandLayoutPreview\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { DEFAULT_CONFIG } from \"../../reducer\";\r\nimport { useDefaultLocale } from \"modules/common/hooks/useDefaultLocale\";\r\n\r\ninterface IContentBandWindowProps extends IContentBandLayoutProps {\r\n rightHeroBadge?: JSX.Element; // component to render top right corner of hero\r\n}\r\n\r\nexport const ContentBandWindow: React.FunctionComponent = ({\r\n bannerColor = \"#2196f3\",\r\n heroUrl,\r\n title,\r\n leftInfo,\r\n rightInfo,\r\n leftHeroBadge,\r\n rightHeroBadge,\r\n size = \"sm\",\r\n dateBlock,\r\n}) => {\r\n const { config } = useSelector((state: GlobalApplicationState) => state.contentBands);\r\n const usableConfig = config || DEFAULT_CONFIG;\r\n\r\n useDefaultLocale();\r\n\r\n const usableTitle = useMemo(() => (title && title.length > 55 ? title.substring(0, 52).trim() + \"...\" : title), [title]);\r\n\r\n const dateToUse = dateBlock?.isAllDayEvent ? moment.utc(dateBlock.eventStartTime).startOf(\"day\") : moment(dateBlock?.eventStartTime);\r\n const getChipLabel = (): string =>\r\n dateBlock\r\n ? `STARTS ${dateToUse.format(`MMM D, ${dateBlock.isAllDayEvent ? \"\" : \"h:mmA\"}`)}${\r\n dateBlock.isAllDayEvent ? \"ALL DAY\" : \"\"\r\n }`.toUpperCase()\r\n : \"\";\r\n\r\n const getBackgroundStylesForSize = (): React.CSSProperties | undefined => {\r\n let result: React.CSSProperties | undefined = undefined;\r\n\r\n if (size === \"lg\") {\r\n result = {\r\n backgroundSize: \"cover\" /* Image will cover the entire div */,\r\n backgroundRepeat: \"no-repeat\",\r\n backgroundPosition: \"center\",\r\n };\r\n }\r\n\r\n return result;\r\n };\r\n\r\n const linearGradient = `linear-gradient(to bottom, rgba(0,0,0,0), ` +\r\n `rgb(${usableConfig.contentBandsGradientColor.rgb.r}, ` +\r\n `${usableConfig.contentBandsGradientColor.rgb.g}, ` +\r\n `${usableConfig.contentBandsGradientColor.rgb.b}))`;\r\n\r\n return (\r\n \r\n
    \r\n {dateBlock && }\r\n {leftHeroBadge}\r\n \r\n {rightHeroBadge}\r\n
    \r\n \r\n
    \r\n {usableTitle}\r\n
    \r\n {leftInfo}\r\n {rightInfo &&
    {rightInfo}
    }\r\n
    \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { IconButton, IconButtonProps } from \"@mui/material\";\r\nimport { FiberManualRecord, KeyboardArrowLeft, KeyboardArrowRight } from \"@mui/icons-material\";\r\n\r\nimport { IContentBandLayoutProps } from \"./contentBandLayoutPreview\";\r\nimport { ContentBandContentType, IContentBand } from \"../../models\";\r\nimport { PostFeedItem } from \"modules/posts/models\";\r\nimport { EventFeedItem } from \"modules/events\";\r\nimport BreakingFeaturedBanner from \"modules/posts/components/banners/breakingFeaturedBanner\";\r\nimport DateBlock from \"modules/events/components/date-block/dateBlock\";\r\nimport ReadDate from \"modules/posts/components/post-feed/components/dates/ReadDate\";\r\nimport useIsFirstRender from \"modules/common/hooks/useIsFirstRender\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { DEFAULT_CONFIG } from \"../../reducer\";\r\nimport { getTranslatedDescription } from \"utils/getTranslatedContent\";\r\n\r\ninterface IContentBandCarouselProps {\r\n contentBand: IContentBand;\r\n items: PostFeedItem[] | EventFeedItem[];\r\n activeLcid: string;\r\n autoPlay: boolean;\r\n fullWidth?: boolean;\r\n size: \"sm\" | \"lg\";\r\n contentType?: ContentBandContentType;\r\n getLeftInfo: (item: PostFeedItem | EventFeedItem) => JSX.Element;\r\n getPostTypeBanner: (item: PostFeedItem) => JSX.Element;\r\n}\r\n\r\nexport const ContentBandCarousel: React.FunctionComponent = ({\r\n contentBand,\r\n items,\r\n activeLcid,\r\n autoPlay,\r\n size = \"sm\",\r\n contentType = ContentBandContentType.Post,\r\n fullWidth = true,\r\n getPostTypeBanner,\r\n getLeftInfo,\r\n}) => {\r\n const itemCount = items.length;\r\n const pinnedIds = contentBand.pinnedIds;\r\n const [activeIdx, setActiveIdx] = useState(0);\r\n const isPosts = contentBand.contentType === ContentBandContentType.Post;\r\n const isFirstRender = useIsFirstRender();\r\n const timeout = useRef(null);\r\n\r\n const timeoutHandler = useCallback(() => {\r\n setActiveIdx((prev) => {\r\n let next = ++prev;\r\n\r\n if (prev === itemCount) next = 0;\r\n\r\n return next;\r\n });\r\n }, [itemCount]);\r\n\r\n // go back to beginning of carousel if pinned items change\r\n useEffect(() => {\r\n if (isFirstRender && (pinnedIds?.length || 0) > 0) setActiveIdx(0);\r\n }, [isFirstRender, pinnedIds]);\r\n\r\n useEffect(() => {\r\n if (autoPlay) timeout.current = setInterval(timeoutHandler, 6000);\r\n\r\n return () => {\r\n if (timeout.current) clearInterval(timeout.current);\r\n };\r\n }, [autoPlay, itemCount, timeoutHandler]);\r\n\r\n const onClickDot = (idx: number) => {\r\n // clear timeout so 6 seconds starts again\r\n if (timeout.current) clearInterval(timeout.current);\r\n\r\n if (idx > -1 && idx < items.length) setActiveIdx(idx);\r\n\r\n // restart timer\r\n if (autoPlay) timeout.current = setInterval(timeoutHandler, 6000);\r\n };\r\n\r\n const onNext = () => {\r\n setActiveIdx((prevIndex) => (prevIndex === items.length - 1 ? 0 : prevIndex + 1));\r\n };\r\n\r\n const onPrev = () => {\r\n setActiveIdx((prevIndex) => (prevIndex === 0 ? items.length - 1 : prevIndex - 1));\r\n };\r\n\r\n return (\r\n <>\r\n
    \r\n {items.map((item: PostFeedItem | EventFeedItem) => (\r\n : undefined}\r\n leftInfo={getLeftInfo(item)}\r\n rightInfo={\r\n \r\n }\r\n contentType={contentType}\r\n onNext={onNext}\r\n onPrev={onPrev}\r\n />\r\n ))}\r\n
    \r\n \r\n \r\n );\r\n};\r\n\r\ninterface IContentBandCarouselItemProps extends IContentBandLayoutProps {\r\n carouselIdx: number;\r\n fullWidth?: boolean;\r\n summary?: string;\r\n rightHeroBadge?: JSX.Element; // component to render top right corner of hero\r\n contentType?: ContentBandContentType;\r\n onNext?: () => void;\r\n onPrev?: () => void;\r\n}\r\n\r\nexport const ContentBandCarouselItem: React.FunctionComponent = ({\r\n carouselIdx,\r\n heroUrl,\r\n title,\r\n fullWidth = false,\r\n size,\r\n summary,\r\n bannerColor,\r\n leftInfo,\r\n rightInfo,\r\n dateBlock,\r\n leftHeroBadge,\r\n rightHeroBadge,\r\n contentType,\r\n onNext,\r\n onPrev,\r\n}) => {\r\n const [isItemHovered, setIsItemHovered] = useState(false);\r\n const { config } = useSelector((state: GlobalApplicationState) => state.contentBands);\r\n const usableConfig = config || DEFAULT_CONFIG;\r\n const containerRef = useRef(null);\r\n const itemHorizontalMargin = fullWidth ? 0 : 10;\r\n const isSm = size === \"sm\";\r\n\r\n const usableTitle = useMemo(() => (title && title.length > 55 ? title.substring(0, 52).trim() + \"...\" : title), [title]);\r\n\r\n /**\r\n * Use parent container width to decide how much to move items over\r\n * as we cycle through carousel\r\n * - add 2*itemHorizontalMargin to make sure margins are shifted far enough over\r\n */\r\n const getTransformBy = (): number => {\r\n if (!containerRef.current) return 0;\r\n\r\n let newWidth = containerRef.current.getBoundingClientRect().width;\r\n\r\n return -carouselIdx * (newWidth + 2 * itemHorizontalMargin);\r\n };\r\n\r\n const getOverlayInfo = (truncateTitle: boolean): JSX.Element => (\r\n <>\r\n
    \r\n {leftHeroBadge}\r\n
    {rightHeroBadge}
    \r\n
    \r\n
    \r\n {isSm && dateBlock && }\r\n
    \r\n {truncateTitle ? usableTitle : title}\r\n {!isSm && summary && {summary}}\r\n
    \r\n
    \r\n {leftInfo}\r\n {rightInfo &&
    {rightInfo}
    }\r\n
    \r\n
    \r\n \r\n );\r\n\r\n // helper to get the common props for the arrow buttons on lg carousel\r\n const getHoverArrowButtonsProps = (): IconButtonProps => ({\r\n sx: {\r\n visibility: isItemHovered ? \"visible\" : \"hidden\",\r\n borderRadius: \"50%\",\r\n bgcolor: \"#7f7f7f\",\r\n \"&:hover\": {\r\n bgcolor: \"#7f7f7f\",\r\n },\r\n },\r\n });\r\n\r\n const linearGradient =\r\n `linear-gradient(to bottom, rgba(0,0,0,0), ` +\r\n `rgb(${usableConfig.contentBandsGradientColor.rgb.r}, ` +\r\n `${usableConfig.contentBandsGradientColor.rgb.g}, ` +\r\n `${usableConfig.contentBandsGradientColor.rgb.b}))`;\r\n\r\n return (\r\n setIsItemHovered(true)}\r\n onMouseLeave={() => setIsItemHovered(false)}\r\n >\r\n {!isSm && (\r\n <>\r\n \r\n {getOverlayInfo(false)}\r\n \r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n \r\n )}\r\n \r\n {isSm ? (\r\n <>\r\n {getOverlayInfo(true)}\r\n
    \r\n \r\n ) : (\r\n dateBlock && \r\n )}\r\n
    \r\n \r\n );\r\n};\r\n\r\ninterface IDotProps {\r\n numDots: number;\r\n activeIdx: number;\r\n containerClassName?: string;\r\n onClickDot: (idx: number) => void;\r\n}\r\n\r\nexport const Dots: React.FC = ({ numDots, activeIdx, containerClassName, onClickDot }) => {\r\n return (\r\n \r\n {Array(numDots)\r\n .fill(0)\r\n .map((_, idx: number) => (\r\n onClickDot(idx)}\r\n >\r\n \r\n \r\n ))}\r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Button, Skeleton } from \"@mui/material\";\r\n\r\nimport \"../../styles/contentBandSeeMore.sass\";\r\n\r\ninterface IContentBandSeeMore {\r\n className?: string;\r\n full?: boolean;\r\n size?: \"sm\" | \"lg\";\r\n}\r\n\r\nexport const ContentBandCardSeeMore: React.FC = ({ size }) => {\r\n const isSm = size === \"sm\";\r\n\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n};\r\n\r\nexport const ContentBandWindowSeeMore: React.FC = ({ size }) => {\r\n const isSm = size === \"sm\";\r\n\r\n return (\r\n
    \r\n \r\n \r\n
    \r\n );\r\n};\r\n\r\nexport const SeeMoreButton: React.FC = (style?: React.CSSProperties) => (\r\n \r\n SEE MORE\r\n \r\n);\r\n","import React, { useEffect, useRef } from \"react\";\r\n\r\nimport { ContentBandContentType, ContentBandLayoutType, IContentBand, IContentBandSettings } from \"../../models\";\r\nimport { PostFeedItem } from \"modules/posts/models\";\r\nimport { EventFeedItem } from \"modules/events\";\r\nimport { ContentBandCard } from \"./contentBandCard\";\r\nimport { getTranslatedTitle } from \"utils/getTranslatedContent\";\r\nimport Attendance from \"modules/events/components/attendance/attendance\";\r\nimport BreakingFeaturedBanner from \"modules/posts/components/banners/breakingFeaturedBanner\";\r\nimport moment from \"moment\";\r\nimport ReadDate from \"modules/posts/components/post-feed/components/dates/ReadDate\";\r\nimport PostTypeBanner from \"modules/common/components/banners/postTypeBanner\";\r\nimport { IDateBlockProps } from \"modules/events/components/date-block/dateBlock\";\r\nimport { ContentBandWindow } from \"./contentBandWindow\";\r\nimport { ContentBandCarousel } from \"./contentBandCarousel\";\r\nimport { ContentBandCardSeeMore, ContentBandWindowSeeMore } from \"./contentBandSeeMore\";\r\nimport { calculateNumberOfLines } from \"utils/htmlUtils\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { IHomeScreenConfig } from \"modules/homeScreens/models\";\r\n\r\nimport \"../../styles/contentBandLayouts.sass\";\r\nimport { useDefaultLocale } from \"modules/common/hooks/useDefaultLocale\";\r\n\r\nexport interface IContentBandLayoutProps {\r\n settings: IContentBandSettings;\r\n bannerColor?: string; // solid color to display instead of hero url\r\n heroUrl?: string;\r\n title: string;\r\n leftInfo?: JSX.Element; // component to render in whitespace to left and below of title\r\n rightInfo?: JSX.Element; // component to render in whitespace below and right of title\r\n leftHeroBadge?: JSX.Element; // component to render top left corner of hero\r\n dateBlock?: IDateBlockProps;\r\n mobileHomeScreenSettings?: IHomeScreenConfig;\r\n size?: \"sm\" | \"lg\";\r\n}\r\n\r\ninterface IContentBandLayoutPreviewProps {\r\n idx: number;\r\n contentBand: IContentBand;\r\n activeLcid: string;\r\n fullWidth?: boolean; // controls whether carousel is full width or not\r\n containerClassName?: string;\r\n isLoading?: boolean;\r\n size?: \"sm\" | \"lg\";\r\n}\r\n\r\nexport const ContentBandLayoutPreview: React.FunctionComponent = ({\r\n idx,\r\n fullWidth = true,\r\n isLoading = false,\r\n contentBand,\r\n activeLcid,\r\n containerClassName = \"\",\r\n size = \"sm\",\r\n}) => {\r\n const isPosts = contentBand.contentType === ContentBandContentType.Post;\r\n const { seeMoreEnabled } = contentBand;\r\n const scrollId = `content-band-content-scroll-${idx}`;\r\n useDefaultLocale();\r\n\r\n const isTitleGreaterThanTwoLinesOnCard = (p: PostFeedItem | EventFeedItem): boolean =>\r\n calculateNumberOfLines(204, getTranslatedTitle(p.translatedContent, activeLcid)) > 2;\r\n\r\n const shouldStretch: boolean =\r\n contentBand.layoutType === ContentBandLayoutType.Card\r\n ? isPosts\r\n ? contentBand.posts?.some(isTitleGreaterThanTwoLinesOnCard)\r\n : contentBand.events?.some(isTitleGreaterThanTwoLinesOnCard)\r\n : false;\r\n\r\n // keep track of whether or not we should scroll when seeMoreEnabled = true\r\n const seeMoreOffOnce = useRef(!seeMoreEnabled);\r\n\r\n // scroll to end of content to see see more button\r\n useEffect(() => {\r\n if (!seeMoreOffOnce.current) seeMoreOffOnce.current = !seeMoreEnabled;\r\n\r\n if (seeMoreEnabled && seeMoreOffOnce.current) {\r\n const el = document.getElementById(scrollId);\r\n if (el) el.scrollLeft = 781; // max value for the container\r\n }\r\n }, [seeMoreEnabled, scrollId]);\r\n\r\n const getLayout = (item: PostFeedItem | EventFeedItem): JSX.Element => {\r\n let result: JSX.Element = <>;\r\n\r\n switch (contentBand.layoutType) {\r\n case ContentBandLayoutType.Window:\r\n result = getWindow(item);\r\n break;\r\n case ContentBandLayoutType.Card:\r\n default:\r\n result = getCard(item);\r\n break;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n const getLeftInfo = (item: PostFeedItem | EventFeedItem): JSX.Element => {\r\n let result = <>;\r\n\r\n if (isPosts) {\r\n let post = item as PostFeedItem;\r\n result = {moment(post.publishTime).format(\"MMM D, YYYY\")};\r\n } else {\r\n let event = item as EventFeedItem;\r\n result = ;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n const getPostTypeBanner = (item: PostFeedItem): JSX.Element => {\r\n return ;\r\n };\r\n\r\n const getBaseProps = (item: PostFeedItem | EventFeedItem): IContentBandLayoutProps => ({\r\n settings: contentBand,\r\n title: getTranslatedTitle(item.translatedContent, activeLcid),\r\n heroUrl: item.imageUrl,\r\n leftInfo: getLeftInfo(item),\r\n leftHeroBadge: isPosts ? getPostTypeBanner(item as PostFeedItem) : undefined,\r\n dateBlock: isPosts ? undefined : { ...(item as EventFeedItem), showMultiBlocks: false },\r\n bannerColor: isPosts ? undefined : (item as EventFeedItem).bannerColor,\r\n rightInfo: ,\r\n size,\r\n });\r\n\r\n const getCard = (item: PostFeedItem | EventFeedItem): JSX.Element => (\r\n : undefined}\r\n />\r\n );\r\n\r\n const getWindow = (item: PostFeedItem | EventFeedItem): JSX.Element => (\r\n : undefined}\r\n />\r\n );\r\n\r\n const getCarousel = (): JSX.Element => (\r\n \r\n );\r\n\r\n return (\r\n \r\n {isLoading ? (\r\n \r\n ) : (\r\n <>\r\n {contentBand.layoutType === ContentBandLayoutType.Carousel ? (\r\n getCarousel()\r\n ) : (\r\n <>{isPosts ? contentBand.posts.map(getLayout) : contentBand.events.map(getLayout)}\r\n )}\r\n {/* only display if enabled and have fetched content already */}\r\n {contentBand.seeMoreEnabled &&\r\n ((isPosts && contentBand.posts.length > 0) || (!isPosts && contentBand.events.length > 0)) &&\r\n (contentBand.layoutType === ContentBandLayoutType.Card ? (\r\n \r\n ) : (\r\n \r\n ))}\r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React from \"react\";\r\n\r\nimport { IContentBand, IContentBandConfig } from \"../../models\";\r\nimport { ContentBandLayoutPreview } from \"./contentBandLayoutPreview\";\r\n\r\nimport \"../../styles/contentBandsMobilePreview.sass\";\r\n\r\nexport interface IContentMobilePreviewProps {\r\n contentBands: IContentBand[];\r\n activeLcid: string;\r\n isLoading?: boolean;\r\n config: IContentBandConfig;\r\n}\r\n\r\nexport const ContentBandsMobilePreview: React.FunctionComponent = ({\r\n isLoading,\r\n contentBands,\r\n activeLcid,\r\n config,\r\n}) => {\r\n const getTitle = (item: IContentBand): string => {\r\n let result = \"\";\r\n if (item.headers) {\r\n result = item.headers[activeLcid].header;\r\n }\r\n\r\n return result;\r\n };\r\n\r\n return (\r\n
    \r\n {contentBands.map((item: IContentBand, idx: number) => (\r\n \r\n \r\n {getTitle(item)}\r\n

    \r\n {!isLoading && (\r\n \r\n )}\r\n
    \r\n ))}\r\n
    \r\n );\r\n};\r\n","import React from \"react\";\r\n\r\nimport { IContentBand, IContentBandConfig } from \"../../models\";\r\nimport { ContentBandLayoutPreview } from \"./contentBandLayoutPreview\";\r\n\r\nimport \"../../styles/contentBandsTeamsPreview.sass\";\r\n\r\ninterface IContentBandsTeamsPreview {\r\n contentBands: IContentBand[];\r\n activeLcid: string;\r\n isLoading?: boolean;\r\n config: IContentBandConfig;\r\n}\r\n\r\nexport const ContentBandsTeamsPreview: React.FC = ({ contentBands, isLoading, activeLcid, config }) => {\r\n return (\r\n
    \r\n {!isLoading &&\r\n contentBands.map((cb: IContentBand, idx: number) => {\r\n const header = (cb.headers && cb.headers[activeLcid].header) || \"\";\r\n return (\r\n \r\n \r\n {header}\r\n \r\n \r\n \r\n );\r\n })}\r\n
    \r\n );\r\n};\r\n","import React from \"react\";\r\n\r\nimport { HomeScreenPlatform, IHomeScreenConfig } from \"modules/homeScreens/models\";\r\nimport Preview, { IPreview, PreviewType } from \"modules/common/components/authoring/dialogs/preview\";\r\nimport { ContentBandsMobilePreview } from \"../layouts/contentBandsMobilePreview\";\r\nimport { ContentBandsTeamsPreview } from \"../layouts/contentBandsTeamsPreview\";\r\nimport { IMobileConfig } from \"modules/settings\";\r\nimport { IContentBand, IContentBandConfig, MobileAppPages } from \"modules/contentBands/models\";\r\n\r\ninterface IContentBandsPreviewProps {\r\n contentBands: IContentBand[];\r\n activeLcid: string;\r\n homeScreenConfigs: IHomeScreenConfig[];\r\n isLoading: boolean;\r\n config: IContentBandConfig;\r\n open: boolean;\r\n onClose: () => void;\r\n mobileConfig?: IMobileConfig;\r\n}\r\n\r\nexport const ContentBandsPreview: React.FC = ({\r\n contentBands,\r\n homeScreenConfigs,\r\n activeLcid,\r\n isLoading,\r\n config,\r\n onClose,\r\n mobileConfig,\r\n open,\r\n}) => {\r\n const getPreviews = (): IPreview[] => {\r\n let results: IPreview[] = [\r\n {\r\n type: PreviewType.Mobile,\r\n label: \"MOBILE APP\",\r\n component: (\r\n \r\n ),\r\n },\r\n ];\r\n\r\n if (homeScreenConfigs && homeScreenConfigs.some((c: IHomeScreenConfig) => c.platform === HomeScreenPlatform.Teams)) {\r\n results.push({\r\n type: PreviewType.Teams,\r\n label: \"MS TEAMS\",\r\n component: (\r\n \r\n ),\r\n });\r\n }\r\n return results;\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n","import React, { useEffect, useLayoutEffect, useState } from \"react\";\r\n\r\nimport { ConnectedProps, connect, useDispatch } from \"react-redux\";\r\nimport { Divider } from \"@mui/material\";\r\nimport { useHistory } from \"react-router\";\r\n\r\nimport BasePage from \"pages/common/basePage\";\r\n\r\nimport Header from \"pages/common/header\";\r\nimport MainContent from \"pages/common/mainContent\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport SuccessSnackbar from \"modules/common/components/snackbars/successSnackbar\";\r\nimport { useContentBands } from \"modules/common/hooks/data/useContentBands\";\r\nimport { setMainStyle, setShouldDisplayNav } from \"modules/adminLayout/actionCreator\";\r\nimport { useMobileConfig } from \"modules/common/hooks/data/useMobileConfig\";\r\nimport { HomeScreenSettings } from \"./homeScreenSettings\";\r\nimport { ContentBandContentType, IContentBand } from \"modules/contentBands/models\";\r\nimport { ContentBandsButtons } from \"modules/contentBands/components/inputs/contentBandsButtons\";\r\nimport { useHomeScreenConfigs } from \"modules/common/hooks/data/useHomeScreenConfigs\";\r\nimport { homeScreensSlice, saveHomeScreenConfigs } from \"modules/homeScreens/reducer\";\r\nimport { DEFAULT_CONFIG, contentBandsSlice, fetchPublishedBandsAsync } from \"modules/contentBands/reducer\";\r\nimport useQueryParams, { QUERY_PARAM_KEYS } from \"modules/common/hooks/useQueryParams\";\r\nimport ConfirmDialog from \"modules/common/components/dialogs/confirmDialog\";\r\nimport { ContentBandsPreview } from \"modules/contentBands/components/dialogs/contentBandsPreview\";\r\nimport { HOME_SCREEN_PLATFORM_MAP, HomeScreenType, IHomeScreenConfig } from \"modules/homeScreens/models\";\r\n\r\nimport \"./styles/manageHomeScreenSettingsPage.sass\";\r\n\r\ninterface IManageHomeScreenSettingsPageProps {}\r\n\r\nconst ManageHomeScreenSettingsPage: React.FunctionComponent = ({\r\n tenantId,\r\n shouldDisplayNav,\r\n tenantSettings,\r\n setMainStyle,\r\n setShouldDisplayNav,\r\n}) => {\r\n const queryParams = useQueryParams();\r\n const isAfterPublish = queryParams.get(QUERY_PARAM_KEYS.IS_CONTENT_BAND_PUBLISH);\r\n const dispatch = useDispatch();\r\n const [fetchContentBandsContent, setFetchContentBandsContent] = useState(false); // only grab content when we need to (they preview)\r\n const [isPreviewOpen, setIsPreviewOpen] = useState(false);\r\n const history = useHistory();\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const { isLoading: isLoadingMobileConfig, mobileConfig } = useMobileConfig();\r\n const { homeScreenConfigs, pristineConfigs, isLoading: isLoadingHomeScreenConfigs, successMessage } = useHomeScreenConfigs();\r\n const {\r\n contentBands,\r\n config,\r\n publishedContentBands,\r\n isLoading: isLoadingBands,\r\n successMessage: contentBandsSuccess,\r\n } = useContentBands(fetchContentBandsContent);\r\n const [confirmHomeScreenTypes, setConfirmHomeScreenTypes] = useState(false);\r\n const isLoadingState = isLoadingMobileConfig || isLoadingBands || isLoadingHomeScreenConfigs;\r\n const usableConfig = config || DEFAULT_CONFIG;\r\n\r\n useEffect(() => {\r\n if (isAfterPublish === \"true\" && homeScreenConfigs) {\r\n // decide if we need to show confirm change screen types\r\n let notContentBandsTypes = homeScreenConfigs.filter((c: IHomeScreenConfig) => c.homeScreenType !== HomeScreenType.ContentBands);\r\n if (notContentBandsTypes?.length) setConfirmHomeScreenTypes(true);\r\n\r\n // remove the query param for future renders\r\n const urlParams = new URLSearchParams(window.location.search);\r\n urlParams.delete(QUERY_PARAM_KEYS.IS_CONTENT_BAND_PUBLISH);\r\n\r\n history.replace({\r\n search: urlParams.toString(),\r\n });\r\n }\r\n }, [isAfterPublish, history, homeScreenConfigs]);\r\n\r\n useLayoutEffect(() => {\r\n if (!shouldDisplayNav) {\r\n setShouldDisplayNav(true);\r\n setMainStyle({ backgroundColor: \"unset\" });\r\n }\r\n }, [shouldDisplayNav, setMainStyle, setShouldDisplayNav]);\r\n\r\n /**\r\n * Bring in published bands to redux\r\n * - published bands are null (initial load)\r\n * - fetchContentBandsContent goes true and there is no content for the content type\r\n */\r\n useEffect(() => {\r\n if (\r\n publishedContentBands === null ||\r\n (fetchContentBandsContent &&\r\n publishedContentBands.some(\r\n (cb: IContentBand) =>\r\n (cb.contentType === ContentBandContentType.Post && cb.posts === null) ||\r\n (cb.contentType === ContentBandContentType.Event && cb.events === null)\r\n ))\r\n )\r\n dispatch(fetchPublishedBandsAsync(fetchContentBandsContent));\r\n }, [publishedContentBands, dispatch, fetchContentBandsContent]);\r\n\r\n /**\r\n * Post home screen configs to api\r\n */\r\n const onSaveConfigs = async () => {\r\n if (homeScreenConfigs) dispatch(saveHomeScreenConfigs(homeScreenConfigs));\r\n };\r\n\r\n const goToEditScreen = () => {\r\n history.push(`/${tenantId}/admin/contentBands/editor`);\r\n };\r\n\r\n const onPreview = () => {\r\n setFetchContentBandsContent(true);\r\n setIsPreviewOpen(true);\r\n };\r\n\r\n const onClosePreview = () => {\r\n setIsPreviewOpen(false);\r\n setFetchContentBandsContent(false);\r\n };\r\n\r\n const getConfirmHomeScreensTitle = (): string => {\r\n let notContentBandsTypes = homeScreenConfigs?.filter((c: IHomeScreenConfig) => c.homeScreenType !== HomeScreenType.ContentBands);\r\n let result = \"\";\r\n\r\n if (notContentBandsTypes?.length) {\r\n if (notContentBandsTypes.length > 1) result = \"Home Screens are set to My Feed\";\r\n else result = \"Home Screen is set to My Feed\";\r\n }\r\n\r\n return result;\r\n };\r\n\r\n const getConfirmHomeScreenTypeContent = (): JSX.Element => {\r\n let notContentBandsTypes = homeScreenConfigs?.filter((c: IHomeScreenConfig) => c.homeScreenType !== HomeScreenType.ContentBands);\r\n if (!notContentBandsTypes?.length) return <>;\r\n\r\n let result = (\r\n
    \r\n
    \r\n Your organization's{\" \"}\r\n {notContentBandsTypes?.length > 1\r\n ? \"mobile app and MS Teams app home screens are \"\r\n : `${HOME_SCREEN_PLATFORM_MAP[notContentBandsTypes[0].platform]} is `}{\" \"}\r\n set to My Feed.\r\n
    \r\n
    \r\n
    \r\n Change this to Content Bands to set the recently published bands as your home screen.\r\n
    \r\n
    \r\n );\r\n\r\n return result;\r\n };\r\n\r\n return (\r\n \r\n
    \r\n \r\n {isLoadingState && }\r\n \r\n \r\n
    \r\n {!isLoadingState && (\r\n \r\n )}\r\n
    \r\n setErrorMessage(\"\")} />\r\n {\r\n dispatch({ type: contentBandsSlice.actions.SET_SUCCESS_MESSAGE, payload: \"\" });\r\n dispatch({ type: homeScreensSlice.actions.SET_SUCCESS_MESSAGE, payload: \"\" });\r\n }}\r\n />\r\n \r\n setConfirmHomeScreenTypes(false)}\r\n onConfirm={() => setConfirmHomeScreenTypes(false)}\r\n confirmButtonProps={{\r\n variant: \"text\",\r\n }}\r\n >\r\n {getConfirmHomeScreenTypeContent()}\r\n \r\n
    \r\n \r\n );\r\n};\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IManageHomeScreenSettingsPageProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id,\r\n shouldDisplayNav: state.adminLayout.shouldDisplayNav,\r\n tenantSettings: state.settings.tenantSettings,\r\n }),\r\n {\r\n setShouldDisplayNav,\r\n setMainStyle,\r\n }\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps;\r\nexport const ConnectedManageHomeScreenSettings = connector(ManageHomeScreenSettingsPage);\r\n","import React from \"react\";\r\n\r\nimport { IContentBand } from \"../../models\";\r\nimport {\r\n AuthoringAppBarAction,\r\n AuthoringAppBarActions,\r\n IAuthoringAppBarAction,\r\n} from \"modules/common/components/authoring/authoringAppBarActions\";\r\n\r\ninterface IContentBandsEditorActionsProps {\r\n contentBands: IContentBand[];\r\n onSave: () => void;\r\n onDiscard: () => void;\r\n onPreview: () => void;\r\n onBack: () => void;\r\n onToggleSettingsPanel: () => void;\r\n onPublish: () => void;\r\n isDirty: boolean;\r\n disable?: boolean; // flag to disable everything\r\n}\r\n\r\nexport const ContentBandsEditorActions: React.FunctionComponent = ({\r\n contentBands,\r\n isDirty,\r\n disable,\r\n onSave,\r\n onToggleSettingsPanel,\r\n onDiscard,\r\n onPublish,\r\n onPreview,\r\n onBack,\r\n}) => {\r\n const isPreviewDisabled = disable || contentBands.length === 0;\r\n const isPublishedDisabled = disable || contentBands.length === 0;\r\n const isSaveDisabled = disable || !isDirty;\r\n const isDiscardDisabled = disable || !isDirty;\r\n\r\n const getActions = (): Record => ({\r\n [AuthoringAppBarAction.Publish]: {\r\n onClick: onPublish,\r\n disabled: isPublishedDisabled,\r\n },\r\n [AuthoringAppBarAction.Save]: {\r\n disabled: isSaveDisabled,\r\n onClick: onSave,\r\n },\r\n [AuthoringAppBarAction.Preview]: {\r\n disabled: isPreviewDisabled,\r\n onClick: onPreview,\r\n },\r\n [AuthoringAppBarAction.ToggleSettingsPanel]: {\r\n disabled: false,\r\n onClick: onToggleSettingsPanel,\r\n label: \"Content band settings\"\r\n },\r\n [AuthoringAppBarAction.Discard]: {\r\n disabled: isDiscardDisabled,\r\n onClick: onDiscard,\r\n },\r\n [AuthoringAppBarAction.Back]: {\r\n disabled: disable || false,\r\n onClick: onBack,\r\n },\r\n [AuthoringAppBarAction.Reject]: undefined,\r\n [AuthoringAppBarAction.OpenGuidelines]: undefined\r\n });\r\n\r\n return ;\r\n};\r\n","import React from \"react\";\r\nimport { POST_SETTINGS_EDITOR_DRAWER_WIDTH } from \"modules/posts/components/post-creation/postCreation\";\r\n\r\nimport { Drawer, DrawerProps, IconButton, useMediaQuery, useTheme } from \"@mui/material\";\r\nimport KeyboardArrowLeftIcon from '@mui/icons-material/KeyboardArrowLeft';\r\nimport KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\nimport \"./styles/drawerWithBookmarkButton.sass\";\r\n\r\ninterface IDrawerWithBookmarkButtonProps extends DrawerProps {\r\n showBookmark?: boolean;\r\n onBookmarkClick: () => void;\r\n}\r\n\r\nconst DrawerWithBookmarkButton: React.FunctionComponent = ({\r\n children,\r\n showBookmark,\r\n onBookmarkClick,\r\n ...drawerProps\r\n}) => {\r\n const theme = useTheme();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down('md'), { noSsr: true });\r\n const { open } = drawerProps;\r\n\r\n return <>\r\n {showBookmark && ((drawerProps.open && !isSmallAndSmaller) || !drawerProps.open) && \r\n {open\r\n ? \r\n : }\r\n\r\n }\r\n \r\n <>\r\n {isSmallAndSmaller &&\r\n
    \r\n \r\n \r\n \r\n
    }\r\n {children}\r\n \r\n \r\n ;\r\n}\r\n\r\nexport default DrawerWithBookmarkButton;\r\n","import React, { useState } from \"react\";\r\nimport { InfoOutlined, Replay } from \"@mui/icons-material\";\r\nimport { IconButton } from \"@mui/material\";\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\nimport { IColorOption } from \"modules/homeScreens/models\";\r\nimport ColorOption from \"modules/newsletters/edit/components/colorOption\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport { deepStrictEqualWrapper } from \"utils/equalityUtils\";\r\nimport DrawerWithBookmarkButton from \"modules/common/components/drawers/drawerWithBookmarkButton\";\r\n\r\nimport \"../../styles/contentBandsSettingsPanel.sass\";\r\n\r\ninterface IContentBandsSettingsEditorProps {\r\n open: boolean;\r\n gradientColor: IColorOption;\r\n headerTextColor: IColorOption;\r\n pristineGradientColor: IColorOption;\r\n pristineHeaderTextColor: IColorOption;\r\n toggleOpen: () => void;\r\n onSetGradientColor: (newColor: IColorOption) => void;\r\n onSetHeaderTextColor: (newColor: IColorOption) => void;\r\n}\r\n\r\nexport const ContentBandsSettingsPanel: React.FunctionComponent = ({\r\n open,\r\n gradientColor,\r\n headerTextColor,\r\n pristineGradientColor,\r\n pristineHeaderTextColor,\r\n onSetGradientColor,\r\n onSetHeaderTextColor,\r\n toggleOpen,\r\n}) => {\r\n const [isHeaderColorPickerVisible, setIsHeaderColorPickerVisible] = useState(false);\r\n const [isGradientColorPickerVisible, setIsGradientColorPickerVisible] = useState(false);\r\n\r\n const getResetButton = (onClick: () => void): JSX.Element => (\r\n \r\n \r\n \r\n );\r\n\r\n const resetGradient = () => {\r\n onSetGradientColor(pristineGradientColor);\r\n };\r\n\r\n const resetHeaderTextColor = () => {\r\n onSetHeaderTextColor(pristineHeaderTextColor);\r\n };\r\n\r\n const shouldShowResetGradient = (): boolean => !deepStrictEqualWrapper(pristineGradientColor, gradientColor);\r\n\r\n const shouldShowResetHeaderColor = (): boolean => !deepStrictEqualWrapper(pristineHeaderTextColor, headerTextColor);\r\n\r\n return (\r\n \r\n
    \r\n }\r\n />\r\n
    \r\n \r\n \r\n {shouldShowResetHeaderColor() && getResetButton(resetHeaderTextColor)}\r\n onSetHeaderTextColor({ hexCode: newHex, rgb: { ...headerTextColor.rgb } })}\r\n />\r\n
    \r\n
    \r\n
    \r\n \r\n Applied as the background color for when using the Window or Carousel layout.\r\n \r\n \r\n {shouldShowResetGradient() && getResetButton(resetGradient)}\r\n onSetHeaderTextColor({ hexCode: newHex, rgb: { ...gradientColor.rgb } })}\r\n />\r\n
    \r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { FormControlLabel, Checkbox } from \"@mui/material\";\r\nimport { IContentBandSettingsInputProps } from \"../editor/contentBandSettingsForm\";\r\n\r\nexport const AutoPlayCarouselInput: React.FunctionComponent> = ({\r\n idx,\r\n value,\r\n isSmallAndSmaller,\r\n onChange,\r\n}) => {\r\n return (\r\n
    \r\n
    \r\n ) => onChange(event.target.checked, idx)}\r\n />\r\n }\r\n label={Auto-play carousel}\r\n />\r\n
    \r\n
    \r\n );\r\n};\r\n","import React, { useState, useEffect } from \"react\";\r\nimport { TextField, FormControl, ClickAwayListener } from \"@mui/material\";\r\nimport { IContentBandSettingsInputProps } from \"../editor/contentBandSettingsForm\";\r\nimport { ContentBandLayoutType } from \"modules/contentBands/models\";\r\n\r\n\r\nexport interface IContentCountInputProps extends IContentBandSettingsInputProps {\r\n layoutType: ContentBandLayoutType;\r\n}\r\n\r\nexport const ContentCountInput: React.FunctionComponent = ({ idx, value, layoutType, onChange }) => {\r\n const isCarousel = layoutType === ContentBandLayoutType.Carousel;\r\n const [isFocused, setIsFocused] = useState(false);\r\n const [isValid, setIsValid] = useState(true);\r\n // keep changes internal until element loses focus\r\n // this way we aren't sending a request on each character change\r\n const [internalValue, setInternalValue] = useState(value);\r\n\r\n useEffect(() => {\r\n setInternalValue(value);\r\n }, [value]);\r\n\r\n /**\r\n * When focus lost\r\n * - send changes\r\n * - check if valid or not\r\n */\r\n useEffect(() => {\r\n if (!isFocused) {\r\n if (internalValue === 0 || (isCarousel && internalValue > 10) || (!isCarousel && internalValue > 20)) setIsValid(false);\r\n } else {\r\n setIsValid(true);\r\n }\r\n }, [isFocused, internalValue, isCarousel, idx]);\r\n\r\n const valueToUse = !isFocused && internalValue === 0 ? \"\" : internalValue;\r\n\r\n return (\r\n
    \r\n \r\n \r\n onChange(internalValue, idx)}>\r\n ) => setInternalValue(Number(event.target.value))}\r\n variant=\"outlined\"\r\n onFocus={() => {\r\n setIsFocused(true);\r\n }}\r\n onBlur={() => {\r\n setIsFocused(false);\r\n }}\r\n inputProps={{\r\n className: \"input\",\r\n max: isCarousel ? 10 : 20,\r\n min: 1,\r\n }}\r\n />\r\n \r\n \r\n
    \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Select, FormControl, MenuItem } from \"@mui/material\";\r\n\r\nimport { ContentBandContentType } from \"modules/contentBands/models\";\r\nimport { IContentBandSettingsInputProps } from \"../editor/contentBandSettingsForm\";\r\n\r\n\r\nexport const ContentTypeInput: React.FunctionComponent> = ({\r\n idx,\r\n value,\r\n onChange,\r\n}) => {\r\n return (\r\n
    \r\n \r\n \r\n ) => onChange(evt.target.value as ContentBandContentType, idx)}\r\n MenuProps={{ disablePortal: true }} // clickawaylistener breaks with selects as children when portal is enabled (more info: https://mui.com/joy-ui/api/menu/#Menu-prop-disablePortal)\r\n >\r\n Posts\r\n Events\r\n \r\n \r\n
    \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { FormControlLabel, Checkbox } from \"@mui/material\";\r\n\r\nimport { IContentBandSettingsInputProps } from \"../editor/contentBandSettingsForm\";\r\n\r\nexport const DisplayFullTitlesInput: React.FunctionComponent> = ({\r\n idx,\r\n onChange,\r\n value,\r\n isSmallAndSmaller,\r\n}) => {\r\n return (\r\n
    \r\n
    \r\n ) => onChange(event.target.checked, idx)}\r\n />\r\n }\r\n label={Display full titles}\r\n />\r\n
    \r\n
    \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { FormControlLabel, Checkbox } from \"@mui/material\";\r\n\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\n\r\nimport { IContentBandSettingsInputProps } from \"../editor/contentBandSettingsForm\";\r\n\r\nexport const EnableSeeMoreInput: React.FunctionComponent> = ({\r\n idx,\r\n onChange,\r\n value,\r\n isSmallAndSmaller,\r\n}) => {\r\n return (\r\n
    \r\n
    \r\n ) => onChange(event.target.checked, idx)}\r\n />\r\n }\r\n label={\r\n \r\n The see more link directs mobile app users to a feed with all posts or events that match the content settings of\r\n this content band.\r\n \r\n }\r\n />\r\n
    \r\n
    \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { FormControlLabel, Checkbox } from \"@mui/material\";\r\n\r\nimport { IContentBandSettingsInputProps } from \"../editor/contentBandSettingsForm\";\r\n\r\nexport const IgnoreSubscriptionsInput: React.FunctionComponent> = ({\r\n idx,\r\n onChange,\r\n value,\r\n isSmallAndSmaller,\r\n}) => {\r\n return (\r\n
    \r\n
    \r\n ) => onChange(event.target.checked, idx)}\r\n />\r\n }\r\n label={Ignore topic subscriptions}\r\n />\r\n
    \r\n
    \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { InfoOutlined } from \"@mui/icons-material\";\r\nimport { FormControl, MenuItem, Select } from \"@mui/material\";\r\n\r\nimport { ContentBandContentType, ContentBandLayoutType } from \"modules/contentBands/models\";\r\nimport { IContentBandSettingsInputProps } from \"../editor/contentBandSettingsForm\";\r\n\r\nexport interface IContentBandInputWithContentType extends IContentBandSettingsInputProps {\r\n contentType: ContentBandContentType;\r\n}\r\n\r\nexport const LayoutInput: React.FunctionComponent> = ({ value, idx, onChange }) => {\r\n return (\r\n <>\r\n
    \r\n \r\n \r\n ) => onChange(evt.target.value as ContentBandLayoutType, idx)}\r\n MenuProps={{ disablePortal: true }} // clickawaylistener breaks with selects as children when portal is enabled (more info: https://mui.com/joy-ui/api/menu/#Menu-prop-disablePortal)\r\n >\r\n Card\r\n Window\r\n Carousel\r\n \r\n \r\n {value === ContentBandLayoutType.Carousel && (\r\n
    \r\n \r\n Carousels occupy the full width of mobile devices\r\n
    \r\n )}\r\n
    \r\n \r\n );\r\n};\r\n","import { useState } from \"react\";\r\n\r\nexport type UseAnchorEl = {\r\n setAnchorEl: (el: T | null) => void;\r\n open: boolean;\r\n anchorEl: T | null;\r\n}\r\n\r\nexport function useAnchorEl(): UseAnchorEl {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n\r\n const onSetAnchorEl = (el: T | null) => {\r\n setAnchorEl(el);\r\n }\r\n\r\n return {\r\n anchorEl,\r\n setAnchorEl: onSetAnchorEl,\r\n open: Boolean(anchorEl)\r\n };\r\n}\r\n","import { useEffect, useState } from \"react\";\r\n\r\ntype IUseDragReorderReturn = {\r\n mousePos: IPosition;\r\n dropIdx: number;\r\n};\r\n\r\nexport interface IUnique {\r\n id: T;\r\n}\r\n\r\ninterface IUseDragReorderProps {\r\n enabled: boolean;\r\n items: IUnique[];\r\n draggedIdx: number | null;\r\n dropZoneClassName: string;\r\n onDrop: ((id?: T, idx?: number) => void) | null;\r\n mouseHandlerComponentClassName?: string;\r\n}\r\n\r\nexport interface IPosition {\r\n x: number;\r\n y: number;\r\n top: number;\r\n left: number;\r\n}\r\n\r\n// some common handlers needed for allowing click drag reorder\r\n// taken from: https://dev.to/h8moss/build-a-reorderable-list-in-react-29on\r\nexport function useDragReorder(props: IUseDragReorderProps): IUseDragReorderReturn {\r\n const { items, draggedIdx, enabled, dropZoneClassName, onDrop, mouseHandlerComponentClassName } = props;\r\n const isDragging = draggedIdx !== null && draggedIdx !== -1;\r\n const [mousePos, setMousePos] = useState({ x: 0, y: 0, top: 0, left: 0 });\r\n const [dropIdx, setDropIdx] = useState(0);\r\n const mouseHandlerComponent = document.getElementsByClassName(mouseHandlerComponentClassName ?? \"\").item(0);\r\n\r\n // listen to mouse position if draggable on\r\n useEffect(() => {\r\n const mouseMoveHandler = (e: MouseEvent) => {\r\n setMousePos({ \r\n x: e.x,\r\n y: e.y,\r\n left: mouseHandlerComponent === null ? e.x : e.x - mouseHandlerComponent.getBoundingClientRect().left,\r\n top: mouseHandlerComponent === null ? e.y : e.y - mouseHandlerComponent.getBoundingClientRect().top,\r\n });\r\n };\r\n\r\n const mouseUpHandler = (_: MouseEvent) => {\r\n document.body.style.cursor = \"default\";\r\n\r\n if (onDrop) {\r\n let idxToUse = dropIdx;\r\n onDrop(items[idxToUse]?.id, idxToUse);\r\n }\r\n };\r\n\r\n if (enabled) {\r\n mouseHandlerComponent !== null \r\n ? mouseHandlerComponent.addEventListener(\"mousemove\", mouseMoveHandler)\r\n : document.addEventListener(\"mousemove\", mouseMoveHandler);\r\n \r\n document.addEventListener(\"mouseup\", mouseUpHandler);\r\n }\r\n\r\n return () => {\r\n mouseHandlerComponent !== null \r\n ? mouseHandlerComponent.removeEventListener(\"mousemove\", mouseMoveHandler)\r\n : document.removeEventListener(\"mousemove\", mouseMoveHandler);\r\n \r\n document.removeEventListener(\"mouseup\", mouseUpHandler);\r\n };\r\n }, [isDragging, dropIdx, onDrop, items, enabled]);\r\n\r\n // get closest drop zone to mouse position so we only show that one\r\n // https://dev.to/h8moss/build-a-reorderable-list-in-react-29on\r\n useEffect(() => {\r\n if (isDragging) {\r\n // get all drop-zones\r\n const elements = Array.from(document.getElementsByClassName(dropZoneClassName));\r\n\r\n // get all drop-zones' y-axis position\r\n // if we were using a horizontally-scrolling list, we would get the .left property\r\n const positions = elements.map((e) => {\r\n return e.getBoundingClientRect().top;\r\n });\r\n\r\n // get the difference with the mouse's y position\r\n const absDifferences = positions.map((v) => Math.abs(v - mousePos.y));\r\n\r\n // get the item closest to the mouse\r\n let result = absDifferences.indexOf(Math.min(...absDifferences));\r\n\r\n if (result > draggedIdx) result += 1;\r\n\r\n setDropIdx(result);\r\n }\r\n }, [isDragging, mousePos, items, draggedIdx, dropZoneClassName]);\r\n\r\n return {\r\n mousePos,\r\n dropIdx,\r\n };\r\n}\r\n\r\nexport function dropItemForward(items: TItems[], startPosition: number, endPosition: number): TItems[] {\r\n let newItems = [...items];\r\n\r\n const temp = newItems[startPosition];\r\n\r\n for (let i = startPosition; i < endPosition; i++) {\r\n newItems[i] = newItems[i + 1];\r\n }\r\n\r\n newItems[endPosition - 1] = temp;\r\n\r\n return newItems;\r\n}\r\n\r\nexport function dropItemBackward(items: TItems[], startPosition: number, endPosition: number): TItems[] {\r\n const newItems = [...items];\r\n\r\n const temp = newItems[startPosition];\r\n\r\n for (let i = startPosition; i > endPosition; i--) {\r\n newItems[i] = newItems[i - 1];\r\n }\r\n\r\n newItems[endPosition] = temp;\r\n\r\n return newItems;\r\n}\r\n","import React from \"react\";\r\nimport { DragIndicator } from \"@mui/icons-material\";\r\nimport { ListItemButton, IconButton } from \"@mui/material\";\r\nimport moment from \"moment\";\r\n\r\nimport { IPosition } from \"modules/common/hooks/useDragReorder\";\r\nimport { IContentSearchResultItem } from \"./contentSearch\";\r\nimport { IContentSearchResultsProps } from \"./contentSearchResultList\";\r\n\r\nexport interface IContentSearchResultItemProps extends IContentSearchResultsProps {\r\n item: IContentSearchResultItem;\r\n id?: string;\r\n mousePos?: IPosition;\r\n idx: number;\r\n}\r\n\r\nexport const ContentSearchResultItem: React.FunctionComponent = ({\r\n item,\r\n id,\r\n draggedIdx,\r\n idx,\r\n mousePos = { x: 0, y: 0 },\r\n action,\r\n onClick,\r\n onDrag,\r\n}) => {\r\n const itemIsButton = Boolean(onClick !== undefined);\r\n\r\n const getListItem = (isFloating: boolean): JSX.Element => (\r\n {\r\n if (onClick) onClick(item);\r\n }}\r\n sx={{\r\n \"&:hover\": {\r\n cursor: itemIsButton ? \"pointer\" : \"initial\",\r\n backgroundColor: itemIsButton ? \"rgba(0, 0, 0, 0.04)\" : \"#ffffff\",\r\n },\r\n }}\r\n style={{\r\n left: isFloating ? mousePos.x : \"initial\",\r\n top: isFloating ? mousePos.y : \"initial\",\r\n }}\r\n >\r\n {onDrag && (\r\n ) => {\r\n onDrag(item.id);\r\n document.body.style.cursor = \"move\";\r\n }}\r\n >\r\n \r\n \r\n )}\r\n {item.imageUrl && (\r\n \r\n )}\r\n
    \r\n
    {item.title}
    \r\n
    {item.authorName}
    \r\n
    \r\n Published {moment(item.publishTime).format(\"MMM D, YYYY\")}\r\n {action && action(item)}\r\n
    \r\n
    \r\n \r\n );\r\n\r\n return (\r\n <>\r\n {/* floating element that follows our mouse*/}\r\n {idx === draggedIdx && getListItem(true)}\r\n\r\n {/* actual button */}\r\n {idx !== draggedIdx && getListItem(false)}\r\n \r\n );\r\n};\r\n","import React, { useCallback, useEffect, useRef } from \"react\";\r\nimport { List, ListItem } from \"@mui/material\";\r\n\r\nimport { useDragReorder } from \"modules/common/hooks/useDragReorder\";\r\nimport Loading from \"../loading\";\r\nimport { IContentSearchResultItem } from \"./contentSearch\";\r\nimport { ContentSearchResultItem } from \"./contentSearchResultItem\";\r\nimport uuid from \"uuid\";\r\n\r\nexport interface IContentSearchResultsProps {\r\n action?: (item: IContentSearchResultItem) => JSX.Element;\r\n onClick?: (item: IContentSearchResultItem) => void;\r\n onDrag?: (id: string) => void;\r\n onDrop?: (id: string) => void;\r\n draggedIdx?: number | null;\r\n}\r\n\r\ninterface IContentSearchResultProps extends IContentSearchResultsProps {\r\n results: IContentSearchResultItem[];\r\n pageNumber?: number;\r\n pageCount?: number;\r\n isLoading?: boolean;\r\n emptyMessage: string;\r\n draggable?: boolean;\r\n onPage?: () => Promise;\r\n}\r\n\r\nexport const ContentSearchResultList: React.FunctionComponent = ({\r\n results,\r\n pageNumber,\r\n pageCount,\r\n isLoading,\r\n emptyMessage,\r\n draggable = false,\r\n draggedIdx,\r\n action,\r\n onPage,\r\n onDrag,\r\n onDrop,\r\n onClick,\r\n}) => {\r\n const dropZoneClassName = useRef(uuid());\r\n const isDragging = draggedIdx !== null && draggedIdx !== undefined && draggedIdx !== -1;\r\n const { mousePos, dropIdx } = useDragReorder({\r\n enabled: draggable,\r\n items: results,\r\n draggedIdx: isDragging ? draggedIdx : null,\r\n dropZoneClassName: dropZoneClassName.current,\r\n onDrop: onDrop || null,\r\n });\r\n\r\n const handleIntersect = useCallback(\r\n (entries: IntersectionObserverEntry[], observer: IntersectionObserver) => {\r\n entries.forEach((entry: IntersectionObserverEntry) => {\r\n if (entry.intersectionRatio > 0.1 && onPage) {\r\n onPage();\r\n observer.disconnect();\r\n }\r\n });\r\n },\r\n [onPage]\r\n );\r\n\r\n const getItemId = (item: IContentSearchResultItem): string => `cs-result-${item.id}`;\r\n\r\n // ea time second last item on \"page\" is visible, do another search request\r\n // this uses Intsersection Observer api, more here: https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API\r\n useEffect(() => {\r\n let observer: IntersectionObserver | null;\r\n\r\n if (pageNumber && pageCount) {\r\n // calc if there might be more search results\r\n const isPagesFull: boolean = pageNumber * pageCount === results.length;\r\n\r\n if (isPagesFull) {\r\n let options = {\r\n root: null,\r\n rootMargin: \"0px\",\r\n threshold: 0.9,\r\n };\r\n\r\n observer = new IntersectionObserver(handleIntersect, options);\r\n\r\n let secondLastIdx = pageNumber * pageCount - 2;\r\n\r\n if (secondLastIdx > -1 && secondLastIdx < results.length) {\r\n let secondLastItem = results[secondLastIdx];\r\n\r\n let domEl = document.getElementById(getItemId(secondLastItem));\r\n\r\n if (domEl) observer.observe(domEl);\r\n }\r\n }\r\n }\r\n\r\n return () => {\r\n if (observer) observer.disconnect();\r\n };\r\n }, [pageNumber, pageCount, results, handleIntersect]);\r\n\r\n // isDragging ensures draggedIdx is a number\r\n const floatingResult = isDragging ? results[draggedIdx!] : null;\r\n const floatingId = isDragging && floatingResult ? getItemId(floatingResult) : \"\";\r\n\r\n return (\r\n \r\n {results.length > 0 ? (\r\n <>\r\n {isDragging && floatingResult && (\r\n // z-index to make sure floating item displays above drawer and other items\r\n
    \r\n \r\n
    \r\n )}\r\n {draggable && (\r\n
    \r\n )}\r\n {results.map((result: IContentSearchResultItem, idx: number) => {\r\n const id = getItemId(result);\r\n\r\n return (\r\n \r\n {draggedIdx !== idx && (\r\n <>\r\n \r\n {draggable && (\r\n \r\n )}\r\n \r\n )}\r\n \r\n );\r\n })}\r\n \r\n ) : (\r\n <> {!isLoading && {emptyMessage}}\r\n )}\r\n {isLoading && (\r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n","import React, { useEffect, useRef, useState } from \"react\";\r\n\r\nimport { Search } from \"@mui/icons-material\";\r\nimport { TextField } from \"@mui/material\";\r\n\r\nimport { useAnchorEl } from \"modules/common/hooks/useAnchorEl\";\r\nimport Callout from \"../callout\";\r\nimport CalloutHover from \"../hovers/calloutHover\";\r\nimport { ContentSearchResultList } from \"./contentSearchResultList\";\r\n\r\nimport \"./styles/contentSearch.sass\";\r\n\r\nexport interface IContentSearchResultItem {\r\n id: string;\r\n imageUrl: string;\r\n title: string;\r\n authorName: string;\r\n publishTime: Date | string;\r\n}\r\n\r\ninterface IContentSearchResultProp {\r\n onSearch: (text: string) => Promise;\r\n onClick: (item: IContentSearchResultItem) => void;\r\n onPage?: (text: string) => Promise;\r\n onClose?: () => void;\r\n pageNumber?: number;\r\n pageCount?: number;\r\n placeholder: string;\r\n autoSearchWaitSeconds?: number;\r\n autoSearch?: boolean; // search after autoSearchWaitSeconds seconds of no typing\r\n disabled?: boolean;\r\n}\r\n\r\nexport const ContentSearch: React.FunctionComponent = ({\r\n placeholder,\r\n autoSearch = false,\r\n autoSearchWaitSeconds = 2000,\r\n pageNumber,\r\n pageCount,\r\n disabled,\r\n onPage,\r\n onClose,\r\n onSearch,\r\n onClick,\r\n}) => {\r\n const [results, setResults] = useState([]);\r\n const [isSearching, setIsSearching] = useState(false);\r\n const { open, anchorEl, setAnchorEl } = useAnchorEl();\r\n const [searchText, setSearchText] = useState(\"\");\r\n\r\n const timeout = useRef(null);\r\n const target = useRef(null);\r\n // this variable allows us to see if we have already performed a search by user pressing enter rather than the timeout running\r\n const searchPerformedByEnter = useRef(false);\r\n\r\n useEffect(() => {\r\n if (disabled) setSearchText(\"\");\r\n }, [disabled]);\r\n\r\n const onHandleClick = (item: IContentSearchResultItem) => {\r\n setAnchorEl(null);\r\n onClick(item);\r\n };\r\n\r\n const onHandleSearch = async (target: HTMLInputElement) => {\r\n // clear results\r\n setResults([]);\r\n\r\n setAnchorEl(target);\r\n setIsSearching(true);\r\n\r\n let newResults = await onSearch(searchText);\r\n\r\n setResults(newResults);\r\n setIsSearching(false);\r\n };\r\n\r\n const onHandlePage = async () => {\r\n if (!onPage) return;\r\n\r\n setIsSearching(true);\r\n\r\n let newResults = await onPage(searchText);\r\n\r\n setResults([...results, ...newResults]);\r\n setIsSearching(false);\r\n };\r\n\r\n const getTextFieldComponent = (): JSX.Element => (\r\n ,\r\n sx: {\r\n height: 45,\r\n backgroundColor: disabled ? \"#f0f0f0\" : \"\",\r\n },\r\n }}\r\n onChange={(ev: React.ChangeEvent) => {\r\n setSearchText(ev.target.value);\r\n }}\r\n onKeyUp={async (event: React.KeyboardEvent) => {\r\n searchPerformedByEnter.current = false;\r\n\r\n // keep track of callout target so we can open it later when timeout runs\r\n target.current = event.currentTarget;\r\n\r\n if (autoSearch) {\r\n // persist event so we can use it in our timeout below\r\n if (timeout.current) clearTimeout(timeout.current);\r\n\r\n timeout.current = setTimeout(async () => {\r\n // if search performed by enter already, do not search again\r\n if (!searchPerformedByEnter.current) await onHandleSearch(target.current!);\r\n }, autoSearchWaitSeconds);\r\n }\r\n\r\n if (event.key === \"Enter\") {\r\n searchPerformedByEnter.current = true;\r\n await onHandleSearch(target.current!);\r\n }\r\n }}\r\n />\r\n );\r\n\r\n return (\r\n \r\n {disabled ? (\r\n \r\n You've reached the maximum content count. Adjust the limit or unpin other content to add more.\r\n \r\n ) : (\r\n getTextFieldComponent()\r\n )}\r\n {\r\n target.current = null;\r\n setAnchorEl(null);\r\n\r\n if (onClose) onClose();\r\n }}\r\n popoverProps={{\r\n disableAutoFocus: true,\r\n disableEnforceFocus: true,\r\n anchorOrigin: { vertical: 45, horizontal: 185 },\r\n }}\r\n >\r\n
    \r\n \r\n
    \r\n \r\n
    \r\n );\r\n};\r\n","import React, { useRef, useState, useCallback, useEffect } from \"react\";\r\nimport { EditOutlined, ArrowBack, InfoOutlined } from \"@mui/icons-material\";\r\nimport { Drawer, Button, IconButton } from \"@mui/material\";\r\nimport { AxiosResponse } from \"axios\";\r\n\r\nimport { eventsApi, postsApi } from \"api/instances\";\r\nimport { IContentSearchResultItem, ContentSearch } from \"modules/common/components/contentView/contentSearch\";\r\nimport Disclaimer from \"modules/common/components/disclaimer\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport useIsMounted from \"modules/common/hooks/useIsMounted\";\r\nimport { IEventOverview, EventListItem } from \"modules/events\";\r\nimport { ImageScale, PostOverview, PostListItem } from \"modules/posts/models\";\r\nimport { arraysEqual } from \"utils/equalityUtils\";\r\nimport { IContentBandInputWithContentType } from \"./layoutInput\";\r\nimport { ContentSearchResultList } from \"modules/common/components/contentView/contentSearchResultList\";\r\nimport { ContentBandContentType } from \"modules/contentBands/models\";\r\nimport { dropItemBackward, dropItemForward } from \"modules/common/hooks/useDragReorder\";\r\nimport { ContentState } from \"utils/managementUtils\";\r\n\r\ninterface IPinnedInputProps extends IContentBandInputWithContentType {\r\n defaultLcid: string;\r\n contentCount: number;\r\n}\r\n\r\nexport const PinInput: React.FunctionComponent = ({ idx, value, contentType, defaultLcid, contentCount, onChange }) => {\r\n // we only need to fetch on initial mount because we will fetch while searching for any new pinned content\r\n const hasFetched = useRef(false);\r\n const PAGE_COUNT = 10;\r\n const isMounted = useIsMounted();\r\n\r\n const [pageNumber, setPageNumber] = useState(1);\r\n const [isDrawerOpen, setIsDrawerOpen] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n const isPost = contentType === ContentBandContentType.Post;\r\n const [items, setItems] = useState([]);\r\n const itemIds = items.map((item: IContentSearchResultItem) => item.id);\r\n const [isFetching, setIsFetching] = useState(false);\r\n const [dragId, setDragId] = useState(null);\r\n const draggedIdx = items.findIndex((item) => item.id === dragId);\r\n const maxPinnedReach = items.length === contentCount;\r\n\r\n const fetchPinned = useCallback(async () => {\r\n try {\r\n setIsFetching(true);\r\n let tasks: Promise[] = [];\r\n\r\n // for each pinned id, begin fetch and add to tasks array\r\n value.forEach((id: string) => {\r\n let taskToAdd: Promise;\r\n\r\n if (contentType === ContentBandContentType.Event)\r\n taskToAdd = eventsApi.getEventOverview(id, ImageScale.Email).then(({ data: event }: AxiosResponse) => {\r\n return {\r\n id: event.id,\r\n imageUrl: event.imageUrl,\r\n title: event.translatedContent[defaultLcid].title,\r\n authorName: event.author,\r\n publishTime: event.datePublished,\r\n };\r\n });\r\n else\r\n taskToAdd = postsApi.GetPostOverview(id, ImageScale.Email).then((post: PostOverview) => {\r\n return {\r\n id: post.id,\r\n imageUrl: post.imageUrl,\r\n title: post.translatedContent[defaultLcid].title,\r\n authorName: post.author.name,\r\n publishTime: post.datePublished,\r\n };\r\n });\r\n\r\n tasks = [...tasks, taskToAdd];\r\n });\r\n\r\n let results: IContentSearchResultItem[] = await Promise.all(tasks);\r\n if (isMounted()) setItems(results);\r\n } catch (err) {\r\n if (isMounted()) setErrorMessage(\"Something went wrong. Please try again later.\");\r\n } finally {\r\n hasFetched.current = true;\r\n if (isMounted()) setIsFetching(false);\r\n }\r\n }, [defaultLcid, contentType, value, isMounted]);\r\n\r\n // clear fetched items when content type changes\r\n useEffect(() => {\r\n setItems([]);\r\n }, [contentType]);\r\n\r\n // fetch pinned items on first load only\r\n useEffect(() => {\r\n if (!hasFetched.current) fetchPinned();\r\n }, [fetchPinned]);\r\n\r\n const getCountLabel = (): string => {\r\n let result = \"\";\r\n let plural = value.length > 1;\r\n\r\n if (value.length < 1) result = `No pinned ${isPost ? \"posts\" : \"events\"} found`;\r\n else result = `${value.length} pinned ${isPost ? (plural ? \"posts\" : \"post\") : plural ? \"events\" : \"event\"}`;\r\n\r\n return result;\r\n };\r\n\r\n // search with new text\r\n const onSearch = async (text: string): Promise => {\r\n setPageNumber(1);\r\n\r\n return await performSearch(text);\r\n };\r\n\r\n const performSearch = async (text: string, page?: number): Promise => {\r\n let results: IContentSearchResultItem[] = [];\r\n let pageToUse = page || pageNumber;\r\n\r\n try {\r\n const filters = {\r\n textToSearch: text,\r\n includeImageUrl: true,\r\n };\r\n\r\n // fetch search results for post/events depending on content type\r\n if (isPost) {\r\n let {\r\n data: { posts },\r\n } = await postsApi.getPagedPosts(\r\n pageToUse,\r\n {\r\n ...filters,\r\n postStates: [ContentState.Published],\r\n includeExpired: false\r\n },\r\n PAGE_COUNT\r\n );\r\n\r\n results = posts\r\n .filter((result: PostListItem) => !itemIds.includes(result.id))\r\n .map(\r\n (pageItem: PostListItem): IContentSearchResultItem => ({\r\n ...pageItem,\r\n imageUrl: pageItem.imageUrl || \"\",\r\n authorName: pageItem.authorFullName,\r\n publishTime: pageItem.publishedTime.date,\r\n })\r\n );\r\n } else {\r\n let {\r\n data: { events },\r\n } = await eventsApi.getPagedEvents(pageToUse, {\r\n ...filters,\r\n eventStates: [ContentState.Published],\r\n includeExpired: false,\r\n });\r\n\r\n results = events\r\n .filter((result: EventListItem) => !itemIds.includes(result.id))\r\n .map(\r\n (pageItem: EventListItem): IContentSearchResultItem => ({\r\n ...pageItem,\r\n imageUrl: pageItem.imageUrl || \"\",\r\n authorName: pageItem.authorFullName,\r\n publishTime: pageItem.publishedTime.date,\r\n })\r\n );\r\n }\r\n } catch (err) {\r\n setErrorMessage(\"Something went wrong. Please try again later.\");\r\n }\r\n\r\n return results;\r\n };\r\n\r\n const onPin = (item: IContentSearchResultItem) => {\r\n if (value.includes(item.id)) return;\r\n\r\n setItems([...items, item]);\r\n onCalloutClose();\r\n };\r\n\r\n const onUnpin = (item: IContentSearchResultItem) => {\r\n let newPinned = items.filter((i: IContentSearchResultItem) => i.id !== item.id);\r\n\r\n setItems(newPinned);\r\n };\r\n\r\n // paged search\r\n const onPage = async (text: string): Promise => {\r\n // can't guaruntee page number is updated by time funciton runs so here we use an extra variable\r\n // and then increase state variable\r\n let results = await performSearch(text, pageNumber + 1);\r\n setPageNumber(pageNumber + 1);\r\n\r\n return results;\r\n };\r\n\r\n const onCalloutClose = () => {\r\n setPageNumber(1);\r\n };\r\n\r\n const getUnpinAction = (item: IContentSearchResultItem): JSX.Element => (\r\n \r\n );\r\n\r\n const onDrag = (id: string) => {\r\n setDragId(id);\r\n };\r\n\r\n // re-order items\r\n const onDrop = (id: string) => {\r\n const dragIdCopy = dragId;\r\n setDragId(null);\r\n\r\n if (dragIdCopy) {\r\n let currDraggedIdx = items.findIndex((r: IContentSearchResultItem) => r.id === dragIdCopy);\r\n let droppedIdx = items.findIndex((r: IContentSearchResultItem) => r.id === id);\r\n\r\n let dragged = items.find((r: IContentSearchResultItem) => r.id === dragIdCopy);\r\n\r\n if (currDraggedIdx > -1 && droppedIdx > -1 && dragged) {\r\n // dont do anything if band is in its original spot\r\n if (droppedIdx === currDraggedIdx || currDraggedIdx === null) return;\r\n\r\n let newItems =\r\n currDraggedIdx < droppedIdx\r\n ? dropItemForward(items, currDraggedIdx, droppedIdx)\r\n : dropItemBackward(items, currDraggedIdx, droppedIdx);\r\n\r\n setItems(newItems);\r\n }\r\n }\r\n };\r\n\r\n const onDrawerClose = () => {\r\n setIsDrawerOpen(false);\r\n\r\n // send changes\r\n const internalIds = items.map((item: IContentSearchResultItem) => item.id);\r\n\r\n if (!arraysEqual(value, internalIds)) onChange(internalIds, idx);\r\n };\r\n\r\n return (\r\n <>\r\n
    \r\n \r\n
    \r\n {getCountLabel()}\r\n setIsDrawerOpen(true)} id={`cb-pin-${idx}`}>\r\n \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n \r\n \r\n {isPost ? \"Pin Posts\" : \"Pin Events\"}\r\n
    \r\n }\r\n containerStyle={{\r\n margin: \"8px 0 14px\",\r\n }}\r\n />\r\n \r\n
    \r\n {items.length === 0 ? (\r\n No pinned {isPost ? \"posts\" : \"events\"}\r\n ) : isFetching ? (\r\n \r\n ) : (\r\n
    \r\n \r\n
    \r\n )}\r\n
    \r\n \r\n setErrorMessage(\"\")} />\r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Select, FormControl, MenuItem } from \"@mui/material\";\r\nimport { ReadStatus } from \"modules/contentBands/models\";\r\nimport { IContentBandSettingsInputProps } from \"../editor/contentBandSettingsForm\";\r\n\r\nexport const ReadStatusInput: React.FunctionComponent> = ({ idx, value, onChange }) => {\r\n return (\r\n
    \r\n \r\n \r\n ) => onChange(evt.target.value as ReadStatus, idx)}\r\n MenuProps={{ disablePortal: true }} // clickawaylistener breaks with selects as children when portal is enabled (more info: https://mui.com/joy-ui/api/menu/#Menu-prop-disablePortal)\r\n >\r\n \r\n Both read and unread content\r\n \r\n \r\n Read content only\r\n \r\n \r\n Unread content only\r\n \r\n \r\n \r\n
    \r\n );\r\n};\r\n","import React from \"react\";\r\nimport {Select, FormControl, MenuItem } from \"@mui/material\";\r\n\r\nimport { SortStyle } from \"utils/managementUtils\";\r\nimport { IContentBandInputWithContentType } from \"./layoutInput\";\r\nimport { ContentBandContentType } from \"modules/contentBands/models\";\r\n\r\nexport const SortByInput: React.FunctionComponent> = ({ idx, value, contentType, onChange }) => {\r\n return (\r\n
    \r\n \r\n \r\n {contentType === ContentBandContentType.Post ? (\r\n ) => onChange(Number(evt.target.value) as SortStyle, idx)}\r\n MenuProps={{ disablePortal: true }} // clickawaylistener breaks with selects as children when portal is enabled (more info: https://mui.com/joy-ui/api/menu/#Menu-prop-disablePortal)\r\n >\r\n \r\n Oldest first\r\n \r\n \r\n Newest first\r\n \r\n \r\n ) : (\r\n ) => onChange(Number(evt.target.value) as SortStyle, idx)}\r\n MenuProps={{ disablePortal: true }} // clickawaylistener breaks with selects as children when portal is enabled (more info: https://mui.com/joy-ui/api/menu/#Menu-prop-disablePortal)\r\n >\r\n \r\n Start date - Nearest first\r\n \r\n \r\n Start date - Farthest first\r\n \r\n \r\n )}\r\n \r\n
    \r\n );\r\n};\r\n","import React from \"react\";\r\n\r\nimport { Button, Checkbox, List, ListItem, ListItemText } from \"@mui/material\";\r\nimport { Add } from \"@mui/icons-material\";\r\n\r\nimport { useAnchorEl } from \"modules/common/hooks/useAnchorEl\";\r\nimport Callout from \"../../callout\";\r\nimport { SelectOption } from \"modules/common/models\";\r\n\r\ninterface IMultiselectMuiProps {\r\n options: SelectOption[];\r\n contentClassName?:string;\r\n selections: string[];\r\n buttonLabel: string | JSX.Element;\r\n onChange: (key: string) => void;\r\n onClose?: () => void;\r\n}\r\n\r\n// a basic single nested multi select using MUI\r\nexport const MultiselectMui: React.FunctionComponent = ({\r\n options,\r\n selections,\r\n buttonLabel,\r\n contentClassName,\r\n onClose,\r\n onChange,\r\n}) => {\r\n const { open, setAnchorEl, anchorEl } = useAnchorEl();\r\n\r\n const handleClick = (event: React.MouseEvent) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const onCloseCallout = () => {\r\n setAnchorEl(null);\r\n\r\n if (onClose) onClose();\r\n }\r\n\r\n return (\r\n <>\r\n }\r\n color=\"primary\"\r\n variant={\"text\"}\r\n onClick={handleClick}\r\n >\r\n {buttonLabel}\r\n \r\n \r\n \r\n {options.map((opt: SelectOption) => (\r\n onChange(opt.key)}\r\n >\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n );\r\n}\r\n","import React, { useState, useEffect } from \"react\";\r\n\r\nimport ChipList from \"modules/common/components/chipList\";\r\nimport { MultiselectMui } from \"modules/common/components/forms/inputs/multiselectMui\";\r\nimport { SelectOption, IdNamePair } from \"modules/common/models\";\r\nimport { IContentBandInputWithContentType } from \"./layoutInput\";\r\nimport { ContentBandContentType } from \"modules/contentBands/models\";\r\n\r\nexport interface ITypesInputProps extends IContentBandInputWithContentType {\r\n types: SelectOption[];\r\n}\r\n\r\nexport const TypesInput: React.FunctionComponent = ({ idx, value, contentType, types, onChange }) => {\r\n // keep an internal value so we only update parent when callout closed\r\n const [internalValue, setInternalValue] = useState(value);\r\n\r\n useEffect(() => {\r\n setInternalValue(value);\r\n }, [value]);\r\n\r\n const onChangeProcessor = (key: string) => {\r\n let newValues = [...internalValue];\r\n\r\n // if key is in values, then we remove, otherwise add key\r\n const shouldRemove = internalValue.includes(key);\r\n if (shouldRemove) newValues = internalValue.filter((type: string) => type !== key);\r\n else newValues = [...newValues, key];\r\n\r\n setInternalValue(newValues);\r\n };\r\n\r\n const onRemoveProcessor = (item: IdNamePair) => {\r\n let newValues = internalValue.filter((key: string) => item.id !== key);\r\n\r\n onChange(newValues, idx);\r\n };\r\n\r\n const onClose = () => {\r\n onChange(internalValue, idx);\r\n };\r\n\r\n const isEvent = contentType === ContentBandContentType.Event;\r\n\r\n return (\r\n <>\r\n
    \r\n \r\n
    \r\n \r\n
    \r\n
    \r\n
    \r\n
    \r\n internalValue.includes(opt.key))\r\n .map((opt: SelectOption) => ({\r\n id: opt.key,\r\n name: opt.text,\r\n labelStyle: {\r\n fontSize: 14,\r\n },\r\n }))}\r\n />\r\n
    \r\n
    \r\n \r\n );\r\n};\r\n","import React, { useState, useEffect, useMemo } from \"react\";\r\nimport { Add, Lock } from \"@mui/icons-material\";\r\n\r\nimport ChipList from \"modules/common/components/chipList\";\r\nimport { IdNamePair } from \"modules/common/models\";\r\nimport { TenantSettingsTagGroup, TenantSettingsTag, MultiSelectTopic } from \"modules/settings\";\r\nimport { IContentBandSettingsInputProps } from \"../editor/contentBandSettingsForm\";\r\nimport MultiSelectCallout from \"modules/common/components/forms/inputs/multiSelectCalloutWithSearch\";\r\n\r\nexport interface ITopicInputProps extends IContentBandSettingsInputProps {\r\n topicGroups: TenantSettingsTagGroup[];\r\n}\r\n\r\nexport const TopicInput: React.FunctionComponent = ({ idx, value, topicGroups, onChange }) => {\r\n // keep an internal value so we only update parent when callout closed\r\n const [internalValue, setInternalValue] = useState(value);\r\n\r\n useEffect(() => {\r\n setInternalValue(value);\r\n }, [value]);\r\n\r\n const filtered = useMemo(() => {\r\n return topicGroups\r\n .map((group: TenantSettingsTagGroup) => ({\r\n ...group,\r\n tags: group.tags.filter((tag: TenantSettingsTag) => !tag.disabled),\r\n }))\r\n .filter((group: TenantSettingsTagGroup) => group.tags.length > 0);\r\n }, [topicGroups]);\r\n\r\n const selected = useMemo(() => {\r\n let allTopics = topicGroups.flatMap((group: TenantSettingsTagGroup) => group.tags);\r\n\r\n return allTopics\r\n .filter((topic: TenantSettingsTag) => internalValue.includes(topic.id))\r\n .map((topic: TenantSettingsTag) => ({\r\n ...topic,\r\n icon: topic.restricted\r\n }));\r\n }, [topicGroups, internalValue]);\r\n\r\n const onChangeProcesser = (topics: MultiSelectTopic[]) => {\r\n let ids = topics.map((topic: MultiSelectTopic) => topic.id);\r\n setInternalValue(ids);\r\n };\r\n\r\n const onRemoveProcessor = (tagToRemove: IdNamePair) => {\r\n let newValues = internalValue.filter((id: string) => id !== tagToRemove.id);\r\n\r\n onChange(newValues, idx);\r\n };\r\n\r\n const onCalloutClose = () => {\r\n onChange(internalValue, idx);\r\n };\r\n\r\n return (\r\n <>\r\n
    \r\n \r\n
    \r\n {filtered.length !== 0 && (\r\n \r\n }}\r\n onClose={onCalloutClose}\r\n nestingAllowed\r\n buttonId=\"add-topics-button\"\r\n />\r\n )}\r\n
    \r\n
    \r\n
    \r\n
    \r\n ({\r\n id: opt.id,\r\n name: opt.name,\r\n icon: opt.restricted ? : undefined\r\n }))}\r\n />\r\n
    \r\n
    \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { ContentBandContentType, ContentBandLayoutType, IContentBandSettings, ReadStatus } from \"../../models\";\r\nimport { useMediaQuery, useTheme } from \"@mui/material\";\r\n\r\nimport { IContentBandSettingActionProps } from \"./contentBandsEditorPage\";\r\nimport { SelectOption } from \"modules/common/models\";\r\nimport { TenantSettingsTagGroup } from \"modules/settings\";\r\nimport { SortStyle } from \"utils/managementUtils\";\r\nimport {\r\n LayoutInput,\r\n DisplayFullTitlesInput,\r\n EnableSeeMoreInput,\r\n AutoPlayCarouselInput,\r\n ContentCountInput,\r\n ContentTypeInput,\r\n SortByInput,\r\n PinInput,\r\n ReadStatusInput,\r\n TypesInput,\r\n TopicInput,\r\n IgnoreSubscriptionsInput,\r\n} from \"../inputs\";\r\n\r\nconst EVENT_TYPES: SelectOption[] = [\r\n {\r\n key: \"informational\",\r\n text: \"Informational\",\r\n type: \"item\",\r\n },\r\n {\r\n key: \"standard\",\r\n text: \"Standard RSVP\",\r\n type: \"item\",\r\n },\r\n {\r\n key: \"mandatory\",\r\n text: \"Mandatory RSVP\",\r\n type: \"item\",\r\n },\r\n];\r\n\r\nconst POST_TYPES: SelectOption[] = [\r\n {\r\n key: \"standard\",\r\n text: \"Standard\",\r\n type: \"item\",\r\n },\r\n {\r\n key: \"compliance\",\r\n text: \"Compliance\",\r\n type: \"item\",\r\n },\r\n {\r\n key: \"mandatory\",\r\n text: \"Mandatory\",\r\n type: \"item\",\r\n },\r\n {\r\n key: \"public\",\r\n text: \"Public\",\r\n type: \"item\",\r\n },\r\n];\r\n\r\nexport interface IContentBandSettingsForm extends IContentBandSettingActionProps {\r\n settings: IContentBandSettings;\r\n idx: number;\r\n defaultLcid: string;\r\n userTagGroups: TenantSettingsTagGroup[];\r\n}\r\n\r\nexport const ContentBandSettingsForm: React.FunctionComponent = ({\r\n defaultLcid,\r\n settings: {\r\n contentCount = 10,\r\n contentType = ContentBandContentType.Post,\r\n seeMoreEnabled = false,\r\n displayFullTitles = false,\r\n sortBy = SortStyle.publishDesc,\r\n pinnedIds = [],\r\n lockToTypes = [],\r\n lockToReadStatus = ReadStatus.Both,\r\n lockToTopicIds = [],\r\n layoutType = ContentBandLayoutType.Card,\r\n autoPlayCarousel = false,\r\n ignoreSubscriptions = false,\r\n },\r\n idx,\r\n userTagGroups,\r\n ...actions\r\n}) => {\r\n const theme = useTheme();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down(\"sm\"), { noSsr: true });\r\n\r\n const getTypes = (): SelectOption[] => (contentType === ContentBandContentType.Event ? EVENT_TYPES : POST_TYPES);\r\n\r\n return (\r\n <>\r\n \r\n {layoutType === ContentBandLayoutType.Card && (\r\n \r\n )}\r\n {layoutType !== ContentBandLayoutType.Carousel && (\r\n \r\n )}\r\n {layoutType === ContentBandLayoutType.Carousel && (\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport interface IContentBandSettingsInputProps {\r\n idx: number;\r\n onChange: (newValue: T, idx: number) => void;\r\n value: T;\r\n isSmallAndSmaller: boolean;\r\n}\r\n","import React, { useEffect, useMemo, useState } from \"react\";\r\n\r\nimport { ContentCopy, Delete, DragIndicator, Refresh } from \"@mui/icons-material\";\r\nimport { ClickAwayListener, Collapse, FormControl, IconButton, TextField } from \"@mui/material\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\n\r\nimport { IContentBand, IHeaderTranslation } from \"../../models\";\r\nimport { ContentBandSettingsForm } from \"./contentBandSettingsForm\";\r\nimport { IContentBandSettingActionProps } from \"./contentBandsEditorPage\";\r\nimport { TenantSettingsTagGroup } from \"modules/settings\";\r\nimport { ContentBandLayoutPreview } from \"../layouts/contentBandLayoutPreview\";\r\nimport { IPosition } from \"modules/common/hooks/useDragReorder\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport usePrevious from \"modules/common/hooks/usePrevious\";\r\nimport useIsFirstRender from \"modules/common/hooks/useIsFirstRender\";\r\nimport { arraysEqual } from \"utils/equalityUtils\";\r\nimport { contentBandsSlice } from \"../../reducer\";\r\n\r\nimport \"../../styles/contentBandEditor.sass\";\r\nimport { InputCounter } from \"modules/common/components/forms/inputs/inputCounter\";\r\n\r\nexport interface IContentBandEditorProps extends IContentBandSettingActionProps {\r\n idx: number;\r\n defaultLcid: string;\r\n activeLcid: string;\r\n contentBand: IContentBand;\r\n userTagGroups: TenantSettingsTagGroup[];\r\n isActive: boolean | null;\r\n draggedIdx: number | null;\r\n mousePos: IPosition;\r\n onCopy: (idx: number) => void;\r\n onRemove: (idx: number) => void;\r\n onDrag: (idx: number) => void;\r\n setActiveBand: (idx: number | null) => void;\r\n fetchContentForBand: (band: IContentBand, idx: number) => void;\r\n}\r\n\r\nexport const ContentBandEditor: React.FunctionComponent = ({\r\n idx,\r\n contentBand,\r\n defaultLcid,\r\n userTagGroups,\r\n activeLcid,\r\n isActive,\r\n draggedIdx,\r\n mousePos,\r\n onCopy,\r\n onRemove,\r\n onDrag,\r\n setActiveBand,\r\n fetchContentForBand,\r\n ...actions\r\n}) => {\r\n const dispatch = useDispatch();\r\n const isFirstRender = useIsFirstRender();\r\n const { fetchIdx, reordered, config, isLoadingContent } = useSelector((state: GlobalApplicationState) => state.contentBands);\r\n const previousBand = usePrevious(contentBand);\r\n const [isRefreshable, setIsRefreshable] = useState(false);\r\n\r\n // keep track of if we're currently drag re orderign\r\n // when dragging we only show the header\r\n const isDragging = draggedIdx !== null && draggedIdx !== -1;\r\n\r\n const [isHeaderFocused, setIsHeaderFocused] = useState(false);\r\n\r\n const header = useMemo(() => {\r\n const { headers } = contentBand;\r\n\r\n if (!headers) return \"\";\r\n\r\n let result: IHeaderTranslation | null = null;\r\n if (Object.keys(headers).includes(activeLcid)) result = headers[activeLcid];\r\n\r\n return result?.header?.substring(0, 35) || \"\";\r\n }, [contentBand, activeLcid]);\r\n\r\n // allow user to fetch content for band by refresh button when any of the following change:\r\n // - pinned ids\r\n // - types\r\n // - read status\r\n // - topic ids\r\n // - ignore subscriptions flag\r\n // - content type\r\n // ignore on first render because useContentBands handles that\r\n useEffect(() => {\r\n if (\r\n !isFirstRender &&\r\n !reordered &&\r\n ((contentBand !== undefined && previousBand === undefined) ||\r\n contentBand.contentType !== previousBand?.contentType ||\r\n contentBand.contentCount !== previousBand?.contentCount ||\r\n contentBand.lockToReadStatus !== previousBand?.lockToReadStatus ||\r\n contentBand.ignoreSubscriptions !== previousBand?.ignoreSubscriptions ||\r\n contentBand.sortBy !== previousBand?.sortBy ||\r\n !arraysEqual(contentBand.lockToTopicIds || [], previousBand?.lockToTopicIds || []) ||\r\n !arraysEqual(contentBand.pinnedIds || [], previousBand?.pinnedIds || []) ||\r\n !arraysEqual(contentBand.lockToTypes || [], previousBand?.lockToTypes || []))\r\n ) {\r\n setIsRefreshable(true);\r\n }\r\n\r\n // reset reordered flag\r\n dispatch({ type: contentBandsSlice.actions.SET_REORDERED, payload: false });\r\n }, [contentBand, dispatch, previousBand, idx, isLoadingContent, isFirstRender, reordered]);\r\n\r\n const onRefresh = () => {\r\n fetchContentForBand(contentBand, idx);\r\n setIsRefreshable(false);\r\n };\r\n\r\n // checks if a button for any content band was clicked\r\n // used for not setting a band as active on certain clicks\r\n const isAnyActionButtonClicked = (id: string, nodeName: string): boolean =>\r\n [\r\n `cb-drag-icon`,\r\n `cb-drag`,\r\n `cb-copy`,\r\n `cb-copy-icon`,\r\n `cb-trash`,\r\n `cb-trash-icon`,\r\n `cb-refresh-icon`,\r\n `cb-refresh`,\r\n `hover-add-btn`,\r\n ].some((prefix: string) => id.includes(prefix)) ||\r\n nodeName === \"circle\" ||\r\n nodeName === \"path\" ||\r\n nodeName === \"svg\";\r\n\r\n return (\r\n {\r\n let target = event.target as HTMLElement;\r\n // when user clicks any action button, do not register as clicking away\r\n if (isActive && !isAnyActionButtonClicked(target.id, target.nodeName)) setActiveBand(null);\r\n }}\r\n >\r\n
    \r\n ) => {\r\n let target = event.target as HTMLElement;\r\n\r\n // only set active when not dragging and it wasn't any of the action buttons clicked\r\n if (!isDragging && !isAnyActionButtonClicked(target.id, target.nodeName)) {\r\n setActiveBand(idx);\r\n }\r\n }}\r\n >\r\n
    \r\n onDrag(idx)}>\r\n \r\n \r\n {isDragging ? (\r\n \r\n ) : (\r\n <>\r\n onCopy(idx)}>\r\n \r\n \r\n onRemove(idx)}>\r\n \r\n \r\n {isRefreshable && (\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n
    \r\n {!isDragging && (\r\n <>\r\n \r\n setIsHeaderFocused(false),\r\n onFocus: () => setIsHeaderFocused(true),\r\n style: {\r\n fontSize: 18,\r\n color: header && config?.contentBandsHeaderTextColor.hexCode,\r\n },\r\n }}\r\n InputProps={{\r\n disableUnderline: !isHeaderFocused,\r\n }}\r\n sx={{\r\n fontSize: 18,\r\n }}\r\n variant=\"standard\"\r\n value={header}\r\n onChange={(event: React.ChangeEvent) =>\r\n actions.onChangeHeaderText(event.target.value, activeLcid, idx)\r\n }\r\n />\r\n {isActive && }\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
    \r\n
    \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Divider, IconButton } from \"@mui/material\";\r\nimport { Add, FiberManualRecord } from \"@mui/icons-material\";\r\n\r\nimport \"./styles/hoverAddButton.sass\";\r\n\r\ninterface IHoverAddButtonProps {\r\n containerStyle?: React.CSSProperties;\r\n onClick: (event: React.MouseEvent) => void;\r\n}\r\n\r\nexport const HoverAddButton: React.FunctionComponent = ({ onClick, containerStyle }) => {\r\n return (\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n );\r\n};\r\n","import React, { useMemo, useEffect, useState, useRef } from \"react\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { Button, IconButton } from \"@mui/material\";\r\nimport { Add, ContentCopy, Delete, DragIndicator, KeyboardArrowDown, Refresh } from \"@mui/icons-material\";\r\n\r\nimport { ContentBandLayoutType, ContentBandStatus, IContentBand } from \"../../models\";\r\nimport { contentBandsSlice } from \"../../reducer\";\r\nimport { useLanguagesData } from \"modules/common/hooks/data/useLanguages\";\r\nimport ConfirmDialog from \"modules/common/components/dialogs/confirmDialog\";\r\nimport LanguageBar from \"modules/localization/components/languageBar\";\r\nimport { ContentBandEditor } from \"./contentBandEditor\";\r\nimport { IContentBandSettingActionProps } from \"./contentBandsEditorPage\";\r\nimport { TenantSettingsTagGroup } from \"modules/settings\";\r\nimport { dropItemBackward, dropItemForward, useDragReorder } from \"modules/common/hooks/useDragReorder\";\r\nimport TranslateContentConfirmation from \"modules/common/components/authoring/dialogs/translateContentConfirmation\";\r\nimport { ILanguage } from \"modules/localization/models\";\r\nimport { cognitiveServicesApi } from \"api/instances\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport { HoverAddButton } from \"modules/common/components/buttons/hoverAddButton\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport \"../../styles/contentBandsMainEditor.sass\";\r\nimport uuid from \"uuid\";\r\n\r\ninterface IContentBandsMainEditor extends IContentBandSettingActionProps {\r\n contentBands: IContentBand[];\r\n userTagGroups: TenantSettingsTagGroup[];\r\n languageInfo: useLanguagesData;\r\n fetchContentForBand: (band: IContentBand, idx: number) => void;\r\n}\r\n\r\nexport const ContentBandsMainEditor: React.FunctionComponent = ({\r\n contentBands,\r\n userTagGroups,\r\n fetchContentForBand,\r\n languageInfo,\r\n ...actions\r\n}) => {\r\n const dispatch = useDispatch();\r\n const { addFinished, addIdx } = useSelector((state: GlobalApplicationState) => state.contentBands);\r\n const [activeIdx, setActiveIdx] = useState(null);\r\n const [draggedIdx, setDraggedIdx] = useState(null);\r\n const [confirmClearTranslate, setConfirmClearTranslate] = useState(false);\r\n const [confirmMultipleLanguagesTranslate, setConfirmMultipleLanguagesTranslate] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n // keep track of the language user hit \"x\" on\r\n const [confirmRemoveLanguage, setConfirmRemoveLanguage] = useState();\r\n const isDragging = draggedIdx !== null;\r\n const dropZoneClassName = useRef(uuid());\r\n\r\n // enable when there is more than one language\r\n // and there is one language with text\r\n const isTranslateEnabled = useMemo(() => {\r\n let result =\r\n contentBands.length > 0 &&\r\n contentBands[0].headers !== undefined &&\r\n // languages are added globally i.e. all content bands have the same ones so here we just check the first content band\r\n Object.keys(contentBands[0].headers).length > 1 &&\r\n // see if any content bands have header with at least 1 character\r\n contentBands.some((x: IContentBand) => {\r\n let contentBandHasFilledHeader: boolean = false;\r\n\r\n if (x.headers) {\r\n let lcids = Object.keys(x.headers);\r\n\r\n for (let i = 0; i < lcids.length; i++) {\r\n let key = lcids[i];\r\n\r\n if (x.headers![key].header && x.headers![key].header.length > 0) contentBandHasFilledHeader = true;\r\n\r\n if (contentBandHasFilledHeader) break;\r\n }\r\n }\r\n\r\n return contentBandHasFilledHeader;\r\n });\r\n\r\n return result;\r\n }, [contentBands]);\r\n\r\n const { selectedLanguages, activeLcid, defaultLcid, onSelectLanguage, onRemoveLanguage, availableLanguages } = languageInfo;\r\n\r\n // scroll to content band when it is opened\r\n useEffect(() => {\r\n const scrollToContentBand = (idx: number) => {\r\n let contentBandOffset = document.getElementById(`cb-${idx}`);\r\n contentBandOffset?.scrollIntoView();\r\n };\r\n\r\n if (activeIdx !== null) scrollToContentBand(activeIdx);\r\n }, [activeIdx]);\r\n\r\n // when append content band is finished,\r\n // fetch the content for latest content band\r\n useEffect(() => {\r\n if (addFinished) {\r\n const idx = addIdx || contentBands.length - 1;\r\n fetchContentForBand(contentBands[idx], idx);\r\n dispatch({ type: contentBandsSlice.actions.SET_ADD_FINISHED, payload: { addFinished: false, addIdx: undefined } });\r\n }\r\n }, [addFinished, addIdx, contentBands, dispatch, fetchContentForBand]);\r\n\r\n const onDrop = (_: string, droppedIdx: number) => {\r\n // copy to use after setting null\r\n const draggedIdxCopy = draggedIdx;\r\n\r\n setDraggedIdx(null);\r\n\r\n if (draggedIdxCopy !== null && draggedIdxCopy > -1) {\r\n let dragged = { ...contentBands[draggedIdxCopy] };\r\n\r\n if (draggedIdxCopy > -1 && droppedIdx > -1 && dragged) {\r\n // dont do anything if band is in its original spot\r\n if (droppedIdx === draggedIdx || draggedIdxCopy === null) return;\r\n\r\n let newItems =\r\n draggedIdxCopy < dropIdx\r\n ? dropItemForward(contentBands, draggedIdxCopy, dropIdx)\r\n : dropItemBackward(contentBands, draggedIdxCopy, dropIdx);\r\n\r\n let newBands = newItems.map((cb: IContentBand, idx: number) => ({\r\n ...cb,\r\n order: idx,\r\n }));\r\n\r\n dispatch({ type: contentBandsSlice.actions.SET_CONTENT_BANDS, payload: { contentBands: newBands, reordered: true } });\r\n }\r\n }\r\n };\r\n\r\n const { mousePos, dropIdx } = useDragReorder({\r\n enabled: true,\r\n draggedIdx: draggedIdx,\r\n items: contentBands.map((b: IContentBand) => ({\r\n id: b.id,\r\n })),\r\n dropZoneClassName: dropZoneClassName.current,\r\n onDrop,\r\n });\r\n\r\n const onAddContentBandClick = () => {\r\n let idx = contentBands.length;\r\n dispatch({ type: contentBandsSlice.actions.APPEND_DEFUALT_CONTENT_BAND, payload: { defaultLcid } });\r\n\r\n setActiveIdx(idx);\r\n };\r\n\r\n const onInsertContentBandClick = (idx: number) => {\r\n dispatch({ type: contentBandsSlice.actions.INSERT_DEFAULT_CONTENT_BAND, payload: { idx: ++idx, defaultLcid } });\r\n setActiveIdx(idx);\r\n };\r\n\r\n const getAddContentBandButton = (): JSX.Element => {\r\n return (\r\n }\r\n sx={{ marginTop: \"30px!important\" }}\r\n >\r\n CONTENT BAND\r\n \r\n );\r\n };\r\n\r\n // add new language to each content bands headers property\r\n const onAddLanguage = (lang: Record) => {\r\n const needToAdd =\r\n !selectedLanguages?.some((selected: ILanguage) => selected.lcid === lang.key) ||\r\n contentBands.some((band: IContentBand) => !Boolean(band.headers) || !Boolean(band.headers![lang.key]));\r\n\r\n // set new language as active\r\n onSelectLanguage(lang.key);\r\n\r\n if (needToAdd) dispatch({ type: contentBandsSlice.actions.ADD_LANGUAGE, payload: lang });\r\n };\r\n\r\n const translationHasContent = (lcid: string): boolean =>\r\n contentBands.some((band: IContentBand) => band.headers && band.headers[lcid].header);\r\n\r\n const onRemoveLanguageClick = (lang: Record) => {\r\n if (translationHasContent(lang.key)) setConfirmRemoveLanguage(lang.key);\r\n else onConfirmRemoveLanguage(lang.key);\r\n };\r\n\r\n const onConfirmRemoveLanguage = (lcid?: string) => {\r\n lcid = lcid || confirmRemoveLanguage;\r\n\r\n if (lcid) {\r\n onRemoveLanguage(lcid);\r\n\r\n dispatch({ type: contentBandsSlice.actions.REMOVE_LANGUAGE, payload: lcid });\r\n }\r\n\r\n setConfirmRemoveLanguage(undefined);\r\n };\r\n\r\n // check if we should confirm text will be cleared\r\n const onTranslate = async () => {\r\n const shouldConfirm = contentBands.some((band: IContentBand) => band.headers && band.headers[activeLcid].header);\r\n\r\n if (shouldConfirm) setConfirmClearTranslate(true);\r\n else await onConfirmClearTranslate();\r\n };\r\n\r\n // check if we should confirm which language to translate from\r\n const onConfirmClearTranslate = async () => {\r\n setConfirmClearTranslate(false);\r\n const shouldConfirm = selectedLanguages && selectedLanguages.length > 2;\r\n\r\n if (shouldConfirm) {\r\n setConfirmMultipleLanguagesTranslate(true);\r\n } else {\r\n await onConfirmTranslateFrom(selectedLanguages?.find((lang: ILanguage) => lang.lcid !== activeLcid)?.lcid || \"\");\r\n }\r\n };\r\n\r\n // translate each content band's headers\r\n const onConfirmTranslateFrom = async (fromLcid: string) => {\r\n setConfirmMultipleLanguagesTranslate(false);\r\n\r\n setIsLoading(true);\r\n\r\n for (let i = 0; i < contentBands.length; i++) {\r\n let band = contentBands[i];\r\n if (!band.headers) continue;\r\n\r\n let translateReq = {\r\n text: band.headers[fromLcid].header,\r\n fromLcid,\r\n toLcid: activeLcid,\r\n };\r\n\r\n let {\r\n data: { Translations },\r\n } = await cognitiveServicesApi.translateText(translateReq);\r\n actions.onChangeHeaderText(Translations[0].text, activeLcid, i);\r\n }\r\n\r\n setIsLoading(false);\r\n };\r\n\r\n const onClickBandArea = (idx: number | null) => {\r\n setActiveIdx(idx);\r\n };\r\n\r\n const onDrag = (idx: number) => {\r\n document.body.style.cursor = \"move\";\r\n setActiveIdx(null);\r\n setDraggedIdx(idx);\r\n };\r\n\r\n const onCopy = (idx: number) => {\r\n const newIdx = idx + 1;\r\n\r\n const newBand: IContentBand = {\r\n ...contentBands[idx],\r\n id: \"\",\r\n order: newIdx,\r\n status: ContentBandStatus.Draft,\r\n publishedDateTimeUtc: null,\r\n };\r\n\r\n dispatch({ type: contentBandsSlice.actions.INSERT_CONTENT_BAND, payload: { idx: newIdx, contentBand: newBand } });\r\n setActiveIdx(newIdx);\r\n };\r\n\r\n const onDelete = (idx: number) => {\r\n dispatch({ type: contentBandsSlice.actions.DELETE_CONTENT_BAND, payload: { idx } });\r\n if (idx === activeIdx) setActiveIdx(null);\r\n };\r\n\r\n const getAvailableLanguagesToTranslateFrom = (): ILanguage[] => {\r\n return (\r\n selectedLanguages?.filter((lang: ILanguage) => {\r\n let keep = lang.lcid !== activeLcid;\r\n\r\n keep =\r\n keep && contentBands.every((cb: IContentBand) => cb.headers && cb.headers[lang.lcid] && cb.headers[lang.lcid].header);\r\n\r\n return keep;\r\n }) || []\r\n );\r\n };\r\n\r\n return (\r\n
    \r\n \r\n {contentBands.length > 0 ? (\r\n <>\r\n }\r\n selectedLanguages={selectedLanguages || []}\r\n onAddLanguage={onAddLanguage}\r\n onRemoveLanguage={onRemoveLanguageClick}\r\n onSelectLanguage={onAddLanguage}\r\n onTranslate={onTranslate}\r\n hide={availableLanguages?.length === 1}\r\n defaultLcid={defaultLcid}\r\n activeLcid={activeLcid}\r\n anyAvailableTranslationsCheck={!isTranslateEnabled}\r\n languages={availableLanguages?.map((lang) => ({ key: lang.lcid, value: lang.language })) || []}\r\n />\r\n {isDragging && (\r\n \r\n
    \r\n \r\n \r\n \r\n {isDragging ? (\r\n \r\n ) : (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
    \r\n
    \r\n )}\r\n
    \r\n {contentBands.map((band: IContentBand, idx: number) => {\r\n const isCarousel = band.layoutType === ContentBandLayoutType.Carousel;\r\n\r\n return (\r\n \r\n {draggedIdx !== idx && (\r\n <>\r\n \r\n \r\n {idx !== contentBands.length - 1 && draggedIdx === null && (\r\n onInsertContentBandClick(idx)}\r\n />\r\n )}\r\n \r\n )}\r\n \r\n );\r\n })}\r\n {getAddContentBandButton()}\r\n setConfirmRemoveLanguage(undefined)}\r\n onConfirm={() => setConfirmRemoveLanguage(undefined)} // KEEP\r\n onDeny={() => onConfirmRemoveLanguage()}\r\n >\r\n
    \r\n You have content on this language. Removing the language will clear the translated work you've done.\r\n
    \r\n
    \r\n Do you want to continue?\r\n
    \r\n \r\n setConfirmClearTranslate(false)}\r\n onDeny={() => setConfirmClearTranslate(false)}\r\n onConfirm={onConfirmClearTranslate}\r\n >\r\n
    \r\n The auto-translate tool will clear all existing text and translations you've entered on this language.\r\n
    \r\n
    \r\n Do you want to continue?\r\n
    \r\n \r\n setConfirmMultipleLanguagesTranslate(false)}\r\n />\r\n \r\n ) : (\r\n
    \r\n \"Mobile\r\n \r\n Start customizing the news, stories or events that appear on your mobile app home screen!\r\n \r\n {getAddContentBandButton()}\r\n
    \r\n )}\r\n
    \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Check, Close } from \"@mui/icons-material\";\r\n\r\nimport {\r\n CONTENT_BAND_LAYOUT_TYPE_MAP,\r\n ContentBandContentType,\r\n ContentBandLayoutType,\r\n IContentBand,\r\n READ_STATUS_MAP,\r\n ReadStatus,\r\n SORT_STYLE_MAP,\r\n} from \"modules/contentBands/models\";\r\nimport { TenantSettingsTag, TenantSettingsTagGroup } from \"modules/settings\";\r\nimport ChipList from \"modules/common/components/chipList\";\r\nimport { SortStyle } from \"utils/managementUtils\";\r\n\r\ninterface IContentBandPublishSettingsProps {\r\n contentBand: IContentBand;\r\n activeLcid: string;\r\n userTagGroups: TenantSettingsTagGroup[];\r\n}\r\n\r\nexport const ContentBandPublishSettings: React.FunctionComponent = ({\r\n contentBand,\r\n userTagGroups,\r\n}) => {\r\n const getSetting = (isOn: boolean, label: string): JSX.Element => {\r\n return (\r\n
    \r\n {isOn ? : }\r\n {label}\r\n
    \r\n );\r\n };\r\n\r\n const getContentBlurb = (): string => {\r\n let result =\r\n `${contentBand.contentCount} ${READ_STATUS_MAP[contentBand.lockToReadStatus || ReadStatus.Both]} ` +\r\n `${contentBand.contentType}s, sorted by ${SORT_STYLE_MAP[contentBand.sortBy || SortStyle.publishDesc] ?? \"\"}, ` +\r\n `${contentBand.pinnedIds?.length || 0} pinned`;\r\n\r\n return result;\r\n };\r\n\r\n const getTopicChips = () => {\r\n const topicIds = contentBand.lockToTopicIds || [];\r\n\r\n const chips = userTagGroups\r\n .flatMap((group: TenantSettingsTagGroup) => group.tags)\r\n .filter((userTag: TenantSettingsTag) => topicIds.includes(userTag.id))\r\n .map((userTag: TenantSettingsTag) => ({ ...userTag }));\r\n\r\n return chips;\r\n };\r\n\r\n const isPosts = contentBand.contentType === ContentBandContentType.Post;\r\n const bandTypes: string[] = contentBand.lockToTypes || [];\r\n const isCards = contentBand.layoutType === ContentBandLayoutType.Card;\r\n const isWindow = contentBand.layoutType === ContentBandLayoutType.Window;\r\n const isCarousel = contentBand.layoutType === ContentBandLayoutType.Carousel;\r\n\r\n return (\r\n <>\r\n
    \r\n Layout\r\n
    \r\n \r\n {contentBand.layoutType ? CONTENT_BAND_LAYOUT_TYPE_MAP[contentBand.layoutType] : CONTENT_BAND_LAYOUT_TYPE_MAP.card}\r\n \r\n {isCards && getSetting(!!contentBand.displayFullTitles, \"Display full title\")}\r\n {(isCards || isWindow) && getSetting(!!contentBand.seeMoreEnabled, \"See more link\")}\r\n {isCarousel && getSetting(!!contentBand.autoPlayCarousel, \"Auto-plays\")}\r\n
    \r\n
    \r\n
    \r\n Content\r\n
    \r\n {getContentBlurb()}\r\n {isPosts ? (\r\n <>\r\n {getSetting(bandTypes.includes(\"standard\"), \"Standard\")}\r\n {getSetting(bandTypes.includes(\"mandatory\"), \"Mandatory\")}\r\n {getSetting(bandTypes.includes(\"compliance\"), \"Compliance\")}\r\n {getSetting(bandTypes.includes(\"public\"), \"Public\")}\r\n \r\n ) : (\r\n <>\r\n {getSetting(bandTypes.includes(\"informational\"), \"Informational\")}\r\n {getSetting(bandTypes.includes(\"standard\"), \"Standard RSVP\")}\r\n {getSetting(bandTypes.includes(\"mandatory\"), \"Mandatory RSVP\")}\r\n \r\n )}\r\n
    \r\n
    \r\n
    \r\n Topics\r\n
    \r\n
    \r\n \r\n
    \r\n {getSetting(contentBand.ignoreSubscriptions, \"Ignore topic subscriptions\")}\r\n
    \r\n
    \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Accordion, AccordionDetails, AccordionSummary, Button, Dialog, DialogActions, DialogContent } from \"@mui/material\";\r\nimport { ExpandMore, VisibilityOutlined } from \"@mui/icons-material\";\r\n\r\nimport { ContentBandPublishSettings } from \"./contentBandsPublishSettings\";\r\nimport { IContentBand } from \"modules/contentBands/models\";\r\nimport { TenantSettingsTagGroup } from \"modules/settings\";\r\nimport useAccordion from \"modules/common/hooks/useAccordion\";\r\n\r\nimport \"../../styles/contentBandsOneLastCheck.sass\";\r\n\r\nexport interface IContentBandsOneLastCheckProps {\r\n open: boolean;\r\n contentBands: IContentBand[];\r\n activeLcid: string;\r\n userTagGroups: TenantSettingsTagGroup[];\r\n onClose: () => void;\r\n onPublish: () => void;\r\n onPreview: () => void;\r\n}\r\n\r\nexport const ContentBandsOneLastCheck: React.FunctionComponent = ({\r\n open,\r\n contentBands,\r\n activeLcid,\r\n userTagGroups,\r\n onPreview,\r\n onClose,\r\n onPublish,\r\n}) => {\r\n const { accordionOpenStates, onChangeAccordionOpen, expandAllLabel, onExpandOrCollapseAll } = useAccordion(contentBands.length, true);\r\n\r\n const getAccordion = (idx: number, contentBand: IContentBand): JSX.Element => (\r\n onChangeAccordionOpen(expanded, idx)}\r\n >\r\n }\r\n style={{\r\n fontWeight: 500,\r\n }}\r\n >\r\n {contentBand.headers && contentBand.headers[activeLcid] && contentBand.headers[activeLcid].header ? (\r\n `${contentBand.headers[activeLcid].header}`\r\n ) : (\r\n (No header text)\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n return (\r\n \r\n
    \r\n One last check!\r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n
    \r\n \r\n You're about to publish{\" \"}\r\n \r\n {contentBands.length} content band{contentBands.length > 1 ? \"s\" : \"\"}:\r\n \r\n \r\n
    \r\n {contentBands.map((cb: IContentBand, idx: number) => getAccordion(idx, cb))}\r\n
    \r\n \r\n \r\n \r\n {expandAllLabel}\r\n \r\n \r\n \r\n );\r\n};\r\n","import React from \"react\";\r\nimport { Close, EditNote } from \"@mui/icons-material\";\r\nimport { Backdrop, Button, IconButton } from \"@mui/material\";\r\n\r\nimport \"./mobileWarningOverlay.sass\";\r\n\r\nexport interface IMobileWarningOverlayProps {\r\n open: boolean;\r\n message: string;\r\n actionMessage: string;\r\n backMessage: string;\r\n onActionClick: () => void;\r\n onClose: () => void;\r\n onBack: () => void;\r\n}\r\n\r\nexport const MobileWarningOverlay: React.FunctionComponent = ({\r\n open,\r\n message,\r\n backMessage,\r\n actionMessage,\r\n onActionClick,\r\n onBack,\r\n onClose,\r\n}) => {\r\n return (\r\n theme.zIndex.drawer + 1,\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n
    \r\n {message}\r\n
    \r\n \r\n \r\n {actionMessage}\r\n \r\n \r\n {backMessage}\r\n \r\n \r\n )\r\n}\r\n","import React, { useState, useEffect, useRef, useLayoutEffect } from \"react\";\r\n\r\nimport { ConnectedProps, connect, useDispatch } from \"react-redux\";\r\nimport { useMediaQuery, useTheme } from \"@mui/material\";\r\nimport { useHistory } from \"react-router\";\r\n\r\nimport AuthoringAppBar from \"modules/common/components/authoring/authoringAppBar\";\r\nimport BasePage from \"pages/common/basePage\";\r\nimport { BackItem } from \"pages/common/breadcrumb\";\r\nimport { ContentBandsEditorActions } from \"./contentBandsEditorActions\";\r\nimport { useContentBands } from \"modules/common/hooks/data/useContentBands\";\r\nimport EditorWrapperLayout from \"modules/common/components/authoring/editorLayouts/editorWrapperLayout\";\r\nimport MainEditorLayout from \"modules/common/components/authoring/editorLayouts/mainEditorLayout\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { setMainStyle, setShouldDisplayNav } from \"modules/adminLayout/actionCreator\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport { ContentBandsSettingsPanel } from \"./contentBandsSettingsPanel\";\r\nimport { ContentBandsMainEditor } from \"./contentBandsMainEditor\";\r\nimport ConfirmDialog from \"modules/common/components/dialogs/confirmDialog\";\r\nimport { DEFAULT_CONFIG, contentBandsSlice, publishContentBandConfigAsync, saveContentBandConfigAsync } from \"../../reducer\";\r\nimport { SortStyle } from \"utils/managementUtils\";\r\nimport { useAuthoringTags } from \"modules/common/hooks/data/useAuthoringTags\";\r\nimport { useMobileConfig } from \"modules/common/hooks/data/useMobileConfig\";\r\nimport { ContentBandsOneLastCheck } from \"../dialogs/contentBandsOneLastCheck\";\r\nimport ErrorSnackbar from \"modules/common/components/snackbars/errorSnackbar\";\r\nimport useLanguages from \"modules/common/hooks/data/useLanguages\";\r\nimport SuccessSnackbar from \"modules/common/components/snackbars/successSnackbar\";\r\nimport { MobileWarningOverlay } from \"modules/common/components/overlays/mobileWarningOverlay\";\r\nimport { ContentBandContentType, ContentBandLayoutType, ReadStatus } from \"../../models\";\r\nimport { IColorOption } from \"modules/homeScreens/models\";\r\nimport { useHomeScreenConfigs } from \"modules/common/hooks/data/useHomeScreenConfigs\";\r\nimport { ContentBandsPreview } from \"../dialogs/contentBandsPreview\";\r\n\r\nimport \"../../../common/components/authoring/styles/authoringLayout.sass\";\r\nimport \"../../styles/contentBandsEditorPage.sass\";\r\n\r\ninterface IContentBandsEditorPageProps {}\r\n\r\nexport interface IContentBandSettingActionProps {\r\n onChangeLayout: (newValue: ContentBandLayoutType, idx: number) => void;\r\n onChangeContentType: (newValue: ContentBandContentType, idx: number) => void;\r\n onChangeDisplayFullTitles: (newValue: boolean, idx: number) => void;\r\n onChangeEnableSeeMoreLink: (newValue: boolean, idx: number) => void;\r\n onChangeContentCount: (newValue: number, idx: number) => void;\r\n onChangeSortBy: (newValue: SortStyle, idx: number) => void;\r\n onChangePinnedIds: (newValue: string[], idx: number) => void;\r\n onChangeLockToReadStatus: (newValue: ReadStatus, idx: number) => void;\r\n onChangeLockToTypes: (newValue: string[], idx: number) => void;\r\n onChangeLockToTopics: (newValue: string[], idx: number) => void;\r\n onChangeIgnoreSubscriptions: (newValue: boolean, idx: number) => void;\r\n onChangeAutoPlayCarousel: (newValue: boolean, idx: number) => void;\r\n onChangeHeaderText: (newValue: string, lcid: string, idx: number) => void;\r\n}\r\n\r\nconst ContentBandsEditorPage: React.FunctionComponent = ({\r\n setShouldDisplayNav,\r\n setMainStyle,\r\n tenantId,\r\n defaultLcid,\r\n shouldDisplayNav,\r\n}) => {\r\n const [confirmUnsavedChangesOpen, setConfirmUnsavedChangesOpen] = useState(false);\r\n const [confirmDiscardChanges, setConfirmDiscardChanges] = useState(false);\r\n const [previewOpen, setPreviewOpen] = useState(false);\r\n const [settingsDrawerOpen, setSettingsDrawerOpen] = useState(() => !isSmallAndSmaller);\r\n const [isOneLastCheckOpen, setIsOneLastCheckOpen] = useState(false);\r\n const [errorMessage, setErrorMessage] = useState(\"\");\r\n\r\n const { tags } = useAuthoringTags();\r\n const { isLoading: isLoadingMobileConfig, mobileConfig } = useMobileConfig();\r\n const { homeScreenConfigs } = useHomeScreenConfigs();\r\n const history = useHistory();\r\n const dispatch = useDispatch();\r\n const theme = useTheme();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down(\"sm\"), { noSsr: true });\r\n const [mobileOverlayOpen, setMobileOverlayOpen] = useState(isSmallAndSmaller);\r\n const mobileWarningClosedOnce = useRef(false);\r\n\r\n const includeContent = true;\r\n const {\r\n contentBands,\r\n publishCount,\r\n successMessage,\r\n isLoading: isContentBandsLoading,\r\n latestSavedContentBands,\r\n saveContentBands,\r\n fetchContentForBand,\r\n isValid,\r\n isContentBandsDirty,\r\n isConfigDirty,\r\n publishContentBands,\r\n config,\r\n pristineConfig,\r\n ...actions\r\n } = useContentBands(includeContent);\r\n\r\n const languageInfo = useLanguages(contentBands.length > 0 ? contentBands[0].headers : undefined);\r\n const { activeLcid } = languageInfo;\r\n\r\n const isDirty = isContentBandsDirty || isConfigDirty;\r\n\r\n const isLoading = isLoadingMobileConfig || isContentBandsLoading;\r\n\r\n const usableConfig = config || DEFAULT_CONFIG;\r\n const usablePristineConfig = pristineConfig || DEFAULT_CONFIG;\r\n\r\n useLayoutEffect(() => {\r\n if (shouldDisplayNav) {\r\n setShouldDisplayNav(false);\r\n setMainStyle({ backgroundColor: \"#FFFFFF\" });\r\n }\r\n }, [shouldDisplayNav, setMainStyle, setShouldDisplayNav]);\r\n\r\n // if mobile warning has been displayed and closed already, don't bother showing again\r\n useEffect(() => {\r\n if (!mobileWarningClosedOnce.current) {\r\n setMobileOverlayOpen(isSmallAndSmaller);\r\n }\r\n }, [isSmallAndSmaller]);\r\n\r\n // confirm unsaved changes\r\n const onBackToMobileAppSettings = () => {\r\n if (isDirty) setConfirmUnsavedChangesOpen(true);\r\n else goBackToMobileAppSettings();\r\n };\r\n\r\n // redirect back to settings page\r\n const goBackToMobileAppSettings = () => {\r\n onDiscard();\r\n\r\n history.push(`/${tenantId}/admin/homeScreens`);\r\n };\r\n\r\n const onPreview = () => {\r\n setPreviewOpen(true);\r\n };\r\n\r\n const onClickDiscard = () => {\r\n setConfirmDiscardChanges(true);\r\n };\r\n\r\n const onDiscard = () => {\r\n setConfirmDiscardChanges(false);\r\n\r\n if (isContentBandsDirty) {\r\n let { activeLcid } = languageInfo;\r\n\r\n // active lcid will be discarded, reset selected language to default lcid\r\n if (\r\n latestSavedContentBands.length > 0 &&\r\n latestSavedContentBands[0].headers &&\r\n !Object.keys(latestSavedContentBands[0].headers).includes(activeLcid)\r\n )\r\n languageInfo.onSelectLanguage(defaultLcid);\r\n\r\n dispatch({ type: contentBandsSlice.actions.SET_CONTENT_BANDS, payload: { contentBands: latestSavedContentBands } });\r\n }\r\n\r\n if (config && isConfigDirty) {\r\n dispatch({ type: contentBandsSlice.actions.SET_CONFIG, payload: pristineConfig });\r\n }\r\n };\r\n\r\n const onSave = () => {\r\n try {\r\n if (isConfigDirty && config) dispatch(saveContentBandConfigAsync(config));\r\n if (isContentBandsDirty) saveContentBands(\"Successfully saved as draft.\");\r\n } catch (err) {\r\n setErrorMessage(\"Something went wrong. Please try again later.\");\r\n }\r\n };\r\n\r\n // display one last check modal\r\n const onPublish = () => {\r\n setIsOneLastCheckOpen(true);\r\n };\r\n\r\n // handle confirm one last check\r\n const onConfirmOneLastCheck = () => {\r\n setIsOneLastCheckOpen(false);\r\n\r\n postPublish(\"Successfully published new content bands.\");\r\n };\r\n\r\n // handle actual publish\r\n // publish content bands and content band config\r\n const postPublish = (successMessage: string) => {\r\n if (config) dispatch(publishContentBandConfigAsync(config));\r\n\r\n publishContentBands(successMessage);\r\n history.push(`/${tenantId}/admin/homeScreens?isPublish=true`);\r\n };\r\n\r\n const getMainEditorClassName = (): string => {\r\n let result: string = \"\";\r\n // on sm screens we will just overlap the two panels\r\n if (isSmallAndSmaller) {\r\n result = \"main-editor-paper\";\r\n } else {\r\n result = settingsDrawerOpen ? \"main-editor-paper main-editor-paper-open\" : \"main-editor-paper main-editor-paper-closed\";\r\n }\r\n\r\n return result;\r\n };\r\n\r\n const onToggleDrawer = () => {\r\n setSettingsDrawerOpen((prev: boolean) => !prev);\r\n };\r\n\r\n const onCloseConfirmUnsavedChanges = () => {\r\n setConfirmUnsavedChangesOpen(false);\r\n };\r\n\r\n const closeMobileOverlay = () => {\r\n mobileWarningClosedOnce.current = true;\r\n setMobileOverlayOpen(false);\r\n };\r\n\r\n const onSetHeaderTextColor = (newColor: IColorOption) => {\r\n dispatch({ type: contentBandsSlice.actions.SET_HEADER_TEXT_COLOR, payload: newColor });\r\n };\r\n\r\n const onSetGradientColor = (newColor: IColorOption) => {\r\n dispatch({ type: contentBandsSlice.actions.SET_GRADIENT_COLOR, payload: newColor });\r\n };\r\n\r\n return (\r\n \r\n \r\n ) : (\r\n \r\n )\r\n }\r\n actions={\r\n \r\n }\r\n />\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    Your changes will not be saved.
    \r\n
    \r\n
    Do you want to continue?
    \r\n
    \r\n \r\n setErrorMessage(\"\")} />\r\n setIsOneLastCheckOpen(false)}\r\n onPublish={onConfirmOneLastCheck}\r\n />\r\n setConfirmDiscardChanges(false)}\r\n onDeny={onDiscard}\r\n onConfirm={() => {\r\n setConfirmDiscardChanges(false);\r\n onSave();\r\n }}\r\n >\r\n
    \r\n
    You are about to leave the editor with unsaved changes.
    \r\n
    \r\n
    Do you want to save the changes before you leave?
    \r\n
    \r\n \r\n dispatch({ type: contentBandsSlice.actions.SET_SUCCESS_MESSAGE, payload: \"\" })}\r\n />\r\n
    \r\n \r\n setPreviewOpen(false)}\r\n mobileConfig={mobileConfig}\r\n homeScreenConfigs={homeScreenConfigs || []}\r\n activeLcid={activeLcid}\r\n config={usableConfig}\r\n contentBands={contentBands}\r\n />\r\n
    \r\n );\r\n};\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IContentBandsEditorPageProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id,\r\n tenantTagGroups: state.settings.tenantSettings.tagGroups,\r\n defaultLcid: state.settings.tenantSettings.defaultLCID,\r\n shouldDisplayNav: state.adminLayout.shouldDisplayNav,\r\n }),\r\n {\r\n setMainStyle,\r\n setShouldDisplayNav,\r\n }\r\n);\r\n\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport const ConnectedContentBandsEditorPage = connector(ContentBandsEditorPage);\r\n","import { TenantSettingsTagGroup } from \"modules/settings\";\r\nimport { useEffect, useState } from \"react\";\r\nimport useIsMounted from \"../useIsMounted\";\r\nimport { tagsApi } from \"api/instances\";\r\n\r\nexport type UseAuthoringTagsReturnType = {\r\n tags: TenantSettingsTagGroup[];\r\n};\r\n\r\nexport const useAuthoringTags = (): UseAuthoringTagsReturnType => {\r\n const isMounted = useIsMounted();\r\n const [tags, setTags] = useState([]);\r\n\r\n useEffect(() => {\r\n const getTags = async () => {\r\n let tagsToSet: TenantSettingsTagGroup[] = [];\r\n\r\n try {\r\n tagsToSet = await tagsApi.getUserTags(true);\r\n } finally {\r\n if (isMounted()) setTags(tagsToSet);\r\n }\r\n };\r\n\r\n getTags();\r\n }, [isMounted]);\r\n\r\n return {\r\n tags,\r\n };\r\n};\r\n","import * as React from \"react\";\r\n\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport { push } from \"react-router-redux\";\r\nimport { Box, Paper, Stack } from \"@mui/material\";\r\n\r\nimport { useContentGuidelines } from \"modules/common/hooks/data/useContentGuidelines\";\r\nimport PageForbidden from \"pages/pageForbidden/pageForbidden\";\r\nimport ContentGuidelinePreviewBody from \"./contentGuidelinePreviewBody\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { BackItem } from \"pages/common/breadcrumb\";\r\nimport AuthoringAppBar from \"modules/common/components/authoring/authoringAppBar\";\r\nimport BasePage from \"pages/common/basePage\";\r\nimport { RouteComponentProps, withRouter } from \"react-router-dom\";\r\n\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { setShouldDisplayNav } from \"modules/adminLayout/actionCreator\";\r\nimport \"./contentGuidelines.sass\";\r\n\r\nconst ContentGuidelinesPage: React.FunctionComponent = (props: PropsWithRedux) => {\r\n const { guidelines, isEmpty: isGuidelineEmpty } = useContentGuidelines();\r\n const { setShouldDisplayNav } = props;\r\n\r\n React.useLayoutEffect(() => {\r\n setShouldDisplayNav(false);\r\n }, [setShouldDisplayNav]);\r\n\r\n if (!guidelines) return ;\r\n\r\n if (isGuidelineEmpty) return ;\r\n\r\n return (\r\n \r\n \r\n
    \r\n props.redirectTo(`/${props.match.params.tenant}/admin`)}\r\n />\r\n }\r\n actions={}\r\n />\r\n
    \r\n\r\n
    \r\n \r\n \r\n \r\n \r\n \r\n
    \r\n
    \r\n
    \r\n );\r\n};\r\n\r\ninterface RouteParams {\r\n tenant: string;\r\n}\r\n\r\ninterface ComponentProps {\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n shouldDisplayNav: state.adminLayout.shouldDisplayNav,\r\n }),\r\n {\r\n redirectTo: push,\r\n setShouldDisplayNav\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default withRouter(connector(ContentGuidelinesPage));","import MoreOptionsButton from \"modules/common/components/buttons/moreOptionsButton\";\r\nimport React from \"react\";\r\nimport Divider from \"@mui/material/Divider\";\r\nimport List from \"@mui/material/List\";\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\n\r\ninterface IMoreOptionsEmailProps {\r\n onDownloadEmailActivityLog: () => void;\r\n onDownloadUserData: () => void;\r\n onDownloadEmailOutbox: () => void;\r\n onClickManageSenderEmails: () => void;\r\n}\r\n\r\nconst MoreOptionsEmail: React.FC = ({\r\n onDownloadEmailActivityLog,\r\n onDownloadUserData,\r\n onDownloadEmailOutbox,\r\n onClickManageSenderEmails\r\n\r\n}) => {\r\n return \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ;\r\n};\r\n\r\nexport default MoreOptionsEmail;\r\n","import AuthoringFilter from \"modules/common/components/filters/authoringFilter\";\r\nimport AuthoringSearch from \"modules/common/components/filters/authoringSearch\";\r\nimport FilterContainer from \"modules/common/components/filters/filterContainer\";\r\nimport React, { useState } from \"react\";\r\nimport { IEmailFilters } from \"../models\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport { Chip } from \"@mui/material\";\r\n\r\ninterface IEmailFiltersProps {\r\n filters: IEmailFilters;\r\n onChangeFilters: (filters: IEmailFilters) => void;\r\n onClearFilters: () => void;\r\n}\r\n\r\nconst EmailFilters: React.FC = ({\r\n filters,\r\n onChangeFilters,\r\n onClearFilters\r\n}) => {\r\n const [textToSearch, setTextToSearch] = useState(\"\");\r\n\r\n const onApplyFilters = () => {\r\n onChangeFilters({...filters, textToSearch});\r\n }\r\n\r\n const onInnerClearFilters = () => {\r\n setTextToSearch(\"\");\r\n onClearFilters();\r\n }\r\n\r\n const getFilterSelection = (): JSX.Element | undefined => { \r\n if (!filters.textToSearch) return undefined;\r\n \r\n return \r\n {\r\n !!filters.textToSearch &&\r\n }\r\n />\r\n }\r\n ;\r\n }\r\n\r\n return setTextToSearch(e.target.value)}\r\n />\r\n }\r\n filterCommands={\r\n \r\n }\r\n filterSelection={getFilterSelection()}\r\n />;\r\n};\r\n\r\nexport default EmailFilters;\r\n","import { Divider, List } from \"@mui/material\";\r\nimport MoreOptionsIconButton from \"modules/common/components/buttons/moreOptionsIconButton\";\r\nimport MoreOptionsItem from \"modules/common/components/moreOptionsItem\";\r\nimport React from \"react\";\r\nimport { IEmailListItem } from \"../models\";\r\n\r\ninterface IEmailOptionsProps {\r\n email: IEmailListItem;\r\n onDownloadEmailActivity?: (email: IEmailListItem) => void;\r\n onEditEmail?: (email: IEmailListItem) => void;\r\n onPreviewEmail: (email: IEmailListItem) => void;\r\n onDuplicateEmail: (email: IEmailListItem) => void;\r\n onDeleteEmail?: (email: IEmailListItem) => void;\r\n onUnsendEmail?: (email: IEmailListItem) => void;\r\n}\r\n\r\nconst EmailOptions: React.FC = ({\r\n email,\r\n onDownloadEmailActivity,\r\n onEditEmail,\r\n onPreviewEmail,\r\n onDuplicateEmail,\r\n onDeleteEmail,\r\n onUnsendEmail\r\n}) => {\r\n return \r\n \r\n {\r\n email.status === \"draft\"\r\n ? onEditEmail && onEditEmail(email)}\r\n />\r\n : email.status === \"scheduled\" \r\n ? onUnsendEmail && \r\n onUnsendEmail(email)}\r\n buttonId=\"more-options-unpublish-button\"\r\n />\r\n : onDownloadEmailActivity && \r\n onDownloadEmailActivity(email)}\r\n />\r\n }\r\n \r\n onPreviewEmail(email)}\r\n />\r\n onDuplicateEmail(email)}\r\n buttonId=\"more-options-duplicate-button\"\r\n />\r\n {\r\n onDeleteEmail &&\r\n onDeleteEmail(email)}\r\n buttonId=\"more-options-delete-button\"\r\n />\r\n }\r\n \r\n ;\r\n};\r\n\r\nexport default EmailOptions;\r\n","import React from \"react\";\r\nimport { EmailSortStyle, EmailStatus, IEmailFilters, IEmailListingPage, IEmailListItem } from \"../models\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport ManagementEmptyResults from \"modules/common/components/managementEmptyResults\";\r\nimport ArrowDownward from \"@mui/icons-material/ArrowDownward\";\r\nimport ArrowUpward from \"@mui/icons-material/ArrowUpward\";\r\nimport { Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from \"@mui/material\";\r\nimport EmailOptions from \"./emailOptions\";\r\nimport Paging from \"modules/common/components/paging\";\r\nimport moment from \"moment\";\r\nimport { ROWS_PER_PAGE_COOKIE_NAMES } from \"utils/cookie\";\r\nimport { ITranslatedText } from \"modules/common/models\";\r\n\r\ninterface IHeaderCell {\r\n id: string;\r\n label: string;\r\n ascValue?: EmailSortStyle;\r\n descValue?: EmailSortStyle;\r\n clickable?: boolean;\r\n}\r\n\r\ninterface IEmailsTableProps {\r\n show: boolean;\r\n showIsLoading: boolean;\r\n page: IEmailListingPage;\r\n filters: IEmailFilters;\r\n hasFiltersApplied: boolean;\r\n activeLcid: string;\r\n onChangeFilters: (newFilters: IEmailFilters) => void;\r\n onChangePage: (page: number, rowsPerPage: number, filters: IEmailFilters) => void;\r\n onDownloadEmailActivity: (emailId: string) => void;\r\n handleDraftEmailClick: (email: IEmailListItem) => void;\r\n onDuplicateEmail: (email: IEmailListItem) => void;\r\n onPreviewEmail: (email: IEmailListItem) => void;\r\n onDeleteEmail: (email: IEmailListItem) => void;\r\n onUnsendEmail: (email: IEmailListItem) => void;\r\n}\r\n\r\nconst EmailsTable: React.FC = ({\r\n show,\r\n showIsLoading,\r\n page,\r\n filters,\r\n hasFiltersApplied,\r\n activeLcid,\r\n onChangeFilters,\r\n onPreviewEmail,\r\n onChangePage,\r\n onDownloadEmailActivity,\r\n handleDraftEmailClick,\r\n onDuplicateEmail,\r\n onDeleteEmail,\r\n onUnsendEmail\r\n}) => {\r\n const getPublishedTimeTabLabel = () => {\r\n switch (page.id) {\r\n case EmailStatus.Draft:\r\n return \"Last modified on\";\r\n case EmailStatus.Scheduled:\r\n return \"Send on\";\r\n case EmailStatus.Sent:\r\n return \"Sent on\";\r\n } \r\n }\r\n\r\n const formatSubject = (subject: ITranslatedText[]) => {\r\n const subjectVal = subject.find(s => s.lcid === activeLcid)?.text || \"No subject\";\r\n\r\n return subjectVal.length > 100 ? subjectVal.substring(0, 97) + \"...\" : subjectVal;\r\n }\r\n\r\n const formatTime = (time?: Date): string => time ? moment(time).format(\"MMM D, YYYY h:mmA\") : \"-\";\r\n\r\n const onClickHeader = (descValue?: EmailSortStyle, ascValue?: EmailSortStyle) => {\r\n let updatedFilters = { ...filters };\r\n\r\n if (descValue === undefined || ascValue === undefined) {\r\n return;\r\n }\r\n\r\n if (filters.sortBy === descValue) {\r\n updatedFilters = { ...updatedFilters, sortBy: ascValue };\r\n } else {\r\n updatedFilters = { ...updatedFilters, sortBy: descValue };\r\n }\r\n\r\n onChangeFilters(updatedFilters);\r\n }\r\n\r\n const getHeader = () => {\r\n let header: IHeaderCell[] = [\r\n {\r\n id: \"title\",\r\n label: \"Subject\",\r\n ascValue: EmailSortStyle.SubjectAsc,\r\n descValue: EmailSortStyle.SubjectDesc,\r\n clickable: true\r\n }\r\n ];\r\n\r\n header.push({ id: \"options\", label: \"\" });\r\n\r\n header.push({\r\n id: \"publishedTime\",\r\n label: getPublishedTimeTabLabel(),\r\n ascValue: page.id === EmailStatus.Draft ? EmailSortStyle.LastModifiedTimeAsc : EmailSortStyle.SentTimeAsc,\r\n descValue: page.id === EmailStatus.Draft ? EmailSortStyle.LastModifiedTimeDesc : EmailSortStyle.SentTimeDesc,\r\n clickable: true\r\n });\r\n\r\n header.push({\r\n id: \"author\",\r\n label: page.id === EmailStatus.Draft ? \"Last modified by\" : \"Published by\",\r\n ascValue: page.id === EmailStatus.Draft ? EmailSortStyle.LastModifiedByAsc : EmailSortStyle.SentByAsc,\r\n descValue: page.id === EmailStatus.Draft ? EmailSortStyle.LastModifiedByDesc : EmailSortStyle.SentByDesc,\r\n clickable: true\r\n });\r\n\r\n header.push({\r\n id: \"fromAddress\",\r\n label: \"From address\",\r\n ascValue: EmailSortStyle.FromSenderAsc,\r\n descValue: EmailSortStyle.FromSenderDesc,\r\n clickable: true\r\n });\r\n\r\n return header;\r\n }\r\n\r\n if (!show) \r\n return <>;\r\n else if (showIsLoading) \r\n return
    ;\r\n else if (!page.emails?.length) \r\n return \r\n else \r\n return <>\r\n { hasFiltersApplied && Results }\r\n \r\n \r\n \r\n \r\n {\r\n getHeader().map((headerCell) => \r\n onClickHeader(headerCell.descValue, headerCell.ascValue)}\r\n >\r\n
    \r\n {headerCell.label}\r\n {filters.sortBy === headerCell.ascValue && }\r\n {filters.sortBy === headerCell.descValue && }\r\n
    \r\n \r\n )\r\n }\r\n
    \r\n
    \r\n \r\n {\r\n page.emails.map(email => \r\n email.status === \"draft\" ? handleDraftEmailClick(email) : onPreviewEmail(email)}\r\n tabIndex={-1}\r\n key={email.id}\r\n style={{ cursor: \"pointer\" }}\r\n >\r\n \r\n {formatSubject(email.subject)}\r\n \r\n \r\n onDownloadEmailActivity(email.id) : undefined}\r\n onEditEmail={email.status === \"draft\" ? handleDraftEmailClick : undefined}\r\n onDuplicateEmail={onDuplicateEmail}\r\n onPreviewEmail={onPreviewEmail}\r\n onDeleteEmail={email.status === \"draft\" || email.status === \"scheduled\" ? onDeleteEmail : undefined}\r\n onUnsendEmail={email.status === \"scheduled\" ? onUnsendEmail : undefined}\r\n />\r\n \r\n {formatTime(email.status === \"draft\" ? email.lastModification.modifiedTime : email.sentTime)}\r\n {(email.status === \"draft\" ? email.lastModification?.modifiedBy.name : email.sentBy?.name) ?? \"\"}\r\n {email.fromSender ? `${email.fromSender.name}, ${email.fromSender.email}` : \"\"}\r\n \r\n )\r\n }\r\n \r\n
    \r\n
    \r\n onChangePage(page, rowsPerPage, filters)}\r\n rowsCookieName={ROWS_PER_PAGE_COOKIE_NAMES.EMAILS}\r\n defaultRowsPerPage={25}\r\n /> \r\n ;\r\n};\r\n\r\nexport default EmailsTable;\r\n","import { useDispatch } from \"react-redux\";\r\nimport { snackbarsSlice } from \"../components/snackbars/reducer\";\r\n\r\ninterface IUseSetSnackbarMessagesReturnType {\r\n setSuccessMessage: (message: string) => void;\r\n setErrorMessage: (message: string) => void;\r\n setInfoMessage: (message: string) => void;\r\n}\r\n\r\nexport const UseSetSnackbarMessages = (): IUseSetSnackbarMessagesReturnType => {\r\n const dispatch = useDispatch();\r\n const setSuccessMessage = (message: string) => dispatch({ type: snackbarsSlice.actions.SET_SUCCESS_MESSAGE, payload: { message }});\r\n const setErrorMessage = (message: string) => dispatch({ type: snackbarsSlice.actions.SET_ERROR_MESSAGE, payload: { message }});\r\n const setInfoMessage = (message: string) => dispatch({ type: snackbarsSlice.actions.SET_INFO_MESSAGE, payload: { message }});\r\n\r\n return {\r\n setSuccessMessage,\r\n setErrorMessage,\r\n setInfoMessage\r\n };\r\n};\r\n","import { ITranslatedText } from \"modules/common/models\";\r\nimport { EMAIL_PERSONALIZATION_TOKENS, MERGE_TAG_PREFIX, MERGE_TAG_SUFFIX, PersonalizationTokenValue } from \"modules/emails/models\";\r\nimport { CurrentUserSettings } from \"modules/settings\";\r\n\r\n// Maps the personalization token to the actual text we want\r\nexport const personalizationTokenMapper = (tokenValue: PersonalizationTokenValue, currentUser: CurrentUserSettings) => {\r\n let replaceText = \"\";\r\n\r\n switch (tokenValue) {\r\n case PersonalizationTokenValue.UserFirstName:\r\n replaceText = currentUser.firstName;\r\n break;\r\n case PersonalizationTokenValue.UserLastName:\r\n replaceText = currentUser.lastName;\r\n break;\r\n }\r\n\r\n return replaceText;\r\n}\r\n\r\n// replaces string text occurences of the token to what the value of the token is\r\nexport const replaceTextPersonalizationTokens = (subject: ITranslatedText[], activeLcid: string, currentUser: CurrentUserSettings): string => {\r\n let subjectText = subject.find(s => s.lcid === activeLcid)?.text;\r\n\r\n if (subjectText) {\r\n for (const token of EMAIL_PERSONALIZATION_TOKENS) {\r\n const personalizationTokenText = `${MERGE_TAG_PREFIX}${token.value}${MERGE_TAG_SUFFIX}`;\r\n const replaceValue = personalizationTokenMapper(token.value, currentUser);\r\n subjectText = subjectText.replaceAll(personalizationTokenText, replaceValue);\r\n }\r\n }\r\n\r\n return subjectText ?? \"\";\r\n}\r\n","import React from \"react\";\r\nimport { EmailStatus, IEmail, } from \"../models\";\r\nimport moment from \"moment\";\r\nimport Body from \"modules/events/components/event-views/components/body\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { replaceTextPersonalizationTokens } from \"utils/replaceTextPersonalizationTokens\";\r\n\r\nimport \"../styles/emailContentView.sass\";\r\n\r\ninterface IEmailContentViewProps {\r\n email: IEmail;\r\n activeLcid: string;\r\n}\r\n\r\nconst EmailContentView: React.FC = ({\r\n email,\r\n activeLcid\r\n}) => {\r\n const currentUser = useSelector((state: GlobalApplicationState) => state.settings.currentUser);\r\n const isDraft = email.status === EmailStatus.Draft;\r\n\r\n const getFormattedSentTime = () => {\r\n let sentTime = moment().calendar();\r\n if (\r\n email.sentTime && // sent time must be available\r\n (\r\n !isDraft || // if email is scheduled/sent, we use the sent time attached to the email\r\n (isDraft && new Date(email.sentTime) >= new Date()) // if email is draft, we use the sent time only if it's in the future\r\n )\r\n ) {\r\n sentTime = moment(email.sentTime).format(\"ddd, MMM D, YYYY [at] h:mm A\");\r\n }\r\n return sentTime;\r\n }\r\n\r\n return
    \r\n
    \r\n
    \r\n
    \r\n {\r\n email.subject && email.subject.find(s => s.lcid == activeLcid)?.text \r\n ? replaceTextPersonalizationTokens(email.subject, activeLcid, currentUser) \r\n : \"No subject\"\r\n }\r\n
    \r\n
    \r\n
    \r\n \"Placeholder\r\n
    \r\n
    \r\n {email.fromSender.name}\r\n {` <${email.fromSender.email}>`}\r\n
    \r\n to me\r\n
    \r\n
    \r\n
    \r\n
    \r\n \"Reply\r\n \"Reply\r\n \"Forward\r\n
    \r\n
    {getFormattedSentTime()}
    \r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n
    ;\r\n};\r\n\r\nexport default EmailContentView;\r\n","import React from \"react\";\r\nimport EmailContentView from \"./emailContentView\";\r\nimport Preview, { PreviewType } from \"modules/common/components/authoring/dialogs/preview\";\r\nimport { IEmail } from \"../models\";\r\n\r\ninterface IEmailPreviewProps {\r\n show: boolean;\r\n onClose: () => void;\r\n email: IEmail;\r\n activeLcid: string;\r\n}\r\n\r\nconst EmailPreview: React.FC = ({\r\n show,\r\n onClose,\r\n email,\r\n activeLcid\r\n}) => {\r\n return , label: \"DESKTOP\" }]}\r\n previewHelpText=\"Preview varies based on device, platform and/or email provider.\"\r\n />;\r\n};\r\n\r\nexport default EmailPreview;\r\n","import React, { useState } from \"react\";\r\nimport { push } from \"react-router-redux\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport { IEmail, IEmailFilters, IEmailListingPage, IEmailListItem } from \"../models\";\r\nimport cookie, { ROWS_PER_PAGE_COOKIE_NAMES } from \"utils/cookie\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { emailsApi } from \"api/instances\";\r\nimport TabContent from \"pages/common/tabContent\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport EmailFilters from \"./emailFilters\";\r\nimport ConfirmDialog from \"modules/common/components/dialogs/confirmDialog\";\r\nimport EmailsTable from \"./emailsTable\";\r\nimport { UseSetSnackbarMessages } from \"modules/common/hooks/useSetSnackbarMessages\";\r\nimport EmailPreview from \"./emailPreview\";\r\n\r\nimport \"../styles/emailsList.sass\";\r\n\r\ninterface IEmailsListProps {\r\n show: boolean;\r\n page: IEmailListingPage;\r\n fetchPage: (filters?: IEmailFilters, pageNumber?: number, pageAmount?: number) => void;\r\n fetchAllPages: () => void;\r\n filters: IEmailFilters;\r\n onUpdateFilters: (newFilters: IEmailFilters) => void;\r\n defaultEmailFilterValues: IEmailFilters;\r\n onDownloadEmailActivity: (emailId: string) => void;\r\n activeLcid: string;\r\n}\r\n\r\nconst EmailsList: React.FC = ({\r\n show,\r\n page,\r\n fetchPage,\r\n fetchAllPages,\r\n filters,\r\n onUpdateFilters,\r\n defaultEmailFilterValues,\r\n tenantId,\r\n redirectTo,\r\n onDownloadEmailActivity,\r\n activeLcid\r\n}) => {\r\n const [isLoadingPreview, setIsLoadingPreview] = useState(false);\r\n const [emailToPreview, setEmailToPreview] = useState();\r\n const [showDeleteEmailDialog, setShowDeleteEmailDialog] = useState(false);\r\n const [showUnsendEmailDialog, setShowUnsendEmailDialog] = useState(false);\r\n const [emailIdToDelete, setEmailIdToDelete] = useState(\"\");\r\n const [emailIdToUnsend, setEmailIdToUnsend] = useState(\"\");\r\n const [isDeleting, setIsDeleting] = useState(false);\r\n const [isUnsending, setIsUnsending] = useState(false);\r\n\r\n const { setErrorMessage, setInfoMessage, setSuccessMessage } = UseSetSnackbarMessages();\r\n\r\n const showIsLoading = page.isFetching || isDeleting || isUnsending;\r\n const hasFiltersApplied = filters.textToSearch !== defaultEmailFilterValues.textToSearch;\r\n\r\n const onChangeFilters = (newFilters: IEmailFilters) => {\r\n const rowsPerPage = cookie.getRowsPerPage(ROWS_PER_PAGE_COOKIE_NAMES.EMAILS, 25);\r\n\r\n onUpdateFilters(newFilters);\r\n onChangePage(0, rowsPerPage, newFilters);\r\n }\r\n\r\n const onChangePage = (page: number, rowsPerPage: number, filters: IEmailFilters) => {\r\n fetchPage(filters, page + 1, rowsPerPage);\r\n }\r\n\r\n const handleDraftEmailClick = (email: IEmailListItem) => redirectTo(\"/\" + tenantId + \"/admin/emails/edit/\" + email.id);\r\n\r\n const onPreviewEmail = async (emailToDisplay: IEmailListItem) => {\r\n setIsLoadingPreview(true);\r\n \r\n try {\r\n const { data } = await emailsApi.getEmail(emailToDisplay.id);\r\n setEmailToPreview(data);\r\n } catch (error) {\r\n setEmailToPreview(undefined);\r\n setErrorMessage(\"There was an error with your request. Please try again later.\");\r\n } finally {\r\n setIsLoadingPreview(false);\r\n }\r\n }\r\n\r\n const onDeleteEmail = (email: IEmailListItem) => {\r\n setEmailIdToDelete(email.id);\r\n setShowDeleteEmailDialog(true);\r\n }\r\n\r\n const deleteEmail = async () => {\r\n setShowDeleteEmailDialog(false);\r\n setIsDeleting(true);\r\n try {\r\n await emailsApi.deleteEmail(emailIdToDelete);\r\n fetchPage();\r\n setInfoMessage(\"Email deleted.\");\r\n }\r\n catch {\r\n setErrorMessage(\"There was an error deleting the email. Please try again later.\");\r\n }\r\n finally {\r\n resetDeleteEmailStates();\r\n }\r\n }\r\n\r\n const resetDeleteEmailStates = () => {\r\n setShowDeleteEmailDialog(false);\r\n setEmailIdToDelete(\"\");\r\n setIsDeleting(false);\r\n }\r\n\r\n const onUnsendEmail = (email: IEmailListItem) => {\r\n setEmailIdToUnsend(email.id);\r\n setShowUnsendEmailDialog(true);\r\n }\r\n\r\n const unsendEmail = async () => {\r\n setShowUnsendEmailDialog(false);\r\n try {\r\n setIsUnsending(true);\r\n await emailsApi.cancelSend(emailIdToUnsend);\r\n fetchAllPages();\r\n setSuccessMessage(\"Your email was cancelled and is now in drafts.\");\r\n }\r\n catch {\r\n setErrorMessage(\"There was an error with cancelling the email. Please try again later\");\r\n }\r\n finally {\r\n resetUnsendEmailStates();\r\n }\r\n }\r\n\r\n const resetUnsendEmailStates = () => {\r\n setShowUnsendEmailDialog(false);\r\n setEmailIdToUnsend(\"\");\r\n setIsUnsending(false);\r\n }\r\n \r\n const onDuplicateEmail = async (email: IEmailListItem) => {\r\n try {\r\n const { data } = await emailsApi.cloneEmail(email.id);\r\n redirectTo(\"/\" + tenantId + \"/admin/emails/edit/\" + data);\r\n }\r\n catch { \r\n setErrorMessage(\"There was an error with duplicating. Please try again later.\");\r\n }\r\n }\r\n\r\n return !show\r\n ? <>\r\n : \r\n \r\n onChangeFilters(defaultEmailFilterValues)}\r\n />\r\n \r\n \r\n You are about to permanently delete this email. This action cannot be undone.\r\n

    \r\n Are you sure you want to proceed?\r\n \r\n \r\n You are about to cancel sending this email. It will be moved back to drafts.\r\n

    \r\n Are you sure you want to proceed?\r\n \r\n {\r\n emailToPreview &&\r\n setEmailToPreview(undefined)}\r\n show={!!emailToPreview}\r\n email={emailToPreview}\r\n activeLcid={activeLcid}\r\n />\r\n }\r\n \r\n
    \r\n
    ;\r\n};\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IEmailsListProps) => ({\r\n ...ownProps,\r\n tenantId: state.tenant.id,\r\n }),\r\n {\r\n redirectTo: push\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(EmailsList);\r\n","import React, { useEffect, useState } from \"react\";\r\nimport Tabs from \"pages/common/tabs\";\r\nimport EmailsList from \"./emailsList\";\r\nimport { DEFAULT_DRAFT_EMAIL_FILTERS, DEFAULT_SCHEDULED_EMAIL_FILTERS, DEFAULT_SENT_EMAIL_FILTERS, EmailStatus, IEmailFilters, IEmailListingPage } from \"../models\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { getDraftEmailList, getScheduledEmailList, getSentEmailList } from \"../reducer\";\r\nimport cookie, { ROWS_PER_PAGE_COOKIE_NAMES } from \"utils/cookie\";\r\nimport CreatedByFilter, { CreatedBySelectValues } from \"modules/common/components/authoring/createdByFilter\";\r\nimport { ContentType } from \"modules/common/models\";\r\n\r\nimport \"../../common/components/authoring/styles/authoringListing.sass\";\r\n\r\ninterface IEmailsListingProps {\r\n onDownloadEmailActivity: (emailId: string) => void;\r\n activeLcid: string;\r\n}\r\n\r\nconst EmailsListing: React.FC = ({\r\n onDownloadEmailActivity,\r\n activeLcid\r\n}) => {\r\n const [selectedTab, setSelectedTab] = useState(EmailStatus.Draft);\r\n const [draftEmailListFilters, setDraftEmailListFilters] = useState(DEFAULT_DRAFT_EMAIL_FILTERS);\r\n const [scheduledEmailListFilters, setScheduledEmailListFilters] = useState(DEFAULT_SCHEDULED_EMAIL_FILTERS);\r\n const [sentEmailListFilters, setSentEmailListFilters] = useState(DEFAULT_SENT_EMAIL_FILTERS);\r\n const currentFilters = selectedTab === EmailStatus.Draft \r\n ? draftEmailListFilters \r\n : selectedTab === EmailStatus.Scheduled \r\n ? scheduledEmailListFilters \r\n : sentEmailListFilters;\r\n\r\n const { draftEmailsList, scheduledEmailsList, sentEmailsList } = useSelector((state: GlobalApplicationState) => state.emails);\r\n const dispatch = useDispatch();\r\n\r\n const getTabLabel = (label: string, page: IEmailListingPage): string => {\r\n if (!!page.currentPage)\r\n return `${label} (${page.totalEmails})`;\r\n return label;\r\n }\r\n\r\n const fetchDraftEmailList = (\r\n filters: IEmailFilters = DEFAULT_DRAFT_EMAIL_FILTERS,\r\n pageNumber: number = 1, \r\n pageAmount: number = cookie.getRowsPerPage(ROWS_PER_PAGE_COOKIE_NAMES.EMAILS, 25)\r\n ) => \r\n dispatch(getDraftEmailList({ pageNumber, pageAmount, filters }));\r\n\r\n const fetchScheduledEmailList = (\r\n filters: IEmailFilters = DEFAULT_SCHEDULED_EMAIL_FILTERS,\r\n pageNumber: number = 1, \r\n pageAmount: number = cookie.getRowsPerPage(ROWS_PER_PAGE_COOKIE_NAMES.EMAILS, 25)\r\n ) => \r\n dispatch(getScheduledEmailList({ pageNumber, pageAmount, filters }));\r\n\r\n const fetchSentEmailList = (\r\n filters: IEmailFilters = DEFAULT_SENT_EMAIL_FILTERS,\r\n pageNumber: number = 1, \r\n pageAmount: number = cookie.getRowsPerPage(ROWS_PER_PAGE_COOKIE_NAMES.EMAILS, 25)\r\n ) => \r\n dispatch(getSentEmailList({ pageNumber, pageAmount, filters }));\r\n\r\n\r\n const fetchAllPages = () => {\r\n fetchDraftEmailList(draftEmailListFilters)\r\n fetchScheduledEmailList(scheduledEmailListFilters);\r\n fetchSentEmailList(sentEmailListFilters);\r\n }\r\n\r\n useEffect(() => {\r\n fetchAllPages();\r\n }, []);\r\n\r\n const onSelectPostCreatedBy = (selection: CreatedBySelectValues) => {\r\n if (selectedTab === EmailStatus.Draft) {\r\n const newFilters = { ...draftEmailListFilters, createdByMeOnly: selection === CreatedBySelectValues.VIEW_MY };\r\n setDraftEmailListFilters(newFilters);\r\n fetchDraftEmailList(newFilters);\r\n }\r\n else if (selectedTab === EmailStatus.Scheduled) {\r\n const newFilters = { ...scheduledEmailListFilters, createdByMeOnly: selection === CreatedBySelectValues.VIEW_MY };\r\n setScheduledEmailListFilters(newFilters);\r\n fetchScheduledEmailList(newFilters);\r\n }\r\n else if (selectedTab === EmailStatus.Sent) {\r\n const newFilters = { ...sentEmailListFilters, createdByMeOnly: selection === CreatedBySelectValues.VIEW_MY };\r\n setSentEmailListFilters(newFilters);\r\n fetchSentEmailList(newFilters);\r\n }\r\n }\r\n\r\n return
    \r\n
    \r\n setSelectedTab(newTab)}\r\n />\r\n \r\n
    \r\n \r\n \r\n \r\n
    ;\r\n};\r\n\r\nexport default EmailsListing;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Dialog, DialogContent, DialogTitle, IconButton } from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport InfoHover from \"modules/common/components/hovers/infoHover\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport EditEmailSender from \"modules/newsletters/management/components/editEmailSender\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { actions, Address, NewsletterConfigDigest, SaveNewsletterConfigModelStateErrors } from \"modules/newsletters\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport useIsMounted from \"modules/common/hooks/useIsMounted\";\r\n\r\nimport \"../styles/senderEmailsDialog.sass\";\r\n\r\ninterface ISenderEmailsDialogProps {\r\n show: boolean;\r\n onClose: () => void;\r\n onErrorMessage: (errorMessage: string) => void;\r\n onCheckAssociatedNewsletters: (address: Address) => void;\r\n}\r\n\r\nconst SenderEmailsDialog: React.FC = ({\r\n show,\r\n onClose,\r\n onErrorMessage,\r\n getConfig,\r\n saveConfig,\r\n onCheckAssociatedNewsletters\r\n}) => {\r\n const [config, setConfig] = useState();\r\n const [modelStateSaveErrors, setModelStateSaveErrors] = useState();\r\n const [savingConfig, setSavingConfig] = useState(false);\r\n const isMounted = useIsMounted();\r\n \r\n const isLoading = !config || savingConfig;\r\n\r\n useEffect(() => {\r\n const getAsyncConfig = async () => {\r\n const configDigest = await getConfig();\r\n setConfig(configDigest);\r\n }\r\n\r\n if (isMounted() && !config)\r\n getAsyncConfig();\r\n\r\n }, [config, isMounted]);\r\n\r\n const onSaveAddresses = async (addresses: Address[]) => {\r\n setSavingConfig(true);\r\n const newConfig = {...config!, addresses};\r\n const resp = await saveConfig(newConfig);\r\n \r\n if (resp.success) setConfig(resp.success);\r\n else if (resp.error?.ModelState) setModelStateSaveErrors(resp.error.ModelState);\r\n\r\n setSavingConfig(false);\r\n }\r\n\r\n return \r\n \r\n
    \r\n Manage Sender Emails\r\n \r\n List of all 'From' names and addresses of your emails and newsletters. You cannot remove emails currently used in emails and newsletter.\r\n \r\n
    \r\n \r\n \r\n \r\n
    \r\n \r\n {\r\n isLoading \r\n ? \r\n : \r\n }\r\n \r\n ;\r\n};\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ISenderEmailsDialogProps) => \r\n ({ ...ownProps }),\r\n {\r\n getConfig: actions.getConfig,\r\n saveConfig: actions.saveConfig\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n \r\nexport default connector(SenderEmailsDialog);\r\n","import { emailsApi } from \"api/instances\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport PublishedContentDialog from \"modules/common/components/authoring/dialogs/publishedContentDialog\";\r\nimport { useRetryableRequest } from \"modules/common/hooks/useRetryableRequest\";\r\nimport { ContentType } from \"modules/common/models\";\r\nimport React from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { IEmail } from \"../models\";\r\n\r\ninterface ISentEmailDialogProps {}\r\n\r\nconst MAX_RETRY_COUNT = 3;\r\n\r\nconst SentEmailDialog: React.FC = ({}) => {\r\n const { emailId, expectedSentTime } = useSelector((state: GlobalApplicationState) => state.emails.sentConfirmation);\r\n const fetchEmail = async () => await emailsApi.getEmail(emailId);\r\n\r\n const { response, isFailed } = useRetryableRequest({\r\n asyncRequest: fetchEmail,\r\n maxRetry: MAX_RETRY_COUNT,\r\n requesting: !!emailId\r\n });\r\n\r\n return ;\r\n};\r\n\r\nexport default SentEmailDialog;\r\n","import React, { useLayoutEffect, useState } from \"react\";\r\nimport BasePage from \"pages/common/basePage\";\r\nimport Header from \"pages/common/header\";\r\nimport MainContent from \"pages/common/mainContent\";\r\nimport MoreOptionsEmail from \"./moreOptionsEmail\";\r\nimport SendOutlinedIcon from '@mui/icons-material/SendOutlined';\r\nimport { Button } from \"@mui/material\";\r\nimport { push } from \"react-router-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { RouteComponentProps } from \"react-router\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\nimport EmailsListing from \"./emailsListing\";\r\nimport { messagingApi, reportsApi } from \"api/instances\";\r\nimport SenderEmailsDialog from \"./senderEmailsDialog\";\r\nimport { actions, Address } from \"modules/newsletters\";\r\nimport AssociatedNewslettersDialog from \"modules/newsletters/management/components/associatedNewslettersDialog\";\r\nimport { IdNamePair } from \"modules/common/models\";\r\nimport { setShouldDisplayNav } from \"modules/adminLayout/actionCreator\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport { ApiRequest } from \"api/network\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\nimport SentEmailDialog from \"./sentEmailDialog\";\r\nimport { UseSetSnackbarMessages } from \"modules/common/hooks/useSetSnackbarMessages\";\r\n\r\ninterface IEmailsManagementPageProps { }\r\n\r\nconst EmailsManagementPage: React.FC = ({\r\n redirectTo,\r\n getAssociatedNewsletters,\r\n setShouldDisplayNav,\r\n shouldDisplayNav,\r\n sentConfirmation,\r\n tenantId\r\n}) => {\r\n const [showSenderEmailDialog, setShowSenderEmailDialog] = useState(false);\r\n const [isLoadingAssocNewsletters, setIsLoadingAssocNewsletters] = useState(false);\r\n const [showAssociatedNewslettersDialog, setShowAssociatedNewslettersDialog] = useState(false);\r\n const [associatedNewsletters, setAssociatedNewsletters] = useState[]>([]);\r\n const [associatedSender, setAssociatedSender] = useState
    (undefined);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const activeLcid = \"en-us\"; // we only support en-us for now\r\n\r\n const { setSuccessMessage, setErrorMessage } = UseSetSnackbarMessages();\r\n\r\n const onDownloadEmailActivity = async (emailId?: string) => {\r\n reportsApi.SendEmailActivityReportRequest(emailId)\r\n .then(() => setSuccessMessage(\"Your report is being generated and will be emailed to you when it’s ready.\"))\r\n .catch(() => setErrorMessage(\"Something went wrong. Please try again.\"));\r\n }\r\n\r\n const onCheckAssociatedNewsletters = async (senderDetails: Address) => {\r\n setIsLoadingAssocNewsletters(true);\r\n setShowSenderEmailDialog(false);\r\n setShowAssociatedNewslettersDialog(true);\r\n const associatedNewsletters = await getAssociatedNewsletters(senderDetails.fromEmailName, senderDetails.fromEmailAddress);\r\n setAssociatedNewsletters(associatedNewsletters);\r\n setAssociatedSender(senderDetails);\r\n setIsLoadingAssocNewsletters(false);\r\n }\r\n\r\n const onCloseAssociatedNewslettersDialog = () => {\r\n setShowAssociatedNewslettersDialog(false);\r\n setShowSenderEmailDialog(true);\r\n }\r\n\r\n useLayoutEffect(() => {\r\n if (!shouldDisplayNav) \r\n setShouldDisplayNav(true);\r\n \r\n }, [shouldDisplayNav, setShouldDisplayNav]);\r\n\r\n const onDownloadReport = async (req: () => ApiRequest, name: string) => {\r\n setIsLoading(true);\r\n \r\n req()\r\n .then(data => {\r\n new FileDownloader({ name: `${name}-${new Date().toISOString()}.csv` }).downloadBlob(data);\r\n setSuccessMessage(\"Successfully downloaded your report! Check your Downloads folder.\");\r\n })\r\n .catch(() => setErrorMessage(\"Something went wrong. Please try again.\"))\r\n .finally(() => setIsLoading(false));\r\n }\r\n \r\n return \r\n \r\n \r\n onDownloadEmailActivity()}\r\n onDownloadUserData={() => onDownloadReport(messagingApi.GetEmailUserCsv, \"notification-email-user-data\")}\r\n onDownloadEmailOutbox={() => onDownloadReport(() => messagingApi.GetOutbox(\"email\"), \"notification-email-outbox-user-data\")}\r\n onClickManageSenderEmails={() => setShowSenderEmailDialog(true)}\r\n />\r\n }\r\n onClick={() => redirectTo(\"/\" + tenantId + \"/admin/emails/edit/new\")}\r\n >\r\n SEND NEW EMAIL\r\n \r\n \r\n }\r\n />\r\n \r\n
    \r\n \r\n
    \r\n setShowSenderEmailDialog(false)}\r\n onErrorMessage={setErrorMessage}\r\n onCheckAssociatedNewsletters={onCheckAssociatedNewsletters}\r\n />\r\n \r\n { sentConfirmation.shouldShowDialog && }\r\n
    \r\n
    ;\r\n};\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: RouteComponentProps) =>\r\n ({\r\n ...ownProps,\r\n shouldDisplayNav: state.adminLayout.shouldDisplayNav,\r\n sentConfirmation: state.emails.sentConfirmation,\r\n tenantId: state.tenant.id,\r\n }),\r\n {\r\n redirectTo: push,\r\n getAssociatedNewsletters: actions.getAssociatedNewsletters,\r\n setShouldDisplayNav: setShouldDisplayNav\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default connector(EmailsManagementPage);\r\n","import React from \"react\";\r\nimport { IconButton, Menu, MenuItem } from \"@mui/material\";\r\nimport { IPersonalizationToken } from \"modules/emails/models\";\r\n\r\nimport \"../../styles/personalizationTokenButton.sass\";\r\n\r\ninterface IPersonalizationTokenButtonProps {\r\n onClick: (token: IPersonalizationToken) => void;\r\n personalizationTokens: IPersonalizationToken[];\r\n menuPaperRef?: React.RefObject;\r\n}\r\n\r\nconst PersonalizationTokenButton: React.FC = ({\r\n onClick,\r\n personalizationTokens,\r\n menuPaperRef\r\n}) => {\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const open = Boolean(anchorEl);\r\n\r\n const handleButtonClick = (event: React.MouseEvent) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClick = (token: IPersonalizationToken) => {\r\n onClick(token);\r\n handleClose();\r\n }\r\n\r\n const handleClose = () => setAnchorEl(null);\r\n\r\n return
    \r\n \r\n \"user\r\n \r\n \r\n {\r\n personalizationTokens.map(token => \r\n handleClick(token)} className=\"personalization-token-menu-item\">\r\n {token.title}\r\n {token.description}\r\n \r\n )\r\n }\r\n \r\n
    ;\r\n};\r\n\r\nexport default PersonalizationTokenButton;\r\n","import { GlobalApplicationState } from \"globalApplicationState\";\r\nimport Bodyv2 from \"modules/common/components/authoring/bodyv2\";\r\nimport FilledInput from \"modules/common/components/forms/inputs/filledInput\";\r\nimport { EMAIL_PERSONALIZATION_TOKENS, IEmail, IPersonalizationToken, MERGE_TAG_PREFIX, MERGE_TAG_SUFFIX } from \"modules/emails/models\";\r\nimport React, { useEffect, useRef, useState } from \"react\";\r\nimport { useSelector } from \"react-redux\";\r\nimport PersonalizationTokenButton from \"./personalizationTokenButton\";\r\nimport { ITranslatedText } from \"modules/common/models\";\r\n\r\nconst MAX_SUBJECT_LENGTH = 900;\r\n\r\ninterface IEmailEditorProps {\r\n updateEmail: (updatedEmailFields: Partial) => void;\r\n activeLcid: string;\r\n onChangeFullscreen?: (isFullscreen?: boolean) => void;\r\n}\r\n\r\nconst EmailEditor: React.FC = ({\r\n updateEmail,\r\n activeLcid,\r\n onChangeFullscreen\r\n }) => {\r\n const { email, changedSinceLastSaved } = useSelector((state: GlobalApplicationState) => state.emails.editor);\r\n const bodyValue = email.body.find(b => b.lcid === activeLcid)?.text;\r\n const [innerSubjectValue, setInnerSubjectValue] = useState(email.subject);\r\n const [oldSubjectText, setOldSubjectText] = useState(\"\");\r\n const [showIcons, setShowIcons] = useState(false);\r\n const textFieldRef = useRef(null);\r\n const iconsDivRef = useRef(null);\r\n const tokenMenuPaperRef = useRef(null);\r\n\r\n // subject is considered blurred if the subject field is not focussed AND the icons related to the subject field are not focussed\r\n const subjectIsBlurred = (focussedElement: Node | Element | null) => \r\n textFieldRef.current && !textFieldRef.current.contains(focussedElement) && // if the focussed element is not inside the subject field\r\n (iconsDivRef.current ? !iconsDivRef.current.contains(focussedElement) : true) && // if the icons div is active and the focussed element is not inside it\r\n (tokenMenuPaperRef.current ? !tokenMenuPaperRef.current.contains(focussedElement) : true) // if the token menu is active and the focussed element is not inside it\r\n\r\n // add the mouse event listener to hide the icons when the user clicks outside of the subject field or icons div\r\n useEffect(() => {\r\n const handleClickOutside = (event: MouseEvent) => {\r\n if (subjectIsBlurred(event.target as Node)) \r\n setShowIcons(false);\r\n };\r\n \r\n document.addEventListener('mousedown', handleClickOutside);\r\n return () => document.removeEventListener('mousedown', handleClickOutside);\r\n }, []);\r\n\r\n // keep the focus on the subject line after changes (like click-adding personalization tokens)\r\n useEffect(() => {\r\n if (document.activeElement !== textFieldRef.current)\r\n textFieldRef.current?.focus();\r\n }, [innerSubjectValue]);\r\n\r\n const updateTranslatedTextField = (\r\n lcid: string, \r\n newText: string, \r\n translatedText: ITranslatedText[]\r\n ): ITranslatedText[] => [...translatedText.filter(t => t.lcid !== lcid), { lcid, text: newText }];\r\n \r\n const handleKeyDown = (event: React.KeyboardEvent) => {\r\n if (event.key === \"Backspace\" || event.key === \"Delete\") {\r\n // if cursor is inside a merge tag while deleting, prevent default deletion and delete the full tag\r\n const startEndDelimiters = getMergeTagStartAndEndDelimiter();\r\n if (startEndDelimiters) {\r\n event.preventDefault();\r\n const currentInnerSubjectValue = innerSubjectValue.find(s => s.lcid === activeLcid);\r\n\r\n if (currentInnerSubjectValue) {\r\n const newSubjectText = currentInnerSubjectValue.text.slice(0, startEndDelimiters.startDelimiter) + \r\n currentInnerSubjectValue.text.slice(startEndDelimiters.endDelimiter + 1);\r\n setInnerSubjectValueText(newSubjectText);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const handleClick = () => {\r\n // if the user tries to put their cursor into our merge tags, move it outside.\r\n const startEndDelimiters = getMergeTagStartAndEndDelimiter();\r\n if (startEndDelimiters && textFieldRef.current) {\r\n textFieldRef.current.setSelectionRange(startEndDelimiters.endDelimiter + 1, startEndDelimiters.endDelimiter + 1);\r\n }\r\n }\r\n\r\n /**\r\n * A method for finding the start and end delimiters of a merge tag / personalization token block\r\n * Returns undefined if there is none found\r\n */\r\n const getMergeTagStartAndEndDelimiter = (): { startDelimiter: number; endDelimiter: number } | undefined => {\r\n if (textFieldRef.current) {\r\n const cursorStartPos = textFieldRef.current.selectionStart ?? 0;\r\n const cursorEndPos = textFieldRef.current.selectionEnd ?? 0;\r\n const text = textFieldRef.current.value;\r\n\r\n // find the boundaries of the merge tags\r\n const startDelimiter = text.lastIndexOf(MERGE_TAG_PREFIX, cursorStartPos - 1);\r\n const endDelimiter = text.indexOf(MERGE_TAG_SUFFIX, cursorEndPos - MERGE_TAG_PREFIX.length);\r\n\r\n // see if the cursor is between merge tags\r\n return startDelimiter !== -1 && \r\n endDelimiter !== -1 && \r\n startDelimiter < cursorStartPos && \r\n cursorEndPos <= endDelimiter + MERGE_TAG_PREFIX.length &&\r\n // check that the value within the block is one of our tokens\r\n EMAIL_PERSONALIZATION_TOKENS.find(token => token.value === text.substring(startDelimiter + MERGE_TAG_PREFIX.length, endDelimiter))\r\n ? { startDelimiter, endDelimiter: endDelimiter - 1 + MERGE_TAG_PREFIX.length }\r\n : undefined;\r\n }\r\n }\r\n\r\n const onBlurSubject = (event: React.FocusEvent) => {\r\n // add a slight delay to see if we're focussed on the icons div or the token menu so it doesn't immediately hide\r\n setTimeout(() => {\r\n if (subjectIsBlurred(document.activeElement))\r\n setShowIcons(false);\r\n }, \r\n 10\r\n );\r\n\r\n let newSubject = event.target.value as string;\r\n\r\n if (newSubject !== oldSubjectText && newSubject.length <= MAX_SUBJECT_LENGTH) {\r\n setOldSubjectText(newSubject);\r\n onChangeSubjectText(newSubject);\r\n }\r\n }\r\n\r\n const onFocusSubject = (event: React.FocusEvent) => {\r\n setShowIcons(true);\r\n setOldSubjectText(event.target.value as string);\r\n };\r\n\r\n const onChangeSubjectText = (newSubjectText: string) => {\r\n const newTranslatedText = updateTranslatedTextField(activeLcid, newSubjectText, innerSubjectValue);\r\n onChangeSubject(newTranslatedText);\r\n }\r\n\r\n const onChangeSubject = (newText: ITranslatedText[]) => {\r\n updateEmail({ subject: newText });\r\n }\r\n\r\n const onChangeBodyText = (newBodyText: string) => {\r\n const newTranslatedText = updateTranslatedTextField(activeLcid, newBodyText, email.body);\r\n onChangeBody(newTranslatedText);\r\n }\r\n\r\n const onChangeBody = (newBody: ITranslatedText[]) => updateEmail({ body: newBody });\r\n\r\n const setInnerSubjectValueText = (newSubjectText: string) => {\r\n if (newSubjectText.length > MAX_SUBJECT_LENGTH)\r\n return;\r\n \r\n const newTranslatedText = updateTranslatedTextField(activeLcid, newSubjectText, innerSubjectValue);\r\n setInnerSubjectValue(newTranslatedText);\r\n onChangeSubject(newTranslatedText);\r\n }\r\n\r\n const onChangeInnerSubjectValue = (e: React.ChangeEvent) => {\r\n let newSubject = e.target.value as string;\r\n setInnerSubjectValueText(newSubject);\r\n }\r\n\r\n const onTokenClick = (token: IPersonalizationToken) => {\r\n const input = textFieldRef.current;\r\n if (input) {\r\n const textToInsert = `${MERGE_TAG_PREFIX}${token.value}${MERGE_TAG_SUFFIX}`;\r\n\r\n if (textToInsert.length + input.value.length > MAX_SUBJECT_LENGTH) \r\n return;\r\n\r\n const start = input.selectionStart || 0;\r\n const end = input.selectionEnd || 0;\r\n\r\n // insert the text at the current cursor position\r\n input.setRangeText(textToInsert, start, end, \"end\");\r\n\r\n // put the cursor at the end of the inserted text\r\n input.selectionStart = input.selectionEnd = start + textToInsert.length;\r\n\r\n // trigger onchange\r\n const event = new Event(\"change\", { bubbles: true });\r\n input.dispatchEvent(event);\r\n }\r\n }\r\n \r\n return <>\r\n {\r\n const subjectVal = newValue || \"\";\r\n setInnerSubjectValueText(subjectVal);\r\n }}\r\n required\r\n value={innerSubjectValue.find(s => s.lcid === activeLcid)?.text ?? \"\"}\r\n inputProps={{\r\n placeholder: \"Enter subject\",\r\n onBlur: onBlurSubject,\r\n onChange: onChangeInnerSubjectValue,\r\n onFocus: onFocusSubject,\r\n onKeyDown: handleKeyDown,\r\n onClick: handleClick\r\n }}\r\n showIcons={showIcons}\r\n extraIconButton={\r\n \r\n }\r\n inputLabelIconContainerStyle={{ alignItems: \"center\" }}\r\n controlled\r\n inputRef={textFieldRef}\r\n iconsDivRef={iconsDivRef}\r\n keepFocusAfterUndo\r\n />\r\n {\r\n if (newBody !== bodyValue)\r\n onChangeBodyText(newBody)\r\n }}\r\n required={false}\r\n personalizationTokens={EMAIL_PERSONALIZATION_TOKENS}\r\n maxWidth={800}\r\n changedSinceSaved={changedSinceLastSaved}\r\n onFocus={() => {\r\n setShowIcons(false);\r\n }}\r\n onFullscreen={onChangeFullscreen}\r\n livePreview\r\n enableEmbeddedMedia={false}\r\n enablePageEmbed={false}\r\n />\r\n ;\r\n};\r\n\r\nexport default EmailEditor;\r\n","import React from \"react\";\r\nimport SaveAltIcon from '@mui/icons-material/SaveAlt';\r\nimport { Button } from \"@mui/material\";\r\nimport LoadingCircle from \"modules/common/components/loadingCircle\";\r\n\r\nimport \"../../styles/downloadRecipientsButton.sass\";\r\n\r\ninterface IDownloadRecipientsButtonProps {\r\n audienceCount: number;\r\n isDownloadingRecipients: boolean;\r\n onClick: () => void;\r\n loadingCirleOnRight?: boolean;\r\n}\r\n\r\nconst DownloadRecipientsButton: React.FC = ({\r\n audienceCount,\r\n isDownloadingRecipients,\r\n onClick,\r\n loadingCirleOnRight = false\r\n}) => {\r\n return
    \r\n { !loadingCirleOnRight && isDownloadingRecipients && }\r\n } \r\n onClick={onClick}\r\n variant=\"text\"\r\n color=\"primary\"\r\n sx={{ paddingRight: 0 }}\r\n disabled={audienceCount === 0 || isDownloadingRecipients}\r\n >\r\n Download recipients\r\n \r\n { loadingCirleOnRight && isDownloadingRecipients && }\r\n
    ;\r\n};\r\n\r\nexport default DownloadRecipientsButton;\r\n","import { emailsApi } from \"api/instances\";\r\nimport { useState } from \"react\";\r\nimport { FileDownloader } from \"utils/fileDownloader\";\r\nimport useIsMounted from \"./useIsMounted\";\r\n\r\ntype IUseDownloadRecipientsReturn = {\r\n isDownloadingRecipients: boolean;\r\n downloadRecipients: () => Promise;\r\n};\r\n\r\ninterface IUseDownloadRecipientsProps {\r\n onSuccessMessage: (message: string) => void;\r\n onErrorMessage: (message: string) => void;\r\n emailId: string;\r\n};\r\n\r\nexport const useDownloadRecipients = ({\r\n onSuccessMessage,\r\n onErrorMessage,\r\n emailId\r\n}: IUseDownloadRecipientsProps): IUseDownloadRecipientsReturn => {\r\n const [isDownloadingRecipients, setIsDownloadingRecipients] = useState(false);\r\n const isMounted = useIsMounted();\r\n\r\n const downloadRecipients = async () => {\r\n setIsDownloadingRecipients(true);\r\n try {\r\n const { data } = await emailsApi.getRecipientsReport(emailId);\r\n new FileDownloader({ name: `recipients_list.csv` }).downloadBlob(data);\r\n onSuccessMessage(\"Recipients list downloaded. Check your Downloads folder.\");\r\n }\r\n catch {\r\n onErrorMessage(\"There was an error. Please try again.\");\r\n }\r\n finally {\r\n if (isMounted()) setIsDownloadingRecipients(false);\r\n }\r\n }\r\n\r\n return { isDownloadingRecipients, downloadRecipients };\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport useIsMounted from \"./useIsMounted\";\r\nimport { audiencesApi } from \"api/instances\";\r\nimport { IdNamePair } from \"../models\";\r\n\r\ntype UseAudienceCountReturn = {\r\n audienceCount: number;\r\n isFetchingAudienceCount: boolean;\r\n};\r\n\r\ninterface IUseAudienceCountProps {\r\n // set this for a default, constant number of audience counts (for ex. if previously calculated from somewhere else so we don't\r\n // continuously call the count audiences endpoint unnecessarily)\r\n constantAudienceCount?: number;\r\n audiences: IdNamePair[];\r\n sendToAllUsers?: boolean;\r\n};\r\n\r\nexport const useAudienceCount = ({ \r\n constantAudienceCount,\r\n audiences,\r\n sendToAllUsers = false\r\n}: IUseAudienceCountProps): UseAudienceCountReturn => {\r\n const [audienceCount, setAudienceCount] = useState(constantAudienceCount ?? 0);\r\n const [isFetchingAudienceCount, setIsFetchingAudienceCount] = useState(false);\r\n\r\n const isMounted = useIsMounted();\r\n\r\n useEffect(() => {\r\n const getAndSetAudienceCount = async () => {\r\n setIsFetchingAudienceCount(true);\r\n try {\r\n const { data } = await audiencesApi.getUniqueUsers(audiences.map(a => a.id), sendToAllUsers);\r\n if (isMounted()) setAudienceCount(data);\r\n }\r\n catch {\r\n if (isMounted()) setAudienceCount(0);\r\n }\r\n finally {\r\n if (isMounted()) setIsFetchingAudienceCount(false);\r\n }\r\n }\r\n\r\n if (isMounted() && constantAudienceCount === undefined) {\r\n if (audiences.length > 0 || sendToAllUsers) {\r\n getAndSetAudienceCount();\r\n }\r\n else if (audiences.length === 0 && audienceCount !== 0) {\r\n setAudienceCount(0);\r\n }\r\n }\r\n else if (isMounted() && constantAudienceCount !== undefined) {\r\n setAudienceCount(constantAudienceCount);\r\n }\r\n\r\n }, [audiences, sendToAllUsers, isMounted, constantAudienceCount]);\r\n\r\n return {\r\n audienceCount,\r\n isFetchingAudienceCount\r\n };\r\n}","import React from \"react\";\r\nimport DownloadRecipientsButton from \"./downloadRecipientsButton\";\r\nimport LoadingCircle from \"modules/common/components/loadingCircle\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { emailsSlice } from \"modules/emails/reducer\";\r\nimport { useDownloadRecipients } from \"modules/common/hooks/useDownloadRecipients\";\r\nimport { useAudienceCount } from \"modules/common/hooks/useAudienceCount\";\r\n\r\ninterface IRecipientCountDownloadProps {\r\n onSaveEmail: () => void;\r\n onSuccessMessage: (message: string) => void;\r\n onErrorMessage: (message: string) => void;\r\n defaultAudienceCount?: number;\r\n isFetchingDefaultAudienceCount?: boolean;\r\n}\r\n\r\nconst RecipientCountDownload: React.FC = ({\r\n onSaveEmail,\r\n onSuccessMessage,\r\n onErrorMessage,\r\n defaultAudienceCount,\r\n isFetchingDefaultAudienceCount\r\n}) => {\r\n const { email, changedSinceLastSaved } = useSelector((state: GlobalApplicationState) => state.emails.editor);\r\n const { isDownloadingRecipients, downloadRecipients } = useDownloadRecipients({onSuccessMessage, onErrorMessage, emailId: email.id});\r\n const dispatch = useDispatch();\r\n const setShouldDownloadRecipientsList = (shouldDownload: boolean) => \r\n dispatch({ type: emailsSlice.actions.SET_SHOULD_DOWNLOAD_RECIPIENTS_LIST, payload: { shouldDownload }});\r\n\r\n const onClickDownloadRecipientsReport = async () => {\r\n // if a user clicks on downloading the recipients report and the editor isn't\r\n // saved (either it's a new email with email.id == \"\" or there have been changes)\r\n // then we save the email first and then perform the action.\r\n // in the case of no email id, we will save, redirect, and then on the first render we \r\n // will start the download\r\n if (!email.id || changedSinceLastSaved) {\r\n onSaveEmail();\r\n setShouldDownloadRecipientsList(true);\r\n }\r\n else\r\n await downloadRecipients();\r\n }\r\n\r\n const { audienceCount, isFetchingAudienceCount } = useAudienceCount({ \r\n constantAudienceCount: defaultAudienceCount, \r\n audiences: email.audiences, \r\n sendToAllUsers: email.sendToAllUsers \r\n });\r\n\r\n const innerAudienceCount = defaultAudienceCount ?? audienceCount;\r\n const innerIsFetching = isFetchingDefaultAudienceCount ?? isFetchingAudienceCount;\r\n\r\n return
    \r\n {innerIsFetching ? : innerAudienceCount} employee{innerAudienceCount === 1 ? \"\" : \"s\"}\r\n \r\n
    ;\r\n};\r\n\r\nexport default RecipientCountDownload;\r\n","import React from \"react\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport LoadingCircle from \"modules/common/components/loadingCircle\";\r\nimport { Button } from \"@mui/material\";\r\nimport ChipListInput from \"modules/common/components/chipListInput\";\r\nimport isValidEmail from \"utils/isValidEmail\";\r\n\r\nexport const MAX_EMAILS_FOR_TEST = 10;\r\n\r\ninterface ISendTestEmailInputProps {\r\n testEmails: string[];\r\n isSendingTestEmail: boolean;\r\n onClickSendTestEmails: () => void;\r\n setEmailAddressesForTest: (emails: string[]) => void;\r\n \r\n}\r\n\r\nconst SendTestEmailInput: React.FC = ({\r\n testEmails,\r\n isSendingTestEmail,\r\n onClickSendTestEmails,\r\n setEmailAddressesForTest\r\n}) => {\r\n return
    \r\n
    \r\n \r\n Send test emails to preview how your message will appear to recipients.\r\n \r\n
    \r\n { isSendingTestEmail && }\r\n \r\n
    \r\n
    \r\n setEmailAddressesForTest(testEmails.filter(addr => addr !== email))}\r\n onAddValidatedChips={validEmails => setEmailAddressesForTest([...testEmails, ...validEmails].slice(0, MAX_EMAILS_FOR_TEST))}\r\n errorProps={{\r\n isValueValid: isValidEmail,\r\n errorHelperText: \"Enter valid email\"\r\n }}\r\n helperText={Separate email addresses with commas}\r\n textFieldProps={{\r\n className: \"test-email-address-text-field\",\r\n size: \"small\",\r\n placeholder: `Enter up to ${MAX_EMAILS_FOR_TEST} email addresses`,\r\n FormHelperTextProps: { sx: { marginLeft: 0 }},\r\n disabled: testEmails.length >= MAX_EMAILS_FOR_TEST\r\n }}\r\n chipClassName=\"test-email-chip\"\r\n containerSx={{ overflow: \"auto\" }}\r\n />\r\n
    ;\r\n};\r\n\r\nexport default SendTestEmailInput;\r\n","import { TextField } from \"@mui/material\";\r\nimport React, { useState } from \"react\";\r\nimport isValidEmail from \"utils/isValidEmail\";\r\n\r\ninterface IEmailValidationTextFieldProps {\r\n className?: string;\r\n defaultValue?: string;\r\n onChangeEmail: (emailValue?: string) => void;\r\n}\r\n\r\nconst EmailValidationTextField: React.FC = ({\r\n className,\r\n defaultValue,\r\n onChangeEmail\r\n}) => {\r\n const [replyEmailInnerValue, setReplyEmailInnerValue] = useState(defaultValue);\r\n const [isReplyEmailFieldFocussed, setIsReplyEmailFieldFocussed] = useState(false);\r\n\r\n const isReplyEmailFieldInvalid = !!replyEmailInnerValue && !isValidEmail(replyEmailInnerValue);\r\n\r\n return setReplyEmailInnerValue(e.target.value)}\r\n error={!isReplyEmailFieldFocussed && isReplyEmailFieldInvalid}\r\n helperText={!isReplyEmailFieldFocussed && isReplyEmailFieldInvalid ? \"Enter valid email\" : undefined}\r\n FormHelperTextProps={{sx: { marginLeft: 0 }}}\r\n onBlur={_ => {\r\n onChangeEmail(isReplyEmailFieldInvalid ? \"\" : replyEmailInnerValue);\r\n setIsReplyEmailFieldFocussed(false);\r\n }}\r\n onFocus={_ => setIsReplyEmailFieldFocussed(true)}\r\n placeholder=\"Enter email address\"\r\n />;\r\n};\r\n\r\nexport default EmailValidationTextField;\r\n","import { FormControl, MenuItem, Select } from \"@mui/material\";\r\nimport { Address } from \"modules/newsletters\";\r\nimport React from \"react\";\r\nimport { ISimpleUser } from \"../models\";\r\n\r\ninterface IAddressSelectProps {\r\n formControlClassName?: string;\r\n addresses: Address[];\r\n selectedFromSender: ISimpleUser;\r\n onChangeAddress: (address: Address) => void;\r\n}\r\n\r\nconst AddressSelect: React.FC = ({\r\n formControlClassName,\r\n addresses,\r\n selectedFromSender,\r\n onChangeAddress\r\n}) => {\r\n const selectedEmailIdx = selectedFromSender\r\n ? addresses.findIndex(a => a.fromEmailAddress === selectedFromSender.email && a.fromEmailName === selectedFromSender.name) :\r\n 0;\r\n\r\n const truncateText = (text: string, maxLength: number): string => \r\n text.length > maxLength \r\n ? `${text.substring(0, maxLength - 3)}...`\r\n : text;\r\n\r\n return \r\n {\r\n const newAddrIdx = e.target.value as number;\r\n if (newAddrIdx !== selectedEmailIdx && -1 < newAddrIdx && newAddrIdx < addresses.length) {\r\n const newSelectedAddress = addresses[newAddrIdx];\r\n onChangeAddress(newSelectedAddress);\r\n }\r\n }}\r\n >\r\n {\r\n addresses && \r\n addresses.map((address, idx) =>\r\n \r\n
    \r\n {truncateText(address.fromEmailName, 30)}\r\n {truncateText(address.fromEmailAddress, 50)}\r\n
    \r\n
    \r\n )\r\n }\r\n \r\n
    ;\r\n};\r\n\r\nexport default AddressSelect;\r\n","import React, { useEffect, useState } from \"react\";\r\nimport moment from \"moment\";\r\nimport { useDispatch, useSelector } from \"react-redux\";\r\nimport { Button, Checkbox, Divider, FormControlLabel } from \"@mui/material\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport DateAndTime from \"modules/common/components/forms/inputs/dateAndTime\";\r\nimport { Address } from \"modules/newsletters\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { IEmail } from \"modules/emails/models\";\r\nimport { emailsApi } from \"api/instances\";\r\nimport { emailsSlice } from \"modules/emails/reducer\";\r\nimport RecipientCountDownload from \"./recipientCountDownload\";\r\nimport { useDownloadRecipients } from \"modules/common/hooks/useDownloadRecipients\";\r\nimport DrawerWithBookmarkButton from \"modules/common/components/drawers/drawerWithBookmarkButton\";\r\nimport SendTestEmailInput from \"./sendTestEmailInput\";\r\nimport EmailValidationTextField from \"modules/common/components/emailValidationTextField\";\r\nimport AddressSelect from \"modules/common/components/addressSelect\";\r\nimport MultiselectAndChipsWithSearch from \"modules/common/components/forms/inputs/multiSelectAndChipsWithSearch\";\r\nimport { IdNamePair } from \"modules/common/models\";\r\n\r\nimport \"../../styles/emailSettingsPanel.sass\";\r\n\r\ninterface IEmailSettingsPanelProps {\r\n open: boolean;\r\n toggleOpen: () => void;\r\n fromEmailAddresses: Address[];\r\n updateEmail: (updatedEmailFields: Partial) => void;\r\n onSuccessMessage: (message: string) => void;\r\n onErrorMessage: (message: string) => void;\r\n onSaveEmail: () => void;\r\n defaultAudienceCount: number;\r\n isFetchingDefaultAudienceCount: boolean;\r\n}\r\n\r\nconst EmailSettingsPanel: React.FC = ({\r\n open,\r\n toggleOpen,\r\n fromEmailAddresses,\r\n updateEmail,\r\n onSuccessMessage,\r\n onErrorMessage,\r\n onSaveEmail,\r\n defaultAudienceCount,\r\n isFetchingDefaultAudienceCount\r\n}) => {\r\n const { \r\n email, \r\n shouldDownloadRecipientsList, \r\n testEmails, \r\n shouldSendTestEmails, \r\n changedSinceLastSaved,\r\n originalEmail\r\n } = useSelector((state: GlobalApplicationState) => state.emails.editor);\r\n const audiences = useSelector((state: GlobalApplicationState) => state.audiences.audiences);\r\n const { downloadRecipients } = useDownloadRecipients({onSuccessMessage, onErrorMessage, emailId: email.id});\r\n const [isSendingTestEmail, setIsSendingTestEmail] = useState(false);\r\n const dispatch = useDispatch();\r\n\r\n const setEmailAddressesForTest = (testEmails: string[]) => \r\n dispatch({ type: emailsSlice.actions.SET_TEST_EMAILS, payload: { testEmails } });\r\n\r\n const setShouldDownloadRecipientsList = (shouldDownload: boolean) => \r\n dispatch({ type: emailsSlice.actions.SET_SHOULD_DOWNLOAD_RECIPIENTS_LIST, payload: { shouldDownload } });\r\n\r\n const setShouldSendTestEmails = (shouldSend: boolean) => \r\n dispatch({ type: emailsSlice.actions.SET_SHOULD_SEND_TEST_EMAILS, payload: { shouldSend } });\r\n\r\n useEffect(() => {\r\n if (email.id && !changedSinceLastSaved) {\r\n if (shouldDownloadRecipientsList) {\r\n setShouldDownloadRecipientsList(false);\r\n downloadRecipients();\r\n }\r\n else if (shouldSendTestEmails) {\r\n setShouldSendTestEmails(false);\r\n sendTestEmail();\r\n }\r\n }\r\n }, [email.id, shouldDownloadRecipientsList, shouldSendTestEmails, changedSinceLastSaved]);\r\n\r\n const sendTestEmail = async () => {\r\n setIsSendingTestEmail(true);\r\n\r\n try {\r\n await emailsApi.testEmail(email.id, testEmails);\r\n onSuccessMessage(\"Successfully sent your test email.\");\r\n }\r\n catch {\r\n onErrorMessage(\"There was an error. Please try again.\");\r\n }\r\n finally {\r\n setIsSendingTestEmail(false);\r\n }\r\n }\r\n\r\n const onClickSendTestEmails = async () => {\r\n // same thing here as for downloading the reports for emails that \r\n // don't have an id (are new) or have changes not yet saved.\r\n if (!email.id || changedSinceLastSaved) {\r\n onSaveEmail();\r\n setShouldSendTestEmails(true);\r\n }\r\n else\r\n await sendTestEmail();\r\n }\r\n\r\n const onChangeAudience = (audiences: IdNamePair[], isClear?: boolean, sendToAllUsers?: boolean) => {\r\n if (isClear) {\r\n // if its an update via 'Clear All', then clear the 'sendToAllUsers' as well\r\n const newAudiences = [];\r\n const newSendToAllUsers = false;\r\n updateEmail({ audiences: newAudiences, sendToAllUsers: newSendToAllUsers });\r\n }\r\n else if (sendToAllUsers !== undefined) {\r\n const newAudiences = [];\r\n const newSendToAllUsers = sendToAllUsers;\r\n updateEmail({ audiences: newAudiences, sendToAllUsers: newSendToAllUsers });\r\n }\r\n else if (!email.sendToAllUsers) {\r\n // only update audiences if we don't have 'sendToAllUsers' as true\r\n updateEmail({ audiences });\r\n }\r\n }\r\n\r\n const audienceFooter =
    \r\n {\r\n email.sendToAllUsers !== undefined &&\r\n onChangeAudience([], false, checked)}\r\n id=\"send-to-all-employees-checkbox\"\r\n />\r\n }\r\n label=\"Send to all employees\"\r\n />\r\n }\r\n onChangeAudience([], true, email.sendToAllUsers)}\r\n >\r\n Clear all\r\n \r\n
    \r\n\r\n return \r\n
    \r\n
    \r\n From\r\n {\r\n const fromSender = {\r\n email: address.fromEmailAddress,\r\n name: address.fromEmailName\r\n };\r\n\r\n updateEmail({ fromSender });\r\n }\r\n }\r\n />\r\n
    \r\n
    \r\n \r\n Replies will be sent to this email address. If left blank, replies will be sent to the address provided in the 'From' field. \r\n \r\n replyAddress !== email.replyAddress && updateEmail({ replyAddress })}\r\n className=\"reply-email-text-field\"\r\n />\r\n
    \r\n
    \r\n To\r\n
    \r\n \r\n ({ id: a.id, name: a.displayName }))}\r\n selectedOptions={email.audiences ?? []}\r\n onChange={(audiences) => onChangeAudience(audiences, false)}\r\n showEmptyChip\r\n buttonText=\"Add/Edit Audiences\"\r\n footerComponent={audienceFooter}\r\n calloutContainerStyle={{ width: \"fit-content\", minWidth: \"316px\" }}\r\n searchPlaceholder=\"Search for audiences\"\r\n emptyChipText={email.sendToAllUsers ? \"All users\" : \"No recipients selected\"}\r\n nestingAllowed={false}\r\n buttonCssStyle={{ paddingLeft: 0 }}\r\n disableOptions={email.sendToAllUsers}\r\n calloutFooterStyle={{ justifyContent: \"center\" }}\r\n buttonId=\"add-edit-audiences-button\"\r\n />\r\n
    \r\n
    \r\n \r\n
    \r\n \r\n Schedule when this email should be sent. If left blank, it will be sent immediately after you click 'Send' in One Last Check.\r\n \r\n updateEmail({ sentTime: dateString })}\r\n date={\r\n email.sentTime\r\n ? moment(email.sentTime).isBefore(moment()) \r\n ? moment().toISOString() \r\n : email.sentTime \r\n : undefined\r\n }\r\n dateStyle={{ width: 250 }}\r\n showIcons\r\n minDate={moment()}\r\n timePlaceholder=\"Select time\"\r\n initializeDateWithCurrentTime\r\n />\r\n
    \r\n \r\n \r\n
    \r\n ;\r\n};\r\n\r\nexport default EmailSettingsPanel;\r\n","import React from \"react\";\r\nimport { AuthoringAppBarAction, AuthoringAppBarActions, IAuthoringAppBarAction } from \"modules/common/components/authoring/authoringAppBarActions\";\r\nimport { useContentGuidelines } from \"modules/common/hooks/data/useContentGuidelines\";\r\n\r\ninterface IEmailAuthoringEditorActionsProps {\r\n onSend: () => void;\r\n isSendDisabled: boolean;\r\n onSave: () => void;\r\n isSaveDisabled: boolean;\r\n onPreview: () => void;\r\n onToggleSettingsPanel: () => void;\r\n isToggleSettingsPanelDisabled: boolean;\r\n onDiscard: () => void;\r\n isDiscardDisabled: boolean;\r\n onBack: () => void;\r\n openGuidelines: () => void;\r\n}\r\n\r\nconst EmailAuthoringEditorActions: React.FC = ({\r\n onSend,\r\n isSendDisabled,\r\n onSave,\r\n isSaveDisabled,\r\n onPreview,\r\n onToggleSettingsPanel,\r\n isToggleSettingsPanelDisabled,\r\n onDiscard,\r\n isDiscardDisabled,\r\n onBack,\r\n openGuidelines\r\n}) => {\r\n const { isEmpty: isGuidelineEmpty } = useContentGuidelines();\r\n\r\n const getActions = (): Record => ({\r\n [AuthoringAppBarAction.Publish]: {\r\n onClick: onSend,\r\n disabled: isSendDisabled,\r\n label: \"SEND\"\r\n },\r\n [AuthoringAppBarAction.Save]: {\r\n disabled: isSaveDisabled,\r\n onClick: onSave,\r\n },\r\n [AuthoringAppBarAction.Preview]: {\r\n disabled: false,\r\n onClick: onPreview,\r\n },\r\n [AuthoringAppBarAction.ToggleSettingsPanel]: {\r\n disabled: isToggleSettingsPanelDisabled,\r\n onClick: onToggleSettingsPanel\r\n },\r\n [AuthoringAppBarAction.Discard]: {\r\n disabled: isDiscardDisabled,\r\n onClick: onDiscard,\r\n },\r\n [AuthoringAppBarAction.Back]: {\r\n disabled: false,\r\n onClick: onBack,\r\n },\r\n [AuthoringAppBarAction.OpenGuidelines]: {\r\n disabled: isGuidelineEmpty,\r\n onClick: openGuidelines\r\n },\r\n [AuthoringAppBarAction.Reject]: undefined,\r\n });\r\n\r\n return ;\r\n};\r\n\r\nexport default EmailAuthoringEditorActions;\r\n","import { Button, Dialog, DialogContent, DialogTitle, Grid } from \"@mui/material\";\r\nimport LoadingSpinner from \"modules/common/components/loadingSpinner\";\r\nimport React from \"react\";\r\nimport EmailContentView from \"./emailContentView\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport moment from \"moment\";\r\nimport RecipientCountDownload from \"./editor/recipientCountDownload\";\r\nimport ChipList from \"modules/common/components/chipList\";\r\n\r\nimport \"../styles/emailOneLastCheck.sass\";\r\n\r\ninterface IEmailOneLastCheckProps {\r\n show: boolean;\r\n onClose: () => void;\r\n sending: boolean;\r\n sendEmail: () => void;\r\n onSaveEmail: () => void;\r\n onSuccessMessage: (message: string) => void;\r\n onErrorMessage: (message: string) => void;\r\n activeLcid: string;\r\n defaultAudienceCount: number;\r\n isFetchingDefaultAudienceCount: boolean;\r\n}\r\n\r\nconst EmailOneLastCheck: React.FC = ({\r\n show,\r\n onClose,\r\n sending,\r\n sendEmail,\r\n onSaveEmail,\r\n onSuccessMessage,\r\n onErrorMessage,\r\n activeLcid,\r\n defaultAudienceCount,\r\n isFetchingDefaultAudienceCount\r\n}) => {\r\n const email = useSelector((state: GlobalApplicationState) => state.emails.editor.email);\r\n const labelGridSize = 2;\r\n const dataGridSize = 10;\r\n\r\n if (!email) return <>;\r\n\r\n return !sending && onClose()}\r\n >\r\n \r\n One last check!\r\n
    \r\n \r\n {\r\n sending \r\n ?
    \r\n : \r\n }\r\n
    \r\n
    \r\n \r\n \r\n \r\n Send on\r\n \r\n \r\n {email.sentTime && new Date(email.sentTime) >= new Date() ? moment(email.sentTime).format(\"dddd, MMMM D, YYYY, h:mm A\") : \"Now\"}\r\n \r\n \r\n Send to\r\n \r\n \r\n
    \r\n \r\n \r\n
    \r\n
    \r\n \r\n Reply email\r\n \r\n \r\n {email.replyAddress || email.fromSender.email}\r\n \r\n
    \r\n \r\n

    Preview varies based on device, platform and/or email provider.

    \r\n
    \r\n ;\r\n};\r\n\r\nexport default EmailOneLastCheck;\r\n","// for use to compare 2 html texts to find differences -- they are considered equal if they are normalized to the same text\r\n// that is, certain differences are ignored and are considered the same:\r\n// 1.   and space (' ') differences\r\n// 2. " and quote (') differences\r\n// 3. trailing commas (';') on html attributes\r\n// 4. amp; and ampersand ('&') differences\r\nexport const normalizeHtml = (htmlText: string): string => {\r\n const doc = new DOMParser().parseFromString(htmlText, 'text/html');\r\n\r\n let normalizedHTML = doc.body.innerHTML;\r\n\r\n normalizedHTML = normalizedHTML\r\n .replace(/ /g, ' ')\r\n .replace(/"/g, '\\'')\r\n .replace(\r\n // match tags and perform normalization on their attributes\r\n /<([a-zA-Z0-9]+)(\\s[^>]*)?>/g, \r\n match => match\r\n .replaceAll(';', '') // remove semicolons from comparing html tag attributes\r\n .replaceAll('amp;', '&')\r\n ); \r\n\r\n return normalizedHTML.trim();\r\n}\r\n\r\nexport const htmlIsEqual = (newHtmlText?: string, originalHtmlText?: string): boolean => {\r\n if (originalHtmlText === newHtmlText)\r\n return true;\r\n\r\n if ((originalHtmlText && newHtmlText === undefined) || (originalHtmlText === undefined && newHtmlText))\r\n return false;\r\n\r\n if (originalHtmlText !== undefined && newHtmlText !== undefined) {\r\n return normalizeHtml(originalHtmlText) === normalizeHtml(newHtmlText);\r\n }\r\n \r\n return false;\r\n}","import EditorWrapperLayout from \"modules/common/components/authoring/editorLayouts/editorWrapperLayout\";\r\nimport MainEditorLayout from \"modules/common/components/authoring/editorLayouts/mainEditorLayout\";\r\nimport LoadingOverlay from \"modules/common/components/loadingOverlay\";\r\nimport BasePage from \"pages/common/basePage\";\r\nimport React, { useEffect, useLayoutEffect, useState } from \"react\";\r\nimport EmailEditor from \"./emailEditor\";\r\nimport EmailSettingsPanel from \"./emailSettingsPanel\";\r\nimport AuthoringAppBar from \"modules/common/components/authoring/authoringAppBar\";\r\nimport { useMediaQuery, useTheme } from \"@mui/material\";\r\nimport { BackItem } from \"pages/common/breadcrumb\";\r\nimport { connect, ConnectedProps, useDispatch, useSelector } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { RouteComponentProps, withRouter } from \"react-router\";\r\nimport { push } from \"react-router-redux\";\r\nimport EmailAuthoringActions from \"./emailAuthoringEditorActions\";\r\nimport { setMainStyle, setShouldDisplayNav } from \"modules/adminLayout/actionCreator\";\r\nimport ContentGuidelinePreview from \"modules/settings/components/content/guidelines/contentGuidelinePreview\";\r\nimport { HintType } from \"modules/common/components/authoring/dialogs/guidelineHint\";\r\nimport { createNewEmail, DEFAULT_EMAIL, emailsSlice, getEmailToEdit, saveExistingEmail } from \"modules/emails/reducer\";\r\nimport { IEmail } from \"modules/emails/models\";\r\nimport { actions as NewsletterActions, Address } from \"modules/newsletters\";\r\nimport { actions as AudienceActions } from \"modules/audiences\";\r\nimport ConfirmDialog from \"modules/common/components/dialogs/confirmDialog\";\r\nimport EmailOneLastCheck from \"../emailOneLastCheck\";\r\nimport { emailsApi } from \"api/instances\";\r\nimport { PickerLocalization } from \"modules/common/components/pickerLocalization\";\r\nimport { useAudienceCount } from \"modules/common/hooks/useAudienceCount\";\r\nimport Loading from \"modules/common/components/loading\";\r\nimport { UseSetSnackbarMessages } from \"modules/common/hooks/useSetSnackbarMessages\";\r\nimport EmailPreview from \"../emailPreview\";\r\nimport { useOpenContentGuidelines } from \"modules/common/hooks/useOpenContentGuidelines\";\r\nimport { htmlIsEqual } from \"utils/htmlIsEqual\";\r\nimport ShallowEquals from \"utils/shallowEquals\";\r\nimport { IdNamePair } from \"modules/common/models\";\r\nimport moment from \"moment\";\r\n\r\nimport \"../../styles/emailEditorPage.sass\";\r\nimport \"../../../common/components/authoring/styles/authoringLayout.sass\";\r\n\r\ninterface IEmailEditorPageProps {}\r\n\r\nconst EmailEditorPage: React.FC = ({\r\n redirectTo,\r\n match,\r\n changedSinceSaved,\r\n shouldDisplayNav,\r\n setMainStyle,\r\n setShouldDisplayNav,\r\n isFetching,\r\n getEmailSenderConfig,\r\n email,\r\n getAudiences,\r\n isSaving,\r\n changedSinceLastSaved,\r\n shouldOpenOneLastCheck\r\n}) => {\r\n const [settingsDrawerOpen, setSettingsDrawerOpen] = useState(true);\r\n const [showUnsavedWarning, setShowUnsavedWarning] = useState(false);\r\n const [showPreview, setShowPreview] = useState(false);\r\n const [fromEmailAddresses, setFromEmailAddresses] = useState([]);\r\n const [configFetched, setConfigFetched] = useState(false);\r\n const [showDiscardDialog, setShowDiscardDialog] = useState(false);\r\n const [showOneLastCheck, setShowOneLastCheck] = useState(false);\r\n const [isSendingEmail, setIsSendingEmail] = useState(false);\r\n const theme = useTheme();\r\n const isSmallAndSmaller = useMediaQuery(theme.breakpoints.down('md'), { noSsr: true });\r\n const dispatch = useDispatch();\r\n const activeLcid = \"en-us\"; // currently only support en-us lcid\r\n\r\n const { audienceCount, isFetchingAudienceCount } = useAudienceCount({ audiences: email.audiences, sendToAllUsers: email.sendToAllUsers });\r\n const { openContentGuidelines, setOpenContentGuidelines } = useOpenContentGuidelines();\r\n\r\n const { redirectUrl, editor } = useSelector((state: GlobalApplicationState) => state.emails);\r\n const { setSuccessMessage, setErrorMessage } = UseSetSnackbarMessages();\r\n \r\n const setShouldOpenOneLastCheck = (shouldOpen: boolean) => \r\n dispatch({ type: emailsSlice.actions.SET_SHOULD_OPEN_ONE_LAST_CHECK, payload: { shouldOpen }});\r\n const showEmailSentConfirmation = (sentTime: string, emailId: string) => dispatch({ \r\n type: emailsSlice.actions.SET_SHOW_SENT_CONFIRMATION, \r\n payload: { \r\n sentConfirmation: {\r\n shouldShowDialog: true,\r\n expectedSentTime: sentTime,\r\n emailId\r\n }\r\n }\r\n });\r\n \r\n const tenantId = match.params.tenant;\r\n const emailId = match.params.emailId;\r\n const isEmailIdPresent = React.useMemo(() => !!emailId && emailId !== \"new\", [emailId]);\r\n const isLoading = isFetching || !configFetched || !email.fromSender.email || !email.fromSender.name;\r\n const isEmailValid = email.subject.length > 0 && \r\n email.subject.some(s => !!s.text) && \r\n (email.sendToAllUsers || email.audiences.length > 0) && \r\n !!email.fromSender.email && \r\n !!email.fromSender.name;\r\n\r\n const emailRequiresValidFromAddress = fromEmailAddresses.length > 0 && !email.fromSender.email && !email.fromSender.name;\r\n\r\n useLayoutEffect(() => {\r\n if (shouldDisplayNav) {\r\n setShouldDisplayNav(false);\r\n setMainStyle({ backgroundColor: \"#FFFFFF\" });\r\n }\r\n }, [shouldDisplayNav, setMainStyle, setShouldDisplayNav]);\r\n\r\n useEffect(() => {\r\n const getAndSetInitialConfig = async () => {\r\n const config = await getEmailSenderConfig();\r\n setFromEmailAddresses(config.addresses.sort((a, b) => a.fromEmailName.localeCompare(b.fromEmailName)));\r\n setConfigFetched(true);\r\n }\r\n\r\n if (!configFetched)\r\n getAndSetInitialConfig();\r\n \r\n getAudiences();\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (isEmailIdPresent) {\r\n dispatch(getEmailToEdit({ emailId }));\r\n }\r\n }, [isEmailIdPresent]);\r\n\r\n useEffect(() => {\r\n if (email.id && !changedSinceLastSaved) {\r\n if (shouldOpenOneLastCheck) {\r\n setShouldOpenOneLastCheck(false);\r\n setShowOneLastCheck(true);\r\n }\r\n }\r\n }, [email.id, changedSinceLastSaved, shouldOpenOneLastCheck]);\r\n\r\n const hasEmailUpdated = (updatedEmailFields: Partial): boolean => {\r\n const updatedEmail = { ...editor.email, ...updatedEmailFields };\r\n const originalEmail = editor.originalEmail;\r\n\r\n const audienceIsEqual = (newAudience: IdNamePair[]): boolean => {\r\n const newAudienceIds = newAudience.map(a => a.id);\r\n const originalAudienceIds = originalEmail.audiences.map(a => a.id);\r\n \r\n if (newAudienceIds.length !== originalAudienceIds.length)\r\n return false;\r\n \r\n const originalAudIdSet = new Set(originalAudienceIds.sort());\r\n \r\n return newAudienceIds.every(id => originalAudIdSet.has(id));\r\n }\r\n\r\n const sentTimeIsEqual = (newSentTimeString?: string): boolean => {\r\n return newSentTimeString === originalEmail.sentTime || \r\n moment(newSentTimeString).isSame(moment(originalEmail.sentTime), \"minutes\");\r\n }\r\n\r\n return !htmlIsEqual(updatedEmail.body.find(t => t.lcid === activeLcid)?.text, originalEmail.body.find(t => t.lcid === activeLcid)?.text) ||\r\n !ShallowEquals(updatedEmail.subject.find(t => t.lcid === activeLcid)?.text, originalEmail.subject.find(t => t.lcid === activeLcid)?.text) ||\r\n !audienceIsEqual(updatedEmail.audiences) || \r\n !ShallowEquals(updatedEmail.sendToAllUsers, originalEmail.sendToAllUsers) ||\r\n !ShallowEquals(updatedEmail.fromSender, originalEmail.fromSender) ||\r\n !ShallowEquals(updatedEmail.replyAddress, originalEmail.replyAddress) ||\r\n !sentTimeIsEqual(updatedEmail.sentTime);\r\n }\r\n\r\n const updateEmail = (updatedEmailFields: Partial, checkIfChanged: boolean = true) => {\r\n dispatch({ \r\n type: emailsSlice.actions.UPDATE_EMAIL_EDITOR, \r\n payload: { \r\n email: {\r\n ...updatedEmailFields\r\n } as Partial,\r\n changedSinceLastSaved: checkIfChanged ? hasEmailUpdated(updatedEmailFields) : undefined\r\n }\r\n });\r\n }\r\n\r\n const updateOriginalEmail = (updatedEmailFields: Partial) => { \r\n dispatch({ \r\n type: emailsSlice.actions.UPDATE_ORIGINAL_EMAIL_EDITOR, \r\n payload: { \r\n originalEmail: {\r\n ...updatedEmailFields\r\n } as Partial\r\n }\r\n });\r\n\r\n updateEmail(updatedEmailFields, false);\r\n }\r\n\r\n useEffect(() => {\r\n // set the fromSender to the first one in the 'from email' address list\r\n if (emailRequiresValidFromAddress) {\r\n const fromSender = { \r\n email: fromEmailAddresses[0].fromEmailAddress, \r\n name: fromEmailAddresses[0].fromEmailName \r\n };\r\n \r\n updateOriginalEmail({ fromSender });\r\n }\r\n }, [fromEmailAddresses, emailRequiresValidFromAddress]);\r\n\r\n const manageEmailsUrl = `/${tenantId}/admin/emails`;\r\n\r\n useEffect(() => { \r\n if (redirectUrl) {\r\n if (redirectUrl === manageEmailsUrl)\r\n redirectToManageEmails();\r\n else \r\n redirectTo(redirectUrl);\r\n\r\n dispatch({ type: emailsSlice.actions.SET_REDIRECT_URL, payload: { redirectUrl: undefined }});\r\n }\r\n }, [redirectUrl, manageEmailsUrl]);\r\n\r\n const onToggleDrawer = () => setSettingsDrawerOpen(prev => !prev);\r\n\r\n const redirectToManageEmails = () => {\r\n dispatch({\r\n type: emailsSlice.actions.SET_EMAIL_EDITOR, \r\n payload: { \r\n email: DEFAULT_EMAIL\r\n }\r\n });\r\n dispatch({type: emailsSlice.actions.SET_TEST_EMAILS, payload: { testEmails: [] }});\r\n redirectTo(manageEmailsUrl);\r\n }\r\n\r\n const backToManagePosts = React.useCallback(() => {\r\n changedSinceSaved\r\n ? setShowUnsavedWarning(true)\r\n : redirectToManageEmails();\r\n }, [changedSinceSaved, redirectToManageEmails]);\r\n\r\n const onSendEmail = async () => {\r\n setIsSendingEmail(true);\r\n\r\n try {\r\n await emailsApi.sendEmail(email.id);\r\n showEmailSentConfirmation(\r\n email.sentTime && new Date(email.sentTime) >= new Date() \r\n ? email.sentTime\r\n : new Date().toISOString(),\r\n email.id\r\n );\r\n redirectToManageEmails();\r\n }\r\n catch {\r\n setErrorMessage(\"There was an error. Please try again.\");\r\n setIsSendingEmail(false);\r\n setShowOneLastCheck(false);\r\n }\r\n }\r\n\r\n const onClickSend = async () => {\r\n if (!email.id || changedSinceLastSaved) {\r\n saveEmail();\r\n setShouldOpenOneLastCheck(true);\r\n }\r\n else {\r\n setShowOneLastCheck(true);\r\n }\r\n }\r\n\r\n const getActions = React.useMemo((): JSX.Element =>\r\n changedSinceSaved && setShowDiscardDialog(true)}\r\n isDiscardDisabled={!changedSinceSaved}\r\n onPreview={() => setShowPreview(true)}\r\n onSave={() => saveEmail()}\r\n isSaveDisabled={!changedSinceSaved}\r\n onBack={backToManagePosts}\r\n onToggleSettingsPanel={onToggleDrawer}\r\n isToggleSettingsPanelDisabled={!settingsDrawerOpen}\r\n openGuidelines={() => setOpenContentGuidelines(true)}\r\n />, \r\n [settingsDrawerOpen, changedSinceSaved, isEmailValid, openContentGuidelines]\r\n );\r\n\r\n const contentGuidelinePreview = React.useMemo(() => {\r\n return setOpenContentGuidelines(false)}\r\n isAuthoring={true}\r\n hintType={HintType.Post}\r\n />;\r\n }, [openContentGuidelines]);\r\n\r\n const saveEmail = (redirectUrl?: string) => {\r\n if (isLoading) return;\r\n\r\n isEmailIdPresent \r\n ? dispatch(saveExistingEmail({ redirectUrl }))\r\n : dispatch(createNewEmail({ redirectUrl }));\r\n };\r\n\r\n useEffect(() => {\r\n if (email.id !== \"\" && !isEmailIdPresent)\r\n redirectTo(`/${match.params.tenant}/admin/emails/edit/${email.id}`);\r\n }, [email.id, isEmailIdPresent]);\r\n\r\n return isLoading \r\n ? \r\n : \r\n \r\n : \r\n }\r\n actions={getActions}\r\n />\r\n
    \r\n \r\n \r\n \r\n {\r\n if (isFullscreen)\r\n setSettingsDrawerOpen(false);\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n
    \r\n setShowPreview(false)}\r\n show={showPreview}\r\n email={email}\r\n activeLcid={activeLcid}\r\n />\r\n setShowUnsavedWarning(false)}\r\n onConfirm={() => setShowUnsavedWarning(false)}\r\n onDeny={redirectToManageEmails}\r\n >\r\n
    \r\n
    \r\n You have unsaved changes to your email. Changes will not be saved if you exit.
    \r\n
    \r\n
    Do you want to continue?
    \r\n
    \r\n \r\n setShowDiscardDialog(false)}\r\n onConfirm={async () => {\r\n setShowDiscardDialog(false);\r\n saveEmail(manageEmailsUrl);\r\n }}\r\n onDeny={redirectToManageEmails}\r\n >\r\n
    \r\n You have unsaved changes to your draft. Would you like to save these changes before exiting?\r\n
    \r\n \r\n {contentGuidelinePreview}\r\n setShowOneLastCheck(false)}\r\n sending={isSendingEmail}\r\n sendEmail={onSendEmail}\r\n onSaveEmail={saveEmail}\r\n onSuccessMessage={setSuccessMessage}\r\n onErrorMessage={setErrorMessage}\r\n activeLcid={activeLcid}\r\n defaultAudienceCount={audienceCount}\r\n isFetchingDefaultAudienceCount={isFetchingAudienceCount}\r\n />\r\n
    ;\r\n};\r\n\r\ninterface RouteParams {\r\n tenant: string;\r\n emailId: string;\r\n}\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: IEmailEditorPageProps & RouteComponentProps) => ({\r\n ...ownProps,\r\n changedSinceSaved: state.emails.editor.changedSinceLastSaved,\r\n shouldDisplayNav: state.adminLayout.shouldDisplayNav,\r\n email: state.emails.editor.email,\r\n isFetching: state.emails.editor.isFetching,\r\n isSaving: state.emails.editor.isSaving,\r\n changedSinceLastSaved: state.emails.editor.changedSinceLastSaved,\r\n shouldOpenOneLastCheck: state.emails.editor.shouldOpenOneLastCheck\r\n }),\r\n {\r\n redirectTo: push,\r\n setMainStyle: setMainStyle,\r\n setShouldDisplayNav: setShouldDisplayNav,\r\n getEmailSenderConfig: NewsletterActions.getConfig,\r\n getAudiences: AudienceActions.getAudiences,\r\n }\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\n\r\nexport default withRouter(connector(EmailEditorPage));\r\n","import { Button } from '@mui/material';\r\nimport React from 'react';\r\nimport ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown';\r\nimport Menu from \"@mui/material/Menu\";\r\nimport MenuItem from \"@mui/material/MenuItem\";\r\n\r\ninterface IShortcutsHeaderButtons {\r\n onCreateShortcutGroupClick: () => void;\r\n onCreateShortcutClick: () => void;\r\n onOrganizeListClick: () => void;\r\n}\r\n\r\nexport const ShortcutsHeaderButtons: React.FC = ({\r\n onCreateShortcutGroupClick,\r\n onCreateShortcutClick,\r\n onOrganizeListClick\r\n}) => {\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const open = Boolean(anchorEl);\r\n\r\n const handleClick = (event: React.MouseEvent) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const onCreateShortcutGroupMenuClick = () => {\r\n onCreateShortcutGroupClick();\r\n handleClose();\r\n }\r\n\r\n const onCreateShortcutMenuClick = () => {\r\n onCreateShortcutClick();\r\n handleClose();\r\n }\r\n\r\n const onOrganizeListMenuClick = () => {\r\n onOrganizeListClick();\r\n handleClose();\r\n }\r\n\r\n return
    \r\n \r\n Organize list\r\n \r\n }\r\n onClick={handleClick}\r\n >\r\n Add new\r\n \r\n \r\n Shortcut Group\r\n Shortcut\r\n \r\n
    ;\r\n};","import { Button, IconButton, Typography } from '@mui/material';\r\nimport TabContentToolbar from 'pages/common/tabContentToolbar';\r\nimport React from 'react';\r\nimport CancelOutlinedIcon from '@mui/icons-material/CancelOutlined';\r\nimport CheckCircleOutlineOutlinedIcon from '@mui/icons-material/CheckCircleOutlineOutlined';\r\nimport ClearIcon from '@mui/icons-material/Clear';\r\nimport DeleteIcon from '@mui/icons-material/Delete';\r\nimport DriveFileMoveRoundedIcon from '@mui/icons-material/DriveFileMoveRounded';\r\nimport EditIcon from '@mui/icons-material/Edit';\r\nimport { Shortcut, ShortcutGroup } from '../models';\r\n\r\nimport '../styles/shortcutsToolbar.sass';\r\n\r\ninterface IShortcutsToolbarProps {\r\n selectedShortcuts: Shortcut[];\r\n selectedShortcutGroups: ShortcutGroup[];\r\n onClearSelectedShortcuts: () => void;\r\n onMoveSelectedShortcuts: () => void;\r\n onSelectedShortcutsStateChange: (newState: boolean) => void;\r\n onDeleteSelectedShortcuts: () => void;\r\n onEditSelectedShortcut: () => void;\r\n}\r\n\r\nexport const ShortcutsToolbar: React.FC = ({\r\n selectedShortcuts,\r\n selectedShortcutGroups,\r\n onClearSelectedShortcuts,\r\n onMoveSelectedShortcuts,\r\n onSelectedShortcutsStateChange,\r\n onDeleteSelectedShortcuts,\r\n onEditSelectedShortcut,\r\n}) => {\r\n if ((selectedShortcuts === null || selectedShortcuts.length === 0) && (selectedShortcutGroups === null || selectedShortcutGroups.length === 0))\r\n return ;\r\n\r\n const totalSelected = selectedShortcuts.length + selectedShortcutGroups.length;\r\n\r\n const getToolbarIcon = (title: string, icon: React.ReactNode, onClick: () => void): JSX.Element =>\r\n \r\n {title}\r\n ;\r\n\r\n const getToolbarActions = (): JSX.Element => {\r\n if (selectedShortcuts.length === 1 && selectedShortcutGroups.length === 0) {\r\n return \r\n {getToolbarIcon('Edit', , onEditSelectedShortcut)}\r\n {getToolbarIcon('Move shortcut', , onMoveSelectedShortcuts)}\r\n {\r\n selectedShortcuts[0].isEnabled \r\n ? getToolbarIcon('Disable', , () => onSelectedShortcutsStateChange(false))\r\n : getToolbarIcon('Enable', , () => onSelectedShortcutsStateChange(true))\r\n }\r\n {getToolbarIcon('Delete', , onDeleteSelectedShortcuts)}\r\n ;\r\n }\r\n else if (selectedShortcuts.length === 0 && selectedShortcutGroups.length === 1) {\r\n return \r\n {getToolbarIcon('Delete', , onDeleteSelectedShortcuts)}\r\n ;\r\n }\r\n else if (selectedShortcuts.length === 0 && selectedShortcutGroups.length > 1) {\r\n return \r\n {getToolbarIcon('Delete all', , onDeleteSelectedShortcuts)}\r\n ;\r\n }\r\n else {\r\n return \r\n {getToolbarIcon('Move shortcuts', , onMoveSelectedShortcuts)}\r\n {getToolbarIcon('Enable all', , () => onSelectedShortcutsStateChange(true))}\r\n {getToolbarIcon('Disable all', , () => onSelectedShortcutsStateChange(false))}\r\n {getToolbarIcon('Delete all', , onDeleteSelectedShortcuts)}\r\n ;\r\n }\r\n }\r\n\r\n return \r\n
    \r\n \r\n \r\n \r\n \r\n {`${totalSelected} SELECTED`}\r\n \r\n
    \r\n
    \r\n {getToolbarActions()}\r\n
    \r\n ;\r\n};","import React from \"react\";\r\nimport { Checkbox, List, ListItemButton, ListItemIcon, ListItemText } from \"@mui/material\";\r\nimport FilterDropdown from \"modules/common/components/filters/filterDropdown\";\r\nimport { IdNamePair } from \"../models\";\r\n\r\ninterface ComponentProps> {\r\n label: string;\r\n options: T[];\r\n selectedOptions?: T[];\r\n onClickOption: (option: T[]) => void;\r\n contentCalloutClassName?: string;\r\n}\r\n\r\n// TODO: This was taken from Paola's tags branch 22299 - consolidate once it's in main\r\nconst CheckboxDropdown = >(props: ComponentProps) => {\r\n const getUpdatedValues = (value: T) : T[] | undefined => {\r\n return props.selectedOptions?.find(v => v.id === value.id)\r\n ? props.selectedOptions?.filter(current => current.id !== value.id)\r\n : props.selectedOptions?.concat([value]);\r\n };\r\n\r\n const onClick = (option: T) => {\r\n const updatedValues = getUpdatedValues(option);\r\n props.onClickOption(updatedValues ?? []);\r\n };\r\n\r\n return (\r\n \r\n \r\n {props.options.map((option) => (\r\n onClick(option)}>\r\n \r\n o.id === option.id)}\r\n />\r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default CheckboxDropdown;\r\n","import React from \"react\";\r\nimport MultiSelectCalloutWithSearch, { IMultiSelectButtonStyle } from \"./forms/inputs/multiSelectCalloutWithSearch\";\r\nimport { IdNamePair } from \"../models\";\r\nimport { Button } from \"@mui/material\";\r\n\r\ninterface IAudienceSearchCalloutProps {\r\n availableAudienceIdNames: IdNamePair[];\r\n selectedOptions: IdNamePair[];\r\n onAudienceFilterChange: (newAudiences: IdNamePair[]) => void;\r\n buttonStyle?: IMultiSelectButtonStyle;\r\n}\r\n\r\nconst AudienceSearchCallout: React.FC = ({\r\n availableAudienceIdNames,\r\n selectedOptions,\r\n onAudienceFilterChange,\r\n buttonStyle\r\n}) => {\r\n return \r\n onAudienceFilterChange([])}\r\n >\r\n Clear All\r\n \r\n \r\n }\r\n nestingAllowed={false}\r\n buttonId=\"audience-search-callout\"\r\n />\r\n};\r\n\r\nexport default AudienceSearchCallout;\r\n","import React from 'react';\r\nimport CheckboxDropdown from 'modules/common/components/checkboxDropdown';\r\nimport AuthoringFilter from 'modules/common/components/filters/authoringFilter';\r\nimport AuthoringSearch from 'modules/common/components/filters/authoringSearch';\r\nimport FilterContainer from 'modules/common/components/filters/filterContainer';\r\nimport { ShortcutState, ShortcutsFilterv1, allShortcutStates, defaultShortcutsFilter } from '../models';\r\nimport { Chip } from '@mui/material';\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport { IdNamePair } from 'modules/common/models';\r\nimport AudienceSearchCallout from 'modules/common/components/audienceSearchCallout';\r\nimport ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\n\r\ninterface IShortcutsFitlerProps {\r\n availableAudienceIdNames: IdNamePair[];\r\n onFilterChange: (filter: ShortcutsFilterv1) => void;\r\n shortcutsFilter: ShortcutsFilterv1;\r\n hasFiltersApplied: boolean;\r\n}\r\n\r\nexport const ShortcutsFilter: React.FC = ({\r\n availableAudienceIdNames,\r\n onFilterChange,\r\n shortcutsFilter,\r\n hasFiltersApplied\r\n}) => {\r\n const [textSearchValue, setTextSearchValue] = React.useState(defaultShortcutsFilter.searchText);\r\n\r\n const onApplyInternalFilters = (newFilter: ShortcutsFilterv1) => {\r\n onFilterChange(newFilter);\r\n }\r\n\r\n const onStateFilterChange = (newState: IdNamePair[]) => {\r\n const newFilter = {\r\n ...shortcutsFilter,\r\n state: newState.map(s => s.name)\r\n };\r\n\r\n onApplyInternalFilters(newFilter);\r\n }\r\n\r\n const onRemoveStateFromFilter = (stateToRemove: ShortcutState) => {\r\n const newState = shortcutsFilter.state.filter(s => s !== stateToRemove);\r\n\r\n const newFilter = {\r\n ...shortcutsFilter,\r\n state: newState\r\n };\r\n\r\n onApplyInternalFilters(newFilter);\r\n }\r\n\r\n const onAudienceFilterChange = (newAudiences: IdNamePair[]) => {\r\n const newFilter = {\r\n ...shortcutsFilter, \r\n audiences: newAudiences.map(a => a.id)\r\n };\r\n\r\n onApplyInternalFilters(newFilter);\r\n }\r\n\r\n const onRemoveAudienceFromFilter = (audience: string) => {\r\n const newAudiences = shortcutsFilter.audiences.filter(a => a !== audience);\r\n\r\n const newFilter = {\r\n ...shortcutsFilter,\r\n audiences: newAudiences\r\n };\r\n\r\n onApplyInternalFilters(newFilter);\r\n }\r\n\r\n const onTextFilterChange = () => {\r\n const newFilter = {\r\n ...shortcutsFilter,\r\n searchText: textSearchValue\r\n };\r\n\r\n onApplyInternalFilters(newFilter);\r\n }\r\n\r\n const onClearFilters = () => {\r\n setTextSearchValue(defaultShortcutsFilter.searchText);\r\n onApplyInternalFilters(defaultShortcutsFilter);\r\n }\r\n\r\n const onDeleteSearchText = () => {\r\n setTextSearchValue(defaultShortcutsFilter.searchText);\r\n\r\n const newFilter = {\r\n ...shortcutsFilter,\r\n searchText: defaultShortcutsFilter.searchText\r\n };\r\n\r\n onApplyInternalFilters(newFilter);\r\n }\r\n \r\n const getFilterSelection = (): JSX.Element | undefined => {\r\n if (!hasFiltersApplied)\r\n return undefined;\r\n\r\n return \r\n {shortcutsFilter.searchText !== defaultShortcutsFilter.searchText &&\r\n }\r\n />\r\n }\r\n {shortcutsFilter.state?.map((state) =>\r\n onRemoveStateFromFilter(state)}\r\n deleteIcon={}\r\n />\r\n )}\r\n {shortcutsFilter.audiences?.map((audience) =>\r\n a.id === audience)?.name || audience}\r\n onDelete={() => onRemoveAudienceFromFilter(audience)}\r\n deleteIcon={}\r\n />\r\n )}\r\n ;\r\n };\r\n\r\n return \r\n }\r\n filters={\r\n \r\n ({ name: s, id: s }))}\r\n onClickOption={onStateFilterChange}\r\n selectedOptions={shortcutsFilter.state.map(s => ({ name: s, id: s }))}\r\n />\r\n ({\r\n id: aId,\r\n name: availableAudienceIdNames.find(val => val.id === aId)?.name ?? \"\"\r\n }))}\r\n onAudienceFilterChange={onAudienceFilterChange}\r\n buttonStyle={{\r\n buttonText: \"Audiences\",\r\n buttonVariant:\"text\",\r\n endIcon: ,\r\n }}\r\n />\r\n \r\n }\r\n onChangeTextToSearch={onTextFilterChange}\r\n onUpdateTextToSearch={(e) => setTextSearchValue(e.target.value)}\r\n />\r\n }\r\n />;\r\n};","import { TableCell } from '@mui/material';\r\nimport { HeaderCell, SHORTCUTS_HEADER_CELLS } from 'modules/shortcuts/models';\r\nimport React from 'react';\r\n\r\nexport const ShortcutsTableListHeader: React.FC<{}> = ({\r\n\r\n}) => {\r\n const isFirstColumn = (hc: HeaderCell): boolean => hc.id === SHORTCUTS_HEADER_CELLS[0].id;\r\n\r\n const createColumnHeader = (hc: HeaderCell) : JSX.Element => \r\n \r\n {hc.label}\r\n ;\r\n\r\n return \r\n {\r\n SHORTCUTS_HEADER_CELLS.map((hc: HeaderCell) => createColumnHeader(hc))\r\n }\r\n ;\r\n};","import { Divider, List, Typography } from '@mui/material';\r\nimport MoreOptionsIconButton from 'modules/common/components/buttons/moreOptionsIconButton';\r\nimport MoreOptionsItem from 'modules/common/components/moreOptionsItem';\r\nimport { ShortcutGroupAction, ShortcutGroupToShortcuts } from 'modules/shortcuts/models';\r\nimport React from 'react';\r\n\r\ninterface IMoreShortcutGroupOptionsProps {\r\n shortcutGroupToShortcuts: ShortcutGroupToShortcuts;\r\n onShortcutGroupAction: (action: ShortcutGroupAction) => void;\r\n}\r\n\r\nexport const MoreShortcutGroupOptions: React.FC = ({\r\n shortcutGroupToShortcuts,\r\n onShortcutGroupAction,\r\n}) => {\r\n const deleteShortcutGroupText = (): JSX.Element =>\r\n \r\n Delete shortcut group\r\n ;\r\n\r\n const atLeastOneEnabled = () => shortcutGroupToShortcuts.shortcuts.some(s => s.isEnabled);\r\n\r\n return \r\n \r\n onShortcutGroupAction(ShortcutGroupAction.ADD_SHORTCUT)}\r\n />\r\n \r\n onShortcutGroupAction(ShortcutGroupAction.EDIT)}\r\n />\r\n \r\n onShortcutGroupAction(atLeastOneEnabled() ? ShortcutGroupAction.DISABLE_ALL : ShortcutGroupAction.ENABLE_ALL)}\r\n />\r\n onShortcutGroupAction(ShortcutGroupAction.DELETE)}\r\n />\r\n \r\n ;\r\n};","import * as React from \"react\";\r\nimport \"./availability.sass\";\r\n\r\ninterface ComponentProps {\r\n isDisabled: boolean;\r\n}\r\n\r\n// TODO: taken from paola's branch, consolidate after\r\nconst Availability: React.FunctionComponent = (props) => {\r\n return (\r\n \r\n {\r\n props.isDisabled ?\r\n Disabled :\r\n Enabled\r\n }\r\n \r\n );\r\n};\r\n\r\nexport default Availability;","import { Box, Checkbox, Grid, Typography } from '@mui/material';\r\nimport LockIcon from '@mui/icons-material/Lock';\r\nimport { Shortcut } from 'modules/shortcuts/models';\r\nimport React from 'react';\r\n\r\ninterface IShortcutLeadingCell {\r\n shortcut: Shortcut;\r\n selected: boolean;\r\n onEditShortcut: (shortcut: Shortcut) => void;\r\n onSelectShortcut: (selected: boolean, shortcut: Shortcut) => void;\r\n}\r\n\r\nexport const ShortcutLeadingCell: React.FC = ({\r\n shortcut,\r\n selected,\r\n onEditShortcut,\r\n onSelectShortcut\r\n}) => {\r\n return \r\n \r\n onSelectShortcut(checked, shortcut)} />\r\n \r\n \r\n \r\n onEditShortcut(shortcut)}>\r\n {shortcut.name}\r\n \r\n {\r\n shortcut.audiences.length !== 0 &&\r\n \r\n }\r\n \r\n \r\n ;\r\n};","import { Divider, List, Typography } from '@mui/material';\r\nimport MoreOptionsIconButton from 'modules/common/components/buttons/moreOptionsIconButton';\r\nimport MoreOptionsItem from 'modules/common/components/moreOptionsItem';\r\nimport { ShortcutAction } from 'modules/shortcuts/models';\r\nimport React from 'react';\r\n\r\ninterface IMoreShortcutOptions {\r\n enabled: boolean;\r\n onShortcutAction: (shortcutAction: ShortcutAction) => void;\r\n}\r\n\r\nexport const MoreShortcutOptions: React.FC = ({\r\n enabled,\r\n onShortcutAction\r\n}) => {\r\n const deleteText = (): JSX.Element =>\r\n \r\n Delete\r\n ;\r\n \r\n return \r\n \r\n \r\n onShortcutAction(ShortcutAction.EDIT)}\r\n />\r\n onShortcutAction(ShortcutAction.MOVE)}\r\n />\r\n onShortcutAction(enabled ? ShortcutAction.DISABLE : ShortcutAction.ENABLE)}\r\n />\r\n \r\n onShortcutAction(ShortcutAction.DELETE)}\r\n />\r\n \r\n \r\n ;\r\n};","import React from \"react\";\r\nimport { TableCell, TableCellProps } from \"@mui/material\";\r\n\r\nimport \"./collapsibleTableCell.sass\";\r\n\r\ninterface ICollapsibleTableCellProps {\r\n expanded: boolean;\r\n tableCellClassName?: string;\r\n tableCellProps?: TableCellProps;\r\n}\r\n\r\nconst CollapsibleTableCell: React.FC = ({\r\n expanded,\r\n tableCellClassName,\r\n tableCellProps,\r\n children\r\n}) => {\r\n return \r\n
    \r\n {children}\r\n
    \r\n
    ;\r\n};\r\n\r\nexport default CollapsibleTableCell;\r\n","import React from \"react\";\r\nimport CollapsableTableCell from \"./collapsibleTableCell\";\r\n\r\ninterface ICollapsibleEmptyCheckBoxCellProps {\r\n expanded: boolean;\r\n}\r\n\r\nconst CollapsibleEmptyCheckBoxCell: React.FC = ({\r\n expanded\r\n}) => {\r\n return ;\r\n};\r\n\r\nexport default CollapsibleEmptyCheckBoxCell;\r\n","import React from \"react\";\r\nimport { TableRow } from \"@mui/material\";\r\nimport CollapsibleTableCell from \"./collapsibleTableCell\";\r\nimport { ICollapsibleTableCellElement } from \"../../models\";\r\nimport CollapsibleEmptyCheckBoxCell from \"./collapsibleEmptyCheckBoxCell\";\r\n\r\nimport \"./collapsibleTableRow.sass\";\r\n\r\ninterface ICollapsibleTableRowProps {\r\n expanded: boolean;\r\n hover?: boolean;\r\n tableCellElements: ICollapsibleTableCellElement[];\r\n rowKey: string;\r\n rowRefs?: React.MutableRefObject>;\r\n}\r\n\r\nconst CollapsibleTableRow: React.FC = ({\r\n expanded,\r\n hover,\r\n tableCellElements,\r\n rowKey,\r\n rowRefs\r\n}) => {\r\n return rowRefs ? rowRefs.current[rowKey] = ref : undefined}\r\n key={rowKey}\r\n hover={hover}\r\n className={`collapsible-table-row ${expanded ? \"expanded\" : \"\"}`}\r\n >\r\n {\r\n tableCellElements.map((e, i) => \r\n e.element !== undefined \r\n ? \r\n {e.element}\r\n \r\n : \r\n )\r\n }\r\n ;\r\n};\r\n\r\nexport default CollapsibleTableRow;","import Availability from 'modules/common/availability/availability';\r\nimport React from 'react';\r\nimport { ShortcutLeadingCell } from './shortcutLeadingCell';\r\nimport { Shortcut, ShortcutAction } from 'modules/shortcuts/models';\r\nimport { MoreShortcutOptions } from './moreShortcutOptions';\r\nimport CollapsableTableRow from 'modules/common/components/collapsibleTableRow/collapsibleTableRow';\r\nimport { useSelector } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport ChipList from 'modules/common/components/chipList';\r\nimport { ICollapsibleTableCellElement } from 'modules/common/models';\r\nimport { MAX_URL_LENGTH } from 'modules/shortcuts/styles/constants';\r\n\r\ninterface IShortcutRow {\r\n shortcut: Shortcut;\r\n selected: boolean;\r\n expanded: boolean;\r\n rowRefs?: React.MutableRefObject>;\r\n onSelectShortcut: (selected: boolean, shortcut: Shortcut) => void;\r\n onShortcutAction: (shortcut: Shortcut, shortcutAction: ShortcutAction) => void;\r\n}\r\n\r\nexport const ShortcutRow: React.FC = ({\r\n shortcut,\r\n selected,\r\n expanded,\r\n rowRefs,\r\n onSelectShortcut,\r\n onShortcutAction\r\n}) => {\r\n const audiences = useSelector((state: GlobalApplicationState) => state.audiences.audiences);\r\n\r\n const shortcutRowContent: ICollapsibleTableCellElement[] = [\r\n { element: undefined },\r\n {\r\n element: onShortcutAction(s, ShortcutAction.EDIT)}\r\n />,\r\n tableCellProps: {\r\n align: \"left\",\r\n padding: \"none\"\r\n }\r\n },\r\n {\r\n element: onShortcutAction(shortcut, a)}\r\n />\r\n },\r\n {\r\n element: ,\r\n tableCellProps: {\r\n align: \"center\",\r\n padding: \"normal\"\r\n },\r\n tableCellClassName: \"shortcuts-availability-cell\"\r\n },\r\n {\r\n element:
    \r\n ({\r\n id: aId,\r\n name: audiences.find(aud => aud.id === aId)?.displayName ?? \"Unknown\"\r\n }))}\r\n truncateAtIndex={1}\r\n emptyLabel=\"All users\"\r\n showEmptyChip\r\n />\r\n
    ,\r\n tableCellProps: {\r\n align: \"center\",\r\n padding: \"normal\",\r\n },\r\n tableCellClassName: \"shortcut-audience-cell\"\r\n },\r\n {\r\n element: shortcut.url.length > MAX_URL_LENGTH ? shortcut.url.slice(0, MAX_URL_LENGTH - 3) + \"...\" : shortcut.url,\r\n tableCellProps: {\r\n align: \"center\",\r\n padding: \"normal\"\r\n }\r\n },\r\n {\r\n element: shortcut.openInNewWindow ? \"New window\" : \"Same window\",\r\n tableCellProps: {\r\n align: \"center\",\r\n padding: \"normal\"\r\n }\r\n }\r\n ]\r\n\r\n return ;\r\n};","export const TOTAL_NUM_OF_COLUMNS_SHORTCUTS = 7;\r\n\r\nexport const MAX_SHORTCUT_GROUP_NAME_WIDTH = 300;\r\n\r\nexport const DIALOG_BODY_PADDING_SHORTCUTS = 3;\r\n\r\nexport const MAX_URL_LENGTH = 70;\r\n","import React, { useEffect, useRef } from 'react';\r\nimport { Box, Checkbox, Grid, IconButton, TableCell, TableRow, Typography } from '@mui/material';\r\nimport { ExpandLess, ExpandMore } from \"@mui/icons-material\";\r\nimport { Shortcut, ShortcutAction, ShortcutGroup, ShortcutGroupToShortcuts, ShortcutGroupAction } from 'modules/shortcuts/models';\r\nimport { MAX_SHORTCUT_GROUP_NAME_WIDTH, TOTAL_NUM_OF_COLUMNS_SHORTCUTS } from 'modules/shortcuts/styles/constants';\r\nimport { MoreShortcutGroupOptions } from './moreShortcutGroupOptions';\r\nimport { ShortcutRow } from './shortcutRow';\r\nimport CollapsableTableRow from 'modules/common/components/collapsibleTableRow/collapsibleTableRow';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport { SET_SCROLL_TO_ROW_ID } from 'modules/shortcuts/reducer';\r\n\r\ninterface IShortcutsGroupRowProps {\r\n shortcutGroupToShortcuts: ShortcutGroupToShortcuts;\r\n selectedShortcuts: Shortcut[];\r\n onSelectShortcut: (selected: boolean, shortcut: Shortcut) => void;\r\n onSelectGroup: (selected: boolean, shortcuts: ShortcutGroup) => void;\r\n onToggleExpand: (expanded: boolean, group: ShortcutGroup) => void\r\n expanded: boolean;\r\n onShortcutAction: (shortcut: Shortcut, shortcutAction: ShortcutAction) => void;\r\n onShortcutGroupAction: (shortcutGroup: ShortcutGroup, shortcutGroupAction: ShortcutGroupAction) => void;\r\n selectedShortcutGroups: ShortcutGroup[];\r\n}\r\n\r\nexport const ShortcutsGroupRow: React.FC = ({\r\n shortcutGroupToShortcuts,\r\n selectedShortcuts,\r\n onSelectShortcut,\r\n onSelectGroup,\r\n onToggleExpand,\r\n expanded,\r\n onShortcutAction,\r\n onShortcutGroupAction,\r\n selectedShortcutGroups\r\n}) => {\r\n const shortcutGroup = shortcutGroupToShortcuts.shortcutGroup;\r\n const shortcutsInGroup = shortcutGroupToShortcuts.shortcuts;\r\n const isShortcutGroupSelected = selectedShortcutGroups.find(sg => sg.id === shortcutGroup.id) !== undefined;\r\n const rowRefs = useRef>({});\r\n const { isFetching, scrollToRowId } = useSelector((state: GlobalApplicationState) => state.shortcuts);\r\n const dispatch = useDispatch();\r\n\r\n const toggleExpand = () => onToggleExpand(!expanded, shortcutGroup);\r\n\r\n const onChangeCheck = () => {\r\n const isSelected = !isShortcutGroupSelected;\r\n \r\n onSelectGroup(isSelected, shortcutGroup);\r\n };\r\n\r\n useEffect(() => {\r\n if (scrollToRowId && !isFetching) {\r\n const rowRef = rowRefs.current[scrollToRowId];\r\n if (rowRef) {\r\n rowRef.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n dispatch(SET_SCROLL_TO_ROW_ID());\r\n }\r\n }, [scrollToRowId, isFetching])\r\n\r\n const getEmptyShortcutGroup = (): JSX.Element =>\r\n \r\n No shortcuts in shortcut group \r\n \r\n }\r\n ]}\r\n />;\r\n\r\n const getRowsInGroup = () => shortcutsInGroup.length !== 0 \r\n ? shortcutsInGroup.map((shortcut) =>\r\n s.id).includes(shortcut.id)}\r\n onSelectShortcut={onSelectShortcut}\r\n onShortcutAction={onShortcutAction}\r\n key={shortcut.id}\r\n expanded={expanded}\r\n rowRefs={rowRefs}\r\n />\r\n ) \r\n : getEmptyShortcutGroup();\r\n\r\n return \r\n rowRefs.current[shortcutGroup.id] = ref}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {shortcutGroup.name}\r\n \r\n \r\n \r\n \r\n \r\n \r\n onShortcutGroupAction(shortcutGroup, a)}\r\n />\r\n \r\n \r\n \r\n {expanded ? : }\r\n \r\n \r\n \r\n {getRowsInGroup()}\r\n ;\r\n};","import React from 'react';\r\nimport { Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from '@mui/material';\r\nimport Loading from 'modules/common/components/loading';\r\nimport ManagementEmptyResults from 'modules/common/components/managementEmptyResults';\r\nimport { Shortcut, ShortcutAction, ShortcutGroup, ShortcutGroupAction, ShortcutGroupToShortcuts } from '../../models';\r\nimport { ShortcutsTableListHeader } from './shortcutsTableListHeader';\r\nimport { ShortcutsGroupRow } from './shortcutsGroupRow';\r\n\r\ninterface IShortcutsListProps {\r\n filteredShortcutFormat: ShortcutGroupToShortcuts[];\r\n selectedShortcuts: Shortcut[];\r\n selectedShortcutGroups: ShortcutGroup[];\r\n onChangeSelectedShortcuts: (shortcuts: Shortcut[]) => void;\r\n onChangeSelectedShortcutGroups: (shortcutGroups: ShortcutGroup[]) => void;\r\n onShortcutAction: (shortcut: Shortcut, shortcutAction: ShortcutAction) => void;\r\n onShortcutGroupAction: (shortcutGroup: ShortcutGroup, shortcutGroupAction: ShortcutGroupAction) => void;\r\n isFetching: boolean;\r\n isUpdating: boolean;\r\n expandedShortcutGroups: string[];\r\n setExpandedShortcutGroups: React.Dispatch>;\r\n hasFiltersApplied: boolean;\r\n}\r\n\r\nexport const ShortcutsList: React.FC = ({\r\n filteredShortcutFormat,\r\n selectedShortcuts,\r\n selectedShortcutGroups,\r\n onChangeSelectedShortcuts,\r\n onChangeSelectedShortcutGroups,\r\n onShortcutAction,\r\n onShortcutGroupAction,\r\n isFetching,\r\n isUpdating,\r\n expandedShortcutGroups,\r\n setExpandedShortcutGroups,\r\n hasFiltersApplied\r\n}) => {\r\n const getTableHeader = (): JSX.Element => \r\n \r\n \r\n \r\n ;\r\n\r\n const onToggleExpand = (expanded: boolean, group: ShortcutGroup) => \r\n expanded \r\n ? setExpandedShortcutGroups(prev => [...prev, group.id])\r\n : setExpandedShortcutGroups(prev => [...prev.filter(esgId => esgId !== group.id)]);\r\n\r\n const onSelectShortcut = (selected: boolean, shortcut: Shortcut) => \r\n onChangeSelectedShortcuts(\r\n selected\r\n ? [...selectedShortcuts, shortcut] \r\n : [...selectedShortcuts.filter(s => s.id !== shortcut.id)]\r\n );\r\n\r\n const onSelectShortcutGroup = (selected: boolean, shortcutGroup: ShortcutGroup) => {\r\n onChangeSelectedShortcutGroups(\r\n selected\r\n ? [...selectedShortcutGroups, shortcutGroup]\r\n : [...selectedShortcutGroups.filter(sg => sg.id !== shortcutGroup.id)]\r\n );\r\n\r\n const shortcutsFromShortcutGroup = filteredShortcutFormat.find(sgts => sgts.shortcutGroup.id === shortcutGroup.id)?.shortcuts ?? [];\r\n\r\n if (selected) {\r\n onChangeSelectedShortcuts([...selectedShortcuts, ...shortcutsFromShortcutGroup.filter(sfsg => !selectedShortcuts.map(s => s.id).includes(sfsg.id))]);\r\n }\r\n else {\r\n onChangeSelectedShortcuts([...selectedShortcuts.filter(s => !shortcutsFromShortcutGroup.map(sfsg => sfsg.id).includes(s.id))]);\r\n }\r\n }\r\n\r\n const getTableBody = (): JSX.Element => {\r\n const isExpanded = (groupId: string) => {\r\n return expandedShortcutGroups.findIndex((gId: string) => gId === groupId) !== -1;\r\n };\r\n\r\n return \r\n {\r\n filteredShortcutFormat\r\n .map(f => \r\n \r\n )\r\n }\r\n ;\r\n };\r\n\r\n const getList = (): JSX.Element =>\r\n <>\r\n {\r\n hasFiltersApplied &&\r\n Results\r\n }\r\n \r\n \r\n \r\n {getTableHeader()}\r\n \r\n \r\n {getTableBody()}\r\n \r\n
    \r\n
    \r\n ;\r\n\r\n const getTableContents = (): JSX.Element => {\r\n if (isFetching || isUpdating) {\r\n return ;\r\n }\r\n else if (filteredShortcutFormat.length === 0) {\r\n return \r\n {getList()}\r\n {}\r\n ;\r\n }\r\n else {\r\n return getList();\r\n }\r\n };\r\n\r\n return getTableContents();\r\n};","import React from \"react\";\r\nimport { Grid, Typography } from \"@mui/material\";\r\n\r\nconst GRID_ROW_WIDTH = 12;\r\nconst DEFAULT_LABEL_WIDTH = 3;\r\nconst DEFAULT_FIELD_WIDTH = GRID_ROW_WIDTH - DEFAULT_LABEL_WIDTH;\r\n\r\ninterface IDialogFieldProps {\r\n fieldName: string | JSX.Element;\r\n fieldInput: JSX.Element;\r\n labelWidth?: number;\r\n fieldWidth?: number;\r\n mandatory?: boolean;\r\n fieldLabelGridClassName?: string;\r\n fieldInputGridClassName?: string;\r\n}\r\n\r\n// TODO: consolidate with MandatoryField?\r\nconst DialogField: React.FunctionComponent = (props) => {\r\n const fieldWidth = props.labelWidth && props.labelWidth < GRID_ROW_WIDTH ? GRID_ROW_WIDTH - props.labelWidth : DEFAULT_FIELD_WIDTH;\r\n\r\n return (\r\n \r\n \r\n {\r\n typeof props.fieldName === \"string\" \r\n ? \r\n {props.fieldName}\r\n \r\n : props.fieldName\r\n }\r\n {\r\n props.mandatory &&\r\n \r\n *\r\n \r\n }\r\n \r\n \r\n {props.fieldInput}\r\n \r\n \r\n );\r\n};\r\n\r\nexport default DialogField;","import React from \"react\";\r\nimport { Autocomplete, AutocompleteRenderInputParams, InputAdornment, TextField, Typography } from \"@mui/material\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport { IdNamePair } from \"../models\";\r\n\r\ninterface IAutocompleteSearchProps {\r\n searchableItems: IdNamePair[];\r\n currentItem: IdNamePair;\r\n onChange: (item: IdNamePair | null) => void;\r\n itemListHeight?: number;\r\n maxItemsVisible?: number;\r\n placeholderText?: string;\r\n isLoading?: boolean;\r\n isLoadingText?: React.ReactNode;\r\n}\r\n\r\nconst AutocompleteSearch: React.FC = ({\r\n searchableItems,\r\n currentItem,\r\n onChange,\r\n itemListHeight,\r\n maxItemsVisible,\r\n placeholderText,\r\n isLoading,\r\n isLoadingText,\r\n}) => {\r\n const LIST_ITEM_HEIGHT = itemListHeight ?? 36;\r\n const ITEMS_VISIBLE = maxItemsVisible ?? 5;\r\n\r\n const searchIcon = (icon : React.ReactNode) : JSX.Element => \r\n \r\n \r\n \r\n \r\n {icon}\r\n ;\r\n\r\n const renderTextInput = (params : AutocompleteRenderInputParams) : JSX.Element => \r\n ;\r\n\r\n return No matches found}\r\n options={searchableItems}\r\n value={currentItem}\r\n onChange={(_, item) => onChange(item)}\r\n ListboxProps={{ style: { maxHeight: LIST_ITEM_HEIGHT * ITEMS_VISIBLE } }}\r\n isOptionEqualToValue={(option, value) => option.id === value.id || value.id === \"\"}\r\n renderInput={(params : AutocompleteRenderInputParams) => renderTextInput(params)}\r\n getOptionLabel={option => option.name}\r\n renderOption={(props, option) => \r\n
  • \r\n {option.name}\r\n
  • \r\n }\r\n loading={isLoading}\r\n loadingText={isLoadingText}\r\n />;\r\n};\r\n\r\nexport default AutocompleteSearch;\r\n","import React from \"react\";\r\nimport { ShortcutGroup } from \"modules/shortcuts/models\";\r\nimport AutocompleteSearch from \"modules/common/components/autocompleteSearch\";\r\nimport LoadingCircle from \"modules/common/components/loadingCircle\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\ninterface IShortcutGroupSearchProps {\r\n shortcutGroupValue: ShortcutGroup | undefined;\r\n onChangeShortcutGroupValue: (newGroup: ShortcutGroup | null) => void;\r\n}\r\n\r\nconst ShortcutGroupSearch: React.FC = ({\r\n shortcutGroupValue,\r\n onChangeShortcutGroupValue\r\n}) => {\r\n const { originalShortcutFormat, isLoadingOriginalShortcutFormat } = useSelector((state: GlobalApplicationState) => state.shortcuts);\r\n const allShortcutGroups = originalShortcutFormat.flatMap(f => f.shortcutGroup);\r\n\r\n return onChangeShortcutGroupValue(allShortcutGroups.find(sg => sg.id === item?.id) ?? null)}\r\n placeholderText=\"Search and select shortcut group\"\r\n isLoading={isLoadingOriginalShortcutFormat}\r\n isLoadingText={
    }\r\n />;\r\n};\r\n\r\nexport default ShortcutGroupSearch;\r\n","export const isUrlValid = (url: string): boolean => {\r\n try {\r\n new URL(url);\r\n return true;\r\n }\r\n catch {\r\n return false;\r\n }\r\n}","import { TextField, TextFieldProps } from \"@mui/material\";\r\nimport React, { useState } from \"react\";\r\nimport { InputCounter } from \"./inputCounter\";\r\n\r\ntype ITextFieldWithInputCounterProps = TextFieldProps & {\r\n inputDivStyle?: React.CSSProperties;\r\n maxCount: number;\r\n value: string;\r\n}\r\n\r\nconst TextFieldWithInputCounter: React.FC = ({\r\n inputDivStyle,\r\n variant,\r\n multiline,\r\n value,\r\n onChange,\r\n inputProps,\r\n style,\r\n size,\r\n error,\r\n InputProps,\r\n maxCount\r\n}) => {\r\n const [isFocused, setIsFocused] = useState(false);\r\n \r\n return
    \r\n setIsFocused(true)}\r\n onBlur={() => setIsFocused(false)}\r\n />\r\n \r\n
    ;\r\n};\r\n\r\nexport default TextFieldWithInputCounter;\r\n","import React, { useMemo } from \"react\";\r\nimport { Checkbox, FormControlLabel, Grid, IconButton, InputAdornment, TextField } from \"@mui/material\";\r\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew';\r\nimport DialogField from \"modules/common/components/dialogField\";\r\nimport { MAX_SHORTCUT_NAME_LENGTH, ShortcutGroup, ShortcutUpdateModelv1 } from \"modules/shortcuts/models\";\r\nimport ShortcutGroupSearch from \"./shortcutGroupSearch\";\r\nimport HoverText from \"modules/documents/components/action-buttons/hoverText\";\r\nimport { Audience } from \"modules/audiences\";\r\nimport ChipList from \"modules/common/components/chipList\";\r\nimport { isUrlValid } from \"utils/isUrlValid\";\r\nimport TextFieldWithInputCounter from \"modules/common/components/forms/inputs/textFieldWithInputCounter\";\r\nimport AddIcon from \"@mui/icons-material/Add\";\r\nimport AudienceSearchCallout from \"modules/common/components/audienceSearchCallout\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\n\r\nimport \"../../styles/shortcutDialogBody.sass\";\r\ninterface IShortcutDialogBodyProps {\r\n input: ShortcutUpdateModelv1;\r\n setInput: React.Dispatch>;\r\n availableAudiences: Audience[];\r\n}\r\n\r\nconst ShortcutDialogBody: React.FC = ({\r\n input,\r\n setInput,\r\n availableAudiences\r\n}) => {\r\n const [innerUrlVal, setInnerUrlVal] = React.useState(input.url);\r\n const allShortcutGroups = useSelector((state: GlobalApplicationState) => state.shortcuts.originalShortcutFormat.flatMap(f => f.shortcutGroup));\r\n \r\n const selectedShortcutGroup = React.useMemo(\r\n () => allShortcutGroups.find(g => g.id === input.groupId), \r\n [input.groupId, allShortcutGroups]\r\n );\r\n\r\n const inputAudienceSimpleTags = useMemo(\r\n () => input.audiences.map(aId => ({ id: aId, name: availableAudiences.find(a => a.id === aId)?.displayName ?? \"\" })), \r\n [input.audiences, availableAudiences]\r\n );\r\n\r\n const getNameField = () => \r\n {\r\n e.persist();\r\n setInput(prev => ({ ...prev, name: e.target.value }));\r\n }}\r\n variant=\"outlined\"\r\n size=\"small\"\r\n fullWidth\r\n multiline={false}\r\n inputProps={{ style: { fontSize: '1rem' }}}\r\n style={{ minHeight: 40 }}\r\n maxCount={MAX_SHORTCUT_NAME_LENGTH}\r\n />;\r\n\r\n const onChangeShortcutGroupValue = (newGroup: ShortcutGroup | null) => {\r\n setInput(prev => ({ ...prev, groupId: newGroup?.id }));\r\n }\r\n\r\n const onBlurUrl = (e: React.FocusEvent) => {\r\n let urlVal = innerUrlVal;\r\n\r\n if (urlVal && !urlVal.startsWith(\"http\") && !isUrlValid(urlVal)) {\r\n urlVal = `https://${urlVal}`;\r\n }\r\n\r\n setInnerUrlVal(urlVal);\r\n setInput(prev => ({ ...prev, url: urlVal }));\r\n }\r\n\r\n const getUrlField = (): JSX.Element =>\r\n <>\r\n setInnerUrlVal(e.target.value)}\r\n onBlur={onBlurUrl}\r\n size=\"small\"\r\n variant=\"outlined\"\r\n InputProps={{\r\n endAdornment: input.url && \r\n \r\n window.open(input.url, \"_blank\")}>\r\n \r\n \r\n \r\n }}\r\n inputProps={{\r\n style: {\r\n fontSize: '1rem'\r\n }\r\n }}\r\n style={{ minHeight: 40 }}\r\n fullWidth\r\n />\r\n setInput(prev => ({...prev, openInNewWindow: checked}))}\r\n />\r\n } \r\n label=\"Open in new tab\"\r\n className=\"open-in-new-tab-label\"\r\n />\r\n ;\r\n\r\n const getAudienceField = (): JSX.Element => \r\n
    \r\n ({ id: a.id, name: a.displayName }))}\r\n selectedOptions={inputAudienceSimpleTags}\r\n onAudienceFilterChange={aud => setInput(prev => ({ ...prev, audiences: aud.map(a => a.id) }))}\r\n buttonStyle={{\r\n buttonClassName: \"shortcuts-edit-audiences-button\",\r\n buttonText: \"Edit audiences\",\r\n startIcon: ,\r\n }}\r\n />\r\n
    \r\n setInput(prev => ({...prev, audiences: prev.audiences.filter(id => id !== aud.id)}))}\r\n truncateAtIndex={4}\r\n />\r\n
    \r\n
    ;\r\n\r\n const getAudienceFieldNameComponent = (): JSX.Element => \r\n \r\n Select audiences to make this shortcut private to specific employees.\r\n ;\r\n \r\n return \r\n \r\n \r\n \r\n }\r\n mandatory\r\n />\r\n \r\n \r\n \r\n ;\r\n};\r\n\r\nexport default ShortcutDialogBody;\r\n","import { Breakpoint, Button, Dialog, DialogActions, DialogContent, DialogTitle, IconButton } from \"@mui/material\";\r\nimport React from \"react\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\n\r\nimport \"../../styles/dialogSkeleton.sass\";\r\n\r\ninterface IDialogSkeletonProps {\r\n show: boolean;\r\n onClose: () => void;\r\n onDialogActionButtonClick: () => void;\r\n dialogTitle: string;\r\n dialogActionButtonLabel: string;\r\n disableActionButton?: boolean;\r\n dialogActionButtonClassName?: string;\r\n dialogPaperClassName?: string;\r\n maxWidth?: false | Breakpoint;\r\n dialogContentClassName?: string;\r\n}\r\n\r\nconst DialogSkeleton: React.FC = ({\r\n show,\r\n onClose,\r\n onDialogActionButtonClick,\r\n dialogTitle,\r\n dialogActionButtonLabel,\r\n disableActionButton = false,\r\n dialogActionButtonClassName,\r\n dialogPaperClassName,\r\n maxWidth = false,\r\n dialogContentClassName,\r\n children\r\n}) => {\r\n const getDialogHeader = (): JSX.Element =>\r\n \r\n
    \r\n {dialogTitle}\r\n \r\n \r\n \r\n
    \r\n
    ;\r\n\r\n const getDialogFooter = (): JSX.Element =>\r\n \r\n \r\n \r\n {dialogActionButtonLabel}\r\n \r\n ;\r\n\r\n return \r\n {getDialogHeader()}\r\n \r\n {children}\r\n \r\n {getDialogFooter()}\r\n ;\r\n};\r\n\r\nexport default DialogSkeleton;\r\n","import React, { useEffect, useMemo, useState } from \"react\";\r\nimport ShortcutDialogBody from \"./shortcutDialogBody\";\r\nimport { ShortcutUpdateModelv1, defaultShortcut } from \"modules/shortcuts/models\";\r\nimport { Audience } from \"modules/audiences\";\r\nimport DialogSkeleton from \"./dialogSkeleton\";\r\nimport useIsMounted from \"modules/common/hooks/useIsMounted\";\r\nimport { isUrlValid } from \"utils/isUrlValid\";\r\nimport ShallowEquals from \"utils/shallowEquals\";\r\n\r\ninterface IShortcutDialogSkeletonProps {\r\n show: boolean;\r\n onClose: () => void;\r\n onDialogActionButtonClick: (input: ShortcutUpdateModelv1) => void;\r\n audiences: Audience[];\r\n input?: ShortcutUpdateModelv1;\r\n dialogTitle: string;\r\n dialogActionButtonLabel: string;\r\n disableActionButtonIfInputNotChanged?: boolean;\r\n}\r\n\r\nconst ShortcutDialogSkeleton: React.FC = ({\r\n show,\r\n onClose,\r\n onDialogActionButtonClick,\r\n audiences,\r\n input = defaultShortcut,\r\n dialogTitle,\r\n dialogActionButtonLabel,\r\n disableActionButtonIfInputNotChanged\r\n}) => {\r\n const [previousShortcutInput, setPreviousShortcutInput] = useState(input);\r\n const [shortcutInput, setShortcutInput] = useState(input);\r\n const isMounted = useIsMounted();\r\n\r\n const hasShortcutInputChanged = useMemo(\r\n () => {\r\n if (disableActionButtonIfInputNotChanged === undefined) \r\n return true;\r\n\r\n const audienceIsEqual = (newAudiences: string[]): boolean => { \r\n if (newAudiences.length !== shortcutInput.audiences.length)\r\n return false;\r\n \r\n const originalAudIdSet = new Set(shortcutInput.audiences);\r\n \r\n return newAudiences.every(id => originalAudIdSet.has(id));\r\n }\r\n \r\n return !ShallowEquals(previousShortcutInput.groupId, shortcutInput.groupId) ||\r\n !ShallowEquals(previousShortcutInput.name, shortcutInput.name) ||\r\n !ShallowEquals(previousShortcutInput.url, shortcutInput.url) ||\r\n !ShallowEquals(previousShortcutInput.openInNewWindow, shortcutInput.openInNewWindow) ||\r\n !audienceIsEqual(previousShortcutInput.audiences);\r\n }, \r\n [disableActionButtonIfInputNotChanged, previousShortcutInput, shortcutInput]\r\n );\r\n\r\n useEffect(() => {\r\n setShortcutInput(input);\r\n }, [isMounted, input]);\r\n\r\n const isNotFilled = !shortcutInput.groupId?.trim() ||\r\n !shortcutInput.name?.trim() ||\r\n !shortcutInput.url?.trim() ||\r\n !isUrlValid(shortcutInput.url);\r\n\r\n const onDialogClose = () => {\r\n setShortcutInput(input);\r\n onClose();\r\n }\r\n\r\n const onDialogAction = () => {\r\n onDialogActionButtonClick(shortcutInput);\r\n setShortcutInput(input);\r\n }\r\n\r\n return \r\n \r\n ;\r\n};\r\n\r\nexport default ShortcutDialogSkeleton;","import React from \"react\";\r\nimport ShortcutDialogSkeleton from \"./shortcutDialogSkeleton\";\r\nimport { Shortcut, ShortcutUpdateModelv1 } from \"modules/shortcuts/models\";\r\nimport { Audience } from \"modules/audiences\";\r\n\r\ninterface IEditShortcutDialogProps {\r\n show: boolean;\r\n onClose: () => void;\r\n onUpdateShortcutFromInput: (input: ShortcutUpdateModelv1) => void;\r\n audiences: Audience[];\r\n shortcut: Shortcut;\r\n shortcutGroupId: string;\r\n}\r\n\r\nconst EditShortcutDialog: React.FC = ({\r\n show,\r\n onClose,\r\n onUpdateShortcutFromInput,\r\n audiences,\r\n shortcut,\r\n shortcutGroupId\r\n}) => {\r\n return ;\r\n};\r\n\r\nexport default EditShortcutDialog;\r\n","import { Grid } from \"@mui/material\";\r\nimport DialogField from \"modules/common/components/dialogField\";\r\nimport { MAX_SHORTCUT_GROUP_NAME_LENGTH } from \"modules/shortcuts/models\";\r\nimport React from \"react\";\r\nimport DialogSkeleton from \"./dialogSkeleton\";\r\nimport TextFieldWithInputCounter from \"modules/common/components/forms/inputs/textFieldWithInputCounter\";\r\n\r\nimport \"../../styles/shortcutGroupDialogSkeleton.sass\";\r\n\r\ninterface IShortcutGroupDialogSkeletonProps {\r\n show: boolean;\r\n onClose: () => void;\r\n onDialogActionButtonClick: (groupName: string) => void;\r\n shortcutGroupName?: string;\r\n dialogTitle: string;\r\n dialogActionButtonLabel: string;\r\n dialogFieldLabel: string;\r\n extraDialogField?: JSX.Element;\r\n dialogPaperClassName?: string;\r\n disableActionButtonIfInputNotChanged?: boolean;\r\n}\r\n\r\nconst ShortcutGroupDialogSkeleton: React.FC = ({\r\n show,\r\n onClose,\r\n onDialogActionButtonClick,\r\n shortcutGroupName = \"\",\r\n dialogTitle,\r\n extraDialogField,\r\n dialogFieldLabel,\r\n dialogActionButtonLabel,\r\n dialogPaperClassName,\r\n disableActionButtonIfInputNotChanged\r\n}) => {\r\n const [previousInternalShortcutGroupName, setPreviousInternalShortcutGroupName] = React.useState(shortcutGroupName);\r\n const [internalShortcutGroupName, setInternalShortcutGroupName] = React.useState(shortcutGroupName);\r\n\r\n const isNotFilled = !internalShortcutGroupName.trim();\r\n\r\n const onDialogClose = () => {\r\n setInternalShortcutGroupName(shortcutGroupName);\r\n onClose();\r\n }\r\n\r\n const onDialogAction = () => {\r\n onDialogActionButtonClick(internalShortcutGroupName);\r\n setInternalShortcutGroupName(shortcutGroupName);\r\n }\r\n\r\n const getNameField = (): JSX.Element => \r\n setInternalShortcutGroupName(e.target.value)}\r\n variant=\"outlined\"\r\n size=\"small\"\r\n fullWidth\r\n multiline={false}\r\n inputProps={{ style: { fontSize: '1rem' }}}\r\n style={{ minHeight: 40 }}\r\n maxCount={MAX_SHORTCUT_GROUP_NAME_LENGTH}\r\n />;\r\n\r\n return \r\n \r\n {extraDialogField}\r\n \r\n \r\n ;\r\n};\r\n\r\nexport default ShortcutGroupDialogSkeleton;\r\n","import React from \"react\";\r\nimport ShortcutGroupDialogSkeleton from \"./shortcutGroupDialogSkeleton\";\r\nimport DialogField from \"modules/common/components/dialogField\";\r\nimport { Typography } from \"@mui/material\";\r\n\r\nimport \"../../styles/editShortcutGroupDialog.sass\";\r\n\r\ninterface IEditShortcutGroupDialogProps {\r\n show: boolean;\r\n onClose: () => void;\r\n onEditShortcutGroupFromInput: (shortcutGroupName: string) => void;\r\n shortcutGroupName: string;\r\n}\r\n\r\nconst EditShortcutGroupDialog: React.FC = ({\r\n show,\r\n onClose,\r\n onEditShortcutGroupFromInput,\r\n shortcutGroupName\r\n}) => {\r\n const getExtraDialogField = (): JSX.Element => \r\n {shortcutGroupName}}\r\n labelWidth={4} \r\n fieldLabelGridClassName=\"edit-shortcut-group-field-label\"\r\n fieldInputGridClassName=\"edit-shortcut-group-field-input\"\r\n />;\r\n \r\n return ;\r\n};\r\n\r\nexport default EditShortcutGroupDialog;\r\n","import React, { useState } from \"react\";\r\nimport DialogSkeleton from \"./dialogSkeleton\";\r\nimport { Shortcut, ShortcutGroup } from \"modules/shortcuts/models\";\r\nimport ShortcutGroupSearch from \"./shortcutGroupSearch\";\r\nimport DialogField from \"modules/common/components/dialogField\";\r\nimport { Grid } from \"@mui/material\";\r\n\r\ninterface IMoveShortcutsDialogProps {\r\n show: boolean;\r\n onClose: () => void;\r\n onMoveSelectedShortcuts: (groupId: string, selectedShortcuts: Shortcut[]) => void;\r\n selectedShortcuts: Shortcut[];\r\n}\r\n\r\nconst MoveShortcutsDialog: React.FC = ({\r\n show,\r\n onClose,\r\n onMoveSelectedShortcuts,\r\n selectedShortcuts,\r\n}) => {\r\n const [selectedGroup, setSelectedGroup] = useState(undefined);\r\n\r\n const isNotFilled = !selectedGroup;\r\n\r\n const getGroupField = (): JSX.Element => \r\n setSelectedGroup(newGroup ?? undefined)}\r\n />;\r\n\r\n const dialogTitle = `Move ${selectedShortcuts.length > 1 ? `${selectedShortcuts.length} shortcuts` : selectedShortcuts[0]?.name}`;\r\n\r\n return onMoveSelectedShortcuts(selectedGroup!.id, selectedShortcuts)}\r\n dialogTitle={dialogTitle.length > 55 ? dialogTitle.substring(0, 52) + \"...\" : dialogTitle}\r\n dialogActionButtonLabel=\"Move\"\r\n disableActionButton={isNotFilled}\r\n >\r\n \r\n \r\n \r\n ;\r\n};\r\n\r\nexport default MoveShortcutsDialog;\r\n","import React from \"react\";\r\nimport DialogSkeleton from \"./dialogSkeleton\";\r\nimport { Shortcut, ShortcutGroup } from \"modules/shortcuts/models\";\r\nimport { Typography } from \"@mui/material\";\r\n\r\nimport \"../../styles/deleteShortcutsDialog.sass\";\r\n\r\ninterface IDeleteShortcutsDialogProps {\r\n show: boolean;\r\n onClose: () => void;\r\n onDeleteSelectedShortcuts: (shortcutsToDelete: Shortcut[], shortcutGroupsToDelete: ShortcutGroup[]) => void;\r\n shortcutsToDelete: Shortcut[];\r\n shortcutGroupsToDelete: ShortcutGroup[];\r\n}\r\n\r\nconst DeleteShortcutsDialog: React.FC = ({\r\n show,\r\n onClose,\r\n onDeleteSelectedShortcuts,\r\n shortcutsToDelete,\r\n shortcutGroupsToDelete\r\n}) => {\r\n const [dialogTitle, setDialogTitle] = React.useState(\"\");\r\n const [shortcutGroupBodyText, setShortcutGroupBodyText] = React.useState(\"\");\r\n const [shortcutBodyText, setShortcutBodyText] = React.useState(\"\");\r\n\r\n const setDialogTitleAndBody = () => {\r\n let dialogTitle = \"\";\r\n let dialogBodyShortcutGroup = \"\";\r\n let dialogBodyShortcut = \"\";\r\n\r\n const shortcutGroupPlural = shortcutGroupsToDelete.length > 1 ? 's' : '';\r\n const shortcutPlural = shortcutsToDelete.length > 1 ? 's' : '';\r\n\r\n if (shortcutsToDelete.length > 0 && shortcutGroupsToDelete.length > 0) {\r\n dialogTitle = `Delete Shortcut Group${shortcutGroupPlural} and Shortcut${shortcutPlural}`;\r\n dialogBodyShortcutGroup = `${shortcutGroupsToDelete.length} shortcut group${shortcutGroupPlural}`;\r\n dialogBodyShortcut = `${shortcutsToDelete.length} shortcut${shortcutPlural}`;\r\n }\r\n else if (shortcutGroupsToDelete.length > 0) {\r\n dialogTitle = `Delete Shortcut Group${shortcutGroupPlural}`;\r\n dialogBodyShortcutGroup = `${shortcutGroupsToDelete.length} shortcut group${shortcutGroupPlural}`;\r\n }\r\n else if (shortcutsToDelete.length > 0) {\r\n dialogTitle = `Delete Shortcut${shortcutPlural}`;\r\n dialogBodyShortcut = shortcutsToDelete.length === 1 ? `${shortcutsToDelete[0].name}` : `${shortcutsToDelete.length} shortcut${shortcutPlural}`;\r\n }\r\n\r\n setDialogTitle(dialogTitle);\r\n setShortcutGroupBodyText(dialogBodyShortcutGroup);\r\n setShortcutBodyText(dialogBodyShortcut);\r\n }\r\n\r\n React.useEffect(() => { \r\n setDialogTitleAndBody();\r\n },\r\n [shortcutsToDelete, shortcutGroupsToDelete]\r\n );\r\n\r\n return onDeleteSelectedShortcuts(shortcutsToDelete, shortcutGroupsToDelete)}\r\n dialogTitle={dialogTitle}\r\n dialogActionButtonLabel=\"Delete\"\r\n dialogActionButtonClassName=\"shortcuts-delete-button\"\r\n dialogContentClassName=\"delete-shortcuts-content\"\r\n maxWidth=\"sm\"\r\n >\r\n \r\n You're about to permanently delete {shortcutGroupBodyText}{shortcutGroupBodyText !== \"\" && shortcutBodyText !== \"\" && \" and \"}{shortcutBodyText}. You cannot undo this action.\r\n
    \r\n
    \r\n Do you want to continue?\r\n \r\n ;\r\n};\r\n\r\nexport default DeleteShortcutsDialog;\r\n","import TabContent from 'pages/common/tabContent';\r\nimport React, { useMemo, useState } from 'react';\r\nimport { ShortcutsToolbar } from './shortcutsToolbar';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { Shortcut, ShortcutAction, ShortcutGroup, ShortcutGroupAction, ShortcutGroupToShortcuts, ShortcutUpdateModelv1, ShortcutsFilterv1, defaultShortcutsFilter } from '../models';\r\nimport { ShortcutsFilter } from './shortcutsFilter';\r\nimport { ShortcutsList } from './shortcutsList/shortcutsList';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport EditShortcutDialog from './dialogs/editShorcutDialog';\r\nimport EditShortcutGroupDialog from './dialogs/editShortcutGroupDialog';\r\nimport MoveShortcutsDialog from './dialogs/moveShortcutsDialog';\r\nimport { Audience } from 'modules/audiences';\r\nimport DeleteShortcutsDialog from './dialogs/deleteShortcutsDialog';\r\nimport { bulkDeleteShortcutsAndGroups, bulkUpdateShortcuts, updateShortcut, updateShortcutGroup } from '../reducer';\r\nimport ShallowEquals from 'utils/shallowEquals';\r\n\r\ninterface IShortcutsListingProps {\r\n onCreateShortcut: (shortcutGroup?: ShortcutGroup) => void;\r\n filteredShortcutFormat: ShortcutGroupToShortcuts[];\r\n audiences: Audience[];\r\n onFilterChange: (filter: ShortcutsFilterv1) => void;\r\n expandedShortcutGroups: string[];\r\n setExpandedShortcutGroups: React.Dispatch>;\r\n shortcutsFilter: ShortcutsFilterv1;\r\n}\r\n\r\nconst ShortcutsListing: React.FC = ({\r\n onCreateShortcut,\r\n audiences,\r\n filteredShortcutFormat,\r\n onFilterChange,\r\n expandedShortcutGroups,\r\n setExpandedShortcutGroups,\r\n shortcutsFilter\r\n}) => {\r\n const [selectedShortcuts, setSelectedShortcuts] = useState([]);\r\n const [selectedShortcutGroup, setSelectedShortcutGroup] = useState(undefined);\r\n const [selectedSingleShortcut, setSelectedSingleShortcut] = useState(undefined);\r\n const [selectedShortcutGroups, setSelectedShortcutGroups] = useState([]);\r\n const [selectedShortcutsToDelete, setSelectedShortcutsToDelete] = useState([]);\r\n const [hiddenSelectedShortcuts, setHiddenSelectedShortcuts] = useState([]);\r\n const [showEditShortcutDialog, setShowEditShortcutDialog] = useState(false);\r\n const [showEditShortcutGroupDialog, setShowEditShortcutGroupDialog] = useState(false);\r\n const [showMoveShortcutsDialog, setShowMoveShortcutsDialog] = useState(false);\r\n const [showDeleteShortcutsDialog, setShowDeleteShorcutsDialog] = useState(false);\r\n const dispatch = useDispatch();\r\n\r\n const hasFiltersApplied = useMemo(\r\n () => {\r\n const filterStateIsEqual = (): boolean => shortcutsFilter.state.every(state => defaultShortcutsFilter.state.includes(state));\r\n const filterAudienceIsEqual = (): boolean => shortcutsFilter.audiences.every(audience => defaultShortcutsFilter.audiences.includes(audience));\r\n return !ShallowEquals(shortcutsFilter.searchText, defaultShortcutsFilter.searchText) ||\r\n !filterStateIsEqual() ||\r\n !filterAudienceIsEqual();\r\n }, \r\n [shortcutsFilter, defaultShortcutsFilter]\r\n );\r\n\r\n const {\r\n isFetching,\r\n isUpdating,\r\n originalShortcutFormat\r\n } = useSelector((state: GlobalApplicationState) => state.shortcuts);\r\n \r\n const onDeleteSelectedItems = (shortcutsToDelete: Shortcut[], shortcutGroupsToDelete: ShortcutGroup[]) => {\r\n deleteShortcutsAndShortcutGroups(shortcutsToDelete, shortcutGroupsToDelete);\r\n }\r\n\r\n const deleteShortcutsAndShortcutGroups = (shortcutsToDelete: Shortcut[], shortcutGroupsToDelete: ShortcutGroup[]) => {\r\n setShowDeleteShorcutsDialog(false);\r\n dispatch(bulkDeleteShortcutsAndGroups({ \r\n shortcutIds: shortcutsToDelete.map(s => s.id), \r\n shortcutGroupIds: shortcutGroupsToDelete.map(sg => sg.id), \r\n filter: shortcutsFilter,\r\n successMsg: \"Successfully deleted.\"\r\n }));\r\n resetSelectionState();\r\n }\r\n \r\n const onToolbarEditSelectedShortcut = () => {\r\n if (selectedShortcuts.length === 1) {\r\n setSelectedSingleShortcut(selectedShortcuts[0]);\r\n setShowEditShortcutDialog(true);\r\n }\r\n }\r\n\r\n const onToolbarDeleteSelectedShortcuts = () => {\r\n // if they delete a shortcut group, make sure the shortcuts within the group are also automatically selected to be deleted\r\n const selectedShortcutGroupIds = selectedShortcutGroups.map(sg => sg.id);\r\n // we use the original shortcut format instead of the filtered one because the filtered one may not have all the shortcuts listed\r\n const selectedShortcutGroupsToShorcuts = originalShortcutFormat.filter(f => selectedShortcutGroupIds.includes(f.shortcutGroup.id));\r\n const allSelectedShortcutsFromSelectedGroups = selectedShortcutGroupsToShorcuts.flatMap(sgts => sgts.shortcuts);\r\n const allSelectedShortcuts = [...selectedShortcuts, ...allSelectedShortcutsFromSelectedGroups.filter(s => !selectedShortcuts.find(ss => ss.id === s.id))];\r\n \r\n if (hasFiltersApplied) {\r\n const filteredSelectedShortcutsFromSelectedGroups = filteredShortcutFormat.filter(f => selectedShortcutGroupIds.includes(f.shortcutGroup.id)).flatMap(sgts => sgts.shortcuts);\r\n // these shortcuts are the ones added to the delete selection that are hidden because the filtered shortcuts format doesn't show them\r\n const hiddenSelectedShortcuts = allSelectedShortcutsFromSelectedGroups.filter(s => !filteredSelectedShortcutsFromSelectedGroups.find(ss => ss.id === s.id));\r\n setHiddenSelectedShortcuts(hiddenSelectedShortcuts);\r\n }\r\n\r\n setSelectedShortcuts(allSelectedShortcuts);\r\n setSelectedShortcutsToDelete(allSelectedShortcuts);\r\n setShowDeleteShorcutsDialog(true)\r\n }\r\n\r\n const onEditSelectedShortcutGroup = (newShortcutGroupName: string) => {\r\n updateSelectShortcutGroupName(selectedShortcutGroup!, newShortcutGroupName);\r\n }\r\n\r\n const onEditSelectedShortcut = (input: ShortcutUpdateModelv1) => {\r\n updateSelectedShortcut(input);\r\n }\r\n\r\n const updateSelectedShortcut = async (input: ShortcutUpdateModelv1) => {\r\n setShowEditShortcutDialog(false);\r\n dispatch(updateShortcut({\r\n shortcutId: selectedSingleShortcut?.id!, \r\n shortcutUpdateModel: input, \r\n filter: shortcutsFilter, \r\n successMsg: \"Successfully saved changes.\"\r\n }));\r\n resetSelectionState();\r\n }\r\n\r\n const updateSelectShortcutGroupName = async (shortcutGroup: ShortcutGroup, newName: string) => {\r\n setShowEditShortcutGroupDialog(false);\r\n dispatch(updateShortcutGroup({\r\n shortcutGroupId: shortcutGroup.id, \r\n name: newName, \r\n filter: shortcutsFilter, \r\n successMsg: \"Successfully updated shortcut group.\" \r\n }));\r\n resetSelectionState();\r\n }\r\n\r\n const onMoveSelectedItems = (selectedGroupId: string, selectedShortcutsToMove: Shortcut[]) => {\r\n moveShortcutsToNewGroup(selectedShortcutsToMove, selectedGroupId);\r\n }\r\n\r\n const moveShortcutsToNewGroup = async (shortcutsToMove: Shortcut[], selectedGroupId: string) => {\r\n setShowMoveShortcutsDialog(false);\r\n const shortcutToMoveIds = shortcutsToMove.map(s => s.id);\r\n dispatch(bulkUpdateShortcuts({ \r\n shortcutIds: shortcutsToMove.map(s => s.id), \r\n groupIdToMoveTo: selectedGroupId, \r\n scrollToId: shortcutToMoveIds[shortcutToMoveIds.length-1],\r\n successMsg: \"Successfully moved to new shortcut group.\",\r\n filter: shortcutsFilter\r\n }));\r\n resetSelectionState();\r\n }\r\n\r\n const onChangeStateOfSelectedShortcuts = (newState: boolean) => {\r\n changeStateOfShortcuts(selectedShortcuts, newState);\r\n }\r\n\r\n const changeStateOfShortcuts = async (shortcutsToChange: Shortcut[], newState: boolean) => {\r\n dispatch(bulkUpdateShortcuts({ \r\n shortcutIds: shortcutsToChange.map(s => s.id), \r\n setIsEnabled: newState,\r\n successMsg: `Successfully ${newState ? \"enabled\" : \"disabled\" } ${shortcutsToChange.length > 1 ? \"selected shortcuts\" : \"shortcut\"}.`,\r\n filter: shortcutsFilter\r\n }));\r\n resetSelectionState();\r\n }\r\n\r\n const resetSelectionState = () => {\r\n setSelectedShortcuts([]);\r\n setSelectedShortcutGroups([]);\r\n setSelectedShortcutGroup(undefined);\r\n setSelectedSingleShortcut(undefined);\r\n setSelectedShortcutsToDelete([]);\r\n onFilterChange(shortcutsFilter);\r\n }\r\n\r\n // for actions on a single shortcut\r\n const onShortcutAction = (shortcut: Shortcut, shortcutAction: ShortcutAction) => {\r\n switch (shortcutAction) {\r\n case ShortcutAction.EDIT:\r\n setSelectedSingleShortcut(shortcut);\r\n setShowEditShortcutDialog(true);\r\n break;\r\n case ShortcutAction.DELETE:\r\n setSelectedSingleShortcut(shortcut);\r\n setShowDeleteShorcutsDialog(true);\r\n break;\r\n case ShortcutAction.DISABLE:\r\n changeStateOfShortcuts([shortcut], false);\r\n break;\r\n case ShortcutAction.ENABLE:\r\n changeStateOfShortcuts([shortcut], true);\r\n break;\r\n case ShortcutAction.MOVE:\r\n setSelectedSingleShortcut(shortcut);\r\n setShowMoveShortcutsDialog(true);\r\n break;\r\n }\r\n }\r\n\r\n // for actions on a single shortcut group\r\n const onShortcutGroupAction = (shortcutGroup: ShortcutGroup, shortcutGroupAction: ShortcutGroupAction) => {\r\n const shortcutsOfShortcutGroup = filteredShortcutFormat.find(sgts => sgts.shortcutGroup.id === shortcutGroup.id)?.shortcuts ?? [];\r\n\r\n switch (shortcutGroupAction){\r\n case ShortcutGroupAction.ADD_SHORTCUT:\r\n onCreateShortcut(shortcutGroup);\r\n break;\r\n case ShortcutGroupAction.EDIT:\r\n setSelectedShortcutGroup(shortcutGroup);\r\n setShowEditShortcutGroupDialog(true);\r\n break;\r\n case ShortcutGroupAction.DELETE:\r\n setSelectedShortcutGroup(shortcutGroup);\r\n setSelectedShortcutsToDelete(shortcutsOfShortcutGroup);\r\n setShowDeleteShorcutsDialog(true);\r\n break;\r\n case ShortcutGroupAction.DISABLE_ALL:\r\n changeStateOfShortcuts(shortcutsOfShortcutGroup, false);\r\n break;\r\n case ShortcutGroupAction.ENABLE_ALL:\r\n changeStateOfShortcuts(shortcutsOfShortcutGroup, true);\r\n break;\r\n }\r\n }\r\n\r\n const getToolbar = (): JSX.Element => \r\n setShowMoveShortcutsDialog(true)}\r\n onSelectedShortcutsStateChange={onChangeStateOfSelectedShortcuts}\r\n />\r\n\r\n const getFilter = (): JSX.Element =>\r\n ({ id: a.id, name: a.displayName }))}\r\n onFilterChange={onFilterChange}\r\n shortcutsFilter={shortcutsFilter}\r\n hasFiltersApplied={hasFiltersApplied}\r\n />;\r\n\r\n const getTableContents = (): JSX.Element => \r\n setSelectedShortcuts(s)}\r\n onChangeSelectedShortcutGroups={sg => setSelectedShortcutGroups(sg)}\r\n onShortcutAction={onShortcutAction}\r\n onShortcutGroupAction={onShortcutGroupAction}\r\n isFetching={isFetching}\r\n isUpdating={isUpdating}\r\n expandedShortcutGroups={expandedShortcutGroups}\r\n setExpandedShortcutGroups={setExpandedShortcutGroups}\r\n hasFiltersApplied={hasFiltersApplied}\r\n />\r\n\r\n const getDialogs = (): JSX.Element => \r\n \r\n {\r\n selectedSingleShortcut &&\r\n {\r\n setSelectedSingleShortcut(undefined); \r\n setShowEditShortcutDialog(false);\r\n }}\r\n onUpdateShortcutFromInput={onEditSelectedShortcut}\r\n audiences={audiences}\r\n shortcut={selectedSingleShortcut}\r\n shortcutGroupId={filteredShortcutFormat.find(f => !!f.shortcuts.find(s => s.id === selectedSingleShortcut.id))!.shortcutGroup.id}\r\n />\r\n }\r\n {\r\n selectedShortcutGroup && \r\n {\r\n setSelectedShortcutGroup(undefined);\r\n setShowEditShortcutGroupDialog(false);\r\n }}\r\n onEditShortcutGroupFromInput={onEditSelectedShortcutGroup}\r\n shortcutGroupName={selectedShortcutGroup.name}\r\n />\r\n } \r\n {\r\n (selectedShortcuts.length > 0 || selectedSingleShortcut) &&\r\n {\r\n setShowMoveShortcutsDialog(false);\r\n\r\n if (selectedSingleShortcut) \r\n setSelectedSingleShortcut(undefined);\r\n }}\r\n onMoveSelectedShortcuts={onMoveSelectedItems}\r\n selectedShortcuts={selectedSingleShortcut ? [selectedSingleShortcut] : selectedShortcuts}\r\n />\r\n }\r\n {\r\n setShowDeleteShorcutsDialog(false)\r\n\r\n if (selectedShortcutGroup) \r\n setSelectedShortcutGroup(undefined);\r\n\r\n if (selectedSingleShortcut) \r\n setSelectedSingleShortcut(undefined);\r\n\r\n // there's a special case where on a filtered shortcut format, if a user wants to delete a shortcut group, \r\n // all shortcuts within that group (even if it doesn't show in the filtered shortcut format) should be selected to be deleted\r\n // however, if they exit out of the delete dialog, then we will automatically de-select those shortcuts that were automatically selected / not \r\n // visible in the filtered shortcut format\r\n if (hasFiltersApplied) {\r\n // get only the selected shortcuts that we see -- in the filtered shortcut format\r\n // const selectedShortcutsInFilteredFormat = selectedShortcuts.filter(s => filteredShortcutFormat.flatMap(f => f.shortcuts).find(ss => ss.id === s.id));\r\n const selectedShortcutsInFilteredFormat = selectedShortcuts.filter(s => !hiddenSelectedShortcuts.find(ss => ss.id === s.id));\r\n\r\n // reset our selections to just what we see\r\n setSelectedShortcuts([...selectedShortcutsInFilteredFormat]);\r\n setSelectedShortcutsToDelete([...selectedShortcutsInFilteredFormat]);\r\n setHiddenSelectedShortcuts([]);\r\n }\r\n }}\r\n onDeleteSelectedShortcuts={onDeleteSelectedItems}\r\n shortcutsToDelete={selectedSingleShortcut ? [selectedSingleShortcut] : selectedShortcutsToDelete}\r\n shortcutGroupsToDelete={selectedSingleShortcut ? [] : selectedShortcutGroup ? [selectedShortcutGroup] : selectedShortcutGroups}\r\n />\r\n \r\n\r\n return \r\n {getToolbar()}\r\n {getFilter()}\r\n {getTableContents()}\r\n {getDialogs()}\r\n ;\r\n};\r\n\r\nexport default ShortcutsListing;","import React from \"react\";\r\nimport ShortcutGroupDialogSkeleton from \"./shortcutGroupDialogSkeleton\";\r\n\r\ninterface ICreateShortcutGroupDialogProps {\r\n show: boolean;\r\n onClose: () => void;\r\n onCreateShortcutGroupFromInput: (shortcutGroupName: string) => void;\r\n}\r\n\r\nconst CreateShortcutGroupDialog: React.FC = ({\r\n show,\r\n onClose,\r\n onCreateShortcutGroupFromInput\r\n}) => {\r\n return ;\r\n};\r\n\r\nexport default CreateShortcutGroupDialog;\r\n","import React from \"react\";\r\nimport { ShortcutUpdateModelv1, ShortcutGroup, defaultShortcut } from \"modules/shortcuts/models\";\r\nimport { Audience } from \"modules/audiences\";\r\nimport ShortcutDialogSkeleton from \"./shortcutDialogSkeleton\";\r\n\r\ninterface ICreateShortcutDialogProps {\r\n show: boolean;\r\n onClose: () => void;\r\n onCreateShortcutFromInput: (input: ShortcutUpdateModelv1) => void;\r\n audiences: Audience[];\r\n selectedShortcutGroup?: ShortcutGroup;\r\n}\r\n\r\nconst CreateShortcutDialog: React.FC = ({\r\n show,\r\n onClose,\r\n onCreateShortcutFromInput,\r\n audiences,\r\n selectedShortcutGroup\r\n}) => {\r\n return ;\r\n};\r\n\r\nexport default CreateShortcutDialog;\r\n","import React from \"react\";\r\n\r\ninterface IDropZoneProps {\r\n isHidden: boolean;\r\n}\r\n\r\nconst DropZone: React.FC = ({ isHidden }) =>
    ;\r\n\r\nexport default DropZone;\r\n","import { IconButton, Typography } from \"@mui/material\";\r\nimport DragIndicatorIcon from '@mui/icons-material/DragIndicator';\r\nimport React, { MouseEvent } from \"react\";\r\n\r\ninterface IDraggableNameContainerProps {\r\n divClassName: string;\r\n floatingClassName: string;\r\n divStyle: React.CSSProperties;\r\n name: string;\r\n nameClassName: string;\r\n iconClassName: string;\r\n onMouseDown?: () => void;\r\n onMouseMove: (e: MouseEvent) => void;\r\n}\r\n\r\nconst DraggableNameContainer: React.FC = ({\r\n divClassName,\r\n floatingClassName,\r\n divStyle,\r\n name,\r\n nameClassName,\r\n iconClassName,\r\n onMouseDown,\r\n onMouseMove\r\n}) => {\r\n return
    \r\n \r\n \r\n \r\n \r\n {name}\r\n \r\n
    ;\r\n};\r\n\r\nexport default DraggableNameContainer;\r\n","import { FlattenedShorcut } from \"modules/shortcuts/models\";\r\nimport React, { MouseEvent, useState } from \"react\";\r\nimport DropZone from \"./dropZone\";\r\nimport { useDragReorder } from \"modules/common/hooks/useDragReorder\";\r\nimport DraggableNameContainer from \"./draggableNameContainer\";\r\n\r\ninterface IDraggableFlatShortcutsFormatProps {\r\n flattenedFormat: FlattenedShorcut[];\r\n onDrop: (itemToMoveIdx: number, moveToItemId?: string, moveToitemIdx?: number) => void;\r\n onGroupMouseDown: (id: string) => void;\r\n onMouseMove: (e: MouseEvent, isDragging: boolean) => void;\r\n}\r\n\r\nconst DraggableFlatShortcutsFormat: React.FC = ({\r\n flattenedFormat,\r\n onDrop,\r\n onGroupMouseDown,\r\n onMouseMove\r\n}) => {\r\n const [flattenedShortcutDragged, setFlattenedShortcutDragged] = useState(null);\r\n\r\n const onItemDrop = (itemId?: string, itemIdx?: number) => {\r\n if (flattenedShortcutDragged === null) return;\r\n \r\n onDrop(flattenedShortcutDragged!, itemId, itemIdx);\r\n setFlattenedShortcutDragged(null);\r\n }\r\n \r\n const { mousePos, dropIdx } = useDragReorder({\r\n enabled: true,\r\n items: flattenedFormat,\r\n draggedIdx: flattenedShortcutDragged,\r\n onDrop: onItemDrop,\r\n dropZoneClassName: \"drop-zone\",\r\n mouseHandlerComponentClassName: \"shortcut-group-list\"\r\n });\r\n\r\n const onMouseDown = (index: number, flattenedShortcut: FlattenedShorcut) => {\r\n if (flattenedShortcut.isGroup){\r\n onGroupMouseDown(flattenedShortcut.id);\r\n }\r\n else {\r\n document.body.style.cursor = \"move\";\r\n setFlattenedShortcutDragged(index);\r\n }\r\n }\r\n\r\n return \r\n \r\n {\r\n flattenedFormat\r\n .map((fs, idx) => {\r\n const isFloating = flattenedShortcutDragged === idx;\r\n\r\n return \r\n onMouseDown(idx, fs)}\r\n onMouseMove={e => onMouseMove(e, flattenedShortcutDragged !== null)}\r\n />\r\n {flattenedShortcutDragged !== idx && }\r\n ;\r\n })\r\n }\r\n ;\r\n};\r\n\r\nexport default DraggableFlatShortcutsFormat;\r\n","import { ShortcutGroup } from \"modules/shortcuts/models\";\r\nimport React, { MouseEvent } from \"react\";\r\nimport DropZone from \"./dropZone\";\r\nimport { useDragReorder } from \"modules/common/hooks/useDragReorder\";\r\nimport DraggableNameContainer from \"./draggableNameContainer\";\r\n\r\ninterface IDraggableShortcutGroupsFormatProps {\r\n shortcutGroups: ShortcutGroup[];\r\n shortcutGroupDragged: number;\r\n onDrop: (itemToMoveIdx: number, moveToItemId?: string, moveToitemIdx?: number) => void;\r\n onMouseMove: (e: MouseEvent, isDragging: boolean) => void;\r\n}\r\n\r\nconst DraggableShortcutGroupsFormat: React.FC = ({\r\n shortcutGroups,\r\n shortcutGroupDragged,\r\n onDrop,\r\n onMouseMove\r\n}) => {\r\n const onItemDrop = (id?: string, idx?: number) => {\r\n onDrop(shortcutGroupDragged!, id, idx);\r\n }\r\n \r\n const { mousePos, dropIdx } = useDragReorder({\r\n enabled: true,\r\n items: shortcutGroups,\r\n draggedIdx: shortcutGroupDragged,\r\n onDrop: onItemDrop,\r\n dropZoneClassName: \"drop-zone\",\r\n mouseHandlerComponentClassName: \"shortcut-group-list\"\r\n });\r\n\r\n return \r\n \r\n {\r\n shortcutGroups.map((sg, idx) => {\r\n const isFloating = shortcutGroupDragged === idx;\r\n\r\n return \r\n onMouseMove(e, shortcutGroupDragged !== null)}\r\n />\r\n {shortcutGroupDragged !== idx && }\r\n \r\n })\r\n }\r\n ;\r\n};\r\n\r\nexport default DraggableShortcutGroupsFormat;\r\n","import { FlattenedShorcut, ShortcutGroupToShortcuts } from \"modules/shortcuts/models\";\r\nimport React, { MouseEvent, useRef, useState } from \"react\";\r\nimport DraggableFlatShortcutsFormat from \"./draggableFlatShortcutsFormat\";\r\nimport DraggableShortcutGroupsFormat from \"./draggableShortcutGroupsFormat\";\r\n\r\nimport \"../../styles/shortcutsFormatEditor.sass\";\r\n\r\ninterface IShortcutsFormatEditorProps {\r\n newShortcutFormat: ShortcutGroupToShortcuts[];\r\n setNewShortcutFormat: React.Dispatch>\r\n}\r\n\r\nconst ShortcutsFormatEditor: React.FC = ({\r\n newShortcutFormat,\r\n setNewShortcutFormat\r\n}) => {\r\n const [draggedGroupIdx, setDraggedGroupIdx] = useState(null);\r\n const scrollingContainerRef = useRef(null);\r\n const isScrolling = useRef(false);\r\n\r\n if (!newShortcutFormat) return <>;\r\n \r\n const starScrolling = (container: HTMLDivElement, direction: \"up\" | \"down\") => {\r\n let speed = 1;\r\n \r\n const step = () => {\r\n if (!isScrolling.current) return;\r\n \r\n if (direction === \"down\" && container.scrollTop + container.clientHeight < container.scrollHeight) {\r\n container.scrollTop += speed;\r\n requestAnimationFrame(step);\r\n } \r\n else if (direction === \"up\" && container.scrollTop > 0) {\r\n container.scrollTop -= speed;\r\n requestAnimationFrame(step);\r\n }\r\n };\r\n \r\n requestAnimationFrame(step);\r\n };\r\n\r\n const shortcutGroups = newShortcutFormat.map(sgts => sgts.shortcutGroup);\r\n const flattenedShortcutFormat: FlattenedShorcut[] = newShortcutFormat.flatMap(sgts => [\r\n {\r\n isGroup: true,\r\n ...sgts.shortcutGroup\r\n },\r\n ...sgts.shortcuts.map(s => ({\r\n isGroup: false,\r\n ...s\r\n }))\r\n ]);\r\n\r\n const onMouseMove = (event: MouseEvent, isDragging: boolean) => {\r\n if (!isDragging || !scrollingContainerRef.current) return;\r\n \r\n const container = scrollingContainerRef.current;\r\n const { clientHeight } = container;\r\n const bottomThreshold = clientHeight * 0.8;\r\n const topThreshold = clientHeight * 0.2;\r\n const mouseY = event.clientY - container.getBoundingClientRect().top;\r\n \r\n if (mouseY > bottomThreshold) {\r\n isScrolling.current = true;\r\n starScrolling(container, \"down\");\r\n } \r\n else if (mouseY < topThreshold) {\r\n isScrolling.current = true;\r\n starScrolling(container, \"up\");\r\n }\r\n else {\r\n isScrolling.current = false;\r\n }\r\n };\r\n\r\n const onGroupMouseDown = (groupId: string) => setDraggedGroupIdx(shortcutGroups.findIndex(sg => sg.id === groupId));\r\n\r\n const onShortcutDrop = (itemToMoveIdx: number, moveToItemId?: string, moveToItemIdx?: number) => {\r\n // if the move to index is the same as the original, don't process anything\r\n if (itemToMoveIdx === moveToItemIdx) return;\r\n\r\n const flattenedShortcutToMoveCopy = {...flattenedShortcutFormat[itemToMoveIdx]};\r\n\r\n let flattenedFormatCopy = [...flattenedShortcutFormat];\r\n\r\n // remove the shortcut\r\n flattenedFormatCopy.splice(itemToMoveIdx, 1);\r\n \r\n // case where we move the shortcut to the very end of the list\r\n if (moveToItemId === undefined && moveToItemIdx! >= flattenedShortcutFormat.length) {\r\n flattenedFormatCopy.push(flattenedShortcutToMoveCopy);\r\n }\r\n else if (moveToItemId) {\r\n // find the new index of the shortcut \r\n const moveToIdx = flattenedFormatCopy.findIndex(f => f.id === moveToItemId);\r\n\r\n // insert the removed shortcutgroup into the new space\r\n flattenedFormatCopy.splice(moveToIdx, 0, flattenedShortcutToMoveCopy);\r\n }\r\n\r\n // transform the flattened format copy back into the original format\r\n let newFormat: ShortcutGroupToShortcuts[] = [];\r\n\r\n for (const flattenedShortcut of flattenedFormatCopy) {\r\n if (flattenedShortcut.isGroup) {\r\n newFormat.push({shortcutGroup: {id: flattenedShortcut.id, name: flattenedShortcut.name}, shortcuts: []})\r\n }\r\n else {\r\n const shortcut = {\r\n id: flattenedShortcut.id,\r\n name: flattenedShortcut.name,\r\n audiences: flattenedShortcut.audiences ?? [],\r\n isEnabled: flattenedShortcut.isEnabled ?? false,\r\n url: flattenedShortcut.url ?? \"\",\r\n openInNewWindow: flattenedShortcut.openInNewWindow ?? true\r\n };\r\n\r\n newFormat[newFormat.length - 1].shortcuts.push(shortcut);\r\n }\r\n }\r\n\r\n setNewShortcutFormat(newFormat);\r\n }\r\n\r\n const onShortcutGroupDrop = (itemToMoveIdx: number, moveToItemId?: string, moveToItemIdx?: number) => {\r\n setDraggedGroupIdx(null);\r\n\r\n // if the move to index is the same as the original, don't process anything\r\n if (itemToMoveIdx === moveToItemIdx) return;\r\n\r\n const shortcutGroupToMoveCopy = {...newShortcutFormat[itemToMoveIdx]};\r\n let shortcutFormatCopy = [...newShortcutFormat.map(sgts => ({...sgts}))];\r\n\r\n // remove the shortcut group\r\n shortcutFormatCopy.splice(itemToMoveIdx, 1);\r\n\r\n // if the moveTo index is greater than the whole list, it means we're appending it to the end of the list.\r\n if (moveToItemId === undefined && moveToItemIdx! >= newShortcutFormat.length) {\r\n // append to the end of the list\r\n shortcutFormatCopy.push(shortcutGroupToMoveCopy);\r\n }\r\n else if (moveToItemId) {\r\n // find the new index of the shortcut group\r\n const moveToIdx = shortcutFormatCopy.findIndex(sgts => sgts.shortcutGroup.id === moveToItemId);\r\n\r\n // insert the removed shortcutgroup into the new space\r\n shortcutFormatCopy.splice(moveToIdx, 0, shortcutGroupToMoveCopy);\r\n }\r\n setNewShortcutFormat(shortcutFormatCopy);\r\n }\r\n\r\n return
    \r\n
    \r\n {\r\n draggedGroupIdx === null \r\n ? \r\n : \r\n }\r\n
    \r\n
    ;\r\n};\r\n\r\nexport default ShortcutsFormatEditor;\r\n","import { Button } from \"@mui/material\";\r\nimport React from \"react\";\r\n\r\ninterface IShortcutsOrganizeListHeaderButtonsProps {\r\n onCancel: () => void;\r\n onSaveFormat: () => void;\r\n}\r\n\r\nconst ShortcutsOrganizeListHeaderButtons: React.FC = ({\r\n onCancel,\r\n onSaveFormat\r\n}) => {\r\n return <>\r\n \r\n Cancel\r\n \r\n \r\n Save Changes\r\n \r\n ;\r\n};\r\n\r\nexport default ShortcutsOrganizeListHeaderButtons;\r\n","import React, { useEffect, useState } from 'react';\r\nimport BasePage from 'pages/common/basePage';\r\nimport Header from 'pages/common/header';\r\nimport MainContent from 'pages/common/mainContent';\r\nimport { ShortcutsHeaderButtons } from './components/shortcutsHeaderButtons';\r\nimport ShortcutsListing from './components/shortcutsListing';\r\nimport CreateShortcutGroupDialog from './components/dialogs/createShortcutGroupDialog';\r\nimport CreateShortcutDialog from './components/dialogs/createShortcutDialog';\r\nimport { ShortcutGroup, ShortcutGroupToShortcuts, ShortcutUpdateModelv1, ShortcutsFilterv1, defaultShortcutsFilter } from './models';\r\nimport { createShortcut, createShortcutGroup, getOriginalShortcutFormat, getShortcutFormat, SET_ERR_MSG, SET_SUCCESS_MSG, updateShortcutsFormat } from './reducer';\r\nimport { getAudiences } from 'modules/audiences/actionCreator';\r\nimport { Button, Paper } from '@mui/material';\r\nimport ShortcutsFormatEditor from './components/editor/shortcutsFormatEditor';\r\nimport ShortcutsOrganizeListHeaderButtons from './components/editor/shortcutsOrganizeListHeaderButtons';\r\nimport ShallowEquals from 'utils/shallowEquals';\r\nimport { useDispatch, useSelector } from 'react-redux';\r\nimport { GlobalApplicationState } from 'globalApplicationState';\r\nimport { UseSetSnackbarMessages } from 'modules/common/hooks/useSetSnackbarMessages';\r\n\r\nimport \"./styles/shortcutsManagementPage.sass\";\r\n\r\ninterface IShortcutsManagementPageProps {}\r\n\r\nexport const ShortcutsManagementPage: React.FC = () => {\r\n const [isReorganizeListMode, setIsReorganizeListMode] = useState(false);\r\n const [showCreateShortcutDialog, setShowCreateShortcutDialog] = useState(false);\r\n const [shortcutsFilter, setShortcutsFilter] = React.useState(defaultShortcutsFilter);\r\n const [showCreateShortcutGroupDialog, setShowCreateShortcutGroupDialog] = useState(false);\r\n const { filteredShortcutFormat, successMessage, errorMessage } = useSelector((state: GlobalApplicationState) => state.shortcuts);\r\n const [newShortcutFormat, setNewShortcutFormat] = useState(filteredShortcutFormat);\r\n const audiences = useSelector((state: GlobalApplicationState) => state.audiences.audiences);\r\n const [expandedShortcutGroups, setExpandedShortcutGroups] = React.useState(filteredShortcutFormat.map(f => f.shortcutGroup.id));\r\n const [selectedShortcutGroup, setSelectedShortcutGroup] = useState(undefined);\r\n const collapseMsg = \"Collapse All\";\r\n const expandMsg = \"Expand All\";\r\n const isAllExpanded = expandedShortcutGroups.length === filteredShortcutFormat.map(f => f.shortcutGroup).length && expandedShortcutGroups.length !== 0;\r\n const dispatch = useDispatch();\r\n const { setSuccessMessage, setErrorMessage } = UseSetSnackbarMessages();\r\n\r\n const fetchShortcutFormat = (filter?: ShortcutsFilterv1) => {\r\n dispatch(getShortcutFormat(filter ?? shortcutsFilter));\r\n }\r\n\r\n useEffect(() => {\r\n if (successMessage) {\r\n setSuccessMessage(successMessage);\r\n dispatch(SET_SUCCESS_MSG(\"\"));\r\n }\r\n }, [successMessage]);\r\n\r\n useEffect(() => {\r\n if (errorMessage) {\r\n setErrorMessage(errorMessage);\r\n dispatch(SET_ERR_MSG(\"\"));\r\n }\r\n }, [errorMessage]);\r\n\r\n useEffect(() => {\r\n setNewShortcutFormat(filteredShortcutFormat);\r\n setExpandedShortcutGroups(filteredShortcutFormat.map(f => f.shortcutGroup.id));\r\n }, [filteredShortcutFormat]);\r\n\r\n useEffect(() => {\r\n fetchShortcutFormat();\r\n dispatch(getOriginalShortcutFormat());\r\n dispatch(getAudiences());\r\n }, []);\r\n\r\n const onFilterChange = async (filter: ShortcutsFilterv1) => {\r\n if (!ShallowEquals(filter, shortcutsFilter)) {\r\n setShortcutsFilter(filter);\r\n }\r\n\r\n fetchShortcutFormat(filter);\r\n }\r\n\r\n const onCreateShortcutGroupFromInput = async (groupName: string) => {\r\n setShowCreateShortcutGroupDialog(false);\r\n dispatch(createShortcutGroup({\r\n shortcutGroupName: groupName, \r\n filter: shortcutsFilter, \r\n scrollToId: filteredShortcutFormat[filteredShortcutFormat.length - 1]?.shortcutGroup.id,\r\n successMsg: \"Successfully added a new shortcut group.\"\r\n }));\r\n }\r\n\r\n const onCreateShortcutGroup = () => {\r\n setShowCreateShortcutGroupDialog(true);\r\n }\r\n\r\n const onCreateShortcutFromInput = async (input: ShortcutUpdateModelv1) => {\r\n setShowCreateShortcutDialog(false);\r\n const shortcutsOfShortcutGroup = filteredShortcutFormat.find(sgts => sgts.shortcutGroup.id === input.groupId)?.shortcuts;\r\n dispatch(createShortcut({\r\n shortcutUpdateModel: input, \r\n filter: shortcutsFilter,\r\n scrollToId: shortcutsOfShortcutGroup && shortcutsOfShortcutGroup.length\r\n ? shortcutsOfShortcutGroup[shortcutsOfShortcutGroup.length - 1].id\r\n : input.groupId,\r\n successMsg: \"Successfully added a new shortcut.\"\r\n }));\r\n setSelectedShortcutGroup(undefined);\r\n }\r\n\r\n const onCreateShortcut = (shortcutGroup?: ShortcutGroup) => {\r\n setSelectedShortcutGroup(shortcutGroup);\r\n setShowCreateShortcutDialog(true);\r\n }\r\n\r\n const onOrganizeList = () => {\r\n setIsReorganizeListMode(prev => !prev);\r\n }\r\n\r\n const onSaveNewShortcutFormat = async () => {\r\n setIsReorganizeListMode(false);\r\n dispatch(updateShortcutsFormat({\r\n newFormat: newShortcutFormat, \r\n filter: shortcutsFilter, \r\n successMsg: \"Successfully saved changes.\"\r\n }));\r\n }\r\n\r\n return \r\n \r\n Manage Shortcuts / \r\n  Organize list\r\n \r\n : \"Manage Shortcuts\"\r\n }\r\n rightComponent={\r\n isReorganizeListMode \r\n ? {\r\n setIsReorganizeListMode(false);\r\n setNewShortcutFormat(filteredShortcutFormat);\r\n }}\r\n onSaveFormat={onSaveNewShortcutFormat}\r\n />\r\n : \r\n }\r\n />\r\n \r\n
    \r\n {\r\n isReorganizeListMode\r\n ? \r\n : \r\n }\r\n {\r\n setSelectedShortcutGroup(undefined); \r\n setShowCreateShortcutDialog(false);\r\n }}\r\n onCreateShortcutFromInput={onCreateShortcutFromInput}\r\n audiences={audiences}\r\n selectedShortcutGroup={selectedShortcutGroup}\r\n />\r\n setShowCreateShortcutGroupDialog(false)}\r\n onCreateShortcutGroupFromInput={onCreateShortcutGroupFromInput}\r\n />\r\n
    \r\n
    \r\n \r\n { \r\n !isReorganizeListMode &&\r\n \r\n }\r\n \r\n
    ;\r\n};","import * as React from \"react\";\r\nimport { Route, Switch } from \"react-router\";\r\nimport AdminAppLayout from \"./_layout/adminApp/adminAppLayout\";\r\nimport UserAppLayout from \"./_layout/userApp/userAppLayout\";\r\nimport InsufficientPermissions from \"modules/common/components/insufficientPermissions\";\r\nimport _ from 'lodash';\r\n\r\nimport ClientRouteWrapper from \"modules/tenant/components/clientRouteWrapper\";\r\nimport TenantRouteWrapper from \"modules/tenant/components/tenantRouteWrapper\";\r\nimport Dashboard from \"modules/dashboard/components/dashboard\";\r\nimport UserManagementPage from \"modules/users/components/userManagementPage\";\r\nimport SurveyManagementPage from \"modules/surveys/components/surveyManagementPage\"\r\nimport SurveyEdit from \"modules/surveys/components/surveyEdit\";\r\nimport SurveyDetails from \"modules/surveys/components/surveyDetails\";\r\nimport { SettingsPage } from \"modules/settings/components/settingsPage\";\r\nimport AudienceListing from \"modules/audiences/components/audience-listing/audienceListing\";\r\nimport EveryoneAudienceManager from \"modules/audiences/components/everyoneAudienceManager\";\r\nimport { UserRoleStrings } from \"modules/authorization/models\";\r\n\r\nimport NewsletterManagementPage from \"modules/newsletters/management/newsletterManagementPage\"\r\nimport EditNewsletterPage from \"modules/newsletters/edit/editNewsletterPage\";\r\nimport EditThemePage from \"modules/newsletters/edit/editThemePage\";\r\nimport NewsletterDashboard from \"modules/newsletters/dashboard/newsletterDashboardPage\";\r\n\r\nimport PostManagementPage from \"modules/posts/components/postsManagementPage\"\r\nimport PostCreation from \"modules/posts/components/post-creation/postCreation\";\r\n\r\nimport EventManagementPage from \"modules/events/components/eventManagementPage\";\r\nimport EventCreation from \"modules/events/components/event-creation/eventCreation\";\r\nimport EventAttendance from \"modules/events/components/attendance-listing/attendanceListing\";\r\n\r\nimport DocumentManagementPage from \"modules/documents/containers/documentManagementPage\";\r\nimport DocumentCreation from \"modules/documents/components/document-creation/documentCreation\";\r\n\r\nimport InsightsDashboard from \"modules/insights/components/dashboard\";\r\nimport InsightsTagList from \"modules/insights/components/tagList\";\r\nimport InsightsTagDetail from \"modules/insights/components/tagDetail\";\r\n\r\nimport CategoryTagsManagementPage from \"modules/categorytags/containers/categoryTagsManagementPage\";\r\n\r\nimport PostInsights from \"modules/posts/components/post-insights/postInsightsv2\";\r\nimport ImageGallery from 'modules/gallery/components/imageGallery';\r\nimport Logout from \"./_layout/common/components/Logout\";\r\nimport RedirectToDashboard from \"./RedirectToDashboard\";\r\nimport RedirectToHome from \"./RedirectToHome\";\r\nimport RedirectToWelcome from \"./RedirectToWelcome\";\r\nimport RequireLogin from \"authentication/RequireLogin\";\r\nimport IFrameDetector from \"authentication/IFrameDetector\";\r\nimport ActivityManagementPage from \"modules/activity/components/activityManagementPage\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { connect, ConnectedProps } from \"react-redux\";\r\n\r\nimport UserProfilePage from \"modules/users/components/user-profile/userProfilePage\";\r\n\r\nimport MessagingCenterScreen from \"modules/messaging/components/messagingCenterScreen\";\r\n\r\nimport ExternalUsersLobbyView from \"modules/users/components/externalUsersLobbyView\";\r\n\r\nimport NavigationItemsManagementPage from \"modules/portalPages/containers/navigationItemsManagementPage\";\r\nimport PortalPagesManagementPage from \"modules/portalPages/containers/portalPagesManagementPage\";\r\nimport PortalPagesCreation from \"modules/portalPages/components/portal-pages-creation/portalPagesCreation\";\r\n\r\nimport DocumentsPage from \"pages/documents/documentsPage\";\r\nimport EventsPage from \"pages/events/eventsPage\";\r\nimport HomePage from \"pages/home/homePage\";\r\nimport PortalPagesPage from \"pages/portalPages/portalPagesPage\";\r\nimport PostsPage from \"pages/posts/postsPage\";\r\nimport PublicPostsPage from \"pages/posts/publicPostsPage\";\r\nimport PublicNewsletterUnsubscribedPage from \"pages/newsletters/publicNewsletterUnsubscribedPage\";\r\nimport UserPage from \"pages/user/userPage\";\r\nimport WelcomePage from \"pages/welcome/welcomePage\";\r\n\r\nimport Invitation from \"authentication/Invitation\";\r\nimport AuthRedirectHandler from \"authentication/AuthRedirectHandler\";\r\nimport PageForbidden from \"pages/pageForbidden/pageForbidden\";\r\nimport AdminPageForbidden from \"pages/pageForbidden/adminPageForbidden\";\r\nimport DownloadReportPage from \"modules/reports/downloadReportPage\";\r\nimport AdminPageNotFound from \"pages/pageNotFound/adminPageNotFound\";\r\nimport TenantManagementPage from \"modules/tenantManagement/components/tenantManagementPage\";\r\nimport { getHighestRole } from \"utils/userRoleUtils\";\r\nimport AuthRoute from \"./authRoute\";\r\nimport { ConnectedManageHomeScreenSettings } from \"modules/settings/components/manageHomeScreenSettingsPage\";\r\nimport { ConnectedContentBandsEditorPage } from \"modules/contentBands/components/editor/contentBandsEditorPage\";\r\nimport ContentGuidelinesPage from \"modules/settings/components/content/guidelines/contentGuidelinesPage\";\r\nimport EmailsManagementPage from \"modules/emails/components/emailsManagementPage\";\r\nimport EmailEditorPage from \"modules/emails/components/editor/emailEditorPage\";\r\nimport { ShortcutsManagementPage } from \"modules/shortcuts/shortcutsManagementPage\";\r\n\r\n\r\nconst Routes: React.FC = (props: PropsWithRedux) => {\r\n const userId = props.currentUser.userId;\r\n const userIsOwner = !!props.userRoles && _.some(_.intersection([UserRoleStrings.OWNER], props.userRoles));\r\n const userIsAuthor = !!props.userRoles && (userIsOwner || _.some(_.intersection([UserRoleStrings.AUTHOR], props.userRoles)));\r\n const isContributor = getHighestRole(props.currentUser) === UserRoleStrings.CONTRIBUTOR;\r\n const userIsInternalOnly = !!props.userRoles && !userIsOwner && !userIsAuthor && _.some(_.intersection([UserRoleStrings.INTERNAL], props.userRoles));\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n {props.tenantSettings.lobbyEnabled &&\r\n \r\n }\r\n \r\n \r\n\r\n \r\n \r\n }\r\n />\r\n \r\n \r\n \r\n \r\n \r\n\r\n {\r\n props.tenantSettings.mobileEventsEnabled &&\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n {\r\n props.tenantSettings.showFeatures.documentsEnabled && props.tenantSettings.documentsEnabled &&\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n {\r\n props.tenantSettings.showFeatures.shortcutsEnabled && props.tenantSettings.shortcutsEnabled &&\r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n {\r\n props.tenantSettings.showFeatures.categoryTagsEnabled &&\r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n {!!userId &&\r\n \r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {props.clientSettings.portalPagesEnabled &&\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n {props.clientSettings.mobileEventsEnabled &&\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n {props.clientSettings.documentsEnabled &&\r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n \r\n {!!props.clientSettings.id &&\r\n \r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\ninterface ComponentProps { }\r\n\r\nconst connector = connect(\r\n (state: GlobalApplicationState, ownProps: ComponentProps) => ({\r\n ...ownProps,\r\n userRoles: state.settings.currentUser?.roles,\r\n currentUser: state.settings.currentUser,\r\n clientSettings: state.settings.clientSettings,\r\n navigation: state.portalPages.navigation,\r\n tenantSettings: state.settings.tenantSettings\r\n }),\r\n);\r\ntype PropsWithRedux = ConnectedProps;\r\nexport default connector(Routes);\r\n","import React from \"react\";\r\nimport { Portal } from \"@mui/material\";\r\nimport { useSelector } from \"react-redux\";\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport SnackbarWrapper from \"modules/common/components/snackbars/snackbarWrapper\";\r\nimport { UseSetSnackbarMessages } from \"modules/common/hooks/useSetSnackbarMessages\";\r\n\r\ninterface ISnackbarsProps {}\r\n\r\nconst Snackbars: React.FC = ({}) => {\r\n const { successMessage, errorMessage, infoMessage } = useSelector((state: GlobalApplicationState) => state.snackbars);\r\n const {\r\n setSuccessMessage,\r\n setErrorMessage,\r\n setInfoMessage\r\n } = UseSetSnackbarMessages();\r\n\r\n return \r\n setSuccessMessage(\"\")}/>\r\n setErrorMessage(\"\")}/>\r\n setInfoMessage(\"\")}/>\r\n ;\r\n};\r\n\r\nexport default Snackbars;\r\n","import { NavigationClient } from \"@azure/msal-browser\";\r\n\r\n/**\r\n * This is an example for overriding the default function MSAL uses to navigate to other urls in your webpage\r\n * Sample taken from https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-react/docs/performance.md\r\n */\r\nexport class CustomNavigationClient extends NavigationClient{\r\n private _history : any;\r\n\r\n constructor(history) {\r\n super();\r\n this._history = history;\r\n \r\n }\r\n\r\n /**\r\n * Navigates to other pages within the same web application\r\n * You can use the useHistory hook provided by react-router-dom to take advantage of client-side routing\r\n * @param url \r\n * @param options \r\n */\r\n navigateInternal = async (url, options) => {\r\n const relativePath = url.replace(window.location.origin, '');\r\n if (options.noHistory) {\r\n this._history.replace(relativePath);\r\n } else {\r\n this._history.push(relativePath);\r\n }\r\n\r\n return false;\r\n }\r\n}","/* Polyfills */\r\nimport 'react-app-polyfill/ie11';\r\nimport 'react-app-polyfill/stable';\r\nimport 'custom-event-polyfill';\r\nimport 'blueimp-canvas-to-blob';\r\n\r\nimport '@formatjs/intl-pluralrules/polyfill';\r\nimport '@formatjs/intl-pluralrules/dist/locale-data/en';\r\nimport '@formatjs/intl-pluralrules/dist/locale-data/fr';\r\nimport '@formatjs/intl-relativetimeformat/polyfill';\r\nimport '@formatjs/intl-relativetimeformat/dist/locale-data/en';\r\nimport '@formatjs/intl-relativetimeformat/dist/locale-data/fr';\r\n\r\nimport \"moment/locale/en-ca.js\";\r\nimport \"moment/locale/fr-ca\";\r\n\r\nimport * as React from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\nimport { Provider } from 'react-redux';\r\nimport { ConnectedRouter } from 'connected-react-router';\r\nimport { store, browserHistory, devToolsExtension } from './configureStore';\r\nimport registerServiceWorker from './registerServiceWorker';\r\nimport IntlProvider from './i18n';\r\nimport Theme from './theme';\r\n\r\nimport Routes from './routes/routes';\r\nimport { DevTools } from './modules/common/components/DevTools';\r\nimport { isDevEnvironment } from 'utils/isDevEnvironment';\r\nimport MsalAuthModule, { msalConfig } from 'authentication/msalAuthModule';\r\nimport { PublicClientApplication } from \"@azure/msal-browser\";\r\nimport { MsalProvider } from \"@azure/msal-react\";\r\nimport Snackbars from 'modules/common/components/snackbars/snackbars';\r\n\r\n//for Navigation\r\nimport { CustomNavigationClient } from 'authentication/navigation/customNavigationClient';\r\n\r\n\r\nimport './styles/index.sass';\r\nimport './styles/tooltip.sass';\r\n\r\n\r\nconst msalInstance = new PublicClientApplication(msalConfig);\r\n\r\nconst navigationClient = new CustomNavigationClient(browserHistory);\r\nmsalInstance.setNavigationClient(navigationClient);\r\n\r\n// The Graph Access Token (used in the Everyone Audience screen, which logs in to login.microsoftonline.com) \r\n// stays in the msal cache and causes confusion with the Main MSAL instance (which is set to login to B2C (b2clogin.com))\r\n// and causes an error on login. This fixes that issue.\r\nconst accounts = msalInstance.getAllAccounts();\r\n\r\nif (accounts.length > 0) {\r\n let b2cAcct = accounts.filter(a => a.environment.includes(\"b2clogin.com\"));\r\n let currB2CAcct = b2cAcct.length === 0 ? null : b2cAcct[0];\r\n msalInstance.setActiveAccount(currB2CAcct);\r\n}\r\n\r\nMsalAuthModule.setInstance(msalInstance, store);\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {isDevEnvironment && !devToolsExtension && }\r\n \r\n ,\r\n document.getElementById('root')\r\n);\r\n\r\nregisterServiceWorker();","import { Action } from \"redux\";\r\nimport { CompleteAction, ActionCreator } from \"typedActions\";\r\n\r\nimport { CurrentUserSettings } from \"modules/settings/models\";\r\n\r\n\r\nexport const INITIALIZE_USER_SETTINGS = \"INITIALIZE_USER_SETTINGS\";\r\nexport interface InitializeUserSettings extends Action { userSettings: CurrentUserSettings }\r\nexport const InitializeUserSettings = ActionCreator(INITIALIZE_USER_SETTINGS);\r\n\r\nexport const UPDATE_USER_SETTINGS = \"UPDATE_USER_SETTINGS\";\r\nexport interface UpdateUserSettings extends Action { userSettings: Partial }\r\nexport const UpdateUserSettings = ActionCreator(UPDATE_USER_SETTINGS);\r\n\r\nexport const SAVE_USER_SETTINGS = \"SAVE_USER_SETTINGS\";\r\nexport interface SaveUserSettings extends Action {}\r\nexport const SaveUserSettings = ActionCreator(SAVE_USER_SETTINGS);\r\n\r\nexport const SAVE_USER_SETTINGS_COMPLETE = \"SAVE_USER_SETTINGS_COMPLETE\";\r\nexport interface SaveUserSettingsComplete extends CompleteAction {}\r\nexport const SaveUserSettingsComplete = ActionCreator(SAVE_USER_SETTINGS_COMPLETE);\r\n\r\nexport const SEND_SMS_VERIFY = \"SEND_SMS_VERIFY\"\r\nexport interface SendSMSVerify extends Action {}\r\nexport const SendSMSVerify = ActionCreator(SEND_SMS_VERIFY);\r\n\r\nexport const SEND_SMS_VERIFY_COMPLETE = \"SEND_SMS_VERIFY_COMPLETE\"\r\nexport interface SendSMSVerifyComplete extends Action {}\r\nexport const SendSMSVerifyComplete = ActionCreator(SEND_SMS_VERIFY_COMPLETE);\r\n\r\nexport const CLEAR_ERROR_MESSAGE = \"CLEAR_ERROR_MESSAGE\";\r\nexport interface ClearErrorMessage extends Action {}\r\nexport const ClearErrorMessage = ActionCreator(CLEAR_ERROR_MESSAGE);","export interface ContentAnalysis {\r\n fogScore: string;\r\n fogScoreText: string;\r\n ieltsScore: string;\r\n ieltsScoreText: string;\r\n lixScore: number;\r\n longestSentenceWords: string;\r\n longestWord: string;\r\n lettersPerWord: string;\r\n readabilityScore: string;\r\n readabilityText: string;\r\n readingTime: string;\r\n sentencesPerParagraph: string;\r\n sentimentScore: number;\r\n speakingTime: string;\r\n syllablesPerWord: string;\r\n tone: string;\r\n toneNumber: number;\r\n uiSentimentScore: number;\r\n wordCount: number;\r\n wordsPerParagraph: string;\r\n wordsPerSentence: string;\r\n sentenceCount: number;\r\n readabilityIndicator: IIndicatorDetail;\r\n toneIndicator: IIndicatorDetail;\r\n sentimentIndicator: IIndicatorDetail;\r\n personalismIndicator: IIndicatorDetail;\r\n highlightAnalysis?: IHighlightAnalysis;\r\n}\r\n\r\nexport interface IHighlightAnalysis {\r\n highlightDetails: IHighlightDetails;\r\n veryLongSentenceCount: number;\r\n spellingErrorCount: number;\r\n grammarErrorCount: number;\r\n longSentenceCount: number;\r\n passiveVoiceCount: number;\r\n adverbCount: number;\r\n clicheCount: number;\r\n hedgeCount: number;\r\n transitionCount: number;\r\n profanityCount: number;\r\n buzzwordsCount: number;\r\n namesCount: number;\r\n lazyCount: number;\r\n stopwordsCount: number;\r\n longWordCount: number;\r\n highSyllableWordCount: number;\r\n highlightedText: string;\r\n processedHighlightText: string;\r\n}\r\n\r\nexport interface IHighlightDetails {\r\n higlightWarn: string;\r\n highlightBad: string;\r\n highlightLongWord: string;\r\n highlightHardWord: string;\r\n highlightAdverb: string;\r\n highlightCliche: string;\r\n highlightPassive: string;\r\n highlightHedge: string;\r\n highlightTransition: string;\r\n highlightProfanity: string;\r\n highlightBuzzwords: string;\r\n highlightStopwords: string;\r\n highlightLazy: string;\r\n highlightNames: string;\r\n}\r\n\r\nexport interface IIndicatorDetail {\r\n minScore: number;\r\n maxScore: number;\r\n minLabel: string;\r\n maxLabel: string;\r\n score: number;\r\n scoreLabel: string;\r\n recommendedScore: number;\r\n}\r\n\r\nexport interface CroppableImage {\r\n id: string;\r\n transforms: { points: number[], zoom?: number };\r\n url: string;\r\n}\r\n\r\nexport type NotificationRange = \"fallback\" | \"subscribers\" | \"none\";\r\n\r\nexport interface Notifications {\r\n emailOnPublish: NotificationRange;\r\n mobileOnPublish: NotificationRange;\r\n smsOnPublish: NotificationRange;\r\n teamsOnPublish: NotificationRange;\r\n reminders: Reminder[];\r\n}\r\n\r\nexport interface Reminder {\r\n channel: ReminderChannel;\r\n delay: number;\r\n range: NotificationRange;\r\n}\r\n\r\nexport type ReminderChannel = \"inherit\" | \"email\" | \"mobile\" | \"sms\" | \"teams\" | \"none\";\r\n\r\nexport interface Tag {\r\n id: string;\r\n name: string;\r\n mandatory?: boolean;\r\n restricted?: boolean;\r\n}\r\n\r\nexport interface TranslatedContent {\r\n [languageCode: string]: TranslatableContent;\r\n}\r\n\r\nexport interface TranslatedNewsletterContent { \r\n [languageCode: string]: TranslatableNewsletterContent;\r\n}\r\n\r\nexport interface TranslatableContent {\r\n title: string;\r\n body: string;\r\n description: string;\r\n}\r\n\r\nexport interface TranslatableNewsletterContent {\r\n subject: string;\r\n body: string;\r\n preheader: string;\r\n header: string;\r\n footer: string;\r\n}\r\n\r\nexport interface ValidationChecks {\r\n checks: ValidationCheck[];\r\n}\r\n\r\nexport interface ValidationCheck {\r\n key: string;\r\n description: string;\r\n isValid: boolean;\r\n link?: string;\r\n skip?: boolean;\r\n}\r\n\r\nexport const DEFAULT_TRANSLATABLE_CONTENT: TranslatableContent = {\r\n title: \"\",\r\n body: \"\",\r\n description: \"\",\r\n}\r\n\r\nexport const DEFAULT_TRANSLATABLE_NEWSLETTER_CONTENT: TranslatableNewsletterContent = {\r\n subject: \"\",\r\n body: \"\",\r\n preheader: \"\",\r\n header: \"\",\r\n footer: \"\"\r\n}\r\n\r\n\r\nexport type DelayType = \"hours\" | \"days\";\r\n\r\nexport interface ReminderInfo {\r\n delay: number;\r\n delayType: DelayType;\r\n emailRange: NotificationRange;\r\n mobileRange: NotificationRange;\r\n smsRange: NotificationRange;\r\n teamsRange: NotificationRange;\r\n}\r\n\r\nexport interface DraftActivity {\r\n id: string;\r\n action : DraftAction;\r\n draftId: string;\r\n userFullName: string;\r\n time: Date;\r\n comment?: string;\r\n}\r\n\r\nexport enum DraftAction {\r\n Submit = \"SUBMIT\",\r\n Reject = \"REJECT\", \r\n Publish = \"PUBLISH\",\r\n Unpublish = \"UNPUBLISH\"\r\n}","export * from './ApiRequest';\r\nexport * from './utils';","import { NotificationRange } from \"modules/documents\";\r\nimport { lcidMappings } from \"modules/resources\";\r\n\r\nexport interface MessagingState {\r\n activeTab: MessagingTabs\r\n}\r\n\r\n\r\nexport enum MessagingTabs {\r\n SMS,\r\n Teams,\r\n Mobile\r\n}\r\n\r\nexport interface Blast {\r\n audienceIds: string[]\r\n translatedBody: lcidMappings\r\n subject: string\r\n}\r\n\r\nexport enum NotificationEvents {\r\n CommentFlaggedEmail = \"commentFlaggedEmailAttempt\",\r\n CommentFlaggedTeams = \"commentFlaggedTeamsAttempt\",\r\n ConsentInviteSms = \"consentInviteSMSAttempt\",\r\n DocLockerUpdatedMobile = \"docLockerUpdatedMobileAttempt\",\r\n EventCancelledEmail = \"eventCancelledEmailAttempt\",\r\n EventPublishedEmail = \"eventPublishedEmailAttempt\",\r\n EventPublishedMobile = \"eventPublishedMobileAttempt\",\r\n EventPublishedSMS = \"eventPublishedSMSAttempt\",\r\n EventPublishedTeams = \"eventPublishedTeamsAttempt\",\r\n EventReminderEmail = \"eventReminderEmailAttempt\",\r\n EventReminderMobile = \"eventReminderMobileAttempt\",\r\n EventReminderSMS = \"eventReminderSMSAttempt\",\r\n EventReminderTeams = \"eventReminderTeamsAttempt\",\r\n EventRespondedEmail = \"eventRespondedEmailAttempt\",\r\n EventUpdatedEmail = \"eventUpdatedEmailAttempt\",\r\n MassSMS = \"massSMSAttempt\",\r\n PostCommentCreatedMobile = \"postCommentCreatedMobileAttempt\",\r\n PostCommentCreatedTeams = \"postCommentCreatedTeamsAttempt\",\r\n PostPublishedEmail = \"postPublishedEmailAttempt\",\r\n PostPublishedMobile = \"postPublishedMobileAttempt\",\r\n PostPublishedSMS = \"postPublishedSMSAttempt\",\r\n PostPublishedTeams = \"postPublishedTeamsAttempt\",\r\n PostReminderEmail = \"postReminderEmailAttempt\",\r\n PostReminderMobile = \"postReminderMobileAttempt\",\r\n PostReminderSMS = \"postReminderSMSAttempt\",\r\n PostReminderTeams = \"postReminderTeamsAttempt\",\r\n UserProfileUpdatedEmail = \"userProfileUpdatedEmailAttempt\",\r\n EventMentionedTeams = \"eventMentionedTeamsAttempt\",\r\n EventMentionedMobile = \"eventMentionedMobileAttempt\",\r\n PostMentionedTeams = \"postMentionedTeamsAttempt\",\r\n PostMentionedMobile = \"postMentionedMobileAttempt\",\r\n UserMentionedTeams = \"userMentionedTeamsAttempt\",\r\n UserMentionedMobile = \"userMentionedMobileAttempt\",\r\n UserMentionedEmail = \"userMentionedEmailAttempt\",\r\n AccessGrantedEmail = \"accessGrantedEmailAttempt\",\r\n PostSubmittedTeams = \"postSubmittedTeamsAttempt\",\r\n VerifySMSPhone = \"verifyPhoneSMSAttempt\",\r\n PostSubmittedEmail = \"postSubmittedEmailAttempt\",\r\n EventSubmittedTeams = \"eventSubmittedTeamsAttempt\",\r\n EventSubmittedEmail = \"eventSubmittedEmailAttempt\",\r\n}\r\nexport interface TenantNotificationSettings {\r\n defaultEmailBlackoutPeriod?: number,\r\n defaultSMSBlackoutPeriod?: number,\r\n defaultTeamsBlackoutPeriod?: number,\r\n defaultMobileBlackoutPeriod?: number,\r\n defaultEventReminder?: number,\r\n defaultEventSettings?: DefaultEventSettings,\r\n defaultPostReminder?: number,\r\n defaultPostSettings?: DefaultPostSettings,\r\n fromEmailAddress?: string,\r\n fromEmailName?: string,\r\n linkPreference?: string,\r\n settings: {\r\n [event in NotificationEvents]: EventAttemptModel\r\n }\r\n}\r\n\r\nexport interface EventAttemptModel {\r\n blackoutPeriod: number,\r\n templaceId: string,\r\n toggle: boolean,\r\n translatedBody: any,\r\n translatedSubject: any,\r\n translatedContent: any,\r\n}\r\nexport interface DefaultPostSettings {\r\n emailOnPublish?: NotificationRange,\r\n mobileOnPublish: NotificationRange,\r\n smsOnPublish: NotificationRange,\r\n teamsOnPublish: NotificationRange,\r\n reminders: Reminder[]\r\n}\r\nexport interface DefaultEventSettings {\r\n emailOnPublish?: NotificationRange,\r\n mobileOnPublish: NotificationRange,\r\n smsOnPublish: NotificationRange,\r\n teamsOnPublish: NotificationRange,\r\n reminders: Reminder[]\r\n}\r\n\r\nexport interface Reminder {\r\n channel: \"inherit\" | \"email\" | \"sms\" | \"teams\" | \"mobile\" | \"none\";\r\n delay: number;\r\n range: \"fallback\" | \"subscribers\" | \"none\";\r\n}\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Editor } from \"@tinymce/tinymce-react\";\r\nimport { Editor as IEditor } from \"tinymce\";\r\nimport { RawEditorOptions } from \"tinymce\";\r\nimport { ICustomCssModelv1 } from \"api/files\";\r\nimport Loading from \"../loading\";\r\nimport { TinyMceTemplatesService } from \"modules/common/services/tinyMceTemplateService\";\r\nimport { acceptableLanguages, spellcheckerRpcUrl, lcidToHunspellLcid } from \"utils/spellcheckLanguages\";\r\nimport { ospreyApi } from \"api/instances\";\r\nimport { IPersonalizationToken, MERGE_TAG_PREFIX, MERGE_TAG_SUFFIX } from \"modules/emails/models\";\r\nimport { userAttributesSvg } from \"modules/common/icons/userAttributesSvgString\";\r\nimport { magicIconWhiteSVG } from \"modules/common/icons/magicIconWhiteSvgString\";\r\nimport { PromptTypeEnum } from \"modules/smartContent/models\";\r\n\r\nimport \"./styles/sparrowTinyMce.sass\";\r\n\r\ninterface IPrePasteProcessEvent {\r\n internal: boolean;\r\n content: string;\r\n}\r\n\r\ninterface ISparrowTinyMceProps {\r\n value?: string;\r\n defaultLcid: string;\r\n activeLcid?: string;\r\n livePreview?: boolean;\r\n floatingToolbar?: boolean;\r\n loading?: boolean;\r\n disabled?: boolean;\r\n editorRef: React.MutableRefObject;\r\n initOptions?: (RawEditorOptions & { selector?: undefined; target?: undefined; });\r\n customCss?: ICustomCssModelv1;\r\n enableInlineImages?: boolean; // enable inline images - opt out\r\n enableEmbeddedMedia?: boolean; // enable embedded media - opt out\r\n enablePageEmbed?: boolean; // enable embedded media - opt out\r\n smartContentSuggestion?: string;\r\n showSCDropdownButton?: boolean;\r\n changedSinceSaved?: boolean;\r\n onShowInlineImageDialog?: (editor) => void;\r\n onShowIntenseEmphasisDialog: (editor) => void;\r\n grabMentionUsers?: (filter: string) => any;\r\n onChange: (value?: string) => void;\r\n onFocus?: () => void;\r\n onFullscreen?: (isFullscreen?: boolean) => void;\r\n onShowSmartContentInsert?: (highlightedText: string, promptType: PromptTypeEnum) => void;\r\n clearSmartContentSuggestion?: () => void;\r\n generateAndOpenSmartContent?: (promptTypeForGeneration: PromptTypeEnum, promptTypeForInsert: PromptTypeEnum, body?: string) => void;\r\n personalizationTokens?: IPersonalizationToken[]; // Add merge tags / personalization tokens to enable for tinymce\r\n editorMaxWidth?: number; // set fixed max width to limit table and image sizes that are in the body\r\n}\r\n\r\nconst INTENSE_EMPHASIS_ARROW = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAQAAAD9CzEMAAAAo0lEQVR4Ae3WMQ3CQBxG8XZhrAAUFA2oQAW4ABXgAhP1gAN21i73GL+RhOQlXPh/tzb5DX25dviH1Wo17mwZvj+fH4EXJ0YTAFjYuQCsXNg4QPZg7wLQuDE5QPbkIAFZ4pWAxCsBiVcEEq8GJF4RSLwakHg7BhpXpk5f8srZzHRhNq+KI2Onl516XSfIzj6ZCVIBEqQAJEgL8H4dc34cKKCAAt5OnDwnCyae2QAAAABJRU5ErkJggg==\";\r\n\r\nconst INTENSE_EMPHASIS_STYLE = {\r\n \"background-color\": \"%color\",\r\n \"background-image\": \"url(\" + INTENSE_EMPHASIS_ARROW + \")\",\r\n \"background-position\": \"right 10px center\",\r\n \"background-repeat\": \"no-repeat\",\r\n \"background-size\": \"24px 32px\",\r\n \"box-shadow\": \"-3px 3px 1px 0 rgba(212,212,212,1)\",\r\n \"border-radius\": \"3px\",\r\n \"color\": \"#ffffff\",\r\n \"font-weight\": \"600\",\r\n \"display\": \"inline-block\",\r\n \"padding\": \"15px 40px 15px 20px\",\r\n \"text-decoration\": \"none\"\r\n};\r\n\r\nconst EDIT_IMAGE_CORS_HOSTS: string[] = `${process.env.REACT_APP_EDIT_IMAGE_CORS_HOSTS}`.split(\",\");\r\n\r\nconst ALLOWED_BLOB_TYPES = ['image/png', 'image/jpg', 'image/jpeg'];\r\n\r\n/**\r\n * A wrapper around @tinymce/tinymce-react for authoring\r\n */\r\nconst AuthoringTinyEditor: React.FunctionComponent = ({\r\n defaultLcid,\r\n livePreview,\r\n floatingToolbar,\r\n editorRef,\r\n activeLcid = defaultLcid,\r\n disabled = false,\r\n loading = false,\r\n initOptions,\r\n enableEmbeddedMedia = true,\r\n enableInlineImages = true,\r\n enablePageEmbed = true, \r\n showSCDropdownButton,\r\n customCss,\r\n smartContentSuggestion,\r\n changedSinceSaved = false,\r\n onShowInlineImageDialog,\r\n onShowIntenseEmphasisDialog,\r\n grabMentionUsers,\r\n onChange,\r\n onFullscreen,\r\n onFocus,\r\n onShowSmartContentInsert,\r\n clearSmartContentSuggestion,\r\n generateAndOpenSmartContent,\r\n personalizationTokens = [],\r\n editorMaxWidth,\r\n ...rest\r\n}) => {\r\n const [spellcheckEnabled, setSpellcheckEnabled] = useState(false);\r\n const [spellcheckLanguage, setSpellcheckLanguage] = useState();\r\n const [value, setValue] = useState(rest.value);\r\n\r\n // keep props/state in sync\r\n useEffect(() => {\r\n setValue(rest.value);\r\n }, [rest.value]);\r\n\r\n useEffect(() => {\r\n if(smartContentSuggestion && editorRef.current && clearSmartContentSuggestion) {\r\n editorRef.current.insertContent(smartContentSuggestion);\r\n clearSmartContentSuggestion();\r\n }\r\n }, [smartContentSuggestion]);\r\n\r\n const getSelectedText = (editor) => {\r\n return editor.selection.getContent({format: 'text'});\r\n }\r\n\r\n /**\r\n * Optional inline image functionality\r\n * @param editor\r\n */\r\n const setupInlineImages = (editor) => {\r\n if (!enableInlineImages || !onShowInlineImageDialog) return;\r\n\r\n editor.ui.registry.addMenuItem(\"inlineimage\", {\r\n icon: \"image\",\r\n text: \"Inline image\",\r\n context: \"insert\",\r\n onAction: () => onShowInlineImageDialog(editor),\r\n });\r\n\r\n editor.ui.registry.addButton(\"inlineimage\", {\r\n icon: \"image\",\r\n tooltip: \"Insert inline image\",\r\n onAction: () => onShowInlineImageDialog(editor)\r\n });\r\n }\r\n\r\n const setupEditorOnInit = (editor) => {\r\n editor.on('init', () => {\r\n editorRef.current = editor;\r\n if (editor) {\r\n changeLanguage();\r\n }\r\n });\r\n }\r\n\r\n const setupSmartContentMenuButton = (editor) => {\r\n if(showSCDropdownButton) {\r\n editor.ui.registry.addIcon(\"magicIcon\", magicIconWhiteSVG);\r\n /* Smart Content Dropdown Menu for quickbar*/\r\n editor.ui.registry.addMenuButton('smartContentQuickBarButton', {\r\n icon: 'magicIcon',\r\n text: ' ',\r\n fetch: (callback) => {\r\n const items = createSmartContentHighlightedMenuButtons(editor);\r\n callback(items);\r\n }\r\n });\r\n \r\n /* Smart Content Dropdown Menu for toolbar*/\r\n editor.ui.registry.addMenuButton('smartContentToolBarDropDown', {\r\n icon: 'magicIcon',\r\n text: ' ',\r\n fetch: (callback) => {\r\n const items = createSmartContentMenuButtons();\r\n callback(items);\r\n }\r\n });\r\n }\r\n }\r\n\r\n const setupFullScreenButton = (editor) => {\r\n editor.ui.registry.addButton(\"customfullscreen\", {\r\n icon: \"fullscreen\",\r\n tooltip: \"Fullscreen editor\",\r\n onAction: () => {\r\n editor.execCommand(\"mceFullScreen\");\r\n if (onFullscreen)\r\n onFullscreen(editor.plugins.fullscreen.isFullscreen())\r\n }\r\n });\r\n }\r\n\r\n const setupIntenseEmphasisButton = (editor) => {\r\n editor.ui.registry.addButton(\"intenseEmphasis\", {\r\n icon: \"highlight-bg-color\",\r\n tooltip: \"Apply intense emphasis to link\",\r\n disabled: true,\r\n onAction: () => onShowIntenseEmphasisDialog(editor),\r\n onSetup: (buttonApi) => {\r\n const handleIntenseEmphasis = (eventApi) => buttonApi.setEnabled(eventApi.element.nodeName.toLowerCase() === 'a');\r\n editor.off('NodeChange', handleIntenseEmphasis);\r\n return () => editor.on('NodeChange', handleIntenseEmphasis);\r\n }\r\n });\r\n }\r\n\r\n const setupMentionUsers = (editor) => {\r\n const onAction = function (autocompleteApi, rng, value) {\r\n editor.selection.setRng(rng);\r\n editor.insertContent(`@${value.name}`);\r\n autocompleteApi.hide();\r\n }\r\n\r\n // optional mentions functionality\r\n if (grabMentionUsers)\r\n editor.ui.registry.addAutocompleter('specialchars', {\r\n ch: '@',\r\n minChars: 0,\r\n columns: 1,\r\n highlightOn: ['name_text', 'email_text'],\r\n onAction: onAction,\r\n fetch: async function (pattern) {\r\n return await getMentionedUsers(pattern);\r\n }\r\n }\r\n );\r\n }\r\n\r\n const setupPersonalizationMenuItems = (editor) => {\r\n if (personalizationTokens.length > 0) {\r\n editor.ui.registry.addIcon(\"userAttributes\", userAttributesSvg);\r\n\r\n editor.ui.registry.addMenuButton('customMergeTags', {\r\n icon: 'userAttributes',\r\n text: ' ',\r\n fetch: (callback) => {\r\n const items = createPersonalizationTokensMenuButtons();\r\n callback(items);\r\n }\r\n });\r\n\r\n editor.ui.registry.addNestedMenuItem('customMergeTags', {\r\n icon: 'userAttributes',\r\n text: 'Personalization token',\r\n getSubmenuItems: createPersonalizationTokensMenuButtons\r\n });\r\n }\r\n }\r\n\r\n const setupMaxImageWidth = (editor) => {\r\n if (editorMaxWidth) {\r\n const restrictImageToWidth = (img: HTMLImageElement) => {\r\n const currentWidth = parseInt(img.getAttribute('width') || `${img.offsetWidth}`, 10);\r\n const originalWidth = img.naturalWidth || currentWidth;\r\n const originalHeight = img.naturalHeight || img.offsetHeight;\r\n if (currentWidth > editorMaxWidth || (originalWidth > editorMaxWidth && img.getAttribute('width') === null)) {\r\n const newWidth = editorMaxWidth;\r\n // also maintain the same aspect ratio of the image\r\n const newHeight = (originalHeight / originalWidth) * newWidth;\r\n \r\n img.setAttribute('width', `${newWidth}`);\r\n img.setAttribute('height', `${newHeight}`);\r\n img.style.width = `${newWidth}px`;\r\n img.style.height = `${newHeight}px`;\r\n editor.fire(\"change\");\r\n }\r\n }\r\n\r\n editor.on('NodeChange', () => {\r\n const images: NodeListOf = editor.getBody().querySelectorAll('img');\r\n images.forEach(img => {\r\n img.onload = () => restrictImageToWidth(img);\r\n });\r\n });\r\n }\r\n }\r\n\r\n const onSetup = (editor) => {\r\n setupEditorOnInit(editor);\r\n\r\n setupInlineImages(editor);\r\n\r\n setupFullScreenButton(editor);\r\n\r\n setupSmartContentMenuButton(editor);\r\n\r\n setupIntenseEmphasisButton(editor);\r\n\r\n setupMentionUsers(editor);\r\n\r\n setupPersonalizationMenuItems(editor);\r\n\r\n setupMaxImageWidth(editor);\r\n }\r\n\r\n useEffect(() => {\r\n if (editorRef.current) {\r\n changeLanguage();\r\n }\r\n }, [editorRef, activeLcid]);\r\n\r\n useEffect(() => {\r\n if (defaultLcid) {\r\n let spellcheckLanguage = defaultLcid.substring(0, 2).toLocaleLowerCase();\r\n let isEnabledNow = acceptableLanguages.includes(spellcheckLanguage.toLocaleLowerCase());\r\n\r\n setSpellcheckEnabled(isEnabledNow);\r\n setSpellcheckLanguage(spellcheckLanguage);\r\n }\r\n\r\n }, [defaultLcid]);\r\n\r\n // dynamically apply loading styles\r\n useEffect(() => {\r\n const findRuleToRemove = (sheet: CSSStyleSheet, rule: string): number | undefined => {\r\n let ruleToRemove: number | undefined = undefined;\r\n\r\n // find the rule to remove\r\n for (let i = 0; i < sheet.cssRules.length; i++) {\r\n let curr = sheet.cssRules[i];\r\n if (curr.cssText.includes(rule)) {\r\n ruleToRemove = i;\r\n break;\r\n }\r\n }\r\n\r\n return ruleToRemove;\r\n }\r\n\r\n if (editorRef && editorRef.current) {\r\n // grab our custom style sheet from the editor iframe (applied via content_css on init below)\r\n let sheet: CSSStyleSheet = [...editorRef.current.contentWindow.document.styleSheets]\r\n .find((sheet: CSSStyleSheet) => sheet.href?.includes(getContentCssUrl()));\r\n\r\n let ruleToRemove: number | undefined, ruleToAdd: string = \"\";\r\n\r\n // if loading, hide the content portion of the editor\r\n if (loading) {\r\n ruleToRemove = findRuleToRemove(sheet, \".mce-content-body { display: block; }\");\r\n ruleToAdd = \".mce-content-body { display: none; }\";\r\n // done loading, re-show the content portion of the editor\r\n } else {\r\n ruleToRemove = findRuleToRemove(sheet, \".mce-content-body { display: none; }\");\r\n ruleToAdd = \".mce-content-body { display: block; }\";\r\n }\r\n\r\n if (ruleToRemove !== undefined)\r\n sheet.deleteRule(ruleToRemove);\r\n\r\n // insert at index so that the import statement in tinyContentCss.css is always first\r\n sheet.insertRule(ruleToAdd, sheet.cssRules.length);\r\n }\r\n }, [loading, editorRef]);\r\n\r\n /**\r\n * Used to find the mentioned users.\r\n * @param pattern \r\n * @returns mentioned users list.\r\n */\r\n const getMentionedUsers = async (pattern: string) => {\r\n if (grabMentionUsers) {\r\n const results = await grabMentionUsers(pattern);\r\n \r\n const userData = results.map(u => {\r\n const firstName = u.firstName || \"[Unknown]\";\r\n const lastName = u.lastName || \"\";\r\n const fullName = firstName + (lastName ? ` ${lastName}` : \"\");\r\n const initials = !firstName || !lastName ? \"Un\" : `${firstName[0]}${lastName[0]}`;\r\n \r\n return {\r\n fullName,\r\n email: u.email,\r\n id: u.id,\r\n color: u.color,\r\n firstName,\r\n lastName,\r\n initials\r\n };\r\n });\r\n \r\n const mappedResults = userData.map(char => {\r\n const colorForAvatar = char.color ? char.color.substr(1) : \"\";\r\n \r\n return {\r\n type: 'cardmenuitem',\r\n value: { id: char.id, name: char.fullName === \"[Unknown]\" ? char.email : char.fullName },\r\n label: char.fullName,\r\n items: [{\r\n type: 'cardcontainer',\r\n direction: 'horizontal',\r\n items: [{\r\n type: 'cardtext',\r\n text: char.initials,\r\n name: 'name_image',\r\n classes: ['mentions-icon-formatting', `avatar-color-${colorForAvatar}`]\r\n }, {\r\n type: 'cardcontainer',\r\n direction: 'vertical',\r\n items: [{\r\n type: 'cardtext',\r\n text: char.fullName,\r\n name: 'name_text'\r\n }, {\r\n type: 'cardtext',\r\n text: char.email,\r\n name: 'email_text',\r\n classes: ['mentions-email-formatting']\r\n }]\r\n }]\r\n }]\r\n };\r\n }).slice(0, 6);\r\n \r\n return mappedResults;\r\n }\r\n }\r\n\r\n /**\r\n * Updates the spell check language.\r\n */\r\n const changeLanguage = (): void => {\r\n const currentSetLang = editorRef.current.plugins.tinymcespellchecker.getLanguage();\r\n if (currentSetLang !== activeLcid) {\r\n let languageToSet = activeLcid.substring(0, 2).toLocaleLowerCase();\r\n if (!acceptableLanguages.includes(languageToSet)) {\r\n languageToSet = \"en\";\r\n editorRef.current.execCommand('mceSpellcheckDisable');\r\n } else {\r\n editorRef.current.execCommand('mceSpellcheckEnable');\r\n }\r\n\r\n editorRef.current.plugins.tinymcespellchecker.setLanguage(languageToSet in lcidToHunspellLcid ? lcidToHunspellLcid[languageToSet] : languageToSet);\r\n }\r\n }\r\n\r\n /**\r\n * Creates the menu buttons for the smart content tool bar drop down. (scButton)\r\n */\r\n const createSmartContentMenuButtons = function () {\r\n //Makes sure that we do not include the

    tags as part of the content.\r\n let buttonsEnabled = !(editorRef.current.getContent().replace(/<\\/?p>/g, '').length <= 0);\r\n\r\n const menuItemsConfig = [\r\n {\r\n text: 'Generate alternate post body',\r\n promptType: PromptTypeEnum.Body,\r\n isEnabled: () => buttonsEnabled\r\n },\r\n {\r\n text: 'Generate summaries',\r\n promptType: PromptTypeEnum.Summarize,\r\n isEnabled: () => buttonsEnabled\r\n },\r\n {\r\n text: 'Generate titles',\r\n promptType: PromptTypeEnum.Title,\r\n isEnabled: () => buttonsEnabled\r\n },\r\n ];\r\n \r\n const createMenuItem = ({ text, promptType, isEnabled }) => ({\r\n type: 'menuitem',\r\n text,\r\n onAction: () => generateAndOpenSmartContent && generateAndOpenSmartContent(PromptTypeEnum.Body, promptType, editorRef.current.getContent()),\r\n onSetup: (api) => {\r\n api.setEnabled(isEnabled());\r\n }\r\n });\r\n \r\n return menuItemsConfig.map(createMenuItem);\r\n };\r\n\r\n /**\r\n * Creates the menu buttons for the smart content quick bar when highlighting text.\r\n * @param editor takes in the parameter editor to get the selected text.\r\n */\r\n const createSmartContentHighlightedMenuButtons = function (editor: any) {\r\n const menuActions = [\r\n { text: 'Rewrite', type: PromptTypeEnum.Rewrite },\r\n { text: 'Expand', type: PromptTypeEnum.Expand },\r\n { text: 'Shorten', type: PromptTypeEnum.Shorten },\r\n {\r\n text: 'Change Tone', type: 'nested', subMenu: [\r\n { text: 'Friendly', type: PromptTypeEnum.Friendly },\r\n { text: 'Professional', type: PromptTypeEnum.Professional },\r\n { text: 'Witty', type: PromptTypeEnum.Witty },\r\n { text: 'Heartfelt', type: PromptTypeEnum.Heartfelt },\r\n { text: 'Educational', type: PromptTypeEnum.Educational },\r\n { text: 'Gender Neutral', type: PromptTypeEnum.GenderNeutral }\r\n ]\r\n }\r\n ];\r\n \r\n const createAction = (text, actionType) => ({\r\n type: 'menuitem',\r\n text,\r\n onAction: () => onShowSmartContentInsert && onShowSmartContentInsert(getSelectedText(editor), actionType)\r\n });\r\n \r\n const createMenuItems = (actions) => actions.map(action => {\r\n if (action.type === 'nested') {\r\n return {\r\n type: 'nestedmenuitem',\r\n text: action.text,\r\n getSubmenuItems: () => createMenuItems(action.subMenu)\r\n };\r\n } else {\r\n return createAction(action.text, action.type);\r\n }\r\n });\r\n \r\n return createMenuItems(menuActions);\r\n };\r\n \r\n /*\r\n * Adds a custom div into the menu item for personalization tokens to also display a styled description\r\n */\r\n const addCustomDescriptionsToPersonalizationTokens = (title: string, description: string) => {\r\n if (personalizationTokens.length > 0) {\r\n // grab the rendered div from the toolbar + dropdown insert menu where personalization tokens exist\r\n const menuItemDiv = document.querySelector(`div[title=\"${title}\"][role=\"menuitem\"]`) as HTMLDivElement;\r\n\r\n // sometimes the render is triggered mutliple times per menu item -- ensure that we're only adding the description once per node\r\n if (menuItemDiv.children.length === 1) {\r\n // create the description div\r\n let customDescriptionDiv = document.createElement('div');\r\n customDescriptionDiv.textContent = description;\r\n customDescriptionDiv.style.fontSize = \"10px\";\r\n customDescriptionDiv.style.color = \"#7f7f7f\";\r\n customDescriptionDiv.style.marginLeft = \"4px\";\r\n\r\n // append a copy of the div to both toolbar and dropdown menu items\r\n menuItemDiv.style.fontSize = \"14px\";\r\n menuItemDiv.style.color = \"#333333\";\r\n menuItemDiv.style.display = \"flex\";\r\n menuItemDiv.style.flexDirection = \"column\";\r\n menuItemDiv.style.alignItems = \"flex-start\";\r\n menuItemDiv.appendChild(customDescriptionDiv);\r\n }\r\n }\r\n }\r\n\r\n const getContentCssUrl = (): string => `${process.env.PUBLIC_URL}/tinyContentCss.css`;\r\n\r\n // for use in onPrePaste - TinyMCE does not support async functions on paste_preprocess and it\r\n // causes images_upload_handler to run before paste_preprocess is actually finished (if async)\r\n // so we must fetch the blob data synchronously \r\n const fetchBlobDataSynchronously = (blobUrl: string): Blob | null => {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open('GET', blobUrl, false); // Synchronous request\r\n \r\n xhr.send();\r\n \r\n return xhr.status === 200 ? \r\n base64toBlob(xhr.response, xhr.getResponseHeader('content-type')) :\r\n null;\r\n }\r\n\r\n const base64toBlob = (base64String: string, mimeType: string | null): Blob => {\r\n const byteCharacters = Buffer.from(base64String, 'base64');\r\n return new Blob([byteCharacters.buffer], { type: mimeType ?? 'image/*' });\r\n }\r\n\r\n /**\r\n * Process pasted content\r\n * - remove any images that are not blobs or from our blob storage\r\n */\r\n const onPrePaste = (editor: IEditor, args: IPrePasteProcessEvent) => {\r\n if (args.internal) return;\r\n\r\n // load content into a dom for easy parsing\r\n let temp = document.createElement(\"div\");\r\n temp.innerHTML = args.content;\r\n\r\n // find all the img tags\r\n let imgs = temp.getElementsByTagName(\"img\");\r\n\r\n let showErrorMessage = false;\r\n let showWrongFileTypeMessage = false;\r\n let allowedUrlRegex = /($\\.jpg)|($\\.png)|($\\.jpeg)|(:image\\/png)|(:image\\/jpg)|(:image\\/jpeg)/m;\r\n\r\n for (let i = 0; i < imgs.length; i++) {\r\n let curr = imgs[i];\r\n // for when a user drag and drops an image from their own computer, it enters as a blob:/\r\n // so we transform it into a blob to get the mime-type to see if it's an image.\r\n // must fetch synchronously as paste_preprocess does not support async functions...\r\n let blob = fetchBlobDataSynchronously(curr.src);\r\n\r\n // validate url file extension or data/blob uri mime type\r\n showWrongFileTypeMessage = !(allowedUrlRegex.test(curr.src) || (blob && ALLOWED_BLOB_TYPES.includes(blob.type)));\r\n\r\n // if image is from our blob storage or a data/blob uri, it's allowed to be pasted and so we skip it\r\n if (\r\n !showWrongFileTypeMessage && (\r\n EDIT_IMAGE_CORS_HOSTS.includes(curr.src) || // check if image is our blob host\r\n /data:[\\w/\\-\\.]+;\\w+,.*/.test(curr.src) || // check if it's a data url\r\n curr.src.includes(window.location.origin) // check if it's a blob uploaded via drag n drop\r\n )\r\n )\r\n continue;\r\n \r\n // remove the images that are not from our blob storage nor a data uri\r\n showErrorMessage = !showWrongFileTypeMessage;\r\n curr.remove();\r\n }\r\n\r\n if (showErrorMessage || showWrongFileTypeMessage) {\r\n editor.notificationManager.open({\r\n type: \"error\",\r\n text: showWrongFileTypeMessage\r\n ? \"File type not supported\"\r\n : `Images hosted externally are not allowed.`,\r\n closeButton: true,\r\n timeout: 6000\r\n });\r\n\r\n args.content = temp.innerHTML;\r\n }\r\n }\r\n\r\n /**\r\n * On drag image into editor, send upload request to our blob and return a sas url\r\n * - this sas url is then injected to the src of the image by tiny\r\n */\r\n const uploadImageHandler = async (blobInfo, progress) => {\r\n if (ALLOWED_BLOB_TYPES.includes(blobInfo.blob().type)) {\r\n try {\r\n let result = await ospreyApi.uploadImage(blobInfo);\r\n\r\n return result.sasUrl;\r\n } catch (err) {\r\n return Promise.reject({\r\n remove: true,\r\n message: \"Please try again later.\"\r\n });\r\n }\r\n }\r\n }\r\n\r\n /* If any iframes with width/height attributes\r\n * apply those widths and heights via style attribute\r\n * - this solves the issue where the responsive styling for when viewing\r\n * a post overwrites the height attribute causing the video to shrink vertically.\r\n */\r\n const processIframes = (value: string): string => {\r\n let temp = document.createElement(\"div\");\r\n temp.innerHTML = value;\r\n\r\n let iframes = temp.getElementsByTagName(\"iframe\");\r\n\r\n let updated = false;\r\n\r\n for (let j = 0; j < iframes.length; j++) {\r\n let curr = iframes[j];\r\n\r\n let styleWidth = curr.style.width;\r\n let styleHeight = curr.style.height;\r\n\r\n if (curr.width && (styleWidth === undefined || styleWidth === null || styleWidth === \"\")) {\r\n curr.style.width = `${curr.width}px`;\r\n updated = true;\r\n }\r\n\r\n if (curr.height && (styleHeight === undefined || styleHeight === undefined || styleHeight === \"\")) {\r\n curr.style.height = `${curr.height}px`;\r\n updated = true;\r\n }\r\n }\r\n\r\n return updated ? temp.innerHTML : value;\r\n }\r\n\r\n // update local state and also propage event up tree\r\n const onBodyLiveChange = (newValue: string) => {\r\n newValue = processIframes(newValue);\r\n\r\n setValue(newValue);\r\n onChange(newValue);\r\n }\r\n\r\n // only update local state\r\n const onBodyLocalChange = (newValue: string) => {\r\n newValue = processIframes(newValue);\r\n\r\n //Enable \"save as draft\" button on first entry.\r\n if(!changedSinceSaved) {\r\n onBodyLiveChange(newValue);\r\n }\r\n\r\n setValue(newValue);\r\n }\r\n\r\n const onBodyChange = () => {\r\n if (editorRef.current?.isDirty()) \r\n onChange(value)\r\n }\r\n\r\n const getContentCss = (): string[] => {\r\n let results = [getContentCssUrl()];\r\n\r\n if (customCss && customCss.sasUrl)\r\n results = [...results, customCss.sasUrl];\r\n\r\n return results;\r\n }\r\n\r\n const mediaUrlResolver = (data, resolve) => {\r\n const url = new URL(data.url);\r\n const urlParams = new URLSearchParams(url.search);\r\n\r\n // handle unlisted media urls manually (ones with an h query param)\r\n // otherwise, fallback to default url resolver by tinymce\r\n // the default resolver strips all query parameters for vimeo videos and replaces with some defaults\r\n // you can see this at node_modules/tinymce/plugins/media/plugin.js look for the urlPatterns array and scroll to the vimeo rules\r\n // here we keep the h parameter only and add the same defaults that tiny does\r\n const h = urlParams.get(\"h\");\r\n\r\n if (h) {\r\n const sanitizedUrlParams = new URLSearchParams();\r\n sanitizedUrlParams.set(\"h\", h);\r\n sanitizedUrlParams.set(\"title\", \"0\");\r\n sanitizedUrlParams.set(\"byline\", \"0\");\r\n\r\n const sanitizedUrl = `${url.protocol}//${url.hostname}${url.pathname}?${sanitizedUrlParams.toString()}`;\r\n\r\n const embedHtml = ``;\r\n resolve({ html: embedHtml });\r\n } else {\r\n resolve({ html: \"\" });\r\n }\r\n }\r\n\r\n /**\r\n * Creates the toolbar menu buttons adding our custom merge tags / personalization tokens\r\n */\r\n const createPersonalizationTokensMenuButtons = function () {\r\n if (personalizationTokens.length === 0) return [];\r\n\r\n const menuItems = personalizationTokens.map(token => ({\r\n type: \"menuitem\",\r\n text: token.title,\r\n onAction: () => editorRef.current.insertContent(`${MERGE_TAG_PREFIX}${token.value}${MERGE_TAG_SUFFIX}`),\r\n onSetup: () => {\r\n addCustomDescriptionsToPersonalizationTokens(token.title, token.description);\r\n }\r\n }));\r\n \r\n return menuItems;\r\n };\r\n\r\n return (\r\n <>\r\n {loading &&\r\n }\r\n onSetup(e),\r\n convert_urls: false,\r\n spellchecker_rpc_url: spellcheckerRpcUrl,\r\n spellchecker_language: spellcheckLanguage,\r\n spellchecker_active: spellcheckEnabled,\r\n spellchecker_languages: process.env.REACT_APP_TINYMCE_SPELLCHECK_LANGS,\r\n noneditable_noneditable_class: 'mceNonEditable',\r\n styles: {\r\n \"intense-emphasis\": { selector: \"a\", classes: \"intenseEmphasis\", styles: INTENSE_EMPHASIS_STYLE },\r\n },\r\n menubar: \"edit insert format tools table\",\r\n menu: {\r\n edit: { title: \"Edit\", items: \"undo redo | selectall | searchreplace\" },\r\n insert: { title: \"Insert\", items: `link ${enableInlineImages ? \"inlineimage\" : \"\"} ${personalizationTokens.length > 0 ? \"customMergeTags\" : \"\"} ${enableEmbeddedMedia ? \"media\" : \"\"} | charmap hr | anchor` },\r\n format: { title: \"Format\", items: \"bold italic underline strikethrough superscript subscript | blocks fontfamily fontsize align | forecolor backcolor | removeformat\" },\r\n tools: { title: \"Tools\", items: \"code\" },\r\n table: { title: \"Table\", items: \"inserttable | cell row column | tableprops deletetable\" }\r\n },\r\n plugins: [\r\n \"tinymcespellchecker\", \"a11ychecker\", \"anchor\", \"autolink\", \"autoresize\", \"charmap\", \"code\", \"link\", \"lists\", \"powerpaste\", \"searchreplace\", \"table\", \"advtable\", \"wordcount\",\r\n \"quickbars\", \"advcode\", \"image\", \"editimage\", \"fullscreen\", \"advtemplate\", ...(enableEmbeddedMedia ? [\"media\"] : []), ...(enablePageEmbed ? [\"pageembed\"] : []), ...(personalizationTokens.length > 0 ? [\"mergetags\"] : [])\r\n ],\r\n link_default_target: \"_blank\",\r\n link_target_list: [\r\n { text: 'Current window', value: '_self' },\r\n { text: 'New window', value: '_blank' }\r\n ],\r\n default_link_target: '_blank',\r\n editimage_cors_hosts: EDIT_IMAGE_CORS_HOSTS,\r\n editimage_toolbar: 'rotateleft rotateright | flipv fliph | editimage imageoptions',\r\n image_advtab: true,\r\n quickbars_insert_toolbar: \"\",\r\n quickbars_selection_toolbar: 'bold italic | link h2 h3 blockquote | smartContentQuickBarButton',\r\n powerpaste_word_import: \"merge\",\r\n powerpaste_html_import: \"merge\",\r\n paste_preprocess: onPrePaste,\r\n images_upload_handler: uploadImageHandler,\r\n images_reuse_filename: true,\r\n toolbar: `undo redo | red | blocks | ${personalizationTokens.length > 0 ? \"customMergeTags\" : \"\" } smartContentToolBarDropDown bold italic underline forecolor backcolor | \\\r\n alignleft aligncenter alignright alignjustify customfullscreen | pastetext bullist numlist outdent indent | \\\r\n link unlink intenseEmphasis inlineimage ${enableEmbeddedMedia ? \"media\" : \"\"} ${enablePageEmbed ? \"pageembed\" : \"\"} | removeformat a11ycheck | spellchecker language | code inserttemplate addtemplate`,\r\n toolbar_mode: floatingToolbar ? \"floating\" : \"sliding\",\r\n font_family_formats: \"Andale Mono=andale mono,times;\" +\r\n \"Arial=arial,helvetica,sans-serif;\" +\r\n \"Arial Black=arial black,avant garde;\" +\r\n \"Book Antiqua=book antiqua,palatino;\" +\r\n \"Comic Sans MS=comic sans ms,sans-serif;\" +\r\n \"Courier New=courier new,courier;\" +\r\n \"Georgia=georgia,palatino;\" +\r\n \"Helvetica=helvetica;\" +\r\n \"Impact=impact,chicago;\" +\r\n \"Roboto=Roboto, sans-serif;\" +\r\n \"Symbol=symbol;\" +\r\n \"Tahoma=tahoma,arial,helvetica,sans-serif;\" +\r\n \"Terminal=terminal,monaco;\" +\r\n \"Times New Roman=times new roman,times;\" +\r\n \"Trebuchet MS=trebuchet ms,geneva;\" +\r\n \"Verdana=verdana,geneva;\" +\r\n \"Webdings=webdings;\" +\r\n \"Wingdings=wingdings,zapf dingbats\",\r\n advtemplate_list: async () => {\r\n return await TinyMceTemplatesService.getCategories({ excludeInlineImages: !enableInlineImages, excludeEmbeddedMedia: !enableEmbeddedMedia });\r\n },\r\n advtemplate_get_template: TinyMceTemplatesService.getTemplate,\r\n advtemplate_create_category: TinyMceTemplatesService.createCategory,\r\n advtemplate_create_template: TinyMceTemplatesService.createTemplate,\r\n advtemplate_rename_category: TinyMceTemplatesService.renameCategory,\r\n advtemplate_rename_template: TinyMceTemplatesService.renameTemplate,\r\n advtemplate_delete_category: TinyMceTemplatesService.deleteCategory,\r\n advtemplate_delete_template: TinyMceTemplatesService.deleteTemplate,\r\n advtemplate_move_template: TinyMceTemplatesService.moveTemplate,\r\n advtemplate_move_category_items: TinyMceTemplatesService.moveCategoryItems,\r\n media_url_resolver: mediaUrlResolver,\r\n video_template_callback: (data) => {\r\n let result = `';\r\n\r\n if (data.source.includes(\"wistia.net/embed/\"))\r\n result = `

    \r\n \r\n

    `;\r\n else if (data.source.includes(\"players.brightcove.net\"))\r\n result = `

    \r\n \r\n

    `;\r\n\r\n return result;\r\n },\r\n mergetags_prefix: MERGE_TAG_PREFIX,\r\n mergetags_suffix: MERGE_TAG_SUFFIX,\r\n mergetags_list: personalizationTokens,\r\n ...initOptions\r\n }}\r\n onEditorChange={livePreview ? onBodyLiveChange : onBodyLocalChange}\r\n onBlur={onBodyChange}\r\n onFocus={onFocus}\r\n />\r\n \r\n );\r\n}\r\n\r\nexport { AuthoringTinyEditor };\r\n","import * as React from \"react\";\r\nimport LoadingCircle from \"modules/common/components/loadingCircle\";\r\n\r\nexport interface LoadingProps {\r\n size?: number;\r\n padding?: number;\r\n style?: React.CSSProperties;\r\n containerStyle?: React.CSSProperties;\r\n}\r\n\r\nclass Loading extends React.Component {\r\n public render() {\r\n let size = this.props.size || 40;\r\n\r\n return (\r\n
    \r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default Loading;\r\n","import * as actions from 'network/actions';\r\n\r\nexport const FetchIdealWordCountLimit = () => {\r\n return actions.NetworkRequest({\r\n method: 'GET',\r\n url: '/{tenant}/adminapi/v1/authoring/wordCountTip',\r\n })\r\n}\r\n\r\nexport const FetchCurrentPostSentiment = (content: string) => {\r\n //only send text content for sentiment analysis\r\n const strippedContent = new DOMParser().parseFromString(content, \"text/html\").body.textContent || \"\"\r\n return actions.NetworkRequest({\r\n method: 'POST',\r\n url: '/{tenant}/adminapi/v1/authoring/sentiment',\r\n body: { 'Content': strippedContent }\r\n })\r\n}\r\n","import * as actions from \"network/actions\";\r\n\r\nimport { PostFeedFilters } from \"modules/posts/models\";\r\n\r\nexport const FetchPostsFeed = (filters: Partial, page: number) => {\r\n const updatedFilters: Partial = {\r\n ...filters,\r\n postTypes: !!filters.postTypes && !!filters.postTypes.length ? filters.postTypes : undefined,\r\n tags: !!filters.tags && !!filters.tags.length ? filters.tags : undefined\r\n };\r\n\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/api/v2/posts/feed?maxResults=${12}&pageNumber=${page}&getMandatoryAndCompliance=true`,\r\n body: JSON.stringify(updatedFilters)\r\n });\r\n}\r\n\r\nexport const FetchPostsFeedLocal = (filters: Partial, maxResults: number, page: number) => {\r\n const updatedFilters: Partial = {\r\n ...filters,\r\n postTypes: !!filters.postTypes && !!filters.postTypes.length ? filters.postTypes : undefined,\r\n tags: !!filters.tags && !!filters.tags.length ? filters.tags : undefined\r\n };\r\n\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/api/v2/posts/feed?maxResults=${maxResults}&pageNumber=${page}&getMandatoryAndCompliance=true`,\r\n body: JSON.stringify(updatedFilters)\r\n });\r\n}\r\n\r\nexport const GetPost = (id: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/api/v2/posts/${id}`\r\n });\r\n}","import * as actions from \"network/actions\";\r\n\r\nexport const SendAcknowledgement = (postId: string) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"PATCH\",\r\n url: `/{tenant}/api/v1/posts/${postId}/acknowledge`,\r\n body: JSON.stringify({\r\n complianceSource: \"Web\"\r\n })\r\n });\r\n}","import { FilterGroupName, MediaFiltersModel, MoveFiles, SortGroupName } from \"modules/gallery\";\r\nimport { ROOT_FOLDER_ID } from \"modules/gallery/chonkyFileAdapter\";\r\nimport * as actions from \"network/actions\";\r\n\r\nexport const FetchImages = (\r\n forGallery?: boolean, \r\n pageAmount?: number, \r\n pageNumber?: number, \r\n mediaFilter?: MediaFiltersModel\r\n) => {\r\n const queryParams = {};\r\n\r\n const filterType = Object.values(FilterGroupName).indexOf(mediaFilter?.filterType ?? FilterGroupName.AllImages);\r\n const sortType = Object.values(SortGroupName).indexOf(mediaFilter?.sortType ?? SortGroupName.Newest);\r\n\r\n queryParams[\"forGallery\"] = !!forGallery;\r\n queryParams[\"pageAmount\"] = pageAmount;\r\n queryParams[\"pageNumber\"] = pageNumber;\r\n queryParams[\"parentId\"] = mediaFilter?.parentId ?? \"\";\r\n queryParams[\"searchText\"] = mediaFilter?.searchText ?? \"\";\r\n queryParams[\"filterType\"] = filterType !== -1 ? filterType : \"\";\r\n queryParams[\"sortType\"] = sortType !== -1 ? sortType : \"\";\r\n queryParams[\"showFoldersFirst\"] = mediaFilter?.showFoldersFirst ?? \"\";\r\n\r\n const headers = {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"application/json\",\r\n \"Access-Control-Allow-Headers\": \"Content-Type\",\r\n };\r\n\r\n return actions.NetworkRequest({\r\n headers,\r\n method: \"GET\",\r\n url: \"/{tenant}/ospreyapi/v1/images\",\r\n queryParams,\r\n });\r\n}\r\n\r\nexport const FetchImageByName = (fileName: string, type: string, parentId: string = \"\", asChonkyFileData: boolean = false) => {\r\n const queryParams = {};\r\n queryParams[\"fileName\"] = fileName;\r\n queryParams[\"fileType\"] = type\r\n queryParams[\"parentId\"] = parentId;\r\n queryParams[\"parseAsChonkyFileData\"] = asChonkyFileData;\r\n\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: \"/{tenant}/ospreyapi/v1/images/fileName\",\r\n queryParams,\r\n });\r\n}\r\n\r\nexport const FetchFolderByName = (fileName: string, parentId: string = \"\", asChonkyFileData: boolean = false) => {\r\n const queryParams = {};\r\n queryParams[\"fileName\"] = fileName;\r\n queryParams[\"parentId\"] = parentId;\r\n queryParams[\"parseAsChonkyFileData\"] = asChonkyFileData;\r\n\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: \"/{tenant}/ospreyapi/v1/folders\",\r\n ...{ queryParams },\r\n });\r\n}\r\n\r\nexport const UploadFolder = (fileName: string, parentId: string = \"\") => {\r\n const queryParams = {};\r\n queryParams[\"fileName\"] = fileName;\r\n queryParams[\"parentId\"] = parentId;\r\n\r\n return actions.NetworkRequest({\r\n method: \"POST\",\r\n url: \"/{tenant}/ospreyapi/v1/folders\",\r\n ...{ queryParams },\r\n });\r\n}\r\n\r\nexport const GetUniqueFileName = (fileName: string, fileType: string, parentId: string = \"\", abortSignal?: AbortSignal) => {\r\n const queryParams = {};\r\n queryParams[\"fileName\"] = fileName;\r\n queryParams[\"fileType\"] = fileType;\r\n queryParams[\"parentId\"] = parentId;\r\n\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: \"/{tenant}/ospreyapi/v1/images/generateFileName\",\r\n queryParams,\r\n abortSignal\r\n });\r\n}\r\n\r\nexport const GetUniqueFolderName = (folderName: string, parentId: string = \"\") => {\r\n const queryParams = {};\r\n queryParams[\"folderName\"] = folderName;\r\n queryParams[\"parentId\"] = parentId;\r\n\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: \"/{tenant}/ospreyapi/v1/folders/generateFolderName\",\r\n queryParams,\r\n });\r\n}\r\n\r\nexport const DeleteImageByName = (fileName: string, fileType: string, parentId: string = \"\", abortSignal?: AbortSignal) => {\r\n const queryParams = {};\r\n queryParams[\"fileName\"] = fileName;\r\n queryParams[\"fileType\"] = fileType;\r\n queryParams[\"parentId\"] = parentId;\r\n\r\n return actions.NetworkRequest({\r\n method: \"DELETE\",\r\n url: \"/{tenant}/ospreyapi/v1/images/filename\",\r\n queryParams,\r\n abortSignal\r\n });\r\n}\r\n\r\nexport const DeleteFolderByName = (folderName: string, parentId?: string) => {\r\n const queryParams = {};\r\n queryParams[\"folderName\"] = folderName;\r\n queryParams[\"parentId\"] = parentId ?? \"\";\r\n\r\n return actions.NetworkRequest({\r\n method: \"DELETE\",\r\n url: \"/{tenant}/ospreyapi/v1/folders\",\r\n queryParams,\r\n });\r\n}\r\n\r\nexport const FetchDocumentForId = (id: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: \"/{tenant}/ospreyapi/v1/files/doc/{id}\",\r\n params: {id: id}\r\n });\r\n}\r\n\r\nexport const FetchDocuments = (continuationToken?: string, forDirectory?: boolean) => {\r\n const headers = {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"application/json\",\r\n \"Access-Control-Allow-Headers\": \"Content-Type\",\r\n };\r\n\r\n\r\n return actions.NetworkRequest({\r\n headers,\r\n method: \"POST\",\r\n url: '/{tenant}/ospreyapi/v1/files',\r\n body: {continuationToken: continuationToken },\r\n });\r\n}\r\n\r\nexport const FetchImageForId = (id: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: \"/{tenant}/ospreyapi/v1/images/{id}\",\r\n params: {id: id}\r\n });\r\n}\r\n\r\nexport const GetImageGallery = (pageNumber: number, includeVideos: boolean) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"GET\",\r\n url: `/{tenant}/ospreyapi/v1/images/pagedGallery?pageNumber=${pageNumber}&includeVideos=${includeVideos}`,\r\n });\r\n}\r\n\r\nexport const UploadImage = (file: File, parentId: string = \"\", abortSignal?: AbortSignal) => {\r\n const body = new FormData();\r\n body.append(\"image\", file);\r\n\r\n return actions.NetworkRequest({\r\n method: \"POST\",\r\n url: `/{tenant}/ospreyapi/v1/images/upload?fileName=${file.name}&parentId=${parentId}`,\r\n body,\r\n abortSignal,\r\n });\r\n};\r\n\r\nexport const DeleteImage = (id: string) => {\r\n return actions.NetworkRequest({\r\n method: \"DELETE\",\r\n url: `/{tenant}/ospreyapi/v1/images/${id}`,\r\n });\r\n};\r\n\r\nexport const DeleteBulkImages = (ids: string[]) => {\r\n const headers = {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"application/json\",\r\n \"Access-Control-Allow-Headers\": \"Content-Type\",\r\n };\r\n\r\n const body = {\r\n ids\r\n }\r\n\r\n return actions.NetworkRequest({\r\n headers,\r\n method: \"DELETE\",\r\n url: `/{tenant}/ospreyapi/v1/images/bulk`,\r\n body: JSON.stringify(body)\r\n });\r\n};\r\n\r\nexport const FetchVideoForId = (id: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: \"/{tenant}/ospreyapi/v1/videos/{id}\",\r\n params: {id: id}\r\n });\r\n}\r\n\r\nexport abstract class VideoUploads {\r\n static PrepareUpload = (fileName: string) => {\r\n return actions.NetworkRequest({\r\n method: \"POST\",\r\n url: \"/{tenant}/ospreyapi/v1/videos/upload/new\",\r\n queryParams: {\r\n fileName,\r\n },\r\n });\r\n };\r\n\r\n static UploadChunk = (data: Blob, chunkNumber: number, uploadId: string) => {\r\n const body = new FormData();\r\n body.append(\"video\", data);\r\n return actions.NetworkRequest({\r\n method: \"PUT\",\r\n url: `/{tenant}/ospreyapi/v1/videos/upload/${uploadId}`,\r\n body: body,\r\n headers: {\r\n \"chunk-number\": chunkNumber,\r\n },\r\n });\r\n };\r\n\r\n static CommitUpload = (uploadId: string) => {\r\n return actions.NetworkRequest({\r\n method: \"POST\",\r\n url: `/{tenant}/ospreyapi/v1/videos/upload/${uploadId}`,\r\n });\r\n };\r\n\r\n static AbortUpload = (uploadId: string) => {\r\n return actions.NetworkRequest({\r\n method: \"DELETE\",\r\n url: `/{tenant}/ospreyapi/v1/videos/upload/${uploadId}`,\r\n });\r\n };\r\n\r\n static UploadImageThumbnail = (blob: Blob, videoId: string) => {\r\n let body = new FormData();\r\n body.append(\"image\", blob);\r\n return actions.NetworkRequest({\r\n method: \"POST\",\r\n url: `/{tenant}/ospreyapi/v1/videos/upload/${videoId}/thumb`,\r\n body: body,\r\n });\r\n };\r\n}\r\n\r\nexport const UploadDocument = (file: File) => {\r\n const body = new FormData();\r\n body.append(\"document\", file);\r\n return actions.NetworkRequest({\r\n method: \"POST\",\r\n url: `/{tenant}/ospreyapi/v1/files/upload?fileName=${file.name}`,\r\n body,\r\n });\r\n};\r\n\r\nexport const UploadSupportingDocument = (file: File, type: string) => {\r\n const body = new FormData();\r\n body.append(\"document\", file);\r\n return actions.NetworkRequest({\r\n method: \"POST\",\r\n url: `/{tenant}/ospreyapi/v1/documents/upload?type=${type}&fileName=${file.name}`,\r\n body,\r\n });\r\n};\r\n\r\nexport const RenameImage = (id: string, newImageName: string) => {\r\n const queryParams = {};\r\n\r\n queryParams[\"fileName\"] = newImageName;\r\n\r\n const headers = {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"application/json\",\r\n \"Access-Control-Allow-Headers\": \"Content-Type\",\r\n };\r\n\r\n return actions.NetworkRequest({\r\n headers,\r\n method: \"PUT\",\r\n url: `/{tenant}/ospreyapi/v1/images/${id}/filename`,\r\n queryParams,\r\n });\r\n}\r\n\r\nexport const RenameFolder = (id: string, newFolderName: string) => {\r\n const queryParams = {};\r\n\r\n queryParams[\"folderName\"] = newFolderName;\r\n\r\n const headers = {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"application/json\",\r\n \"Access-Control-Allow-Headers\": \"Content-Type\",\r\n };\r\n\r\n return actions.NetworkRequest({\r\n headers,\r\n method: \"PUT\",\r\n url: `/{tenant}/ospreyapi/v1/folders/${id}`,\r\n queryParams,\r\n });\r\n}\r\n\r\nexport const GetFolderAndImageCount = (folderId: string) => {\r\n const headers = {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"application/json\",\r\n \"Access-Control-Allow-Headers\": \"Content-Type\",\r\n };\r\n\r\n return actions.NetworkRequest({\r\n headers,\r\n method: \"GET\",\r\n url: `/{tenant}/ospreyapi/v1/folders/${folderId}/folderAndImageCount`\r\n });\r\n}\r\n\r\nexport const GetBulkFolderAndImageCount = (folderIds: string[]) => {\r\n const headers = {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"application/json\",\r\n \"Access-Control-Allow-Headers\": \"Content-Type\",\r\n };\r\n\r\n const body = {\r\n ids: folderIds\r\n }\r\n\r\n return actions.NetworkRequest({\r\n headers,\r\n method: \"POST\",\r\n url: `/{tenant}/ospreyapi/v1/folders/bulkFolderAndImageCount`,\r\n body: JSON.stringify(body)\r\n });\r\n}\r\n\r\nexport const DeleteFolder = (folderId: string) => {\r\n const headers = {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"application/json\",\r\n \"Access-Control-Allow-Headers\": \"Content-Type\",\r\n };\r\n\r\n return actions.NetworkRequest({\r\n headers,\r\n method: \"DELETE\",\r\n url: `/{tenant}/ospreyapi/v1/folders/${folderId}`\r\n });\r\n}\r\n\r\nexport const DeleteBulkFolders = (folderIds: string[]) => {\r\n const headers = {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"application/json\",\r\n \"Access-Control-Allow-Headers\": \"Content-Type\",\r\n };\r\n\r\n const body = {\r\n ids: folderIds\r\n }\r\n\r\n return actions.NetworkRequest({\r\n headers,\r\n method: \"DELETE\",\r\n url: `/{tenant}/ospreyapi/v1/folders/bulk`,\r\n body: JSON.stringify(body)\r\n });\r\n}\r\n\r\nexport const MoveMedia = (movePayload: MoveFiles) => {\r\n let body = {\r\n mediaToMove: movePayload.filesToMove.map(i => i.id)\r\n };\r\n\r\n if (movePayload.moveDest && movePayload.moveDest.id !== ROOT_FOLDER_ID) body[\"destinationFolderId\"] = movePayload.moveDest.id;\r\n if (movePayload.moveSrc && movePayload.moveSrc.id !== ROOT_FOLDER_ID) body[\"sourceFolderId\"] = movePayload.moveSrc.id;\r\n\r\n const headers = {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"application/json\",\r\n \"Access-Control-Allow-Headers\": \"Content-Type\",\r\n };\r\n\r\n return actions.NetworkRequest({\r\n headers,\r\n method: \"PUT\",\r\n url: `/{tenant}/ospreyapi/v1/folders/move`,\r\n body: JSON.stringify(body)\r\n });\r\n}\r\n\r\nexport const SetImageKeywords = (imageId: string, keywords: string[]) => {\r\n let body = { keywords };\r\n\r\n const headers = {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"application/json\",\r\n \"Access-Control-Allow-Headers\": \"Content-Type\",\r\n };\r\n\r\n return actions.NetworkRequest({\r\n headers,\r\n method: \"POST\",\r\n url: `/{tenant}/ospreyapi/v1/images/${imageId}/keywords`,\r\n body: JSON.stringify(body)\r\n });\r\n}","import * as actions from \"network/actions\";\r\n\r\nimport { PortalPagesFilterValues } from \"modules/portalPages/models\";\r\nimport cookie from \"utils/cookie\";\r\n\r\n\r\nexport const CreateNewDraft = (pageTitle: string, pageUrl: string, defaultJSON: any, audiences: string[]) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/portal/v1/pages/drafts`,\r\n body: JSON.stringify({\r\n title: pageTitle,\r\n url: pageUrl,\r\n portalPageJson: [defaultJSON],\r\n audiences: audiences\r\n })\r\n });\r\n}\r\n\r\nexport const DeleteDraft = (draftId: string) => {\r\n return actions.NetworkRequest({\r\n method: \"DELETE\",\r\n url: `/{tenant}/portal/v1/pages/drafts/${draftId}`\r\n });\r\n}\r\n\r\nexport const GetDraft = (draftId: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/portal/v1/pages/drafts/${draftId}`\r\n });\r\n}\r\n\r\nexport const ModifyDraftDetails = (draftId: string, pageTitle: string, pageUrl: string, audiences: string[]) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"PATCH\",\r\n url: `/{tenant}/portal/v1/pages/drafts/${draftId}`,\r\n body: JSON.stringify({\r\n title: pageTitle,\r\n url: pageUrl,\r\n audiences: !!audiences.length ? audiences : null\r\n })\r\n });\r\n}\r\n\r\nexport const ModifyDraftTitle = (draftId: string, pageTitle: string) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"PATCH\",\r\n url: `/{tenant}/portal/v1/pages/drafts/${draftId}`,\r\n body: JSON.stringify({\r\n title: pageTitle\r\n })\r\n });\r\n}\r\n\r\nexport const PublishDraft = (draftId: string) => {\r\n return actions.NetworkRequest({\r\n method: \"POST\",\r\n url: `/{tenant}/portal/v1/pages/publish/${draftId}`\r\n });\r\n}\r\n\r\nexport const SaveDraft = (draftId: string, body: string) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"PATCH\",\r\n url: `/{tenant}/portal/v1/pages/drafts/${draftId}`,\r\n body: JSON.stringify({\r\n portalPageJson: [body]\r\n })\r\n });\r\n}\r\n\r\n\r\nexport const GetPage = (id: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/portal/v1/pages/${id}`\r\n });\r\n}\r\n\r\nexport const GetPages = (pageNumber: number, filters: Partial, pageAmount?: number) => {\r\n let rowsPerPage = pageAmount || cookie.getRowsPerPage();\r\n\r\n return actions.NetworkRequest({\r\n method: \"POST\",\r\n url: `/{tenant}/portal/v1/pages`,\r\n queryParams: { \"pageAmount\": rowsPerPage, \"pageNumber\": pageNumber },\r\n body: JSON.stringify({\r\n ...filters,\r\n audiences: filters.audiences ? filters.audiences.map(audience => audience.id) : []\r\n })\r\n });\r\n}\r\n\r\nexport const GetDisabledPages = (pageNumber: number, filters: Partial, pageAmount?: number) => {\r\n let rowsPerPage = pageAmount || cookie.getRowsPerPage();\r\n\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/portal/v1/pages`,\r\n queryParams: { \"pageAmount\": rowsPerPage, \"pageNumber\": pageNumber },\r\n body: JSON.stringify({\r\n ...filters,\r\n audiences: filters.audiences ? filters.audiences.map(audience => audience.id) : [],\r\n currentFilter: [\"Disabled\"]\r\n })\r\n });\r\n}\r\n\r\nexport const GetDraftPages = (pageNumber: number, filters: Partial, pageAmount?: number) => {\r\n let rowsPerPage = pageAmount || cookie.getRowsPerPage();\r\n\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/portal/v1/pages`,\r\n queryParams: { \"pageAmount\": rowsPerPage, \"pageNumber\": pageNumber },\r\n body: JSON.stringify({\r\n ...filters,\r\n audiences: filters.audiences ? filters.audiences.map(audience => audience.id) : [],\r\n currentFilter: [\"Draft\"]\r\n })\r\n });\r\n}\r\n\r\nexport const GetEnabledPages = (pageNumber: number, filters: Partial, pageAmount?: number) => {\r\n let rowsPerPage = pageAmount || cookie.getRowsPerPage();\r\n\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/portal/v1/pages`,\r\n queryParams: { \"pageAmount\": rowsPerPage, \"pageNumber\": pageNumber },\r\n body: JSON.stringify({\r\n ...filters,\r\n audiences: filters.audiences ? filters.audiences.map(audience => audience.id) : [],\r\n currentFilter: [\"Enabled\"]\r\n })\r\n });\r\n}\r\n\r\nexport const CheckIfUrlExists = (url: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/portal/v1/pages/url?attempt=${url}`\r\n });\r\n}\r\n\r\nexport const DeletePage = (id: string) => {\r\n return actions.NetworkRequest({\r\n method: \"DELETE\",\r\n url: `/{tenant}/portal/v1/pages/${id}`\r\n });\r\n}\r\n\r\nexport const DisablePage = (id: string) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"PATCH\",\r\n url: `/{tenant}/portal/v1/pages/${id}`,\r\n body: JSON.stringify({\r\n enabled: false\r\n })\r\n });\r\n}\r\n\r\nexport const EnablePage = (id: string) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"PATCH\",\r\n url: `/{tenant}/portal/v1/pages/${id}`,\r\n body: JSON.stringify({\r\n enabled: true\r\n })\r\n });\r\n}\r\n\r\nexport const ModifyPageDetails = (id: string, pageTitle: string, pageUrl: string, audiences: string[]) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"PATCH\",\r\n url: `/{tenant}/portal/v1/pages/${id}`,\r\n body: JSON.stringify({\r\n title: pageTitle,\r\n url: pageUrl,\r\n audiences: !!audiences.length ? audiences : null\r\n })\r\n });\r\n}\r\n\r\nexport const ModifyPageTitle = (id: string, pageTitle: string) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"PATCH\",\r\n url: `/{tenant}/portal/v1/pages/${id}`,\r\n body: JSON.stringify({\r\n title: pageTitle\r\n })\r\n });\r\n}\r\n\r\nexport const SetPageAsHome = (id: string) => {\r\n return actions.NetworkRequest({\r\n method: \"POST\",\r\n url: `/{tenant}/portal/v1/pages/${id}/home`\r\n });\r\n}\r\n\r\n\r\nexport const CreateNewChildNavigationItem = (portalPageId: string, parentId: string, name: string, url: string, sequence: number) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/portal/v1/navigation`,\r\n body: JSON.stringify({\r\n portalPageId,\r\n parentId,\r\n name,\r\n url,\r\n sequence\r\n })\r\n });\r\n}\r\n\r\nexport const CreateNewNavigationItem = (portalPageId: string, name: string, url: string, sequence: number) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/portal/v1/navigation`,\r\n body: JSON.stringify({\r\n portalPageId,\r\n name,\r\n url,\r\n sequence\r\n })\r\n });\r\n}\r\n\r\nexport const DeleteNavigationItem = (id: string) => {\r\n return actions.NetworkRequest({\r\n method: \"DELETE\",\r\n url: `/{tenant}/portal/v1/navigation/${id}`\r\n });\r\n}\r\n\r\nexport const GetNavigation = () => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/portal/v1/navigation`\r\n });\r\n}\r\n\r\nexport const GetNavigationItemByURL = (url: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/portal/v1/navigation?url=${url}`\r\n });\r\n}\r\n\r\nexport const GetNavigationItems = () => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/portal/v1/navigation/management`\r\n });\r\n}\r\n\r\nexport const GetNavigationItem = (id: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/portal/v1/navigation/${id}`\r\n });\r\n}\r\n\r\nexport const SetNavigationItemAsParent = (id: string, sequence: number) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"PATCH\",\r\n url: `/{tenant}/portal/v1/navigation/${id}`,\r\n body: JSON.stringify({\r\n parentId: \"\",\r\n sequence\r\n })\r\n });\r\n}\r\n\r\nexport const SaveNavigationItem = (id: string, body: string) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/portal/v1/navigation/${id}`,\r\n body: JSON.stringify(body)\r\n });\r\n}\r\n\r\nexport const UpdateNavigationItemSequence = (id: string, parentId: string, sequence: number) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"PATCH\",\r\n url: `/{tenant}/portal/v1/navigation/${id}`,\r\n body: JSON.stringify({\r\n parentId,\r\n sequence\r\n })\r\n });\r\n}","import * as actions from \"network/actions\";\r\nimport { \r\n ActivityLogFilterValues, \r\n NewsletterConfig, \r\n NewsletterFilterValues, \r\n NewsletterIssueInput, \r\n NewsletterIssueStatus, \r\n NewsletterStatus, \r\n NewsletterImageType, \r\n NewsletterTemplateImageType, \r\n SaveNewsletterModel, \r\n NewsletterTheme,\r\n UploadNewsletterImageModel,\r\n UploadIssueImageModel\r\n} from \"modules/newsletters/models\";\r\nimport cookie from \"utils/cookie\";\r\nimport { TranslatableNewsletterContent } from \"modules/common/components/authoring/models\";\r\n\r\nexport const GetNewsletterTags = () => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/tags`\r\n });\r\n}\r\n\r\nexport const GetNewslettersPaged = (pageNumber: number, filters: NewsletterFilterValues, pageAmount?: number) => {\r\n let rowsPerPage = pageAmount || cookie.getRowsPerPage();\r\n\r\n return actions.NetworkRequest({\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/newsletters/paged`,\r\n queryParams: { \"pageAmount\": rowsPerPage, \"pageNumber\": pageNumber },\r\n body: JSON.stringify(filters)\r\n });\r\n}\r\n\r\nexport const GetNewsletterDetails = (id: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/${id}/detail`\r\n });\r\n}\r\n\r\nexport const SaveNewsletter = (newsletter: SaveNewsletterModel) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/newsletters/save`,\r\n body: JSON.stringify(newsletter)\r\n });\r\n}\r\n\r\nexport const UpdateNewsletterStatus = (id: string, status: NewsletterStatus | \"Deleted\") => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"PATCH\",\r\n url: `/{tenant}/adminapi/v1/newsletters/${id}/updateStatus`,\r\n body: JSON.stringify({\r\n status: status\r\n })\r\n });\r\n}\r\n\r\nexport const CloneNewsletter = (id: string, title: string) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/newsletters/${id}/clone`,\r\n body: JSON.stringify({\r\n title: title\r\n })\r\n });\r\n}\r\n\r\nexport const SendTestEmail = (newsletterId: string, issueDate: string, additionalAddresses: string[]) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/newsletters/${newsletterId}/sendTest`,\r\n body: JSON.stringify({\r\n additionalAddresses: additionalAddresses,\r\n issueDate: issueDate\r\n })\r\n });\r\n}\r\n\r\nexport const GetConfig = () => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/config`\r\n });\r\n}\r\n\r\nexport const SaveConfig = (config: NewsletterConfig) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/newsletters/config`,\r\n body: JSON.stringify(config)\r\n });\r\n}\r\n\r\nexport const GetPastIssues = (id: string, pageNumber: number) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/${id}/pastIssues?pageAmount=10&pageNumber=${pageNumber}`\r\n });\r\n}\r\n\r\nexport const GetPastIssue = (newsletterId: string, issueDate: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/${newsletterId}/pastIssue/${issueDate}`\r\n });\r\n}\r\n\r\nexport const GetFutureIssueDetails = (newsletterId: string, issueDate: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/${newsletterId}/futureIssue/${issueDate}`\r\n });\r\n}\r\n\r\nexport const ResetFutureIssue = (newsletterId: string, issueDateAsString: string) => {\r\n return actions.NetworkRequest({\r\n method: \"DELETE\",\r\n url: `/{tenant}/adminapi/v1/newsletters/${newsletterId}/futureIssue/${issueDateAsString}`\r\n });\r\n}\r\n\r\nexport const SaveFutureIssue = (issue: NewsletterIssueInput) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/newsletters/futureIssue`,\r\n body: JSON.stringify(issue)\r\n });\r\n}\r\n\r\nexport const UpdateFutureIssueStatus = (newsletterId: string, issueDateAsString: string, status: NewsletterIssueStatus) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"PATCH\",\r\n url: `/{tenant}/adminapi/v1/newsletters/${newsletterId}/futureIssue/${issueDateAsString}/updateStatus`,\r\n body: JSON.stringify({\r\n status: status\r\n })\r\n });\r\n}\r\n\r\nexport const GetTemplates = () => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/templates`\r\n });\r\n}\r\n\r\nexport const GetTemplateHtml = (templateId: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/templates/${templateId}/html`\r\n });\r\n}\r\n\r\nexport const GetTemplateImage = (templateId: string, imageType: NewsletterTemplateImageType) => {\r\n return actions.NetworkRequest({\r\n method:\"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/templates/${templateId}/images/${imageType}`\r\n });\r\n}\r\n\r\nexport const GetThemes = () => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/themes`\r\n });\r\n}\r\n\r\nexport const SetThemeDefault = (themeId: string, isCustom: boolean) => {\r\n let toSend = {themeId: themeId, isCustom: isCustom};\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"PUT\",\r\n url: `/{tenant}/adminapi/v1/newsletters/themes/default`,\r\n body: JSON.stringify(toSend)\r\n });\r\n}\r\n\r\nexport const DeleteTheme = (themeId: string, isCustom: boolean) => {\r\n let toSend = {themeId: themeId, isCustom: isCustom};\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"DELETE\",\r\n url: `/{tenant}/adminapi/v1/newsletters/themes`,\r\n body: JSON.stringify(toSend)\r\n });\r\n}\r\n\r\nexport const SaveTheme = (themeToSave: NewsletterTheme) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/newsletters/themes`,\r\n body: JSON.stringify(themeToSave)\r\n });\r\n}\r\n\r\nexport const SaveThemeImages = (themeId: string, header: string, footer: string) => {\r\n let toSend = {themeId: themeId, headerImage: header, footerImage: footer};\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/newsletters/themes/images`,\r\n body: JSON.stringify(toSend)\r\n });\r\n}\r\n\r\nexport const GetThemeImage = (imageType: NewsletterImageType, themeId: string) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/themes/images/${imageType}/${themeId}`,\r\n });\r\n}\r\n\r\nexport const GetNewsletterPreview = (templateId: string) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/templates/${templateId}/image`\r\n });\r\n}\r\n\r\nexport const DeleteThemeImage = (imageType: NewsletterImageType, themeId: string) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"DELETE\",\r\n url: `/{tenant}/adminapi/v1/newsletters/themes/images/${imageType}/${themeId}`,\r\n });\r\n}\r\n\r\nexport const GetNewsletterImage = (newsletterId: string, imageType: NewsletterImageType) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/images/${imageType}/${newsletterId}`\r\n });\r\n}\r\n\r\nexport const GetIssueImage = (newsletterId: string, issueDate: string, imageType: NewsletterImageType) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/images/${imageType}/${newsletterId}/${issueDate}`\r\n });\r\n}\r\n\r\nexport const UploadNewsletterImage = (id: string, imageType: NewsletterImageType, file: File) => {\r\n const body = new FormData();\r\n body.append(\"image\", file);\r\n return actions.NetworkRequest({\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/newsletters/images/${imageType}/${id}`,\r\n body,\r\n });\r\n}\r\n\r\nexport const UploadNewsletterHeaderFooterImage = (payload: UploadNewsletterImageModel) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/newsletters/images`,\r\n body: JSON.stringify(payload)\r\n });\r\n}\r\n\r\nexport const UploadIssueHeaderFooterImage = (payload: UploadIssueImageModel) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/newsletters/issue/images`,\r\n body: JSON.stringify(payload)\r\n });\r\n}\r\n\r\nexport const UploadIssueImage = (newsletterId: string, issueDate: string, imageType: NewsletterImageType, image: File) => {\r\n const body = new FormData();\r\n body.append(\"image\", image);\r\n return actions.NetworkRequest({\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/newsletters/images/${imageType}/${newsletterId}/${issueDate}`,\r\n body: body\r\n });\r\n}\r\n\r\nexport const DeleteNewsletterImage = (newsletterId: string, imageType: NewsletterImageType) => {\r\n return actions.NetworkRequest({\r\n method: \"DELETE\",\r\n url: `/{tenant}/adminapi/v1/newsletters/images/${imageType}/${newsletterId}`\r\n });\r\n}\r\n\r\nexport const DeleteIssueImage = (newsletterId: string, issueDate: string, imageType: NewsletterImageType) => {\r\n return actions.NetworkRequest({\r\n method: \"DELETE\",\r\n url: `/{tenant}/adminapi/v1/newsletters/images/${imageType}/${newsletterId}/${issueDate}`\r\n });\r\n}\r\n\r\nexport const GetTotalNewsletterInsights = (newsletterId: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/insights/total/${newsletterId}`\r\n });\r\n}\r\n\r\nexport const GetDailyNewsletterInsights = (newsletterId: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/insights/daily/${newsletterId}?numberOfDays=${90}`\r\n });\r\n}\r\n\r\nexport const GetWeeklyNewsletterInsights = (newsletterId: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/insights/weekly/${newsletterId}?numberOfWeeks=${52}`\r\n });\r\n}\r\n\r\nexport const GetActivityLog = (pageNumber: number, filters: ActivityLogFilterValues) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/newsletters/insights/activity?pageAmount=10&pageNumber=${pageNumber}`,\r\n body: JSON.stringify(filters)\r\n });\r\n}\r\n\r\nexport const GetActivityLogCSV = (filters: ActivityLogFilterValues) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/newsletters/insights/activityCsv`,\r\n body: JSON.stringify(filters)\r\n });\r\n}\r\n\r\nexport const GetRecipientsCSV = (newsletterId: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/reports/${newsletterId}/recipientsCsv`\r\n });\r\n}\r\n\r\n//Fetches list of newsletters that use a specific alias.\r\n//Input: fromName and fromAddress that make up the content of the alias. ie. \"Sparrow Notifications\", \"do-not-reply@sparrowconnected.com\"\r\n//Output: List of newsletters that utilize this alias.\r\nexport const GetNewslettersUsingAlias = (fromName: string, fromAddress: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/newsletters/address?fromEmail=${fromAddress}&fromName=${fromName}`\r\n })\r\n}\r\n\r\nexport const GetNewsletterTranslation = (toTranslate: TranslatableNewsletterContent, targetLcid: string, inputLcid: string, newsletterId: string) => {\r\n return actions.NetworkRequest({\r\n method: \"POST\",\r\n url: `/{tenant}/api/v1/newsletters/translate`,\r\n body: JSON.stringify({toTranslate, targetLcid, inputLcid, newsletterId})\r\n })\r\n}","import * as actions from \"network/actions\";\r\nimport { CurrentUserSettings } from \"modules/settings/models\";\r\n\r\nexport const SaveUserSettings = (userSettings: Partial) => {\r\n return actions.NetworkRequest({\r\n method: \"POST\",\r\n url: `/{tenant}/api/v1/usersettings`,\r\n queryParams: { platform: \"Web\" },\r\n body: JSON.stringify(userSettings),\r\n headers: { \"content-type\": \"application/json\" }\r\n });\r\n}\r\n\r\nexport const SendSMSVerify = () => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/api/v1/usersettings/smsVerify`,\r\n queryParams: { platform: \"Web\" },\r\n headers: { \"content-type\": \"application/json\" }\r\n });\r\n}","import * as actions from \"network/actions\";\r\n\r\nexport const SetReaction = (postId: string, reactionId: string | null) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/api/v1/reactions`,\r\n body: JSON.stringify({\r\n postId,\r\n reactionId\r\n })\r\n });\r\n}","import * as actions from 'network/actions';\r\nimport * as models from 'modules/surveys/models';\r\n\r\nexport const GetSurveys = () => {\r\n return actions.NetworkRequest({\r\n method: 'GET',\r\n url: '/{tenant}/adminapi/v1/surveys'\r\n });\r\n}\r\n\r\nexport const GetSurvey = (id: string) => {\r\n return actions.NetworkRequest({\r\n method: 'GET',\r\n url: `/{tenant}/adminapi/v1/surveys/${id}`\r\n });\r\n}\r\n\r\nexport const UpdateSurveyExpiryTime = (survey: models.Survey) => {\r\n return actions.NetworkRequest({\r\n method: 'POST',\r\n url: `/{tenant}/adminapi/v1/ surveys/${survey.id}/expiryTime`,\r\n body: JSON.stringify(survey),\r\n headers: { 'content-type': 'application/json' }\r\n });\r\n}\r\n\r\nexport const DeleteSurvey = (id: string) => {\r\n return actions.NetworkRequest({\r\n method: 'DELETE',\r\n url: `/{tenant}/adminapi/v1/surveys/${id}`\r\n });\r\n}\r\n\r\nexport const SaveSurvey = (survey: models.Survey) => {\r\n return actions.NetworkRequest({\r\n method: survey.id ? 'POST' : 'PUT',\r\n url: `/{tenant}/adminapi/v1/surveys`,\r\n body: JSON.stringify(survey),\r\n headers: { 'content-type': 'application/json' }\r\n });\r\n}\r\n","import { CategoryTagDetails, CategoryTagFilter, CategoryTagModel } from \"modules/categorytags/models\";\r\nimport * as actions from \"network/actions\";\r\n\r\nexport const CreateCategoryTag = (toUpload: CategoryTagModel) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/categoryTags`,\r\n body: JSON.stringify(\r\n toUpload\r\n )\r\n });\r\n}\r\n\r\nexport const EditCategoryTag = (toUpload: CategoryTagModel) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"PUT\",\r\n url: `/{tenant}/adminapi/v1/categoryTags/modify/${toUpload.id}`,\r\n body: JSON.stringify(\r\n toUpload\r\n )\r\n });\r\n}\r\n\r\nexport const GetCategoryTags = (pageNumber: number, filters: Partial) => {\r\n filters.pageNumber = pageNumber;\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/categoryTags/filtered`,\r\n body: filters\r\n });\r\n}\r\n \r\nexport const GetDisabledCategoryTags = (pageNumber: number, filters: Partial) => {\r\n filters.pageNumber = pageNumber;\r\n filters.enabled = false;\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/categoryTags/filtered`,\r\n body: filters\r\n });\r\n}\r\n \r\nexport const GetEnabledCategoryTags = (pageNumber: number, filters: Partial) => {\r\n filters.pageNumber = pageNumber;\r\n filters.enabled = true;\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/categoryTags/filtered`,\r\n body: filters\r\n });\r\n}\r\n\r\nexport const GetUserCategoryTags = () => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/api/v1/categoryTags/list`\r\n });\r\n}\r\n\r\nexport const GetCategoryTagsById = (id: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/categoryTags/${id}`\r\n })\r\n}\r\n\r\nexport const DeleteCategoryTag = (id: string) => {\r\n return actions.NetworkRequest({\r\n method: \"DELETE\",\r\n url: `/{tenant}/adminapi/v1/categoryTags/${id}`,\r\n })\r\n}\r\n\r\nexport const ChangeCategoryTagState = (enabled: boolean, id: string) => {\r\n return actions.NetworkRequest({\r\n headers: { \"content-type\": \"application/json\" },\r\n method: \"PUT\",\r\n url: `/{tenant}/adminapi/v1/categoryTags/modify/${id}`,\r\n body: JSON.stringify({enabled: enabled})\r\n })\r\n}\r\n\r\nexport const GetCategoryTagDownload = (id: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/categoryTags/analytics/download/${id}`\r\n })\r\n}\r\n\r\nexport const GetCategoryTagDownloadFromAnalytics = (toDownload: CategoryTagDetails) => {\r\n return actions.NetworkRequest({\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/categoryTags/analytics/download`,\r\n body: JSON.stringify(toDownload)\r\n })\r\n}\r\n\r\nexport const GetCategoryTagAnalytics = (id: string) => {\r\n return actions.NetworkRequest({\r\n method: \"GET\",\r\n url: `/{tenant}/adminapi/v1/categoryTags/analytics/${id}`\r\n })\r\n}\r\n\r\nexport const DownloadAllCategoryTags = () => {\r\n return actions.NetworkRequest({\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/categoryTags/analytics/massDownload`\r\n })\r\n}\r\n\r\nexport const DownloadCategoryTags = (ids: string[]) => {\r\n return actions.NetworkRequest({\r\n method: \"POST\",\r\n url: `/{tenant}/adminapi/v1/categoryTags/analytics/massDownload`,\r\n body: JSON.stringify(ids)\r\n })\r\n}","import * as activity from \"./activity\";\r\nimport * as audiences from \"./audiences\";\r\nimport * as authoring from \"./authoring\";\r\nimport * as clientPosts from \"./clientPosts\";\r\nimport * as comments from \"./comments\";\r\nimport * as compliance from \"./compliance\";\r\nimport * as documents from \"./documents\";\r\nimport * as draftPost from \"./draftPosts\";\r\nimport * as events from \"./events\";\r\nimport * as insights from \"./insights\";\r\nimport * as mediaLibrary from \"./mediaLibrary\";\r\nimport * as portalPages from \"./portalPages\";\r\nimport * as newsletters from \"./newsletters\";\r\nimport * as posts from \"./posts\";\r\nimport * as profile from \"./profile\";\r\nimport * as reactions from \"./reactions\";\r\nimport * as settings from \"./settings\";\r\nimport * as surveys from \"./surveys\";\r\nimport * as users from \"./users\";\r\nimport * as multitenancy from \"./multitenancy\";\r\nimport * as tags from \"./tags\";\r\nimport * as support from \"./support\";\r\nimport * as categoryTags from \"./categorytags\";\r\nimport * as reports from \"./reports\";\r\nimport * as sharing from './sharing';\r\nimport * as submissionPosts from \"./submissions\"\r\n\r\nexport default {\r\n activity,\r\n audiences,\r\n authoring,\r\n categoryTags,\r\n clientPosts,\r\n comments,\r\n compliance,\r\n documents,\r\n draftPost,\r\n events,\r\n insights,\r\n mediaLibrary,\r\n portalPages,\r\n newsletters,\r\n posts,\r\n profile,\r\n reactions,\r\n reports,\r\n settings,\r\n surveys,\r\n users,\r\n multitenancy,\r\n tags,\r\n support,\r\n submissionPosts,\r\n sharing\r\n};\r\n","import { Action } from \"redux\";\r\nimport * as Actions from \"./actions\";\r\nimport { NavigationPage, PortalPagesListingPage, PortalPagesState } from \"./models\";\r\n\r\nexport const defaultListingPage: PortalPagesListingPage = {\r\n id: \"\",\r\n currentPage: 0,\r\n portalPages: [],\r\n totalPortalPages: 0,\r\n totalPages: 0,\r\n isFetching: false\r\n};\r\n\r\nexport const defaultNavigationPage: NavigationPage = {\r\n navigationItems: [],\r\n isFetching: false,\r\n shouldFetch: true\r\n};\r\n\r\nexport const defaultPortalPage = {\r\n navigation: {\r\n enabled: true\r\n },\r\n header: {\r\n banner_text: \"\",\r\n enabled: true,\r\n image_alignment: \"bottom\",\r\n background_color: \"#FFFFFF\",\r\n overlay_color: \"#DDE1E5\",\r\n overlay_opacity: 85\r\n }\r\n};\r\n\r\nconst defaultState: PortalPagesState = {\r\n all: { ...defaultListingPage, id: \"all\" },\r\n enabled: { ...defaultListingPage, id: \"enabled\" },\r\n drafts: { ...defaultListingPage, id: \"drafts\" },\r\n disabled: { ...defaultListingPage, id: \"disabled\" },\r\n navigation: { ...defaultNavigationPage },\r\n navigationItems: { ...defaultNavigationPage },\r\n preview: undefined,\r\n errorMessage: \"\",\r\n isDeleting: false,\r\n isFetching: false,\r\n isInitialLoad: true,\r\n isSaving: false,\r\n isUploading: false,\r\n shouldFetch: false,\r\n shouldUpdateDraft: false,\r\n showBackToPortalPages: false,\r\n showGlobalComponents: false,\r\n showGoToNavigationItems: false,\r\n showModifyPortalPageDetails: false,\r\n showModifyPortalPageTitle: false,\r\n showNewNavigationItem: false,\r\n showNewPortalPage: false,\r\n showPreview: false,\r\n showPublishChanges: false,\r\n customCss: {},\r\n fetchingCss: false,\r\n};\r\n\r\nconst actionHandler: { [actionType: string]: (state: PortalPagesState, action: any) => PortalPagesState } = {\r\n\r\n [Actions.GET_DRAFT]: (state: PortalPagesState, action: Actions.GetDraft) => {\r\n return {\r\n ...state,\r\n isFetching: true\r\n };\r\n },\r\n\r\n [Actions.GET_DRAFT_COMPLETE]: (state: PortalPagesState, action: Actions.GetDraftComplete) => {\r\n return {\r\n ...state,\r\n isFetching: false,\r\n shouldUpdateDraft: !action.succeeded\r\n };\r\n },\r\n\r\n\r\n [Actions.GET_PORTAL_PAGES]: (state: PortalPagesState, action: Actions.GetPortalPages) => {\r\n return {\r\n ...state,\r\n all: {\r\n ...state.all,\r\n isFetching: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.GET_PORTAL_PAGES_COMPLETE]: (state: PortalPagesState, action: Actions.GetPortalPagesComplete) => {\r\n return {\r\n ...state,\r\n all: {\r\n ...state.all,\r\n ...action.page,\r\n isFetching: false\r\n },\r\n isInitialLoad: false\r\n };\r\n },\r\n\r\n [Actions.GET_DISABLED_PORTAL_PAGES]: (state: PortalPagesState, action: Actions.GetDisabledPortalPagesComplete) => {\r\n return {\r\n ...state,\r\n disabled: {\r\n ...state.disabled,\r\n isFetching: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.GET_DISABLED_PORTAL_PAGES_COMPLETE]: (state: PortalPagesState, action: Actions.GetDisabledPortalPagesComplete) => {\r\n return {\r\n ...state,\r\n disabled: {\r\n ...state.disabled,\r\n ...action.page,\r\n isFetching: false\r\n },\r\n isInitialLoad: false\r\n };\r\n },\r\n\r\n [Actions.GET_DRAFT_PORTAL_PAGES]: (state: PortalPagesState, action: Actions.GetDraftPortalPages) => {\r\n return {\r\n ...state,\r\n drafts: {\r\n ...state.drafts,\r\n isFetching: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.GET_DRAFT_PORTAL_PAGES_COMPLETE]: (state: PortalPagesState, action: Actions.GetDraftPortalPagesComplete) => {\r\n return {\r\n ...state,\r\n drafts: {\r\n ...state.drafts,\r\n ...action.page,\r\n isFetching: false\r\n },\r\n isInitialLoad: false\r\n };\r\n },\r\n\r\n [Actions.GET_ENABLED_PORTAL_PAGES]: (state: PortalPagesState, action: Actions.GetEnabledPortalPages) => {\r\n return {\r\n ...state,\r\n enabled: {\r\n ...state.enabled,\r\n isFetching: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.GET_ENABLED_PORTAL_PAGES_COMPLETE]: (state: PortalPagesState, action: Actions.GetEnabledPortalPagesComplete) => {\r\n return {\r\n ...state,\r\n enabled: {\r\n ...state.enabled,\r\n ...action.page,\r\n isFetching: false\r\n },\r\n isInitialLoad: false\r\n };\r\n },\r\n\r\n [Actions.GET_NAVIGATION]: (state: PortalPagesState, action: Actions.GetNavigation) => {\r\n return {\r\n ...state,\r\n navigation: {\r\n ...state.navigation,\r\n isFetching: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.GET_NAVIGATION_COMPLETE]: (state: PortalPagesState, action: Actions.GetNavigationComplete) => {\r\n return {\r\n ...state,\r\n navigation: {\r\n navigationItems: action.navigationItems,\r\n isFetching: false,\r\n shouldFetch: false\r\n },\r\n errorMessage: action.succeeded ? \"\" : \"Unable to load navigation items\"\r\n };\r\n },\r\n\r\n [Actions.GET_NAVIGATION_ITEMS]: (state: PortalPagesState, action: Actions.GetNavigationItems) => {\r\n return {\r\n ...state,\r\n navigationItems: {\r\n ...state.navigationItems,\r\n isFetching: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.GET_NAVIGATION_ITEMS_COMPLETE]: (state: PortalPagesState, action: Actions.GetNavigationItemsComplete) => {\r\n return {\r\n ...state,\r\n navigationItems: {\r\n navigationItems: action.navigationItems,\r\n isFetching: false,\r\n shouldFetch: false\r\n },\r\n errorMessage: action.succeeded ? \"\" : \"Unable to load navigation items\"\r\n };\r\n },\r\n\r\n [Actions.GET_NAVIGATION_PORTAL_PAGES_COMPLETE]: (state: PortalPagesState, action: Actions.GetNavigationPortalPagesComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to load pages\"\r\n };\r\n },\r\n\r\n\r\n [Actions.HIDE_BACK_TO_PORTAL_PAGES]: (state: PortalPagesState, action: Actions.HideBackToPortalPages) => {\r\n return {\r\n ...state,\r\n showBackToPortalPages: false\r\n };\r\n },\r\n\r\n [Actions.HIDE_GLOBAL_COMPONENTS]: (state: PortalPagesState, action: Actions.HideGlobalComponents) => {\r\n return {\r\n ...state,\r\n showGlobalComponents: false\r\n };\r\n },\r\n\r\n [Actions.HIDE_GO_TO_NAVIGATION_ITEMS]: (state: PortalPagesState, action: Actions.HideGoToNavigationItems) => {\r\n return {\r\n ...state,\r\n showGoToNavigationItems: false\r\n };\r\n },\r\n\r\n [Actions.HIDE_NEW_PORTAL_PAGE]: (state: PortalPagesState, action: Actions.HideNewPortalPage) => {\r\n return {\r\n ...state,\r\n showNewPortalPage: false\r\n };\r\n },\r\n\r\n [Actions.HIDE_PREVIEW]: (state: PortalPagesState, action: Actions.HidePreview) => {\r\n return {\r\n ...state,\r\n showPreview: false\r\n };\r\n },\r\n\r\n [Actions.HIDE_PUBLISH_CHANGES]: (state: PortalPagesState, action: Actions.HidePublishChanges) => {\r\n return {\r\n ...state,\r\n showPublishChanges: false\r\n };\r\n },\r\n\r\n [Actions.SHOW_BACK_TO_PORTAL_PAGES]: (state: PortalPagesState, action: Actions.ShowBackToPortalPages) => {\r\n return {\r\n ...state,\r\n showBackToPortalPages: true\r\n };\r\n },\r\n\r\n [Actions.SHOW_GLOBAL_COMPONENTS]: (state: PortalPagesState, action: Actions.ShowGlobalComponents) => {\r\n return {\r\n ...state,\r\n showGlobalComponents: true\r\n };\r\n },\r\n\r\n [Actions.SHOW_GO_TO_NAVIGATION_ITEMS]: (state: PortalPagesState, action: Actions.ShowGoToNavigationItems) => {\r\n return {\r\n ...state,\r\n showGoToNavigationItems: true\r\n };\r\n },\r\n\r\n [Actions.SHOW_NEW_PORTAL_PAGE]: (state: PortalPagesState, action: Actions.ShowNewPortalPage) => {\r\n return {\r\n ...state,\r\n preview: undefined,\r\n showNewPortalPage: true\r\n };\r\n },\r\n\r\n [Actions.SHOW_PREVIEW]: (state: PortalPagesState, action: Actions.ShowPreview) => {\r\n return {\r\n ...state,\r\n preview: action.page,\r\n showPreview: true\r\n };\r\n },\r\n\r\n [Actions.SHOW_PUBLISH_CHANGES]: (state: PortalPagesState, action: Actions.ShowPublishChanges) => {\r\n return {\r\n ...state,\r\n showPublishChanges: true\r\n };\r\n },\r\n\r\n\r\n [Actions.CREATE_NEW_CHILD_NAVIGATION_ITEM]: (state: PortalPagesState, action: Actions.CreateNewChildNavigationItem) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.CREATE_NEW_CHILD_NAVIGATION_ITEM_COMPLETE]: (state: PortalPagesState, action: Actions.CreateNewChildNavigationItemComplete) => {\r\n return {\r\n ...state,\r\n navigation: {\r\n ...state.navigation,\r\n shouldFetch: action.succeeded\r\n },\r\n navigationItems: {\r\n ...state.navigationItems,\r\n shouldFetch: action.succeeded\r\n },\r\n errorMessage: action.succeeded ? \"\" : \"Unable to create new child navigation item\",\r\n isSaving: false\r\n };\r\n },\r\n\r\n [Actions.CREATE_NEW_DRAFT]: (state: PortalPagesState, action: Actions.CreateNewDraft) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.CREATE_NEW_DRAFT_COMPLETE]: (state: PortalPagesState, action: Actions.CreateNewDraftComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to create new page\",\r\n isSaving: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.CREATE_NEW_NAVIGATION_ITEM]: (state: PortalPagesState, action: Actions.CreateNewNavigationItem) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.CREATE_NEW_NAVIGATION_ITEM_COMPLETE]: (state: PortalPagesState, action: Actions.CreateNewNavigationItemComplete) => {\r\n return {\r\n ...state,\r\n navigation: {\r\n ...state.navigation,\r\n shouldFetch: action.succeeded\r\n },\r\n navigationItems: {\r\n ...state.navigationItems,\r\n shouldFetch: action.succeeded\r\n },\r\n errorMessage: action.succeeded ? \"\" : \"Unable to create new navigation item\",\r\n isSaving: false\r\n };\r\n },\r\n \r\n [Actions.DELETE_DRAFT]: (state: PortalPagesState, action: Actions.DeleteDraft) => {\r\n return {\r\n ...state,\r\n isDeleting: true\r\n };\r\n },\r\n \r\n [Actions.DELETE_DRAFT_COMPLETE]: (state: PortalPagesState, action: Actions.DeleteDraftComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to delete draft\",\r\n isDeleting: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.DELETE_NAVIGATION_ITEM]: (state: PortalPagesState, action: Actions.DeleteNavigationItem) => {\r\n return {\r\n ...state,\r\n isDeleting: true\r\n };\r\n },\r\n\r\n [Actions.DELETE_NAVIGATION_ITEM_COMPLETE]: (state: PortalPagesState, action: Actions.DeleteNavigationItemComplete) => {\r\n return {\r\n ...state,\r\n navigation: {\r\n ...state.navigation,\r\n shouldFetch: action.succeeded\r\n },\r\n navigationItems: {\r\n ...state.navigationItems,\r\n shouldFetch: action.succeeded\r\n },\r\n errorMessage: action.succeeded ? \"\" : \"Unable to delete navigation item\",\r\n isDeleting: false\r\n };\r\n },\r\n\r\n [Actions.DELETE_PORTAL_PAGE]: (state: PortalPagesState, action: Actions.DeletePortalPage) => {\r\n return {\r\n ...state,\r\n isDeleting: true\r\n };\r\n },\r\n\r\n [Actions.DELETE_PORTAL_PAGE_COMPLETE]: (state: PortalPagesState, action: Actions.DeletePortalPageComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to delete page\",\r\n isDeleting: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.DELETE_PORTAL_PAGES]: (state: PortalPagesState, action: Actions.DeletePortalPages) => {\r\n return {\r\n ...state,\r\n isDeleting: true\r\n };\r\n },\r\n\r\n [Actions.DELETE_PORTAL_PAGES_COMPLETE]: (state: PortalPagesState, action: Actions.DeletePortalPagesComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to delete pages\",\r\n isDeleting: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.DISABLE_PORTAL_PAGE]: (state: PortalPagesState, action: Actions.DisablePortalPage) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.DISABLE_PORTAL_PAGE_COMPLETE]: (state: PortalPagesState, action: Actions.DisablePortalPageComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to disable page\",\r\n isSaving: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.ENABLE_PORTAL_PAGE]: (state: PortalPagesState, action: Actions.EnablePortalPage) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.ENABLE_PORTAL_PAGE_COMPLETE]: (state: PortalPagesState, action: Actions.EnablePortalPageComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to enable page\",\r\n isSaving: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.MODIFY_DRAFT_DETAILS]: (state: PortalPagesState, action: Actions.ModifyDraftDetails) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.MODIFY_DRAFT_DETAILS_COMPLETE]: (state: PortalPagesState, action: Actions.ModifyDraftDetailsComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to modify page details\",\r\n isSaving: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.MODIFY_DRAFT_TITLE]: (state: PortalPagesState, action: Actions.ModifyDraftTitle) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.MODIFY_DRAFT_TITLE_COMPLETE]: (state: PortalPagesState, action: Actions.ModifyDraftTitleComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to modify page title\",\r\n isSaving: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.MODIFY_PORTAL_PAGE_DETAILS]: (state: PortalPagesState, action: Actions.ModifyPortalPageDetails) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.MODIFY_PORTAL_PAGE_DETAILS_COMPLETE]: (state: PortalPagesState, action: Actions.ModifyPortalPageDetailsComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to modify page details\",\r\n isSaving: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.MODIFY_PORTAL_PAGE_TITLE]: (state: PortalPagesState, action: Actions.ModifyPortalPageTitle) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.MODIFY_PORTAL_PAGE_TITLE_COMPLETE]: (state: PortalPagesState, action: Actions.ModifyPortalPageTitleComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to modify page title\",\r\n isSaving: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.PUBLISH_DRAFT]: (state: PortalPagesState, action: Actions.PublishDraft) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.PUBLISH_DRAFT_COMPLETE]: (state: PortalPagesState, action: Actions.PublishDraftComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to publish draft\",\r\n isSaving: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.SAVE_DRAFT]: (state: PortalPagesState, action: Actions.SaveDraft) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.SAVE_DRAFT_COMPLETE]: (state: PortalPagesState, action: Actions.SaveDraftComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to save changes\",\r\n isSaving: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.SET_NAVIGATION_ITEM_AS_PARENT]: (state: PortalPagesState, action: Actions.SetNavigationItemAsParent) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.SET_NAVIGATION_ITEM_AS_PARENT_COMPLETE]: (state: PortalPagesState, action: Actions.SetNavigationItemAsParentComplete) => {\r\n return {\r\n ...state,\r\n navigation: {\r\n ...state.navigation,\r\n shouldFetch: action.succeeded\r\n },\r\n navigationItems: {\r\n ...state.navigationItems,\r\n shouldFetch: action.succeeded\r\n },\r\n errorMessage: action.succeeded ? \"\" : \"Unable to update navigation item\",\r\n isSaving: false\r\n };\r\n },\r\n\r\n [Actions.SET_PORTAL_PAGE_AS_HOME]: (state: PortalPagesState, action: Actions.SetPortalPageAsHome) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.SET_PORTAL_PAGE_AS_HOME_COMPLETE]: (state: PortalPagesState, action: Actions.SetPortalPageAsHomeComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to set page as homepage\",\r\n isSaving: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.UPDATE_DRAFT]: (state: PortalPagesState, action: Actions.UpdateDraft) => {\r\n return {\r\n ...state,\r\n shouldUpdateDraft: true\r\n };\r\n },\r\n\r\n [Actions.UPDATE_NAVIGATION_ITEM_SEQUENCE]: (state: PortalPagesState, action: Actions.UpdateNavigationItemSequence) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.UPDATE_NAVIGATION_ITEM_SEQUENCE_COMPLETE]: (state: PortalPagesState, action: Actions.UpdateNavigationItemSequenceComplete) => {\r\n return {\r\n ...state,\r\n navigation: {\r\n ...state.navigation,\r\n shouldFetch: action.succeeded\r\n },\r\n navigationItems: {\r\n ...state.navigationItems,\r\n shouldFetch: action.succeeded\r\n },\r\n errorMessage: action.succeeded ? \"\" : \"Unable to update navigation item order\",\r\n isSaving: false\r\n };\r\n },\r\n\r\n\r\n [Actions.CHANGED_SINCE_SAVED]: (state: PortalPagesState, action: Actions.ChangedSinceSaved) => {\r\n return {\r\n ...state,\r\n changedSinceSaved: true\r\n };\r\n },\r\n\r\n [Actions.CLEAR_CHANGED_SINCE_SAVED]: (state: PortalPagesState, action: Actions.ChangedSinceSaved) => {\r\n return {\r\n ...state,\r\n changedSinceSaved: false\r\n };\r\n },\r\n\r\n [Actions.CLEAR_ERROR_MESSAGE]: (state: PortalPagesState, action: Actions.ClearErrorMessage) => {\r\n return {\r\n ...state,\r\n errorMessage: \"\"\r\n };\r\n },\r\n\r\n [Actions.CLEAR_SHOULD_FETCH]: (state: PortalPagesState, action: Actions.ClearShouldFetch) => {\r\n return {\r\n ...state,\r\n shouldFetch: false\r\n };\r\n },\r\n\r\n [Actions.CLEAR_SHOW_PUBLISH_SUCCESS]: (state: PortalPagesState, action: Actions.ClearShowPublishSuccess) => {\r\n return {\r\n ...state,\r\n showPublishSuccess: false\r\n };\r\n },\r\n\r\n [Actions.FETCH_CUSTOM_CSS_REQUEST]: (state: PortalPagesState, action: Actions.FetchCustomCssRequest) => {\r\n return {\r\n ...state,\r\n fetchingCss: true\r\n };\r\n },\r\n\r\n [Actions.FETCH_CUSTOM_CSS_SUCCESS]: (state: PortalPagesState, action: Actions.FetchCustomCssSuccess) => {\r\n return {\r\n ...state,\r\n customCss: { ...state.customCss, [action.pageId]: action.customCss },\r\n fetchingCss: false\r\n };\r\n },\r\n\r\n [Actions.FETCH_CUSTOM_CSS_FAILURE]: (state: PortalPagesState, action: Actions.FetchCustomCssFailure) => {\r\n return {\r\n ...state,\r\n fetchingCss: false\r\n };\r\n },\r\n\r\n}\r\n\r\nexport const reducer = (state: PortalPagesState, action: Action) => {\r\n const actionHandlerMethod = actionHandler[action.type];\r\n if (actionHandlerMethod) {\r\n return actionHandlerMethod(state, action);\r\n }\r\n return state || defaultState;\r\n};\r\n","import { Action } from 'redux';\r\nimport { CompleteAction, ActionCreator } from 'typedActions';\r\nimport { Post, PostFeedFilters, PostFeedItem, PostListingPage } from './models';\r\nimport { CustomFileData, MediaFile, MoveFilesWithSrc, SortGroupName } from 'modules/gallery';\r\n\r\nexport const DELETE_IMAGES_FROM_LIBRARY_INIT = 'DELETE_IMAGES_FROM_LIBRARY_INIT';\r\nexport interface DeleteImagesFromLibraryInit extends Action {}\r\nexport const DeleteImagesFromLibraryInit = ActionCreator(DELETE_IMAGES_FROM_LIBRARY_INIT);\r\n\r\nexport const DELETE_IMAGES_FROM_LIBRARY_COMPLETE = 'DELETE_IMAGES_FROM_LIBRARY_COMPLETE';\r\nexport interface DeleteImagesFromLibraryComplete extends CompleteAction {ids?: string[]}\r\nexport const DeleteImagesFromLibraryComplete = ActionCreator(DELETE_IMAGES_FROM_LIBRARY_COMPLETE);\r\n\r\nexport const SET_EMAIL_NOTIFICATION_FREQUENCY = \"SET_EMAIL_NOTIFICATION_FREQUENCY\";\r\nexport interface SetEmailNotificationFrequency extends Action {\r\n frequency: number;\r\n}\r\nexport const CreateSetEmailNotificationFrequency = ActionCreator(SET_EMAIL_NOTIFICATION_FREQUENCY);\r\n\r\n\r\nexport const SET_EMAIL_NOTIFICATION_HOURS = \"SET_EMAIL_NOTIFICATION_HOURS\";\r\nexport interface SetEmailNotificationHours extends Action {\r\n hours: number\r\n}\r\nexport const CreateSetEmailNotificationHours = ActionCreator(SET_EMAIL_NOTIFICATION_HOURS);\r\n\r\n\r\nexport const SET_SMS_NOTIFICATION_FREQUENCY = \"SET_SMS_NOTIFICATION_FREQUENCY\";\r\nexport interface SetSMSNotificationFrequency extends Action {\r\n frequency: number;\r\n}\r\nexport const CreateSetSMSNotificationFrequency = ActionCreator(SET_SMS_NOTIFICATION_FREQUENCY);\r\n\r\n\r\nexport const SET_SMS_NOTIFICATION_HOURS = \"SET_SMS_NOTIFICATION_HOURS\";\r\nexport interface SetSMSNotificationHours extends Action {\r\n hours: number\r\n}\r\nexport const CreateSetSMSNotificationHours = ActionCreator(SET_SMS_NOTIFICATION_HOURS);\r\n\r\nexport const GET_MENTIONS_USERS = \"GET_MENTIONS_USERS\";\r\nexport interface GetMentionsUsers extends Action {\r\n filter: string;\r\n}\r\nexport const GetMentionsUsers = ActionCreator(GET_MENTIONS_USERS);\r\n\r\nexport const SET_COMMENTING_ENABLED = \"SET_COMMENTING_ENABLED\";\r\nexport interface SetCommentingEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateSetCommentingEnabledAction = ActionCreator(SET_COMMENTING_ENABLED);\r\n\r\nexport const SET_REACTING_ENABLED = \"SET_REACTING_ENABLED\";\r\n\r\nexport interface SetReactingEnabled extends Action {\r\n enabled: boolean;\r\n}\r\n\r\nexport const CreateSetReactingEnabledAction = ActionCreator(SET_REACTING_ENABLED);\r\n\r\nexport const SET_NOTIFICATIONS_ENABLED = \"SET_NOTIFICATIONS_ENABLED\";\r\nexport interface SetNotificationsEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateSetNotificationsEnabledAction = ActionCreator(SET_NOTIFICATIONS_ENABLED);\r\n\r\nexport const SET_EMAIL_CHANNEL_ENABLED = \"SET_EMAIL_CHANNEL_ENABLED\";\r\nexport interface SetEmailChannelEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateSetEmailChannelEnabled = ActionCreator(SET_EMAIL_CHANNEL_ENABLED);\r\n\r\nexport const SET_SMS_CHANNEL_ENABLED = \"SET_SMS_CHANNEL_ENABLED\";\r\nexport interface SetSMSChannelEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateSetSMSChannelEnabled = ActionCreator(SET_SMS_CHANNEL_ENABLED);\r\n\r\nexport const SET_CHATBOT_NOTIFICATIONS_ENABLED = \"SET_CHATBOT_NOTIFICATIONS_ENABLED\";\r\nexport interface SetChatbotNotificationsEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateSetChatbotNotificationsEnabled = ActionCreator(SET_CHATBOT_NOTIFICATIONS_ENABLED);\r\n\r\nexport const SET_MOBILE_NOTIFICATIONS_ENABLED = \"SET_MOBILE_NOTIFICATIONS_ENABLED\";\r\nexport interface SetMobileNotificationsEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateSetMobileNotificationsEnabled = ActionCreator(SET_MOBILE_NOTIFICATIONS_ENABLED);\r\n\r\nexport const CREATE_NEW_DRAFT = 'CREATE_NEW_DRAFT';\r\nexport interface CreateNewDraft extends Action {};\r\nexport const CreateNewDraft = ActionCreator(CREATE_NEW_DRAFT);\r\n\r\nexport const CREATE_NEW_DRAFT_COMPLETE = 'CREATE_NEW_DRAFT_COMPLETE';\r\nexport interface CreateNewDraftComplete extends CompleteAction { postId: string };\r\nexport const CreateNewDraftComplete = ActionCreator(CREATE_NEW_DRAFT_COMPLETE);\r\n\r\nexport const SET_NEW_DRAFT = 'SET_NEW_DRAFT';\r\nexport interface SetNewDraft extends Action { post: Partial };\r\nexport const SetNewDraft = ActionCreator(SET_NEW_DRAFT);\r\n\r\nexport const SUBMIT_POST = 'SUBMIT_POST';\r\nexport interface SubmitPost extends Action {};\r\nexport const SubmitPost = ActionCreator(SUBMIT_POST);\r\n\r\nexport const SUBMIT_POST_COMPLETE = 'SUBMIT_POST_COMPLETE';\r\nexport interface SubmitPostComplete extends CompleteAction {};\r\nexport const SubmitPostComplete = ActionCreator(SUBMIT_POST_COMPLETE);\r\n\r\nexport const EDIT_POST_IN_POST_LIST = 'EDIT_POST_IN_POST_LIST';\r\nexport interface EditPostInPostList extends Action { postId: string };\r\nexport const EditPostInPostList = ActionCreator(EDIT_POST_IN_POST_LIST);\r\n\r\nexport const CLEAR_POST_FEED = \"CLEAR_POST_FEED\";\r\nexport interface ClearPostFeed extends Action {}\r\nexport const ClearPostFeed = ActionCreator(CLEAR_POST_FEED);\r\n\r\nexport const CLEAR_POST_FEED_FILTERS = \"CLEAR_POST_FEED_FILTERS\";\r\nexport interface ClearPostFeedFilters extends Action {}\r\nexport const ClearPostFeedFilters = ActionCreator(CLEAR_POST_FEED_FILTERS);\r\n\r\nexport const CLEAR_EDITOR = 'CLEAR_EDITOR';\r\nexport interface ClearEditor extends Action { };\r\nexport const ClearEditor = ActionCreator(CLEAR_EDITOR);\r\n\r\nexport const FETCH_DRAFT_POST_LIST = 'FETCH_DRAFT_POST_LIST';\r\nexport interface FetchDraftPostList extends Action { };\r\nexport const FetchDraftPostList = ActionCreator(FETCH_DRAFT_POST_LIST);\r\n\r\nexport const FETCH_DRAFT_POST_LIST_COMPLETE = 'FETCH_DRAFT_POST_LIST_COMPLETE';\r\nexport interface FetchDraftPostListComplete extends CompleteAction { page: PostListingPage };\r\nexport const FetchDraftPostListComplete = ActionCreator(FETCH_DRAFT_POST_LIST_COMPLETE);\r\n\r\nexport const FETCH_EXPIRED_POST_LIST = 'FETCH_EXPIRED_POST_LIST';\r\nexport interface FetchExpiredPostList extends Action {};\r\nexport const FetchExpiredPostList = ActionCreator(FETCH_EXPIRED_POST_LIST);\r\n\r\nexport const FETCH_EXPIRED_POST_LIST_COMPLETE = 'FETCH_EXPIRED_POST_LIST_COMPLETE';\r\nexport interface FetchExpiredPostListComplete extends CompleteAction { page: PostListingPage };\r\nexport const FetchExpiredPostListComplete = ActionCreator(FETCH_EXPIRED_POST_LIST_COMPLETE);\r\n\r\nexport const FETCH_PUBLISHED_POST_LIST = 'FETCH_PUBLISHED_POST_LIST';\r\nexport interface FetchPublishedPostList extends Action {};\r\nexport const FetchPublishedPostList = ActionCreator(FETCH_PUBLISHED_POST_LIST);\r\n\r\nexport const FETCH_PUBLISHED_POST_LIST_COMPLETE = 'FETCH_PUBLISHED_POST_LIST_COMPLETE';\r\nexport interface FetchPublishedPostListComplete extends CompleteAction { page: PostListingPage };\r\nexport const FetchPublishedPostListComplete = ActionCreator(FETCH_PUBLISHED_POST_LIST_COMPLETE);\r\n\r\nexport const FETCH_SCHEDULED_POST_LIST = 'FETCH_SCHEDULED_POST_LIST';\r\nexport interface FetchScheduledPostList extends Action {};\r\nexport const FetchScheduledPostList = ActionCreator(FETCH_SCHEDULED_POST_LIST);\r\n\r\nexport const FETCH_SCHEDULED_POST_LIST_COMPLETE = 'FETCH_SCHEDULED_POST_LIST_COMPLETE';\r\nexport interface FetchScheduledPostListComplete extends CompleteAction { page: PostListingPage };\r\nexport const FetchScheduledPostListComplete = ActionCreator(FETCH_SCHEDULED_POST_LIST_COMPLETE);\r\n\r\nexport const FETCH_SUBMISSION_POST_LIST = 'FETCH_SUBMISSION_POST_LIST';\r\nexport interface FetchSubmissionPostList extends Action {};\r\nexport const FetchSubmissionPostList = ActionCreator(FETCH_SUBMISSION_POST_LIST);\r\n\r\nexport const FETCH_SUBMISSION_POST_LIST_COMPLETE = 'FETCH_SUBMISSION_POST_LIST_COMPLETE';\r\nexport interface FetchSubmissionPostListComplete extends CompleteAction { page: PostListingPage };\r\nexport const FetchSubmissionPostListComplete = ActionCreator(FETCH_SUBMISSION_POST_LIST_COMPLETE);\r\n\r\nexport const FETCH_DRAFT_POST = 'FETCH_DRAFT_POST';\r\nexport interface FetchDraftPost extends Action { };\r\nexport const FetchDraftPost = ActionCreator(FETCH_DRAFT_POST);\r\n\r\nexport const FETCH_DRAFT_POST_COMPLETE = 'FETCH_DRAFT_POST_COMPLETE';\r\nexport interface FetchDraftPostComplete extends CompleteAction { post: Post | null};\r\nexport const FetchDraftPostComplete = ActionCreator(FETCH_DRAFT_POST_COMPLETE);\r\n\r\nexport const FETCH_ALL_POST_LIST = 'FETCH_ALL_POST_LIST';\r\nexport interface FetchAllPostList extends Action {};\r\nexport const FetchAllPostList = ActionCreator(FETCH_ALL_POST_LIST);\r\n\r\nexport const FETCH_ALL_POST_LIST_COMPLETE = 'FETCH_ALL_POST_LIST_COMPLETE';\r\nexport interface FetchAllPostListComplete extends CompleteAction { page: PostListingPage };\r\nexport const FetchAllPostListComplete = ActionCreator(FETCH_ALL_POST_LIST_COMPLETE);\r\n\r\n\r\nexport const FETCH_POSTS_FEED = 'FETCH_POSTS_FEED';\r\nexport interface FetchPostsFeed extends Action {};\r\nexport const FetchPostsFeed = ActionCreator(FETCH_POSTS_FEED);\r\n\r\nexport const FETCH_POSTS_FEED_COMPLETE = 'FETCH_POSTS_FEED_COMPLETE';\r\nexport interface FetchPostsFeedComplete extends CompleteAction { filtersApplied: boolean, postsFeed: PostFeedItem[], pageNumber: number };\r\nexport const FetchPostsFeedComplete = ActionCreator(FETCH_POSTS_FEED_COMPLETE);\r\n\r\nexport const FETCH_POSTS_FEED_LOCAL = 'FETCH_POSTS_FEED_LOCAL';\r\nexport interface FetchPostsFeedLocal extends Action {};\r\nexport const FetchPostsFeedLocal = ActionCreator(FETCH_POSTS_FEED_LOCAL);\r\n\r\nexport const FETCH_POSTS_FEED_LOCAL_COMPLETE = 'FETCH_POSTS_FEED_LOCAL_COMPLETE';\r\nexport interface FetchPostsFeedLocalComplete extends CompleteAction {};\r\nexport const FetchPostsFeedLocalComplete = ActionCreator(FETCH_POSTS_FEED_LOCAL_COMPLETE);\r\n\r\nexport const UPDATE_POST = 'UPDATE_POST';\r\nexport interface UpdatePost extends Action { post: Partial };\r\nexport const UpdatePost = ActionCreator(UPDATE_POST);\r\n\r\nexport const UPDATE_POSTS_FEED = 'UPDATE_POSTS_FEED';\r\nexport interface UpdatePostsFeed extends Action { postsFeed: PostFeedItem[] };\r\nexport const UpdatePostsFeed = ActionCreator(UPDATE_POSTS_FEED);\r\n\r\ntype postKey = keyof Post;\r\nexport const POST_EDIT_FIELD_UPDATE = 'POST_EDIT_FIELD_UPDATE';\r\nexport interface FieldUpdate extends Action { field: postKey, value: any };\r\nexport const FieldUpdate = ActionCreator(POST_EDIT_FIELD_UPDATE);\r\n\r\nexport const DRAFT_POST_SAVE = 'DRAFT_POST_SAVE';\r\nexport interface DraftPostSave extends Action { }\r\nexport const DraftPostSave = ActionCreator(DRAFT_POST_SAVE);\r\n\r\nexport const DRAFT_POST_SAVE_COMPLETE = 'DRAFT_POST_SAVE_COMPLETE';\r\nexport interface DraftPostSaveComplete extends CompleteAction { }\r\nexport const DraftPostSaveComplete = ActionCreator(DRAFT_POST_SAVE_COMPLETE);\r\n\r\nexport const DRAFT_POST_DELETE = 'DRAFT_POST_DELETE';\r\nexport interface DraftPostDelete extends Action { id: string }\r\nexport const DraftPostDelete = ActionCreator(DRAFT_POST_DELETE);\r\n\r\nexport const DRAFT_POST_DELETE_COMPLETE = 'DRAFT_POST_DELETE_COMPLETE';\r\nexport interface DraftPostDeleteComplete extends CompleteAction { id?: string }\r\nexport const DraftPostDeleteComplete = ActionCreator(DRAFT_POST_DELETE_COMPLETE);\r\n\r\nexport const DRAFT_POST_DELETE_COMPLETE_BATCH = 'DRAFT_POST_DELETE_COMPLETE_BATCH';\r\nexport interface DraftPostDeleteCompleteBatch extends CompleteAction { ids: string[] }\r\nexport const DraftPostDeleteCompleteBatch = ActionCreator(DRAFT_POST_DELETE_COMPLETE_BATCH);\r\n\r\nexport const FETCH_IMAGES_FROM_LIBRARY = 'FETCH_IMAGES_FROM_LIBRARY';\r\nexport interface FetchImagesFromLibrary extends Action { }\r\nexport const FetchImagesFromLibrary = ActionCreator(FETCH_IMAGES_FROM_LIBRARY);\r\n\r\nexport const FETCH_IMAGES_FROM_LIBRARY_COMPLETE = 'FETCH_IMAGES_FROM_LIBRARY_COMPLETE';\r\nexport interface FetchImagesFromLibraryComplete extends CompleteAction { chonkyFileData: CustomFileData[], totalCount: number, totalPages: number, currDir?: MediaFile, folderChain: CustomFileData[], currSortGroup?: SortGroupName, toggleShowFoldersFirst?: boolean, moveFilesForAppBar?: MoveFilesWithSrc }\r\nexport const FetchImagesFromLibraryComplete = ActionCreator(FETCH_IMAGES_FROM_LIBRARY_COMPLETE);\r\n\r\nexport const FETCH_DOCUMENTS_FROM_DIRECTORY = 'FETCH_DOCUMENTS_FROM_DIRECTORY';\r\nexport interface FetchDocumentsFromDirectory extends Action { }\r\nexport const FetchDocumentsFromDirectory = ActionCreator(FETCH_DOCUMENTS_FROM_DIRECTORY);\r\n\r\nexport const FETCH_DOCUMENTS_FROM_DIRECTORY_COMPLETE = 'FETCH_DOCUMENTS_FROM_DIRECTORY_COMPLETE';\r\nexport interface FetchDocumentsFromDirectoryComplete extends CompleteAction{ files: any[], continuationToken?: string}\r\nexport const FetchDocumentsFromDirectoryComplete = ActionCreator(FETCH_DOCUMENTS_FROM_DIRECTORY_COMPLETE);\r\n\r\nexport const UPLOAD_IMAGE = 'UPLOAD_IMAGE';\r\nexport interface UploadImage extends Action { }\r\nexport const UploadImage = ActionCreator(UPLOAD_IMAGE);\r\n\r\nexport const UPLOAD_IMAGE_COMPLETE = 'UPLOAD_IMAGE_COMPLETE';\r\nexport interface UploadImageComplete extends CompleteAction { id: string | null, fileName?: string }\r\nexport const UploadImageComplete = ActionCreator(UPLOAD_IMAGE_COMPLETE);\r\n\r\n\r\nexport const IMAGE_SELECTED = 'IMAGE_SELECTED';\r\nexport interface ImageSelected extends Action { imageId: string, imageUrl: string }\r\nexport const ImageSelected = ActionCreator(IMAGE_SELECTED);\r\n\r\nexport const DOCUMENT_SELECTED = 'DOCUMENT_SELECTED';\r\nexport interface DocumentSelected extends Action { docId: string, docUrl: string }\r\nexport const DocumentSelected = ActionCreator(DOCUMENT_SELECTED);\r\n\r\nexport const IMAGE_TRANSFORMED = 'IMAGE_TRANSFORMED';\r\nexport interface ImageTransformed extends Action { transforms: { points: number[], zoom?: number } }\r\nexport const ImageTransformed = ActionCreator(IMAGE_TRANSFORMED);\r\n\r\nexport const IMAGE_TWEAK_CONFIRMED = 'IMAGE_TWEAK_CONFIRMED';\r\nexport interface ImageTweaksConfirmed extends Action { }\r\nexport const ImageTweaksConfirmed = ActionCreator(IMAGE_TWEAK_CONFIRMED);\r\n\r\nexport const CANCEL_IMAGE_CHANGES = 'CANCEL_IMAGE_CHANGES';\r\nexport interface CancelImageChanges extends Action { }\r\nexport const CancelImageChanges = ActionCreator(CANCEL_IMAGE_CHANGES);\r\n\r\nexport const DELETE_EDITOR_POST_IMAGE = 'DELETE_EDITOR_POST_IMAGE';\r\nexport interface DeleteEditorPostImage extends Action { }\r\nexport const DeleteEditorPostImage = ActionCreator(DELETE_EDITOR_POST_IMAGE);\r\n\r\nexport const FETCH_IMAGE_FROM_LIBRARY_COMPLETE = 'FETCH_IMAGE_FROM_LIBRARY_COMPLETE';\r\nexport interface FetchImageFromLibraryComplete extends CompleteAction { image: any }\r\nexport const FetchImageFromLibraryComplete = ActionCreator(FETCH_IMAGE_FROM_LIBRARY_COMPLETE);\r\n\r\nexport const FETCH_DOCUMENT_FROM_DIRECTORY_COMPLETE = 'FETCH_DOCUMENT_FROM_DIRECTORY_COMPLETE';\r\nexport interface FetchDocumentFromDirectoryComplete extends CompleteAction { file: any }\r\nexport const FetchDocumentFromDirectoryComplete = ActionCreator(FETCH_DOCUMENT_FROM_DIRECTORY_COMPLETE);\r\n\r\nexport const EDIT_PLACED_IMAGE = 'EDIT_PLACED_IMAGE'\r\nexport interface EditPlacedImage extends Action { }\r\nexport const EditPlacedImage = ActionCreator(EDIT_PLACED_IMAGE);\r\n\r\n\r\nexport const GET_CONTENT_ANALYSIS = \"GET_CONTENT_ANALYSIS\";\r\nexport interface GetContentAnalysis extends Action {}\r\nexport const GetContentAnalysis = ActionCreator(GET_CONTENT_ANALYSIS);\r\n\r\nexport const GET_CONTENT_ANALYSIS_COMPLETE = \"GET_CONTENT_ANALYSIS_COMPLETE\";\r\nexport interface GetContentAnalysisComplete extends CompleteAction {}\r\nexport const GetContentAnalysisComplete = ActionCreator(GET_CONTENT_ANALYSIS_COMPLETE);\r\n\r\n\r\nexport const GET_DRAFT_TRANSLATION = \"GET_DRAFT_TRANSLATION\";\r\nexport interface GetDraftTranslation extends Action {}\r\nexport const GetDraftTranslation = ActionCreator(GET_DRAFT_TRANSLATION);\r\n\r\nexport const GET_DRAFT_TRANSLATION_COMPLETE = \"GET_DRAFT_TRANSLATION_COMPLETE\";\r\nexport interface GetDraftTranslationComplete extends CompleteAction {}\r\nexport const GetDraftTranslationComplete = ActionCreator(GET_DRAFT_TRANSLATION_COMPLETE);\r\n\r\n\r\nexport const UNPUBLISH_POST = 'UNPUBLISH_POST'\r\nexport interface UnpublishPost extends Action { }\r\nexport const UnpublishPost = ActionCreator(UNPUBLISH_POST);\r\n\r\nexport const UNPUBLISH_POST_COMPLETE = 'UNPUBLISH_POST_COMPLETE';\r\nexport interface UnpublishPostComplete extends CompleteAction {};\r\nexport const UnpublishPostComplete = ActionCreator(UNPUBLISH_POST_COMPLETE);\r\n\r\nexport const PUBLISH_POST = 'PUBLISH_POST'\r\nexport interface PublishPost extends Action { }\r\nexport const PublishPost = ActionCreator(PUBLISH_POST);\r\n\r\nexport const PUBLISH_POST_COMPLETE = 'PUBLISH_POST_COMPLETE'\r\nexport interface PublishPostComplete extends CompleteAction {\r\n validationResult?: {\r\n errors?: { [key: string]: string[] },\r\n postTitle?: string,\r\n postId?: string\r\n }\r\n}\r\nexport const PublishPostComplete = ActionCreator(PUBLISH_POST_COMPLETE);\r\n\r\nexport const PUBLISH_SUCCESSFUL = 'PUBLISH_SUCCESSFUL';\r\nexport interface PublishSuccessful extends Action { containsVideoContent?: boolean, expectedPublishTime?: string, id?: string }\r\nexport const PublishSuccessful = ActionCreator(PUBLISH_SUCCESSFUL);\r\n\r\nexport const HIDE_PUBLISH_SUCCESSFUL_DIALOG = 'HIDE_PUBLISH_SUCCESSFUL_DIALOG';\r\nexport interface HidePublishSuccessfulDialog extends Action {}\r\nexport const HidePublishSuccessfulDialog = ActionCreator(HIDE_PUBLISH_SUCCESSFUL_DIALOG);\r\n\r\nexport const FETCH_IDEAL_WORD_COUNT = 'FETCH_IDEAL_WORD_COUNT';\r\nexport interface FetchIdealWordCount extends Action { }\r\nexport const FetchIdealWordCount = ActionCreator(FETCH_IDEAL_WORD_COUNT);\r\n\r\nexport const FETCH_IDEAL_WORD_COUNT_COMPLETE = 'FETCH_IDEAL_WORD_COUNT_COMPLETE';\r\nexport interface FetchIdealWordCountComplete extends CompleteAction { idealWordCount: number }\r\nexport const FetchIdealWordCountComplete = ActionCreator(FETCH_IDEAL_WORD_COUNT_COMPLETE);\r\n\r\nexport const DISMISS_IDEAL_WORD_COUNT_TIP = 'DISMISS_IDEAL_WORD_COUNT_TIP';\r\nexport interface DismissIdealWordCountTip extends Action { }\r\nexport const DismissIdealWordCountTip = ActionCreator(DISMISS_IDEAL_WORD_COUNT_TIP);\r\n\r\n\r\nexport const SET_POST_TYPE = 'SET_POST_TYPE';\r\nexport interface SetPostType extends Action { postType: string }\r\nexport const SetPostType = ActionCreator(SET_POST_TYPE);\r\n\r\nexport const SET_CHANGED_SINCE_SAVE = 'SET_CHANGED_SINCE_SAVE';\r\nexport interface SetChangedSinceSave extends Action { changed: boolean}\r\nexport const SetChangedSinceSave = ActionCreator(SET_CHANGED_SINCE_SAVE);\r\n\r\nexport const SET_SAVING = 'SET_SAVING';\r\nexport interface SetSaving extends Action { saving: boolean }\r\nexport const SetSaving = ActionCreator(SET_SAVING);\r\n\r\nexport const SET_NEW_POST_LIST = 'SET_NEW_POST_LIST'\r\nexport interface setNewPostList extends Action { page: PostListingPage }\r\nexport const setNewPostList = ActionCreator(SET_NEW_POST_LIST);\r\n\r\nexport const SET_UPLOADING = \"SET_UPLOADING\";\r\nexport interface SetUploading extends Action { uploading: boolean }\r\nexport const SetUploading = ActionCreator(SET_UPLOADING);\r\n\r\n\r\nexport const SET_POST_FEED_FILTERS = \"SET_POST_FEED_FILTERS\";\r\nexport interface SetPostFeedFilters extends Action { filters: Partial }\r\nexport const SetPostFeedFilters = ActionCreator(SET_POST_FEED_FILTERS);\r\n\r\nexport const SEND_ACKNOWLEDGEMENT = \"SEND_ACKNOWLEDGEMENT\";\r\nexport interface SendAcknowledgement extends Action {}\r\nexport const SendAcknowledgement = ActionCreator(SEND_ACKNOWLEDGEMENT);\r\n\r\nexport const SEND_ACKNOWLEDGEMENT_COMPLETE = \"SEND_ACKNOWLEDGEMENT_COMPLETE\";\r\nexport interface SendAcknowledgementComplete extends CompleteAction {}\r\nexport const SendAcknowledgementComplete = ActionCreator(SEND_ACKNOWLEDGEMENT_COMPLETE);\r\n\r\n\r\nexport const SET_REACTION = \"SET_REACTION\";\r\nexport interface SetReaction extends Action {}\r\nexport const SetReaction = ActionCreator(SET_REACTION);\r\n\r\nexport const SET_REACTION_COMPLETE = \"SET_REACTION_COMPLETE\";\r\nexport interface SetReactionComplete extends CompleteAction {}\r\nexport const SetReactionComplete = ActionCreator(SET_REACTION_COMPLETE);\r\n\r\n\r\nexport const ADD_COMMENT = \"ADD_COMMENT\";\r\nexport interface AddComment extends Action {}\r\nexport const AddComment = ActionCreator(ADD_COMMENT);\r\n\r\nexport const ADD_COMMENT_COMPLETE = \"ADD_COMMENT_COMPLETE\";\r\nexport interface AddCommentComplete extends CompleteAction {}\r\nexport const AddCommentComplete = ActionCreator(ADD_COMMENT_COMPLETE);\r\n\r\nexport const ADD_COMMENT_REPLY = \"ADD_COMMENT_REPLY\";\r\nexport interface AddCommentReply extends Action {}\r\nexport const AddCommentReply = ActionCreator(ADD_COMMENT_REPLY);\r\n\r\nexport const ADD_COMMENT_REPLY_COMPLETE = \"ADD_COMMENT_REPLY_COMPLETE\";\r\nexport interface AddCommentReplyComplete extends CompleteAction {}\r\nexport const AddCommentReplyComplete = ActionCreator(ADD_COMMENT_REPLY_COMPLETE);\r\n\r\nexport const DELETE_COMMENT = \"DELETE_COMMENT\";\r\nexport interface DeleteComment extends Action {}\r\nexport const DeleteComment = ActionCreator(DELETE_COMMENT);\r\n\r\nexport const DELETE_COMMENT_COMPLETE = \"DELETE_COMMENT_COMPLETE\";\r\nexport interface DeleteCommentComplete extends CompleteAction {}\r\nexport const DeleteCommentComplete = ActionCreator(DELETE_COMMENT_COMPLETE);\r\n\r\nexport const DESTAR_COMMENT = \"DESTAR_COMMENT\";\r\nexport interface DestarComment extends Action {}\r\nexport const DestarComment = ActionCreator(DESTAR_COMMENT);\r\n\r\nexport const DESTAR_COMMENT_COMPLETE = \"DESTAR_COMMENT_COMPLETE\";\r\nexport interface DestarCommentComplete extends CompleteAction {}\r\nexport const DestarCommentComplete = ActionCreator(DESTAR_COMMENT_COMPLETE);\r\n\r\n\r\nexport const EDIT_COMMENT = \"EDIT_COMMENT\";\r\nexport interface EditComment extends Action {}\r\nexport const EditComment = ActionCreator(EDIT_COMMENT);\r\n\r\nexport const EDIT_COMMENT_COMPLETE = \"EDIT_COMMENT_COMPLETE\";\r\nexport interface EditCommentComplete extends CompleteAction {}\r\nexport const EditCommentComplete = ActionCreator(EDIT_COMMENT_COMPLETE);\r\n\r\n\r\nexport const FLAG_COMMENT = \"FLAG_COMMENT\";\r\nexport interface FlagComment extends Action {}\r\nexport const FlagComment = ActionCreator(FLAG_COMMENT);\r\n\r\nexport const FLAG_COMMENT_COMPLETE = \"FLAG_COMMENT_COMPLETE\";\r\nexport interface FlagCommentComplete extends CompleteAction {}\r\nexport const FlagCommentComplete = ActionCreator(FLAG_COMMENT_COMPLETE);\r\n\r\n\r\nexport const STAR_COMMENT = \"STAR_COMMENT\";\r\nexport interface StarComment extends Action {}\r\nexport const StarComment = ActionCreator(STAR_COMMENT);\r\n\r\nexport const STAR_COMMENT_COMPLETE = \"STAR_COMMENT_COMPLETE\";\r\nexport interface StarCommentComplete extends CompleteAction {}\r\nexport const StarCommentComplete = ActionCreator(STAR_COMMENT_COMPLETE);\r\n\r\n\r\nexport const SUBSCRIBE_TO_COMMENTS = \"SUBSCRIBE_TO_COMMENTS\";\r\nexport interface SubscribeToComments extends Action {}\r\nexport const SubscribeToComments = ActionCreator(SUBSCRIBE_TO_COMMENTS);\r\n\r\nexport const SUBSCRIBE_TO_COMMENTS_COMPLETE = \"SUBSCRIBE_TO_COMMENTS_COMPLETE\";\r\nexport interface SubscribeToCommentsComplete extends CompleteAction {}\r\nexport const SubscribeToCommentsComplete = ActionCreator(SUBSCRIBE_TO_COMMENTS_COMPLETE);\r\n\r\n\r\nexport const UNSUBSCRIBE_FROM_COMMENTS = \"UNSUBSCRIBE_FROM_COMMENTS\";\r\nexport interface UnsubscribeFromComments extends Action {}\r\nexport const UnsubscribeFromComments = ActionCreator(UNSUBSCRIBE_FROM_COMMENTS);\r\n\r\nexport const UNSUBSCRIBE_FROM_COMMENTS_COMPLETE = \"UNSUBSCRIBE_FROM_COMMENTS_COMPLETE\";\r\nexport interface UnsubscribeFromCommentsComplete extends CompleteAction {}\r\nexport const UnsubscribeFromCommentsComplete = ActionCreator(UNSUBSCRIBE_FROM_COMMENTS_COMPLETE);\r\n\r\n\r\nexport const CLEAR_FETCH_POST = \"CLEAR_FETCH_POST\";\r\nexport interface ClearFetchPost extends Action {}\r\nexport const ClearFetchPost = ActionCreator(CLEAR_FETCH_POST);\r\n\r\nexport const CLEAR_POST_AUTHORING_ERROR_MESSAGE = \"CLEAR_POST_AUTHORING_ERROR_MESSAGE\";\r\nexport interface ClearPostAuthoringErrorMessage extends Action {}\r\nexport const ClearPostAuthoringErrorMessage = ActionCreator(CLEAR_POST_AUTHORING_ERROR_MESSAGE);\r\n\r\nexport const CLEAR_POST_AUTHORING_SUCCESS_MESSAGE = \"CLEAR_POST_AUTHORING_SUCCESS_MESSAGE\";\r\nexport interface ClearPostAuthoringSuccessMessage extends Action {}\r\nexport const ClearPostAuthoringSuccessMessage = ActionCreator(CLEAR_POST_AUTHORING_SUCCESS_MESSAGE);\r\n\r\nexport const CLEAR_POST_FEED_ERROR_MESSAGE = \"CLEAR_POST_FEED_ERROR_MESSAGE\";\r\nexport interface ClearPostFeedErrorMessage extends Action {}\r\nexport const ClearPostFeedErrorMessage = ActionCreator(CLEAR_POST_FEED_ERROR_MESSAGE);\r\n\r\nexport const CLEAR_POST_VIEW_ERROR_MESSAGE = \"CLEAR_POST_VIEW_ERROR_MESSAGE\";\r\nexport interface ClearPostViewErrorMessage extends Action {}\r\nexport const ClearPostViewErrorMessage = ActionCreator(CLEAR_POST_VIEW_ERROR_MESSAGE);\r\n\r\nexport const CLEAR_SHOULD_FETCH = \"CLEAR_SHOULD_FETCH\";\r\nexport interface ClearShouldFetch extends Action {}\r\nexport const ClearShouldFetch = ActionCreator(CLEAR_SHOULD_FETCH);\r\n\r\nexport const DELETE_FOLDERS_INIT = 'DELETE_FOLDERS_INIT';\r\nexport interface DeleteFoldersInit extends Action {}\r\nexport const DeleteFoldersInit = ActionCreator(DELETE_FOLDERS_INIT);","import {\r\n Action,\r\n createAsyncThunk,\r\n createSlice,\r\n isRejected,\r\n isFulfilled,\r\n isPending\r\n} from \"@reduxjs/toolkit\";\r\n\r\nimport { HomeScreenPlatform, HomeScreenType, HomeScreensStateStatus, IHomeScreenConfig, IHomeScreensState } from \"./models\";\r\nimport { homeScreenConfigApi } from \"api/instances\";\r\nimport { ISetSuccessMessageAction } from \"modules/contentBands/reducer\";\r\n\r\nconst HOME_SCREENS_DEFAULT_STATE: IHomeScreensState = {\r\n homeScreenConfigs: undefined,\r\n pristineConfigs: undefined,\r\n status: HomeScreensStateStatus.Idle,\r\n successMessage: undefined,\r\n};\r\n\r\nexport interface IBaseUpdateHomeScreenConfigPayload {\r\n platform: HomeScreenPlatform;\r\n}\r\n\r\nexport interface ISetHomeScreenTypePayload extends IBaseUpdateHomeScreenConfigPayload {\r\n homeScreenType: HomeScreenType;\r\n}\r\n\r\nexport interface ISetHomeScreenTypeAction extends Action {\r\n payload: ISetHomeScreenTypePayload;\r\n}\r\n\r\nexport interface ISetShowFeedBelowPayload extends IBaseUpdateHomeScreenConfigPayload {\r\n show: boolean;\r\n}\r\n\r\nexport interface ISetShowFeedBelowAction extends Action {\r\n payload: ISetShowFeedBelowPayload;\r\n}\r\n\r\nexport interface ISetFeedHeaderTextPayload extends IBaseUpdateHomeScreenConfigPayload {\r\n text: string;\r\n}\r\n\r\nexport interface ISetFeedHeaderTextAction extends Action {\r\n payload: ISetFeedHeaderTextPayload;\r\n}\r\n\r\nexport interface ISetHomeScreenConfigsAction extends Action {\r\n payload: IHomeScreenConfig[];\r\n}\r\n\r\nexport interface IResetConfigAction extends Action { }\r\n\r\nexport const fetchHomeScreenConfigs = createAsyncThunk(\"FETCH_HOME_SCREEN_CONFIGS\", async (_, thunkApi) => {\r\n try {\r\n const { data } = await homeScreenConfigApi.getHomeScreenConfigs(null);\r\n\r\n thunkApi.dispatch({ type: homeScreensSlice.actions.SET_HOME_SCREEN_CONFIGS, payload: data });\r\n thunkApi.dispatch({ type: homeScreensSlice.actions.SET_PRISTINE_CONFIGS, payload: data });\r\n } catch (err) {\r\n throw err;\r\n }\r\n});\r\n\r\nexport const saveHomeScreenConfigs = createAsyncThunk(\"SAVE_HOME_SCREEN_CONFIGS\", async (payload: IHomeScreenConfig[], thunkApi) => {\r\n try {\r\n await homeScreenConfigApi.saveHomeScreenConfigs(payload);\r\n\r\n thunkApi.dispatch({ type: homeScreensSlice.actions.SET_PRISTINE_CONFIGS, payload });\r\n thunkApi.dispatch({\r\n type: homeScreensSlice.actions.SET_SUCCESS_MESSAGE,\r\n payload: \"Successfully saved changes and updated your home screens.\",\r\n });\r\n } catch (err) {\r\n throw err;\r\n }\r\n});\r\n\r\nconst getHomeScreenConfigsList = (state: IHomeScreensState) => state?.homeScreenConfigs || [];\r\n\r\nexport const homeScreensSlice = createSlice({\r\n name: \"homeScreens\",\r\n initialState: HOME_SCREENS_DEFAULT_STATE,\r\n reducers: {\r\n SET_HOME_SCREEN_CONFIGS: (state: IHomeScreensState, action: ISetHomeScreenConfigsAction) => {\r\n state.homeScreenConfigs = action.payload;\r\n },\r\n SET_PRISTINE_CONFIGS: (state: IHomeScreensState, action: ISetHomeScreenConfigsAction) => {\r\n state.pristineConfigs = action.payload;\r\n },\r\n RESET_CONFIGS: (state: IHomeScreensState, _: IResetConfigAction) => {\r\n state.homeScreenConfigs = state.pristineConfigs;\r\n },\r\n SET_HEADER_TEXT: (state: IHomeScreensState, action: ISetFeedHeaderTextAction) => {\r\n state.homeScreenConfigs = getHomeScreenConfigsList(state).map((c: IHomeScreenConfig) =>\r\n c.platform === action.payload.platform\r\n ? {\r\n ...c,\r\n feedHeader: action.payload.text,\r\n }\r\n : c\r\n );\r\n },\r\n SET_SHOW_FEED_BELOW: (state: IHomeScreensState, action: ISetShowFeedBelowAction) => {\r\n state.homeScreenConfigs = getHomeScreenConfigsList(state).map((c: IHomeScreenConfig) =>\r\n c.platform === action.payload.platform\r\n ? {\r\n ...c,\r\n showMyFeedBelowContentBands: action.payload.show,\r\n // clear feedHeader if turned off\r\n feedHeader: action.payload.show ? c.feedHeader : \"\",\r\n }\r\n : c\r\n );\r\n },\r\n SET_HOME_SCREEN_TYPE: (state: IHomeScreensState, action: ISetHomeScreenTypeAction) => {\r\n state.homeScreenConfigs = getHomeScreenConfigsList(state).map((c: IHomeScreenConfig) =>\r\n c.platform === action.payload.platform\r\n ? {\r\n ...c,\r\n homeScreenType: action.payload.homeScreenType,\r\n }\r\n : c\r\n );\r\n },\r\n SET_SUCCESS_MESSAGE: (state: IHomeScreensState, action: ISetSuccessMessageAction) => {\r\n state.successMessage = action.payload;\r\n },\r\n },\r\n extraReducers: (builder) => {\r\n builder\r\n .addMatcher(isPending, (state: IHomeScreensState) => {\r\n state.status = HomeScreensStateStatus.Loading;\r\n })\r\n .addMatcher(isFulfilled, (state: IHomeScreensState) => {\r\n state.status = HomeScreensStateStatus.Succeeded;\r\n })\r\n .addMatcher(isRejected, (state: IHomeScreensState) => {\r\n state.status = HomeScreensStateStatus.Failed;\r\n });\r\n },\r\n});\r\n","import { GlobalApplicationState } from 'globalApplicationState';\r\nimport * as Actions from './actions';\r\nimport { Survey } from './models';\r\nimport API from 'api';\r\n\r\n\r\nexport const getSurveys = () => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetSurveys({}));\r\n return dispatch(API.surveys.GetSurveys())\r\n .then(response => response.json())\r\n .then(surveys => dispatch(Actions.GetSurveysComplete({surveys, succeeded: true})))\r\n .catch(err => dispatch(Actions.GetSurveysComplete({err, succeeded: false})));\r\n}\r\n\r\nexport const deleteSurveys = (ids: string[]) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.DeleteSurveys({}));\r\n return Promise.all(ids.map(id => dispatch(API.surveys.DeleteSurvey(id))))\r\n .then(results => dispatch(Actions.DeleteSurveysComplete({succeeded: true, deletedSurveys: ids})))\r\n .catch(err => dispatch(Actions.DeleteSurveysComplete({succeeded: false, err})));\r\n}\r\n\r\n\r\nexport const saveSurvey = (survey: Survey) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.SaveSurvey({}));\r\n return dispatch(API.surveys.SaveSurvey(survey))\r\n .then(response => { \r\n dispatch(Actions.SaveSurveyComplete({ succeeded: true })); \r\n return response.json(); \r\n })\r\n .catch(err => {\r\n dispatch(Actions.SaveSurveyComplete({succeeded: false, err}));\r\n return survey;\r\n });\r\n}\r\n\r\nexport const updateSurveyExpiry = (survey) => (dispatch, getState: () => GlobalApplicationState) => {\r\n dispatch(Actions.SaveSurvey({}));\r\n return dispatch(API.surveys.UpdateSurveyExpiryTime(survey))\r\n .then(response => {\r\n dispatch(Actions.SaveSurveyComplete({ succeeded: true })); \r\n return response.json();\r\n })\r\n .catch(err => {\r\n dispatch(Actions.SaveSurveyComplete({succeeded: false, err}));\r\n return survey;\r\n });\r\n}\r\n\r\n\r\nexport const getSurvey = (id: string) => (dispatch, getState: () => GlobalApplicationState): Promise => {\r\n dispatch(Actions.GetSurvey({}));\r\n return dispatch(API.surveys.GetSurvey(id))\r\n .then(response => { dispatch(Actions.GetSurveyComplete({succeeded: true})); return response.json();});\r\n}\r\n\r\n\r\nexport const clearSurveyList = () => (dispatch, getState: () => GlobalApplicationState): void => {\r\n dispatch(Actions.ClearSurveyList({}));\r\n}","import { TenantNotificationSettings } from \"modules/messaging\";\r\nimport { lcidMappings } from \"modules/resources\";\r\nimport { Action } from \"redux\";\r\nimport { CompleteAction, ActionCreator } from \"typedActions\";\r\nimport { reminderData } from \"./components/reminderPopout\";\r\n\r\nimport {\r\n ClientSettings,\r\n ClientSettingsTagGroup,\r\n TenantSettings,\r\n ThemeSettings,\r\n TenantAttribute,\r\n TenantSettingsTag,\r\n TenantSettingsTagGroup,\r\n ReactionTab,\r\n CurrentUserSettings,\r\n ExternalPostSource,\r\n TranslatableLanguage,\r\n} from \"./models\";\r\n\r\n/* Fetch config */\r\nexport const FETCH_SETTINGS_CLIENT_CONFIG_INIT = \"FETCH_SETTINGS_CLIENT_CONFIG_INIT\";\r\nexport interface FetchClientConfigInit extends Action {}\r\nexport const CreateFetchClientConfigInitAction = ActionCreator(FETCH_SETTINGS_CLIENT_CONFIG_INIT);\r\n\r\nexport const FETCH_SETTINGS_CLIENT_CONFIG_COMPLETE = \"FETCH_SETTINGS_CLIENT_CONFIG_COMPLETE\";\r\nexport interface FetchClientConfigComplete extends CompleteAction {\r\n clientSettings: ClientSettings | null;\r\n}\r\nexport const CreateFetchClientConfigCompleteAction = ActionCreator(FETCH_SETTINGS_CLIENT_CONFIG_COMPLETE);\r\n\r\nexport const FETCH_SETTINGS_TENANT_CONFIG_INIT = \"FETCH_SETTINGS_TENANT_CONFIG_INIT\";\r\nexport interface FetchTenantConfigInit extends Action {}\r\nexport const CreateFetchTenantConfigInitAction = ActionCreator(FETCH_SETTINGS_TENANT_CONFIG_INIT);\r\n\r\nexport const FETCH_SETTINGS_TENANT_CONFIG_COMPLETE = \"FETCH_SETTINGS_TENANT_CONFIG_COMPLETE\";\r\nexport interface FetchTenantConfigComplete extends CompleteAction {\r\n tenantSettings: TenantSettings | null;\r\n}\r\nexport const CreateFetchTenantConfigCompleteAction = ActionCreator(FETCH_SETTINGS_TENANT_CONFIG_COMPLETE);\r\n\r\nexport const FETCH_TAG_SETTINGS_INIT = \"FETCH_TAG_SETTINGS_INIT\";\r\nexport interface FetchTagSettingsInit extends Action {}\r\nexport const FetchTagSettingsInitAction = ActionCreator(FETCH_TAG_SETTINGS_INIT);\r\n\r\nexport const FETCH_TAG_SETTINGS_COMPLETE = \"FETCH_TAG_SETTINGS_COMPLETE\";\r\nexport interface FetchTagSettingsComplete extends CompleteAction {\r\n tagSettings: ClientSettingsTagGroup[];\r\n}\r\nexport const FetchTagSettingsCompleteAction = ActionCreator(FETCH_TAG_SETTINGS_COMPLETE);\r\n\r\nexport const FETCH_TENANT_ATTRIBUTES_COMPLETE = \"FETCH_TENANT_ATTRIBUTES_COMPLETE\";\r\nexport interface FetchTenantAttributesComplete extends CompleteAction {\r\n tenantAttributes: TenantAttribute[];\r\n}\r\nexport const FetchTenantAttributesComplete = ActionCreator(FETCH_TENANT_ATTRIBUTES_COMPLETE);\r\n\r\n/* Fatch user tag settings */\r\n\r\nexport const FETCH_USER_TAG_SETTINGS_INIT = \"FETCH_TAG_SETTINGS_INIT\";\r\nexport interface FetchUserTagSettingsInit extends Action {}\r\nexport const FetchUserTagSettingsInitAction = ActionCreator(FETCH_USER_TAG_SETTINGS_INIT);\r\n\r\nexport const FETCH_USER_TAG_SETTINGS_COMPLETE = \"FETCH_USER_TAG_SETTINGS_COMPLETE\";\r\nexport interface FetchUserTagSettingsComplete extends CompleteAction {\r\n tagSettings: ClientSettingsTagGroup[];\r\n}\r\nexport const FetchUserTagSettingsCompleteAction = ActionCreator(FETCH_USER_TAG_SETTINGS_COMPLETE);\r\n\r\nexport const FETCH_USER_SETTINGS_INIT = \"FETCH_USER_SETTINGS_INIT\";\r\nexport interface FetchUserSettingsInit extends Action {}\r\nexport const CreateFetchUserSettingsInitAction = ActionCreator(FETCH_USER_SETTINGS_INIT);\r\n\r\nexport const FETCH_USER_SETTINGS_COMPLETE = \"FETCH_USER_SETTINGS_COMPLETE\";\r\nexport interface FetchUserSettingsComplete extends CompleteAction {\r\n user: CurrentUserSettings;\r\n}\r\nexport const CreateFetchUserSettingsCompleteAction = ActionCreator(FETCH_USER_SETTINGS_COMPLETE);\r\n\r\nexport const UPDATE_USER_SETTINGS = \"UPDATE_USER_SETTINGS\";\r\nexport interface UpdateUserSettings extends Action { userSettings: Partial }\r\nexport const UpdateUserSettings = ActionCreator(UPDATE_USER_SETTINGS);\r\n\r\n\r\nexport const FETCH_NOTIFICATION_SETTINGS_INIT = \"FETCH_NOTIFICATION_SETTINGS_INIT\";\r\nexport interface FetchNotificationSettingsInit extends Action {}\r\nexport const CreateFetchNotificationSettingsInitAction = ActionCreator(FETCH_NOTIFICATION_SETTINGS_INIT);\r\n\r\nexport const FETCH_NOTIFICATION_SETTINGS_COMPLETE = \"FETCH_NOTIFICATION_SETTINGS_COMPLETE\";\r\nexport interface FetchNotificationSettingsComplete extends CompleteAction {\r\n notificationSettings: TenantNotificationSettings;\r\n}\r\nexport const CreateFetchNotificationSettingsCompleteAction = ActionCreator(FETCH_NOTIFICATION_SETTINGS_COMPLETE);\r\n\r\nexport const CHANGE_PRISTINE_STATE = \"CHANGE_PRISTINE_STATE\";\r\nexport interface ChangePristineState extends Action {\r\n newState: boolean;\r\n}\r\nexport const CreateChangePristineStateAction = ActionCreator(CHANGE_PRISTINE_STATE);\r\n\r\nexport const TENANT_DISPLAY_NAME_CHANGED = \"TENANT_DISPLAY_NAME_CHANGED\";\r\nexport interface TenantDisplayNameChanged extends Action {\r\n displayName: string;\r\n}\r\nexport const CreateTenantDisplayNameChangedAction = ActionCreator(TENANT_DISPLAY_NAME_CHANGED);\r\n\r\nexport const SET_SHOW_INVITED_EXTERNAL_USERS_ENABLED = \"SET_SHOW_INVITED_EXTERNAL_USERS_ENABLED\";\r\nexport interface SetShowInvitedExternalUsersEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateSetShowInvitedExternalUsersEnabled = ActionCreator(SET_SHOW_INVITED_EXTERNAL_USERS_ENABLED);\r\n\r\nexport const SET_POST_NOTIFICATIONS_ENABLED = \"SET_POST_NOTIFICATIONS_ENABLED\";\r\nexport interface SetPostNotificationsEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateSetPostNotificationsEnabled = ActionCreator(SET_POST_NOTIFICATIONS_ENABLED);\r\n\r\nexport const SET_SMS_NOTIFICATIONS_ENABLED = \"SET_SMS_NOTIFICATIONS_ENABLED\";\r\nexport interface SetSmsNotificationsEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateSetSmsNotificationsEnabled = ActionCreator(SET_SMS_NOTIFICATIONS_ENABLED);\r\n\r\nexport const SET_EMAIL_NOTIFICATIONS_ENABLED = \"SET_EMAIL_NOTIFICATIONS_ENABLED\";\r\nexport interface SetEmailNotificationsEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateSetEmailNotificationsEnabled = ActionCreator(SET_EMAIL_NOTIFICATIONS_ENABLED);\r\n\r\nexport const COMMENTS_ENABLED_CHANGED = \"COMMENTS_ENABLED_CHANGED\";\r\nexport interface CommentsEnabledChanged extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateCommentsEnabledChangedAction = ActionCreator(COMMENTS_ENABLED_CHANGED);\r\n\r\nexport const EXTERNAL_POST_PURGE_CHANGED = \"EXTERNAL_POST_PURGE_CHANGED\";\r\nexport interface ExternalPostPurgeEnabledChanged extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateExternalPostPurgeChangedAction = ActionCreator(EXTERNAL_POST_PURGE_CHANGED);\r\n\r\nexport const SET_MOBILE_SYNC_ENABLED = \"SET_MOBILE_SYNC_ENABLED\";\r\nexport interface SetMobileSyncEnabledAction extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateSetMobileSyncEnabledAction = ActionCreator(SET_MOBILE_SYNC_ENABLED);\r\n\r\nexport const SET_MOBILE_SYNC_NUMBER_SELECTED = \"SET_MOBILE_SYNC_NUMBER_SELECTED\";\r\nexport interface SetMobileSyncNumberSelectedAction extends Action {\r\n numberType: string;\r\n}\r\nexport const SYNC_ALL_AD_USERS_ENABLED = \"SYNC_ALL_AD_USERS_ENABLED\";\r\nexport interface SetSyncAllAdUsersEnabledAction extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateSetSyncAllAdUsersEnabledAction = ActionCreator(SYNC_ALL_AD_USERS_ENABLED);\r\n\r\nexport const SET_SYNC_LEVEL = \"SET_SYNC_LEVEL\";\r\nexport interface SetSyncLevelAction extends Action {\r\n syncLevel: string;\r\n}\r\nexport const CreateSetSyncLevelAction = ActionCreator(SET_SYNC_LEVEL);\r\nexport const CreateSetMobileSyncNumberSelectedAction = ActionCreator(SET_MOBILE_SYNC_NUMBER_SELECTED);\r\n\r\nexport const EVERYONE_AUDIENCE_ENFORCEMENT_CHANGED = \"EVERYONE_AUDIENCE_ENFORCEMENT_CHANGED\";\r\nexport interface EveryoneAudienceEnforcementChanged extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateEveryoneAudienceEnforcementChangedAction = ActionCreator(EVERYONE_AUDIENCE_ENFORCEMENT_CHANGED);\r\n\r\nexport const MANAGE_TOPICS_AUDIENCES_ADMIN_CHANGED = \"MANAGE_TOPICS_AUDIENCES_ADMIN_CHANGED\";\r\nexport interface ManageTopicsAudiencesInAdminChanged extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateManageTopicsAudiencesInAdminChangedAction = ActionCreator(\r\n MANAGE_TOPICS_AUDIENCES_ADMIN_CHANGED\r\n);\r\n\r\nexport const IS_COMMENTING_ENABLED_FOR_NEW_POSTS_BY_DEFAULT = \"IS_COMMENTING_ENABLED_FOR_NEW_POSTS_BY_DEFAULT\";\r\nexport interface IsCommentingEnabledForNewPostsByDefaultChanged extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateIsCommentingEnabledForNewPostsByDefaultChangedAction = ActionCreator(\r\n IS_COMMENTING_ENABLED_FOR_NEW_POSTS_BY_DEFAULT\r\n);\r\n\r\nexport const COMMENT_MODERATION_ENABLED = \"COMMENT_MODERATION_ENABLED\";\r\nexport interface CommentModerationEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateCommentModerationEnabledChangedAction = ActionCreator(\r\n COMMENT_MODERATION_ENABLED\r\n);\r\n\r\nexport const GIF_SELECTION_ENABLED = \"GIF_SELECTION_ENABLED\";\r\nexport interface GifSelectionEnabledForCommentsChanged extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateGifSelectionEnabledForCommentsAction = ActionCreator(\r\n GIF_SELECTION_ENABLED\r\n);\r\n\r\nexport const COMMENTS_MAXLENGTH_CHANGED = \"COMMENTS_MAXLENGTH_CHANGED\";\r\nexport interface CommentsMaxLengthChanged extends Action {\r\n maxLength: number;\r\n}\r\nexport const CreateCommentsMaxLengthChangedAction = ActionCreator(COMMENTS_MAXLENGTH_CHANGED);\r\n\r\nexport const SET_EXTERNAL_AUTH_ENABLED = \"SET_EXTERNAL_AUTH_ENABLED\";\r\nexport interface SetExternalAuthEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateSetExternalAuthEnabledAction = ActionCreator(SET_EXTERNAL_AUTH_ENABLED);\r\n\r\nexport const REACTIONS_ENABLED = \"REACTIONS_ENABLED\";\r\nexport interface ReactionsEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateToggleReactionsAction = ActionCreator(REACTIONS_ENABLED);\r\n\r\nexport const IS_REACTING_ENABLED_FOR_NEW_POSTS_BY_DEFAULT = \"IS_REACTING_ENABLED_FOR_NEW_POSTS_BY_DEFAULT\";\r\nexport interface IsReactingEnabledForNewPostsByDefaultChanged extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateIsReactingEnabledForNewPostsByDefaultChangedAction = ActionCreator(\r\n IS_REACTING_ENABLED_FOR_NEW_POSTS_BY_DEFAULT\r\n);\r\n\r\nexport const REACTION_ENABLED_CHANGED = \"REACTION_ENABLED_CHANGED\";\r\nexport interface ReactionEnabledChanged extends Action {\r\n id: string;\r\n enabled: boolean;\r\n}\r\nexport const CreateReactionEnabledChangedAction = ActionCreator(REACTION_ENABLED_CHANGED);\r\n\r\nexport const REACTION_NAME_CHANGED = \"REACTION_NAME_CHANGED\";\r\nexport interface ReactionNameChanged extends Action {\r\n id: string;\r\n name: string;\r\n}\r\nexport const CreateReactionNameChangedAction = ActionCreator(REACTION_NAME_CHANGED);\r\n\r\nexport const REACTION_REORDER = \"REACTION_REORDER\";\r\nexport interface ReactionReorder extends Action {\r\n id: string;\r\n up: boolean;\r\n}\r\nexport const CreateReactionReorderAction = ActionCreator(REACTION_REORDER);\r\n\r\nexport const SET_ACTIVE_REACTION_TAB = \"SET_ACTIVE_REACTION_TAB\";\r\nexport interface SetActiveReactionTab extends Action {\r\n activeReactionTab: ReactionTab;\r\n}\r\nexport const CreateSetActiveReactionTabAction = ActionCreator(SET_ACTIVE_REACTION_TAB);\r\n\r\n/* Reset config */\r\nexport const RESET_SETTINGS_COMPLETE = \"RESET_SETTINGS_COMPLETE\";\r\nexport interface ResetSettingsComplete extends CompleteAction {};\r\n\r\nexport const CreateResetSettingsCompleteAction = ActionCreator(RESET_SETTINGS_COMPLETE);\r\n\r\n/* Save config */\r\nexport const SAVE_TENANT_SETTINGS_INIT = \"SAVE_TENANT_SETTINGS_INIT\";\r\nexport interface SaveTenantSettingsInit extends Action {};\r\nexport const CreateSaveTenantSettingsInitAction = ActionCreator(SAVE_TENANT_SETTINGS_INIT);\r\n\r\nexport const SAVE_SETTINGS_COMPLETE = \"SAVE_SETTINGS_COMPLETE\";\r\nexport interface SaveSettingsComplete extends CompleteAction {};\r\nexport const CreateSaveSettingsCompleteAction = ActionCreator(SAVE_SETTINGS_COMPLETE)\r\n\r\nexport const SAVE_TENANT_SETTINGS_COMPLETE = \"SAVE_TENANT_SETTINGS_COMPLETE\";\r\nexport interface SaveTenantSettingsComplete extends CompleteAction {\r\n tenantSettings: TenantSettings | null;\r\n notificationSettings: TenantNotificationSettings | null;\r\n}\r\nexport const CreateSaveTenantSettingsCompleteAction = ActionCreator(SAVE_TENANT_SETTINGS_COMPLETE);\r\n\r\nexport const GET_LANGUAGE_TRANSLATION_COMPLETE = \"GET_LANGUAGE_TRANSLATION_COMPLETE\";\r\nexport interface GetLanguageTranslationComplete extends CompleteAction {\r\n translatedContent: TranslatableLanguage | null;\r\n}\r\nexport const CreateGetLanguageTranslationCompleteAction = ActionCreator(GET_LANGUAGE_TRANSLATION_COMPLETE);\r\n\r\nexport const SET_ACTIVE_TAG_GROUP = \"SET_ACTIVE_TAG_GROUP\";\r\nexport interface SetActiveTagGroup extends Action {\r\n id: string;\r\n}\r\nexport const CreateSetActiveTagGroupAction = ActionCreator(SET_ACTIVE_TAG_GROUP);\r\n\r\nexport const ADD_TAG_GROUP = \"ADD_TAG_GROUP\";\r\nexport interface AddTagGroup extends Action {\r\n tagGroup: TenantSettingsTagGroup;\r\n}\r\nexport const CreateAddTagGroupAction = ActionCreator(ADD_TAG_GROUP);\r\n\r\nexport const UPDATE_TAG_GROUP = \"UPDATE_TAG_GROUP\";\r\nexport interface UpdateTagGroup extends Action {\r\n id: string;\r\n name: string;\r\n disabled: boolean;\r\n deleted: boolean;\r\n}\r\nexport const CreateUpdateTagGroupAction = ActionCreator(UPDATE_TAG_GROUP);\r\n\r\nexport const ADD_TAG = \"ADD_TAG\";\r\nexport interface AddTag extends Action {\r\n tagGroupId: string;\r\n tag: TenantSettingsTag;\r\n}\r\nexport const CreateAddTagAction = ActionCreator(ADD_TAG);\r\n\r\nexport const UPDATE_TAG = \"UPDATE_TAG\";\r\nexport interface UpdateTag extends Action {\r\n id: string;\r\n disabled: boolean;\r\n deleted: boolean;\r\n name: string;\r\n mandatory: boolean;\r\n defaultValue: boolean;\r\n restricted: boolean;\r\n restrictedTo: string[];\r\n mandatoryFor: string[];\r\n defaultFor: string[];\r\n}\r\nexport const CreateUpdateTagAction = ActionCreator(UPDATE_TAG);\r\n\r\nexport const MOVE_TAG = \"MOVE_TAG\";\r\nexport interface MoveTag extends Action {\r\n tagId: string;\r\n tagGroupId: string;\r\n}\r\nexport const CreateMoveTagAction = ActionCreator(MOVE_TAG);\r\n\r\nexport const RESET_TENANT_SETTINGS_TO_PRISTINE = \"RESET_TENANT_SETTINGS_TO_PRISTINE\";\r\nexport interface ResetTenantSettingsToPristine extends Action {}\r\nexport const CreateResetTenantSettingsToPristineAction = ActionCreator(RESET_TENANT_SETTINGS_TO_PRISTINE);\r\n\r\nexport const THEME_SETTINGS_CHANGED = \"THEME_SETTINGS_CHANGED\";\r\nexport interface ThemeSettingsChanged extends Action {\r\n enabled: boolean;\r\n themeSettings?: ThemeSettings;\r\n}\r\nexport const CreateThemeSettingsChangedAction = ActionCreator(THEME_SETTINGS_CHANGED);\r\n\r\nexport const POST_BANNER_COLORS_CHANGED = \"POST_BANNER_COLORS_CHANGED\";\r\nexport interface PostBannerColorsChanged extends Action {\r\n option: number | string;\r\n color: string;\r\n}\r\nexport const CreateBannerColorOptionsChangedAction = ActionCreator(POST_BANNER_COLORS_CHANGED);\r\n\r\nexport const SPECIALTY_COLORS_CHANGED = \"SPECIALTY_COLORS_CHANGED\";\r\nexport interface SpecialtyColorsChanged extends Action {\r\n option: number | string;\r\n color: string;\r\n}\r\nexport const CreateSpecialtyColorOptionsChangedAction = ActionCreator(SPECIALTY_COLORS_CHANGED);\r\n\r\nexport const MOBILE_COLORS_CHANGED = \"MOBILE_COLORS_CHANGED\";\r\nexport interface MobileColorsChanged extends Action {\r\n option: number | string;\r\n color: string;\r\n}\r\nexport const CreateMobileColorOptionsChangedAction = ActionCreator(MOBILE_COLORS_CHANGED);\r\n\r\nexport const SET_ERROR_MESSAGE = \"SET_ERROR_MESSAGE\";\r\nexport interface SetErrorMessage extends Action {\r\n msg: string | null;\r\n}\r\nexport const SetErrorMessage = ActionCreator(SET_ERROR_MESSAGE);\r\n\r\nexport const SET_LANGUAGE_SETTINGS = \"SET_LANGUAGE_SETTINGS\";\r\nexport interface SetLanguageSettings extends Action {\r\n chosenLanguages?: string[];\r\n defaultLanguage?: string;\r\n}\r\nexport const SetLanguageSettings = ActionCreator(SET_LANGUAGE_SETTINGS);\r\n\r\nexport const SET_ACTIVE_LANGUAGE = \"SET_ACTIVE_LANGUAGE\";\r\nexport interface SetActiveLanguage extends Action {\r\n lcid: string;\r\n}\r\nexport const CreateSetActiveLanguageAction = ActionCreator(SET_ACTIVE_LANGUAGE);\r\n\r\nexport const SET_TIME_ZONE = \"SET_TIME_ZONE\";\r\nexport interface SetTimeZone extends Action {\r\n timeZone: string;\r\n}\r\nexport const CreateSetTimeZoneAction = ActionCreator(SET_TIME_ZONE);\r\n\r\nexport const SET_TRANSLATED_TEXT = \"SET_TRANSLATED_TEXT\";\r\nexport interface SetTranslatedText extends Action {\r\n key: string;\r\n text: string;\r\n lcid;\r\n}\r\nexport const SetTranslatedText = ActionCreator(SET_TRANSLATED_TEXT);\r\n\r\nexport const SET_SMS_BODY = \"SET_SMS_BODY\";\r\nexport interface SetSMSBody extends Action {\r\n event: string;\r\n content: lcidMappings;\r\n}\r\nexport const SetSMSBody = ActionCreator(SET_SMS_BODY);\r\n\r\nexport const SET_EMAIL_NAME = \"SET_EMAIL_NAME\";\r\nexport interface SetEmailName extends Action {\r\n name: string;\r\n}\r\nexport const SetEmailName = ActionCreator(SET_EMAIL_NAME);\r\n\r\nexport const TOGGLE_SHARE_URL = \"TOGGLE_SHARE_URL\";\r\nexport interface ToggleShareUrlUrl extends Action {\r\n shareToggleEvent: string\r\n enabled: boolean;\r\n}\r\n\r\nexport const CreateToggleShareUrlAction = ActionCreator(TOGGLE_SHARE_URL);\r\n\r\nexport const SET_SHARE_URL = \"SET_SHARE_URL\";\r\nexport interface SetShareUrl extends Action {\r\n shareEvent: string;\r\n url: string;\r\n}\r\n\r\nexport const SetShareUrlAction = ActionCreator(SET_SHARE_URL);\r\n\r\nexport const SET_SHARE_NAME = \"SET_SHARE_NAME\";\r\nexport interface SetShareName extends Action {\r\n shareEvent: string;\r\n name: string;\r\n}\r\nexport const SetShareNameAction = ActionCreator(SET_SHARE_NAME);\r\n\r\nexport const SET_EMAIL_SENDER = \"SET_EMAIL_SENDER\";\r\nexport interface SetEmailSender extends Action {\r\n name: string;\r\n domain: string;\r\n}\r\nexport const SetEmailSender = ActionCreator(SET_EMAIL_SENDER);\r\n\r\nexport const SET_EMAIL_SUBJECT = \"SET_EMAIL_SUBJECT\";\r\nexport interface SetEmailSubject extends Action {\r\n event: string;\r\n content: lcidMappings;\r\n}\r\nexport const SetEmailSubject = ActionCreator(SET_EMAIL_SUBJECT);\r\n\r\nexport const SET_MOBILE_CONTENT = \"SET_MOBILE_CONTENT\";\r\nexport interface SetMobileContent extends Action {\r\n event: string;\r\n content: lcidMappings;\r\n}\r\nexport const SetMobileContent = ActionCreator(SET_MOBILE_CONTENT);\r\n\r\nexport const SET_FLAGGING_NOTIFICATION_WAIT = \"SET_FLAGGING_NOTIFICATION_WAIT\";\r\nexport interface SetFlaggingNotificationWait extends Action {\r\n value: number;\r\n}\r\nexport const SetFlaggingNotificationWait = ActionCreator(SET_FLAGGING_NOTIFICATION_WAIT);\r\n\r\nexport const SET_MANDATORY_EXPIRY_TIME = \"SET_MANDATORY_EXPIRY_TIME\";\r\nexport interface SetMandatoryExpiryTime extends Action {\r\n days: number;\r\n}\r\nexport const SetMandatoryExpiryTime = ActionCreator(SET_MANDATORY_EXPIRY_TIME);\r\n\r\nexport const SET_EXTERNAL_POST_PURGE_IN_DAYS = \"SET_EXTERNAL_POST_PURGE_IN_DAYS\"\r\nexport interface SetExternalPostPurgeInDays extends Action {\r\n days: number;\r\n}\r\nexport const SetExternalPostPurgeInDays = ActionCreator(SET_EXTERNAL_POST_PURGE_IN_DAYS);\r\n\r\nexport const TOGGLE_MANDATORY_EXPIRY_TIME = \"TOGGLE_MANDATORY_EXPIRY_TIME\";\r\nexport interface ToggleMandatoryExpiryTime extends Action {}\r\nexport const ToggleMandatoryExpiryTime = ActionCreator(TOGGLE_MANDATORY_EXPIRY_TIME);\r\n\r\nexport const SET_SUPPORT_EMAIL = \"SET_SUPPORT_EMAIL\";\r\nexport interface SetSupportEmail extends Action {\r\n email: string;\r\n}\r\nexport const SetSupportEmail = ActionCreator(SET_SUPPORT_EMAIL);\r\n\r\nexport const SET_SURVEYS_ENABLED = \"SET_SURVEYS_ENABLED\";\r\nexport interface SetSurveysEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const SetSurveysEnabled = ActionCreator(SET_SURVEYS_ENABLED);\r\n\r\nexport const SET_CHAT_ENABLED = \"SET_CHAT_ENABLED\";\r\nexport interface SetChatEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const SetChatEnabled = ActionCreator(SET_CHAT_ENABLED);\r\n\r\nexport const SET_DOCUMENTS_ENABLED = \"SET_DOCUMENTS_ENABLED\";\r\nexport interface SetDocumentsEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const SetDocumentsEnabled = ActionCreator(SET_DOCUMENTS_ENABLED);\r\n\r\nexport const SET_MOBILE_EVENTS_ENABLED = \"SET_MOBILE_EVENTS_ENABLED\";\r\nexport interface SetMobileEventsEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const SetMobileEventsEnabled = ActionCreator(SET_MOBILE_EVENTS_ENABLED);\r\n\r\nexport const SET_RESTRICTED_BANNER_ENABLED = \"SET_RESTRICTED_BANNER_ENABLED\";\r\nexport interface SetRestrictedBannerEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const SetRestrictedBannerEnabled = ActionCreator(SET_RESTRICTED_BANNER_ENABLED);\r\n\r\nexport const SET_MOBILE_PUBLISHING_ENABLED = \"SET_MOBILE_PUBLISHING_ENABLED\";\r\nexport interface SetMobilePublishingEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const SetMobilePublishingEnabled = ActionCreator(SET_MOBILE_PUBLISHING_ENABLED);\r\n\r\nexport const SET_PORTAL_PAGES_ENABLED = \"SET_PORTAL_PAGES_ENABLED\";\r\nexport interface SetPortalPagesEnabled extends Action {\r\n enabled: boolean;\r\n}\r\nexport const SetPortalPagesEnabled = ActionCreator(SET_PORTAL_PAGES_ENABLED);\r\n\r\nexport const SET_LOCAL_PASSWORD_RESET_ENABLED = \"SET_LOCAL_PASSWORD_RESET_ENABLED\";\r\nexport interface SetResetLocalUserPasswordAction extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateSetResetLocalUserPasswordAction = ActionCreator(SET_LOCAL_PASSWORD_RESET_ENABLED);\r\n\r\nexport const REMOVE_NEW_TAG = \"REMOVE_NEW_TAG\";\r\nexport interface RemoveNewTag extends Action {\r\n groupId: string;\r\n}\r\nexport const RemoveNewTagAction = ActionCreator(REMOVE_NEW_TAG);\r\n\r\nexport const ADD_EXTERNAL_POST_SOURCE_INIT = \"ADD_EXTERNAL_POST_SOURCE_INIT\";\r\nexport interface AddExternalPostSourceInit extends Action {}\r\nexport const AddExternalPostSourceInitAction = ActionCreator(ADD_EXTERNAL_POST_SOURCE_INIT);\r\n\r\nexport const ADD_EXTERNAL_POST_SOURCE_COMPLETE = \"ADD_EXTERNAL_POST_SOURCE_COMPLETE\";\r\nexport interface AddExternalPostSourceComplete extends Action {\r\n source: ExternalPostSource;\r\n succeeded: boolean;\r\n}\r\nexport const AddExternalPostSourceCompleteAction = ActionCreator(ADD_EXTERNAL_POST_SOURCE_COMPLETE);\r\n\r\nexport const UPDATE_EXTERNAL_POST_SOURCE_INIT = \"UPDATE_EXTERNAL_POST_SOURCE_INIT\";\r\nexport interface UpdateExternalPostSourceInit extends Action {}\r\nexport const UpdateExternalPostSourceInitAction = ActionCreator(UPDATE_EXTERNAL_POST_SOURCE_INIT);\r\n\r\nexport const UPDATE_EXTERNAL_POST_SOURCE_COMPLETE = \"UPDATE_EXTERNAL_POST_SOURCE_COMPLETE\";\r\nexport interface UpdateExternalPostSourceComplete extends Action {\r\n source: ExternalPostSource;\r\n succeeded: boolean;\r\n}\r\nexport const UpdateExternalPostSourceCompleteAction = ActionCreator(UPDATE_EXTERNAL_POST_SOURCE_COMPLETE);\r\n\r\nexport const DELETE_EXTERNAL_POST_SOURCE_INIT = \"DELETE_EXTERNAL_POST_SOURCE_INIT\";\r\nexport interface DeleteExternalPostSourceInit extends Action {}\r\nexport const DeleteExternalPostSourceInitAction = ActionCreator(DELETE_EXTERNAL_POST_SOURCE_INIT);\r\n\r\nexport const DELETE_EXTERNAL_POST_SOURCE_COMPLETE = \"DELETE_EXTERNAL_POST_SOURCE_COMPLETE\";\r\nexport interface DeleteExternalPostSourceComplete extends Action {\r\n sourceId: string;\r\n succeeded: boolean;\r\n}\r\nexport const DeleteExternalPostSourceCompleteAction = ActionCreator(DELETE_EXTERNAL_POST_SOURCE_COMPLETE);\r\n\r\nexport const SET_EXTERNAL_POST_SOURCE_ENABLED = \"SET_EXTERNAL_POST_SOURCE_ENABLED\";\r\nexport interface SetExternalPostSourceEnabled extends Action {\r\n sourceId: string;\r\n enabled: boolean;\r\n}\r\nexport const SetExternalPostSourceEnabledAction = ActionCreator(SET_EXTERNAL_POST_SOURCE_ENABLED);\r\n\r\nexport const TOGGLE_NOTIFICATION_EVENT_ACTION = \"TOGGLE_NOTIFICATION_EVENT_ACTION\";\r\nexport interface ToggleNotificationEventAction extends Action {\r\n teamsEvent: string\r\n mobileEvent: string\r\n emailEvent: string\r\n smsEvent: string\r\n}\r\nexport const CreateToggleNotificationEventAction = ActionCreator(TOGGLE_NOTIFICATION_EVENT_ACTION);\r\n\r\nexport const SET_APPLY_BLACKOUT_PERIOD = \"SET_APPLY_BLACKOUT_PERIOD\";\r\nexport interface ApplyBlackoutPeriodAction extends Action {\r\n teamsEvent: string\r\n mobileEvent: string\r\n emailEvent: string\r\n smsEvent: string\r\n checked: boolean\r\n}\r\nexport const CreateApplyBlackoutPeriodAction = ActionCreator(SET_APPLY_BLACKOUT_PERIOD);\r\n\r\nexport const SET_ON_PUBLISH = \"SET_ON_PUBLISH\";\r\nexport interface SetOnPublishAction extends Action {\r\n location: string\r\n platform: string\r\n value: string\r\n}\r\nexport const CreateSetOnPublishAction = ActionCreator(SET_ON_PUBLISH)\r\n\r\nexport const SET_ALL_ON_PUBLISH = \"SET_ALL_ON_PUBLISH\";\r\nexport interface SetAllOnPublishAction extends Action {\r\n location: string\r\n value: string\r\n}\r\nexport const CreateSetAllOnPublishAction = ActionCreator(SET_ALL_ON_PUBLISH)\r\n\r\nexport const SET_REMINDERS = \"SET_REMINDERS\";\r\nexport interface SetRemindersAction extends Action {\r\n reminders: reminderData[]\r\n location: string\r\n}\r\nexport const CreateSetRemindersAction = ActionCreator(SET_REMINDERS)\r\n\r\nexport const SET_ENABLE_ALL_CHANNELS = \"SET_ENABLE_ALL_CHANNELS\";\r\nexport interface EnableAllChannelsAction extends Action {\r\n teamsEvent: string;\r\n mobileEvent: string;\r\n emailEvent: string;\r\n smsEvent: string;\r\n}\r\nexport const CreateEnableAllChannelsAction = ActionCreator(SET_ENABLE_ALL_CHANNELS);\r\n\r\nexport const SET_ENABLE_SELECTED_CHANNELS = \"SET_ENABLE_SELECTED_CHANNELS\";\r\nexport interface EnableSelectedChannelsAction extends Action {\r\n notificationEvent: string\r\n checked: boolean\r\n}\r\nexport const CreateEnableSelectedChannelsAction = ActionCreator(SET_ENABLE_SELECTED_CHANNELS);\r\n\r\nexport const SET_APPLY_BLACKOUT_PERIOD_FOR_SMS = \"SET_APPLY_BLACKOUT_PERIOD_FOR_SMS\";\r\nexport interface ApplyBlackoutPeriodForSMSAction extends Action {\r\n notificationEvent: string\r\n}\r\nexport const CreateApplyBlackoutPeriodForSMSAction = ActionCreator(SET_APPLY_BLACKOUT_PERIOD_FOR_SMS);\r\n\r\nexport const SET_ENABLE_SEND_EMAIL_NOTIFICATION = \"SET_ENABLE_SEND_EMAIL_NOTIFICATION\";\r\nexport interface SendEmailNotificationAction extends Action {\r\n checked: boolean\r\n notificationEvent: string\r\n}\r\nexport const CreateSendEmailNotificationAction = ActionCreator(SET_ENABLE_SEND_EMAIL_NOTIFICATION);\r\n\r\nexport const SET_ENABLE_SEND_SMS_NOTIFICATION = \"SET_ENABLE_SEND_SMS_NOTIFICATION\";\r\nexport interface SendSMSNotificationAction extends Action {\r\n checked: boolean\r\n notificationEvent: string\r\n}\r\nexport const CreateSendSMSNotificationAction = ActionCreator(SET_ENABLE_SEND_SMS_NOTIFICATION);\r\n\r\nexport const SET_DEFAULT_BLACKOUT_FOR_EMAIL = \"SET_DEFAULT_BLACKOUT_FOR_EMAIL\";\r\nexport interface SetDefaultBlackoutForEmail extends Action {\r\n hours: number,\r\n days: boolean\r\n}\r\nexport const CreateSetDefaultBlackoutForEmailAction = ActionCreator(SET_DEFAULT_BLACKOUT_FOR_EMAIL);\r\n\r\nexport const SET_DEFAULT_BLACKOUT_FOR_SMS = \"SET_DEFAULT_BLACKOUT_FOR_SMS\";\r\nexport interface SetDefaultBlackoutForSMS extends Action {\r\n hours: number,\r\n days: boolean\r\n}\r\nexport const CreateSetDefaultBlackoutForSMSAction = ActionCreator(SET_DEFAULT_BLACKOUT_FOR_SMS);\r\n\r\nexport const SET_DEFAULT_BLACKOUT_FOR_TEAMS = \"SET_DEFAULT_BLACKOUT_FOR_TEAMS\";\r\nexport interface SetDefaultBlackoutForTeams extends Action {\r\n hours: number,\r\n days: boolean\r\n}\r\nexport const CreateSetDefaultBlackoutForTeamsAction = ActionCreator(SET_DEFAULT_BLACKOUT_FOR_TEAMS);\r\n\r\nexport const SET_DEFAULT_BLACKOUT_FOR_MOBILE = \"SET_DEFAULT_BLACKOUT_FOR_MOBILE\";\r\nexport interface SetDefaultBlackoutForMobile extends Action {\r\n hours: number,\r\n days: boolean\r\n}\r\nexport const CreateSetDefaultBlackoutForMobileAction = ActionCreator(SET_DEFAULT_BLACKOUT_FOR_MOBILE);\r\n\r\nexport const SET_LINK_PREFERENCE = \"SET_LINK_PREFERENCE\";\r\nexport interface SetLinkPreference extends Action {\r\n linkPreference: string\r\n}\r\nexport const CreateSetLinkPreference = ActionCreator(SET_LINK_PREFERENCE);\r\n\r\nexport const SET_DEFAULT_REMINDER_FOR_POSTS = \"SET_DEFAULT_REMINDER_FOR_POSTS\";\r\nexport interface SetDefaultReminderForPosts extends Action {\r\n hours: number,\r\n days: boolean\r\n}\r\nexport const CreateSetDefaultReminderForPostsAction = ActionCreator(SET_DEFAULT_REMINDER_FOR_POSTS);\r\n\r\nexport const SET_DEFAULT_REMINDERS_FOR_EVENTS = \"SET_DEFAULT_REMINDERS_FOR_EVENTS\";\r\nexport interface SetDefaultReminderForEvents extends Action {\r\n hours: number\r\n days: boolean\r\n}\r\nexport const CreateSetDefaultReminderForEventsAction = ActionCreator(SET_DEFAULT_REMINDERS_FOR_EVENTS);\r\n\r\nexport const SET_CONTRIBUTORS_CAN_TOGGLE_COMMENTS_CHANGED = \"SET_CONTRIBUTORS_CAN_TOGGLE_COMMENTS_CHANGED\";\r\nexport const SET_CONTRIBUTORS_CAN_TOGGLE_REACTIONS_CHANGED = \"SET_CONTRIBUTORS_CAN_TOGGLE_REACTIONS_CHANGED\";\r\nexport interface CanContributorsToggle extends Action {\r\n enabled: boolean;\r\n}\r\nexport const CreateCanContributorsToggleCommentsAction = ActionCreator(SET_CONTRIBUTORS_CAN_TOGGLE_COMMENTS_CHANGED);\r\n\r\nexport const CreateCanContributorsToggleReactionsAction = ActionCreator(SET_CONTRIBUTORS_CAN_TOGGLE_REACTIONS_CHANGED);\r\nexport const SET_POST_SMART_CONTENT_ENABLED_BY_TENANT = \"SET_POST_SMART_CONTENT_ENABLED_BY_TENANT\";\r\nexport interface SetPostSmartContentEnabledByTenant extends Action {\r\n enabled: boolean;\r\n}\r\nexport const SetPostSmartContentEnabledByTenant = ActionCreator(SET_POST_SMART_CONTENT_ENABLED_BY_TENANT);\r\n\r\nexport const SET_SHORTCUTS_ENABLED_BY_TENANT = \"SET_SHORTCUTS_ENABLED_BY_TENANT\";\r\nexport interface SetShortcutsEnabledByTenant extends Action {\r\n enabled: boolean;\r\n}\r\nexport const SetShortcutsEnabledByTenant = ActionCreator(SET_SHORTCUTS_ENABLED_BY_TENANT);\r\n","import { Action } from \"redux\";\r\nimport * as Actions from \"./actions\";\r\nimport { DocumentFeed, DocumentFeedFilters, DocumentsListingPage, DocumentsState } from \"./models\";\r\n\r\nexport const defaultDocumentFeed: DocumentFeed = {\r\n currentPage: 0,\r\n documents: [],\r\n totalDocuments: 0,\r\n totalPages: 0\r\n};\r\n\r\nexport const defaultDocumentFeedFilters: DocumentFeedFilters = {\r\n availabilities: [],\r\n lcids: [],\r\n sort: \"titleAscending\",\r\n tags: [],\r\n textToSearch: \"\",\r\n view: \"all\"\r\n};\r\n\r\nexport const defaultListingPage: DocumentsListingPage = {\r\n id: \"\",\r\n currentPage: 0,\r\n documents: [],\r\n totalDocuments: 0,\r\n totalPages: 0,\r\n isFetching: false\r\n};\r\n\r\nconst defaultState: DocumentsState = {\r\n all: { ...defaultListingPage, id: \"all\" },\r\n enabled: { ...defaultListingPage, id: \"enabled\" },\r\n disabled: { ...defaultListingPage, id: \"disabled\" },\r\n scheduled: { ...defaultListingPage, id: \"scheduled\" },\r\n documentFeed: {\r\n documentFeed: { ...defaultDocumentFeed },\r\n filters: { ...defaultDocumentFeedFilters },\r\n filtersApplied: false,\r\n isFetching: false,\r\n layout: \"list\",\r\n showFilters: false,\r\n shouldFetch: true\r\n },\r\n editableDocument: undefined,\r\n preview: undefined,\r\n changedSinceSaved: false,\r\n errorMessage: \"\",\r\n isDeleting: false,\r\n isFetching: false,\r\n isInitialLoad: true,\r\n isSaving: false,\r\n isUploading: false,\r\n shouldFetch: false,\r\n shouldUpdateDraft: false,\r\n showEditor: false,\r\n showPreview: false,\r\n successMessage: \"\"\r\n};\r\n\r\nconst actionHandler: { [actionType: string]: (state: DocumentsState, action: any) => DocumentsState } = {\r\n\r\n [Actions.GET_ATTACHED_ARTICLES]: (state: DocumentsState, action: Actions.GetAttachedArticles) => {\r\n return {\r\n ...state,\r\n isFetching: true\r\n };\r\n },\r\n\r\n [Actions.GET_ATTACHED_ARTICLES_COMPLETE]: (state: DocumentsState, action: Actions.GetAttachedArticlesComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to check where document is used as an attachment\",\r\n isFetching: false\r\n };\r\n },\r\n \r\n [Actions.GET_DOCUMENT_FEED]: (state: DocumentsState, action: Actions.GetDocumentFeed) => {\r\n return {\r\n ...state,\r\n documentFeed: {\r\n ...state.documentFeed,\r\n filters: action.filters,\r\n filtersApplied: !!action.hasFiltersApplied,\r\n isFetching: true,\r\n shouldFetch: false\r\n }\r\n };\r\n },\r\n\r\n [Actions.GET_DOCUMENT_FEED_COMPLETE]: (state: DocumentsState, action: Actions.GetDocumentFeedComplete) => {\r\n return {\r\n ...state,\r\n documentFeed: {\r\n ...state.documentFeed,\r\n documentFeed: {\r\n ...action.documentFeed,\r\n documents: state.documentFeed.documentFeed.documents.concat(action.documentFeed.documents)\r\n },\r\n isFetching: false,\r\n shouldFetch: !action.succeeded\r\n }\r\n };\r\n },\r\n\r\n [Actions.GET_DOCUMENT_DETAILS]: (state: DocumentsState, action: Actions.GetDocumentDetails) => {\r\n return {\r\n ...state,\r\n isFetching: true\r\n };\r\n },\r\n\r\n [Actions.GET_DOCUMENT_DETAILS_COMPLETE]: (state: DocumentsState, action: Actions.GetDocumentDetailsComplete) => {\r\n return {\r\n ...state,\r\n isFetching: false\r\n };\r\n },\r\n\r\n [Actions.GET_DOCUMENTS]: (state: DocumentsState, action: Actions.GetDocuments) => {\r\n return {\r\n ...state,\r\n all: {\r\n ...state.all,\r\n isFetching: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.GET_DOCUMENTS_COMPLETE]: (state: DocumentsState, action: Actions.GetDocumentsComplete) => {\r\n return {\r\n ...state,\r\n all: {\r\n ...state.all,\r\n ...action.page,\r\n isFetching: false\r\n },\r\n isInitialLoad: false\r\n };\r\n },\r\n\r\n [Actions.GET_DISABLED_DOCUMENTS]: (state: DocumentsState, action: Actions.GetDisabledDocuments) => {\r\n return {\r\n ...state,\r\n disabled: {\r\n ...state.disabled,\r\n isFetching: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.GET_DISABLED_DOCUMENTS_COMPLETE]: (state: DocumentsState, action: Actions.GetDisabledDocumentsComplete) => {\r\n return {\r\n ...state,\r\n disabled: {\r\n ...state.disabled,\r\n ...action.page,\r\n isFetching: false\r\n },\r\n isInitialLoad: false\r\n };\r\n },\r\n\r\n [Actions.GET_ENABLED_DOCUMENTS]: (state: DocumentsState, action: Actions.GetEnabledDocuments) => {\r\n return {\r\n ...state,\r\n enabled: {\r\n ...state.enabled,\r\n isFetching: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.GET_ENABLED_DOCUMENTS_COMPLETE]: (state: DocumentsState, action: Actions.GetEnabledDocumentsComplete) => {\r\n return {\r\n ...state,\r\n enabled: {\r\n ...state.enabled,\r\n ...action.page,\r\n isFetching: false\r\n },\r\n isInitialLoad: false\r\n };\r\n },\r\n\r\n [Actions.GET_SCHEDULED_DOCUMENTS]: (state: DocumentsState, action: Actions.GetScheduledDocuments) => {\r\n return {\r\n ...state,\r\n scheduled: {\r\n ...state.scheduled,\r\n isFetching: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.GET_SCHEDULED_DOCUMENTS_COMPLETE]: (state: DocumentsState, action: Actions.GetScheduledDocumentsComplete) => {\r\n return {\r\n ...state,\r\n scheduled: {\r\n ...state.scheduled,\r\n ...action.page,\r\n isFetching: false\r\n },\r\n isInitialLoad: false\r\n };\r\n },\r\n\r\n\r\n [Actions.HIDE_DOCUMENT_FEED_FILTERS]: (state: DocumentsState, action: Actions.HideDocumentFeedFilters) => {\r\n return {\r\n ...state,\r\n documentFeed: {\r\n ...state.documentFeed,\r\n showFilters: false\r\n }\r\n };\r\n },\r\n\r\n [Actions.HIDE_EDITOR]: (state: DocumentsState, action: Actions.HideEditor) => {\r\n return {\r\n ...state,\r\n changedSinceSaved: false,\r\n showEditor: false\r\n };\r\n },\r\n\r\n [Actions.HIDE_PREVIEW]: (state: DocumentsState, action: Actions.HidePreview) => {\r\n return {\r\n ...state,\r\n preview: undefined,\r\n showPreview: false\r\n };\r\n },\r\n\r\n [Actions.SHOW_DOCUMENT_FEED_FILTERS]: (state: DocumentsState, action: Actions.ShowDocumentFeedFilters) => {\r\n return {\r\n ...state,\r\n documentFeed: {\r\n ...state.documentFeed,\r\n showFilters: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.SHOW_EDITOR]: (state: DocumentsState, action: Actions.ShowEditor) => {\r\n return {\r\n ...state,\r\n changedSinceSaved: false,\r\n editableDocument: action.document,\r\n showEditor: true\r\n };\r\n },\r\n\r\n [Actions.SHOW_PREVIEW]: (state: DocumentsState, action: Actions.ShowPreview) => {\r\n return {\r\n ...state,\r\n preview: action.document,\r\n showPreview: true\r\n };\r\n },\r\n\r\n\r\n [Actions.SET_DOCUMENT_FEED_FILTERS]: (state: DocumentsState, action: Actions.SetDocumentFeedFilters) => {\r\n return {\r\n ...state,\r\n documentFeed: {\r\n ...state.documentFeed,\r\n filters: action.filters\r\n }\r\n };\r\n },\r\n\r\n [Actions.SET_DOCUMENT_FEED_LAYOUT]: (state: DocumentsState, action: Actions.SetDocumentFeedLayout) => {\r\n return {\r\n ...state,\r\n documentFeed: {\r\n ...state.documentFeed,\r\n layout: action.layout\r\n }\r\n };\r\n },\r\n\r\n \r\n [Actions.DELETE_DOCUMENT]: (state: DocumentsState, action: Actions.DeleteDocument) => {\r\n return {\r\n ...state,\r\n isDeleting: true\r\n };\r\n },\r\n \r\n [Actions.DELETE_DOCUMENT_COMPLETE]: (state: DocumentsState, action: Actions.DeleteDocumentComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to delete document\",\r\n isDeleting: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.DELETE_DOCUMENTS]: (state: DocumentsState, action: Actions.DeleteDocuments) => {\r\n return {\r\n ...state,\r\n isDeleting: true\r\n };\r\n },\r\n\r\n [Actions.DELETE_DOCUMENTS_COMPLETE]: (state: DocumentsState, action: Actions.DeleteDocumentsComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to delete document(s)\",\r\n isDeleting: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.DISABLE_DOCUMENT]: (state: DocumentsState, action: Actions.DisableDocument) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.DISABLE_DOCUMENT_COMPLETE]: (state: DocumentsState, action: Actions.DisableDocumentComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to disable document\",\r\n isSaving: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.ENABLE_DOCUMENT]: (state: DocumentsState, action: Actions.EnableDocument) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.ENABLE_DOCUMENT_COMPLETE]: (state: DocumentsState, action: Actions.EnableDocumentComplete) => {\r\n return {\r\n ...state,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to enable document\",\r\n isSaving: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n \r\n [Actions.REPLACE_FILE]: (state: DocumentsState, action: Actions.ReplaceFile) => {\r\n return {\r\n ...state,\r\n isUploading: true\r\n };\r\n },\r\n\r\n [Actions.REPLACE_FILE_COMPLETE]: (state: DocumentsState, action: Actions.ReplaceFileComplete) => {\r\n return {\r\n ...state,\r\n editableDocument: !!action.document ? action.document : state.editableDocument,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to replace file\",\r\n isUploading: false,\r\n successMessage: action.succeeded ? \"Success! The file has been replaced.\" : \"\"\r\n };\r\n },\r\n\r\n [Actions.UPDATE_DOCUMENT_FEED]: (state: DocumentsState, action: Actions.UpdateDocumentFeed) => {\r\n return {\r\n ...state,\r\n documentFeed: {\r\n ...state.documentFeed,\r\n documentFeed: {\r\n ...state.documentFeed.documentFeed,\r\n documents: action.documentFeed\r\n }\r\n }\r\n };\r\n },\r\n\r\n [Actions.UPDATE_DOCUMENT_PROPERTIES]: (state: DocumentsState, action: Actions.UpdateDocumentProperties) => {\r\n return {\r\n ...state,\r\n isSaving: true\r\n };\r\n },\r\n\r\n [Actions.UPDATE_DOCUMENT_PROPERTIES_COMPLETE]: (state: DocumentsState, action: Actions.UpdateDocumentPropertiesComplete) => {\r\n return {\r\n ...state,\r\n changedSinceSaved: !action.succeeded,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to update properties\",\r\n isSaving: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n [Actions.UPLOAD_FILE]: (state: DocumentsState, action: Actions.UploadFile) => {\r\n return {\r\n ...state,\r\n isUploading: true\r\n };\r\n },\r\n\r\n [Actions.UPLOAD_FILE_COMPLETE]: (state: DocumentsState, action: Actions.UploadFileComplete) => {\r\n return {\r\n ...state,\r\n changedSinceSaved: action.succeeded,\r\n errorMessage: action.succeeded ? \"\" : \"Unable to upload file\",\r\n isUploading: false,\r\n shouldFetch: action.succeeded\r\n };\r\n },\r\n\r\n\r\n [Actions.CHANGED_SINCE_SAVED]: (state: DocumentsState, action: Actions.ChangedSinceSaved) => {\r\n return {\r\n ...state,\r\n changedSinceSaved: true\r\n };\r\n },\r\n\r\n [Actions.CLEAR_CHANGED_SINCE_SAVED]: (state: DocumentsState, action: Actions.ChangedSinceSaved) => {\r\n return {\r\n ...state,\r\n changedSinceSaved: false\r\n };\r\n },\r\n\r\n [Actions.CLEAR_DOCUMENT_FEED]: (state: DocumentsState, action: Actions.ClearDocumentFeed) => {\r\n return {\r\n ...state,\r\n documentFeed: {\r\n ...state.documentFeed,\r\n documentFeed: { ...defaultDocumentFeed },\r\n shouldFetch: true\r\n }\r\n };\r\n },\r\n\r\n [Actions.CLEAR_DOCUMENT_FEED_FILTERS]: (state: DocumentsState, action: Actions.ClearDocumentFeedFilters) => {\r\n return {\r\n ...state,\r\n documentFeed: {\r\n ...state.documentFeed,\r\n filters: { ...defaultDocumentFeedFilters},\r\n filtersApplied: false,\r\n showFilters: false\r\n }\r\n };\r\n },\r\n\r\n [Actions.CLEAR_ERROR_MESSAGE]: (state: DocumentsState, action: Actions.ClearErrorMessage) => {\r\n return {\r\n ...state,\r\n errorMessage: \"\"\r\n };\r\n },\r\n\r\n [Actions.CLEAR_SHOULD_FETCH]: (state: DocumentsState, action: Actions.ClearShouldFetch) => {\r\n return {\r\n ...state,\r\n shouldFetch: false\r\n };\r\n },\r\n\r\n [Actions.CLEAR_SHOW_PUBLISH_SUCCESS]: (state: DocumentsState, action: Actions.ClearShowPublishSuccess) => {\r\n return {\r\n ...state,\r\n showPublishSuccess: false\r\n };\r\n },\r\n\r\n [Actions.CLEAR_SUCCESS_MESSAGE]: (state: DocumentsState, action: Actions.ClearSuccessMessage) => {\r\n return {\r\n ...state,\r\n successMessage: \"\"\r\n };\r\n }\r\n\r\n}\r\n\r\nexport const reducer = (state: DocumentsState, action: Action) => {\r\n const actionHandlerMethod = actionHandler[action.type];\r\n if (actionHandlerMethod) {\r\n return actionHandlerMethod(state, action);\r\n }\r\n return state || defaultState;\r\n};\r\n","import { Action } from \"redux\";\r\nimport { ActionCreator } from \"typedActions\";\r\n\r\nexport const SET_LCID_MAPPINGS = \"SET_LCID_MAPPINGS\";\r\nexport interface SetLcidMappings extends Action { mappings: any }\r\nexport const SetLcidMappings = ActionCreator(SET_LCID_MAPPINGS);\r\n\r\nexport const SET_EMAIL_RESOURCE = \"SET_EMAIL_RESOURCE\";\r\nexport interface SetEmailResource extends Action { resource: any}\r\nexport const SetEmailResource = ActionCreator(SET_EMAIL_RESOURCE)\r\n\r\nexport const SET_SMS_RESOURCE = \"SET_SMS_RESOURCE\";\r\nexport interface SetSmsResource extends Action { resource: any}\r\nexport const SetSmsResource = ActionCreator(SET_SMS_RESOURCE)\r\n\r\nexport const SET_MOBILE_RESOURCE = \"SET_MOBILE_RESOURCE\";\r\nexport interface SetMobileResource extends Action { resource: any}\r\nexport const SetMobileResource = ActionCreator(SET_MOBILE_RESOURCE)","import moment from \"moment\";\r\n\r\nimport { ValidationChecks } from \"modules/common/components/authoring/models\";\r\nimport { Post } from \"../../models\";\r\nimport isValidEmail from \"utils/isValidEmail\";\r\n\r\nexport const isValid = (validationChecks: ValidationChecks): boolean => {\r\n const invalidChecks = validationChecks.checks.filter((check) => {\r\n if (check.skip)\r\n return false;\r\n return !check.isValid;\r\n });\r\n return !invalidChecks.length;\r\n};\r\n\r\nexport const getValidationChecks = (post: Partial): ValidationChecks => {\r\n const validation: ValidationChecks = {\r\n checks: [\r\n { key: \"image\", description: \"Set a hero banner image\", isValid: isImageValid(post), link: \"#image\" },\r\n { key: \"title\", description: \"Create a title for each selected language\", isValid: isTitleValid(post), link: \"#title\" },\r\n { key: \"body\", description: \"Create body content for each selected language\", isValid: isBodyValid(post), link: \"#body\" },\r\n { key: \"tags\", description: \"Select topics to categorize news\", isValid: isTagsValid(post), link: \"#tags\" },\r\n { key: \"email\", description: \"Enter a name and valid email address in Published by\", isValid: isPostEmailValid(post) && isAuthorValid(post), link: \"#email\", skip: isAuthorValid(post) && isPostEmailValid(post) },\r\n { key: \"breakingTime\", description: \"Set the breaking news duration\", isValid: isBreakingTimeValid(post), link: \"#breaking-time\", skip: !post.breakingTime },\r\n { key: \"featuredTime\", description: \"Set the featured news duration\", isValid: isFeaturedTimeValid(post), link: \"#featured-time\", skip: !post.featuredTime },\r\n { key: \"expiryTime\", description: \"The expiry date must be set after the publish date\", isValid: isExpiryTimeValid(post), link: \"#expiry-date\", skip: !post.expiryTime },\r\n ]\r\n };\r\n\r\n return validation;\r\n}\r\n\r\nconst isAuthorValid = (post: Partial): boolean => {\r\n return !!post.author;\r\n}\r\n\r\nexport const isPostEmailValid = (post: Partial): boolean => {\r\n return isValidEmail(post.authorEmail || \"\");\r\n}\r\n\r\nconst isBodyValid = (post: Partial): boolean => {\r\n if (!post.translatedContent) {\r\n return false;\r\n }\r\n\r\n const invalid = !!Object.keys(post.translatedContent).filter((lcid) => {\r\n const body = post.translatedContent![lcid].body;\r\n return !body || !body.trim().length;\r\n }).length;\r\n return !invalid;\r\n}\r\n\r\nconst isBreakingTimeValid = (post: Partial): boolean => {\r\n const { breakingTime, expiryTime, publishTime } = post;\r\n\r\n if (!breakingTime)\r\n return true;\r\n\r\n if (!publishTime) {\r\n if (moment(breakingTime) < moment())\r\n return false;\r\n }\r\n\r\n if (!!publishTime) {\r\n if (moment(breakingTime) < moment(publishTime))\r\n return false;\r\n }\r\n\r\n if (!!expiryTime && moment(breakingTime) > moment(expiryTime))\r\n return false;\r\n\r\n return true;\r\n}\r\n\r\nconst isExpiryTimeValid = (post: Partial): boolean => {\r\n const { expiryTime, publishTime } = post;\r\n\r\n if (!expiryTime)\r\n return true;\r\n\r\n if (!publishTime && moment(expiryTime) < moment())\r\n return false;\r\n if (!!publishTime && moment(expiryTime) < moment(publishTime))\r\n return false;\r\n\r\n return true;\r\n}\r\n\r\nconst isFeaturedTimeValid = (post: Partial): boolean => {\r\n const { expiryTime, featuredTime, publishTime } = post;\r\n\r\n if (!featuredTime)\r\n return true;\r\n\r\n if (!publishTime) {\r\n if (moment(featuredTime) < moment())\r\n return false;\r\n if (moment(featuredTime) > moment().add(14, \"days\"))\r\n return false;\r\n }\r\n\r\n if (!!publishTime) {\r\n if (moment(featuredTime) < moment(publishTime))\r\n return false;\r\n if (moment(publishTime) < moment() && moment(featuredTime) > moment().add(14, \"days\"))\r\n return false;\r\n if (moment(publishTime) >= moment() && moment(featuredTime) > moment(publishTime).add(14, \"days\"))\r\n return false;\r\n }\r\n\r\n if (!!expiryTime && moment(featuredTime) > moment(expiryTime))\r\n return false;\r\n\r\n return true;\r\n}\r\n\r\nconst isImageValid = (post: Partial): boolean => {\r\n return !!post.image && !!post.image.id;\r\n}\r\n\r\nconst isTagsValid = (post: Partial): boolean => {\r\n return !!post.tags && !!post.tags.length;\r\n}\r\n\r\nconst isTitleValid = (post: Partial): boolean => {\r\n if (!post.translatedContent) {\r\n return false;\r\n }\r\n\r\n const invalid = !!Object.keys(post.translatedContent).filter((lcid) => {\r\n const title = post.translatedContent![lcid].title;\r\n return !title || !title.trim().length;\r\n }).length;\r\n return !invalid;\r\n}\r\n","import * as React from 'react';\r\nimport { GlobalApplicationState } from \"globalApplicationState\";\r\nimport { ConnectedProps, connect } from \"react-redux\";\r\nimport ToggleSwitch from 'modules/common/components/toggleSwitch';\r\nimport * as actions from '../actionCreator';\r\nimport DeleteIcon from '@mui/icons-material/Delete';\r\nimport Select from \"react-select\";\r\n\r\ninterface ComponentProps { \r\n defaultName: string\r\n notificationName: string\r\n}\r\n\r\nexport interface reminderForInsertion {\r\n delay: number,\r\n range: RangeType,\r\n channel: Channel\r\n}\r\n\r\ninterface ComponentState {\r\n reminders: reminderData[]\r\n reminderBackup: reminderData[]\r\n toEditIndex: number\r\n remindersEnabled: boolean\r\n\r\n defaultTimeLocation: string\r\n arrayLocation: string\r\n\r\n teamsDisabled: boolean\r\n mobileDisabled: boolean\r\n smsDisabled: boolean\r\n emailDisabled: boolean\r\n}\r\n\r\nexport enum RangeType {\r\n Default = \"default\",\r\n Everyone = \"everyone\",\r\n Fallback = \"fallback\",\r\n None = \"none\",\r\n Subscribers = \"subscribers\"\r\n}\r\n\r\nexport enum Channel {\r\n Email = \"email\",\r\n Teams = \"teams\",\r\n SMS = \"sms\",\r\n Mobile = \"mobile\",\r\n Inherit = \"inherit\"\r\n}\r\n\r\nexport interface reminderData {\r\n delay: number;\r\n displayDelay: number;\r\n daysSelected: boolean;\r\n \r\n inherit: boolean\r\n teams: boolean\r\n mobile: boolean\r\n sms: boolean\r\n email: boolean\r\n\r\n emailRange: RangeType;\r\n smsRange: RangeType;\r\n}\r\n\r\nclass ReminderPopout extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n reminders: [],\r\n reminderBackup: [],\r\n defaultTimeLocation: this.props.defaultName+\"Reminder\",\r\n arrayLocation: this.props.defaultName+\"Settings\",\r\n remindersEnabled: this.props.notificationSettings[this.props.defaultName+\"Settings\"].reminders.length > 0,\r\n toEditIndex: 0,\r\n teamsDisabled: !this.props.notificationSettings.settings[`${this.props.notificationName}TeamsAttempt`].toggle ?? false,\r\n mobileDisabled: !this.props.notificationSettings.settings[`${this.props.notificationName}MobileAttempt`].toggle ?? false,\r\n emailDisabled: !this.props.notificationSettings.settings[`${this.props.notificationName}EmailAttempt`].toggle ?? false,\r\n smsDisabled: !this.props.notificationSettings.settings[`${this.props.notificationName}SMSAttempt`].toggle ?? false\r\n };\r\n }\r\n\r\n componentDidMount()\r\n {\r\n const uniqueDelays = Array.from(new Set(this.props.notificationSettings[this.state.arrayLocation].reminders.map(e => e.delay)))\r\n var toLoad = new Array(uniqueDelays.length);\r\n\r\n for(let i=0; i {\r\n let currentReminderToEdit = uniqueDelays.indexOf(reminder.delay);\r\n\r\n switch(reminder.channel)\r\n {\r\n case Channel.Inherit:\r\n toLoad[currentReminderToEdit].inherit = true;\r\n break;\r\n \r\n case Channel.Email:\r\n toLoad[currentReminderToEdit].email = true;\r\n toLoad[currentReminderToEdit].emailRange = reminder.range;\r\n break;\r\n\r\n case Channel.SMS:\r\n toLoad[currentReminderToEdit].sms = true;\r\n toLoad[currentReminderToEdit].smsRange = reminder.range;\r\n break;\r\n\r\n case Channel.Teams:\r\n toLoad[currentReminderToEdit].teams = true;\r\n break;\r\n\r\n case Channel.Mobile:\r\n toLoad[currentReminderToEdit].mobile = true;\r\n break;\r\n\r\n default:\r\n console.log(\"Critical error with loading saved data, investigate tenant settings.\")\r\n }\r\n });\r\n\r\n this.setState({reminders: toLoad})\r\n }\r\n\r\n componentDidUpdate(){\r\n this.props.setReminders(this.state.reminders, this.state.arrayLocation);\r\n } \r\n\r\n public render() {\r\n const timeOptions = [\r\n {label: 'Hours', value: false},\r\n {label: 'Days', value: true}\r\n ]\r\n\r\n const rangeOptionsEmail = [\r\n {label: 'Only if standard app notifications are not set up', value: RangeType.Fallback, id: 'emailRange'},\r\n {label: 'To all topic subscribers', value: RangeType.Subscribers, id: 'emailRange'},\r\n ]\r\n\r\n const rangeOptionsSMS = [\r\n {label: 'Only if standard app or email notifications are not set up', value: RangeType.Fallback, id: 'smsRange'},\r\n {label: 'To all topic subscribers', value: RangeType.Subscribers, id: 'smsRange'},\r\n ]\r\n\r\n return(\r\n
    \r\n
    \r\n
    \r\n

    Edit Reminder Default Settings

    \r\n The following details will be the default reminder setting for each time a notification is created and/or published.\r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n Remind if notification is unread.\r\n \r\n
    \r\n Remind employees if the original notification is still unread after a set amount of time.\r\n
    \r\n Add/edit additional reminder channels:\r\n\r\n
    \r\n {this.state.reminders.map((reminder, index) => \r\n
    \r\n
    \r\n Reminder {index+1}\r\n {index !== 0 && \r\n this.onDeleteReminder(index)}/>}\r\n
    \r\n\r\n
    \r\n
    If unread, send reminder after
    \r\n this.updateDelay(index, e.target.valueAsNumber)}\r\n min={0}\r\n >\r\n this.toggleRadio(index)}\r\n />\r\n Use channels selected in authoring notifications\r\n \r\n \r\n\r\n {!reminder.inherit && \r\n
    \r\n {!this.state.teamsDisabled && \r\n \r\n }\r\n {!this.state.mobileDisabled &&\r\n \r\n }\r\n {!this.state.emailDisabled &&\r\n <>\r\n \r\n
    \r\n this.toggleCheck(e, index)}\r\n name=\"sms\"\r\n /> SMS\r\n \r\n
    \r\n