{"version":3,"sources":["hooks/useErrorHandling.tsx","api/baseApi.ts","api/authApi.ts","services/globalEventHandler.tsx","constants/routes.ts","view/images/logo.png","view/components/TextBox.tsx","view/components/Title.tsx","view/components/Button.tsx","view/components/svgSelector/SvgSelector.tsx","view/components/iconButton/IconButton.tsx","view/components/sideModal/Modal.tsx","view/pages/login/Login.tsx","view/components/campaignStatistic/CampaignStatistic.tsx","view/images/icons/dashboard_icon.svg","view/images/icons/campaigns_icon.svg","view/images/icons/channels_icon.svg","view/images/icons/media_icon.svg","view/images/icons/player_icon.svg","view/images/icons/reports_icon.svg","view/images/icons/calendar_icon.svg","view/images/icons/user_icon.svg","view/images/icons/mosaic_icon.svg","view/images/icons/settings_icon.svg","view/images/icons/monitoring_icon.svg","view/images/icons/notification_icon.svg","view/images/icons/logout_icon.svg","api/alertsApi.ts","view/components/header/Header.tsx","hooks/useSystemAlerts.tsx","hooks/useProgress.tsx","view/components/progressBar/ProgressBarGlobal.tsx","view/pages/innerLayout/InnerLayout.tsx","api/campaingsApi.ts","api/dashboardApi.ts","api/channelsApi.ts","view/components/globalsSpinner/GlobalSpinner.tsx","view/pages/dashboard/Dashboard.tsx","api/mediaApi.ts","services/common.ts","services/dateService.tsx","api/tagApi.ts","view/components/formRow/FormRow.tsx","view/components/search/Search.tsx","view/components/selectFileButton/SelectFileButton.tsx","view/components/fileInfo/FileInfo.tsx","api/clientApi.ts","api/playersApi.ts","view/components/customSelect/CustomSelect.tsx","view/components/campaignModal/CampaignModal.tsx","services/paginator.ts","view/components/pagination/Pagination.tsx","view/pages/campaigns/Campaigns.tsx","view/components/formRow/FormMultiSelect.tsx","view/pages/media/Media.tsx","view/components/schedule/Schedule.tsx","view/pages/channels/Channels.tsx","view/components/dropdown/dropdownBlock.tsx","view/components/formRow/FormCheckbox.tsx","view/components/tab/Tab.tsx","view/components/mediaTranscodeModal/MediaTranscodeModal.tsx","api/reportsApi.ts","view/components/playerStatistic/PlayerStatistic.tsx","view/components/sortIndicator/SortIndicator.tsx","view/pages/players/Players.tsx","api/mosaicApi.ts","view/components/reportSubscriptions/ReportSubscriptions.tsx","view/components/reportDashboard/ReportDashboard.tsx","view/pages/reports/Reports2.tsx","view/components/descriptionList/descriptionList.tsx","view/components/formRow/FormRange.tsx","api/priorityListApi.ts","api/tvChannelApi.ts","view/components/tvChannelMapping/TvChannelMappingOverrides.tsx","api/mediaTranscodingApi.ts","view/components/volumeProfiles/VolumeProfiles.tsx","view/components/schedule/ScheduleOverride.tsx","view/components/advertising/Advertising.tsx","view/components/privacy/Privacy.tsx","view/components/reachTracker/ReachTracker.tsx","view/components/playNowOffline/playNowOffline.tsx","view/pages/players/PlayerDetails.tsx","view/components/formRow/FormRangeValues.tsx","view/pages/channels/ChannelMedia.tsx","api/usersApi.ts","view/pages/priorityLists/PriorityLists.tsx","view/pages/priorityLists/PriorityListMedia.tsx","api/playNowListApi.ts","view/pages/users/UsersList.tsx","view/pages/users/UserSettings.tsx","view/components/playNowFullscreen/PlayNowFullscreen.tsx","view/components/playNowLogs/PlayNowLogs.tsx","view/pages/playNow/playNowList.tsx","view/pages/playNow/playNowListMedia.tsx","view/pages/mosaicScreen/MosaicScreen.tsx","view/pages/mosaicScreen/MosaicScreenList.tsx","view/components/tvChannelMapping/TvChannels.tsx","view/components/systemAlerts/SystemAlerts.tsx","view/components/tvChannelMapping/TvChannelsMapping.tsx","view/components/customSelect/MyCustomSelect.tsx","view/components/mediaTranscoding/MediaTranscoding.tsx","view/components/tagManagment/TagManagment.tsx","view/pages/settings/Settings.tsx","view/pages/users/UserSettingsNotification.tsx","view/pages/changelog/Changelog.tsx","view/pages/reports/CampaignAndChannelAdhocReport.tsx","view/pages/reports/MosaicAdhocReport.tsx","view/pages/reports/MosaicCampaignAndChannelReport.tsx","view/pages/playersMonitoring/PlayersMonitoring.tsx","view/images/tv-guide.jpg","view/pages/tvGuid/TvGuide.tsx","view/components/historicVIew/HistoricView.tsx","view/pages/channels/ChannelPlaylist.tsx","App.tsx","reportWebVitals.ts","index.tsx"],"names":["useErrorHandlingStore","create","set","code","message","isShowModal","showModal","hideModal","baseUrl","process","GetParams","query","Add","key","value","encodeURI","AddList","values","forEach","this","getWithAuth","params","a","axios","get","url","headers","getToken","result","type","data","response","status","unathorizedLogout","getWithAuthAndParams","queryString","requestUrl","postWithAuth","request","post","postWithAuthWitoutParams","patchWithAuth","patch","deleteWithAuth","id","delete","deleteWithBodyAndAuth","removeToken","removeUserData","window","location","reload","interceptors","use","error","getState","Promise","reject","Permission","login","method","token","name","permissions","profilePicture","localStorage","getItem","sessionStorage","removeItem","setToken","sessionType","setItem","subscribers","setUserData","userData","JSON","stringify","updateUserName","userName","userDataJson","jsonData","parse","setNewProfilePicture","getUserData","currentUserHasPermission","permission","findIndex","i","hasPermission","forgotPassword","Routes","createPathWithId","route","TextBox","props","inputClassName","isError","labelClassName","className","label","onChange","e","currentTarget","React","Component","Title","style","fontSize","fontWeight","text","Button","color","resolveColorClass","resolveSizeClass","onClick","disabled","isDisabled","SvgSelector","title","width","height","viewBox","xmlns","d","clipPath","transform","fill","x","y","strokeWidth","strokeLinecap","strokeLinejoin","cx","cy","r","version","preserveAspectRatio","stroke","IconButton","roundedButton","tooltipText","tooltipPosition","Modal","children","wide","show","onRequestClose","modalBackground","modalControlClasses","event","target","Element","classList","contains","SmallModal","GlobalErrorModal","RightModal","CenterModal","Login","loginChange","newValue","setState","loginFailed","loginError","passwordChange","password","passwordError","passwordResetEmailChange","passwordResetEmail","passwordResetError","remeberMeClick","checked","remeberMe","getDefaultRoute","Dashboard","PlayNowList","PriorityList","tryLogin","isValid","state","setIsAuthorized","history","push","tryLoginByPressEnter","goToForgotPasswordForm","switchToRestorePassword","tryResetPassword","passwordRecoverData","email","showSuccessModal","closeSuccessModal","onKeyDown","src","logo","withRouter","CampaignStatistic","all","live","draft","scheduled","pause","end","AlertGroup","SeverityType","sunbScribeOnClick","callBack","fireBodyClick","it","unsubscribe","filter","useState","setUserName","useEffect","setIsShowDropdown","isShowDropdown","dropClasses","href","notificationIcon","alt","role","stopPropagation","prev","userIcon","logOut","logoutIcon","getSystemAlertsWithParams","page","severity","onlyUnready","searchString","alertGroup","getSystemAlertsUnreadCount","updateSystemAlertStatus","updateAllSystemAlertAsReaded","useAlertsCountStore","totalAlerts","messages","alreadyShowed","timer","isRunning","update","count","newMessages","onShow","isShow","some","resetIsShown","removeMessage","start","newTimer","setInterval","stop","currentTimer","clearInterval","useProgressStore","progress","updateProgress","resetProgress","ProgressBarGlobal","progressStore","NavigationElement","displayType","icon","tooltip","EmptyNavigationElement","CampaignStatus","counter","showToastNewMessages","showToastBySeverityType","newMessage","Info","toast","info","onClose","Warning","warning","Important","getNavigationItemDispayType","index","activeIndex","diff","goTo","tab","activeTabIndex","getActiveTabIndex","activeTab","classMenu","isCollapsed","dashboardIcon","Campaigns","campaignsIcon","Media","meidiaIcon","Channels","channelsIcon","calendarIcon","MosaicScreen","mosaicIcon","Players","playerIcon","Reports","reportsIcon","monitoringIcon","Settings","settingsIcon","Users","toogleCollapse","autoClose","newestOnTop","closeOnClick","theme","getDashboardDiagramItems","DayOfWeek","TestEnum","getCampaigns","getCampaignsBase","getCampaignsArchived","createCampaign","updateCampaign","getCampaignMedia","addCampaignMedia","pauseCampaign","publishCampaign","deleteCampaign","deleteCampaignMedia","pauseCampaignMedia","playCampaignMedia","uploadMediaForCampaign","formData","camapignId","setCurrentProgress","onUploadProgress","progressEvent","Math","round","loaded","total","postMediaCampaignVast","getCampaignMediaSchedule","mediaId","postCampaignMediaSchedulePeriod","deleteCampaignMediaSchedulePeriod","scheduleId","postCampaignLock","postCampaignUnlock","GlobalSpinner","updateDashboard","dashboardDiagramItemsResponse","channelsForFilter","channels","map","channelId","channel","campaignsArray","campaigns","campaign","dashboardData","campaignsForFilter","statistic","campaignsStatistic","renderStatus","Active","Draft","Paused","Scheduled","Expired","getGranttGroups","items","selectedCampaigns","length","filtered","includes","getGranttItems","channelIndex","campaignIndex","periodIndex","periods","period","item","group","start_time","moment","startDate","end_time","endDate","itemProps","background","borderRadius","borderColor","selectedCampaignsName","onChangeSelectedChannels","selectedChannelsId","onChangeSelectedCampaigns","getDashboardDataToDisplay","file","showSmallModal","expired","active","paused","isLoading","options","isMulti","classNamePrefix","stackItems","groups","defaultTimeStart","add","defaultTimeEnd","date","Date","now","interval","MediaType","MediaContentType","createChannel","updateChannel","getChannelById","getChannels","campaignId","getBaseChannels","getChannelsShort","getBaseChannelsForPriorityList","getChannelTimeSlots","getChannelPlayers","enableRangeOfTimeSlots","timeSlots","enableTimeSlots","timeSlot","removeTimeSlots","timeSlotId","enableSkinChannelStream","streamId","disableSkinChannelStream","getChannelStreams","createChannelStream","updateChannelStream","deleteChannelStream","deleteChannel","getSiteNestedPlayLists","createSiteNestedPlayList","siteId","updateSiteNestedPlayList","nestedPlayListId","deleteSiteNestedPlayList","nestedPlaylistId","getSiteNestedPlayListMediaLiveStatistic","tagIds","el","reorderNestedPlaylists","playNestedPlaylistMedia","pauseNestedPlaylistMedia","enableSkinNestedPlaylistMedia","disableSkinNestedPlaylistMedia","cloneNestedPlaylistMedia","getSiteNestedPlayListsForCampaign","enableSitePlaylistsRandomOrder","disableSitePlaylistsRandomOrder","getLocalFiles","createLocalFile","updateLocalFile","deleteLocalFile","getGroupedMedia","nestedPlayListsId","reorderGroupMedia","updateGroupForMedia","getGroupsForMedia","createGroupForMedia","changeGroupName","groupId","cloneGroupMedia","removeGroupMedia","stopLocalFile","fileId","pauseLocalFile","playLocalFile","restartLocalFile","jumpToLocalFile","timeCode","setSpeedLocalFile","getDaysStatistic","getHistoricView","MediaAnalyzeStatus","mediaContentTypeOptions","Ads","ClientContent","SelfContent","Backup","getMedia","getMediaBaseInfo","getMediaPlayout","getMediaWithPagination","getMediaById","uploadMedia","uploadMultipleMedia","postMediaVast","updateMedia","updateMediaVast","deleteMedia","postYoutubeMedia","getMediaAnalyzeProfile","getMediaTranscodes","postMediaTranscodeRequest","profileId","getIsUseOriginal","postUseOriginal","postUseTranscode","postWebPage","updateWebPage","addLeadingZero","size","valueString","toString","formatDuration","durationMs","ms","totalSeconds","floor","seconds","minutes","formatToPercent","num","lengthAfterDot","percent","toFixed","indexOf","replace","formatDurationLong","totalMinutes","hours","converFromBytes","bytes","to","renderMediaType","mediaType","Image","Video","VastUrl","Youtube","YoutubeLive","sortByNameString","b","toLowerCase","formatDate","dateString","getDate","getMonth","getFullYear","formatTime","getHours","getMinutes","ampm","minutesStr","formatTimeOnly","timeString","split","TagManagmentEntityType","formatDateTime","format","currentDateString","toISOString","dateTimeString","slice","convertUTCDateToLocalDate","newDate","getTime","getTimezoneOffset","convertUTCDateToLocalDateMMDDYY","getPastDateByDaysAgo","days","withTime","dateTime","subtract","areDatesEqual","date1","date2","isSame","daysSinceStartOfMonth","daysSinceLastMonday","getDay","generateUniqueId","random","isFirstDateGreaterThanSecond","formatMsToHHMMSS","padStart","InternalFormRow","FormInput","isInputError","errorMessage","onChangeValue","min","htmlFor","FormInputColorpicker","FormInputTextarea","rows","FormInputNumber","max","step","FormSelect","selectedValue","defaultValueText","hideDefaultValue","FormRowHorizontal","FormRow","FormRowWithColumns","Search","placeholder","SelectAvatarButton","accept","SelectMultipleFileButton","onMediaUploaded","checkIsDisabled","generatePreview","videoFile","resolve","video","document","createElement","setAttribute","preload","URL","createObjectURL","console","log","load","onloadedmetadata","duration","setTimeout","currentTime","onseeked","canvas","ctx","getContext","videoWidth","videoHeight","drawImage","toBlob","blob","toDataURL","Error","onerror","onFileChange","files","FormData","selectedFiles","Array","from","append","startsWith","generatePreviewResult","previewFile","File","multiple","SelectFileButton","FileInfoImage","mode","mediaInfo","onUpdateMediaInfo","updateName","setUpdateName","updateDuration","setUpdateDuration","isUpdateNameError","setIsUpdateNameError","isUpdateDurationError","setIsUpdateDurationError","isValidUpdateState","setIsValidUpdateState","clockID","setClockID","selectedContentTypeOption","setSelectedContentTypeOption","contentTypeCurrentOption","contentType","clockId","renderPeriod","previewLink","controls","webVideoLink","filterOption","option","input","getOptionLabel","getOptionValue","v","sizeMb","uploadTime","download","getClients","createClient","PlayerStatus","PlayerScheduleOvviredeType","getTags","createTag","getTagManagment","updateTag","deleteTag","deleteTagManagmentEntity","addEntityForTag","getTagStreams","CustomSelect","isSort","rest","sortOptions","isArray","sort","CampaignModal","showCampaignModal","closeCampaignModal","updateCampaignListFunction","modalTitle","setModalTitle","campaignName","setCampaignName","isCampaignNameError","setIsCampaignNameError","setCampaignId","clientToggle","setClientToggle","isSelectedClientError","setIsSelectedClientError","clients","setClients","selectedClient","setSelectedClient","createClientName","setCreateClientName","isClientNameError","setIsClientNameError","isPeriodStartError","setIsPeriodStartError","isPeriodEndError","setIsPeriodEndError","isPeriodError","setIsPeriodError","setPeriods","periodStart","setPeriodStart","periodEnd","setPeriodEnd","siteNestedPlaylists","setSiteNestedPlaylists","selectedSiteNestedPlaylists","setSelectedSiteNestedPlaylists","tags","setTags","selectedTags","setSelectedTags","updateClients","updateTags","updateNestedPlaylists","fetchData","undefined","client","playLists","getClientsResponse","getTagsResponse","getSiteNestedPlaylistResponse","clientFormRowToggle","createClientHandler","curID","currentClient","find","t","createOrUpdateCampaign","clientId","playListIds","playListId","updateRequest","closeModalResetInputsAndErrors","newArr","splice","deletePeriod","siteName","playListName","it2","getPagesCount","itemsPerPage","Pagination","memo","pagesCount","activePage","aroundElements","changePaginationPage","totalPaginationElements","minIndex","maxIndex","paginationClasses","links","renderPageLink","isActive","renderLeftSidePagination","limit","leftSide","renderRightSidePagination","rightSide","middletSide","renderMiddlePagination","mediaItemsPerPage","camapignPerPage","statusOptions","updateList","loadStatus","showArchivedCampaigns","showGlobalSpinner","getCampaignsResponse","updateChannelsBaseOptions","channelsResult","channelOptions","showArchivedCampaignsList","updateArchivedList","publish","renderCampaignSiteNestedPlaylists","playlists","lockCampaign","unlockCampaign","renderCampaignRow","isLockedFromDeleting","openCampaignMediaModal","showCreateModal","showDeleteModal","campaignForDeleteId","closeDeleteModal","campaignPeriods","showMediaModal","loadMediaForCampaign","addChannel","selectedChannels","isChannelsError","removeChannel","renderItem","pow","campaignMedia","WebPage","checkPeriodStatus","currentDate","isBefore","isBetween","renderSchedule","sortBySchedule","campaignMedias","aMinDate","bMinDate","schedule","renderCampaignMediaTypeLink","showCampaignMediaInfoModal","renderCampaingMediaRow","classes","isPaused","renderMediaTypePreview","showScheduleModal","playCampaingMedia","stopCampaingMedia","updateCampaignMediaSchedule","mediaIdForSetSchedule","campaignMediaSchedule","updateCampaignMediaScheduleByOpenScheduleModal","isShowScheduleModal","closeScheduleModal","setMediaPeriodName","isMediaPeriodNameError","mediaPeriodName","setMediaPeriodStart","isMediaPeriodStartError","mediaPeriodStart","setMediaPeriodEnd","isMediaPeriodEndError","mediaPeriodEnd","setMediaPeriodStartTime","mediaPeriodStartTime","setMediaPeriodEndTime","isMediaPeriodEndTimeError","mediaPeriodEndTime","saveMediaPeriods","hoursStart","minutesStart","hoursEnd","minutesEnd","startTime","endTime","removeCampaignMediaSchedulePeriod","renderCampaignMediaScheduleRow","campaignMediaId","changeStatusCampaignMedia","action","apiFunction","getMediaResponse","filteredMedia","media","deleteDate","renderMediaLibraryItem","number","addOrRemoveMedia","renderMediaTypePreviewModal","fileName","selectedMedia","decreaseId","addMediaToCampaign","mediaIds","closeMediaLibrary","getNumberOfSelectedMedia","element","campaignForEdit","closeMediaModal","showMediaLibrary","medias","currentPage","isShowMedia","campaignForDelete","setSearchString","search","setSearchCampaignNameString","searchCampaignNameString","currentPageOfCamapigns","getMediaPagesNumber","getFilteredBySearch","getCampaignPagesNumber","getCampaignsToDisplay","totalCount","filteredCampaigns","getFilteredByCampaignName","getFilteredByCampaignStatus","startIndex","finishIndex","selectedStatusOption","getMediaItemsToDisplay","filteredBySearch","changePaginationPageOfCampaigns","closeVASTModal","showVASTModal","vastName","isVastNameError","vastUrl","isVastUrlError","setVastName","newName","setVastUrl","newUrl","newID","saveVastUrl","getMediaInfoById","mediaInfoResponse","closeCampaignMediaInfoModal","querySelector","newDuration","newDurationMs","thumbnailUrl","onSelectedMediaLabel","onSelectedStatusOption","isNameError","isTagError","campaignMediaInfo","campaignListLength","marginRight","isClearable","FormMultiSelect","titleSelected","onAdd","onRemove","selectedOptions","so","FilterDatesType","getPlayers","players","getPlayersShort","unassigneChannelFromPlayer","playerId","getPlayerConfiguration","getPlayerTechProfile","getPlayerLogs","updateConfuguration","updateTechProfile","getUnassignedPlayers","exceptChannelId","getPlayerHealth","addBackgroundImage","addBespokeImage","deletePlayer","getScreenshots","takeScreenshot","getMediaForPlayer","getSkinTimeslots","postSkinTimeslots","deleteSkinTimeslot","slotId","getPlayerAudioDevices","getPlayerVideoDevices","getTVChannelOverrides","createTVChannelOverrride","updateTVChannelOverride","overrideId","deleteTVChannelOverride","restartPlayer","forceIrCommand","getVolumeProfiles","createVolumeProfile","updateVolumeProfile","deleteVolumeProfile","getPlayerScheduleOverride","postPlayerScheduleOverride","getPlayersScreenshots","getPlayerTvGuide","getAdvertisingInfo","patchAdvertisingInfo","getPrivacyInfo","patchPrivacyInfo","getReachTrackerInfo","patchReachTrackerInfo","getPlayNowOffline","offlineModeEnable","offlineModeDisable","getDownloadTimeslots","postDownloadTimeslots","deleteDownloadTimeslot","Schedule","dragAreaRef","decoAreaRef","isUseRange","onTimeSlotRangeSelect","handleMouseDown","current","blockRect","getBoundingClientRect","startX","clientX","left","startY","clientY","top","isDrawing","opacity","handleMouseMove","endX","endY","abs","handleMouseUp","removeAttribute","selectedSlots","selectSlots","slots","querySelectorAll","newSelectedSlots","rect","currentSlot","dataset","slot","splittedSlot","dayOfWeek","hour","minute","isSelected","renderScheduleRow","renderScheduleIndicator","firstHalfId","secondHafId","onTimeSlotRemove","onTimeSlotAdd","createRef","ref","onMouseDown","onMouseMove","onMouseUp","daysOfWeek","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday","channelsPerPage","updateChannels","updateCampaigns","campaignsOption","openModal","playerIds","dayOfUpdate","timeOfUpdate","getPlayersResult","unassignedPlayers","channelName","dayOfWeekUpdate","isDayOfWeekUpdateError","isTimeOfUpdateError","isChannelNameError","openScheduleModal","getTimeSlotsResult","timeSlotChannelId","openChannelPlayerListModal","channelPlayersResult","showChannelPlayerListModal","channelPlayers","closeModal","closeMediaInfoModal","showMediaInfoModal","closeSmallModal","closeSmallModalDelete","showSmallModalDelete","closeChannelPlayerListModal","selectedItems","omRemove","setChannelName","addPlayer","removePlayer","addTimeSlot","removeTimeSlot","removePlayerFromChannel","playerToDeleteId","agreeRemovePlayerFromChannel","channelToDeleteId","channelToDeleteName","agreeDeleteChannel","save","Number","createRequest","setSeatchString","searchStr","getPagesNumber","getChannelsToDisaplay","filterdChannels","renderChannelRow","playersIds","mediaItems","playlistsCount","timeUpdate","renderChannelPlayerRow","tag","lastSeen","onSelectedCampaignOption","selectedCampaignOption","channelToDisplayLength","DropdownBlock","uniqId","isShowHiddenDropdown","toggleDropdownHiddenBlock","toggleDropdownHiddenBlock2","substr","isRightPosition","FormCheckbox","onChangeHandler","Tabs","TabsContainer","TabNavigation","TabNavigationElement","TabElement","MediaTranscodeModal","closeHandler","loadingHandler","mediaAnalyzeProfile","setMediaAnalyzeProfile","mediaTranscodesProfiles","setMediaTranscodesProfile","isUseTranscode","setIsUseTranscode","setActiveTab","checkActive","updateProfiles","checkUseOriginal","updateTranscodeProfiles","transcodes","getProfilesResult","toggleHandler","val","sendTranscodeRequest","Requested","Posted","Pending","Running","Success","Failed","Cancelled","InternalError","Complete","requestedTime","lastUpdateTime","completeTime","mediaInfoContainerKind","mediaInfoContainerDuration","mediaInfoContainerBitrate","mediaInfoContainerSize","audioCodec","audioChannels","audioChannelOrder","audioSampleRate","audioDuration","audioBitrate","videoCodec","videoFrameRate","videoDuration","videoBitrate","loudnessMeasured","loudnessRange","loudnessGatingMode","loudnessSamplePeak","loudnessTruePeak","jobId","dolbyOutputPath","profileName","canBeRequested","downloadLink","ReportAdhocStatus","ReportSubscriptionType","ReportDashboardColumns","debounceTimer","setIsUploading","isUploading","checkCurrentFilterPeriod","filterPeriod","currentFilterPeriod","setFilterPeriod","All","Today","startOf","Yesterday","Last7Days","Last30Days","updateMediaList","newMediaName","vastIdForUpdate","showEditVastModal","vast","showYoutubeModal","closeYoutubeModal","isYoutubeNameError","isYoutubeUrlError","youtubeName","youtubeUrl","isLiveYoutube","youtubeDuration","setYoutubeName","setYoutubeUrl","setYoutubeLive","isLive","setYoutubeDuration","saveYoutube","showWebPageModal","closeWebPageModal","webPageIdForUpdate","isWebPageNameError","isWebPageUrlError","webPageName","webPageUrl","webPageDuration","selectedWebPageContentTypeOption","webPageClockId","setWebPageName","setWebPageUrl","setWebPageDuration","setWebPageClockId","onSelectedWebPageContentType","saveWebPage","durationSeconds","showEditWebPageModal","webpage","hideDatefilterDropdown","isDatefilterDropdownShow","toggleDatefilterDropdown","setStartDatePeriod","setEndDatePeriod","showMediaDeleteModal","mediaName","mediaIdForAction","mediaNameForDelete","closeMediaDeleteModal","confirmMediaDelete","renderMediaTypeLink","renderActiveFilterIcon","showTranscodeModal","isShowTranscodeModal","hideTranscodeModal","checkFilterDateForInput","totalPages","idsForPlayouts","playouts","bind","updateCampaignsBaseOptions","prevProps","prevState","clearTimeout","pageNumber","getMediaResult","isDeleted","updateMediaPlayouts","campaignsResult","mediaIdsForPlayouts","playoutRequest","ids","playoutResponse","renderContentType","getCurrentPlayout","m","renderRow","PlayerStatistic","activeGroup","online","offline","assignedPlayers","onClickFunction","StatisticElement","SortIndicator","isAsc","PlayerPin","getColor","setPlayers","setIsLoading","filterGroup","setFilterGroup","filteredPlayers","setFilteredPlayers","setCurrentPage","playersPerPage","setPlayersPerPage","sortBy","setSortBy","isAscSort","setIsAscSort","isShowDeleteModal","setIsShowDeleteModal","playerIdForDelete","setPlayerIdForDelete","filterByEnabledStatus","setFiltedByEnabled","gMap","setGMap","gMaps","setGMaps","updatePlayers","filterByGroup","sortByParam","filterByEnabled","isOnline","sortArrayByName","sortArrayByLocation","player","isEnabled","bounds","getMapBounds","fitBounds","maps","places","long","LatLngBounds","place","extend","LatLng","lat","renderPlayerRow","statusClass","Online","Offline","OutOfDayParting","renderPlayerStatus","playerStatus","isNew","playerStats","filteredByEnabled","notActive","withAssignedChannel","withoutChannel","getPlayersStats","temp","checkCurrentSortColumn","currentSort","setSortData","sortByNew","deleteCurrentPlayer","getfilterByEnabledCss","cursor","marginBottom","defaultCenter","lng","defaultZoom","bootstrapURLKeys","onGoogleApiLoaded","gMapLoaded","p","MosaicElementType","generateAdhocReport","getAdhocReports","getSkinReports","skins","sites","generateSkinAdhocReport","getSkinAdhocReports","getReportSubscriptions","reportSubscribe","reportUnsubscribe","getReportsDashboardData","postReportsDashboardDataRequest","downloadCSVReportsDashboardData","responseType","filename","ReportSubscriptions","subscriptions","setSubscriptions","checkedItems","setCheckedItems","subsElementsNetworkAndCampaign","NetworkAndCampaignYesterday","NetworkAndCampaignWeekToDate","NetworkAndCampaignLastWeek","NetworkAndCampaignLast7Days","NetworkAndCampaignLastMonth","NetworkAndCampaignMonthToDate","subsElementsAdhoc","AdHocYesterday","AdHocWeekToDate","AdHocLastWeek","AdHocLast7Days","AdHocLastMonth","AdHocMonthToDate","updateSubscribtions","initialCheckedItems","reportSubscriptionType","res","handleCheckboxChange","req","renderSubscribtions","startSliceData","Campaign","Network","Player","ContentType","setFilteredCampaigns","filteredNetworks","setFilteredNetworks","filteredMedias","setFilteredMedias","filteredContentTypes","setFilteredContentTypes","selectedPlayers","setSelectedPlayers","setSelectedCampaigns","selectedNetworks","setSelectedNetworks","selectedMedias","setSelectedMedias","selectedContentTypes","setSelectedContentTypes","selectedStartDate","setSelectedStartDate","isSelectedStartDateError","setIsSelectedStartDateError","selectedEndDate","setSelectedEndDate","isSelectedEndDateError","setIsSelectedEndDateError","playoutsPerDay","setPlayoutsPerDay","reportPlayouts","setReportPlayouts","reportPlayoutsForDisplay","setReportPlayoutsForDisplay","selectedDatePeriodType","setSelectedDatePeriodType","sliceColumns","setSliceColumns","isShowSmallModal","setIsShowSmallModal","isShowPresetModal","setIsShowPresetModal","isShowSheduledReportsModal","setIsShowSheduledReportsModal","isShowConfirmResetModal","setIsShowConfirmResetModal","presetName","setPresetName","isPresetNameError","setIsPresetNameError","presetNameErrorMessage","setPresetNameErrorMessage","presets","setPresets","slices","setSlices","totalPlayouts","setTotalPlayouts","totalDurationString","setTotalDurationString","setTotalDurationSeconds","durationMode","setDurationMode","setMonthToDatePeriod","getPresetsState","getContentTypeOptions","updateNetworks","updateMedias","fetchProfiles","validateReportPeriodDates","columns","updateReportDashboardData","getColumnsForRequest","networkIds","campaignIds","contentTypes","durMode","checkMode","totalDurationSeconds","chart","tableRows","durationFormatter","updateReportDashboardDataForAdhoc","updateReportDashboardDataFromPreset","preset","setTodayPeriod","setYesterdayPeriod","setWeekToDatePeriod","setLastWeekPeriod","setLast7DaysPeriod","setLastMonthPeriod","getCellValue","rowTable","currentColumn","network","renderContentTypeName","checkActiveDatePeriodType","hidePresetModal","createNewPreset","newPreset","periodType","newPresetState","saveCurrentPresetState","presetsFromStorage","removePreset","presetIndex","updatedPresets","setPeriodFromPreset","restoreDataFromPreset","elem","dates","downloadFile","fileDownload","renderPreset","ResponsiveContainer","LineChart","margin","right","bottom","Legend","align","verticalAlign","CartesianGrid","strokeDasharray","XAxis","dataKey","YAxis","yAxisId","orientation","Tooltip","Line","animationDuration","activeDot","textAlign","paddingTop","list","setList","newState","prevSlices","renderSlices","newIds","c","n","j","renderPlayoutRows","DescriptionList","FormRange","currentValue","changeValue","sign","textPosition","percentage","onEndAcion","ScheduledPriorityListStatus","getMosaicSingle","getMosaicList","postMosaicTemplate","postMosaicNewElements","deleteMosaicElements","mosaicIds","deleteMosaic","uploadImage","getMosaicTimeslots","postMosaicTimeslot","deleteMosaicTimeslot","mosaicId","getTVChannels","createTVChannel","updateTVChannel","deleteTVChannel","getTVProfiles","createTVProfile","updateTVProfile","deleteTVProfile","cloneTVProfile","getTVChannelMappings","createTVChannelMapping","updateTVChannelMapping","deleteTVChannelMapping","TvChannelMappingOverrides","tvChannelsList","setTvChannelsList","selectedTvChannel","setSelectedTvChannel","isSelectedTvChannelError","setIsSelectedTvChannelError","tvChannelOverridesList","setTvChannelOverridesList","tvChannelOverrideIdForAction","setTvChannelOverrideIdForAction","modalAction","setModalAction","overrideValue","setOverriedValue","isOverrideValueError","setIsOverrideValueError","isShowDeleteTvChannelOverrideModal","setIsShowDeleteTvChannelOverrideModal","useParams","updateTvChannelOverridedList","updateTvChannelList","showTvChannelOverrideModal","tvChannelOverride","tvChannelId","playerValue","hideTvChannelOverrideModal","createOrUpdateTvChannelMappingOverride","command","hideDeleteTvChannelOverrrideModal","removeTvChannelOverride","tvChannelName","originalValue","channelNumber","getTranscodingProfiles","createTranscodingProfile","updateTranscodingProfile","deleteTranscodingProfile","weekDaysStart","monday","tuesday","wednesday","thursday","friday","saturday","sunday","VolumeProfiles","volumeProfiles","setVolumeProfiles","volumeProfileIdForAction","setVolumeProfileIdForAction","volumeProfileName","setVolumeProfileName","isVolumeProfileError","setIsVolumeProfileNameError","volumeProfileStartDate","setVolumeProfileStartDate","isVolumeProfileStartDateError","setIsVolumeProfileStartDateError","volumeProfileEndDate","setVolumeProfileEndDate","isVolumeProfileEndDateError","setIsVolumeProfileEndDateError","volumeProfileStartTime","setVolumeProfileStartTime","isVolumeProfileStartTimeError","setIsVolumeProfileStartTimeError","volumeProfileEndTime","setVolumeProfileEndTime","isVolumeProfileEndTimeError","setIsVolumeProfileEndTimeError","volumeProfileWeekDays","setVolumeProfileWeekDays","volume","setVolume","isUsePrioritization","setIsUsePrioritization","isShowDeleteVolumeProfileModal","setIsShowDeleteVolumeProfileModal","updateVolumeProfiles","showVolumeModalModal","volumeProfile","volumeEndDate","isPriority","hideVolumeModal","saveVolumeProfile","changeVolumeProfileDayActivity","day","hideDeleteVolumeProfileModal","removeVolumeProfile","renderVolumeProfile","firstThreeChar","renderWeekDaysInModal","ScheduleOverride","isSlotOverrideExist","renderScheduleIcon","Disabled","Enabled","EnabledInSite","firstHalfSlot","secondHafSlot","onTimeSlotClick","Advertising","adSlotDuration","setAdSlotDuaration","isAdSlotDuartionError","setIsAdSlotDurationError","maxDuration","setMaxDuration","isMaxDurationError","setIsMaxDurationError","minDuration","setMinDuration","isMinDurationError","setIsMinDurationError","updateAdvertisingInfo","isDurationValid","slotDuration","saveAdvertisingInfo","Privacy","isTracking","setIsTracking","isGDPR","setIsGDPR","updatePrivacyInfo","tracking","gdpr","savePrivacyInfo","ReachTracker","setMonday","isMondayError","setIsMondayError","setTuesday","isTuesdayError","setIsTuesdayError","setWednesday","isWednesdayError","setIsWednesdayError","setThursday","isThursdayError","setIsThursdayError","setFriday","isFridayError","setIsFridayError","setSaturday","isSaturdayError","setIsSaturdayError","setSunday","setIsSundayError","updateReachTrackerInfo","saveReachTrackerInfo","PlayNowOffline","playNowOfflineList","setPlayNowOfflineList","updatePlayNowOfflineList","playNowId","hotKey","PlayerDetails","setPlayerStatus","newPlayerTag","setNewPlayerTag","setChannelId","tagsOptions","setTagsOptions","сhannelOptions","setChannelOptions","defaultImage","setDefaultImage","showSize","setShowSize","showAspectRation","setShowAspectRatio","isStreamEnabled","setIsStreamEnabled","skinId","setSkinId","skinOptions","setSkinOptions","chromaFormat","setChromaFormat","audioDelay","setAudioDelay","playerName","setPlayerName","playerIP","setPlayerIP","playerUserAgent","setPlayerUserAgent","setLocation","postalCode","setPostalCode","clientNote","setClientNote","setPlayerId","horizontalResolution","setHorizontalResolution","verticalResolution","setVerticalResolution","totalDiskSpace","setTotalDiskSpace","availableDiskSpace","setAvailableDiskSpace","setVersion","playerLogs","setPlayerLogs","setTotalPages","spaceUsage","setSpaceUsage","totalSpace","setTotalSpace","heartBeats","setHeartBeats","gpuUsage","setGpuUsage","cpuUsage","setCpuUsage","ram","setRam","totalRam","setTotalRam","showScreenModal","setShowScreenModal","screenshots","setScreenshots","screenshotFilterDate","setScreenshotFilterDate","currentScreenShot","setCurrentScreenShot","playerMedia","setPlayerMedia","setPlayouts","currentPagePaginationMedia","setCurrentPagePaginationMedia","setIsShowScheduleModal","skinTimeslots","setSkinTimeslots","periodName","setPeriodName","isPeriodNameError","setIsPeriodNameError","videoDeviceList","setVideoDeviceList","selectedVideoDevice","setSelectedVideoDevice","isVideoDeviceError","setIsVideoDeviceError","wrongVideoDevice","setWrongVideoDevice","audioDeviceList","setAudioDeviceList","selectedAudioDevice","setSelectedAudioDevice","isAudioDeviceError","setIsAudioDeviceError","wrongAudioDevice","setWrongAudioDevice","baseADevices","baseVDevices","playerMappingProfileId","setPlayerMappingProfileId","tvProfilesList","setTvProfilesList","selectedTvProfile","setSelectedTvProfile","isSelectedTvProfileError","setIsSelectedTvProfileError","isShowRestartModal","setIsShowRestartModal","transcodingProfiles","setTranscodingProfiles","selectedTranscodingProfile","setSelectedTranscodingProfile","currentTranscodingId","setCurrentTranscodingId","useProxyServer","setUseProxyServer","bespokeImage","setBespokeImage","isBespokeImageEnabled","setIsBespokeImageEnabled","setTimeSlots","isDownloadTimeEnable","setIsDownloadTimeEnable","isShowDownloadTimeModal","setIsShowDownloadTimeModal","downloadTimeslots","setDownloadTimeslots","isDownloadStartDateError","setIsDownloadStartDateError","isDownloadEndDateError","setIsDownloadEndDateError","isDownloadStartTimeError","setIsDownloadStartTimeError","isDownloadEndTimeError","setIsDownloadEndTimeError","downloadStartDate","setDownloadStartDate","downloadStartTime","setDownloadStartTime","downloadEndDate","setDownloadEndDate","downloadEndTime","setDownloadEndTime","downloadName","setDownloadName","isDownloadNameError","setIsDownloadNameError","downloadTimeWeekDays","setDownloadTimeWeekDays","downloadTimeWeekDaysError","setDownloadTimeWeekDaysError","pageLocation","useLocation","getVideoDevicesPromise","getAudioDevicesResult","playerConfigurationResult","updateTVProfiles","updateMosaics","updateTranscodingProfiles","then","videoDeviceResult","audioDeviceResult","configurationResult","videoDevices","audioDevices","videoDeviceFromConfiguration","getDeviceObject","dshowVdev","audioDeviceFromConfiguration","dshowAdev","defaultImageUrl","dshowSize","dshowAspectRatio","tvChannelMappingProfileId","transcodeProfileId","bespokeImageUrl","isDownloadScheduleEnabled","startConfigure","fetchPlayouts","playerLogsResponse","fetchTechProfile","fetchPlayerLogs","updatePlayerHealth","fetchScreenshots","fetchMediaForPlayer","fetchPlayerSchedule","getTvProfilesResult","getTagsResult","getChannelsResult","getSkinResult","columnsCount","rowsCount","playerTechProfileResult","ip","userAgent","heartbeats","totalSpaceGB","showLoader","createNewTag","createTagResult","onConfigurationUpdate","delay","getDeviceName","onTechProfileUpdate","onDefaultImageChange","onBespokeImageChange","resetImage","changeActivePage","currentActivePage","newPlayerLogs","showScreenInModal","screenShot","sleep","timeslots","takeScreenShotAction","saveTimeslot","updateSkinTimeslots","removeTimeslot","hideRestartModal","restartPlayerByRequest","forceCommandToPlayer","timeSlotOverride","updateDownloadTimeslots","openDownloadTimeModal","removeDownloadTimeslot","changeDownloadTimeDayActivity","saveDownloadTimeslot","Object","trim","playerEvent","user","comment","domain","BarChart","Bar","isActiveDate","renderFilterDates","screenshot","screensShotPreviewUrl","screenShotUrl","transcodeProfile","downloadTimeDays","renderDownloadTimeslotRow","FormRangeValues","innerIndex","innerValueIndex","streams","setStreams","setShowModal","streamName","setStreamName","isStreamNameError","setIsStreamNameError","isStreamStartTimeError","setIsStreamStartTimeError","isStreamEndTimeError","setIsStreamEndTimeError","streamStartTime","setStreamStartTime","streamEndTime","setStreamEndTime","setStreamId","currentSite","setCurrentSite","nestedPlayListAction","setNestedPlayListAction","playlistName","setPlaylistName","isPlaylistNameError","setIsPlaylistNameError","useRandomOrder","setUseRandomOrder","nestedPlayLists","setNestedPlayLists","activeNestedPlaylistId","setActiveNestedPlayListId","isShowNestedPlaylistDeleteModal","setIsShowNestedPlaylistDeleteModal","playInRandomOrder","setPlayInRandomOrder","localFiles","setLocalFiles","localFileIdForAction","setLocalFileIdForAction","isShowLocalFileModal","setIsShowLocalFileModal","localFileName","setLocalFileName","isLocalFileNameError","setIsLocalFileNameError","localFilePath","setLocalFilePath","isLocalFilePathError","setIsLocalFilePathError","isLocalFileStartTimeError","setIsLocalFileStartTimeError","isLocalFileEndTimeError","setIsLocalFileEndTimeError","localFileStartTime","setLocalFileStartTime","localFileEndTime","setLocalFileEndTime","localFileDelay","setLocalFileDelay","localFileAction","setLocalFileAction","isShowLocalFileDeleteModal","setIsShowLocalFileDeleteModal","liveStatistic","setLiveStatistic","isShowPausedMedia","setIsShowPausedMedia","groupedMedia","setGroupedMedia","isShowGroupModal","setIsShowGroupModal","mediaGroups","setMediaGroups","selectedMediaGroup","setSelectedMediaGroup","mediaGroupAction","setMediaGroupAction","groupName","setGroupName","isGroupNameError","setIsGroupNameError","isShowGroupConfirmModal","setIsShowGroupConfirmModal","groupModalAction","setGroupModalAction","groupIdForAction","setGroupIdForAction","setMediaIdForAction","selectedTagIds","setSelectedTagIds","isListCollapsed","setIsListCollapsed","isShowMiniPlayerBlock","setIsShowMiniPlayerBlock","playbackSpeedLocalFiles","setPlaybackSpeedLocalFiles","jumpToLocalFiles","setJumpToLocalFiles","listHash","setListHash","updateStreams","updateNestedPlayLists","getSiteById","updateLocalFiles","allChecked","every","getGroupedMediaAndGroups","updateGroupedMedia","updateGroups","updateNestedPlaylistGroupedMediaLiveStatistic","streamsResponse","speed","hash","arr","tagResponse","onDropMediaInGroup","newOrderedMedia","myNum","groupMedia","sendReorderedIds","getReorderedIdsForRequest","onDropPlaylist","newOrderedPlaylists","reorderItems","clone","play","enableSkin","disableSkin","enableSkinStream","disableSkinStream","deleteStream","renderCampaignStatus","saveStream","previewUrl","getActiveNestedPlayList","showPlaylistModal","nestedPlayList","closePlaylistModal","createOrUpdatePlaylist","createResult","nestedPlayListResponse","f","s","order","closeNestedDeleteModal","deleteNestedPlaylist","setRandomOrderForPlaylists","showLocalFileModal","localFile","path","subtitlesDelayMs","hideLocalFileModal","saveLocalFile","closeLocalFileDeleteModal","removeLocalFile","globalMediaIndex","renderMedia","collapsed","isPausedInCampaign","isExcluded","campaignStatus","showGroupModal","isTriggeringSkin","requestObject","singleMedia","showGroupConfirmModal","closeGroupConfirmModal","cloneGroup","deleteGroup","hideGroupModal","saveGroupForMedia","createNewGroupForMedia","updateGroupName","onSelectedTag","newTagIds","isSortDisabled","toggleMiniPlayerBlock","stopLocalFileInMiniPlayer","pauseLocalFileInMiniPlayer","playLocalFileInMiniPlayer","restartLocalFileInMiniPlayer","jumpToLocalFileInMiniPlayer","localFileId","getJumpToForLocalFile","setSpeedLocalFileInMiniPlayer","getPlayBackSpeedForLocalFile","setPlayBackSpeedForLocalFile","newSpeed","setJumpToForLocalFile","stream","currentTvChannel","renderNestedPlayListTabs","campaignsDurationMs","campaignsPercentage","siteContentDurationMs","siteContentPercentage","inhouseContentDurationMs","inhouseContentPercentage","othersDurationMs","othersPercentage","newCheckedItems","reduce","acc","overflow","join","onEnd","animation","fallbackOnBody","swapThreshold","colSpan","padding","marginLeft","durationScheduled","durationLive","renderGroupMedia","AlertType","getScheduledPriorityLists","createScheduledPriorityList","updateScheduledPriorityList","getScheduledListTimeSlots","enableScheduledListTimeSlot","removeScheduledListTimeSlots","enableScheduledList","disableScheduledList","getScheduledListStreams","listId","createScheduledListStream","updateScheduledListStream","deleteScheduledListStream","deleteScheduledList","enableSkinPriorityListMedia","priorityListId","disableSkinPriorityListMedia","enableSkinPriorityListStream","disableSkinPriorityListStream","getScheduledPriorityNestedPlayLists","createScheduledPriorityNestedPlayList","updateScheduledPriorityNestedPlayList","deleteScheduledPriorityNestedPlayList","getScheduledPriorityNestedPlayListMedias","addMediaToScheduledPriorityNestedPlayList","deleteScheduledPriorityNestedPlayListMedia","reorderScheduledPriorityNestedPlayListMedia","getPriorityListMediaSchedule","addPriorityListMediaSchedule","deletePriorityListMediaSchedule","periodId","getScheduledListRecurrentStreams","createScheduledListRecurrentStream","updateScheduledListRecurrentStream","deleteScheduledListRecurrentStream","enableSkinScheduledListRecurrentStream","disableSkinScheduledListRecurrentStream","lists","setLists","setChannels","setIsloading","listName","setListName","listNameError","setListNameError","setSelectedChannels","listIdForEdit","setListIdForEdit","showTimeSlotModal","setShowTimeSlotModal","setTimeSlotChannelId","currentPagePriority","setCurrentPagePriority","itemIdForDelete","setItemIdForDelete","itemNameForDelete","setItemNameForDelete","isShowSmallModalDeleteScheduledList","setIsShowSmallModalDeleteScheduledList","listItemsToDisplay","setListItemsToDisplay","getList","getChannelsForList","mapChannelToOption","saveList","channelIds","timeSlotsRequest","Inactive","activate","inactivate","deleteScheduledPriorityList","closeSmallModalScheduled","showSmallModalScheduled","PriorityListMedia","setShowMediaModal","setMedia","setSelectedMedia","listMedia","setListMedia","showModalStream","setShowModalStream","isStartDateError","setIsStartDateError","isEndtDateError","setIsEndDateError","isStreamPeriodError","setIsStreamPeriodError","recurrentStreams","setRecurrentStreams","recurrentStreamWeekDays","setRecurrentStreamWeekDays","recurrentStreamStartDate","setRecurrentStreamStartDate","isRecurrentStreamStartDateError","setIsRecurrentStreamStartDateError","recurrentStreamEndDate","setRecurrentStreamEndDate","isRecurrentStreamEndDateError","setIsRecurrentStreamEndDateError","recurrentStreamStartTime","setRecurrentStreamStartTime","isRecurrentStreamStartTimeError","setIsRecurrentStreamStartTimeError","recurrentStreamEndTime","setRecurrentStreamEndTime","isRecurrentStreamEndTimeError","setIsRecurrentStreamEndTimeError","showModalRecurrentStream","setShowModalRecurrentStream","streamIdForDelete","setStreamIdForDelete","isShowDeleteRecurrentStreamModal","setIsShowDeleteRecurrentStreamModal","isUseNestedPlaylist","setIsUseNestedPlaylist","nestedPlaylistPeriod","setNestedPlaylistPeriod","currentMediaId","setCurrentMediaId","streamEditAction","setStreamAction","saveStreamErrorText","setSaveStreamErrorText","totalDuration","setTotalDuration","isUseRandomOrder","setIsUseRandomOrder","selectedNestedPlaylist","setSelectedNestedPlaylist","selectedPreRollPlaylist","setSelectedPreRollPlaylist","selectedPostRollPlaylist","setSelectedPostRollPlaylist","isShowDeletePriorityListMediaScheduleModal","setIsShowDeletePriorityListMediaScheduleModal","priorityListMediaSchedule","setPriorityListMediaSchedule","setIsMediaPeriodNameError","setIsMediaPeriodStartError","setIsMediaPeriodEndError","setIsMediaPeriodEndTimeError","mediaShedulePeriodId","setMediaShedulePeriodId","includedTags","setIncludedTags","excludedTags","setExcludedTags","isUseOrRelationshipInPriorityStream","setIsUseOrRelationshipInPriorityStream","isUseOrRelationshipInRepeatStream","setIsUseOrRelationshipInRepeatStream","series","setSeries","season","setSeason","episode","setEpisode","setTitle","iabCat","setIabCat","genre","setGenre","streamRating","setStremRaiting","activeStreamIdHighlight","getData","updateMediaWitoutPlayouts","updateTvChannels","updateRecurrentStreams","getNestedMedias","updateNestedPlayListMedias","mediaRequest","getNestedPlayListObj","addMedia","enableSkinRecurrentStream","disableSkinRecurrentStream","isNestedListEnabled","showNestedListEachMinutes","includeTagIds","excludeTagIds","useORRelationshipForIncludeTags","preRollPlaylistId","postRollPlaylistId","rating","closeModalStream","saveRecurrentStream","preRollPlayListId","postRollPlayListId","closeModalRecurrentStream","deleteRecurrentStream","hideDeleteRecurrentStreamModal","openModalStream","isDuplicate","openModalRecurrentStream","streamEndDate","onDrop","selectedMediaCopy","addOrRemove","setHighlightClassToStream","changeRecurrentDayActivity","showDeleteRecurrentStreamModal","updatePriorityListMediaSchedule","saveMediaSchedule","removePriorityListMediaSchedulePeriod","hidePriorityListMediaScheduleModal","onSelectedNestedPlayListChange","playlist","onSelectedPreRollPlayListChange","onSelectedPostRollPlayListChange","onSelectedTvChannel","onSelectedIncludeTag","onSelectedExcludeTag","paddingRight","renderPlaylistMedia","PlayNowLogTypeEnum","PlayNowListStatus","getUsersList","getUserNotifications","createUser","updateUser","updateUserNotifications","suspendUser","unSuspendUser","changeUserPassword","changeUsername","updateProfilePicture","getProfilePicture","userNameError","setUserNameError","setEmail","emailError","setEmailError","setPassword","setPasswordError","setPermissions","users","setUsers","userIdForEdit","setUserIdForEdit","updateUserList","showEditModal","saveUser","renderPermission","updatePermission","suspend","unsuspend","goToSettingsNotification","isSuspended","newPassword","setNewPassword","newPasswordError","setNewPasswordError","confrimPassword","setConfirmPassword","confirmPasswordError","setConfirmPasswordError","newUsername","setNewUsername","newUsernameError","setNewUsernameError","userAvatar","setUserProfilePicture","changePassword","alert","changeUserNickname","username","onUploadProfilePicture","profileImageResult","goBack","getPlayNowLists","createPlayNowList","updatePlayNowList","addMediaToPlayNowList","getPlayNowMediaSchedule","addPlayNowMediaSchedule","deletePlayNowMediaSchedule","playNowListDeleteMedia","enablePlayNowList","disablePlayNowList","deletePlayNowListApi","enableSkinPlayNowMedia","disableSkinPlayNowMedia","getPlayNowLogs","playlistId","pageSize","lockPlayer","playNowListId","unlockPlayer","getGroupedPlayNowMedia","updateGroupForPlayNowMedia","getGroupsForPlayNowMedia","createGroupForPlayNowMedia","changeGroupNameForPlayNowMedia","cloneGroupPlayNowMedia","removeGroupPlayNowMedia","cloneGroupedPlayNowMedia","reorderGroupPlayNowMedia","getGroupedPlayNowList","getGroupsForPlayNow","createGroupForPlayNow","changeGroupNameForPlayNow","updateGroupForPlayNow","cloneGroupPlayNow","removeGroupForPlayNow","PlayNowFullscreen","playNowLists","activatePlayNow","inactivatePlayNow","exitFullscreen","selectedPlayLists","setSelectedPlayLists","currentIndex","setCurrentIndex","isDisabledSelectFullscreenMode","setIsDisabledSelectFullscreenMode","findById","renderStatusPlayNow","onPlayNowListRemove","removedItem","removedKey","withoutRemovedItem","tabIndex","playListItem","playList","handleKeyboardClick","autoFocus","spl","playListToAdd","onMenuClose","controlShouldRenderValue","selectePlayList","renderFullscreenPlayNowRow","PlayNowLogs","playNowLogs","setPlayNowLogs","filteredPlayNow","setFilteredPlayNow","selectedPlayer","setSelectedPlayer","selectedPlaylist","setSelectedPlaylist","updatePlayNowLogs","renderLogType","logType","Activated","Deactivated","Locked","Unlocked","playNowLogType","playNowListName","actionDescription","playNowChannels","setplayNowChannels","playNowChannelOptions","setPlayNowChannelOptions","playNowShowModal","setPlayNowShowModal","setPlayNowListName","playNowListNameError","setPlayNowListNameError","playNowSelectedChannels","setPlayNowSelectedChannels","playNowListIdForEdit","setPlayNowListIdForEdit","isShowSmallModalDeletePlayNowList","setIsShowSmallModalDeletePlayNowList","currentPagePlayNow","setCurrentPagePlayNow","isUseOrRelationshipInPlayNow","setIsUseOrRelationshipInPlayNow","groupedPlayNowList","setGroupedPlayNowList","groupedListItemsToDisplay","setGroupedListItemsToDisplay","playNowGroups","setPlayNowGroups","selectedPlayNowGroup","setSelectedPlayNowGroup","isShowConfirmModal","setIsShowConfirmModal","itemIdForAction","setItemIdForAction","closeModalPlayNow","deletePlayNowListConfirm","closeSmallModalPlayNow","saveListPlayNow","updatePlayerLockStatus","isLocked","renderPlayNowRow","playNow","showSmallModalPlayNow","handle","useFullScreenHandle","createNewGroupForPlayNow","saveGroupForPlayNow","showConfirmModal","closeConfirmModal","enter","flatMap","exit","CurrentPlayListMedia","playNowMediaSchedule","setPlayNowMediaSchedule","isShowDeletePlayNowMediaScheduleModal","setIsShowDeletePlayNowMediaScheduleModal","updateGroupedMediaList","listMediaRequest","calculateTotalDuration","el2","updatePlayNowMediaSchedule","hideDeletePlayNowMediaScheduleModal","removePlayNowMediaSchedulePeriod","cloneMedia","mosaicContainer","gridColumnWidth","gridColumnHeight","columnNumber","rowNumber","TimeFormats","mockUploadedLoopImage","mosaic","setMosaic","mosaicNew","setMosaicNew","mosaicConfig","setMosaicConfig","mosaicIdsForDelete","setMosaicIdsForDelete","idForBackLight","setIdForBackLight","indexForBackLight","setIndexForBackLight","uploadedImageName","setUploadedImageName","uploadedImageUrl","setUploadedImageUrl","uploadedMediaLoopImage","setUploadedMediaLoopImage","columnStart","setColumnStart","setWidth","rowStart","setRowStart","setHeight","Main","selectedElementType","setSelectedElementType","currentClickedPositionIndex","setCurrentClickedPositionIndex","chekedCellsNumber","setCheckedCellsNumber","bgColor","setBgColor","textColor","setTextColor","selectedTimeFormat","setSelectedTimeFormat","mosaicValidationErrorText","setMosaicValidationErrorText","imageDuration","setImageDuration","isPlaylistVideoDownloaded","setIsPlaylistVideoDownloaded","isPlaylistMediaDownloaded","setIsPlaylistMediaDownloaded","mediaLoopList","setMediaLoopList","mute","setMute","youtubeIsLive","setYoutubeIsLive","nameElement","setNameElement","youtubeURL","setYoutubeURL","mosaicRef","useRef","getElementLimits","Clock","MediaLoop","WebView","isElementOutOfLimit","getMosaicReadyToDisplay","getElementsCountByType","getIconByType","getTimeFormatName","getMosaicDataSingle","maxWidth","maxHeight","totalWidth","offsetWidth","elements","clickOnSavedCell","clickOnPreviewCell","calcStartPosition","posIndex","ceil","calcEndPosition","minColumnStart","maxColumnStart","hoverPositionColumn","minRowStart","currentWidth","currentHeight","updateMosaicTemplate","updateMosaicElements","isMainBlockedByClock","mainElement","clockElements","mainElement2","l1x","l1y","r1x","r1y","l2x","l2y","r2y","mainStartColumn","startColumn","mainStartRow","startRow","mainEndColumn","mainEndRow","clockEndColumn","clockEndRow","newMosaicElements","addLocalNewMosaicElem","newMosaicElement","staticImageName","staticImageUrl","clockBackgroundColour","clockTextColour","clockTextFormat","mediaLoopMedias","mediaLoopMediasInfo","onFileChangeMediaLoop","originalName","addToMediaLoopList","resetMediaLoopListItem","idsForDelete","getMosaicElementTypeName","renderElementTypeTab","changeElementType","renderElemntTabTilePositionControls","rowClassnames","renderMediaLoopItems","removeFromMediaLoopList","isOutOfLimit","fixedHeight","renderElementTypeTabContent","cellClassnames","renderMosaicElements","renderMosaicElementsNew","renderElementPositionPreview","q","skipRows","skipColumns","onMouseEnter","showColumnNumber","showRowNumber","renderMosaicCells","isForDelete","isForBacklight","mosaicListItemClasses","renderMosaicElementsToList","removeMosaicElementNew","renderMosaicElementsNewToList","mosaicList","setMosaicList","templateName","setTemplateName","templateNameError","setTemplateNameError","setColumnNumber","columnNumberError","setColumnNumberError","setRowNumber","rowNumberError","setRowNumberError","isShowCreateModal","setIsShowCreateModal","isShowSmallModalDeleteMosaic","setIsShowSmallModalDeleteMosaic","idForDelete","setIdForDelete","mosaicScheduleName","setMosaicScheduleName","currentMosaicId","setCurrentMosaicId","mosaicTimeslots","setMosaicTimeslots","listItemsForDisplay","getMosaicListData","hideCreateModal","goToCurrentMosaicScreen","saveTemplate","deleteMosaicConfirm","closeSmallModalMosaic","renderMosaicListRow","updateMosaicTimeslots","TvChannels","tvChannelModalAction","setTvChannelModalAction","setTvChannelName","isTvChannelNameError","setIsTvChannelNameError","tvChannelDomain","setTvChannelDomain","isShowDeleteTvChannelModal","setIsShowDeleteTvChannelModal","tvChannelIdForAction","setTvChannelIdForAction","updateTVChannelList","TVChannels","showTvChannelModal","tvChannel","hideTvChannelModal","createOrUpdateTvChannel","hideDeleteTvChannelModal","removeTvChannel","profiles","notMappedInProfiles","severityOptions","SystemAlerts","alertGroupOptions","System","User","Site","alerts","setAlerts","isShowUnreadedAlerts","setIsShowUnreadedAlerts","selectedSeverityOption","setSelectedSeverityOption","selectedAlertGroupOption","setSelectedAlertGroupOption","pageLoaded","setPageLoaded","fetch","updateSystemAlerts","selectedSeverityType","selectedAlertGroup","alertsResponse","updateAllSystemAlertStatus","renderSeverity","updateAlertStatus","onSelectedSeverity","onSelectedAlertGroup","onShowUnreadedChange","getPaginationItems","isRead","renderAlertRow","TvChannelsMapping","tvProfileName","setTvProfileName","isTvProfileNameError","setIsTvProfileNameError","mappingsList","setMappingList","mappingIdForAction","setMappingIdForAction","isShowDeleteMappingModal","setIsShowDeleteMappingModal","setCommand","isCommandError","setIsCommandError","commandErrorMessage","setCommandErrorMessage","isShowDeleteTvProfileModal","setIsShowDeleteTvProfileModal","tvProfileIdForAction","setTvProfileIdForAction","isShowProfileModal","setIsShowProfileModal","isShowMappingModal","setIsShowMappingModal","updateTvProfileList","updateMappingsList","mapping","tvProfiles","showTvProfileModal","tvProfile","hideTvProfileModal","createOrUpdateTvProfile","hideDeleteTvProfileModal","removeTvProfile","duplicateCurrentTvProfile","showMappingModal","mappingElement","irCommand","hideMappingModal","isCommandAlreadyInUse","createOrUpdateTvChannelMapping","hideDeleteMappingModal","removeMapping","isDefault","isDefaultTvMappingProfileActive","ReactSelect","getSelectedOption","MediaTranscoding","levelOptions","setProfiles","setName","setIsNameError","selectedVideoFrameRate","setSelectedVideoFrameRate","selectedVideoWidth","setSelectedVideoWidth","setVideoHeight","selectedVideoCodec","setSelectedVideoCodec","selectedVideoBitrateKB","setSelectedVideoBitrateKB","selectedAudioCodec","setSelectedAudioCodec","selectedAudioBitrateKB","setSelectedAudioBitrateKB","selectedAudioChannels","setSelectedAudioChannels","selectedAudioSampleRate","setSelectedAudioSampleRate","isDynamicsRangeControlEnable","setIsDynamicsRangeControlEnable","selectedDynamicsRangeControlAmount","setSelectedDynamicsRangeControlAmount","isFilterDynamicEqEnable","setIsFilterDynamicEqEnable","isFilterHighPassEnable","setIsFilterHighPassEnable","filterHighPassFrequency","setFilterHighPassFrequency","isFilterHighPassFrequencyError","setIsFilterHighPassFrequencyError","isFilterHumEnable","setIsFilterHumEnable","isLoudnessEnabled","setIsLoudnessEnabled","loudness","setLoudness","isLoudnessError","setIsLoudnessError","truePeak","setTruePeak","isTruePeakError","setIsTruePeakError","isMusicReductionEnable","setIsMusicReductionEnable","isNoiseReductionEnable","setIsNoiseReductionEnable","selectedNoiseReductionAmount","setSelectedNoiseReductionAmount","isSpeechClickReductionEnable","setIsSpeechClickReductionEnable","selectedSpeechClickReductionAmount","setSelectedSpeechClickReductionAmount","isSpeechIsolationEnable","setIsSpeechIsolationEnable","speechIsolationAmount","setSpeechIsolationAmount","isSpeechIsolationAmountError","setIspeechIsolationAmountError","isSpeechPlosiveReductionEnable","setIsSpeechPlosiveReductionEnable","selectedPlosiveReductionAmount","setSelectedPlosiveReductionAmount","isSpeechSibilanceReductionEnable","setIsSpeechSibilanceReductionEnable","selectedSibilanceReductionAmount","setSelectedSibilanceReductionAmount","profileIdForAction","setProfileIdForAction","isShowDeleteProfileModal","setIsShowDeleteProfileModal","setIsShowModal","updateTranscodingProfilesList","profile","videoBitrateKb","audioBitrateKb","dynamicsRangeControlEnable","dynamicsRangeControlAmount","filterDynamicEqEnable","filterHighPassEnable","filterHumEnable","loudnessEnable","loudnessTargetLevel","loudnessPeakLimit","musicReductionEnable","noiseReductionEnable","noiseReductionAmount","speechClickReductionEnable","speechClickReductionAmount","speechIsolationEnable","speechPlosiveReductionEnable","speechPlosiveReductionAmount","speechSibilanceReductionEnable","speechSibilanceReductionAmount","hideDeleteModal","createOrUpdateTranscodingProfile","removeTranscodingProfile","renderProfilesList","position","TagManagment","isShowEntityDeleteModal","setIsShowEntityDeleteModal","isShowEntityAddModal","setIsShowEntityAddModal","idForAction","setIdForAction","entityIdForAction","setEntityIdForAction","tagName","setTagName","isTagNameError","setIsTagNameError","tagProfiles","setTagProfiles","currentPlayer","setCurrentPlayer","setCampaigns","currentCampaign","setCurrentCampaign","selectedStreams","setSelectedStreams","currentStream","setCurrentStream","playNows","setPlayNows","selectedPlayNows","setSelectedPlayNows","currentPlayNow","setCurrentPlayNow","entityType","setEntityType","updateTagManagmentList","updatePlayersList","updatePlayNows","fetchTagManagment","playNowIds","streamIds","renderBaseInfo","tagId","entity","isAny","showEntityDeleteModal","entityId","hideEntityDeleteModal","showEntityAddModal","hideEntityAddModal","createOrUpdateTag","removeTag","addEntity","IncludedStreams","ExcludedStreams","IncludedPlayNows","ExcludedPlayNows","removeEntity","includedStreams","excludedStreams","includedPlayNows","excludedPlayNows","userId","notifications","setNotifications","isSaveDisabled","setIsSaveDisabled","isCheckedGroup1","setIsCheckedGroup1","isCheckedGroup2","setIsCheckedGroup2","isCheckedGroup3","setIsCheckedGroup3","isCheckedGroup4","setIsCheckedGroup4","notificationGroup1","NewPlayerRegistered","PlayerOfflineContinuouslyRorMoreThan5mins","PlayerOnline","PlayerUpdatedToNewVersion","PlayerCrash","PlayerFreezeForMoreThan30Seconds","PlayerRestartedByCplayerGuardian","PlayerCPUUtilizationAbove75PercentContinuouslyAfter3Mins","PlayerGPUUtilizationAbove60PercentContinuouslyAfter3Mins","PlayerDiskUtilizationAbove75PercentContinuouslyAfter3Mins","PlayerNotResponding","PlayerRestartedByRequest","PlayerRestartedByFreeze","Dolby","RainbowScreen","notificationGroup2","NewUserAdded","UserDisabled","UserEnabled","notificationGroup3","NewCampaignCreated","CampaignStartedByTheStartDate","CampaignPlayedByThePlayButton","CampaignFinishedByTheEndDate","CampaignStoppedByTheStopButton","CampaignAchievedByTheArchiveButton","CampaignStillInDraftMode24hoursAdvancedAlertPriorToStartDate","CampaignHasNoMediaAssets48HoursAdvancedAlertPriorToStartDate","notificationGroup4","NewSiteCreated","NewPlayerAddedToTheSite","NewPlayerRemovedFromTheSite","NewPlaylistAddedUnderASite","PlaylistDeletedUnderASite","fetchUserNotifications","checkIsAllGroupElementsActive","saveNotifications","notificationTypes","updateNotice","notification","checkNotificationGroup","updateNoticeGroup","groupNotifications","isCheck","isCheckCB","renderNotice","ChangeLogPage","adhocReports","setAdhocReports","reportDateStart","setReportDateStart","reportDateEnd","setReportDateEnd","minDateReport","updateReports","fetchReports","mosaicAdhocReports","adhocReport","generateReport","startDateTime","endDateTime","renderStatusAdhoc","Generated","InProgress","PartiatlyGenerated","dateRequested","downloadUrl","skinAdhocReports","setSkinAdhocReports","updateReportList","skinAdhocReport","fetchReportList","setRows","rowsToDisplay","setRowsToDisplay","setSkins","setSites","selectedSkins","setSelectedSkins","selectedSites","setSelectedSites","sitesPromise","skinPromise","sitesResult","skinsResult","skinsList","getReportResult","mosaicName","itemName","renderReportRow","playersWithScreenshots","setPlayersWithScreenshot","lastUpdate","setLastUpdate","groupNameErrorMessage","setGroupNameErrorMessage","monitoringGroupAction","setMonitoringGroupAction","monitoringGroups","setMonitoringGroups","getPlayerIdsFromLocaleStorage","getMonitoringState","refetchInterval","updatePlayersScreenshots","saveCurrentMonitoringState","refreshUpdateTime","monitoring","groupTitle","addPlayerIdsToGroup","newPlayerIds","withReplace","groupIndex","updatedMonitoringGroups","existingPlayerIds","uniqueNewPlayerIds","idsForInsert","forceUpdatePlayersScreenshots","removeSelectedPlayerByClick","screenshotUrl","goToStream","siteInfo","isOffline","removePlayerIdFromGroups","createNewMonitoringGroup","g","newGroup","newGroupState","selectedIds","findNonIntersectingElements","screenshotsToRender","plI","removeMonitoringGroup","selectedChannel","setSelectedChannel","tvGuide","setTvGuide","updateChannelsList","filterPlayersByChannelId","updateTvGuide","tvGuideRows","convertTimeToMinutes","time","renderTvGuideCells","cells","intervalMinutes","startMinutes","endMinutes","offsetPercentage","startInterval","eventDurationPercentage","calculateEventTime","renderTimeline","withPseudoLines","timelineElements","tvGuidebanner","spans","HistoricViewBlock","selectedDate","setSelectedDate","historicView","setHistoricView","isLiveToggle","setIsLiveToggle","updateHistoricView","flex","forDateTime","isHistorian","overflowWrap","renderHistoricView","minHeight","selectedTime","setSelectedTime","setStatistic","chartData","setChartData","startDateString","endDateString","convertToChartData","convertChartDate","inhouseContent","siteContent","other","AreaChart","stackOffset","tickFormatter","Area","stackId","isFromHistory","HistoricView","App","currentToken","isAuthorized","setIsCollapsed","exact","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","require","config","ReactDOM","render","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.61c77fce.chunk.js","sourcesContent":["import { create } from \"zustand\";\r\n\r\ninterface ErrorHandlingState {\r\n code: string,\r\n message: string,\r\n isShowModal: boolean,\r\n showModal: (code: string, message: string) => void,\r\n hideModal: () => void\r\n}\r\n\r\nexport const useErrorHandlingStore = create((set) => ({\r\n code:\"\",\r\n message:\"\",\r\n isShowModal: false,\r\n showModal: (code, message) => {\r\n set({\r\n code,\r\n message,\r\n isShowModal: true\r\n })\r\n },\r\n hideModal: () => {\r\n set({\r\n code: \"\",\r\n message: \"\",\r\n isShowModal: false\r\n })\r\n }\r\n}))","import axios from \"axios\";\r\nimport { getToken, removeToken, removeUserData } from \"./authApi\";\r\nimport { useErrorHandlingStore } from \"../hooks/useErrorHandling\";\r\n\r\n\r\nexport const baseUrl = process.env.REACT_APP_API_URL;\r\n\r\n\r\nexport type Guid = string;\r\nexport type BaseResponse = { ok: string }\r\nexport type BaseResponseWithData = { ok: string, data: T }\r\nexport type BaseCreateResponse = { ok: string, id: Guid }\r\nexport type BaseInfo = {id: Guid, name: string}\r\nexport type BaseInfoList = ListRespone\r\nexport type ListRespone = { items: T[] }\r\nexport type ListResponeWithHash = { items: T[], hash: number }\r\nexport type PaginationListRespone = { items: T[], totalPages: number }\r\nexport type EmptyRequest = {};\r\nexport type ArrayIdsForDelete = {ids:Guid[]}\r\n\r\ntype GetRequestParams = {url : string};\r\ntype SuccessResponse = {type : \"succes\", data : T};\r\ntype UnathorizedResponse = {type: \"unathorized\" };\r\ntype UnhadledErrorResponse = { type: \"unhadledError\" };\r\nexport type ApiResponse = SuccessResponse | UnathorizedResponse | UnhadledErrorResponse;\r\n\r\nexport class GetParams{\r\n query : string;\r\n\r\n constructor(){\r\n this.query = \"\";\r\n }\r\n\r\n Add = (key: string, value : string) => {\r\n this.query += this.query == \"\" \r\n ? `?${key}=${value}` \r\n : `&${key}=${value}`\r\n }\r\n\r\n GetParams = () => {\r\n return encodeURI(this.query) ;\r\n }\r\n\r\n AddList = (key: string, values: string[]) => {\r\n values.forEach(value => this.Add(key, value));\r\n }\r\n}\r\n\r\nexport async function getWithAuth(params : GetRequestParams) : Promise | UnathorizedResponse | UnhadledErrorResponse> {\r\n try\r\n {\r\n var result = await axios.get(params.url, {headers : {'Authorization' : getToken()}});\r\n return { type:\"succes\", data: result.data };\r\n }\r\n catch(error : any)\r\n {\r\n if(error.response.status == 401) {\r\n unathorizedLogout();\r\n return { type : \"unathorized\"}\r\n } else {\r\n // useErrorHandlingStore.getState().showModal(error.response.status ,error.response.data.message)\r\n }\r\n return { type : \"unhadledError\"}\r\n }\r\n}\r\n\r\n\r\nexport async function getWithAuthAndParams(url : string, params: GetParams) : Promise | UnathorizedResponse | UnhadledErrorResponse> {\r\n try\r\n {\r\n var queryString = params.GetParams();\r\n var requestUrl = `${url}${queryString}`;\r\n var result = await axios.get(requestUrl, {headers : {'Authorization' : getToken()}});\r\n return { type:\"succes\", data: result.data };\r\n }\r\n catch(error : any)\r\n {\r\n if(error.response.status == 401) {\r\n unathorizedLogout();\r\n return { type : \"unathorized\"}\r\n }\r\n return { type : \"unhadledError\"}\r\n }\r\n}\r\n\r\nexport async function postWithAuth(url: string, request : TReq): Promise> {\r\n try\r\n {\r\n var result = await axios.post(url, request, {headers : {'Authorization' : getToken()}});\r\n return { type:\"succes\", data: result.data };\r\n }\r\n catch(error : any)\r\n {\r\n if(error.response.status == 401) {\r\n unathorizedLogout();\r\n return { type : \"unathorized\"}\r\n }\r\n return { type : \"unhadledError\"}\r\n }\r\n}\r\n\r\n\r\nexport async function postWithAuthWitoutParams(url: string): Promise> {\r\n try\r\n {\r\n var result = await axios.post(url, {}, {headers : {'Authorization' : getToken()}});\r\n return { type:\"succes\", data: result.data };\r\n }\r\n catch(error : any)\r\n {\r\n if(error.response.status == 401) {\r\n unathorizedLogout();\r\n return { type : \"unathorized\"}\r\n }\r\n return { type : \"unhadledError\"}\r\n }\r\n}\r\n\r\nexport async function patchWithAuth(url: string, request : TReq): Promise> {\r\n try\r\n {\r\n var result = await axios.patch(url, request, {headers : {'Authorization' : getToken()}});\r\n return { type:\"succes\", data: result.data };\r\n }\r\n catch(error : any)\r\n {\r\n if(error.response.status == 401) {\r\n unathorizedLogout();\r\n return { type : \"unathorized\"}\r\n }\r\n return { type : \"unhadledError\"}\r\n }\r\n}\r\n\r\nexport async function deleteWithAuth(url: string, id : Guid): Promise> {\r\n try\r\n {\r\n var result = await axios.delete(`${url}/${id}`, {headers : {'Authorization' : getToken()}});\r\n return { type:\"succes\", data: result.data };\r\n }\r\n catch(error : any)\r\n {\r\n if(error.response.status == 401) {\r\n unathorizedLogout();\r\n return { type : \"unathorized\"}\r\n }\r\n return { type : \"unhadledError\"}\r\n }\r\n}\r\n\r\nexport async function deleteWithBodyAndAuth(url: string, request : TReq): Promise> {\r\n try\r\n {\r\n var result = await axios.delete(url , {data: request, headers : {'Authorization' : getToken()}});\r\n return { type:\"succes\", data: result.data };\r\n }\r\n catch(error : any)\r\n {\r\n if(error.response.status == 401) {\r\n unathorizedLogout();\r\n return { type : \"unathorized\"}\r\n }\r\n return { type : \"unhadledError\"}\r\n }\r\n}\r\n\r\nconst unathorizedLogout = () => {\r\n removeToken();\r\n removeUserData();\r\n window.location.reload();\r\n}\r\n\r\n\r\naxios.interceptors.response.use(function (response) {\r\n return response;\r\n }, function (error) {\r\n // Any status codes that falls outside the range of 2xx cause this function to trigger\r\n // Do something with response error\r\n if(error.response.status != 401){\r\n useErrorHandlingStore.getState().showModal(error.response.status ,error.response.data.message)\r\n }\r\n return Promise.reject(error);\r\n});","import axios from \"axios\";\r\nimport {baseUrl, getWithAuth} from \"./baseApi\";\r\n\r\nexport type LoginRequest = {login : string, password: string};\r\nexport type ForgotPasswordRequest = {email : string};\r\nexport type LoginResponse = {\r\n token : string, \r\n result: 'success' | 'fail',\r\n name: string,\r\n permission: Permission[],\r\n profilePicture: string,\r\n };\r\ntype ValidateTokenResponse = { Result : string };\r\n\r\n\r\n\r\nexport const login = async (request : LoginRequest) => {\r\n try{\r\n var result = await axios({method: \"POST\", data: request, url: `${baseUrl}auth/login`});\r\n return { result : 'success', token : result.data.token, name: result.data.name, permissions: result.data.permissions, profilePicture: result.data.profilePicture }\r\n }\r\n catch(err : any){\r\n return {result : 'fail'}\r\n } \r\n}\r\n\r\nexport const getToken = () => {\r\n let token = window.localStorage.getItem(\"auth\");\r\n if(!!!token || token == \"\"){\r\n token = window.sessionStorage.getItem(\"auth\");\r\n }\r\n\r\n return token;\r\n}\r\n\r\nexport const removeToken = () => {\r\n window.localStorage.removeItem(\"auth\");\r\n window.sessionStorage.removeItem(\"auth\");\r\n}\r\n\r\nexport const validateToken = async () : Promise<\"unathorized\" | \"unhadledError\" | \"athorized\"> => {\r\n var result = await getWithAuth({url : `${baseUrl}auth/validate`});\r\n switch(result.type){\r\n case \"unathorized\": return \"unathorized\";\r\n case \"unhadledError\" : return \"unhadledError\";\r\n case \"succes\": return \"athorized\";\r\n }\r\n}\r\n\r\nexport const setToken = async (token: string, sessionType: \"persistent\" | \"session\") => {\r\n if(sessionType == \"persistent\"){\r\n window.localStorage.setItem('auth', token);\r\n }\r\n if(sessionType == \"session\"){\r\n window.sessionStorage.setItem(\"auth\", token);\r\n }\r\n}\r\n\r\n\r\nexport enum Permission {\r\n Users = 1,\r\n Dashboard = 2,\r\n Campaigns = 3,\r\n Channels = 4,\r\n Media = 5,\r\n Players = 6,\r\n Reports = 7,\r\n PriorityList = 8,\r\n PlayNowList = 9,\r\n MosaicScreen = 10,\r\n Settings = 11,\r\n Monitoring = 12,\r\n}\r\n\r\nexport type UserData = {\r\n name: string,\r\n permissions: Permission[],\r\n profilePicture: string\r\n}\r\n\r\nexport type PasswordRecoverData = {\r\n email: string,\r\n}\r\n\r\nexport const setUserData = async (userData: UserData, sessionType: \"persistent\" | \"session\") => {\r\n if(sessionType == \"persistent\"){\r\n window.localStorage.setItem('userData', JSON.stringify(userData));\r\n }\r\n if(sessionType == \"session\"){\r\n window.sessionStorage.setItem(\"userData\", JSON.stringify(userData));\r\n }\r\n}\r\n\r\nexport const updateUserName = (userName: string) => {\r\n let userDataJson = window.localStorage.getItem(\"userData\");\r\n if(!!userDataJson){\r\n let jsonData: UserData = JSON.parse(userDataJson);\r\n jsonData.name = userName;\r\n setUserData(jsonData, \"persistent\");\r\n return;\r\n }\r\n userDataJson = window.sessionStorage.getItem(\"userData\");\r\n if(!!userDataJson){\r\n let jsonData: UserData = JSON.parse(userDataJson); \r\n jsonData.name = userName;\r\n setUserData(jsonData, \"session\");\r\n return; \r\n }\r\n} \r\n\r\nexport const setNewProfilePicture = (profilePicture: string) => {\r\n let userDataJson = window.localStorage.getItem(\"userData\");\r\n if(!!userDataJson){\r\n let jsonData: UserData = JSON.parse(userDataJson);\r\n jsonData.profilePicture = profilePicture;\r\n setUserData(jsonData, \"persistent\");\r\n return;\r\n }\r\n userDataJson = window.sessionStorage.getItem(\"userData\");\r\n if(!!userDataJson){\r\n let jsonData: UserData = JSON.parse(userDataJson); \r\n jsonData.profilePicture = profilePicture;\r\n setUserData(jsonData, \"session\");\r\n return; \r\n }\r\n} \r\n\r\n\r\nexport const getUserData = () : UserData => {\r\n let userDataJson = window.localStorage.getItem(\"userData\");\r\n if(!!!userDataJson || userDataJson == \"\"){\r\n userDataJson = window.sessionStorage.getItem(\"userData\");\r\n }\r\n if(!!userDataJson){\r\n let jsonData: UserData = JSON.parse(userDataJson);\r\n return jsonData;\r\n }\r\n return { name: \"\", permissions: [], profilePicture: \"\"};\r\n}\r\n\r\nconst hasPermission = (userData: UserData, permission: Permission) => {\r\n return userData.permissions.findIndex(i => i == permission) !== -1;\r\n}\r\n\r\nexport const currentUserHasPermission = (permission: Permission) => {\r\n let userData = getUserData();\r\n return hasPermission(userData, permission)\r\n} \r\n\r\n\r\nexport const removeUserData = () => {\r\n window.localStorage.removeItem(\"userData\");\r\n window.sessionStorage.removeItem(\"userData\");\r\n}\r\n\r\nexport const forgotPassword = async (request : ForgotPasswordRequest) => {\r\n try{\r\n var result = await axios({method: \"POST\", data: request, url: `${baseUrl}auth/forgotPassword`});\r\n return { result : 'success'}\r\n }\r\n catch(err : any){\r\n return {result : 'fail'}\r\n } \r\n}","\r\nexport type GlobalOnClickEventHandler = () => void;\r\n\r\nlet subscribers : { callBack: GlobalOnClickEventHandler, name: string }[];\r\nsubscribers = [];\r\n\r\n\r\nexport let sunbScribeOnClick = (callBack : GlobalOnClickEventHandler, name: string ) => {\r\n subscribers.push({callBack: callBack, name: name});\r\n}\r\n\r\nexport let fireBodyClick = () => {\r\n subscribers.forEach(it => it.callBack());\r\n}\r\n\r\nexport const unsubscribe = (name: string) => {\r\n subscribers = subscribers.filter(it => it.name != name);\r\n}","export const Routes = {\r\n Login : \"/login\",\r\n Dashboard: \"/dashboard\",\r\n Media: \"/media\",\r\n Campaigns: \"/campaigns\",\r\n Channels: \"/channels\",\r\n ChannelMedia: \"/channels/:channelId\",\r\n ChannelPlaylist: \"/channels/playlist\",\r\n Reports: \"/reports\",\r\n ReportsAdhoc: \"/reports/adhoc\",\r\n ReportsSkin: \"/reports/skin\",\r\n ReportsSkinAdhoc: \"/reports/skinAdhoc\",\r\n PriorityList: \"/priorityList\",\r\n PriorityListMedia: \"/priorityList/:listId\",\r\n PlayNow: \"/playNowList\",\r\n PlayNowMedia: \"/playNowList/:listId\",\r\n Users: \"/users\",\r\n UserNotifications: \"/users/:userId/notifications\",\r\n UserSettings: \"/userSettings\",\r\n Players: \"/players\",\r\n PlayerDetails: \"/players/:id\",\r\n Skins: \"/skins\",\r\n SkinDetails: \"/skins/:skinId\",\r\n Settings: \"/settings\",\r\n ChangeLog: \"/changelog\",\r\n PlayersMonitoring: \"/monitoring\",\r\n TvGuide: \"/tvGuide\"\r\n}\r\n\r\n\r\nexport const extractId = (route: string, path: string) => path.replace(`${route}/`, \"\");\r\nexport const createTemplatePathWithId = (route: string) => `${route}/:id`;\r\nexport const createPathWithId = (route: string, id: string) => `${route}/${id}`;","export default __webpack_public_path__ + \"static/media/logo.5d4bf63e.png\";","import React from \"react\";\r\nimport \"./TextBox.css\"\r\nimport \"./Base.css\"\r\n\r\nexport type TextBoxProps = \r\n{\r\n onChange : (value: string) => void;\r\n type : \"text\" | \"password\";\r\n label?: string;\r\n isError?: boolean;\r\n}\r\nexport type TextBoxState = {}\r\n\r\nexport class TextBox extends React.Component {\r\n constructor(props: TextBoxProps) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n const inputClassName = `text_box ${this.props.isError ? \"error\" : \"\"}`\r\n const labelClassName = `textbox_label ${this.props.isError ? \"error\" : \"\"}`\r\n\r\n return
\r\n {this.props.label &&\r\n \r\n }\r\n this.props.onChange(e.currentTarget.value)} \r\n />\r\n
\r\n }\r\n}","\r\ntype TytleProps = {text : string}\r\n\r\nexport const Title = (props: TytleProps) => {\r\n return

{props.text}

\r\n}","import React from \"react\";\r\nimport \"./Button.css\"\r\n\r\nexport type ButtonProps = \r\n{\r\n onClick : (\r\n event? : any\r\n ) => void;\r\n label?: string;\r\n type?: \"login\" | \"lg\"\r\n color: \"white\" | \"green\" | \"gray\" | \"transparent\";\r\n isDisabled?: boolean\r\n}\r\n\r\nexport type ButtonState = {}\r\n\r\nexport class Button extends React.Component {\r\n constructor(props: ButtonProps) {\r\n super(props);\r\n }\r\n\r\n resolveSizeClass(){\r\n switch(this.props.type){\r\n case \"login\": return \"login_btn\";\r\n case \"lg\": return \"lg_btn\";\r\n default : return \"\";\r\n }\r\n }\r\n\r\n resolveColorClass(){\r\n switch(this.props.color){\r\n case \"white\":\r\n return \"white_btn\";\r\n case \"transparent\":\r\n return \"link_btn\";\r\n case \"green\": \r\n return \"primary_btn\";\r\n case \"gray\": \r\n return \"gray_btn\";\r\n }\r\n } \r\n\r\n render() {\r\n const className = `btn ${this.resolveColorClass()} ${this.resolveSizeClass()}`;\r\n\r\n return \r\n }\r\n}\r\n\r\nexport type ButtonLinkProps = \r\n{\r\n url: string,\r\n label?: string;\r\n type?: \"login\" | \"lg\"\r\n color: \"white\" | \"green\" | \"gray\" | \"transparent\";\r\n isDisabled?: boolean\r\n}\r\n\r\nexport class ButtonLink extends React.Component {\r\n constructor(props: ButtonLinkProps) {\r\n super(props);\r\n }\r\n\r\n resolveSizeClass(){\r\n switch(this.props.type){\r\n case \"login\": return \"login_btn\";\r\n case \"lg\": return \"lg_btn\";\r\n default : return \"\";\r\n }\r\n }\r\n\r\n resolveColorClass(){\r\n switch(this.props.color){\r\n case \"white\":\r\n return \"white_btn\";\r\n case \"transparent\":\r\n return \"link_btn\";\r\n case \"green\": \r\n return \"primary_btn\";\r\n case \"gray\": \r\n return \"gray_btn\";\r\n }\r\n } \r\n\r\n render() {\r\n const className = `btn ${this.resolveColorClass()} ${this.resolveSizeClass()}`;\r\n\r\n return {this.props.label}\r\n }\r\n}","import { FunctionComponent } from \"react\";\r\nimport \"./SvgSelector.css\"\r\n\r\nexport type SvgIconType = \"edit\" | \r\n \"delete\" | \r\n \"export\" | \r\n \"search\" | \r\n \"filter\" | \r\n \"plus\" | \r\n \"minus\" | \r\n \"play\" | \r\n \"stop-play\" | \r\n \"like\" | \r\n \"player\" | \r\n \"list-add\" | \r\n \"cross\" | \r\n \"clock\" | \r\n \"lock\" | \r\n \"calendar\" |\r\n \"refresh\" |\r\n \"copy\" | \r\n \"select-media\" |\r\n \"archive\" |\r\n \"mosaic\" |\r\n \"report2\" |\r\n \"convert\" |\r\n \"dolby\" |\r\n \"folder\" |\r\n \"mini-player\" |\r\n \"stop\" | \r\n \"restart\" | \r\n \"settings\"\r\n\r\ninterface SvgSelectorProps {\r\n title: string | \"marker\",\r\n color?: string\r\n}\r\n \r\nconst SvgSelector: FunctionComponent = (props) => {\r\n\r\n let {title, color} = props;\r\n\r\n switch(title){\r\n case \"delete\":\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n );\r\n case \"edit\":\r\n return (\r\n \r\n \r\n \r\n );\r\n case \"filter\":\r\n return (\r\n \r\n \r\n \r\n );\r\n case \"export\":\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n );\r\n case \"search\":\r\n return (\r\n \r\n \r\n \r\n\r\n );\r\n case \"email\":\r\n return (\r\n \r\n \r\n \r\n );\r\n case \"plus\":\r\n return (\r\n \r\n \r\n \r\n );\r\n case \"play\":\r\n return (\r\n \r\n \r\n \r\n );\r\n case \"stop-play\":\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n case \"player\":\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n case \"list-add\":\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n case \"cross\":\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n case \"clock\":\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 case \"calendar\":\r\n return (\r\n \r\n \r\n \r\n );\r\n case \"lock\":\r\n return (\r\n \r\n \r\n \r\n\r\n );\r\n case \"select-media\":\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n );\r\n case \"copy\":\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n case \"campaign-all\":\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 case \"campaign-live\":\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n case \"campaign-pause\":\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 case \"campaign-end\":\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 case \"refresh\":\r\n return (\r\n \r\n \r\n \r\n );\r\n case \"ok\":\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n case \"minus\":\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n case \"like\":\r\n return (\r\n \r\n \r\n \r\n );\r\n case \"channel-report\":\r\n return (\r\n \r\n \r\n \r\n );\r\n case \"media-report\":\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n\r\n case \"marker\" : \r\n return (\r\n \r\n \r\n \r\n );\r\n case \"url\" : \r\n return (\r\n \r\n \r\n \r\n );\r\n case \"archive\" : \r\n return (\r\n \r\n \r\n \r\n )\r\n case \"mosaic\" : \r\n return (\r\n \r\n \r\n \r\n )\r\n case \"youtube\" : \r\n return (\r\n \r\n \r\n \r\n )\r\n case \"image\" : \r\n return (\r\n \r\n \r\n \r\n )\r\n case \"nested\" : \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 case \"report2\" : \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 case \"convert\" :\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n case \"monitoring\" :\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 case \"folder\" :\r\n return (\r\n \r\n \r\n \r\n )\r\n case \"mini-player\" :\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 case \"stop\" :\r\n return (\r\n \r\n \r\n )\r\n case \"restart\" :\r\n return (\r\n \r\n \r\n \r\n )\r\n case \"settings\" :\r\n return (\r\n \r\n \r\n \r\n )\r\n case \"dolby\" :\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 case \"webview\":\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 default: return ;\r\n }\r\n}\r\n \r\nexport default SvgSelector;","import React, { FunctionComponent } from \"react\";\r\nimport \"./IconButton.css\"\r\nimport SvgSelector, { SvgIconType } from \"../svgSelector/SvgSelector\";\r\n\r\n\r\ninterface IconButtonProps {\r\n type: SvgIconType,\r\n roundedButton?: boolean,\r\n onClick? : (event? : React.MouseEvent)=>void\r\n disabled? : boolean,\r\n tooltipText : string,\r\n tooltipPosition?: \"left\" \r\n}\r\n \r\nconst IconButton: FunctionComponent = (props) => {\r\n\r\n let { type, roundedButton, onClick , disabled, tooltipText, tooltipPosition} = props;\r\n\r\n return ( \r\n \r\n );\r\n}\r\n \r\nexport default IconButton;","import { type } from \"os\";\r\nimport React, { FunctionComponent, useEffect, useState } from \"react\";\r\nimport { Button } from \"../Button\";\r\nimport IconButton from \"../iconButton/IconButton\";\r\nimport \"./Modal.css\";\r\nimport { useErrorHandlingStore } from \"../../../hooks/useErrorHandling\";\r\n\r\nexport type SetHandler = () => void; \r\n\r\nexport type ModalProps = {\r\n children: any,\r\n title?: string | JSX.Element,\r\n wide?: boolean,\r\n show: boolean,\r\n onRequestClose: () => void\r\n}\r\n\r\n\r\ntype InternalModalProps = {\r\n children: any,\r\n title?: string | JSX.Element,\r\n type : \"right\" | \"center\" | \"left\",\r\n wide?: boolean,\r\n show: boolean,\r\n onRequestClose: () => void\r\n}\r\n\r\ntype SmallModalProps = {\r\n children: any,\r\n text?: string,\r\n show: boolean,\r\n onRequestClose: () => void\r\n}\r\n\r\ntype GlobalErrorModalProps = {\r\n code: string,\r\n message: string,\r\n show: boolean,\r\n onRequestClose: () => void\r\n}\r\n \r\nconst Modal: FunctionComponent = (props) => {\r\n\r\n let {children, title, type, wide = false, show, onRequestClose} = props; \r\n\r\n const modalBackground = \"modal-dialog\";\r\n const hideModal = (event: React.MouseEvent)=>{\r\n event.target instanceof Element \r\n && event.target.classList.contains(modalBackground)\r\n && onRequestClose()\r\n }\r\n\r\n const modalControlClasses = `modal-layout ${type == 'center' ? 'main-modal' : ''} ${wide && 'double-width'} ${show ? 'show' : ''}`\r\n\r\n return ( \r\n
\r\n
\r\n
\r\n
\r\n

{title}

\r\n {type == 'center' && }\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\nexport const SmallModal:FunctionComponent = (props) =>{\r\n let {children, text, show, onRequestClose} = props; \r\n\r\n const modalBackground = \"modal-dialog\";\r\n const hideModal = (event: React.MouseEvent)=>{\r\n event.target instanceof Element \r\n && event.target.classList.contains(modalBackground)\r\n && onRequestClose()\r\n }\r\n\r\n const modalControlClasses = `modal-layout small-modal ${show ? 'show' : ''}`;\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {!text ?

Are You sure?

:

{text}

}\r\n {children}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nexport const GlobalErrorModal:FunctionComponent = () =>{\r\n\r\n let {code, message, isShowModal, hideModal} = useErrorHandlingStore();\r\n\r\n const modalBackground = \"modal-dialog\";\r\n const hideModalHandler = (event: React.MouseEvent)=>{\r\n event.target instanceof Element \r\n && event.target.classList.contains(modalBackground)\r\n && hideModal()\r\n }\r\n\r\n const modalControlClasses = `modal-layout small-modal ${isShowModal ? 'show' : ''}`;\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
\r\n

Error

\r\n

{message}

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\n\r\nexport const RightModal = (props: ModalProps) => Modal({type : \"right\", ...props });\r\nexport const CenterModal = (props: ModalProps) => Modal({type : \"center\", ...props });","import React from \"react\";\r\nimport { forgotPassword, getUserData, login, PasswordRecoverData, Permission, setToken, setUserData, UserData } from \"../../../api/authApi\";\r\nimport './login.css'\r\nimport { RouteComponentProps, useHistory, withRouter } from 'react-router-dom';\r\nimport { Routes } from \"../../../constants/routes\";\r\nimport logo from \"./../../images/logo.png\";\r\nimport { TextBox } from \"../../components/TextBox\";\r\nimport { Title } from \"../../components/Title\";\r\nimport { Button } from \"../../components/Button\";\r\nimport { SmallModal } from \"../../components/sideModal/Modal\";\r\n\r\nexport type LoginState = { \r\n login: string, \r\n password: string,\r\n loginFailed: boolean,\r\n passwordError?: boolean,\r\n loginError?: boolean,\r\n remeberMe: boolean,\r\n switchToRestorePassword: boolean,\r\n passwordResetEmail: string,\r\n passwordResetError:boolean,\r\n showSuccessModal: boolean,\r\n}\r\n\r\nexport interface LoginProps extends RouteComponentProps\r\n{\r\n setIsAuthorized : (isAuthorized: boolean) => void;\r\n}\r\n\r\nclass Login extends React.Component {\r\n constructor(props: LoginProps) {\r\n super(props); \r\n this.state = { \r\n login: '', \r\n password: '', \r\n loginFailed: false, \r\n remeberMe: false, \r\n switchToRestorePassword: false,\r\n passwordResetEmail: '',\r\n passwordResetError: false,\r\n showSuccessModal: false,\r\n } \r\n }\r\n\r\n // override async componentDidMount(){\r\n // document.addEventListener('keypress', this.tryLoginByPressEnter)\r\n // }\r\n\r\n // override async componentWillUnmount(){\r\n // document.removeEventListener('keypress', this.tryLoginByPressEnter)\r\n // }\r\n\r\n loginChange = (newValue: string) => {\r\n this.setState({login : newValue, loginFailed: false, loginError: false});\r\n }\r\n\r\n passwordChange = (newValue: string) => {\r\n this.setState({password : newValue, loginFailed: false, passwordError: false});\r\n }\r\n\r\n passwordResetEmailChange = (newValue: string) => {\r\n this.setState({passwordResetEmail : newValue, passwordResetError: false});\r\n }\r\n\r\n\r\n\r\n remeberMeClick = (event: React.MouseEvent) => { \r\n var checked = event.currentTarget.checked;\r\n this.setState({remeberMe : checked});\r\n };\r\n\r\n\r\n \r\n hasPermission = (userData: UserData, permission: Permission) => {\r\n return userData.permissions.findIndex(i => i == permission) !== -1;\r\n }\r\n\r\n getDefaultRoute = () => {\r\n var userData = getUserData();\r\n if(this.hasPermission(userData, Permission.Dashboard)) return Routes.Dashboard;\r\n if(this.hasPermission(userData, Permission.PlayNowList)) return Routes.PlayNow;\r\n if(this.hasPermission(userData, Permission.PriorityList)) return Routes.PriorityList;\r\n \r\n return Routes.Reports;\r\n }\r\n\r\n tryLogin = async () => {\r\n let isValid = true;\r\n if(this.state.login === '') { this.setState({loginError: true}); isValid = false ; }\r\n if(this.state.password === '') { this.setState({passwordError: true}); isValid = false; }\r\n\r\n if(!isValid) return;\r\n\r\n var result = await login({password: this.state.password, login : this.state.login})\r\n if(result.result == 'fail'){\r\n this.setState({loginFailed : true});\r\n return;\r\n }\r\n \r\n let userData: UserData = {\r\n name: result.name,\r\n permissions: result.permissions,\r\n profilePicture: result.profilePicture\r\n }\r\n\r\n setUserData(userData, this.state.remeberMe ? \"persistent\" : \"session\");\r\n setToken(result.token, this.state.remeberMe ? \"persistent\" : \"session\");\r\n this.props.setIsAuthorized(true);\r\n this.props.history.push(this.getDefaultRoute());\r\n }\r\n\r\n tryLoginByPressEnter = (event: React.KeyboardEvent) => {\r\n if(event.key === \"Enter\") this.tryLogin()\r\n }\r\n\r\n goToForgotPasswordForm = () => {\r\n this.setState({switchToRestorePassword:true})\r\n }\r\n\r\n tryResetPassword = async () => {\r\n let isValid = true;\r\n if(this.state.passwordResetEmail === '') { this.setState({passwordResetError: true}); isValid = false ; }\r\n\r\n if(!isValid) return;\r\n\r\n let passwordRecoverData: PasswordRecoverData = {\r\n email: this.state.passwordResetEmail\r\n }\r\n\r\n //send email here\r\n let result = await forgotPassword(passwordRecoverData);\r\n\r\n if( result.result == \"success\"){\r\n this.setState({passwordResetEmail:'',showSuccessModal:true})\r\n }\r\n }\r\n\r\n closeSuccessModal = () => this.setState({showSuccessModal:false, switchToRestorePassword: false})\r\n\r\n \r\n render() {\r\n return
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {!this.state.switchToRestorePassword && \r\n
\r\n \r\n <TextBox onChange={this.loginChange} type=\"text\" label=\"Email Address\" isError={this.state.loginError}/>\r\n <TextBox onChange={this.passwordChange} type=\"password\" label=\"Password\" isError={this.state.passwordError}/>\r\n \r\n {this.state.loginFailed && <div className=\"error_message\">Wrong password or email.</div>} \r\n \r\n <div className=\"forgot_block\">\r\n <span className=\"forgot_link\" onClick={this.goToForgotPasswordForm}>Forgot Password?</span>\r\n </div>\r\n\r\n <div className=\"btn_form\">\r\n <label> \r\n <input type=\"checkbox\" onClick={this.remeberMeClick}></input>\r\n Remember me\r\n </label>\r\n <Button onClick={this.tryLogin} label=\"Login\" type=\"login\" color=\"white\" />\r\n </div>\r\n </div> \r\n }\r\n\r\n {this.state.switchToRestorePassword && \r\n <div className=\"login_form\">\r\n <Title text=\"Reset password\"/>\r\n <TextBox onChange={this.passwordResetEmailChange} type=\"text\" label=\"Email Address\" isError={this.state.passwordResetError}/>\r\n\r\n <div className=\"btn_form\">\r\n <Button onClick={this.tryResetPassword} label=\"Send\" type=\"login\" color=\"white\" />\r\n </div>\r\n </div> \r\n }\r\n \r\n </div>\r\n <SmallModal text=\"Thanks!\" show={this.state.showSuccessModal} onRequestClose={this.closeSuccessModal}> \r\n <p>Please check your email</p>\r\n <div className=\"modal-btn-group center\">\r\n <Button color=\"gray\" label=\"Close\" onClick={this.closeSuccessModal}/>\r\n </div>\r\n </SmallModal>\r\n </div>\r\n }\r\n }\r\n\r\nexport default withRouter(Login);","import React from \"react\";\r\nimport SvgSelector from \"../svgSelector/SvgSelector\";\r\nimport \"./CampaignStatistic.css\"\r\n\r\ninterface CampaignStatisticProps {\r\n all:number,\r\n live:number,\r\n pause:number,\r\n end:number,\r\n draft: number,\r\n scheduled: number\r\n}\r\n \r\ninterface CampaignStatisticState {\r\n \r\n}\r\n \r\nclass CampaignStatistic extends React.Component<CampaignStatisticProps, CampaignStatisticState> {\r\n\r\n constructor(props: CampaignStatisticProps) {\r\n super(props);\r\n }\r\n \r\n render() { \r\n return (\r\n <div className=\"campaign-info\">\r\n <div className=\"campaign-info__block\">\r\n <div className=\"campaign-info__elem all\">\r\n <SvgSelector title=\"campaign-all\" />\r\n <p> <b>{this.props.all}</b> Campaign Total </p>\r\n </div>\r\n <div className=\"campaign-info__elem live\">\r\n <SvgSelector title=\"campaign-live\" />\r\n <p> <b>{this.props.live}</b>Campaign Live </p>\r\n </div>\r\n </div>\r\n <div className=\"campaign-info__block\">\r\n <div className=\"campaign-info__elem all\">\r\n {/* <SvgSelector title=\"campaign-all\" /> */}\r\n <p> <b>{this.props.draft}</b> Campaign Draft </p>\r\n </div>\r\n <div className=\"campaign-info__elem live\">\r\n {/* <SvgSelector title=\"campaign-live\" /> */}\r\n <p> <b>{this.props.scheduled}</b>Campaign Scheduled </p>\r\n </div>\r\n </div>\r\n <div className=\"campaign-info__block\">\r\n <div className=\"campaign-info__elem pause\">\r\n <SvgSelector title=\"campaign-pause\" />\r\n <p> <b>{this.props.pause}</b>Campaign Paused </p>\r\n </div>\r\n <div className=\"campaign-info__elem end\">\r\n <SvgSelector title=\"campaign-end\" />\r\n <p> <b>{this.props.end}</b> Campaign Expired </p>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n \r\nexport default CampaignStatistic;","export default __webpack_public_path__ + \"static/media/dashboard_icon.3da18a45.svg\";","export default __webpack_public_path__ + \"static/media/campaigns_icon.f325e865.svg\";","export default __webpack_public_path__ + \"static/media/channels_icon.e093fc84.svg\";","export default __webpack_public_path__ + \"static/media/media_icon.3e732dd8.svg\";","export default __webpack_public_path__ + \"static/media/player_icon.b05f797b.svg\";","export default __webpack_public_path__ + \"static/media/reports_icon.b4204183.svg\";","export default __webpack_public_path__ + \"static/media/calendar_icon.3c5e3bf1.svg\";","export default __webpack_public_path__ + \"static/media/user_icon.63e8d0eb.svg\";","export default __webpack_public_path__ + \"static/media/mosaic_icon.c28511bf.svg\";","export default __webpack_public_path__ + \"static/media/settings_icon.502774e1.svg\";","export default __webpack_public_path__ + \"static/media/monitoring_icon.1e8e119e.svg\";","export default __webpack_public_path__ + \"static/media/notification_icon.bf28945e.svg\";","export default __webpack_public_path__ + \"static/media/logout_icon.e0321be5.svg\";","import { NewAlertMessage } from \"../hooks/useSystemAlerts\";\r\nimport { ApiResponse, BaseResponse, BaseResponseWithData, baseUrl, GetParams, getWithAuth, getWithAuthAndParams, Guid, ListRespone, PaginationListRespone, postWithAuth } from \"./baseApi\";\r\n\r\nexport interface SystemAlertModel {\r\n id:Guid,\r\n dateTime: string,\r\n message: string,\r\n severity: SeverityType,\r\n isRead: boolean,\r\n group: AlertGroup,\r\n byUser: string,\r\n}\r\n\r\nexport enum AlertGroup {\r\n System = 0,\r\n User = 1,\r\n Campaign = 2,\r\n Site = 3\r\n}\r\n\r\nexport enum SeverityType {\r\n Info = 0,\r\n Warning = 1,\r\n Important = 2,\r\n}\r\n\r\nexport interface UnreadCountResponse {\r\n count:number,\r\n newMessages: NewAlertMessage []\r\n}\r\n\r\nexport const getSystemAlertsWithParams = async(page:number, severity: SeverityType, onlyUnready: boolean, searchString: string, alertGroup: AlertGroup | undefined) : Promise<ApiResponse<PaginationListRespone<SystemAlertModel>>> => {\r\n let params = new GetParams();\r\n params.Add(\"page\", page+'');\r\n params.Add(\"minimumSeverity\", severity+'');\r\n params.Add(\"onlyUnready\", onlyUnready+'')\r\n if (alertGroup != null) {\r\n params.Add(\"alertGroup\", alertGroup+'')\r\n }\r\n params.Add(\"searchString\", searchString)\r\n return await getWithAuthAndParams<PaginationListRespone<SystemAlertModel>>(`${baseUrl}alert`, params);\r\n}\r\n\r\nexport const getSystemAlertsUnreadCount = async() : Promise<ApiResponse<BaseResponseWithData<UnreadCountResponse>>> => {\r\n return await getWithAuth<BaseResponseWithData<UnreadCountResponse>>({ url: `${baseUrl}alert/count-unread`});\r\n}\r\n\r\nexport const updateSystemAlertStatus = async (id:Guid, request: {}) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<{}, BaseResponse>(`${baseUrl}alert/${id}/mark-as-read`, request)\r\n}\r\n\r\nexport const updateAllSystemAlertAsReaded = async (request: {}) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<{},BaseResponse>(`${baseUrl}alert/mark-as-read`, request)\r\n}","import React, { MouseEventHandler, useEffect, useState } from \"react\";\r\nimport { FunctionComponent } from \"react\";\r\nimport notificationIcon from \"../../images/icons/notification_icon.svg\";\r\nimport userIcon from \"../../images/icons/user_icon.svg\";\r\nimport settingsIcon from \"../../images/icons/settings_icon.svg\";\r\nimport logoutIcon from \"../../images/icons/logout_icon.svg\";\r\nimport \"./Header.css\";\r\nimport {Routes} from \"../../../constants/routes\"\r\nimport { RouteComponentProps, withRouter } from \"react-router\";\r\nimport { sunbScribeOnClick, unsubscribe } from \"../../../services/globalEventHandler\";\r\nimport { getUserData } from \"../../../api/authApi\";\r\n\r\ninterface HeaderProps extends RouteComponentProps {\r\n logOut: () => void\r\n}\r\n \r\nconst Header: FunctionComponent<HeaderProps> = (props: HeaderProps) => {\r\n let [userName, setUserName] = useState<string>();\r\n useEffect(()=>{\r\n let userData = getUserData();\r\n setUserName(userData.name);\r\n\r\n sunbScribeOnClick(()=>{\r\n setIsShowDropdown(false);\r\n }, \"header\")\r\n\r\n return ()=>{\r\n unsubscribe(\"header\");\r\n }\r\n },[])\r\n\r\n let [isShowDropdown, setIsShowDropdown] = useState<boolean>(false);\r\n\r\n \r\n const toggleDropdown : MouseEventHandler = (event: React.MouseEvent<Element, MouseEvent>) =>{\r\n event.stopPropagation();\r\n setIsShowDropdown((prev:boolean):boolean=>{\r\n return isShowDropdown = !prev;\r\n });\r\n }\r\n\r\n let dropClasses =\r\n isShowDropdown ? \r\n 'header__dropdown-user show' \r\n : 'header__dropdown-user'\r\n \r\n\r\n const goToHome = () => {\r\n props.history.push(Routes.Dashboard);\r\n }\r\n const goToUserSettings = () => {\r\n props.history.push(Routes.UserSettings);\r\n }\r\n\r\n const userData = getUserData();\r\n\r\n return <div className=\"header\">\r\n <div className=\"header__container container\">\r\n <a className=\"header__back-link\" onClick={() => goToHome()}>Back to Home</a>\r\n <div className=\"header__right-block\">\r\n <a className=\"header__notification\" href=\"\">\r\n <img src={notificationIcon} alt=\"\" />\r\n </a>\r\n <div role=\"button\" className=\"header__user\" onClick={toggleDropdown}>\r\n {userData.profilePicture ? <img className=\"header__user-avatar\" src={userData.profilePicture} alt=\"\" />: <img className=\"default-user\" src={userIcon} alt=\"\" />}\r\n {/* <img className=\"header__user-avatar\" src={userData.profilePicture} alt=\"\" /> */}\r\n <span className=\"header__user-name\">{userName}</span>\r\n <span className=\"deco-arrow-down\"></span>\r\n\r\n <div className={dropClasses}>\r\n <a className=\"header__dropdown-link\" onClick={()=> goToUserSettings()}> \r\n <img src={userIcon} alt=\"\" />\r\n <span>User Profile</span>\r\n </a>\r\n {/* <a className=\"header__dropdown-link\" onClick={()=> goToUserSettings()}>\r\n <img src={settingsIcon} alt=\"\" />\r\n <span>Settings</span>\r\n </a> */}\r\n <a className=\"header__dropdown-link\" onClick={props.logOut}>\r\n <img src={logoutIcon} alt=\"\" />\r\n <span>Log out</span>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n}\r\n \r\nexport default withRouter(Header);","import { createContext } from 'react';\r\nimport { create } from 'zustand'\r\nimport { getSystemAlertsUnreadCount, SeverityType } from '../api/alertsApi';\r\nimport { Guid } from '../api/baseApi';\r\n\r\n\r\ninterface CounterState {\r\n totalAlerts: number,\r\n messages: NewAlertMessage [],\r\n update: () => void,\r\n removeMessage: (id:Guid) => void,\r\n start: () => void,\r\n timer: NodeJS.Timer | null,\r\n pause: () => void,\r\n stop: () => void,\r\n isRunning: boolean,\r\n alreadyShowed: Guid[],\r\n onShow: (id:Guid)=>void,\r\n isShow: (id:Guid)=>boolean,\r\n resetIsShown: () => void,\r\n}\r\n\r\nexport interface NewAlertMessage {\r\n id: Guid,\r\n message: string, \r\n severity: SeverityType\r\n}\r\n\r\nexport const useAlertsCountStore = create<CounterState>((set, get) => ({\r\n totalAlerts: 0,\r\n messages: [],\r\n alreadyShowed: [],\r\n timer: null,\r\n isRunning: false,\r\n update: async () => { \r\n var totalAlerts = await getSystemAlertsUnreadCount();\r\n if(totalAlerts.type === \"succes\"){\r\n set({ \r\n totalAlerts: totalAlerts.data.data.count, \r\n messages:[...get().messages, ...totalAlerts.data.data.newMessages]\r\n })\r\n }\r\n \r\n },\r\n onShow: (id:Guid)=> {\r\n set({\r\n alreadyShowed: [...get().alreadyShowed, id]\r\n })\r\n },\r\n isShow: (id:Guid) => {\r\n return !get().alreadyShowed.some( it => it === id)\r\n },\r\n resetIsShown: () => {\r\n set({\r\n alreadyShowed: []\r\n })\r\n },\r\n removeMessage: (id: Guid) => {\r\n set({\r\n messages: get().messages.filter( it => it.id != id)\r\n })\r\n },\r\n start : () => { \r\n let state = get();\r\n set({ isRunning: true})\r\n\r\n if(!state.timer){\r\n let newTimer = setInterval(() => { if(get().isRunning){state.update()} }, 15000);\r\n get().update();\r\n set({timer: newTimer});\r\n }\r\n },\r\n pause: () => {set({ isRunning: false})},\r\n stop: () => {\r\n let currentTimer = get().timer;\r\n if(currentTimer){\r\n clearInterval(currentTimer)\r\n set({ isRunning: false, timer: null});\r\n }\r\n }\r\n}))\r\n","import { create } from \"zustand\";\r\n\r\ninterface ProgressState {\r\n progress: number,\r\n updateProgress: ( value: number) => void,\r\n resetProgress: () => void\r\n}\r\n\r\nexport const useProgressStore = create<ProgressState>((set) => ({\r\n progress: 0,\r\n updateProgress: (value) => {\r\n set({\r\n progress: value\r\n })\r\n },\r\n resetProgress: () => {\r\n set({\r\n progress: 0\r\n })\r\n }\r\n}))","import { useProgressStore } from \"../../../hooks/useProgress\"\r\n\r\nconst ProgressBarGlobal = () => {\r\n let progressStore = useProgressStore();\r\n return <>\r\n {!!progressStore.progress && <div className=\"global-progress\">\r\n <div className=\"current-progress\" style={{\"width\": `${progressStore.progress}%`}}></div>\r\n <span className=\"progress-text\">Upload in progress, please do not refresh the page</span>\r\n </div>}\r\n </>\r\n}\r\n\r\nexport default ProgressBarGlobal","import './InnerLayout.css'\r\nimport logo from './../../images/logo.png'\r\nimport dashboardIcon from './../../images/icons/dashboard_icon.svg';\r\nimport campaignsIcon from './../../images/icons/campaigns_icon.svg';\r\nimport channelsIcon from './../../images/icons/channels_icon.svg';\r\nimport meidiaIcon from './../../images/icons/media_icon.svg';\r\nimport playerIcon from './../../images/icons/player_icon.svg';\r\nimport reportsIcon from './../../images/icons/reports_icon.svg';\r\nimport calendarIcon from './../../images/icons/calendar_icon.svg';\r\nimport userIcon from './../../images/icons/user_icon.svg';\r\nimport mosaicIcon from './../../images/icons/mosaic_icon.svg';\r\nimport settingsIcon from \"../../images/icons/settings_icon.svg\";\r\nimport monitoringIcon from \"../../images/icons/monitoring_icon.svg\";\r\nimport { RouteComponentProps, withRouter } from 'react-router';\r\nimport Header from '../../components/header/Header';\r\nimport { fireBodyClick } from '../../../services/globalEventHandler';\r\nimport { currentUserHasPermission, Permission } from '../../../api/authApi';\r\nimport { NewAlertMessage, useAlertsCountStore } from '../../../hooks/useSystemAlerts';\r\nimport { useEffect } from 'react';\r\nimport { toast, ToastContainer } from 'react-toastify';\r\nimport { SeverityType } from '../../../api/alertsApi';\r\nimport { Routes } from '../../../constants/routes';\r\nimport { GlobalErrorModal } from '../../components/sideModal/Modal';\r\nimport ProgressBarGlobal from '../../components/progressBar/ProgressBarGlobal';\r\nimport SvgSelector from '../../components/svgSelector/SvgSelector';\r\n\r\n\r\n\r\nexport type NavigationTabs = \"dashboard\" |\r\n \"campaigns\" | \r\n \"channels\" | \r\n \"media\" | \r\n \"players\" |\r\n \"reports\" | \r\n 'priorityList' | \r\n 'users' | \r\n 'userSettings' | \r\n 'playNowList' | \r\n 'skins' | \r\n 'settings' | \r\n \"monitoring\" |\r\n 'tvGuide' |\r\n 'none';\r\n\r\ninterface InnerLayoutProps extends RouteComponentProps<any> {\r\n children? : JSX.Element,\r\n activeTab: NavigationTabs,\r\n logOut: () => void,\r\n toogleCollapse : () => void,\r\n isCollapsed: boolean,\r\n}\r\n\r\nconst InnerLayout = (props: InnerLayoutProps) => {\r\n\r\n let counter = useAlertsCountStore()\r\n\r\n useEffect(()=> {\r\n counter.start();\r\n counter.resetIsShown();\r\n return () => {\r\n counter.pause()\r\n }\r\n },[])\r\n\r\n useEffect(()=>{\r\n showToastNewMessages(counter.messages)\r\n },[counter.messages])\r\n\r\n const showToastNewMessages = ( newMessages: NewAlertMessage[]) => {\r\n newMessages.forEach( it => showToastBySeverityType(it))\r\n }\r\n\r\n const showToastBySeverityType = ( newMessage: NewAlertMessage) => {\r\n if(counter.isShow(newMessage.id)){\r\n switch (newMessage.severity) {\r\n case SeverityType.Info : {\r\n toast.info(newMessage.message, {\r\n onClick: () => {counter.removeMessage(newMessage.id)},\r\n onClose: () => {counter.removeMessage(newMessage.id)}\r\n });\r\n break;\r\n }\r\n case SeverityType.Warning : {\r\n toast.warning(newMessage.message,{\r\n onClick: () => {counter.removeMessage(newMessage.id)},\r\n onClose: () => {counter.removeMessage(newMessage.id)}\r\n });\r\n break;\r\n }\r\n case SeverityType.Important : {\r\n toast.error(newMessage.message, {\r\n onClick: () => {counter.removeMessage(newMessage.id)},\r\n onClose: () => {counter.removeMessage(newMessage.id)}\r\n });\r\n break;\r\n }\r\n }\r\n\r\n counter.onShow(newMessage.id)\r\n }\r\n }\r\n\r\n const getActiveTabIndex = (tab: NavigationTabs) => {\r\n switch(tab){\r\n case 'dashboard': return 1;\r\n case 'media' : return 2;\r\n case 'campaigns' : return 3;\r\n case 'channels' : return 4;\r\n case 'reports' : return 5;\r\n case 'priorityList': return 6;\r\n case 'users': return 7;\r\n case 'playNowList': return 8;\r\n case 'players' : return 9;\r\n case 'userSettings': return 10;\r\n case 'skins': return 11;\r\n case 'settings': return 12;\r\n case 'monitoring' : return 13;\r\n case 'tvGuide' : return 14;\r\n case 'none': return 0;\r\n }\r\n }\r\n\r\n const getNavigationItemDispayType = (index: number, activeIndex: number): DisplayType | undefined => {\r\n var diff = index - activeIndex;\r\n if(diff == -1) return \"overActive\";\r\n if(diff == 0) return \"active\";\r\n if(diff == 1) return \"underActive\";\r\n }\r\n\r\n const goTo = (tab : NavigationTabs) => {\r\n props.history.push(`/${tab}`);\r\n }\r\n\r\n const activeTabIndex = getActiveTabIndex(props.activeTab);\r\n const classMenu = `inner_layout_wrapper ${props.isCollapsed ? \"collapsed\" : \"\"}`\r\n return <div className={classMenu} onClick={fireBodyClick}>\r\n <div className=\"left_column_layout\">\r\n <div className=\"logo\">\r\n <img src={logo} />\r\n </div>\r\n <div className=\"nav-items-wrapper\">\r\n <EmptyNavigationElement displayType={getNavigationItemDispayType(0, activeTabIndex)}/>\r\n <NavigationElement permission={Permission.Dashboard} text=\"Dashboard\" icon={dashboardIcon} displayType={getNavigationItemDispayType(1, activeTabIndex)} onClick={() => goTo('dashboard')}/>\r\n <NavigationElement permission={Permission.Campaigns} text=\"Campaigns\" icon={campaignsIcon} displayType={getNavigationItemDispayType(3, activeTabIndex)} onClick={() => goTo('campaigns')}/>\r\n <NavigationElement permission={Permission.Media} text=\"Media\" icon={meidiaIcon} displayType={getNavigationItemDispayType(2, activeTabIndex)} onClick={() => goTo('media')}/>\r\n <NavigationElement permission={Permission.Channels} text=\"Networks\" icon={channelsIcon} displayType={getNavigationItemDispayType(4, activeTabIndex)} onClick={() => goTo('channels')}/>\r\n <NavigationElement permission={Permission.PriorityList} text=\"Streaming\" icon={calendarIcon} displayType={getNavigationItemDispayType(6, activeTabIndex)} onClick={() => goTo('priorityList')}/>\r\n <NavigationElement permission={Permission.PlayNowList} text=\"Play Now\" icon={calendarIcon} displayType={getNavigationItemDispayType(8, activeTabIndex)} onClick={() => goTo('playNowList')}/>\r\n <NavigationElement permission={Permission.MosaicScreen} text=\"Skins\" icon={mosaicIcon} displayType={getNavigationItemDispayType(11, activeTabIndex)} onClick={() => goTo('skins')}/>\r\n <NavigationElement permission={Permission.Players} text=\"Players\" icon={playerIcon} displayType={getNavigationItemDispayType(9, activeTabIndex)} onClick={() => goTo('players')}/>\r\n <NavigationElement permission={Permission.Reports} text=\"Reports\" icon={reportsIcon} displayType={getNavigationItemDispayType(5, activeTabIndex)} onClick={() => goTo('reports')}/>\r\n <NavigationElement permission={Permission.PriorityList} text=\"TV Guide\" icon={monitoringIcon} displayType={getNavigationItemDispayType(14, activeTabIndex)} onClick={() => goTo('tvGuide')}/>\r\n <NavigationElement permission={Permission.Players} text=\"Monitoring\" icon={monitoringIcon} displayType={getNavigationItemDispayType(13, activeTabIndex)} onClick={() => goTo('monitoring')}/>\r\n <NavigationElement permission={Permission.Settings} text=\"Settings\" tooltip={counter.totalAlerts} icon={settingsIcon} displayType={getNavigationItemDispayType(12, activeTabIndex)} onClick={() => goTo('settings')}/>\r\n <NavigationElement permission={Permission.Users} text=\"Users\" icon={userIcon} displayType={getNavigationItemDispayType(7, activeTabIndex)} onClick={() => goTo('users')}/>\r\n <EmptyNavigationElement displayType={getNavigationItemDispayType(12, activeTabIndex)} />\r\n </div>\r\n\r\n <div className=\"collapse-position\">\r\n <a href={Routes.ChangeLog} className='version'><span>Update date:</span> 04.02.2024</a>\r\n <button className=\"collapse-button\" onClick={props.toogleCollapse}> \r\n <span className=\"collapse-icon\">❰❰</span> \r\n <span className=\"collapse-text\">Collapse</span>\r\n </button>\r\n </div>\r\n </div>\r\n <div className=\"right_column_layout\">\r\n <Header logOut={props.logOut}/>\r\n <div className=\"container\">\r\n {props.children}\r\n </div> \r\n\r\n <ToastContainer \r\n autoClose={false}\r\n newestOnTop\r\n closeOnClick\r\n theme=\"colored\"\r\n /> \r\n\r\n <ProgressBarGlobal />\r\n <GlobalErrorModal /> \r\n </div>\r\n </div>\r\n}\r\n\r\ntype DisplayType = \"active\" | \"overActive\" | \"underActive\";\r\n\r\ntype NavigationElementProps = \r\n{\r\n text : string;\r\n icon : string;\r\n tooltip? : number,\r\n displayType? : DisplayType;\r\n onClick: () => void;\r\n permission: Permission;\r\n}\r\n\r\n\r\n\r\nconst NavigationElement = (props : NavigationElementProps) => {\r\n\r\n if(!currentUserHasPermission(props.permission)){\r\n return <></>;\r\n }\r\n const className = `navigation_menu_item ${props.displayType}`; \r\n \r\n\r\n if(props.displayType == \"active\"){\r\n return<>\r\n <div className=\"nav-active-background\" onClick={props.onClick}>\r\n <div className={className}>\r\n <img src={props.icon}></img><span className=\"nav-text\"> <>\r\n {props.text}  \r\n {!!props.tooltip && props.text === \"Settings\" ? <span className='alert-tooltip'>{props.tooltip}</span> : null}\r\n </>\r\n </span>\r\n <span className=\"deco-active-top\"><span></span></span>\r\n <span className=\"deco-active-bottom\"><span></span></span>\r\n </div> \r\n </div> \r\n </>\r\n }\r\n else{\r\n return<>\r\n <div className={className} onClick={props.onClick}>\r\n <img src={props.icon}></img><span className=\"nav-text\"> <>\r\n {props.text}  \r\n {!!props.tooltip ? <span className='alert-tooltip'>{props.tooltip}</span> : null}\r\n </>\r\n </span>\r\n </div> \r\n </>\r\n }\r\n \r\n}\r\n\r\ntype EmptyNavigationElementProps = {\r\n displayType? : DisplayType;\r\n}\r\n\r\nfunction EmptyNavigationElement(props : EmptyNavigationElementProps){\r\n const className = `empty_navigation_menu_item ${props.displayType}`; \r\n return <div className={className}></div>\r\n}\r\n\r\nexport default withRouter(InnerLayout)","import axios from \"axios\";\r\nimport { getToken } from \"./authApi\";\r\nimport {ApiResponse, BaseCreateResponse, BaseInfo, BaseInfoList, BaseResponse, baseUrl, deleteWithAuth, GetParams, getWithAuth, getWithAuthAndParams, Guid, ListRespone, patchWithAuth, postWithAuth} from \"./baseApi\";\r\nimport { BaseChannelModel, SiteNestedPlaylistForCampaign } from \"./channelsApi\";\r\nimport { Client, CreateClientRequest } from \"./clientApi\";\r\nimport { MediaType, MediaVastRequest, MediaVastResponse } from \"./mediaApi\";\r\n\r\n\r\nexport type CampaingListModel = {\r\n id : string,\r\n name : string,\r\n campaignId: string | null,\r\n status: CampaignStatus,\r\n periods: CampaignPeriod[],\r\n client : Client,\r\n playLists: SiteNestedPlaylistForCampaign[]\r\n tags: BaseInfo[],\r\n isLockedFromDeleting: boolean\r\n}\r\n\r\nexport type CampaignPeriod = {\r\n startDate: string,\r\n endDate: string\r\n}\r\n\r\n\r\nexport type GetCampaignResponse = {\r\n campaigns : CampaingListModel[]\r\n}\r\n\r\n\r\nexport interface CreateCampaignRequest{\r\n name : string,\r\n campaignId: string | null,\r\n clientId: string,\r\n periods : CampaignPeriod[],\r\n playListIds: Guid[],\r\n tagIds: Guid[],\r\n}\r\n\r\nexport interface UpdateCampaignRequest extends CreateCampaignRequest{\r\n id : Guid\r\n}\r\n\r\nexport type CreateCampaignResponse = {\r\n id : string,\r\n}\r\n\r\nexport type GetCampaignMediaResponse = {\r\n media : CampaignMediaItem[]\r\n}\r\n\r\nexport type CampaignMediaItem = {\r\n id : string,\r\n mediaId : string,\r\n name : string,\r\n thumbnailUrl : string,\r\n mediaType : MediaType,\r\n size : number,\r\n durationMs : number,\r\n deleteDate: string,\r\n isPaused: boolean,\r\n schedule: CampaignMediaScheduleResponse[]\r\n}\r\n\r\nexport type AddCampaignMediaRequest = {\r\n campaignId: string,\r\n mediaIds: string[]\r\n}\r\n\r\nexport type AddCampaignMediaResponse = {\r\n}\r\n\r\nexport enum CampaignStatus{\r\n Draft = 1,\r\n Scheduled = 2,\r\n Active = 3,\r\n Expired = 4,\r\n Paused = 5,\r\n}\r\n\r\nexport type StopPlayRequest = {\r\n campaignId : Guid\r\n}\r\n\r\nexport type ChangeStatusCampaignMediaRequest = {\r\n campaignMediaId: Guid\r\n}\r\n\r\nexport interface CampaignMediaScheduleRequest {\r\n name: string,\r\n start: string,\r\n end: string,\r\n startTime: string,\r\n endTime: string\r\n}\r\n\r\nexport interface CampaignMediaScheduleResponse extends CampaignMediaScheduleRequest {\r\n id: Guid\r\n}\r\n\r\nexport const getCampaigns = async() : Promise<ApiResponse<GetCampaignResponse>> => {\r\n return await getWithAuth<GetCampaignResponse>({url : `${baseUrl}campaign`});\r\n}\r\n\r\nexport const getCampaignsBase = async() : Promise<ApiResponse<BaseInfoList>> => {\r\n return await getWithAuth<BaseInfoList>({url : `${baseUrl}campaign/base`});\r\n}\r\n\r\nexport const getCampaignsArchived = async() : Promise<ApiResponse<GetCampaignResponse>> => {\r\n return await getWithAuth<GetCampaignResponse>({url : `${baseUrl}campaign/archived`});\r\n}\r\n\r\nexport const createCampaign = async(request : CreateCampaignRequest) : Promise<ApiResponse<CreateCampaignResponse>> => {\r\n return await postWithAuth<CreateClientRequest, CreateCampaignResponse>(`${baseUrl}campaign`, request);\r\n}\r\n\r\nexport const updateCampaign = async(request : UpdateCampaignRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<UpdateCampaignRequest, BaseResponse>(`${baseUrl}campaign`, request);\r\n}\r\n\r\nexport const getCampaignMedia = async(id : string) : Promise<ApiResponse<GetCampaignMediaResponse>> => {\r\n var params = new GetParams();\r\n params.Add(\"id\", id);\r\n return await getWithAuthAndParams<GetCampaignMediaResponse>(`${baseUrl}campaign/media`, params);\r\n}\r\n\r\nexport const addCampaignMedia = async(request : AddCampaignMediaRequest) : Promise<ApiResponse<AddCampaignMediaResponse>> => {\r\n return await postWithAuth<AddCampaignMediaRequest, AddCampaignMediaResponse>(`${baseUrl}campaign/media`, request);\r\n}\r\n\r\nexport const pauseCampaign = async(request : StopPlayRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<StopPlayRequest, BaseResponse>(`${baseUrl}campaign/pause`, request);\r\n}\r\n\r\nexport const publishCampaign = async(request : StopPlayRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<StopPlayRequest, BaseResponse>(`${baseUrl}campaign/publish`, request);\r\n}\r\n\r\nexport const deleteCampaign = async(id: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}campaign`, id);\r\n}\r\n\r\nexport const deleteCampaignMedia = async(id: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}campaign/media`, id);\r\n}\r\n\r\nexport const pauseCampaignMedia = async(request: ChangeStatusCampaignMediaRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<ChangeStatusCampaignMediaRequest, BaseResponse>(`${baseUrl}campaign/media/pause`, request);\r\n}\r\n\r\nexport const playCampaignMedia = async(request: ChangeStatusCampaignMediaRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<ChangeStatusCampaignMediaRequest, BaseResponse>(`${baseUrl}campaign/media/play`, request);\r\n}\r\n\r\nexport const uploadMediaForCampaign = async (formData: any, camapignId: Guid, setCurrentProgress?:(progress: number)=>void) : Promise<\"ok\" | \"error\"> => {\r\n try {\r\n await axios.post(`${baseUrl}campaign/${camapignId}/media/upload`, formData, {\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n 'Authorization' : getToken()\r\n }, \r\n onUploadProgress: (progressEvent:any) => {\r\n let progress = Math.round(\r\n (progressEvent.loaded / progressEvent.total) * 100\r\n );\r\n setCurrentProgress && setCurrentProgress(progress);\r\n }\r\n });\r\n } catch (error) {\r\n setCurrentProgress && setCurrentProgress(0);\r\n }\r\n\r\n return \"ok\"\r\n}\r\n\r\nexport const postMediaCampaignVast = async (request: MediaVastRequest, camapignId: Guid) :Promise<ApiResponse<MediaVastResponse>> => {\r\n return await postWithAuth<MediaVastRequest, MediaVastResponse>(`${baseUrl}campaign/${camapignId}/media/vasturl`, request);\r\n}\r\n\r\nexport const getCampaignMediaSchedule = async (id: Guid, mediaId: Guid): Promise<ApiResponse<ListRespone<CampaignMediaScheduleResponse>>> => {\r\n return await getWithAuth<ListRespone<CampaignMediaScheduleResponse>>({url : `${baseUrl}campaign/${id}/media/${mediaId}/schedule`});\r\n}\r\n\r\nexport const postCampaignMediaSchedulePeriod = async (request: CampaignMediaScheduleRequest, id:Guid, mediaId: Guid): Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<CampaignMediaScheduleRequest,BaseCreateResponse>(`${baseUrl}campaign/${id}/media/${mediaId}/schedule`, request);\r\n}\r\n\r\nexport const deleteCampaignMediaSchedulePeriod = async (id: Guid, mediaId:Guid, scheduleId:Guid):Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}campaign/${id}/media/${mediaId}/schedule`, scheduleId);\r\n}\r\n\r\nexport const postCampaignLock = async (id:Guid): Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<{},BaseCreateResponse>(`${baseUrl}campaign/${id}/lock-deleting`, {});\r\n}\r\n\r\nexport const postCampaignUnlock = async (id:Guid): Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<{},BaseCreateResponse>(`${baseUrl}campaign/${id}/unlock-deleting`, {});\r\n}\r\n","import { ApiResponse, baseUrl, getWithAuth, Guid } from \"./baseApi\";\r\nimport { CampaignPeriod, CampaignStatus } from \"./campaingsApi\";\r\n\r\ntype DashboardDataResponse = {\r\n data: {\r\n channels: DashboardResponse[],\r\n campaignsStatistic: Statistic,\r\n }\r\n ok:\"string\"\r\n}\r\n\r\nexport type CampaignsStatistic = {\r\n campaignsStatistic: Statistic\r\n}\r\n\r\nexport type Statistic = {\r\n total: number,\r\n active: number,\r\n expired: number,\r\n scheduled: number,\r\n draft: number,\r\n paused: number\r\n}\r\n\r\nexport type DashboardData ={\r\n channels: DashboardResponse[]\r\n}\r\n\r\nexport type DashboardResponse ={\r\n channel: string,\r\n channelId: Guid,\r\n campaigns: Campaign[],\r\n}\r\n\r\ntype Campaign = {\r\n campaign: string,\r\n channelId: Guid,\r\n periods: CampaignPeriod []\r\n status: CampaignStatus\r\n}\r\n\r\nexport const getDashboardDiagramItems = async ():Promise<ApiResponse<DashboardDataResponse>> => {\r\n return await getWithAuth<DashboardDataResponse>({url: `${baseUrl}dashboard`});\r\n}\r\n","import { type } from \"os\";\r\nimport { ApiResponse, BaseCreateResponse, BaseInfo, BaseResponse, BaseResponseWithData, baseUrl, deleteWithAuth, EmptyRequest, GetParams, getWithAuth, getWithAuthAndParams, Guid, ListRespone, ListResponeWithHash, patchWithAuth, postWithAuth } from \"./baseApi\";\r\nimport { CampaignStatus } from \"./campaingsApi\";\r\nimport { MediaContentType, MediaType } from \"./mediaApi\";\r\n\r\nexport enum DayOfWeek {\r\n Sunday,\r\n Monday,\r\n Tuesday,\r\n Wednesday,\r\n Thursday,\r\n Friday,\r\n Saturday,\r\n}\r\n\r\nexport enum TestEnum { One }\r\n\r\nexport type BaseChannelModel = {\r\n id: Guid,\r\n name: string\r\n}\r\n\r\nexport type Channel = {\r\n id: Guid,\r\n name: string,\r\n mediaItems: number,\r\n durationMs: number,\r\n playlistsCount: number\r\n playersIds: string[],\r\n timeUpdate: string,\r\n dayOfUpdate: string,\r\n playInRandomOrder: boolean\r\n}\r\n\r\nexport type TimeSlotModel = {\r\n id: Guid,\r\n dayOfWeek : DayOfWeek,\r\n hour : number,\r\n minute: number\r\n}\r\n\r\nexport type EnableSlotRequest = {\r\n dayOfWeek : DayOfWeek,\r\n hour : number,\r\n minute: number\r\n}\r\n\r\nexport type EnableRangeOfTimeSlots = {\r\n timeslots: EnableSlotRequest[]\r\n}\r\n\r\nexport type CreateChannelRequest = {\r\n name: string,\r\n playerIds: string[],\r\n timeOfUpdate?: string,\r\n dayOfUpdate: number | null,\r\n}\r\nexport type CreateChannelResponse = {}\r\n\r\nexport type UpdateChannelRequest = CreateChannelRequest & {id : string};\r\n\r\nexport type UpdateChannelResponse = {};\r\n\r\nexport type ChannelPlayerModel = {\r\n name: string,\r\n location: string,\r\n lastSeen: string\r\n id: Guid,\r\n tags: {id: Guid, name: string}[]\r\n}\r\n\r\nexport type ChannelMediaModel = {\r\n id: Guid,\r\n name: string,\r\n campaignName: string,\r\n mediaType: MediaType,\r\n order: number,\r\n previewUrl: string,\r\n durationMs: number,\r\n isPaused: boolean,\r\n isExcluded: boolean,\r\n campaignStatus: CampaignStatus,\r\n isPausedInCampaign: boolean,\r\n isTriggeringSkin: boolean,\r\n url: string,\r\n contentType: MediaContentType,\r\n tags: BaseInfo[]\r\n}\r\n\r\nexport type ReorderItemPair = {\r\n from: Guid;\r\n to: Guid\r\n}\r\n\r\nexport type ReorderChannelMediaRequest = {\r\n reorderItems: ReorderItemPair[]\r\n}\r\n\r\nexport type ChannelStream = {\r\n id: Guid,\r\n name: string,\r\n startTime: string,\r\n endTime: string,\r\n isTriggeringSkin: boolean,\r\n tvChannelId: Guid | null,\r\n tvChannelName: string,\r\n}\r\n\r\nexport type CreateChannelStreamRequest = {\r\n name: string,\r\n startTime: string,\r\n endTime: string,\r\n tvChannelId: Guid | null,\r\n}\r\n\r\nexport interface SiteNestedPlayList {\r\n id: Guid,\r\n name: string,\r\n order: number,\r\n useRandomOrder: boolean\r\n}\r\n\r\nexport interface CreateSiteNestedPlayListRequest {\r\n name: string,\r\n useRandomOrder: boolean\r\n}\r\n\r\nexport interface UpdateSiteNestedPlayListRequest {\r\n name: string,\r\n useRandomOrder: boolean\r\n}\r\n\r\nexport interface SiteNestedPlaylistForCampaign {\r\n playListId: Guid,\r\n siteName: string,\r\n playListName: string\r\n}\r\n\r\nexport type UpdatePlaylistRandomOrderRequest = {\r\n useRandom : boolean\r\n}\r\n\r\nexport type LocalFile = {\r\n id:Guid,\r\n name: string,\r\n path: string,\r\n startTime: string,\r\n endTime: string,\r\n subtitlesDelayMs: number\r\n}\r\n\r\nexport type LocalFileRequest = Omit<LocalFile, \"id\">\r\n\r\nexport interface NestedPlaylistMediaLiveStatistic {\r\n scheduled: MediaLiveStatistic\r\n live: MediaLiveStatistic\r\n}\r\n \r\nexport interface MediaLiveStatistic {\r\n campaignsDurationMs: number\r\n campaignsPercentage: number\r\n siteContentDurationMs: number\r\n siteContentPercentage: number\r\n inhouseContentDurationMs: number\r\n inhouseContentPercentage: number\r\n othersDurationMs: number\r\n othersPercentage: number\r\n total: number\r\n}\r\n\r\nexport type GroupMedia = {\r\n id: Guid,\r\n name: string,\r\n type: number,\r\n singleMedia: ChannelMediaModel | null,\r\n groupMedia: ChannelMediaModel[] | null,\r\n durationScheduled: number,\r\n durationLive: number,\r\n}\r\n\r\nexport type ReorderedIds = {\r\n ids: Guid[],\r\n hash: number\r\n}\r\n\r\nexport type GroupForMediaRequest = {\r\n groupId: Guid | null,\r\n hash: number\r\n}\r\n\r\nexport type SetSpeedLocalfileRequest = {\r\n speed: number\r\n}\r\n\r\nexport type AllDaysStatistic = {\r\n days: DayStatistic[]\r\n}\r\n\r\nexport type DayStatistic = {\r\n date: string,\r\n statistic: NetworkStatisticInfo,\r\n isFromHistory: boolean\r\n}\r\n\r\nexport type NetworkStatisticInfo = {\r\n campaignsDurationMs: number,\r\n campaignsPercentage: number,\r\n siteContentDurationMs: number,\r\n siteContentPercentage: number,\r\n inhouseContentDurationMs: number,\r\n inhouseContentPercentage: number,\r\n othersDurationMs: number,\r\n othersPercentage: number,\r\n total: number\r\n}\r\n\r\nexport type StaisticRequest = {\r\n startDateString: string,\r\n endDateString: string,\r\n hour: string,\r\n isLive: boolean,\r\n tagIds: Guid[]\r\n}\r\n\r\nexport type HistoricStaisticRequest = {\r\n dateTimeString: string,\r\n isLive: boolean,\r\n tagIds: Guid[]\r\n}\r\n\r\nexport type HistoricView = {\r\n media: HistoricMedia[],\r\n forDateTime: string,\r\n isHistorian: boolean,\r\n statistic: NetworkStatisticInfo,\r\n}\r\n\r\nexport type HistoricMedia = {\r\n name: string,\r\n url:string,\r\n durationMs: number ,\r\n mediaType: MediaType\r\n}\r\n\r\nexport const createChannel = async(request : CreateChannelRequest) : Promise<ApiResponse<CreateChannelResponse>> => {\r\n return await postWithAuth<CreateChannelRequest, CreateChannelResponse>(`${baseUrl}channels`, request);\r\n}\r\n\r\nexport const updateChannel = async(request : UpdateChannelRequest) : Promise<ApiResponse<UpdateChannelResponse>> => {\r\n return await patchWithAuth<UpdateChannelRequest, UpdateChannelResponse>(`${baseUrl}channels`, request);\r\n}\r\n\r\nexport const getChannelById = async(id: Guid) : Promise<ApiResponse<Channel>> => {\r\n return await getWithAuth<Channel>({url: `${baseUrl}channels/${id}`});\r\n}\r\n\r\nexport const getChannels = async (campaignId?: Guid) : Promise<ApiResponse<ListRespone<Channel>>> => {\r\n const params = new GetParams();\r\n params.Add(\"full\", \"true\");\r\n if(campaignId) {\r\n params.Add(\"campaignId\", campaignId);\r\n }\r\n return await getWithAuthAndParams<ListRespone<Channel>>(`${baseUrl}channels`, params); \r\n}\r\n\r\nexport const getBaseChannels = async () : Promise<ApiResponse<ListRespone<BaseChannelModel>>> => {\r\n return await getWithAuth<ListRespone<BaseChannelModel>>({url: `${baseUrl}channels`}); \r\n}\r\n\r\nexport const getChannelsShort = async () : Promise<ApiResponse<ListRespone<BaseChannelModel>>> => {\r\n return await getWithAuth<ListRespone<BaseChannelModel>>({url: `${baseUrl}channels/short`}); \r\n}\r\n\r\nexport const getBaseChannelsForPriorityList = async () : Promise<ApiResponse<ListRespone<BaseChannelModel>>> => {\r\n const params = new GetParams();\r\n params.Add(\"onlyWithoutScheduledPriorityList\", \"true\");\r\n return await getWithAuthAndParams<ListRespone<BaseChannelModel>>(`${baseUrl}channels`, params); \r\n}\r\n\r\nexport const getChannelTimeSlots = async (id: Guid) : Promise<ApiResponse<ListRespone<TimeSlotModel>>> => {\r\n return await getWithAuth<ListRespone<TimeSlotModel>>({url: `${baseUrl}channels/${id}/timeslots`}); \r\n}\r\n\r\nexport const getChannelPlayers = async (id: Guid) : Promise<ApiResponse<ListRespone<ChannelPlayerModel>>> => {\r\n return await getWithAuth<ListRespone<ChannelPlayerModel>>({url: `${baseUrl}channels/${id}/players`}); \r\n}\r\n\r\nexport const enableRangeOfTimeSlots = async (timeSlots: EnableRangeOfTimeSlots, channelId: Guid) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<EnableRangeOfTimeSlots, BaseCreateResponse>(`${baseUrl}channels/${channelId}/timeslots/bulk`, timeSlots); \r\n}\r\n\r\nexport const enableTimeSlots = async (timeSlot: EnableSlotRequest, channelId: Guid) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<EnableSlotRequest, BaseCreateResponse>(`${baseUrl}channels/${channelId}/timeslots`, timeSlot); \r\n}\r\n\r\nexport const removeTimeSlots = async (channelId: Guid, timeSlotId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}channels/${channelId}/timeslots`, timeSlotId); \r\n}\r\n\r\nexport const enableSkinChannelStream = async (channelId: Guid, streamId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}channels/${channelId}/streams/${streamId}/enable-skin`, {}); \r\n}\r\n\r\nexport const disableSkinChannelStream = async (channelId: Guid, streamId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}channels/${channelId}/streams/${streamId}/disable-skin`, {}); \r\n}\r\n\r\n\r\n//stream\r\nexport const getChannelStreams = async (channelId: Guid) : Promise<ApiResponse<ListRespone<ChannelStream>>> => {\r\n return await getWithAuth<ListRespone<ChannelStream>>({url: `${baseUrl}channels/${channelId}/streams`}); \r\n}\r\n\r\nexport const createChannelStream = async (request: CreateChannelStreamRequest, channelId: Guid) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<CreateChannelStreamRequest, BaseCreateResponse>(`${baseUrl}channels/${channelId}/streams`, request); \r\n}\r\n\r\nexport const updateChannelStream = async (request: CreateChannelStreamRequest, streamId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<CreateChannelStreamRequest, BaseResponse>(`${baseUrl}channels/streams/${streamId}`, request); \r\n}\r\n\r\nexport const deleteChannelStream = async (streamId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseCreateResponse>(`${baseUrl}channels/streams`, streamId); \r\n}\r\n\r\nexport const deleteChannel = async (channelId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}channels`, channelId); \r\n}\r\n\r\n\r\n// ADD NESTED PLAYLIST\r\nexport const getSiteNestedPlayLists = async(campaignId: Guid) : Promise<ApiResponse<ListRespone<SiteNestedPlayList>>> => {\r\n return await getWithAuth<ListRespone<SiteNestedPlayList>>({url : `${baseUrl}channels/${campaignId}/nested-playlists`});\r\n}\r\n\r\nexport const createSiteNestedPlayList = async(siteId : Guid, request : CreateSiteNestedPlayListRequest) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<CreateSiteNestedPlayListRequest,BaseCreateResponse>(`${baseUrl}channels/${siteId}/nested-playlists`, request);\r\n}\r\n\r\nexport const updateSiteNestedPlayList = async(siteId : Guid, nestedPlayListId: Guid, request : UpdateSiteNestedPlayListRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<UpdateSiteNestedPlayListRequest,BaseResponse>(`${baseUrl}channels/${siteId}/nested-playlists/${nestedPlayListId}`, request);\r\n}\r\n\r\nexport const deleteSiteNestedPlayList = async (siteId : Guid, nestedPlaylistId: Guid) : Promise<ApiResponse<BaseResponse>> =>{\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}channels/${siteId}/nested-playlists`, nestedPlaylistId)\r\n}\r\n\r\nexport const getSiteNestedPlayListMedias = async(siteId : Guid, nestedPlaylistId: Guid) : Promise<ApiResponse<ListRespone<ChannelMediaModel>>> => {\r\n return await getWithAuth<ListRespone<ChannelMediaModel>>({url : `${baseUrl}channels/${siteId}/nested-playlists/${nestedPlaylistId}/media`});\r\n}\r\n\r\nexport const getSiteNestedPlayListMediaLiveStatistic = async(siteId : Guid, nestedPlaylistId: Guid, tagIds: Guid[]) : Promise<ApiResponse<BaseResponseWithData<NestedPlaylistMediaLiveStatistic>>> => {\r\n const params = new GetParams();\r\n tagIds.forEach( el => {\r\n params.Add(\"tagIds\", el);\r\n })\r\n return await getWithAuthAndParams<BaseResponseWithData<NestedPlaylistMediaLiveStatistic>>(`${baseUrl}channels/${siteId}/nested-playlists/${nestedPlaylistId}/live-statistic`, params);\r\n}\r\n\r\nexport const reorderNestedPlaylists = async (request: ReorderChannelMediaRequest, siteId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<ReorderChannelMediaRequest, BaseResponse>(`${baseUrl}channels/${siteId}/nested-playlists/order`, request); \r\n}\r\n\r\nexport const reorderNestedPlaylistMedia = async (request: ReorderChannelMediaRequest, siteId: Guid, nestedPlaylistId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<ReorderChannelMediaRequest, BaseResponse>(`${baseUrl}channels/${siteId}/nested-playlists/${nestedPlaylistId}/media/order`, request); \r\n}\r\n\r\nexport const playNestedPlaylistMedia = async (siteId: Guid, nestedPlaylistId: Guid, mediaId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}channels/${siteId}/nested-playlists/${nestedPlaylistId}/media/${mediaId}/play`, {}); \r\n}\r\n\r\nexport const pauseNestedPlaylistMedia = async (siteId: Guid, nestedPlaylistId: Guid, mediaId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}channels/${siteId}/nested-playlists/${nestedPlaylistId}/media/${mediaId}/pause`, {}); \r\n}\r\n\r\nexport const enableSkinNestedPlaylistMedia = async (siteId: Guid, nestedPlaylistId: Guid, mediaId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}channels/${siteId}/nested-playlists/${nestedPlaylistId}/media/${mediaId}/enable-skin`, {}); \r\n}\r\n\r\nexport const disableSkinNestedPlaylistMedia = async (siteId: Guid, nestedPlaylistId: Guid, mediaId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}channels/${siteId}/nested-playlists/${nestedPlaylistId}/media/${mediaId}/disable-skin`, {}); \r\n}\r\n\r\nexport const cloneNestedPlaylistMedia = async (siteId: Guid, nestedPlaylistId: Guid, mediaId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}channels/${siteId}/nested-playlists/${nestedPlaylistId}/media/${mediaId}/clone`, {}); \r\n}\r\n\r\nexport const getSiteNestedPlayListsForCampaign = async() : Promise<ApiResponse<ListRespone<SiteNestedPlaylistForCampaign>>> => {\r\n return await getWithAuth<ListRespone<SiteNestedPlaylistForCampaign>>({url : `${baseUrl}channels/nested-playlists/site`});\r\n}\r\n\r\nexport const enableSitePlaylistsRandomOrder = async(siteId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}channels/${siteId}/enable-random-order`, {});\r\n}\r\n\r\nexport const disableSitePlaylistsRandomOrder = async(siteId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}channels/${siteId}/disable-random-order`, {});\r\n}\r\n\r\n//Local files\r\nexport const getLocalFiles = async(siteId:Guid) : Promise<ApiResponse<ListRespone<LocalFile>>> => {\r\n return await getWithAuth<ListRespone<LocalFile>>({url : `${baseUrl}channels/${siteId}/localfiles`});\r\n}\r\n\r\nexport const createLocalFile = async(siteId : Guid, request : LocalFileRequest) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<LocalFileRequest,BaseCreateResponse>(`${baseUrl}channels/${siteId}/localfiles`, request);\r\n}\r\n\r\nexport const updateLocalFile = async(siteId : Guid, id: Guid, request : LocalFileRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<LocalFileRequest,BaseResponse>(`${baseUrl}channels/${siteId}/localfiles/${id}`, request);\r\n}\r\n\r\nexport const deleteLocalFile = async (siteId : Guid, id: Guid) : Promise<ApiResponse<BaseResponse>> =>{\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}channels/${siteId}/localfiles`, id)\r\n}\r\n\r\nexport const getGroupedMedia = async (siteId: Guid, nestedPlayListsId: Guid, tagIds: Guid[]) : Promise<ApiResponse<ListResponeWithHash<GroupMedia>>> =>{\r\n const params = new GetParams();\r\n tagIds.forEach( el => {\r\n params.Add(\"tagIds\", el);\r\n })\r\n return await getWithAuthAndParams<ListResponeWithHash<GroupMedia>>(`${baseUrl}channels/${siteId}/nested-playlists/${nestedPlayListsId}/grouped-media`, params)\r\n}\r\n\r\nexport const reorderGroupMedia = async (request: ReorderedIds, siteId: Guid, nestedPlaylistId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<ReorderedIds, BaseResponse>(`${baseUrl}channels/${siteId}/nested-playlists/${nestedPlaylistId}/grouped-media/reorder`, request); \r\n}\r\n\r\nexport const updateGroupForMedia = async (request: GroupForMediaRequest, siteId: Guid, nestedPlaylistId: Guid, mediaId:Guid) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<GroupForMediaRequest, BaseCreateResponse>(`${baseUrl}channels/${siteId}/nested-playlists/${nestedPlaylistId}/grouped-media/${mediaId}`, request); \r\n}\r\n\r\nexport const getGroupsForMedia = async (siteId: Guid, nestedPlayListsId: Guid) : Promise<ApiResponse<ListRespone<{id:Guid, name:string}>>> =>{\r\n return await getWithAuth<ListRespone<{id:Guid, name:string}>>({url: `${baseUrl}channels/${siteId}/nested-playlists/${nestedPlayListsId}/groups`})\r\n}\r\n\r\nexport const createGroupForMedia = async (request: {name:string}, siteId: Guid, nestedPlaylistId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<{name:string}, BaseResponse>(`${baseUrl}channels/${siteId}/nested-playlists/${nestedPlaylistId}/groups`, request); \r\n}\r\n\r\nexport const changeGroupName = async (request: {name:string}, groupId: Guid , siteId: Guid, nestedPlaylistId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<{name:string}, BaseResponse>(`${baseUrl}channels/${siteId}/nested-playlists/${nestedPlaylistId}/groups/${groupId}`, request); \r\n}\r\n\r\nexport const cloneGroupMedia = async (siteId: Guid, nestedPlaylistId: Guid, groupId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}channels/${siteId}/nested-playlists/${nestedPlaylistId}/groups/${groupId}/clone`, {}); \r\n}\r\n\r\nexport const removeGroupMedia = async (siteId : Guid, nestedPlaylistId: Guid, groupId: Guid) : Promise<ApiResponse<BaseResponse>> =>{\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}channels/${siteId}/nested-playlists/${nestedPlaylistId}/groups`, groupId)\r\n}\r\n\r\nexport const stopLocalFile = async (siteId: Guid, fileId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}channels/${siteId}/localfiles/${fileId}/stop`, {}); \r\n}\r\nexport const pauseLocalFile = async (siteId: Guid, fileId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}channels/${siteId}/localfiles/${fileId}/pause`, {}); \r\n}\r\nexport const playLocalFile = async (siteId: Guid, fileId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}channels/${siteId}/localfiles/${fileId}/play`, {}); \r\n}\r\nexport const restartLocalFile = async (siteId: Guid, fileId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}channels/${siteId}/localfiles/${fileId}/restart`, {}); \r\n}\r\nexport const jumpToLocalFile = async (siteId: Guid, fileId: Guid, timeCode: string) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}channels/${siteId}/localfiles/${fileId}/jump`, {timeCode: timeCode}); \r\n}\r\nexport const setSpeedLocalFile = async (siteId: Guid, fileId: Guid, request: SetSpeedLocalfileRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<SetSpeedLocalfileRequest, BaseResponse>(`${baseUrl}channels/${siteId}/localfiles/${fileId}/set-speed`, request); \r\n}\r\n\r\nexport const getDaysStatistic = async (siteId: Guid, nestedPlayListsId: Guid, request: StaisticRequest) : Promise<ApiResponse<BaseResponseWithData<AllDaysStatistic>>> =>{\r\n return await postWithAuth<StaisticRequest,BaseResponseWithData<AllDaysStatistic>>(`${baseUrl}channels/${siteId}/nested-playlists/${nestedPlayListsId}/days-statistic`, request)\r\n}\r\n\r\nexport const getHistoricView = async (siteId: Guid, nestedPlayListsId: Guid, request: HistoricStaisticRequest) : Promise<ApiResponse<BaseResponseWithData<HistoricView>>> =>{\r\n return await postWithAuth<HistoricStaisticRequest,BaseResponseWithData<HistoricView>>(`${baseUrl}channels/${siteId}/nested-playlists/${nestedPlayListsId}/historic-view`, request)\r\n}\r\n\r\n","import { FunctionComponent } from \"react\";\r\nimport \"./GlobalSpinner.css\"\r\n\r\ninterface GlobalSpinnerProps {\r\n isShow?: Boolean\r\n}\r\n\r\nconst GlobalSpinner: FunctionComponent<GlobalSpinnerProps> = (props) => {\r\n\r\n let {isShow} = props;\r\n \r\n return (\r\n <div className={`spinner-layout ${isShow ? 'show' : ''}`}>\r\n {isShow && <div className=\"lds-default\"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>}\r\n </div>\r\n );\r\n}\r\n\r\nexport default GlobalSpinner;","import { BlobServiceClient, ContainerClient } from \"@azure/storage-blob\";\r\nimport React, { MouseEventHandler } from \"react\";\r\nimport { RouteComponentProps, withRouter } from \"react-router\";\r\nimport { sunbScribeOnClick } from \"../../../services/globalEventHandler\";\r\nimport { Button } from \"../../components/Button\";\r\nimport CampaignStatistic from \"../../components/campaignStatistic/CampaignStatistic\";\r\nimport { SmallModal } from \"../../components/sideModal/Modal\";\r\nimport SvgSelector from \"../../components/svgSelector/SvgSelector\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport \"./Dashboard.css\";\r\nimport Timeline, { TodayMarker, TimelineMarkers} from 'react-calendar-timeline';\r\nimport 'react-calendar-timeline/lib/Timeline.css';\r\nimport moment from 'moment';\r\nimport { CampaignsStatistic, DashboardData, DashboardResponse, getDashboardDiagramItems, Statistic } from \"../../../api/dashboardApi\";\r\nimport { CampaignStatus } from \"../../../api/campaingsApi\";\r\nimport PlayerStatistic from \"../../components/playerStatistic/PlayerStatistic\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport { MultiValue } from \"react-select\";\r\nimport Select from \"react-select\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\n\r\n\r\nexport interface DashboardProps extends RouteComponentProps<any>\r\n{\r\n logOut : () => void;\r\n toogleCollapse : () => void;\r\n isCollapsed: boolean\r\n}\r\n\r\nexport type DashboardState = {\r\n i : number;\r\n file: any;\r\n showSmallModal: boolean;\r\n dashboardData?: {channels: DashboardResponse[]},\r\n statistic: Statistic,\r\n channelsForFilter: Option<Guid>[],\r\n selectedChannelsId: Guid[],\r\n campaignsForFilter: Option<Guid>[],\r\n selectedCampaignsName: Guid[],\r\n isLoading: boolean\r\n}\r\n\r\ntype Option<T> = { value: T, label: string} \r\n\r\nexport class Dashboard extends React.Component<DashboardProps, DashboardState> {\r\n constructor(props: DashboardProps) {\r\n super(props);\r\n this.state = { \r\n i : 1, \r\n file: null,\r\n showSmallModal: false,\r\n statistic: {\r\n total: 1,\r\n expired: 1,\r\n active: 1,\r\n paused: 1,\r\n draft: 1,\r\n scheduled: 1\r\n },\r\n channelsForFilter: [],\r\n selectedChannelsId: [],\r\n campaignsForFilter: [],\r\n selectedCampaignsName: [],\r\n isLoading: false,\r\n };\r\n } \r\n\r\n override async componentWillMount(){\r\n this.setState({isLoading:true});\r\n await Promise.all([this.updateDashboard()])\r\n this.setState({isLoading:false});\r\n }\r\n\r\n updateDashboard = async () => {\r\n let dashboardDiagramItemsResponse = await getDashboardDiagramItems();\r\n if( dashboardDiagramItemsResponse.type === \"succes\"){\r\n let channelsForFilter = dashboardDiagramItemsResponse.data.data.channels.map(it => {\r\n return {value: it.channelId, label: it.channel}\r\n })\r\n\r\n let campaignsArray:Option<Guid>[] = [];\r\n dashboardDiagramItemsResponse.data.data.channels.map(channel => channel.campaigns.map( (campaign, index) => {\r\n campaignsArray.push({value: `${campaign.channelId}-${index}`, label: campaign.campaign})\r\n }))\r\n\r\n this.setState({\r\n dashboardData: {channels :dashboardDiagramItemsResponse.data.data.channels},\r\n channelsForFilter: channelsForFilter,\r\n campaignsForFilter: campaignsArray,\r\n statistic: dashboardDiagramItemsResponse.data.data.campaignsStatistic\r\n });\r\n }\r\n }\r\n\r\n renderStatus = (status: CampaignStatus) => {\r\n switch(status){\r\n case CampaignStatus.Active : return '#1a8145';\r\n case CampaignStatus.Draft : return '#48A5FC';\r\n case CampaignStatus.Paused : return '#F43257';\r\n case CampaignStatus.Scheduled : return '#48A5FC';\r\n case CampaignStatus.Expired : return '#717c76';\r\n }\r\n }\r\n\r\n\r\n getGranttGroups = (items: DashboardData, selectedCampaigns:string[] = []) => {\r\n if(!!!items){\r\n return [];\r\n }\r\n\r\n if(selectedCampaigns.length != 0){\r\n let filtered = items.channels.filter( channel => channel.campaigns.some( campaign => selectedCampaigns.includes(campaign.campaign)));\r\n return filtered.map( it => {\r\n return {id: it.channelId, title: it.channel}\r\n })\r\n }\r\n\r\n return items.channels.map( it => {\r\n return {id: it.channelId, title: it.channel}\r\n })\r\n }\r\n\r\n getGranttItems = (items: DashboardData, selectedCampaigns:string[] = []) => {\r\n if(!!!items){\r\n return [];\r\n }\r\n let id = 0;\r\n let result = [];\r\n if(selectedCampaigns.length === 0){\r\n for(let channelIndex = 0; channelIndex < items.channels.length; channelIndex++){\r\n let channel = items.channels[channelIndex];\r\n for( let campaignIndex = 0; campaignIndex < channel.campaigns.length; campaignIndex++){\r\n let campaign = channel.campaigns[campaignIndex];\r\n for(let periodIndex = 0; periodIndex < campaign.periods.length; periodIndex++ ){\r\n let period = campaign.periods[periodIndex];\r\n let item = {\r\n id: campaign.campaign + id,\r\n group: campaign.channelId,\r\n title: campaign.campaign,\r\n start_time: moment(period.startDate),\r\n end_time: moment(period.endDate),\r\n itemProps: {\r\n style: {\r\n background: this.renderStatus(campaign.status),\r\n borderRadius: '10px',\r\n borderColor: this.renderStatus(campaign.status)\r\n }\r\n }\r\n }\r\n id++;\r\n result.push(item);\r\n }\r\n\r\n }\r\n }\r\n } else {\r\n for(let channelIndex = 0; channelIndex < items.channels.length; channelIndex++){\r\n let channel = items.channels[channelIndex];\r\n for( let campaignIndex = 0; campaignIndex < channel.campaigns.length; campaignIndex++){\r\n let campaign = channel.campaigns[campaignIndex];\r\n for(let periodIndex = 0; periodIndex < campaign.periods.length; periodIndex++ ){\r\n let period = campaign.periods[periodIndex];\r\n let item = {\r\n id: campaign.campaign + id,\r\n group: campaign.channelId,\r\n title: campaign.campaign,\r\n start_time: moment(period.startDate),\r\n end_time: moment(period.endDate),\r\n itemProps: {\r\n style: {\r\n background: this.renderStatus(campaign.status),\r\n borderRadius: '10px',\r\n borderColor: this.renderStatus(campaign.status)\r\n }\r\n }\r\n }\r\n if(this.state.selectedCampaignsName.includes(campaign.campaign)){\r\n id++;\r\n result.push(item);\r\n }\r\n }\r\n \r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n onChangeSelectedChannels = (values: MultiValue<Option<Guid>>) => {\r\n this.setState({selectedChannelsId: values.map(it => it.value)})\r\n }\r\n\r\n onChangeSelectedCampaigns = (values: MultiValue<Option<Guid>>) => {\r\n this.setState({selectedCampaignsName: values.map(it => it.label)})\r\n }\r\n\r\n getDashboardDataToDisplay = (items: DashboardData) =>{\r\n if(this.state.selectedChannelsId.length === 0){\r\n return items;\r\n }\r\n\r\n return { channels: items.channels.filter( channel => this.state.selectedChannelsId.includes(channel.channelId))}\r\n }\r\n\r\n render() {\r\n return <InnerLayout \r\n activeTab=\"dashboard\" \r\n logOut={this.props.logOut} \r\n toogleCollapse={this.props.toogleCollapse}\r\n isCollapsed={this.props.isCollapsed}\r\n >\r\n <>\r\n <div style={{\"height\": \"72px\"}}></div>\r\n <div className=\"filter__row\">\r\n <div className=\"filter__block\">\r\n <label>Networks</label>\r\n <Select \r\n options={this.state.channelsForFilter}\r\n isMulti\r\n classNamePrefix={`select`}\r\n onChange={this.onChangeSelectedChannels} \r\n /> \r\n </div>\r\n <div className=\"filter__block\">\r\n <label>Campaigns</label>\r\n <Select \r\n options={this.state.campaignsForFilter}\r\n isMulti\r\n classNamePrefix={`select`}\r\n onChange={this.onChangeSelectedCampaigns} \r\n /> \r\n </div>\r\n </div>\r\n <div className=\"timeline-wrap\">\r\n {this.state.dashboardData && <Timeline\r\n stackItems\r\n groups={this.getGranttGroups(this.getDashboardDataToDisplay(this.state.dashboardData), this.state.selectedCampaignsName)}\r\n items={this.getGranttItems(this.getDashboardDataToDisplay(this.state.dashboardData), this.state.selectedCampaignsName)}\r\n defaultTimeStart={moment().add(-10, 'day')}\r\n defaultTimeEnd={moment().add(20, 'day')}\r\n >\r\n <TimelineMarkers>\r\n <TodayMarker date={Date.now()} interval={2000} />\r\n </TimelineMarkers>\r\n </Timeline>\r\n }\r\n </div>\r\n <CampaignStatistic \r\n all={this.state.statistic.total} \r\n live={this.state.statistic.active} \r\n pause={this.state.statistic.paused} \r\n end={this.state.statistic.expired} \r\n draft={this.state.statistic.draft} \r\n scheduled={this.state.statistic.scheduled} \r\n />\r\n <GlobalSpinner isShow={this.state.isLoading} />\r\n </>\r\n </InnerLayout>\r\n }\r\n}\r\n\r\nexport default withRouter(Dashboard);\r\n","import axios from \"axios\";\r\nimport { getToken } from \"./authApi\";\r\nimport {ApiResponse, BaseInfoList, BaseResponse, BaseResponseWithData, baseUrl, deleteWithAuth, GetParams, getWithAuth, getWithAuthAndParams, Guid, ListRespone, PaginationListRespone, patchWithAuth, postWithAuth} from \"./baseApi\";\r\nimport { CampaingListModel } from \"./campaingsApi\";\r\nimport { useProgressStore } from \"../hooks/useProgress\";\r\n\r\nexport enum MediaType {\r\n Video = 0,\r\n Image = 1,\r\n VastUrl = 2,\r\n Youtube = 3,\r\n YoutubeLive = 4,\r\n WebPage = 6\r\n}\r\n\r\nexport enum MediaContentType {\r\n Ads = 0,\r\n ClientContent = 1,\r\n SelfContent = 2,\r\n Backup = 3\r\n}\r\n\r\nexport const mediaContentTypeOptions : MediaContentTypeOption[] = [\r\n {type: MediaContentType.Ads, name: \"Campaigns\"},\r\n {type: MediaContentType.ClientContent, name:\"Network Content\"},\r\n {type: MediaContentType.SelfContent, name: \"Inhouse Content\"},\r\n {type: MediaContentType.Backup, name: \"Others\"},\r\n]\r\n\r\nexport type MediaContentTypeOption = {\r\n type: MediaContentType,\r\n name: string\r\n}\r\n\r\nexport type MediaAnalyzeProfile = {\r\n requestedTime: string,\r\n lastUpdateTime: string,\r\n completeTime: string,\r\n status: MediaAnalyzeStatus,\r\n mediaInfoContainerKind: string,\r\n mediaInfoContainerDuration: number,\r\n mediaInfoContainerBitrate: number,\r\n mediaInfoContainerSize: number,\r\n audioCodec: string,\r\n audioChannels: number,\r\n audioChannelOrder: string,\r\n audioSampleRate: number,\r\n audioDuration: number,\r\n audioBitrate: number,\r\n videoCodec: string,\r\n videoFrameRate: number,\r\n videoHeight: number,\r\n videoWidth: number,\r\n videoDuration: number,\r\n videoBitrate: number,\r\n loudnessMeasured: number,\r\n loudnessRange: number,\r\n loudnessGatingMode: string,\r\n loudnessSamplePeak: number,\r\n loudnessTruePeak: number,\r\n jobId: string,\r\n dolbyOutputPath: string,\r\n}\r\n\r\nexport type MediaTranscode = {\r\n profileId: Guid,\r\n requestedTime: string,\r\n lastUpdateTime: string,\r\n completeTime: string,\r\n status: MediaAnalyzeStatus,\r\n profileName: string,\r\n canBeRequested: boolean,\r\n downloadLink: string\r\n}\r\n\r\nexport enum MediaAnalyzeStatus {\r\n Requested = 0,\r\n Posted = 1,\r\n Pending = 2,\r\n Running = 3,\r\n Success = 4,\r\n Failed = 5,\r\n Cancelled = 6,\r\n InternalError = 7,\r\n Complete = 8\r\n}\r\n\r\nexport type MediaModel = {\r\n id: string,\r\n name : string,\r\n mediaType: MediaType,\r\n uploadTime : string,\r\n sizeMb : number,\r\n // playouts: number,\r\n previewLink: string,\r\n campaigns: CampaingListModel[]\r\n durationMs: number,\r\n webVideoLink: string,\r\n isDeleted: boolean,\r\n url: string,\r\n vastUrl:string,\r\n contentType: MediaContentType,\r\n transcodeProfile: string,\r\n clockId: string\r\n}\r\n\r\nexport type YoutubeMediaRequest = {\r\n name : string,\r\n url: string,\r\n isLive: boolean,\r\n duration: number\r\n}\r\n\r\nexport type MediaListResponse = {\r\n medias : MediaModel[]\r\n}\r\n\r\nexport type MediaVastResponse = {\r\n\r\n}\r\n\r\nexport type MediaVastRequest = {\r\n name : string,\r\n url: string,\r\n contentType: MediaContentType | null,\r\n clockID: string\r\n}\r\n\r\nexport type UpdateMediaRequest = {\r\n newName : string,\r\n newDurationMs?: number,\r\n contentType: MediaContentType | null,\r\n clockID: string\r\n}\r\n\r\nexport type UpdateMediaResponse = {\r\n\r\n}\r\n\r\nexport type WebPageRequest = {\r\n name : string,\r\n url: string,\r\n contentType: MediaContentType,\r\n durationSeconds: number,\r\n clockID: string,\r\n}\r\n\r\nexport type MediaPlayout = {\r\n mediaId: Guid,\r\n count: number,\r\n mediaName: string\r\n}\r\n\r\nexport type MediaPlayoutRequest = {\r\n ids: Guid[],\r\n playerId: Guid | null\r\n}\r\n\r\nexport type MediaPaginationRequest = {\r\n campaignId: Guid[],\r\n searchString: string,\r\n startTime: string | null,\r\n endTime: string | null,\r\n itemsPerPage: number,\r\n pageNumber: number\r\n}\r\n\r\nexport const getMedia = async() : Promise<ApiResponse<MediaListResponse>> => {\r\n return await getWithAuth<MediaListResponse>({url : `${baseUrl}media`});\r\n}\r\n\r\nexport const getMediaBaseInfo = async() : Promise<ApiResponse<BaseInfoList>> => {\r\n return await getWithAuth<BaseInfoList>({url : `${baseUrl}media/base-info`});\r\n}\r\n\r\nexport const getMediaPlayout = async (request: MediaPlayoutRequest): Promise<ApiResponse<ListRespone<MediaPlayout>>> => {\r\n return await postWithAuth<MediaPlayoutRequest, ListRespone<MediaPlayout>>(`${baseUrl}media/playouts`, request);\r\n}\r\n\r\nexport const getMediaWithPagination = async (request: MediaPaginationRequest): Promise<ApiResponse<PaginationListRespone<MediaModel>>> => {\r\n return await postWithAuth<MediaPaginationRequest, PaginationListRespone<MediaModel>>(`${baseUrl}media/search`, request);\r\n}\r\n\r\nexport const getMediaById = async(id : Guid) : Promise<ApiResponse<BaseResponseWithData<MediaModel>>> => {\r\n return await getWithAuth({url : `${baseUrl}media/${id}`});\r\n}\r\n\r\nexport const uploadMedia = async (formData: any) : Promise<string> => {\r\n await axios.post(`${baseUrl}media/upload`, formData, {\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n 'Authorization' : getToken()\r\n }\r\n });\r\n\r\n return \"ok\"\r\n}\r\n\r\nexport const uploadMultipleMedia = async (formData: any, setCurrentProgress?:(progress: number)=>void) : Promise<\"ok\" | \"error\"> => {\r\n try {\r\n await axios.post(`${baseUrl}media/upload`, formData, {\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n 'Authorization' : getToken()\r\n }, \r\n onUploadProgress: (progressEvent:any) => {\r\n let progress = Math.round(\r\n (progressEvent.loaded / progressEvent.total) * 100\r\n );\r\n setCurrentProgress && setCurrentProgress(progress);\r\n }\r\n });\r\n } catch (error) {\r\n setCurrentProgress && setCurrentProgress(0);\r\n }\r\n\r\n return \"ok\"\r\n}\r\n\r\nexport const postMediaVast = async (request: MediaVastRequest) :Promise<ApiResponse<MediaVastResponse>> => {\r\n return await postWithAuth<MediaVastRequest, MediaVastResponse>(`${baseUrl}media/vast`, request);\r\n}\r\n\r\nexport const updateMedia = async (id: Guid | undefined, request: UpdateMediaRequest) :Promise<ApiResponse<UpdateMediaResponse>> => {\r\n return await patchWithAuth<UpdateMediaRequest, UpdateMediaResponse>(`${baseUrl}media/${id}`, request);\r\n}\r\n\r\nexport const updateMediaVast = async (id: Guid, request: MediaVastRequest) :Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<MediaVastRequest, BaseResponse>(`${baseUrl}media/vast/${id}`, request);\r\n}\r\n\r\nexport const deleteMedia = async (id: Guid) :Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}media`, id);\r\n}\r\n\r\nexport const postYoutubeMedia = async (request: YoutubeMediaRequest) :Promise<ApiResponse<{}>> => {\r\n return await postWithAuth<YoutubeMediaRequest, {}>(`${baseUrl}media/youtube`, request);\r\n}\r\n\r\nexport const getMediaAnalyzeProfile = async (id:Guid) : Promise<ApiResponse<BaseResponseWithData<MediaAnalyzeProfile>>> => {\r\n return await getWithAuth<BaseResponseWithData<MediaAnalyzeProfile>>({url : `${baseUrl}media/${id}/analyze`});\r\n}\r\n\r\nexport const getMediaTranscodes = async (id:Guid) : Promise<ApiResponse<ListRespone<MediaTranscode>>> => {\r\n return await getWithAuth<ListRespone<MediaTranscode>>({url : `${baseUrl}media/${id}/transcodes`});\r\n}\r\n\r\nexport const postMediaTranscodeRequest = async (id:Guid, profileId:Guid) :Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<{}, BaseResponse>(`${baseUrl}media/${id}/transcodes/${profileId}`, {});\r\n}\r\n\r\nexport const getIsUseOriginal = async (id:Guid) : Promise<ApiResponse<BaseResponseWithData<boolean>>> => {\r\n return await getWithAuth<BaseResponseWithData<boolean>>({url : `${baseUrl}media/${id}/isUseOriginal`});\r\n}\r\n\r\nexport const postUseOriginal = async (id:Guid) :Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<{}, BaseResponse>(`${baseUrl}media/${id}/userOriginal`, {});\r\n}\r\n\r\nexport const postUseTranscode = async (id:Guid) :Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<{}, BaseResponse>(`${baseUrl}media/${id}/useTranscoded`, {});\r\n}\r\n\r\nexport const postWebPage = async (request: WebPageRequest) :Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<WebPageRequest, BaseResponse>(`${baseUrl}media/web`, request);\r\n}\r\n\r\nexport const updateWebPage = async (id: Guid, request: WebPageRequest) :Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<WebPageRequest, BaseResponse>(`${baseUrl}media/web/${id}`, request);\r\n}\r\n","import { MediaType } from \"../api/mediaApi\";\r\n\r\nexport const addLeadingZero = (value : number, size : number) => {\r\n var valueString = value.toString();\r\n while (valueString.length < size) valueString = \"0\" + valueString;\r\n return valueString;\r\n}\r\n\r\nexport const formatDuration = (durationMs : number) => {\r\n var ms = durationMs % 1000;\r\n var totalSeconds = Math.floor(durationMs / 1000);\r\n var seconds = totalSeconds % 60;\r\n var minutes = Math.floor(totalSeconds / 60);\r\n\r\n return `${addLeadingZero(minutes, 2)}:${addLeadingZero(seconds, 2)}:${addLeadingZero(ms, 3)}`\r\n}\r\n\r\nexport const formatToPercent = (num: number, lengthAfterDot: number = 1) => {\r\n let percent = (num*100).toFixed(lengthAfterDot);\r\n if (percent.indexOf('.') !== -1) {\r\n percent = percent.replace(/0+$/, '');\r\n percent = percent.replace(/\\.$/, '');\r\n }\r\n return `${percent}%`\r\n}\r\n\r\nexport const formatDurationLong = (durationMs : number) => {\r\n var totalSeconds = Math.floor(durationMs / 1000);\r\n var seconds = totalSeconds % 60;\r\n var totalMinutes = Math.floor(totalSeconds / 60);\r\n var minutes = totalMinutes % 60;\r\n var hours = Math.floor(totalMinutes / 60); \r\n \r\n return `${addLeadingZero(hours, 2)}:${addLeadingZero(minutes, 2)}:${addLeadingZero(seconds, 2)}`\r\n}\r\n\r\nexport const converFromBytes = (bytes : number, to: 'KB' | 'MB' | 'GB') => {\r\n switch (to){\r\n case 'KB' : return bytes/1024.0;\r\n case 'MB' : return bytes/1024.0/1024.0;\r\n case 'GB' : return bytes/1024.0/1024.0/1024.0;\r\n }\r\n}\r\n\r\nexport const renderMediaType = (mediaType: MediaType) => {\r\n switch(mediaType){\r\n case MediaType.Image : return `Image`;\r\n case MediaType.Video : return `Video`;\r\n case MediaType.VastUrl : return \"VAST Url\";\r\n case MediaType.Youtube : return \"Youtube\";\r\n case MediaType.YoutubeLive : return \"Youtube Live\";\r\n }\r\n}\r\n\r\nexport enum DayOfWeek {\r\n Sunday = 0,\r\n Monday = 1,\r\n Tuesday = 2,\r\n Wednesday = 3,\r\n Thursday = 4,\r\n Friday = 5,\r\n Saturday = 6,\r\n}\r\n\r\nexport const getYoutubeImageUrlById = (url:string) => {\r\n if (url === \"\" || url === null) {\r\n return `https://img.youtube.com/vi/sddefault.jpg`\r\n }\r\n\r\n const urlObject = new URL(url);\r\n let urlOrigin = urlObject.origin;\r\n let urlPath = urlObject.pathname;\r\n\r\n if (urlOrigin.search('youtu.be') > -1) {\r\n return urlPath.substring(1);\r\n }\r\n\r\n if (urlPath.search('embed') > -1) {\r\n return urlPath.substring(7);\r\n }\r\n\r\n let previewYoutubeImageUrl = `https://img.youtube.com/vi/${urlObject.searchParams.get('v')}/sddefault.jpg`;\r\n \r\n return previewYoutubeImageUrl;\r\n}\r\n\r\nexport const sortByNameString = (a:string, b:string) => a.toLowerCase() < b.toLowerCase() ? -1 : 1\r\nexport const sortByNumber = (a:number, b:number) => a < b ? -1 : 1\r\n","import moment, { Moment } from \"moment\";\r\n\r\nexport function formatDate(dateString : string){ \r\n if(!dateString) return '';\r\n var date = new Date(dateString);\r\n return `${date.getDate()}/${date.getMonth()+1}/${date.getFullYear()}`;\r\n}\r\n\r\nexport function formatTime(dateString : string){ \r\n if(!dateString) return '';\r\n var date = new Date(dateString);\r\n var hours = date.getHours();\r\n var minutes = date.getMinutes();\r\n var ampm = hours >= 12 ? 'PM' : 'AM';\r\n hours = hours % 12;\r\n hours = hours ? hours : 12; // the hour '0' should be '12'\r\n var minutesStr = minutes < 10 ? '0'+minutes : minutes;\r\n return `${hours}:${minutesStr} ${ampm}`;\r\n}\r\n\r\nexport function formatTimeOnly(timeString: string){\r\n if(!timeString) return '';\r\n let [hours, minutes] = timeString.split(\":\");\r\n let hoursNumber = +hours % 12 ? +hours % 12 : 12;\r\n let ampm = +hours >= 12 ? 'PM' : 'AM';\r\n return `${hoursNumber}:${minutes} ${ampm}`\r\n}\r\n\r\nexport const formatDateTime = (dateString: string, format: string | undefined) =>{\r\n if(!dateString) return '';\r\n switch(format){\r\n case 'hh:mm tt' : return moment().format('hh:mm A');\r\n case 'HH:mm' : return moment().format('hh:mm');\r\n case 'HH:mm:ss' : return moment().format('hh:mm:ss');\r\n case 'hh:mm:ss tt' : return moment().format('hh:mm:ss A');\r\n case 'hh/mm/ss tt, dd/MM/yyyy' : return moment().format('hh/mm/ss A, DD/MM/YYYY');\r\n case 'f' : return moment().format('dddd, MMMM D, YYYY hh:mm A');\r\n case 'F' : return moment().format('dddd, MMMM D, YYYY hh:mm:ss A');\r\n case 'HH:mm:ss, dd.MM.yyyy' : return moment().format('HH:mm:ss, DD.MM.YYYY');\r\n }\r\n} \r\n\r\nexport const currentDateString = () => {\r\n const yourDate = new Date()\r\n return yourDate.toISOString().split('T')[0]; \r\n}\r\n\r\nexport const currentDateTimeString= () => {\r\n const now = new Date()\r\n return dateTimeString(now);\r\n}\r\n\r\nexport const currentDateTimeStringLocale= () => {\r\n const now = new Date();\r\n let newDate = new Date(now.getTime() - now.getTimezoneOffset()*60*1000);\r\n return dateTimeString(newDate);\r\n}\r\n\r\nexport const dateTimeString = (date: Date) => {\r\n return date.toISOString().slice(0,16);\r\n}\r\n\r\nexport const getDateBefore = (days: number) => {\r\n var now = new Date();\r\n return new Date(now.getTime() - (days * 24 * 60 * 60 * 1000));\r\n}\r\n\r\nexport const getDateBeforeLocale = (days: number) => {\r\n var now = new Date();\r\n return new Date(now.getTime() - (days * 24 * 60 * 60 * 1000) - now.getTimezoneOffset()*60*1000);\r\n}\r\n\r\nexport const convertUTCDateToLocalDate = (dateString: string) => {\r\n if(!dateString) return '';\r\n let date = new Date(dateString);\r\n let newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000);\r\n return `${newDate.getDate()}/${newDate.getMonth()+1}/${newDate.getFullYear()} : ${formatTime(newDate.toString())}`;\r\n}\r\n\r\nexport const convertUTCDateToLocalDateMMDDYY = (dateString: string) => {\r\n if(!dateString) return '';\r\n let date = new Date(dateString);\r\n let newDate = new Date(date.getTime() - date.getTimezoneOffset()*60*1000);\r\n return `${newDate.getMonth()+1}/${newDate.getDate()}/${newDate.getFullYear()} : ${formatTime(newDate.toString())}`;\r\n}\r\n\r\nexport const getPastDateByDaysAgo = (days:number, withTime: boolean = false) => {\r\n let dateTime = moment().subtract(days, 'days');\r\n if(withTime) {\r\n return dateTime.format('YYYY-MM-DDTHH:mm')\r\n }\r\n return dateTime.format('YYYY-MM-DD')\r\n}\r\n\r\nexport const areDatesEqual = (date1: Moment, date2: Moment) => date1.isSame(date2, 'day');\r\n\r\nexport const daysSinceStartOfMonth = () => {\r\n const today = new Date();\r\n return today.getDate() - 1;\r\n}\r\n\r\nexport const daysSinceLastMonday = () => {\r\n const today = new Date();\r\n const dayOfWeek = today.getDay();\r\n return (dayOfWeek + 6) % 7;\r\n}\r\n\r\nexport const getDaysInPreviousMonth = () => {\r\n return new Date(new Date().getFullYear(), new Date().getMonth(), 0).getDate();\r\n}\r\n\r\nexport const generateUniqueId = () => {\r\n return `${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;\r\n}\r\n\r\nexport const isFirstDateGreaterThanSecond = (date1: string, date2: string) => {\r\n return new Date(date1) > new Date(date2)\r\n}\r\n\r\nexport const formatMsToHHMMSS = (ms: number) => {\r\n const totalSeconds = Math.floor(ms / 1000);\r\n const hours = Math.floor(totalSeconds / 3600);\r\n const minutes = Math.floor((totalSeconds % 3600) / 60);\r\n const seconds = totalSeconds % 60;\r\n \r\n return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\r\n}\r\n","import { ApiResponse, BaseCreateResponse, BaseInfo, BaseResponse, baseUrl, deleteWithAuth, deleteWithBodyAndAuth, getWithAuth, Guid, ListRespone, postWithAuth } from \"./baseApi\"\r\n\r\n\r\n\r\nexport type CreateTagRequest = {\r\n name : string,\r\n}\r\n\r\nexport type TagManagmentGetRequest = {\r\n searchString: string,\r\n playerIds: Guid[],\r\n campaignIds: Guid[],\r\n streamIds: Guid[],\r\n playNowIds: Guid[]\r\n}\r\n\r\nexport type ExtendedBaseInfo = BaseInfo & {\r\n isAny?: boolean;\r\n}\r\n\r\nexport type TagManagmentProfile = {\r\n name:string,\r\n id:string,\r\n players: BaseInfo[],\r\n campaigns: BaseInfo[],\r\n includedStreams: ExtendedBaseInfo[],\r\n excludedStreams: BaseInfo[],\r\n includedPlayNows: ExtendedBaseInfo[],\r\n excludedPlayNows: BaseInfo[]\r\n}\r\n\r\nexport enum TagManagmentEntityType {\r\n Players = 1,\r\n Campaigns = 2,\r\n IncludedStreams = 3,\r\n ExcludedStreams = 4,\r\n IncludedPlayNows = 5,\r\n ExcludedPlayNows = 6\r\n}\r\n\r\nexport type TagManagmentEntityRequest = {\r\n entityType: TagManagmentEntityType,\r\n entityId: Guid,\r\n tagId: Guid\r\n}\r\n\r\nexport const getTags = async () : Promise<ApiResponse<ListRespone<BaseInfo>>> => {\r\n return await getWithAuth<ListRespone<BaseInfo>>({url : `${baseUrl}tag`});\r\n}\r\n\r\nexport const createTag = async (request : CreateTagRequest) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<CreateTagRequest,BaseCreateResponse>(`${baseUrl}tag`, request);\r\n}\r\n\r\nexport const getTagManagment = async (request : TagManagmentGetRequest) : Promise<ApiResponse<ListRespone<TagManagmentProfile>>> => {\r\n return await postWithAuth<TagManagmentGetRequest,ListRespone<TagManagmentProfile>>(`${baseUrl}tag/managment`, request);\r\n}\r\n\r\nexport const updateTag = async(id:Guid, request: CreateTagRequest) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<CreateTagRequest,BaseCreateResponse>(`${baseUrl}tag/${id}`, request)\r\n} \r\n\r\nexport const deleteTag = async (id: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}tag`, id)\r\n}\r\n\r\nexport const deleteTagManagmentEntity = async (request: TagManagmentEntityRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithBodyAndAuth<TagManagmentEntityRequest, BaseResponse>(`${baseUrl}tag/remove-tag`, request)\r\n}\r\n\r\nexport const addEntityForTag = async(request: TagManagmentEntityRequest) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<TagManagmentEntityRequest,BaseCreateResponse>(`${baseUrl}tag/add-tag`, request)\r\n} \r\n\r\nexport const getTagStreams = async () : Promise<ApiResponse<ListRespone<BaseInfo>>> => {\r\n return await getWithAuth<ListRespone<BaseInfo>>({url : `${baseUrl}tag/streams`});\r\n}","import { FC, FunctionComponent } from \"react\";\r\n\r\ninterface InternalFormRowProps extends FormRowProps {\r\n type: \"divider\" | \"none\" | \"horizontal\" | \"with-columns\"\r\n}\r\n\r\ninterface FormRowProps {\r\n\r\n}\r\n\r\nconst InternalFormRow: FunctionComponent<React.PropsWithChildren<InternalFormRowProps>> = (props) => {\r\n let { children, type} = props;\r\n\r\n let className = \"form-row\";\r\n\r\n switch(type){\r\n case \"divider\" : className += \" divider\"; break;\r\n case \"horizontal\" : className += \" horizontal\"; break;\r\n case \"with-columns\" : className += \" with-columns\"; break;\r\n }\r\n\r\n return ( \r\n <div className={className}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\ninterface FormInputProps {\r\n id: string,\r\n title: string,\r\n isError: boolean,\r\n errorMessage: string,\r\n onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void, // delete this\r\n onChangeValue?: (value: string) => void,\r\n value?: string,\r\n type? : React.HTMLInputTypeAttribute,\r\n disabled? : boolean,\r\n min?: string\r\n}\r\n \r\nexport const FormInput: FunctionComponent<FormInputProps> = (props) => {\r\n let {id , title, isError: isInputError, errorMessage, value, onChange, onChangeValue, type, disabled, min} = props;\r\n \r\n return ( \r\n <>\r\n <label htmlFor={id}>{title}</label>\r\n <div className=\"\">\r\n <input \r\n disabled={disabled}\r\n id={id}\r\n className={`form-control ${isInputError ? \"error\" : \"\"}`} \r\n type={type ?? \"text\"} \r\n value={value ?? ''}\r\n min={min}\r\n onChange={e => {onChange && onChange(e); onChangeValue && onChangeValue(e.target.value)}} \r\n />\r\n {isInputError && <span className=\"error\">{errorMessage}</span>}\r\n </div>\r\n </>\r\n );\r\n}\r\n\r\ninterface FormInputColorpickerProps {\r\n id: string,\r\n title: string,\r\n isError: boolean,\r\n errorMessage: string,\r\n onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void, // delete this\r\n onChangeValue?: (value: string) => void,\r\n value?: string,\r\n type? : React.HTMLInputTypeAttribute,\r\n disabled? : boolean\r\n}\r\n \r\nexport const FormInputColorpicker: FunctionComponent<FormInputColorpickerProps> = (props) => {\r\n let {id , title, isError: isInputError, errorMessage, value, onChange, onChangeValue, type, disabled} = props;\r\n \r\n return ( \r\n <>\r\n <label htmlFor={id}>{title}</label>\r\n <div className=\"\">\r\n <input \r\n disabled={disabled}\r\n id={id}\r\n className={`form-control ${isInputError ? \"error\" : \"\"}`} \r\n type={`color`} \r\n value={value}\r\n onChange={e => {onChange && onChange(e); onChangeValue && onChangeValue(e.target.value)}} \r\n />\r\n {isInputError && <span className=\"error\">{errorMessage}</span>}\r\n </div>\r\n </>\r\n );\r\n}\r\n\r\ninterface FormInputTextareaProps {\r\n id: string,\r\n title: string,\r\n isError: boolean,\r\n errorMessage: string,\r\n onChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void, // delete this\r\n onChangeValue?: (value: string) => void,\r\n value?: string\r\n}\r\n \r\nexport const FormInputTextarea: FunctionComponent<FormInputTextareaProps> = (props) => {\r\n let {id , title, isError: isInputError, errorMessage, value, onChange, onChangeValue} = props;\r\n \r\n return ( \r\n <>\r\n <label htmlFor={id}>{title}</label>\r\n <div className=\"\">\r\n <textarea \r\n rows={10}\r\n id={id}\r\n className={`form-control ${isInputError ? \"error\" : \"\"}`} \r\n value={value}\r\n onChange={e => {onChange(e); onChangeValue && onChangeValue(e.target.value)}} \r\n />\r\n {isInputError && <span className=\"error\">{errorMessage}</span>}\r\n </div>\r\n </>\r\n );\r\n}\r\n\r\ninterface FormInputNumberProps {\r\n id: string,\r\n title: string,\r\n min?: number,\r\n max?: number,\r\n step?: number,\r\n isError: boolean,\r\n errorMessage: string,\r\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void, // delete this\r\n onChangeValue?: (value: string) => void,\r\n value?: string | number\r\n}\r\n \r\nexport const FormInputNumber: FunctionComponent<FormInputNumberProps> = (props) => {\r\n let {id , title, min, max, step, isError: isInputError, errorMessage, value, onChange, onChangeValue} = props;\r\n \r\n return ( \r\n <>\r\n <label htmlFor={id}>{title}</label>\r\n <div className=\"\">\r\n <input \r\n id={id}\r\n className={`form-control ${isInputError ? \"error\" : \"\"}`} \r\n type=\"number\"\r\n min={min}\r\n max={max}\r\n step={step} \r\n value={value}\r\n onChange={e => {onChange(e); onChangeValue && onChangeValue(e.target.value)}} \r\n />\r\n {isInputError && <span className=\"error\">{errorMessage}</span>}\r\n </div>\r\n </>\r\n );\r\n}\r\n\r\n\r\nexport interface FormSelectProps {\r\n id: string,\r\n title: string,\r\n selectedValue: string | undefined,\r\n isError: boolean,\r\n errorMessage: string,\r\n onChange: (value:string) => void,\r\n defaultValueText?: string,\r\n options: {value:string, name:string}[],\r\n hideDefaultValue? : boolean,\r\n}\r\n\r\nexport type SelectOption = {\r\n value: string,\r\n name: string\r\n}\r\n\r\nexport const FormSelect:FunctionComponent<FormSelectProps> = (props) =>{\r\n let {id , title, selectedValue, isError, errorMessage, onChange, options, defaultValueText, hideDefaultValue = false} = props;\r\n\r\n const internalOnChange = (event:React.ChangeEvent<HTMLSelectElement>) =>{\r\n onChange(event.target.value);\r\n }\r\n\r\n return <>\r\n <label htmlFor={id}>{title}</label>\r\n <div className=\"select\">\r\n <select \r\n className=\"form-control\" \r\n name=\"\" \r\n id={id} \r\n onChange={internalOnChange}\r\n value={selectedValue}\r\n >\r\n {hideDefaultValue ? null : <option value=\"\">{defaultValueText ?? \"Select\"}</option>}\r\n {options.map( (it, index) => {\r\n return <option key={`${it.value}-${index}`} value={it.value}>{it.name}</option>\r\n })}\r\n </select>\r\n </div>\r\n {isError && <span className=\"error\">{errorMessage}</span>}\r\n </>\r\n}\r\n\r\nexport const FormRowDivider = (props: FormRowProps) => InternalFormRow({type:'divider', ...props})\r\nexport const FormRowHorizontal = (props: FormRowProps) => InternalFormRow({type:'horizontal', ...props})\r\nexport const FormRow = (props: FormRowProps) => InternalFormRow({type:'none', ...props})\r\nexport const FormRowWithColumns = (props: FormRowProps) => InternalFormRow({type:'with-columns', ...props})","import { FunctionComponent } from \"react\";\r\nimport IconButton from \"../iconButton/IconButton\";\r\nimport \"./Search.css\"\r\n\r\ninterface SearchProps {\r\n onChangeValue?: (value: string) => void,\r\n value?: string\r\n}\r\n \r\nconst Search: FunctionComponent<SearchProps> = (props) => {\r\n let {value, onChangeValue} = props;\r\n\r\n return ( \r\n <div className=\"search-input\">\r\n <IconButton tooltipText=\"Search\" type=\"search\"/>\r\n <input className=\"\" placeholder=\"Search\" type=\"text\" value={value} onChange={ e => {onChangeValue && onChangeValue(e.target.value)}} />\r\n </div>\r\n );\r\n}\r\n \r\nexport default Search;","import { FC } from \"react\";\r\nimport \"./SelectFileButton.css\";\r\nimport { uploadMedia, uploadMultipleMedia } from \"../../../api/mediaApi\";\r\nimport { useProgressStore } from \"../../../hooks/useProgress\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport { uploadMediaForCampaign } from \"../../../api/campaingsApi\";\r\n\r\ninterface SelectFileButtonProps {\r\n title?: string,\r\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void\r\n}\r\n\r\ninterface SelectMultipleFileButtonProps {\r\n title? : string, \r\n campaignId?: Guid,\r\n onMediaUploaded:()=>void\r\n}\r\n\r\ninterface SelectAvatarButtonProps extends SelectFileButtonProps{\r\n id: string\r\n}\r\n \r\nconst SelectFileButton: FC<SelectFileButtonProps> = (props: SelectFileButtonProps) => {\r\n let { onChange, title = 'Add Media' } = props \r\n return ( \r\n <div className=\"form-group\">\r\n <label htmlFor=\"upload\" className=\"btn primary_btn\">{title}</label>\r\n <input id=\"upload\" type=\"file\" name=\"upload\" accept=\".mp4,.jpg,.png\" onChange={onChange}/>\r\n </div>\r\n );\r\n}\r\n\r\nexport const SelectAvatarButton: FC<SelectAvatarButtonProps> = (props: SelectAvatarButtonProps) => {\r\n let { onChange, title = 'Upload media', id } = props \r\n return ( \r\n <div className=\"form-group\">\r\n <label htmlFor={id} className=\"btn primary_btn\">{title}</label>\r\n <input id={id} type=\"file\" name={id} accept=\".jpg,.png\" onChange={onChange}/>\r\n </div>\r\n );\r\n}\r\n\r\ntype GeneratePreviewResult = {\r\n url: string,\r\n duration: number\r\n}\r\n\r\nexport const SelectMultipleFileButton: FC<SelectMultipleFileButtonProps>= ({ title =\"Upload Multiple Files\", campaignId, onMediaUploaded }) => {\r\n const progressStore = useProgressStore();\r\n\r\n const checkIsDisabled = () => progressStore.progress !== 0\r\n\r\n const generatePreview = (videoFile: File): Promise<GeneratePreviewResult> => {\r\n return new Promise((resolve, reject) => {\r\n const video = document.createElement('video');\r\n video.setAttribute('playsinline', '');\r\n video.setAttribute('controls', '');\r\n video.setAttribute('type', 'video/mp4');\r\n\r\n \r\n\r\n \r\n video.preload = 'metadata';\r\n \r\n\r\n video.src = URL.createObjectURL(videoFile);\r\n console.log(video);\r\n video.load();\r\n video.onloadedmetadata = () => {\r\n console.log(video.duration);\r\n setTimeout(() => {\r\n video.currentTime = video.duration / 2;\r\n console.log(\"time\", video );\r\n }, 200);\r\n };\r\n \r\n video.onseeked = () => {\r\n const canvas = document.createElement('canvas');\r\n const ctx = canvas.getContext('2d');\r\n console.log(\"seekend\", video );\r\n canvas.width = video.videoWidth;\r\n canvas.height = video.videoHeight;\r\n if (!ctx) {\r\n reject(new Error('Could not get canvas context'));\r\n return;\r\n }\r\n ctx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);\r\n canvas.toBlob((blob) => {\r\n if (blob) {\r\n const url = canvas.toDataURL('image/png');\r\n resolve({url: url, duration: video.duration});\r\n } else {\r\n reject(new Error('Could not create blob from canvas'));\r\n }\r\n }, 'image/jpeg');\r\n };\r\n \r\n video.onerror = (event) => {\r\n reject(new Error('Error loading video file'));\r\n };\r\n \r\n \r\n });\r\n };\r\n\r\n const onFileChange = async (event: React.ChangeEvent<HTMLInputElement>): Promise<void> => {\r\n if(event.target.files && event.target.files.length != 0){\r\n const formData = new FormData();\r\n const selectedFiles = Array.from(event.target.files as FileList);\r\n\r\n for(var index = 0 ; index < selectedFiles.length; index++){\r\n console.log(\"promise\")\r\n var file = selectedFiles[index];\r\n formData.append(`Media`, file);\r\n if (file.type.startsWith('video/')) {\r\n try {\r\n const generatePreviewResult = await generatePreview(file);\r\n\r\n console.log(\"Preview \", generatePreviewResult.url)\r\n const previewFile = new File([generatePreviewResult.url], `${file.name}`, { type: 'image/png' });\r\n formData.append('Preview', previewFile, `${file.name}`);\r\n formData.append('Duration[]', `${file.name}#${generatePreviewResult.duration}`);\r\n console.log('Generated preview for:', file.name);\r\n } catch (error) {\r\n console.error('Error generating preview:', error);\r\n }\r\n }\r\n }\r\n\r\n\r\n if(campaignId){\r\n await uploadMediaForCampaign(formData, campaignId, progressStore.updateProgress);\r\n } else {\r\n await uploadMultipleMedia(formData, progressStore.updateProgress);\r\n }\r\n progressStore.resetProgress();\r\n onMediaUploaded();\r\n }\r\n }\r\n return ( \r\n <div className=\"form-group\">\r\n <label htmlFor=\"upload-multiple\" className={`btn primary_btn ${checkIsDisabled() ? \"disabled\" : \"\"}`}>{title}</label>\r\n <input multiple id=\"upload-multiple\" type=\"file\" name=\"upload-multiple\" accept=\".mp4,.jpg,.png\" onChange={onFileChange} disabled={checkIsDisabled()}/>\r\n </div>\r\n );\r\n}\r\n \r\nexport default SelectFileButton;","import React, { FunctionComponent, useEffect, useState } from \"react\";\r\nimport { FormInput, FormInputNumber, FormRow, FormSelect } from \"../formRow/FormRow\";\r\nimport { MediaContentType, MediaContentTypeOption, MediaModel, MediaType, mediaContentTypeOptions } from \"../../../api/mediaApi\";\r\nimport \"./FileInfo.css\";\r\nimport { addLeadingZero, formatDuration, getYoutubeImageUrlById } from \"../../../services/common\";\r\nimport { formatDate, formatTime } from \"../../../services/dateService\";\r\nimport { CampaignPeriod, CampaingListModel } from \"../../../api/campaingsApi\";\r\nimport { Button } from \"../Button\";\r\nimport Select, { SingleValue } from \"react-select\";\r\n\r\ninterface FileInfoImageProps {\r\n mode: 'readonly' | 'edit',\r\n mediaInfo: MediaModel\r\n onUpdateMediaInfo: (id : string, newName: string, newDuration: number, mediaType: MediaType, contentType: MediaContentType, clockID: string) => Promise<void>\r\n}\r\n \r\nconst FileInfoImage: FunctionComponent<FileInfoImageProps> = (props) => {\r\n\r\n let { mode, mediaInfo, onUpdateMediaInfo} = props;\r\n\r\n let [updateName, setUpdateName] = useState<string>(mediaInfo.name);\r\n let [updateDuration, setUpdateDuration] = useState<string>(mediaInfo.durationMs/1000+\"\");\r\n let [isUpdateNameError, setIsUpdateNameError] = useState<boolean>(false);\r\n let [isUpdateDurationError, setIsUpdateDurationError] = useState<boolean>(false);\r\n let [isValidUpdateState, setIsValidUpdateState] = useState<boolean>(true);\r\n let [clockID, setClockID] = useState('');\r\n\r\n let [selectedContentTypeOption, setSelectedContentTypeOption] = useState<SingleValue<MediaContentTypeOption>>(mediaContentTypeOptions[0]);\r\n\r\n useEffect(()=>{\r\n setUpdateName(mediaInfo.name);\r\n setUpdateDuration(mediaInfo.durationMs/1000+\"\");\r\n let contentTypeCurrentOption = mediaContentTypeOptions.filter(it => it.type === mediaInfo.contentType)[0];\r\n setSelectedContentTypeOption(contentTypeCurrentOption)\r\n setClockID(mediaInfo.clockId)\r\n },[mediaInfo]);\r\n\r\n useEffect(()=>{\r\n !isUpdateDurationError && !isUpdateNameError ? setIsValidUpdateState(true) : setIsValidUpdateState(false);\r\n },[isUpdateDurationError, isUpdateNameError]);\r\n\r\n const updateNameHandler = (newValue: string) => {\r\n if(newValue === '') {\r\n setIsUpdateNameError(true);\r\n setUpdateName('');\r\n } else { setIsUpdateNameError(false); setUpdateName(newValue)}\r\n }\r\n\r\n const updateDurationHandler = (newValue: string) => {\r\n let curNewValue = +newValue;\r\n if( curNewValue < 0 ){\r\n setIsUpdateDurationError(true)\r\n } else {setIsUpdateDurationError(false); setUpdateDuration(newValue)}\r\n }\r\n\r\n const onSelectedContentTypeOption = (newValue: SingleValue<MediaContentTypeOption>) => {\r\n setSelectedContentTypeOption(newValue)\r\n }\r\n\r\n const renderPeriod = (period: CampaignPeriod) => {\r\n return <p>{formatDate(period.startDate)}-{formatDate(period.endDate)}</p>\r\n }\r\n\r\n const renderCampaignRow = (campaign: CampaingListModel) => {\r\n return <tr>\r\n <td>\r\n {campaign.name}\r\n </td>\r\n <td>\r\n {campaign.periods.map(renderPeriod)}\r\n </td>\r\n </tr>\r\n }\r\n\r\n return (\r\n <>\r\n {mediaInfo &&\r\n <div className=\"preview-container\">\r\n <div className=\"preview-img\">\r\n {mediaInfo.mediaType == MediaType.Image &&\r\n <img src={mediaInfo.previewLink} alt=\"\" />\r\n }\r\n {mediaInfo.mediaType == MediaType.Video &&\r\n <video width=\"100%\" height=\"500\" controls={true} id={`${mediaInfo.id}_video`} src={mediaInfo.webVideoLink}>\r\n </video>\r\n }\r\n {mediaInfo.mediaType == MediaType.Youtube &&\r\n <img src={mediaInfo.previewLink} alt=\"\" />\r\n }\r\n {mediaInfo.mediaType == MediaType.YoutubeLive &&\r\n <img src={mediaInfo.previewLink} alt=\"\" />\r\n }\r\n </div>\r\n <div className=\"preview-info-block\">\r\n <h2 className=\"preview-info-title\">Info</h2>\r\n <div className=\"preview-info-group\">\r\n <FormRow>\r\n <FormInput \r\n title=\"Name\" \r\n id=\"update-name-id\"\r\n value={updateName} \r\n isError={isUpdateNameError} \r\n errorMessage=\"Invalid name\" \r\n onChange={()=>{}} \r\n onChangeValue={updateNameHandler} \r\n />\r\n </FormRow>\r\n\r\n <FormRow>\r\n <label>Content Type</label>\r\n <Select\r\n className={`w-100`}\r\n classNamePrefix={`select`}\r\n options={mediaContentTypeOptions}\r\n filterOption={(option, input) => option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option) => `${option.type}`}\r\n onChange={onSelectedContentTypeOption}\r\n value={selectedContentTypeOption}\r\n isMulti={false}\r\n />\r\n </FormRow>\r\n\r\n <FormRow>\r\n <FormInput \r\n title=\"Clock ID\" \r\n id=\"clock-id\"\r\n value={clockID} \r\n isError={false} \r\n errorMessage=\"\" \r\n onChange={()=>{}} \r\n onChangeValue={(v) => setClockID(v)} \r\n />\r\n </FormRow>\r\n </div>\r\n {(mediaInfo.mediaType == MediaType.Youtube || mediaInfo.mediaType == MediaType.YoutubeLive ) && <div className=\"preview-info-group\">\r\n <p className=\"label\">URL</p>\r\n <p>{mediaInfo.url}</p>\r\n </div>}\r\n {!(mediaInfo.mediaType == MediaType.Youtube || mediaInfo.mediaType == MediaType.YoutubeLive ) && <div className=\"preview-info-group\">\r\n <p className=\"label\">File size (MB)</p>\r\n <p>({mediaInfo.sizeMb}MB)</p>\r\n </div>}\r\n <div className=\"preview-info-group\">\r\n {(mode == 'readonly' || mediaInfo.mediaType == MediaType.Video) && <>\r\n <p className=\"label\">Duration</p>\r\n <p>{formatDuration(mediaInfo.durationMs)}</p>\r\n </>}\r\n {(mode == 'edit' && mediaInfo.mediaType == MediaType.Image) && <FormInputNumber\r\n id=\"time-select\"\r\n title=\"Duration (sec)\"\r\n isError={isUpdateDurationError}\r\n errorMessage=\"Select correct duration\"\r\n min={0}\r\n max={3000}\r\n step={1}\r\n value={updateDuration}\r\n onChange={()=>{}}\r\n onChangeValue={updateDurationHandler}\r\n />\r\n }\r\n \r\n </div>\r\n <div className=\"preview-info-group\">\r\n <p className=\"label\">Uploaded</p>\r\n <p>{formatDate(mediaInfo.uploadTime)}</p>\r\n </div>\r\n\r\n <table className=\"preview-campaign-table\">\r\n <thead>\r\n <tr>\r\n <td>Campaign</td>\r\n <td>Campaign Dates</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {mediaInfo.campaigns.map(renderCampaignRow)}\r\n </tbody>\r\n </table>\r\n <br />\r\n { mediaInfo.mediaType == MediaType.Video &&\r\n <div className=\"preview-info-group\">\r\n <a href={mediaInfo.webVideoLink} download={mediaInfo.name}>Download</a>\r\n </div> \r\n }\r\n \r\n <br />\r\n <div>\r\n <Button color=\"green\" label=\"Update\" onClick={()=>{\r\n if(isValidUpdateState) onUpdateMediaInfo(mediaInfo.id, updateName, (+updateDuration)*1000, mediaInfo.mediaType, selectedContentTypeOption!.type, clockID)\r\n }}/>\r\n </div >\r\n \r\n <div>\r\n \r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n }\r\n </>\r\n );\r\n \r\n}\r\n \r\nexport default FileInfoImage;","import { ApiResponse, baseUrl, getWithAuth, postWithAuth } from \"./baseApi\"\r\n\r\nexport type Client = {\r\n id: string\r\n name : string\r\n}\r\n\r\nexport type GetClientsResponse = {\r\n clients : Client[]\r\n}\r\n\r\nexport type CreateClientRequest = {\r\n name : string,\r\n}\r\n\r\nexport type CreateClientResponse = {\r\n id : string,\r\n}\r\n\r\nexport const getClients = async() : Promise<ApiResponse<GetClientsResponse>> => {\r\n return await getWithAuth<GetClientsResponse>({url : `${baseUrl}client`});\r\n}\r\n\r\nexport const createClient = async(request : CreateClientRequest) : Promise<ApiResponse<CreateClientResponse>> => {\r\n return await postWithAuth<CreateClientRequest,CreateClientResponse>(`${baseUrl}client`, request);\r\n}","import axios from \"axios\";\r\nimport { currentDateTimeString } from \"../services/dateService\";\r\nimport { getToken } from \"./authApi\";\r\nimport {ApiResponse, BaseCreateResponse, BaseInfo, BaseInfoList, BaseResponse, BaseResponseWithData, baseUrl, deleteWithAuth, GetParams, getWithAuth, getWithAuthAndParams, Guid, ListRespone, patchWithAuth, postWithAuth, postWithAuthWitoutParams} from \"./baseApi\";\r\nimport { MediaListResponse, MediaModel } from \"./mediaApi\";\r\nimport { DayOfWeek } from \"./channelsApi\";\r\n\r\nexport type PlayerBaseModel = {\r\n name : string,\r\n id : Guid\r\n}\r\n\r\nexport enum PlayerStatus {\r\n Online = 0,\r\n Offline = 1,\r\n OutOfDayParting = 2\r\n}\r\n\r\nexport type PlayerModel = \r\n{\r\n name : string,\r\n isOnline: boolean,\r\n lastSeen : string,\r\n id: string,\r\n lat: number,\r\n long: number,\r\n location: string,\r\n channel: BaseInfo | null,\r\n withActiveSchedule: boolean,\r\n playerStatus: PlayerStatus,\r\n version: string,\r\n isEnabled: boolean\r\n}\r\n\r\nexport type PlayersResponse = \r\n{\r\n players : PlayerModel[]\r\n} \r\n\r\nexport type GetUnasignedPlayersRespone = {\r\n unassignedPlayers: PlayerBaseModel[]\r\n}\r\n\r\n\r\nexport type PlayerUpdateChannelRequest = {\r\n channelId: Guid | null\r\n}\r\n\r\nexport type UpdateConfigurationRequest = {\r\n tags : Guid[],\r\n isEnabled: boolean,\r\n channelId: Guid | undefined | null\r\n volume: number,\r\n dshowSize: string,\r\n dshowAspectRatio: string,\r\n isStreamEnabled: boolean,\r\n dshowVdev:string | null,\r\n dshowAdev:string | null,\r\n audioDelay: number | '',\r\n chromaFormat: string,\r\n skinId: Guid | null | undefined,\r\n tvChannelMappingProfileId: Guid | null,\r\n transcodeProfileId: Guid | null\r\n useProxyServer: boolean,\r\n isBespokeImageEnabled: boolean,\r\n isDownloadScheduleEnabled: boolean\r\n}\r\n\r\nexport type PlayerConfiguration = {\r\n tags : Guid[],\r\n isEnabled: boolean,\r\n channelId: Guid,\r\n volume: number,\r\n defaultImageUrl: string,\r\n dshowSize: string,\r\n dshowAspectRatio: string,\r\n isStreamEnabled: boolean,\r\n dshowVdev: string | null,\r\n dshowAdev: string | null,\r\n audioDelay: number | '',\r\n chromaFormat: string,\r\n skinId: Guid,\r\n tvChannelMappingProfileId: Guid | null,\r\n transcodeProfileId: Guid | null,\r\n useProxyServer: boolean,\r\n bespokeImageUrl: string,\r\n isBespokeImageEnabled: boolean,\r\n isDownloadScheduleEnabled: boolean\r\n}\r\n\r\nexport type PlayerTechProfile = {\r\n playerName: string,\r\n ip: string,\r\n userAgent: string,\r\n location: string,\r\n postalCode: string,\r\n clientNote: string,\r\n playerId: string,\r\n horizontalResolution: number,\r\n verticalResolution: number,\r\n totalDiskSpace: number,\r\n availableDiskSpace: number,\r\n version: string\r\n}\r\n\r\nexport type UpdatePlayerTechProfileRequest = {\r\n playerName: string,\r\n ip: string,\r\n userAgent: string,\r\n location: string,\r\n postalCode: string,\r\n clientNote: string\r\n}\r\n\r\nexport type PlayerLog = {\r\n playerEvent: string,\r\n user: string,\r\n dateTime: string,\r\n comment: string\r\n}\r\n\r\nexport type ListPlayerLogs = {\r\n pageSize: number,\r\n page: number,\r\n totalPages: number,\r\n items: PlayerLog[]\r\n}\r\n\r\nexport type HealthStatisticEntry = {\r\n dateTime: string,\r\n value: number\r\n}\r\n\r\nexport type PlayerHealth = {\r\n totalSpaceGB: number,\r\n totalRam: number,\r\n cpuUsage: HealthStatisticEntry[],\r\n gpuUsage: HealthStatisticEntry[],\r\n spaceUsage: HealthStatisticEntry[],\r\n heartbeats: HealthStatisticEntry[],\r\n ram: HealthStatisticEntry[],\r\n}\r\n\r\nexport type ScreenShot = {\r\n screenShotUrl: string,\r\n screensShotPreviewUrl: string,\r\n dateTime: string\r\n}\r\n\r\nexport interface SkinTimeslotRequest {\r\n name: string,\r\n start: string,\r\n end: string\r\n}\r\n\r\nexport interface SkinTimeslotResponse extends SkinTimeslotRequest {\r\n id: Guid\r\n}\r\n\r\nexport interface DownloadTimeslotRequest {\r\n name: string,\r\n startDate: string,\r\n endDate: string,\r\n startTime: string,\r\n endTime: string,\r\n monday: boolean,\r\n tuesday: boolean,\r\n wednesday: boolean,\r\n thursday: boolean,\r\n friday: boolean,\r\n saturday: boolean,\r\n sunday: boolean\r\n}\r\n\r\nexport interface DownloadTimeslotResponse extends DownloadTimeslotRequest {\r\n id: Guid,\r\n playerId: string,\r\n volume: number,\r\n isPriority: boolean\r\n}\r\n\r\nexport type PlayerDevice = {\r\n name: string\r\n}\r\n\r\nexport interface VolumeProfile {\r\n id: Guid,\r\n name: string,\r\n startDate: string,\r\n endDate: string | null,\r\n startTime: string,\r\n endTime: string,\r\n monday: boolean,\r\n tuesday: boolean,\r\n wednesday: boolean,\r\n thursday: boolean,\r\n friday: boolean,\r\n saturday: boolean,\r\n sunday: boolean,\r\n volume: number,\r\n isPriority: boolean,\r\n}\r\n\r\nexport type VolumeProfileRequest = Omit<VolumeProfile,'id'>\r\n\r\nexport enum PlayerScheduleOvviredeType {\r\n Enabled = 0, // blue\r\n Disabled = 1, // red\r\n EnabledInSite = 2, // green\r\n}\r\n\r\nexport type PlayerTimeSlotOverrideModel = {\r\n id: Guid,\r\n dayOfWeek : DayOfWeek,\r\n hour : number,\r\n minute: number,\r\n type: PlayerScheduleOvviredeType\r\n}\r\n\r\nexport type PlayerTimeSlotOverrideRequest = {\r\n dayOfWeek : DayOfWeek,\r\n hour : number,\r\n minute: number,\r\n}\r\n\r\nexport type PlayersMonitoringScreenshots = {\r\n players: PlayerWithScreenshots[]\r\n}\r\n\r\nexport type PlayerWithScreenshots = {\r\n id:Guid,\r\n playerName: string | null,\r\n screenshots: {\r\n screenshotUrl: string,\r\n previewUrl: string,\r\n dateTime: string,\r\n siteInfo: string,\r\n isOffline: boolean,\r\n priorityListId: Guid | null,\r\n streamId:Guid | null,\r\n }[]\r\n}\r\n\r\n\r\nexport interface TvGuideCell {\r\n start: string\r\n end: string\r\n title: string\r\n}\r\n\r\nexport type PlayerTvGuideRow = {\r\n date: string\r\n spans: TvGuideCell[]\r\n}\r\n\r\nexport type PlayerTvGuide = {\r\n dates: PlayerTvGuideRow[]\r\n}\r\n\r\nexport type AdvertisingInfo = {\r\n slotDuration: number,\r\n maxDuration: number,\r\n minDuration: number,\r\n}\r\n\r\nexport type PrivacyInfo = {\r\n tracking: boolean,\r\n gdpr: boolean,\r\n}\r\n\r\nexport type ReachTrackerInfo = {\r\n monday: number,\r\n tuesday: number,\r\n wednesday: number,\r\n thursday: number,\r\n friday: number,\r\n saturday: number,\r\n sunday: number\r\n}\r\n\r\nexport type TvGuidePdf = {\r\n downloadUrl: string\r\n}\r\n\r\nexport type PlayNowOfflineList = {\r\n playNowId: Guid,\r\n isEnabled: boolean,\r\n name: string,\r\n hotKey: number\r\n}\r\n\r\nexport type OfflineModeToggleRequest = {\r\n playNowId: Guid\r\n}\r\n\r\nexport const getPlayers = async () : Promise<PlayersResponse> => {\r\n var result = await getWithAuth<PlayersResponse>({url: `${baseUrl}players`});\r\n\r\n if(result.type == \"succes\") return result.data;\r\n return { players : new Array<PlayerModel>() }\r\n}\r\n\r\nexport const getPlayersShort = async() : Promise<ApiResponse<BaseInfoList>> => {\r\n return await getWithAuth<BaseInfoList>({url : `${baseUrl}players/short`});\r\n}\r\n\r\nexport const unassigneChannelFromPlayer = async( playerId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n let request:PlayerUpdateChannelRequest = {channelId: null};\r\n return await patchWithAuth<PlayerUpdateChannelRequest, BaseResponse>(`${baseUrl}players/${playerId}/channel`, request);\r\n}\r\n\r\nexport const getPlayerConfiguration = async(playerId: Guid) : Promise<ApiResponse<PlayerConfiguration>> => {\r\n return await getWithAuth<PlayerConfiguration>({ url: `${baseUrl}players/${playerId}/configuration`});\r\n}\r\n\r\nexport const getPlayerTechProfile = async(playerId: Guid) : Promise<ApiResponse<PlayerTechProfile>> => {\r\n return await getWithAuth<PlayerTechProfile>({ url: `${baseUrl}players/${playerId}/techprofile`});\r\n}\r\n\r\nexport const getPlayerLogs = async(playerId: Guid, page: number) : Promise<ApiResponse<ListPlayerLogs>> => {\r\n let params = new GetParams();\r\n params.Add(\"page\",page+'')\r\n return await getWithAuthAndParams<ListPlayerLogs>( `${baseUrl}players/${playerId}/logs`, params);\r\n}\r\n\r\nexport const updateConfuguration = async( playerId: Guid, request: UpdateConfigurationRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<UpdateConfigurationRequest, BaseResponse>(`${baseUrl}players/${playerId}/configuration`, request);\r\n}\r\n\r\nexport const updateTechProfile = async( playerId: Guid, request: UpdatePlayerTechProfileRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<UpdatePlayerTechProfileRequest, BaseResponse>(`${baseUrl}players/${playerId}/techprofile`, request);\r\n}\r\n\r\nexport const getUnassignedPlayers = async (exceptChannelId : Guid) : Promise<ApiResponse<GetUnasignedPlayersRespone>> => {\r\n const params = new GetParams();\r\n if(!!exceptChannelId) params.Add(\"exceptChannelId\", exceptChannelId);\r\n var result = await getWithAuthAndParams<GetUnasignedPlayersRespone>(`${baseUrl}players/unassigned`, params);\r\n\r\n return result;\r\n}\r\n\r\nexport const getPlayerHealth = async(playerId: Guid, start: string, end: string) : Promise<ApiResponse<BaseResponseWithData<PlayerHealth>>> => {\r\n const params = new GetParams(); \r\n params.Add(\"start\", start);\r\n params.Add(\"end\", end);\r\n return await getWithAuthAndParams<BaseResponseWithData<PlayerHealth>>(`${baseUrl}players/${playerId}/health`, params);\r\n}\r\n\r\n\r\nexport const addBackgroundImage = async (formData: any) : Promise<string> => {\r\n await axios.post(`${baseUrl}players/backgroundImage`, formData, {\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n 'Authorization' : getToken()\r\n }, \r\n });\r\n\r\n return \"ok\"\r\n}\r\n\r\nexport const addBespokeImage = async (formData: any) : Promise<string> => {\r\n await axios.post(`${baseUrl}players/bespokeImage`, formData, {\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n 'Authorization' : getToken()\r\n }, \r\n });\r\n\r\n return \"ok\"\r\n}\r\n\r\nexport const deletePlayer = async (playerId: Guid): Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}players`, playerId);\r\n}\r\n\r\nexport const getScreenshots = async (playerId: Guid): Promise<ApiResponse<ListRespone<ScreenShot>>>=>{\r\n return await getWithAuth<ListRespone<ScreenShot>>({url: `${baseUrl}players/${playerId}/screenshots`});\r\n}\r\n\r\nexport const takeScreenshot = async (playerId: Guid): Promise<ApiResponse<BaseResponse>>=>{\r\n return await postWithAuthWitoutParams<BaseResponse>(`${baseUrl}players/${playerId}/screenshots`);\r\n}\r\n\r\nexport const getMediaForPlayer = async (playerId:Guid): Promise<ApiResponse<ListRespone<MediaModel>>> => {\r\n return await getWithAuth<ListRespone<MediaModel>>({url : `${baseUrl}players/${playerId}/media`});\r\n}\r\n\r\nexport const getSkinTimeslots = async (id: Guid): Promise<ApiResponse<ListRespone<SkinTimeslotResponse>>> => {\r\n return await getWithAuth<ListRespone<SkinTimeslotResponse>>({url : `${baseUrl}players/${id}/skintimeslots`});\r\n}\r\n\r\nexport const postSkinTimeslots = async (request: SkinTimeslotRequest, id:Guid): Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<SkinTimeslotRequest,BaseCreateResponse>(`${baseUrl}players/${id}/skintimeslots`, request);\r\n}\r\n\r\nexport const deleteSkinTimeslot = async (playerId:Guid, slotId:Guid):Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}players/${playerId}/skintimeslots`, slotId);\r\n}\r\n\r\nexport const getPlayerAudioDevices = async(playerId: Guid) : Promise<ApiResponse<ListRespone<PlayerDevice>>> => {\r\n return await getWithAuth<ListRespone<PlayerDevice>>({ url: `${baseUrl}players/${playerId}/audio-devices`});\r\n}\r\n\r\nexport const getPlayerVideoDevices = async(playerId: Guid) : Promise<ApiResponse<ListRespone<PlayerDevice>>> => {\r\n return await getWithAuth<ListRespone<PlayerDevice>>({ url: `${baseUrl}players/${playerId}/video-devices`});\r\n}\r\n\r\n\r\n\r\n///////\r\nexport interface TvChannelOverrided {\r\n id: Guid,\r\n tvChannelName: string,\r\n tvChannelId: Guid,\r\n originalValue: string,\r\n playerValue: string\r\n}\r\n\r\nexport interface TvChannelOverrideCreateRequest {\r\n tvChannelId: Guid,\r\n command: string\r\n}\r\n\r\nexport interface TvChannelOverrideUpdateRequest {\r\n command: string\r\n}\r\n\r\nexport const getTVChannelOverrides = async(id: Guid) : Promise<ApiResponse<ListRespone<TvChannelOverrided>>> => {\r\n return await getWithAuth<ListRespone<TvChannelOverrided>>({url : `${baseUrl}players/${id}/tvchannel-overrides`});\r\n}\r\n\r\nexport const createTVChannelOverrride = async(id: Guid, request : TvChannelOverrideCreateRequest) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<TvChannelOverrideCreateRequest,BaseCreateResponse>(`${baseUrl}players/${id}/tvchannel-overrides`, request);\r\n}\r\n\r\nexport const updateTVChannelOverride = async(id : Guid, overrideId: Guid, request : TvChannelOverrideUpdateRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<TvChannelOverrideUpdateRequest,BaseResponse>(`${baseUrl}players/${id}/tvchannel-overrides/${overrideId}`, request);\r\n}\r\n\r\nexport const deleteTVChannelOverride = async (id : Guid, overrideId: Guid) : Promise<ApiResponse<BaseResponse>> =>{\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}players/${id}/tvchannel-overrides`, overrideId)\r\n}\r\n\r\nexport const restartPlayer = async(id: Guid) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<{},BaseCreateResponse>(`${baseUrl}players/${id}/restart`, {});\r\n}\r\n\r\nexport const forceIrCommand = async(id: Guid) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<{},BaseCreateResponse>(`${baseUrl}players/${id}/force-ir-command`, {});\r\n}\r\n\r\n//Volume Profile\r\nexport const getVolumeProfiles = async(id: Guid) : Promise<ApiResponse<ListRespone<VolumeProfile>>> => {\r\n return await getWithAuth<ListRespone<VolumeProfile>>({url : `${baseUrl}players/${id}/volume-profiles`});\r\n}\r\n\r\nexport const createVolumeProfile = async(id: Guid, request : VolumeProfileRequest) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<VolumeProfileRequest,BaseCreateResponse>(`${baseUrl}players/${id}/volume-profiles`, request);\r\n}\r\n\r\nexport const updateVolumeProfile = async(id : Guid, profileId: Guid, request : VolumeProfileRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<VolumeProfileRequest,BaseResponse>(`${baseUrl}players/${id}/volume-profiles/${profileId}`, request);\r\n}\r\n\r\nexport const deleteVolumeProfile = async (id : Guid, profileId: Guid) : Promise<ApiResponse<BaseResponse>> =>{\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}players/${id}/volume-profiles`, profileId)\r\n}\r\n\r\nexport const getPlayerScheduleOverride = async (id: Guid): Promise<ApiResponse<ListRespone<PlayerTimeSlotOverrideModel>>> => {\r\n return await getWithAuth<ListRespone<PlayerTimeSlotOverrideModel>>({url : `${baseUrl}players/${id}/schedule-ovverides`});\r\n}\r\n\r\nexport const postPlayerScheduleOverride = async (request: PlayerTimeSlotOverrideRequest, id:Guid): Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<PlayerTimeSlotOverrideRequest,BaseCreateResponse>(`${baseUrl}players/${id}/schedule-ovverides`, request);\r\n}\r\n\r\nexport const getPlayersScreenshots = async (request:{playerIds:Guid[]}): Promise<ApiResponse<BaseResponseWithData<PlayersMonitoringScreenshots>>> => {\r\n return await postWithAuth<{playerIds:Guid[]},BaseResponseWithData<PlayersMonitoringScreenshots>>(`${baseUrl}players/screenshot-dashboard`, request)\r\n}\r\n\r\nexport const getPlayerTvGuide = async(playerId: Guid, start: string, end: string) : Promise<ApiResponse<BaseResponseWithData<PlayerTvGuide>>> => {\r\n const params = new GetParams(); \r\n params.Add(\"playerId\", playerId); \r\n params.Add(\"startTime\", start);\r\n params.Add(\"endTime\", end);\r\n return await getWithAuthAndParams<BaseResponseWithData<PlayerTvGuide>>(`${baseUrl}players/tv-guided-look`, params);\r\n}\r\n\r\nexport const getAdvertisingInfo = async(id: Guid) : Promise<ApiResponse<BaseResponseWithData<AdvertisingInfo>>> => {\r\n return await getWithAuth<BaseResponseWithData<AdvertisingInfo>>({url : `${baseUrl}players/${id}/ap`});\r\n}\r\n\r\nexport const patchAdvertisingInfo = async(id : Guid, request : AdvertisingInfo) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<AdvertisingInfo,BaseResponse>(`${baseUrl}players/${id}/ap`, request);\r\n}\r\n\r\nexport const getPrivacyInfo = async(id: Guid) : Promise<ApiResponse<BaseResponseWithData<PrivacyInfo>>> => {\r\n return await getWithAuth<BaseResponseWithData<PrivacyInfo>>({url : `${baseUrl}players/${id}/privacy`});\r\n}\r\n\r\nexport const patchPrivacyInfo = async(id : Guid, request : PrivacyInfo) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<PrivacyInfo,BaseResponse>(`${baseUrl}players/${id}/privacy`, request);\r\n}\r\n\r\nexport const getReachTrackerInfo = async(id: Guid) : Promise<ApiResponse<BaseResponseWithData<ReachTrackerInfo>>> => {\r\n return await getWithAuth<BaseResponseWithData<ReachTrackerInfo>>({url : `${baseUrl}players/${id}/reach-tracker-profile`});\r\n}\r\n\r\nexport const patchReachTrackerInfo = async(id : Guid, request : ReachTrackerInfo) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<ReachTrackerInfo,BaseResponse>(`${baseUrl}players/${id}/reach-tracker-profile`, request);\r\n}\r\n\r\nexport const getPlayNowOffline = async(id: Guid) : Promise<ApiResponse<ListRespone<PlayNowOfflineList>>> => {\r\n return await getWithAuth<ListRespone<PlayNowOfflineList>>({url : `${baseUrl}players/${id}/playnow-offline`});\r\n}\r\n\r\nexport const offlineModeEnable = async(id : Guid, request : OfflineModeToggleRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<OfflineModeToggleRequest,BaseResponse>(`${baseUrl}players/${id}/playnow-offline/enable`, request);\r\n}\r\n\r\nexport const offlineModeDisable = async(id : Guid, request : OfflineModeToggleRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<OfflineModeToggleRequest,BaseResponse>(`${baseUrl}players/${id}/playnow-offline/disable`, request);\r\n}\r\n\r\nexport const getDownloadTimeslots = async (id: Guid): Promise<ApiResponse<ListRespone<DownloadTimeslotResponse>>> => {\r\n return await getWithAuth<ListRespone<DownloadTimeslotResponse>>({url : `${baseUrl}players/${id}/download-schedule`});\r\n}\r\n\r\nexport const postDownloadTimeslots = async (request: DownloadTimeslotRequest, id:Guid): Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<DownloadTimeslotRequest,BaseCreateResponse>(`${baseUrl}players/${id}/download-schedule`, request);\r\n}\r\n\r\nexport const deleteDownloadTimeslot = async (playerId:Guid, slotId:Guid):Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}players/${playerId}/download-schedule`, slotId);\r\n}\r\n","import React from 'react';\r\nimport Select, { Props as SelectProps} from 'react-select';\r\nimport { sortByNameString } from '../../../services/common';\r\n\r\ninterface CustomSelectProps extends SelectProps<CustomSelectOption> {\r\n isSort?: boolean,\r\n label: string,\r\n}\r\n\r\nexport interface CustomSelectOption {\r\n value: string;\r\n name: string;\r\n}\r\n\r\nconst CustomSelect: React.FC<CustomSelectProps> = ({ isSort, label, options, ...rest }) => {\r\n let sortOptions = [];\r\n if (isSort && Array.isArray(options)) {\r\n sortOptions = options.sort((a, b) => sortByNameString(a.name, b.name))\r\n }\r\n return (<><label>{label}</label>\r\n <Select options={sortOptions} {...rest} />\r\n </>)\r\n}\r\nexport default CustomSelect","import React, { FC, useEffect, useState } from 'react'\r\nimport Select, { MultiValue, SingleValue } from 'react-select'\r\nimport { Guid } from '../../../api/baseApi'\r\nimport { CampaignPeriod, CampaingListModel, createCampaign, CreateCampaignRequest, updateCampaign, UpdateCampaignRequest } from '../../../api/campaingsApi'\r\nimport { getSiteNestedPlayListsForCampaign, SiteNestedPlaylistForCampaign } from '../../../api/channelsApi'\r\nimport { Client, createClient, getClients } from '../../../api/clientApi'\r\nimport { getTags } from '../../../api/tagApi'\r\nimport { formatDate } from '../../../services/dateService'\r\nimport { Button } from '../Button'\r\nimport { FormInput, FormRow, FormSelect, SelectOption } from '../formRow/FormRow'\r\nimport GlobalSpinner from '../globalsSpinner/GlobalSpinner'\r\nimport IconButton from '../iconButton/IconButton'\r\nimport { RightModal } from '../sideModal/Modal'\r\nimport { sortByNameString } from '../../../services/common'\r\nimport CustomSelect from '../customSelect/CustomSelect'\r\n\r\ninterface ICampaignModal {\r\n campaign: CampaingListModel | undefined,\r\n showCampaignModal: boolean,\r\n closeCampaignModal: () => void,\r\n updateCampaignListFunction: ()=> Promise<void>\r\n}\r\n\r\nconst CampaignModal:FC<ICampaignModal> = (props) => {\r\n\r\n let {\r\n campaign, \r\n showCampaignModal, \r\n closeCampaignModal,\r\n updateCampaignListFunction\r\n } = props;\r\n \r\n let [isLoading, setIsLoading] = useState(false);\r\n let [modalTitle, setModalTitle] = useState(\"\");\r\n let [campaignName, setCampaignName] = useState(\"\");\r\n let [isCampaignNameError, setIsCampaignNameError] = useState(false);\r\n\r\n let [campaignId, setCampaignId] = useState(\"\");\r\n\r\n let [clientToggle, setClientToggle] = useState(false);\r\n let [isSelectedClientError, setIsSelectedClientError] = useState(false);\r\n let [clients, setClients] = useState<Client[]>([]);\r\n let [selectedClient, setSelectedClient] = useState<SingleValue<Client>>(null);\r\n let [createClientName, setCreateClientName] = useState(\"\");\r\n let [isClientNameError, setIsClientNameError] = useState(false);\r\n\r\n let [isPeriodStartError, setIsPeriodStartError] = useState(false);\r\n let [isPeriodEndError, setIsPeriodEndError] = useState(false);\r\n let [isPeriodError, setIsPeriodError] = useState(false);\r\n let [periods, setPeriods] = useState<CampaignPeriod[]>([]);\r\n let [periodStart, setPeriodStart] = useState(\"\");\r\n let [periodEnd, setPeriodEnd] = useState(\"\");\r\n\r\n let [siteNestedPlaylists, setSiteNestedPlaylists] = useState<SiteNestedPlaylistForCampaign[]>([])\r\n let [selectedSiteNestedPlaylists, setSelectedSiteNestedPlaylists] = useState<SiteNestedPlaylistForCampaign[]>([]);\r\n\r\n let [tags, setTags] = useState<SelectOption[]>([]);\r\n let [isTagError, setIsTagError] = useState(false);\r\n let [selectedTags, setSelectedTags] = useState<Guid[]>([]);\r\n\r\n useEffect(()=>{\r\n async function fetchData(){\r\n\r\n await Promise.all([updateClients(),updateTags(),updateNestedPlaylists()])\r\n\r\n }\r\n fetchData();\r\n },[])\r\n\r\n useEffect(()=>{\r\n if (campaign === undefined){\r\n setModalTitle(\"Add Campaign\");\r\n setCampaignName(\"\");\r\n setCampaignId(\"\")\r\n setSelectedClient(null)\r\n setPeriods([]);\r\n setSelectedSiteNestedPlaylists([]);\r\n setSelectedTags([]);\r\n } else {\r\n setModalTitle(`Edit Campaign ${campaign.name}`);\r\n setCampaignName(campaign.name);\r\n setCampaignId(campaign.campaignId ? campaign.campaignId: \"\")\r\n setSelectedClient(campaign.client);\r\n setPeriods([...campaign.periods]);\r\n setSelectedSiteNestedPlaylists(campaign.playLists.map(it => it));\r\n setSelectedTags(campaign.tags.map(it => it.id));\r\n }\r\n },[campaign])\r\n\r\n const updateClients = async () => {\r\n let getClientsResponse = await getClients();\r\n if( getClientsResponse.type === \"succes\") {\r\n setClients(getClientsResponse.data.clients);\r\n }\r\n }\r\n const updateTags = async () => {\r\n let getTagsResponse = await getTags();\r\n if( getTagsResponse.type === \"succes\"){\r\n setTags(getTagsResponse.data.items.map(it => { return {name: it.name, value: it.id}}));\r\n }\r\n }\r\n const updateNestedPlaylists = async () => {\r\n let getSiteNestedPlaylistResponse = await getSiteNestedPlayListsForCampaign();\r\n if(getSiteNestedPlaylistResponse.type === \"succes\") {\r\n setSiteNestedPlaylists(getSiteNestedPlaylistResponse.data.items)\r\n }\r\n }\r\n\r\n const setCampaignTitle = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setIsCampaignNameError(false);\r\n setCampaignName(event.target.value);\r\n }\r\n\r\n const setCampaignIdForCampaign = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setCampaignId(event.target.value);\r\n }\r\n\r\n const setClientName = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setCreateClientName(event.target.value);\r\n setIsClientNameError(false);\r\n }\r\n\r\n const clientFormRowToggle = () => {\r\n setClientToggle(prev => !prev);\r\n }\r\n\r\n const createClientHandler = async () => {\r\n if(!!!createClientName){\r\n setIsClientNameError(true);\r\n return;\r\n }\r\n\r\n let result = await createClient({name : createClientName});\r\n if(result.type == \"succes\"){\r\n let getClientsResponse = await getClients();\r\n let curID = result.data.id;\r\n switch(getClientsResponse.type){\r\n case \"succes\" : {\r\n let currentClient = getClientsResponse.data.clients.find(it => it.id === curID);\r\n let t = currentClient ? currentClient : null;\r\n setClients(getClientsResponse.data.clients);\r\n setSelectedClient(t);\r\n setCreateClientName(\"\");\r\n }\r\n }\r\n } \r\n\r\n clientFormRowToggle(); \r\n }\r\n\r\n const setStartDatePeriod = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setIsPeriodStartError(false);\r\n setPeriodStart(event.target.value);\r\n }\r\n\r\n const setEndDatePeriod = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setIsPeriodEndError(false);\r\n setIsPeriodError(false);\r\n setPeriodEnd(event.target.value);\r\n }\r\n\r\n const addPeriod = () => {\r\n if(!!!periodStart || !!!periodEnd){\r\n setIsPeriodStartError(true);\r\n setIsPeriodEndError(true);\r\n return;\r\n }\r\n\r\n setIsPeriodError(false);\r\n setPeriods([...periods, {startDate: periodStart, endDate: periodEnd}]);\r\n }\r\n\r\n const deletePeriod = (index: number) => {\r\n let newArr = periods;\r\n newArr.splice(index, 1);\r\n setPeriods([...newArr]);\r\n }\r\n\r\n const onSelectedNestedPlayListForCampaignChange = (newValue : MultiValue<SiteNestedPlaylistForCampaign> | SingleValue<SiteNestedPlaylistForCampaign>) => {\r\n if(newValue && Array.isArray(newValue)) {\r\n setSelectedSiteNestedPlaylists([...newValue])\r\n }\r\n }\r\n // const onSelectedNestedPlayListForCampaignChange = (update: readonly SiteNestedPlaylistForCampaign[]) => {\r\n // setSelectedSiteNestedPlaylists([...update])\r\n // }\r\n\r\n // const addTag= (id: Guid) => {\r\n // setSelectedTags([...selectedTags, id]);\r\n // setIsTagError(false);\r\n // }\r\n\r\n // const removeTag = (id: Guid) => {\r\n // setSelectedTags(selectedTags.filter(it => it !== id));\r\n // }\r\n\r\n const createOrUpdateCampaign = async () => {\r\n\r\n let isValid = true;\r\n if(!!!campaignName){\r\n setIsCampaignNameError(true);\r\n isValid = false;\r\n }\r\n if(!!!selectedClient){\r\n setIsSelectedClientError(true);\r\n isValid = false;\r\n } \r\n\r\n if(!!!periods || periods.length == 0){\r\n setIsPeriodError(true);\r\n isValid = false;\r\n }\r\n \r\n if(!isValid) return;\r\n \r\n let request : CreateCampaignRequest = {\r\n clientId: selectedClient ? selectedClient.id : '',\r\n name: campaignName,\r\n campaignId: campaignId ? campaignId : null,\r\n periods: periods,\r\n playListIds: selectedSiteNestedPlaylists.map(it => it.playListId),\r\n tagIds: selectedTags\r\n } \r\n\r\n if(campaign?.id){\r\n let updateRequest : UpdateCampaignRequest = {...request, id: campaign.id };\r\n await updateCampaign(updateRequest);\r\n } else {\r\n await createCampaign(request);\r\n }\r\n\r\n await updateCampaignListFunction();\r\n closeCampaignModal();\r\n }\r\n\r\n const closeModalResetInputsAndErrors = () => {\r\n setCampaignName(\"\");\r\n setIsCampaignNameError(false)\r\n setCreateClientName(\"\");\r\n setIsClientNameError(false);\r\n setSelectedClient(null);\r\n setIsSelectedClientError(false);\r\n setIsPeriodError(false);\r\n setSelectedTags([])\r\n closeCampaignModal();\r\n }\r\n\r\n const onSelectedClient = (client: SingleValue<Client>) => {\r\n setSelectedClient(client)\r\n setIsSelectedClientError(false);\r\n }\r\n\r\n const onSelectedTags = (newValue : MultiValue<SelectOption> | SingleValue<SelectOption>) => {\r\n if(newValue){\r\n if(Array.isArray(newValue)){\r\n setSelectedTags(newValue.map(it => it.value))\r\n }\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n <RightModal \r\n title={modalTitle} \r\n show={showCampaignModal}\r\n onRequestClose={closeModalResetInputsAndErrors}\r\n >\r\n <FormRow>\r\n <FormInput \r\n id=\"campaign-name\"\r\n title=\"Campaign Name\"\r\n isError={isCampaignNameError}\r\n errorMessage=\"Please enter campaign name\"\r\n onChange={setCampaignTitle}\r\n value={campaignName}\r\n />\r\n </FormRow>\r\n\r\n <FormRow>\r\n <FormInput \r\n id=\"campaign-id\"\r\n title=\"Campaign ID\"\r\n isError={false}\r\n errorMessage=\"Please enter Campaign ID\"\r\n onChange={setCampaignIdForCampaign}\r\n value={campaignId}\r\n />\r\n </FormRow>\r\n \r\n <div className={`form-row-overflow ${clientToggle ? \"active\" : \"\"}`} style={{\"paddingTop\":\"5px\"}}>\r\n <div className=\"row-tab-active\">\r\n <FormRow>\r\n <label>Advertiser </label>\r\n <Select\r\n className={`w-100 ${isSelectedClientError ? \"error\" : \"\"}`}\r\n classNamePrefix={`select`}\r\n options={clients.sort((a,b) => sortByNameString(a.name, b.name))}\r\n filterOption={(option, input) => option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option) => `${option.id}`}\r\n onChange={onSelectedClient}\r\n value={selectedClient}\r\n />\r\n </FormRow>\r\n \r\n <div className=\"form-right-button\">\r\n <IconButton tooltipText=\"Add advertiser\" type=\"plus\" tooltipPosition=\"left\" roundedButton={true} onClick={clientFormRowToggle} />\r\n </div> \r\n </div>\r\n <div className=\"row-tab-hidden\">\r\n <FormRow>\r\n <FormInput\r\n id=\"client-name\"\r\n title=\"New Advertiser\"\r\n isError={isClientNameError}\r\n errorMessage=\"Please enter Advertiser name\"\r\n onChange={setClientName}\r\n value={createClientName}\r\n />\r\n </FormRow>\r\n \r\n <div className=\"form-btn-group\">\r\n <Button color=\"green\" label=\"Add Advertiser\" onClick={createClientHandler} />\r\n <Button color=\"gray\" label=\"Cancel\" onClick={()=>{\r\n setCreateClientName(\"\");\r\n setIsClientNameError(false);\r\n clientFormRowToggle()\r\n }} />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"form-row divider\">\r\n <div className=\"d-flex\" style={{'marginBottom':'10px'}}>\r\n <div className=\"form-row-double\" style={{'maxWidth':'316px'}}>\r\n <div className=\"\">\r\n <label htmlFor=\"start\">Starts</label>\r\n <input \r\n type=\"date\" \r\n className={`form-control ${isPeriodStartError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"start\" \r\n onChange={setStartDatePeriod}\r\n />\r\n {isPeriodStartError && <span className=\"error\">Please select start period</span>}\r\n {isPeriodError && <span className=\"error\">Please add at least one period</span>}\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"ends\">Ends</label>\r\n <input \r\n type=\"date\" \r\n className={`form-control ${isPeriodEndError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"ends\" \r\n onChange={setEndDatePeriod}\r\n min={periodStart}\r\n disabled={!!!periodStart}\r\n />\r\n {isPeriodEndError && <span className=\"error\">Please select start period</span>}\r\n </div>\r\n </div>\r\n <div className=\"form-right-button\">\r\n <IconButton tooltipText=\"Add period\" type=\"plus\" tooltipPosition=\"left\" roundedButton={true} onClick={addPeriod}/>\r\n </div>\r\n </div> \r\n\r\n <div className=\"tags-block\">\r\n <div>\r\n {!!periods && periods.map((it ,index) => \r\n <span className=\"tag\">\r\n <span className=\"tag-text\">{formatDate(it.startDate)} - {formatDate(it.endDate)} </span>\r\n <IconButton tooltipText=\"Delete period\" type=\"cross\" onClick={()=>{deletePeriod(index)}} />\r\n </span>)}\r\n </div> \r\n </div>\r\n </div>\r\n \r\n <FormRow>\r\n <label>Nested Playlists</label>\r\n <Select \r\n options={siteNestedPlaylists.sort((a,b) => sortByNameString(a.siteName, b.siteName))}\r\n isMulti\r\n classNamePrefix={`select`}\r\n filterOption={(option, input)=> option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.siteName} | ${option.playListName}`}\r\n getOptionValue={(option)=> `${option.playListId}`}\r\n value={selectedSiteNestedPlaylists}\r\n onChange={onSelectedNestedPlayListForCampaignChange}\r\n />\r\n </FormRow> \r\n\r\n <FormRow>\r\n <CustomSelect\r\n isSort={true}\r\n label='Tags'\r\n options={tags}\r\n isMulti\r\n classNamePrefix={`select`}\r\n filterOption={(option, input)=> option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option)=> `${option.value}`}\r\n value={tags.filter(it => selectedTags.some(it2 => it2 === it.value))}\r\n onChange={onSelectedTags}\r\n />\r\n </FormRow> \r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={createOrUpdateCampaign}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeModalResetInputsAndErrors}/>\r\n </div>\r\n </RightModal> \r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n )\r\n}\r\n\r\nexport default CampaignModal","export const getPagesCount = (length:number, itemsPerPage:number) => {\r\n return length % itemsPerPage === 0 ? length / itemsPerPage : Math.floor(length / itemsPerPage) + 1;\r\n}\r\n\r\nexport const getPage = <T>(items:T[], page:number, itemsPerPage:number) => {\r\n let start = (page - 1)*itemsPerPage;\r\n let end = start + itemsPerPage;\r\n return items.slice(start,end);\r\n}","import { FunctionComponent, memo, useEffect } from \"react\";\r\n\r\n\r\ninterface PaginationProps {\r\n pagesCount: number,\r\n activePage: number,\r\n aroundElements?: number,\r\n isShow?: boolean\r\n changePaginationPage: (page:number) => void\r\n}\r\n \r\nconst Pagination: FunctionComponent<PaginationProps> = memo((props: PaginationProps) => {\r\n let {pagesCount, activePage, aroundElements = 1, isShow = true, changePaginationPage} = props\r\n\r\n let totalPaginationElements = aroundElements * 4 + 1;\r\n let minIndex = aroundElements * 2 + 1;\r\n let maxIndex = pagesCount - minIndex;\r\n\r\n let paginationClasses = `pagination ${!isShow && 'hide'}`;\r\n\r\n let links = [];\r\n for ( let i = 1; i <= pagesCount; i++) links.push(i);\r\n\r\n const renderPageLink = (page: number, isActive: boolean) => {\r\n return <a key={page} className={`${isActive ? \"active\": \"\"}`} onClick={()=>{changePaginationPage(page)}} >{page}</a> \r\n }\r\n\r\n const renderLeftSidePagination = (limit: number) => {\r\n let leftSide:JSX.Element[] = [];\r\n for ( let i = 1; i <= limit; i++){\r\n leftSide.push(renderPageLink(i, i === activePage))\r\n }\r\n return leftSide.map(it => it)\r\n }\r\n\r\n const renderRightSidePagination = (limit: number) => {\r\n let rightSide:JSX.Element[] = [];\r\n for ( let i = limit; i <= pagesCount; i++){\r\n rightSide.push(renderPageLink(i, i === activePage))\r\n }\r\n return rightSide.map(it => it)\r\n }\r\n\r\n const renderMiddlePagination = (from:number, to: number) => {\r\n let middletSide:JSX.Element[] = [];\r\n for ( let i = from; i <= to; i++){\r\n middletSide.push(renderPageLink(i, i === activePage))\r\n }\r\n return middletSide.map(it => it)\r\n }\r\n\r\n if(pagesCount <= totalPaginationElements) {\r\n return (\r\n <div className={paginationClasses}>\r\n {links.map(i => renderPageLink(i, i === activePage))}\r\n </div>\r\n )\r\n } else {\r\n if(activePage < minIndex){\r\n return (\r\n <div className={paginationClasses}>\r\n {renderLeftSidePagination(minIndex)}\r\n <span>...</span>\r\n {renderRightSidePagination(pagesCount - aroundElements + 1)}\r\n </div>\r\n )\r\n }\r\n if(activePage > (maxIndex + 1)){\r\n return (\r\n <div className={paginationClasses}>\r\n {renderLeftSidePagination(aroundElements)}\r\n <span>...</span>\r\n {renderRightSidePagination(maxIndex + 1)}\r\n </div>\r\n )\r\n }\r\n return (\r\n <div className={paginationClasses}>\r\n {renderLeftSidePagination(aroundElements)}\r\n {(activePage - aroundElements) > aroundElements + 1 ? <span>...</span> : <></>}\r\n {renderMiddlePagination(activePage - aroundElements, activePage + aroundElements)}\r\n {(activePage + aroundElements - 1) < pagesCount - aroundElements ? <span>...</span> : <></>}\r\n {renderRightSidePagination(pagesCount - aroundElements + 1)}\r\n </div>\r\n )\r\n } \r\n})\r\n \r\nexport default Pagination;","import React from \"react\";\r\nimport { RouteComponentProps, withRouter } from \"react-router\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport { addCampaignMedia, AddCampaignMediaRequest, CampaignMediaItem, CampaignPeriod, CampaignStatus, CampaingListModel, deleteCampaign, deleteCampaignMedia, getCampaignMedia, getCampaigns, pauseCampaign, pauseCampaignMedia, ChangeStatusCampaignMediaRequest, publishCampaign, StopPlayRequest, playCampaignMedia, getCampaignsArchived, uploadMediaForCampaign, postMediaCampaignVast, CampaignMediaScheduleRequest, postCampaignMediaSchedulePeriod, getCampaignMediaSchedule, CampaignMediaScheduleResponse, deleteCampaignMediaSchedulePeriod, postCampaignLock, postCampaignUnlock} from \"../../../api/campaingsApi\";\r\nimport { getBaseChannels, getSiteNestedPlayListsForCampaign, SiteNestedPlaylistForCampaign } from \"../../../api/channelsApi\";\r\nimport { Client, getClients } from \"../../../api/clientApi\";\r\nimport { getMedia, getMediaById, MediaContentType, MediaContentTypeOption, mediaContentTypeOptions, MediaModel, MediaType, updateMedia } from \"../../../api/mediaApi\";\r\nimport { getTags } from \"../../../api/tagApi\";\r\nimport { addLeadingZero, formatDuration } from \"../../../services/common\";\r\nimport { formatDate, formatTime, formatTimeOnly } from \"../../../services/dateService\";\r\nimport { Button } from \"../../components/Button\";\r\nimport { FormInput, FormRow, SelectOption } from \"../../components/formRow/FormRow\";\r\nimport IconButton from \"../../components/iconButton/IconButton\";\r\nimport Search from \"../../components/search/Search\";\r\nimport GlobalSpinner from '../../components/globalsSpinner/GlobalSpinner';\r\nimport {RightModal, CenterModal, SmallModal } from \"../../components/sideModal/Modal\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport \"./../../styles/formControls.css\";\r\nimport \"./Campaign.css\";\r\nimport SvgSelector from \"../../components/svgSelector/SvgSelector\";\r\nimport SelectFileButton, { SelectMultipleFileButton } from \"../../components/selectFileButton/SelectFileButton\";\r\nimport FileInfoImage from \"../../components/fileInfo/FileInfo\";\r\nimport CampaignModal from \"../../components/campaignModal/CampaignModal\";\r\nimport Select, { SingleValue } from \"react-select\";\r\nimport { getPagesCount } from \"../../../services/paginator\";\r\nimport Pagination from \"../../components/pagination/Pagination\";\r\nimport moment from \"moment\";\r\n\r\nexport interface CampaignsProps extends RouteComponentProps<any>\r\n{\r\n logOut : () => void;\r\n toogleCollapse : () => void;\r\n isCollapsed: boolean;\r\n}\r\n\r\nexport type CampaignsState = \r\n{\r\n showCampaignModal: boolean,\r\n showMediaModal: boolean,\r\n showDeleteModal: boolean,\r\n showGlobalSpinner: boolean,\r\n showArchivedCampaigns: boolean,\r\n showVASTModal: boolean,\r\n\r\n clientToggle? : boolean,\r\n campaigns : CampaingListModel[],\r\n loadStatus: \"loading\" | \"loaded\",\r\n createClientName : string, \r\n selectedClientId: string,\r\n campaignName: string,\r\n channelOptions: SelectOption[],\r\n tagsOptions: SelectOption[],\r\n selectedChannels: Guid[],\r\n selectedTags: Guid[],\r\n selectedStatusOption: number | undefined\r\n\r\n periods: CampaignPeriod[],\r\n periodStart: string,\r\n periodEnd: string,\r\n\r\n isNameError: boolean,\r\n isSelectedClientError:boolean,\r\n isClientNameError: boolean,\r\n isPeriodStartError: boolean,\r\n isPeriodEndError: boolean,\r\n isPeriodError: boolean,\r\n isChannelsError: boolean,\r\n isTagError : boolean\r\n\r\n isShowMedia:boolean,\r\n campaignMedia : CampaignMediaItem[],\r\n media: MediaModel[],\r\n selectedMedia: {id: string, index: number}[],\r\n campaignId: Guid,\r\n \r\n campaignForDeleteId : Guid,\r\n campaignForDelete: string,\r\n \r\n searchString: string,\r\n currentPage: number,\r\n\r\n searchCampaignNameString: string,\r\n currentPageOfCamapigns: number,\r\n\r\n vastName: string,\r\n isVastNameError: boolean,\r\n vastUrl: string\r\n isVastUrlError: boolean,\r\n clockID: string,\r\n\r\n campaignMediaInfo: CampaignMediaItem | null,\r\n showCampaignMediaInfoModal: boolean,\r\n\r\n mediaInfo: MediaModel,\r\n\r\n isShowScheduleModal: boolean,\r\n mediaPeriodName: string,\r\n isMediaPeriodNameError: boolean,\r\n mediaPeriodStart: string,\r\n isMediaPeriodStartError: boolean,\r\n mediaPeriodEnd: string,\r\n isMediaPeriodEndError: boolean,\r\n mediaIdForSetSchedule: Guid,\r\n campaignMediaSchedule: CampaignMediaScheduleResponse[],\r\n campaignPeriods: CampaignPeriod[],\r\n\r\n mediaPeriodStartTime: string,\r\n mediaPeriodEndTime: string,\r\n isMediaPeriodEndTimeError: boolean,\r\n\r\n campaignForEdit : CampaingListModel | undefined,\r\n\r\n selectedContentTypeOption: SingleValue<MediaContentTypeOption>\r\n}\r\n\r\nclass Campaigns extends React.Component<CampaignsProps, CampaignsState> {\r\n constructor(props: CampaignsProps) {\r\n super(props);\r\n }\r\n\r\n mediaItemsPerPage = 12;\r\n camapignPerPage = 20;\r\n\r\n statusOptions = [\r\n {\r\n type:CampaignStatus.Draft,\r\n name:\"Draft\"\r\n },\r\n {\r\n type:CampaignStatus.Scheduled,\r\n name:\"Scheduled\"\r\n },\r\n {\r\n type:CampaignStatus.Active,\r\n name:\"Active\"\r\n },\r\n {\r\n type:CampaignStatus.Expired,\r\n name:\"Expired\"\r\n },\r\n {\r\n type:CampaignStatus.Paused,\r\n name:\"Paused\"\r\n },\r\n ];\r\n\r\n override async componentWillMount(){\r\n this.setState({\r\n showGlobalSpinner: false,\r\n showArchivedCampaigns: false,\r\n showVASTModal: false,\r\n clientToggle:false,\r\n loadStatus : \"loading\",\r\n isNameError: false,\r\n isSelectedClientError:false,\r\n isClientNameError: false,\r\n isPeriodStartError: false,\r\n isPeriodEndError: false,\r\n isPeriodError:false,\r\n isShowMedia: false,\r\n isChannelsError: false,\r\n campaignMedia: [],\r\n selectedMedia: [],\r\n campaigns: [],\r\n channelOptions: [ { name : \"Some\", value : \"1\"}],\r\n selectedChannels: [],\r\n selectedTags:[],\r\n isTagError: false,\r\n\r\n\r\n searchString: '',\r\n currentPage: 1,\r\n\r\n selectedStatusOption: undefined,\r\n\r\n searchCampaignNameString: '',\r\n currentPageOfCamapigns: 1,\r\n\r\n vastName: '',\r\n isVastNameError: false,\r\n vastUrl: '',\r\n isVastUrlError: false,\r\n clockID: '',\r\n\r\n campaignMediaInfo: null,\r\n showCampaignMediaInfoModal:false,\r\n\r\n isShowScheduleModal: false,\r\n mediaPeriodName: '',\r\n isMediaPeriodNameError: false,\r\n periodStart: '',\r\n isMediaPeriodStartError: false,\r\n periodEnd: '',\r\n isMediaPeriodEndError: false,\r\n mediaIdForSetSchedule: '',\r\n campaignMediaSchedule: [],\r\n campaignPeriods:[],\r\n\r\n mediaPeriodStart: '',\r\n mediaPeriodEnd: '',\r\n mediaPeriodStartTime: '',\r\n mediaPeriodEndTime: '',\r\n isMediaPeriodEndTimeError: false,\r\n\r\n campaignForEdit: undefined,\r\n\r\n selectedContentTypeOption: mediaContentTypeOptions[0]\r\n });\r\n \r\n await Promise.all([this.updateList(),this.updateChannelsBaseOptions()])\r\n \r\n }\r\n\r\n updateList = async () => {\r\n this.setState({loadStatus: \"loading\", showArchivedCampaigns:false, showGlobalSpinner:true});\r\n\r\n var getCampaignsResponse = await getCampaigns();\r\n switch(getCampaignsResponse.type){\r\n case \"succes\" :{\r\n this.setState({campaigns : getCampaignsResponse.data.campaigns, loadStatus: \"loaded\", showGlobalSpinner:false});\r\n }\r\n } \r\n }\r\n\r\n updateChannelsBaseOptions = async () => {\r\n let channelsResult = await getBaseChannels();\r\n if(channelsResult.type == \"succes\") this.setState({channelOptions : channelsResult.data.items.map(it => { return {name: it.name, value: it.id}})})\r\n }\r\n\r\n showArchivedCampaignsList = async () =>{\r\n this.setState({loadStatus: \"loading\", showArchivedCampaigns: true, showGlobalSpinner:true});\r\n await this.updateArchivedList();\r\n this.setState({loadStatus: \"loaded\", showGlobalSpinner:false})\r\n }\r\n\r\n updateArchivedList = async () => {\r\n var getCampaignsResponse = await getCampaignsArchived();\r\n switch(getCampaignsResponse.type){\r\n case \"succes\" :{\r\n this.setState({campaigns : getCampaignsResponse.data.campaigns, loadStatus: \"loaded\"});\r\n }\r\n } \r\n }\r\n\r\n renderPeriod = (period: CampaignPeriod, i:number) =>{\r\n return <p key={i}>{formatDate(period.startDate)}-{formatDate(period.endDate)}</p>\r\n }\r\n\r\n pause = async (id: Guid) => {\r\n var request : StopPlayRequest = { campaignId: id };\r\n var result = await pauseCampaign(request);\r\n await this.updateList(); \r\n }\r\n\r\n publish = async(id: Guid) => {\r\n var request : StopPlayRequest = { campaignId: id };\r\n var result = await publishCampaign(request);\r\n await this.updateList(); \r\n }\r\n\r\n renderStatus = (status: CampaignStatus) => {\r\n switch(status){\r\n case CampaignStatus.Active : return <td className=\"status-active\">Active</td>;\r\n case CampaignStatus.Draft : return <td className=\"status-draft\">Draft</td>;\r\n case CampaignStatus.Paused : return <td className=\"status-paused\">Paused</td>;\r\n case CampaignStatus.Scheduled : return <td className=\"status-scheduled\">Scheduled</td>;\r\n case CampaignStatus.Expired : return <td className=\"status-expired\">Expired</td>;\r\n }\r\n }\r\n\r\n renderCampaignSiteNestedPlaylists = (playlists:SiteNestedPlaylistForCampaign[]) => {\r\n return playlists.map( (it, index) => {\r\n return <p key={index}>{it.siteName} | {it.playListName}</p>\r\n })\r\n }\r\n\r\n lockCampaign = async (id:Guid) => {\r\n this.setState({showGlobalSpinner: true});\r\n await postCampaignLock(id);\r\n if(this.state.showArchivedCampaigns){\r\n await this.updateArchivedList();\r\n } else await this.updateList();\r\n this.setState({showGlobalSpinner: false});\r\n }\r\n\r\n unlockCampaign = async (id:Guid) => {\r\n this.setState({showGlobalSpinner: true});\r\n await postCampaignUnlock(id);\r\n if(this.state.showArchivedCampaigns){\r\n await this.updateArchivedList();\r\n } else await this.updateList();\r\n this.setState({showGlobalSpinner: false});\r\n }\r\n\r\n renderCampaignRow = (campaign : CampaingListModel) => {\r\n return <tr key={campaign.id}>\r\n <td>{campaign.campaignId ? campaign.campaignId : ''}</td>\r\n <td>{campaign.name}</td>\r\n <td>{campaign.client.name}</td>\r\n <td>{this.renderCampaignSiteNestedPlaylists(campaign.playLists)}</td>\r\n <td> \r\n {campaign.periods.map(this.renderPeriod)}\r\n </td>\r\n {this.renderStatus(campaign.status)}\r\n <td>\r\n {campaign.isLockedFromDeleting ? <span>\r\n <IconButton type=\"lock\" tooltipText=\"Release\" onClick={()=>{this.unlockCampaign(campaign.id)}}/>\r\n </span> : <span className='opacity-50'>\r\n <IconButton type=\"lock\" tooltipText=\"Retain\" onClick={()=>{this.lockCampaign(campaign.id)}}/>\r\n </span>}\r\n {!this.state.showArchivedCampaigns && <>\r\n <IconButton type=\"list-add\" tooltipText=\"Media\" onClick={()=>{ this.openCampaignMediaModal(campaign.id, campaign.periods); }}/>\r\n <IconButton type=\"edit\" tooltipText=\"Edit\" onClick={() => { this.showCreateModal(campaign)}}/>\r\n {\r\n (campaign.status == CampaignStatus.Draft || campaign.status == CampaignStatus.Paused) && \r\n <IconButton type=\"play\" tooltipText=\"Play\" onClick={() => {this.publish(campaign.id)}}/>\r\n }\r\n {\r\n (campaign.status == CampaignStatus.Scheduled || campaign.status == CampaignStatus.Active) && \r\n <IconButton type=\"stop-play\" tooltipText=\"Stop\" onClick={() => {this.pause(campaign.id)}}/>\r\n } \r\n {/* <IconButton type=\"delete\" onClick={() => {this.showDeleteModal(campaign.id, campaign.name)}}/> */}\r\n <IconButton type=\"archive\" tooltipText=\"Archive\" onClick={()=> this.showDeleteModal(campaign.id, campaign.name)}/>\r\n </>\r\n }\r\n </td>\r\n </tr>\r\n } \r\n\r\n deleteCampaign = async () => {\r\n await deleteCampaign(this.state.campaignForDeleteId);\r\n await this.updateList();\r\n this.closeDeleteModal();\r\n }\r\n\r\n openCampaignMediaModal = async (id: string, campaignPeriods: CampaignPeriod[]) => {\r\n this.showMediaModal();\r\n this.setState({\r\n campaignId: id,\r\n campaignPeriods: campaignPeriods\r\n });\r\n await this.loadMediaForCampaign(id);\r\n }\r\n\r\n addChannel= (id: Guid) => this.setState({ selectedChannels: [...this.state.selectedChannels, id], isChannelsError: false});\r\n\r\n removeChannel = (id: Guid) => this.setState({ selectedChannels: this.state.selectedChannels.filter(it => it !== id)});\r\n\r\n renderItem = (a : {name : string}) => {\r\n return <span>{a.name}</span>\r\n }\r\n\r\n round = (value: number, size: number) => Math.round(value*Math.pow(10, size))/Math.pow(10, size); \r\n \r\n renderMediaType = (campaignMedia: CampaignMediaItem) => {\r\n switch(campaignMedia.mediaType){\r\n case MediaType.Image : return `Image (${this.round(campaignMedia.size/1024.0/1024.0, 2)}MB)`;\r\n case MediaType.Video : return `Video (${this.round(campaignMedia.size/1024.0/1024.0, 2)}MB)`;\r\n case MediaType.VastUrl : return \"VAST Url\";\r\n case MediaType.Youtube : return \"Youtube\";\r\n case MediaType.YoutubeLive : return \"Youtube Live\";\r\n case MediaType.WebPage : return \"Web Page\";\r\n }\r\n }\r\n\r\n checkPeriodStatus = (period: CampaignMediaScheduleResponse) => {\r\n let currentDate = new Date()\r\n if(moment(period.end).isBefore(currentDate)){\r\n return \"status-expired\"\r\n }\r\n if(moment(currentDate).isBetween(period.start, period.end)){\r\n return \"status-active\"\r\n }\r\n return \"\"\r\n }\r\n\r\n renderSchedule = (periods: CampaignMediaScheduleResponse[]) => {\r\n let sortedPeriods = periods.sort((a, b) => moment(a.start).diff(moment(b.start)));\r\n return sortedPeriods.map( it => {\r\n let status = this.checkPeriodStatus(it)\r\n return <p key={it.id} className={`${status}`}>{formatDate(it.start)} - {formatDate(it.end)}</p>\r\n })\r\n }\r\n\r\n sortBySchedule = (campaignMedias : CampaignMediaItem[]) => {\r\n let sorted = campaignMedias.sort((a,b)=>{\r\n let aMinDate, bMinDate;\r\n aMinDate = moment.min(a.schedule.map( it => moment(it.start)));\r\n bMinDate = moment.min(b.schedule.map( it => moment(it.start)));\r\n return moment(aMinDate).diff(moment(bMinDate))\r\n })\r\n return sorted;\r\n }\r\n\r\n renderCampaignMediaTypeLink = (campaignMedia : CampaignMediaItem) => {\r\n switch(campaignMedia.mediaType){\r\n case MediaType.Image : return <span className=\"file-name\" onClick={()=>this.showCampaignMediaInfoModal(campaignMedia.mediaId)}>{campaignMedia.name}</span>;\r\n case MediaType.Video : return <span className=\"file-name\" onClick={()=>this.showCampaignMediaInfoModal(campaignMedia.mediaId)}>{campaignMedia.name}</span>\r\n case MediaType.VastUrl : return <span>{campaignMedia.name}</span>\r\n case MediaType.Youtube : return <span className=\"file-name\" onClick={()=>this.showCampaignMediaInfoModal(campaignMedia.mediaId)}>{campaignMedia.name}</span>\r\n case MediaType.YoutubeLive : return <span className=\"file-name\" onClick={()=>this.showCampaignMediaInfoModal(campaignMedia.mediaId)}>{campaignMedia.name}</span>\r\n case MediaType.WebPage : return <span>{campaignMedia.name}</span>\r\n }\r\n }\r\n \r\n renderCampaingMediaRow = (campaignMedia : CampaignMediaItem, index: number) => {\r\n let classes = campaignMedia.isPaused ? 'is-paused' : '';\r\n return <tr className={classes}>\r\n <td>{addLeadingZero(index+1, 2)}</td>\r\n <td>\r\n {this.renderMediaTypePreview(campaignMedia)}\r\n </td>\r\n <td>\r\n {this.renderCampaignMediaTypeLink(campaignMedia)}\r\n <p>Type: <b>{this.renderMediaType(campaignMedia)}</b></p>\r\n </td>\r\n <td>\r\n Duration: {formatDuration(campaignMedia.durationMs)}\r\n </td>\r\n <td>\r\n {this.renderSchedule(campaignMedia.schedule)}\r\n </td>\r\n <td>\r\n <IconButton type=\"clock\" tooltipText=\"Schedule\" onClick={() => {this.showScheduleModal(campaignMedia.id)}} />\r\n {campaignMedia.isPaused ? <IconButton tooltipText=\"Start\" type=\"play\" onClick={()=> this.playCampaingMedia(campaignMedia.id)} /> : \r\n <IconButton tooltipText=\"Stop\" type=\"stop-play\" onClick={()=> this.stopCampaingMedia(campaignMedia.id)} />}\r\n <IconButton tooltipPosition=\"left\" tooltipText=\"Delete\" type=\"delete\" onClick={() => this.deleteCampaignMedia(campaignMedia.id)} />\r\n </td>\r\n </tr>\r\n }\r\n\r\n updateCampaignMediaSchedule = async () => {\r\n let result = await getCampaignMediaSchedule(this.state.campaignId, this.state.mediaIdForSetSchedule);\r\n if(result.type === \"succes\") {\r\n this.setState({\r\n campaignMediaSchedule: result.data.items\r\n })\r\n }\r\n }\r\n\r\n updateCampaignMediaScheduleByOpenScheduleModal = async (id: Guid) => {\r\n let result = await getCampaignMediaSchedule(this.state.campaignId,id);\r\n if(result.type === \"succes\") {\r\n this.setState({\r\n campaignMediaSchedule: result.data.items\r\n })\r\n }\r\n }\r\n\r\n showScheduleModal = async (id:Guid) => {\r\n this.setState({\r\n isShowScheduleModal:true,\r\n mediaIdForSetSchedule: id\r\n })\r\n await this.updateCampaignMediaScheduleByOpenScheduleModal(id);\r\n }\r\n\r\n closeScheduleModal = async () => {\r\n await this.loadMediaForCampaign(this.state.campaignId)\r\n this.setState({\r\n isShowScheduleModal:false,\r\n mediaIdForSetSchedule: ''\r\n })\r\n }\r\n\r\n setMediaPeriodName = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n this.setState({\r\n isMediaPeriodNameError: false,\r\n mediaPeriodName : event.target.value\r\n });\r\n }\r\n\r\n setMediaPeriodStart = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n this.setState({\r\n isMediaPeriodStartError: false,\r\n mediaPeriodStart : event.target.value\r\n });\r\n }\r\n\r\n setMediaPeriodEnd = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n this.setState({\r\n isPeriodEndError: false,\r\n isMediaPeriodEndError: false,\r\n mediaPeriodEnd : event.target.value\r\n });\r\n }\r\n\r\n setMediaPeriodStartTime = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n this.setState({\r\n mediaPeriodStartTime : event.target.value\r\n });\r\n }\r\n\r\n setMediaPeriodEndTime = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n this.setState({\r\n isMediaPeriodEndTimeError: false,\r\n mediaPeriodEndTime : event.target.value\r\n });\r\n }\r\n\r\n saveMediaPeriods = async () => {\r\n let isError = false;\r\n if(this.state.mediaPeriodName === '') {\r\n this.setState({isMediaPeriodNameError:true});\r\n isError = true\r\n }\r\n\r\n if(this.state.mediaPeriodStart === '') {\r\n this.setState({isMediaPeriodStartError:true});\r\n isError = true\r\n }\r\n\r\n if(this.state.mediaPeriodEnd === '') {\r\n this.setState({isMediaPeriodEndError:true});\r\n isError = true\r\n }\r\n\r\n if(new Date(this.state.mediaPeriodEnd) < new Date(this.state.mediaPeriodStart)){\r\n this.setState({isMediaPeriodEndError:true});\r\n isError = true\r\n }\r\n\r\n if(this.state.mediaPeriodStartTime !== ''){\r\n if(this.state.mediaPeriodEndTime === ''){\r\n this.setState({isMediaPeriodEndTimeError: true})\r\n isError = true\r\n } else {\r\n let [hoursStart, minutesStart] = this.state.mediaPeriodStartTime.split(\":\");\r\n let [hoursEnd, minutesEnd] = this.state.mediaPeriodEndTime.split(\":\");\r\n\r\n if(hoursStart >= hoursEnd){\r\n if(minutesStart > minutesEnd){\r\n this.setState({isMediaPeriodEndTimeError: true})\r\n isError = true\r\n }\r\n }\r\n }\r\n }\r\n \r\n if(isError) return\r\n\r\n let request:CampaignMediaScheduleRequest = {\r\n name: this.state.mediaPeriodName,\r\n start: this.state.mediaPeriodStart,\r\n end: this.state.mediaPeriodEnd,\r\n startTime: this.state.mediaPeriodStartTime,\r\n endTime: this.state.mediaPeriodEndTime\r\n }\r\n\r\n this.setState({\r\n showGlobalSpinner:true\r\n })\r\n\r\n let result = await postCampaignMediaSchedulePeriod(request, this.state.campaignId, this.state.mediaIdForSetSchedule);\r\n if(result.type === \"succes\") {\r\n await this.updateCampaignMediaSchedule();\r\n }\r\n\r\n this.setState({\r\n mediaPeriodName: '',\r\n mediaPeriodStart: '',\r\n mediaPeriodEnd: '',\r\n mediaPeriodStartTime: '',\r\n mediaPeriodEndTime: '',\r\n showGlobalSpinner: false\r\n })\r\n }\r\n\r\n removeCampaignMediaSchedulePeriod = async (scheduleId:Guid) => {\r\n await deleteCampaignMediaSchedulePeriod(this.state.campaignId, this.state.mediaIdForSetSchedule, scheduleId);\r\n await this.updateCampaignMediaSchedule();\r\n }\r\n\r\n renderCampaignMediaScheduleRow = (periods: CampaignMediaScheduleResponse[]) => {\r\n return periods.map( it => {\r\n return <tr key={it.id}>\r\n <td>{it.name} </td>\r\n <td>{formatDate(it.start)}</td>\r\n <td>{formatDate(it.end)}</td>\r\n <td>{formatTimeOnly(it.startTime)}</td>\r\n <td>{formatTimeOnly(it.endTime)}</td>\r\n <td>\r\n <IconButton type=\"delete\" tooltipText=\"Delete\" tooltipPosition=\"left\" onClick={()=>{\r\n this.removeCampaignMediaSchedulePeriod(it.id)}\r\n }/>\r\n </td>\r\n </tr>\r\n })\r\n }\r\n\r\n\r\n deleteCampaignMedia = async (campaignMediaId : Guid) => {\r\n this.setState({showGlobalSpinner: true});\r\n await deleteCampaignMedia(campaignMediaId);\r\n \r\n await this.loadMediaForCampaign(this.state.campaignId);\r\n this.setState({showGlobalSpinner: false});\r\n }\r\n\r\n playCampaingMedia = (id: Guid) => this.changeStatusCampaignMedia(id, \"play\");\r\n stopCampaingMedia = (id: Guid) => this.changeStatusCampaignMedia(id, \"stop\");\r\n \r\n changeStatusCampaignMedia = async(id: Guid, action: \"play\" | \"stop\") => {\r\n var request : ChangeStatusCampaignMediaRequest = { campaignMediaId: id };\r\n var apiFunction = action == \"play\" ? playCampaignMedia : pauseCampaignMedia;\r\n this.setState({showGlobalSpinner: true});\r\n var result = await apiFunction(request);\r\n if( result.type = \"succes\") {\r\n await this.loadMediaForCampaign(this.state.campaignId)\r\n }\r\n this.setState({showGlobalSpinner: false});\r\n }\r\n\r\n loadMediaForCampaign = async (id: Guid) => {\r\n var getMediaResponse = await getCampaignMedia(id);\r\n if(getMediaResponse.type == \"succes\"){\r\n let filteredMedia = getMediaResponse.data.media.filter(it => it.deleteDate === null);\r\n this.setState({ campaignMedia : filteredMedia})\r\n }\r\n }\r\n\r\n renderMediaLibraryItem = (item: {mediaType: MediaType, number?: number, previewLink: string, fileName: string, id: string}) => {\r\n const className = `media-elem ${item.number && \"checked\"}`\r\n return <div className={className} onClick={() => this.addOrRemoveMedia(item.id)}>\r\n <span className=\"check-elem\">{item.number}</span>\r\n {this.renderMediaTypePreviewModal(item.mediaType, item.previewLink)}\r\n <p className=\"media-title\">{item.fileName}</p>\r\n </div>\r\n }\r\n\r\n addOrRemoveMedia = (id: string) => {\r\n var selectedMedia = this.state.selectedMedia;\r\n for( var i = 0; i < selectedMedia.length; i++){\r\n if (selectedMedia[i].id === id) {\r\n selectedMedia.splice(i, 1); \r\n for(var decreaseId = i; decreaseId < selectedMedia.length; decreaseId++){\r\n selectedMedia[decreaseId].index = selectedMedia[decreaseId].index-1; \r\n }\r\n this.setState({selectedMedia: selectedMedia});\r\n return;\r\n } \r\n }\r\n \r\n var maxIndex = selectedMedia.length === 0 ? 0 : Math.max(...selectedMedia.map(it => it.index));\r\n selectedMedia.push({id: id, index: maxIndex+1});\r\n this.setState({selectedMedia: selectedMedia});\r\n }\r\n\r\n addMediaToCampaign = async () => {\r\n const request : AddCampaignMediaRequest = {\r\n campaignId : this.state.campaignId,\r\n mediaIds: this.state.selectedMedia.map(it => it.id)\r\n };\r\n\r\n const result = await addCampaignMedia(request); \r\n\r\n if(result.type === \"succes\"){\r\n this.setState({selectedMedia : []});\r\n await this.loadMediaForCampaign(this.state.campaignId);\r\n this.closeMediaLibrary();\r\n }\r\n }\r\n\r\n getNumberOfSelectedMedia = (id: string): number | undefined => {\r\n var element = this.state.selectedMedia.find(it => it.id === id);\r\n return element && element.index;\r\n }\r\n\r\n showCreateModal = (campaign?: CampaingListModel) => { \r\n if (campaign === undefined) {\r\n this.setState({campaignForEdit: undefined})\r\n } else {\r\n this.setState({\r\n campaignForEdit: campaign\r\n })\r\n }\r\n\r\n this.setState({showCampaignModal: true}); \r\n } \r\n\r\n closeCampaignModal = () => {\r\n this.setState({\r\n showCampaignModal: false,\r\n campaignForEdit: undefined\r\n })\r\n }; \r\n\r\n showMediaModal = () => this.setState({showMediaModal: true}); \r\n closeMediaModal = async () => this.setState({showMediaModal: false});\r\n\r\n showMediaLibrary = async () => {\r\n this.setState({showGlobalSpinner: true})\r\n var getMediaResponse = await getMedia();\r\n if(getMediaResponse.type == \"succes\"){\r\n this.setState({\r\n media: getMediaResponse.data.medias,\r\n currentPage: 1,\r\n isShowMedia: true,\r\n showGlobalSpinner: false\r\n });\r\n }\r\n }\r\n closeMediaLibrary = () => this.setState({isShowMedia: false});\r\n showDeleteModal = (id: Guid, name: string) => this.setState({showDeleteModal : true, campaignForDeleteId: id, campaignForDelete: name});\r\n closeDeleteModal = () => this.setState({showDeleteModal : false, campaignForDeleteId: \"\"});\r\n\r\n setSearchString = (search: string) => {\r\n this.setState({\r\n searchString: search,\r\n currentPage: 1,\r\n })\r\n }\r\n\r\n setSearchCampaignNameString = (search: string) => {\r\n this.setState({\r\n searchCampaignNameString : search,\r\n currentPageOfCamapigns: 1\r\n })\r\n }\r\n\r\n getMediaPagesNumber = () => {\r\n let length = this.getFilteredBySearch().length;\r\n return getPagesCount(length, this.mediaItemsPerPage)\r\n }\r\n\r\n getCampaignPagesNumber = () => {\r\n let length = this.getCampaignsToDisplay().totalCount;\r\n return getPagesCount(length, this.camapignPerPage)\r\n }\r\n\r\n getCampaignsToDisplay = () => {\r\n let filteredCampaigns = this.getFilteredByCampaignName();\r\n\r\n filteredCampaigns = this.getFilteredByCampaignStatus(filteredCampaigns);\r\n let startIndex = (this.state.currentPageOfCamapigns - 1)*this.camapignPerPage;\r\n let finishIndex = startIndex + this.camapignPerPage;\r\n return {\r\n items: filteredCampaigns.slice(startIndex, finishIndex),\r\n totalCount: filteredCampaigns.length\r\n }\r\n }\r\n\r\n getFilteredByCampaignStatus = (campaigns: CampaingListModel[]) => {\r\n if(this.state.selectedStatusOption){\r\n return campaigns.filter( it => it.status === this.state.selectedStatusOption)\r\n }\r\n return campaigns\r\n }\r\n \r\n getFilteredByCampaignName = () => {\r\n return this.state.searchCampaignNameString === '' \r\n ? this.state.campaigns \r\n : this.state.campaigns.filter(\r\n it => (!!it.name && it.name.toLowerCase().includes(this.state.searchCampaignNameString.toLowerCase()))\r\n || (it.campaignId && it.campaignId.toLowerCase().includes(this.state.searchCampaignNameString.toLowerCase()))\r\n );\r\n }\r\n\r\n getMediaItemsToDisplay = () => {\r\n var filteredBySearch = this.getFilteredBySearch();\r\n let startIndex = (this.state.currentPage - 1)*this.mediaItemsPerPage;\r\n let finishIndex = startIndex + this.mediaItemsPerPage;\r\n return filteredBySearch.slice(startIndex, finishIndex) \r\n }\r\n\r\n getFilteredBySearch = () => {\r\n return this.state.searchString === '' \r\n ? this.state.media \r\n : this.state.media.filter(it => !!it.name && it.name.toLowerCase().includes(this.state.searchString.toLowerCase()))\r\n }\r\n\r\n changePaginationPage = (currentPage: number) => {\r\n this.setState({currentPage: currentPage})\r\n }\r\n\r\n changePaginationPageOfCampaigns = (currentPage: number) => {\r\n this.setState({currentPageOfCamapigns: currentPage})\r\n }\r\n\r\n async onSelectMediaForCampaign(event: React.ChangeEvent<HTMLInputElement>): Promise<void>{\r\n if(event.target.files){\r\n const formData = new FormData();\r\n this.setState({showGlobalSpinner : true})\r\n formData.append(\"Media\", event.target.files[0] )\r\n await uploadMediaForCampaign(formData, this.state.campaignId);\r\n await this.loadMediaForCampaign( this.state.campaignId);\r\n this.setState({showGlobalSpinner : false})\r\n }\r\n }\r\n\r\n closeVASTModal = () => { this.setState({\r\n showVASTModal: false,\r\n vastName:'',\r\n isVastNameError: false,\r\n vastUrl:'',\r\n isVastUrlError:false,\r\n selectedContentTypeOption: mediaContentTypeOptions[0]\r\n })};\r\n \r\n showVASTModal = () => { this.setState({showVASTModal: true})};\r\n\r\n setVastName = (newName: string) => { this.setState({vastName: newName, isVastNameError: false})}\r\n setVastUrl = (newUrl: string) => { this.setState({vastUrl: newUrl, isVastUrlError: false})}\r\n setClockID = (newID: string) => { this.setState({clockID: newID})}\r\n\r\n saveVastUrl = async () => {\r\n let isValid = true;\r\n if(!this.state.vastName) { this.setState({isVastNameError : true}); isValid = false; }\r\n if(!this.state.vastUrl) { this.setState({isVastUrlError : true}); isValid = false; }\r\n\r\n if(!isValid) return\r\n this.setState({showGlobalSpinner: true});\r\n let request = { name: this.state.vastName, url: this.state.vastUrl, contentType: this.state.selectedContentTypeOption!.type, clockID: this.state.clockID}\r\n let result = await postMediaCampaignVast(request, this.state.campaignId);\r\n if(result.type == \"succes\") {\r\n this.closeVASTModal();\r\n await this.loadMediaForCampaign( this.state.campaignId);\r\n }\r\n this.setState({showGlobalSpinner:false})\r\n }\r\n\r\n\r\n getMediaInfoById = async (id:Guid) => {\r\n let mediaInfoResponse = await getMediaById(id);\r\n if(mediaInfoResponse.type == \"succes\"){\r\n this.setState({mediaInfo: mediaInfoResponse.data.data});\r\n }\r\n }\r\n\r\n closeCampaignMediaInfoModal = () => {\r\n let video = document.querySelector('video');\r\n video?.pause();\r\n video && (video.currentTime = 0);\r\n this.setState({showCampaignMediaInfoModal: false})\r\n };\r\n\r\n showCampaignMediaInfoModal = async (campaignMediaId: Guid) => { \r\n this.setState({showGlobalSpinner:true})\r\n await this.getMediaInfoById(campaignMediaId);\r\n this.setState({\r\n showGlobalSpinner:false,\r\n showCampaignMediaInfoModal: true\r\n })\r\n };\r\n\r\n onUpdateMediaInfo = async (id: string, newName: string, newDuration: number, mediaType: MediaType, label : MediaContentType | null, clockID: string)=>{\r\n this.setState({showGlobalSpinner: true})\r\n mediaType === MediaType.Image ? (\r\n await updateMedia(id,{newName: newName, newDurationMs: newDuration, contentType: label, clockID: clockID})\r\n ):(\r\n await updateMedia(id,{newName: newName, contentType: label, clockID: clockID})\r\n )\r\n await this.loadMediaForCampaign(this.state.campaignId);\r\n this.setState({showGlobalSpinner: false, showCampaignMediaInfoModal: false});\r\n };\r\n\r\n renderMediaTypePreview = (media: CampaignMediaItem) => {\r\n switch(media.mediaType){\r\n case MediaType.Image : return <img className=\"sortable__item-img\" src={media.thumbnailUrl} alt=\"\" />\r\n case MediaType.Video : return <img className=\"sortable__item-img\" src={media.thumbnailUrl} alt=\"\" />\r\n case MediaType.VastUrl : return <SvgSelector title=\"url\" color=\"#ff0000\" />;\r\n case MediaType.Youtube : return <img className=\"sortable__item-img\" src={media.thumbnailUrl} alt=\"\" />;\r\n case MediaType.YoutubeLive : return <img className=\"sortable__item-img\" src={media.thumbnailUrl} alt=\"\" />;\r\n case MediaType.WebPage : return <SvgSelector title=\"webview\" color=\"red\" />;\r\n }\r\n }\r\n\r\n renderMediaTypePreviewModal = (type: MediaType, url: string) => {\r\n switch(type){\r\n case MediaType.Image : return <img className=\"media-img-preview\" src={url} alt=\"\" />\r\n case MediaType.Video : return <img className=\"media-img-preview\" src={url} alt=\"\" />\r\n case MediaType.VastUrl : return <SvgSelector title=\"url\" />;\r\n case MediaType.Youtube : return <img className=\"media-img-preview\" src={url} alt=\"\" />;\r\n case MediaType.YoutubeLive : return <img className=\"media-img-preview\" src={url} alt=\"\" />;\r\n case MediaType.WebPage : return <SvgSelector title=\"webview\" />;\r\n }\r\n }\r\n\r\n onSelectedMediaLabel = (newValue: SingleValue<MediaContentTypeOption>) => {\r\n this.setState({ selectedContentTypeOption: newValue})\r\n }\r\n\r\n onSelectedStatusOption = (newValue: SingleValue<{type:CampaignStatus, name: string}>) => {\r\n this.setState({ \r\n selectedStatusOption: newValue?.type, \r\n currentPageOfCamapigns: 1\r\n })\r\n }\r\n\r\n render() {\r\n let campaignListLength = this.getCampaignsToDisplay().totalCount\r\n return <InnerLayout \r\n activeTab=\"campaigns\" \r\n logOut={this.props.logOut} \r\n toogleCollapse={this.props.toogleCollapse}\r\n isCollapsed={this.props.isCollapsed}\r\n >\r\n <>\r\n <GlobalSpinner isShow={this.state.showGlobalSpinner}/>\r\n \r\n <div className=\"d-flex justify-content-between align-items-center mb-20 pt-50\">\r\n <div className=\"d-flex\">\r\n {this.state.showArchivedCampaigns ? \r\n <Button color=\"green\" label=\"Show ACTIVE Campaigns\" onClick={this.updateList} /> : \r\n <Button color=\"green\" label=\"Show ARCHIVED Campaigns\" onClick={this.showArchivedCampaignsList} />\r\n }\r\n \r\n </div>\r\n <div className=\"d-flex\">\r\n <div className=\"d-flex align-items-center gap5\" style={{width:\"250px\", marginRight:\"15px\"}}>\r\n <label>Status</label>\r\n <Select \r\n options={this.statusOptions}\r\n className={`w-100`}\r\n classNamePrefix={`select`}\r\n filterOption={(option, input) => option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option) => `${option.type}`}\r\n onChange={this.onSelectedStatusOption} \r\n isClearable={true}\r\n /> \r\n </div>\r\n <Search onChangeValue={this.setSearchCampaignNameString} />\r\n <Button color=\"green\" label=\"Add Campaign\" onClick={this.showCreateModal} />\r\n </div>\r\n </div>\r\n\r\n {campaignListLength ? <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Campaign ID</td>\r\n <td>Campaign </td>\r\n <td>Client</td>\r\n <td>Networks | Playlists </td>\r\n <td>Periods</td>\r\n <td>Status</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {this.getCampaignsToDisplay().items.map(this.renderCampaignRow)}\r\n </tbody>\r\n </table> : <p className=\"w-100 text-center\">There are no Campaigns</p>}\r\n\r\n <Pagination \r\n isShow={!!campaignListLength}\r\n activePage={this.state.currentPageOfCamapigns} \r\n pagesCount={this.getCampaignPagesNumber()} \r\n changePaginationPage={this.changePaginationPageOfCampaigns} \r\n />\r\n\r\n <CampaignModal\r\n campaign = {this.state.campaignForEdit}\r\n showCampaignModal = {this.state.showCampaignModal}\r\n closeCampaignModal = {this.closeCampaignModal}\r\n updateCampaignListFunction = {this.updateList}\r\n />\r\n\r\n <CenterModal \r\n title=\"Campaign Media\"\r\n show={this.state.showMediaModal}\r\n onRequestClose={this.closeMediaModal}\r\n >\r\n <>\r\n <div className={`d-flex justify-content-${this.state.isShowMedia ? 'between' : 'end'} align-items-center mb-40 `}>\r\n { this.state.isShowMedia && <Search value={this.state.searchString} onChangeValue={this.setSearchString} />}\r\n { !this.state.isShowMedia && <>\r\n {/* <SelectFileButton onChange={(e)=>{this.onSelectMediaForCampaign(e)}}/>   */}\r\n <SelectMultipleFileButton \r\n title=\"Add Media\" \r\n campaignId={this.state.campaignId} \r\n onMediaUploaded={()=>this.loadMediaForCampaign(this.state.campaignId)} \r\n />  \r\n <Button color=\"green\" label=\"Add Vast\" onClick={this.showVASTModal} />   \r\n <Button color=\"green\" label=\"Select Media\" onClick={this.showMediaLibrary} />\r\n </> }\r\n </div>\r\n {!this.state.isShowMedia &&\r\n <table className=\"table modal-table media-list-table\">\r\n <thead>\r\n <tr>\r\n <td></td>\r\n <td></td>\r\n <td>File</td>\r\n <td>Details</td>\r\n <td>Schedule</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {this.sortBySchedule(this.state.campaignMedia).map(this.renderCampaingMediaRow)}\r\n </tbody>\r\n </table>\r\n }\r\n {this.state.isShowMedia && <>\r\n <div className=\"media-library\">\r\n {this.getMediaItemsToDisplay().map(\r\n it => this.renderMediaLibraryItem(\r\n {\r\n mediaType: it.mediaType,\r\n fileName: it.name, \r\n previewLink: it.previewLink, \r\n id: it.id, \r\n number: this.getNumberOfSelectedMedia(it.id)}))} \r\n </div>\r\n \r\n <Pagination \r\n activePage={this.state.currentPage} \r\n pagesCount={this.getMediaPagesNumber()} \r\n changePaginationPage={this.changePaginationPage} \r\n />\r\n\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Add\" onClick={()=>{this.addMediaToCampaign()}} />\r\n <Button color=\"gray\" label=\"Cancel\" onClick={this.closeMediaLibrary} />\r\n </div>\r\n </>}\r\n </>\r\n </CenterModal> \r\n\r\n <CenterModal title=\"Campaign Media Info\" show={this.state.showCampaignMediaInfoModal} onRequestClose={this.closeCampaignMediaInfoModal}>\r\n {this.state.mediaInfo ? <FileInfoImage mediaInfo={this.state.mediaInfo} mode=\"edit\" onUpdateMediaInfo={this.onUpdateMediaInfo} /> : \r\n <h1>Media info is undefined</h1>\r\n }\r\n </CenterModal> \r\n\r\n <SmallModal show={this.state.showDeleteModal} onRequestClose={this.closeDeleteModal}> \r\n <p>That you want to archive campaign <b>{this.state.campaignForDelete}</b>?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={this.closeDeleteModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={this.deleteCampaign}/>\r\n </div>\r\n </SmallModal>\r\n\r\n <RightModal title=\"VAST\" show={this.state.showVASTModal} onRequestClose={this.closeVASTModal}>\r\n <FormRow>\r\n <FormInput \r\n title=\"Name\" \r\n id=\"name-id\"\r\n value={this.state.vastName} \r\n isError={this.state.isVastNameError} \r\n errorMessage=\"Invalid vast name\" \r\n onChange={()=>{}} \r\n onChangeValue={this.setVastName} \r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n title=\"URL\" \r\n id=\"url-id\" \r\n value={this.state.vastUrl} \r\n isError={this.state.isVastUrlError} \r\n errorMessage=\"Invalid vast url\" \r\n onChange={()=>{}} \r\n onChangeValue={this.setVastUrl} \r\n />\r\n </FormRow>\r\n <FormRow>\r\n <label>Content Type</label>\r\n <Select\r\n className={`w-100`}\r\n classNamePrefix={`select`}\r\n options={mediaContentTypeOptions}\r\n filterOption={(option, input) => option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option) => `${option.type}`}\r\n onChange={this.onSelectedMediaLabel}\r\n value={this.state.selectedContentTypeOption}\r\n isMulti={false}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n title=\"Clock ID\" \r\n id=\"clock-id\"\r\n value={this.state.clockID} \r\n isError={false} \r\n errorMessage=\"\" \r\n onChange={()=>{}} \r\n onChangeValue={this.setClockID} \r\n />\r\n </FormRow>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={this.saveVastUrl}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={this.closeVASTModal}/>\r\n </div>\r\n </RightModal> \r\n\r\n <CenterModal title=\"Media schedule\" show={this.state.isShowScheduleModal} onRequestClose={this.closeScheduleModal}>\r\n <div className=\"mosaic-period-wrapper\">\r\n <div className=\"mosaic-period-inputs\">\r\n <div>\r\n <FormInput \r\n errorMessage = \"Please enter name\"\r\n id = \"period_name\"\r\n isError = {this.state.isMediaPeriodNameError}\r\n title = \"Name\"\r\n onChange = {this.setMediaPeriodName}\r\n value = {this.state.mediaPeriodName}\r\n />\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"start\">Start Date</label>\r\n <input \r\n type=\"date\" \r\n className={`form-control ${this.state.isMediaPeriodStartError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"start\" \r\n onChange={this.setMediaPeriodStart}\r\n value={this.state.mediaPeriodStart}\r\n />\r\n {this.state.isMediaPeriodStartError && <span className=\"error\">Please select start period</span>}\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"ends\">End Date</label>\r\n <input \r\n type=\"date\" \r\n className={`form-control ${this.state.isMediaPeriodEndError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"ends\" \r\n onChange={this.setMediaPeriodEnd}\r\n value={this.state.mediaPeriodEnd}\r\n min={this.state.mediaPeriodStart}\r\n disabled={!!!this.state.mediaPeriodStart}\r\n />\r\n {this.state.isMediaPeriodEndError && <span className=\"error\">End period should be later than start period</span>}\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"start-time\">Start Time</label>\r\n <input \r\n type=\"time\" \r\n className={`form-control`} \r\n name=\"\" \r\n id=\"start-time\" \r\n onChange={this.setMediaPeriodStartTime}\r\n value={this.state.mediaPeriodStartTime}\r\n />\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"ends-time\">End Time</label>\r\n <input \r\n type=\"time\" \r\n className={`form-control ${this.state.isMediaPeriodEndTimeError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"ends-time\" \r\n onChange={this.setMediaPeriodEndTime}\r\n value={this.state.mediaPeriodEndTime}\r\n disabled={!!!this.state.mediaPeriodStartTime}\r\n />\r\n {this.state.isMediaPeriodEndTimeError && <span className=\"error\">End period should be later than start period</span>}\r\n </div>\r\n <div className=\"\">\r\n <Button color=\"green\" label=\"Add\" onClick={this.saveMediaPeriods}/>\r\n </div>\r\n </div>\r\n <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Name</td>\r\n <td>Start Date</td>\r\n <td>End Date</td>\r\n <td>Start Time</td>\r\n <td>End Time</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {this.renderCampaignMediaScheduleRow(this.state.campaignMediaSchedule)}\r\n </tbody>\r\n </table>\r\n </div>\r\n </CenterModal>\r\n </>\r\n </InnerLayout>\r\n }\r\n}\r\n\r\nexport default withRouter(Campaigns);","import { type } from \"os\";\r\nimport { FunctionComponent, useState } from \"react\";\r\nimport IconButton from \"../iconButton/IconButton\";\r\nimport { FormSelect, SelectOption } from \"./FormRow\";\r\n\r\ninterface FormMultiSelectProps {\r\n id: string,\r\n title: string,\r\n titleSelected:string,\r\n isError: boolean,\r\n errorMessage: string,\r\n onAdd: (value: string) => void,\r\n onRemove: (value: string) => void,\r\n options: SelectOption[],\r\n selectedOptions?: string[]\r\n}\r\n \r\nconst FormMultiSelect: FunctionComponent<FormMultiSelectProps> = (props) => {\r\n\r\n let {id , title, titleSelected, isError, errorMessage, onAdd, onRemove, options, selectedOptions = []} = props;\r\n\r\n\r\n const add = (value: string) =>{\r\n onAdd(value);\r\n }\r\n\r\n const remove = (value: string) => {\r\n onRemove(value);\r\n }\r\n\r\n const getOptions = () =>{\r\n if( !!!options ) return [];\r\n let result = options.filter((it)=>{\r\n return selectedOptions.findIndex( so => so == it.value) === -1;\r\n });\r\n\r\n return result;\r\n }\r\n\r\n return (\r\n <>\r\n {!!options && <>\r\n <FormSelect \r\n id={id}\r\n title={title}\r\n isError={isError}\r\n selectedValue={''}\r\n errorMessage={errorMessage}\r\n onChange={add}\r\n options={getOptions()}\r\n />\r\n \r\n\r\n <label>{titleSelected}</label>\r\n <div className=\"tags-block additional-block\">\r\n {selectedOptions && selectedOptions.map((it)=>{\r\n return <span className=\"tag\" key={`key${it}`}>\r\n <span className=\"tag-text\">{options.find((it2) => { return it2.value == it })?.name}</span>\r\n <IconButton tooltipText=\"Remove item\" type=\"cross\" onClick={()=>{remove(it)}} />\r\n </span>\r\n })}\r\n </div>\r\n </>\r\n } \r\n </>\r\n );\r\n}\r\n \r\nexport default FormMultiSelect;\r\n","import React from \"react\";\r\nimport { RouteComponentProps, withRouter } from \"react-router\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport \"./Media.css\";\r\nimport { deleteMedia, getMediaPlayout, getMediaWithPagination, MediaContentType, MediaContentTypeOption, mediaContentTypeOptions, MediaModel, MediaPlayout, MediaPlayoutRequest, MediaType, MediaVastRequest as MediaVastRequest, postMediaVast, postWebPage, postYoutubeMedia, updateMedia, updateMediaVast, updateWebPage, uploadMedia, WebPageRequest, YoutubeMediaRequest } from \"../../../api/mediaApi\";\r\nimport { formatDate } from \"../../../services/dateService\";\r\nimport { SelectMultipleFileButton } from \"../../components/selectFileButton/SelectFileButton\";\r\nimport Search from \"../../components/search/Search\";\r\nimport IconButton from \"../../components/iconButton/IconButton\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport { CenterModal, RightModal, SmallModal } from \"../../components/sideModal/Modal\";\r\nimport FileInfo from \"../../components/fileInfo/FileInfo\";\r\nimport { Button } from \"../../components/Button\";\r\nimport { FormInput, FormInputNumber, FormRow } from \"../../components/formRow/FormRow\";\r\nimport SvgSelector from \"../../components/svgSelector/SvgSelector\";\r\nimport { getCampaignsBase } from \"../../../api/campaingsApi\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport Select, { MultiValue, SingleValue } from \"react-select\";\r\nimport { sunbScribeOnClick, unsubscribe } from \"../../../services/globalEventHandler\";\r\nimport DropdownBlock from \"../../components/dropdown/dropdownBlock\";\r\nimport moment, { Moment } from \"moment\";\r\nimport FormCheckbox from \"../../components/formRow/FormCheckbox\";\r\nimport Pagination from \"../../components/pagination/Pagination\";\r\nimport MediaTranscodeModal from \"../../components/mediaTranscodeModal/MediaTranscodeModal\";\r\n\r\ntype Option<T> = { value: T, label: string} \r\n\r\nenum FilterDatesType {\r\n All = 1,\r\n Today = 2,\r\n Yesterday = 3,\r\n Last7Days = 4,\r\n Last30Days = 5\r\n}\r\n\r\nexport interface MediaProps extends RouteComponentProps<any>\r\n{\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n\r\n}\r\n\r\nexport type MediaState = \r\n{\r\n media : MediaModel[],\r\n campaigns: Option<Guid>[],\r\n selectedCampaigns: Guid[],\r\n\r\n isUploading: boolean\r\n showMediaInfoModal: boolean,\r\n mediaInfo?: MediaModel,\r\n showVASTModal :boolean,\r\n vastIdForUpdate: Guid,\r\n vastName: string,\r\n isVastNameError: boolean,\r\n vastUrl: string\r\n isVastUrlError: boolean,\r\n clockId: string,\r\n searchString: string,\r\n currentPage: number,\r\n totalPages: number,\r\n\r\n periodStart?: Moment,\r\n periodEnd?: Moment,\r\n isPeriodStartError: boolean,\r\n isPeriodEndError: boolean,\r\n isDatefilterDropdownShow: boolean,\r\n currentFilterPeriod: FilterDatesType | '',\r\n\r\n newMediaName: string,\r\n newDurationMs: string,\r\n showMediaDeleteModal: boolean,\r\n mediaIdForAction: Guid,\r\n mediaNameForDelete: string,\r\n\r\n showYoutubeModal:boolean,\r\n youtubeName: string,\r\n isYoutubeNameError: boolean,\r\n youtubeUrl: string,\r\n isYoutubeUrlError: boolean,\r\n isLiveYoutube: boolean,\r\n youtubeDuration: string | number,\r\n\r\n selectedContentTypeOption: SingleValue<MediaContentTypeOption>,\r\n\r\n showWebPageModal:boolean,\r\n webPageIdForUpdate: Guid,\r\n webPageName: string,\r\n isWebPageNameError: boolean,\r\n webPageUrl: string,\r\n isWebPageUrlError: boolean,\r\n webPageDuration: string | number,\r\n webPageClockId: string,\r\n\r\n selectedWebPageContentTypeOption: SingleValue<MediaContentTypeOption>,\r\n\r\n idsForPlayouts: Guid[],\r\n playouts: MediaPlayout[],\r\n\r\n isShowTranscodeModal: boolean,\r\n}\r\n\r\nclass Media extends React.Component<MediaProps, MediaState> {\r\n constructor(props: MediaProps) {\r\n super(props);\r\n this.state = {\r\n media: [],\r\n campaigns: [],\r\n selectedCampaigns: [],\r\n isUploading: false,\r\n showMediaInfoModal: false,\r\n showVASTModal: false,\r\n vastIdForUpdate: '',\r\n vastName: '',\r\n isVastNameError: false,\r\n vastUrl: '',\r\n isVastUrlError: false,\r\n clockId: '',\r\n searchString: '',\r\n currentPage: 1,\r\n totalPages: 1,\r\n\r\n isPeriodStartError: false,\r\n isPeriodEndError: false,\r\n isDatefilterDropdownShow: false,\r\n currentFilterPeriod: '',\r\n\r\n newMediaName: '',\r\n newDurationMs: '10',\r\n showMediaDeleteModal: false,\r\n mediaIdForAction: '',\r\n mediaNameForDelete: '',\r\n\r\n showYoutubeModal: false,\r\n youtubeName: '',\r\n isYoutubeNameError: false,\r\n youtubeUrl: '',\r\n isYoutubeUrlError: false,\r\n isLiveYoutube: false,\r\n youtubeDuration: 15,\r\n\r\n selectedContentTypeOption: mediaContentTypeOptions[0],\r\n\r\n showWebPageModal:false,\r\n webPageIdForUpdate:'',\r\n webPageName: '',\r\n isWebPageNameError: false,\r\n webPageUrl: '',\r\n isWebPageUrlError: false,\r\n webPageDuration: 15,\r\n webPageClockId:'',\r\n\r\n selectedWebPageContentTypeOption: mediaContentTypeOptions[0],\r\n\r\n idsForPlayouts:[],\r\n playouts: [],\r\n \r\n isShowTranscodeModal: false,\r\n };\r\n \r\n this.onFileChange = this.onFileChange.bind(this);\r\n this.updateMediaList = this.updateMediaList.bind(this);\r\n }\r\n\r\n debounceTimer: NodeJS.Timeout | null = null; \r\n\r\n mediaItemsPerPage = 20;\r\n\r\n override async componentWillMount(){\r\n\r\n await Promise.all([this.updateMediaList(),this.updateCampaignsBaseOptions()])\r\n\r\n sunbScribeOnClick(()=>{\r\n this.hideDatefilterDropdown();\r\n }, \"mediaDateFilter\")\r\n }\r\n\r\n override async componentDidUpdate(prevProps:MediaProps, prevState: MediaState) {\r\n if (\r\n prevState.selectedCampaigns !== this.state.selectedCampaigns ||\r\n prevState.periodStart !== this.state.periodStart ||\r\n prevState.periodEnd !== this.state.periodEnd) {\r\n await this.updateMediaList()\r\n }\r\n if (prevState.searchString !== this.state.searchString) {\r\n if (this.debounceTimer) {\r\n clearTimeout(this.debounceTimer);\r\n }\r\n this.debounceTimer = setTimeout(async () => {\r\n await this.updateMediaList()\r\n }, 1000);\r\n }\r\n }\r\n\r\n override async componentWillUnmount(){\r\n unsubscribe(\"mediaDateFilter\");\r\n }\r\n\r\n setIsUploading = (isUploading: boolean) => this.setState({isUploading: isUploading});\r\n\r\n onChangeSelectedCampaigns = (values: MultiValue<Option<Guid>>) => {\r\n this.setState({\r\n selectedCampaigns: values.map(it => it.value), \r\n currentPage:1\r\n })\r\n }\r\n\r\n onSelectedMediaLabel = (newValue: SingleValue<MediaContentTypeOption>) => {\r\n this.setState({ selectedContentTypeOption: newValue})\r\n }\r\n\r\n async updateMediaList( currentPage?: number){\r\n this.setState({isUploading:true})\r\n var getMediaResult = await getMediaWithPagination({\r\n campaignId: [...this.state.selectedCampaigns],\r\n searchString: this.state.searchString,\r\n startTime: this.state.periodStart ? this.state.periodStart.toISOString() : null,\r\n endTime: this.state.periodEnd ? this.state.periodEnd.toISOString() : null,\r\n pageNumber: currentPage ? currentPage : this.state.currentPage,\r\n itemsPerPage: this.mediaItemsPerPage\r\n });\r\n \r\n if(getMediaResult.type === \"succes\"){\r\n this.setState({\r\n media: getMediaResult.data.items.filter(it => it.isDeleted != true),\r\n totalPages: getMediaResult.data.totalPages\r\n })\r\n }\r\n await this.updateMediaPlayouts();\r\n this.setState({isUploading:false})\r\n }\r\n\r\n async updateCampaignsBaseOptions(){\r\n let campaignsResult = await getCampaignsBase();\r\n if(campaignsResult.type == \"succes\") {\r\n this.setState({campaigns: campaignsResult.data.items.map(it => {\r\n return {value: it.id, label: it.name}\r\n })\r\n }); \r\n }\r\n }\r\n\r\n async updateMediaPlayouts(mediaIds: Guid[] = []){\r\n let mediaIdsForPlayouts\r\n if(!mediaIds.length){\r\n // mediaIdsForPlayouts = getPage<MediaModel>(this.state.media, this.state.currentPage, this.mediaItemsPerPage).map(it => it.id);\r\n mediaIdsForPlayouts = this.state.media.map(it => it.id);\r\n } else { mediaIdsForPlayouts = mediaIds }\r\n let playoutRequest:MediaPlayoutRequest = {\r\n ids: mediaIdsForPlayouts,\r\n playerId: null\r\n }\r\n let playoutResponse = await getMediaPlayout(playoutRequest);\r\n if(playoutResponse.type === \"succes\"){\r\n this.setState({playouts: playoutResponse.data.items})\r\n }\r\n }\r\n\r\n setSearchString = (search: string) => {\r\n this.setState({\r\n searchString: search,\r\n currentPage: 1\r\n })\r\n }\r\n\r\n checkCurrentFilterPeriod = (filterPeriod: FilterDatesType) => {\r\n return filterPeriod === this.state.currentFilterPeriod\r\n }\r\n\r\n setFilterPeriod = (filterPeriod: FilterDatesType) => {\r\n switch(filterPeriod) {\r\n case FilterDatesType.All : {\r\n this.setState({\r\n periodStart : undefined,\r\n periodEnd : undefined,\r\n currentFilterPeriod: FilterDatesType.All,\r\n currentPage:1\r\n }); break;\r\n }\r\n case FilterDatesType.Today : {\r\n this.setState({\r\n periodStart : moment().startOf(\"date\"),\r\n periodEnd : moment().startOf(\"date\"),\r\n currentFilterPeriod: FilterDatesType.Today,\r\n currentPage:1\r\n }); break;\r\n }\r\n case FilterDatesType.Yesterday : {\r\n this.setState({\r\n periodStart : moment().startOf(\"date\").add(-1,'day'),\r\n periodEnd : moment().startOf(\"date\").add(-1,'day'),\r\n currentFilterPeriod: FilterDatesType.Yesterday,\r\n currentPage:1\r\n }); break;\r\n }\r\n case FilterDatesType.Last7Days : {\r\n this.setState({\r\n periodStart : moment().startOf(\"date\").add(-7,'day'),\r\n periodEnd : moment().startOf(\"date\"),\r\n currentFilterPeriod: FilterDatesType.Last7Days,\r\n currentPage:1\r\n }); break;\r\n }\r\n case FilterDatesType.Last30Days : { \r\n this.setState({\r\n periodStart : moment().startOf(\"date\").add(-30,'day'),\r\n periodEnd : moment().startOf(\"date\"),\r\n currentFilterPeriod: FilterDatesType.Last30Days\r\n }); break;\r\n }\r\n }\r\n }\r\n\r\n\r\n changePaginationPage = async (currentPage: number) => {\r\n this.setState({currentPage: currentPage})\r\n await this.updateMediaList(currentPage)\r\n }\r\n\r\n async onFileChange(event: React.ChangeEvent<HTMLInputElement>): Promise<void>{\r\n if(event.target.files){\r\n const formData = new FormData();\r\n this.setState({isUploading : true})\r\n formData.append(\"Media\", event.target.files[0] )\r\n var res = await uploadMedia(formData);\r\n await this.updateMediaList();\r\n this.setState({isUploading : false})\r\n }\r\n }\r\n\r\n setUpdateName = (newName: string) => this.setState({newMediaName: newName});\r\n setUpdateDuration = (newDuration: string) => this.setState({newDurationMs: newDuration});\r\n\r\n onUpdateMediaInfo = async (id: string, newName: string, newDuration: number, mediaType: MediaType, contentType : MediaContentType | null, clockID: string)=>{\r\n this.setState({isUploading: true})\r\n mediaType === MediaType.Image ? (\r\n await updateMedia(id,{newName: newName, newDurationMs: newDuration, contentType: contentType, clockID: clockID})\r\n ):(\r\n await updateMedia(id,{newName: newName, contentType: contentType, clockID: clockID})\r\n )\r\n await this.updateMediaList();\r\n this.setState({isUploading: false, newMediaName: '', showMediaInfoModal: false});\r\n }\r\n \r\n closeMediaInfoModal = () => { \r\n let video = document.querySelector('video');\r\n video?.pause();\r\n video && (video.currentTime = 0);\r\n this.setState({showMediaInfoModal: false})\r\n };\r\n\r\n closeVASTModal = () => { \r\n this.setState({\r\n showVASTModal: false,\r\n vastIdForUpdate: '',\r\n vastName: '',\r\n isVastNameError:false,\r\n vastUrl: '',\r\n isVastUrlError: false,\r\n selectedContentTypeOption: mediaContentTypeOptions[0],\r\n clockId: ''\r\n })\r\n };\r\n\r\n showMediaInfoModal = (mediaInfo: MediaModel) => { this.setState({mediaInfo: mediaInfo, showMediaInfoModal: true})};\r\n showVASTModal = () => { this.setState({showVASTModal: true})};\r\n\r\n showEditVastModal = (vast: MediaModel) => {\r\n this.setState({\r\n showVASTModal: true,\r\n vastIdForUpdate: vast.id,\r\n vastName: vast.name,\r\n vastUrl: vast.vastUrl,\r\n selectedContentTypeOption: mediaContentTypeOptions.filter(it => it.type === vast.contentType)[0],\r\n clockId: vast.clockId\r\n })\r\n }\r\n \r\n setVastName = (newName: string) => { this.setState({vastName: newName, isVastNameError: false})}\r\n setVastUrl = (newUrl: string) => { this.setState({vastUrl: newUrl, isVastUrlError: false})}\r\n setClockID = (newID: string) => { this.setState({clockId: newID})}\r\n \r\n showYoutubeModal = () => { this.setState({showYoutubeModal: true})};\r\n closeYoutubeModal = () => { \r\n this.setState({\r\n showYoutubeModal: false, \r\n isYoutubeNameError:false, \r\n isYoutubeUrlError: false,\r\n youtubeName: \"\",\r\n youtubeUrl:\"\",\r\n isLiveYoutube: false,\r\n youtubeDuration: 15\r\n })\r\n };\r\n setYoutubeName = (newName: string) => { this.setState({youtubeName: newName, isYoutubeNameError: false})}\r\n setYoutubeUrl = (newUrl: string) => { this.setState({youtubeUrl: newUrl, isYoutubeUrlError: false})}\r\n setYoutubeLive = (isLive: boolean) => { this.setState({isLiveYoutube: isLive})}\r\n setYoutubeDuration = (duration: string | number) => { this.setState({youtubeDuration: duration})}\r\n\r\n saveYoutube = async () =>{\r\n let isValid = true;\r\n if(!this.state.youtubeName) { this.setState({isYoutubeNameError : true}); isValid = false; }\r\n if(!this.state.youtubeUrl) { this.setState({isYoutubeUrlError : true}); isValid = false; }\r\n\r\n if(!isValid) return\r\n\r\n let request:YoutubeMediaRequest = {\r\n name: this.state.youtubeName,\r\n url: this.state.youtubeUrl,\r\n isLive: this.state.isLiveYoutube,\r\n duration: +this.state.youtubeDuration\r\n }\r\n\r\n this.setState({isUploading: true});\r\n let result = await postYoutubeMedia(request);\r\n if(result.type === \"succes\"){\r\n this.closeYoutubeModal();\r\n this.setState({ youtubeName: '', youtubeUrl: '', isLiveYoutube: false, youtubeDuration: 15})\r\n await this.updateMediaList();\r\n }\r\n this.setState({isUploading: false});\r\n }\r\n\r\n saveVastUrl = async () => {\r\n let isValid = true;\r\n if(!this.state.vastName) { this.setState({isVastNameError : true}); isValid = false; }\r\n if(!this.state.vastUrl) { this.setState({isVastUrlError : true}); isValid = false; }\r\n\r\n if(!isValid) return\r\n this.setState({isUploading: true});\r\n let request: MediaVastRequest = { \r\n name: this.state.vastName, \r\n url: this.state.vastUrl, \r\n contentType: this.state.selectedContentTypeOption!.type,\r\n clockID: this.state.clockId\r\n }\r\n let result\r\n if(!!this.state.vastIdForUpdate) {\r\n result = await updateMediaVast( this.state.vastIdForUpdate, request);\r\n } else {\r\n result = await postMediaVast(request);\r\n }\r\n if(result.type == \"succes\") {\r\n this.closeVASTModal();\r\n this.setState({vastName:'',vastUrl:'', vastIdForUpdate:'', clockId:''})\r\n await this.updateMediaList();\r\n }\r\n this.setState({isUploading:false})\r\n }\r\n\r\n showWebPageModal = () => { this.setState({showWebPageModal: true})};\r\n closeWebPageModal = () => { \r\n this.setState({\r\n webPageIdForUpdate: \"\",\r\n showWebPageModal: false, \r\n isWebPageNameError:false, \r\n isWebPageUrlError: false,\r\n webPageName: \"\",\r\n webPageUrl:\"\",\r\n webPageDuration: 15,\r\n selectedWebPageContentTypeOption: mediaContentTypeOptions[0],\r\n webPageClockId: \"\",\r\n })\r\n };\r\n setWebPageName = (newName: string) => { this.setState({webPageName: newName, isWebPageNameError: false})}\r\n setWebPageUrl = (newUrl: string) => { this.setState({webPageUrl: newUrl, isWebPageUrlError: false})}\r\n setWebPageDuration = (duration: string | number) => { this.setState({webPageDuration: duration})}\r\n setWebPageClockId = (clockId:string) => {this.setState({webPageClockId: clockId})}\r\n onSelectedWebPageContentType = (newValue: SingleValue<MediaContentTypeOption>) => {\r\n this.setState({ selectedWebPageContentTypeOption: newValue})\r\n }\r\n\r\n saveWebPage = async () => {\r\n let isValid = true;\r\n if(!this.state.webPageName) { this.setState({isWebPageNameError : true}); isValid = false; }\r\n if(!this.state.webPageUrl) { this.setState({isWebPageUrlError : true}); isValid = false; }\r\n\r\n if(!isValid) return\r\n this.setState({isUploading: true});\r\n let request: WebPageRequest = { \r\n name: this.state.webPageName, \r\n url: this.state.webPageUrl, \r\n contentType: this.state.selectedWebPageContentTypeOption!.type,\r\n durationSeconds: +this.state.webPageDuration,\r\n clockID: this.state.webPageClockId\r\n }\r\n let result\r\n if(!!this.state.webPageIdForUpdate) {\r\n result = await updateWebPage( this.state.webPageIdForUpdate, request);\r\n } else {\r\n result = await postWebPage(request);\r\n }\r\n if(result.type == \"succes\") {\r\n this.closeWebPageModal();\r\n await this.updateMediaList();\r\n }\r\n this.setState({isUploading:false})\r\n }\r\n\r\n showEditWebPageModal = (webpage: MediaModel) => {\r\n this.setState({\r\n showWebPageModal: true,\r\n webPageIdForUpdate: webpage.id,\r\n webPageName: webpage.name,\r\n webPageUrl: webpage.url,\r\n selectedWebPageContentTypeOption: mediaContentTypeOptions.filter(it => it.type === webpage.contentType)[0],\r\n webPageDuration: webpage.durationMs / 1000,\r\n webPageClockId: webpage.clockId\r\n })\r\n }\r\n\r\n hideDatefilterDropdown = () => {\r\n this.setState({isDatefilterDropdownShow:false})\r\n }\r\n\r\n toggleDatefilterDropdown = (event?:React.MouseEvent) => {\r\n if(event) event.stopPropagation();\r\n this.setState({isDatefilterDropdownShow: !this.state.isDatefilterDropdownShow})\r\n }\r\n\r\n setStartDatePeriod = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n this.setState({\r\n isPeriodStartError: false,\r\n periodStart : moment(event.target.value),\r\n currentFilterPeriod: ''\r\n });\r\n }\r\n \r\n setEndDatePeriod = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n this.setState({\r\n isPeriodEndError: false,\r\n periodEnd : moment(event.target.value),\r\n currentFilterPeriod: ''\r\n });\r\n }\r\n\r\n showMediaDeleteModal = (id:Guid, mediaName: string) =>{\r\n this.setState({\r\n showMediaDeleteModal:true,\r\n mediaIdForAction: id,\r\n mediaNameForDelete: mediaName,\r\n })\r\n }\r\n\r\n closeMediaDeleteModal = () =>{\r\n this.setState({\r\n showMediaDeleteModal:false,\r\n mediaIdForAction: '',\r\n mediaNameForDelete: '',\r\n })\r\n }\r\n\r\n confirmMediaDelete = async () => {\r\n this.setState({isUploading:true});\r\n await this.deleteMedia(this.state.mediaIdForAction);\r\n this.closeMediaDeleteModal();\r\n this.setState({isUploading:false})\r\n }\r\n\r\n deleteMedia = async (id: Guid) => {\r\n this.setState({isUploading:true});\r\n let result = await deleteMedia(id);\r\n if(result.type == \"succes\"){\r\n await this.updateMediaList();\r\n }\r\n this.setState({isUploading: false})\r\n }\r\n\r\n renderMediaType = (media: MediaModel) => {\r\n switch(media.mediaType){\r\n case MediaType.Image : return `Image (${media.sizeMb}MB)`;\r\n case MediaType.Video : return `Video (${media.sizeMb}MB)`;\r\n case MediaType.VastUrl : return \"VAST Url\";\r\n case MediaType.Youtube : return \"Youtube\";\r\n case MediaType.YoutubeLive : return \"Youtube Live\";\r\n case MediaType.WebPage : return \"Web Page\";\r\n }\r\n }\r\n\r\n renderMediaTypePreview = (media: MediaModel) => {\r\n switch(media.mediaType){\r\n case MediaType.Image : return <img className=\"media-img\" src={media.previewLink} alt=\"\" />;\r\n case MediaType.Video : return <img className=\"media-img\" src={media.previewLink} alt=\"\" />;\r\n case MediaType.VastUrl : return <SvgSelector title=\"url\" />;\r\n case MediaType.Youtube : return <img className=\"media-img\" src={media.previewLink} alt=\"\" />;\r\n case MediaType.YoutubeLive : return <img className=\"media-img\" src={media.previewLink} alt=\"\" />;\r\n case MediaType.WebPage : return <SvgSelector title=\"webview\" />;\r\n }\r\n }\r\n\r\n renderMediaTypeLink = (media: MediaModel) => {\r\n switch(media.mediaType){\r\n case MediaType.Image : return <span className=\"file-name\" onClick={() => {this.showMediaInfoModal(media)}}>{media.name}</span>;\r\n case MediaType.Video : return <span className=\"file-name\" onClick={() => {this.showMediaInfoModal(media)}}>{media.name}</span>;\r\n case MediaType.VastUrl : return <span className=\"file-name\" onClick={() => {this.showEditVastModal(media)}}>{media.name}</span>;\r\n case MediaType.Youtube : return <span className=\"file-name\" onClick={() => {this.showMediaInfoModal(media)}}>{media.name}</span>;\r\n case MediaType.YoutubeLive : return <span className=\"file-name\" onClick={() => {this.showMediaInfoModal(media)}}>{media.name}</span>;\r\n case MediaType.WebPage : return <span className=\"file-name\" onClick={() => {this.showEditWebPageModal(media)}}>{media.name}</span>;\r\n }\r\n }\r\n\r\n renderContentType(contentType:MediaContentType){\r\n switch(contentType){\r\n case MediaContentType.Ads: return mediaContentTypeOptions[0].name;\r\n case MediaContentType.ClientContent: return mediaContentTypeOptions[1].name;\r\n case MediaContentType.SelfContent: return mediaContentTypeOptions[2].name;\r\n case MediaContentType.Backup: return mediaContentTypeOptions[3].name;\r\n }\r\n }\r\n\r\n getCurrentPlayout(id: Guid){\r\n let t = this.state.playouts.find(it => it.mediaId === id);\r\n if(!t){\r\n return \"Loading\"\r\n }\r\n return t.count\r\n }\r\n\r\n renderRow(media: MediaModel, index:number){\r\n return <tr key={media.id}>\r\n <td>\r\n {this.renderMediaTypePreview(media)}\r\n </td>\r\n <td>\r\n {this.renderMediaTypeLink(media)}\r\n </td>\r\n <td>\r\n {media.campaigns.map((it, i) => <p key={i}>{it.name}</p>)}\r\n </td>\r\n <td>\r\n {this.renderMediaType(media)}\r\n </td>\r\n <td>\r\n {formatDate(media.uploadTime)}\r\n </td>\r\n <td>\r\n {this.renderContentType(media.contentType)}\r\n </td>\r\n <td>\r\n {this.getCurrentPlayout(media.id)}\r\n </td>\r\n <td>\r\n <div className=\"d-flex align-items-center justify-content-end\">\r\n {media.mediaType === MediaType.Video && <IconButton tooltipText=\"Transcode\" type=\"dolby\" onClick={()=>this.showTranscodeModal(media.id)}/>}\r\n <IconButton tooltipText=\"Delete\" type=\"delete\" onClick={() => {this.showMediaDeleteModal(media.id, media.name)}}/>\r\n </div>\r\n </td>\r\n </tr>\r\n }\r\n\r\n renderActiveFilterIcon = () => {\r\n return <span className=\"active-filter\">\r\n <SvgSelector title=\"ok\" />\r\n </span>\r\n }\r\n\r\n showTranscodeModal = (id:Guid) => {\r\n this.setState({\r\n mediaIdForAction: id,\r\n isShowTranscodeModal: true,\r\n })\r\n }\r\n\r\n hideTranscodeModal = () => {\r\n this.setState({\r\n isShowTranscodeModal: false,\r\n mediaIdForAction:\"\"\r\n })\r\n }\r\n\r\n checkFilterDateForInput = (date: Moment | undefined) => {\r\n if(!!date) {\r\n return moment(date).format('YYYY-MM-DD')\r\n }\r\n return ''\r\n }\r\n\r\n render(): JSX.Element {\r\n return <InnerLayout \r\n activeTab=\"media\" \r\n logOut={this.props.logOut} \r\n toogleCollapse={this.props.toogleCollapse}\r\n isCollapsed={this.props.isCollapsed}>\r\n \r\n <div>\r\n <GlobalSpinner isShow={this.state.isUploading}/>\r\n <div className=\"d-flex justify-content-between align-items-center mb-20 pt-50\">\r\n <Search value={this.state.searchString} onChangeValue={this.setSearchString}/>\r\n <div className=\"d-flex\">\r\n <Button color=\"green\" label=\"Add Web Page\" onClick={this.showWebPageModal} /> \r\n <Button color=\"green\" label=\"Add Youtube\" onClick={this.showYoutubeModal} /> \r\n <Button color=\"green\" label=\"Add VAST\" onClick={this.showVASTModal} /> \r\n <SelectMultipleFileButton title=\"Add Media\" onMediaUploaded={this.updateMediaList} />\r\n </div>\r\n </div>\r\n <div className=\"d-flex justify-content-between align-items-end mb-20 \">\r\n <div className=\"media-filter__row\">\r\n <div className=\"media-filter__block\">\r\n <label>Campaigns</label>\r\n <Select \r\n options={this.state.campaigns}\r\n isMulti\r\n classNamePrefix={`select`}\r\n onChange={this.onChangeSelectedCampaigns} \r\n /> \r\n </div>\r\n </div>\r\n <div className=\"d-flex align-items-center export-block mb-10\">\r\n <DropdownBlock title={<IconButton tooltipText=\"Filter\" type=\"filter\"/>} isRightPosition={true}>\r\n <FormRow>\r\n <label htmlFor=\"start\">From</label>\r\n <input \r\n type=\"date\" \r\n className={`form-control ${this.state.isPeriodStartError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"start\" \r\n onChange={this.setStartDatePeriod}\r\n value={this.checkFilterDateForInput(this.state.periodStart)}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <label htmlFor=\"end\">To</label>\r\n <input \r\n type=\"date\" \r\n className={`form-control ${this.state.isPeriodEndError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"end\" \r\n onChange={this.setEndDatePeriod}\r\n value={this.checkFilterDateForInput(this.state.periodEnd)}\r\n />\r\n </FormRow>\r\n <div className=\"date-constants\">\r\n <span \r\n className={this.checkCurrentFilterPeriod(FilterDatesType.All) ? 'active' : ''} \r\n onClick={()=> this.setFilterPeriod(FilterDatesType.All)}\r\n >\r\n {this.checkCurrentFilterPeriod(FilterDatesType.All) && this.renderActiveFilterIcon()}\r\n <span className=\"filter-text\">All</span>\r\n </span>\r\n <span \r\n className={this.checkCurrentFilterPeriod(FilterDatesType.Yesterday) ? 'active' : ''}\r\n onClick={()=> this.setFilterPeriod(FilterDatesType.Yesterday)}\r\n >\r\n {this.checkCurrentFilterPeriod(FilterDatesType.Yesterday) && this.renderActiveFilterIcon()}\r\n <span className=\"filter-text\">Yesterday</span>\r\n </span>\r\n <span\r\n className={this.checkCurrentFilterPeriod(FilterDatesType.Today) ? 'active' : ''}\r\n onClick={()=> this.setFilterPeriod(FilterDatesType.Today)}\r\n >\r\n {this.checkCurrentFilterPeriod(FilterDatesType.Today) && this.renderActiveFilterIcon()}\r\n <span className=\"filter-text\">Today</span>\r\n </span>\r\n <span\r\n className={this.checkCurrentFilterPeriod(FilterDatesType.Last7Days) ? 'active' : ''}\r\n onClick={()=> this.setFilterPeriod(FilterDatesType.Last7Days)}\r\n >\r\n {this.checkCurrentFilterPeriod(FilterDatesType.Last7Days) && this.renderActiveFilterIcon()}\r\n <span className=\"filter-text\">Last 7 days</span>\r\n </span>\r\n <span\r\n className={this.checkCurrentFilterPeriod(FilterDatesType.Last30Days) ? 'active' : ''}\r\n onClick={()=> this.setFilterPeriod(FilterDatesType.Last30Days)}\r\n >\r\n {this.checkCurrentFilterPeriod(FilterDatesType.Last30Days) && this.renderActiveFilterIcon()}\r\n <span className=\"filter-text\">Last 30 days</span>\r\n </span>\r\n </div>\r\n </DropdownBlock>\r\n </div>\r\n </div>\r\n <table className=\"table media-table\">\r\n <thead>\r\n <tr>\r\n <td></td>\r\n <td>File Name</td>\r\n <td>Campaign Name</td>\r\n <td>Media Type</td>\r\n <td>Uploaded </td>\r\n <td>Content Type</td>\r\n <td>Playouts</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {!!this.state.media.length && this.state.media.map((m, i) => this.renderRow(m, i)) }\r\n </tbody>\r\n </table> \r\n {!!this.state.media.length && <Pagination \r\n activePage={this.state.currentPage} \r\n pagesCount={this.state.totalPages} \r\n changePaginationPage={this.changePaginationPage} \r\n aroundElements={2}\r\n />}\r\n \r\n <CenterModal title=\"Media info\" show={this.state.showMediaInfoModal} onRequestClose={this.closeMediaInfoModal}>\r\n {this.state.mediaInfo ? <FileInfo \r\n mode=\"edit\" \r\n mediaInfo={this.state.mediaInfo} \r\n onUpdateMediaInfo={this.onUpdateMediaInfo}\r\n /> : \r\n <h1>Media info is undefined</h1>\r\n }\r\n </CenterModal> \r\n <RightModal title=\"VAST\" show={this.state.showVASTModal} onRequestClose={this.closeVASTModal}>\r\n <FormRow>\r\n <FormInput \r\n title=\"Name\" \r\n id=\"name-id\"\r\n value={this.state.vastName} \r\n isError={this.state.isVastNameError} \r\n errorMessage=\"Invalid vast name\" \r\n onChange={()=>{}} \r\n onChangeValue={this.setVastName} \r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n title=\"URL\" \r\n id=\"url-id\" \r\n value={this.state.vastUrl} \r\n isError={this.state.isVastUrlError} \r\n errorMessage=\"Invalid vast url\" \r\n onChange={()=>{}} \r\n onChangeValue={this.setVastUrl} \r\n />\r\n </FormRow>\r\n <FormRow>\r\n <label>Content Type</label>\r\n <Select\r\n className={`w-100`}\r\n classNamePrefix={`select`}\r\n options={mediaContentTypeOptions}\r\n filterOption={(option, input) => option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option) => `${option.type}`}\r\n onChange={this.onSelectedMediaLabel}\r\n value={this.state.selectedContentTypeOption}\r\n isMulti={false}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n title=\"Clock ID\" \r\n id=\"clock-id\"\r\n value={this.state.clockId} \r\n isError={false} \r\n errorMessage=\"\" \r\n onChange={()=>{}} \r\n onChangeValue={this.setClockID} \r\n />\r\n </FormRow>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={this.saveVastUrl}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={this.closeVASTModal}/>\r\n </div>\r\n </RightModal> \r\n <RightModal title=\"Youtube\" show={this.state.showYoutubeModal} onRequestClose={this.closeYoutubeModal}>\r\n <FormRow>\r\n <FormInput \r\n title=\"Name\" \r\n id=\"name-id\"\r\n value={this.state.youtubeName} \r\n isError={this.state.isYoutubeNameError} \r\n errorMessage=\"Invalid youtube name\" \r\n onChange={()=>{}} \r\n onChangeValue={this.setYoutubeName} \r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n title=\"URL\" \r\n id=\"url-id\" \r\n value={this.state.youtubeUrl} \r\n isError={this.state.isYoutubeUrlError} \r\n errorMessage=\"Invalid youtube url\" \r\n onChange={()=>{}} \r\n onChangeValue={this.setYoutubeUrl} \r\n />\r\n </FormRow>\r\n <FormRow>\r\n <div className=\"d-flex align-items-center\">\r\n <FormCheckbox id=\"youtube-live\" checked={this.state.isLiveYoutube} onChange={this.setYoutubeLive} />\r\n <span className=\"status-block\">\r\n {this.state.isLiveYoutube ? <span className=\"current-status online\"> Live</span> : <span className=\"current-status offline\"> Live</span>}\r\n </span>\r\n </div>\r\n </FormRow>\r\n <FormRow>\r\n <FormInputNumber \r\n id=\"youtube-duration\"\r\n title=\"Duration (seconds)\"\r\n isError={false}\r\n errorMessage=\"\"\r\n onChangeValue={value => {\r\n if(value === \"\" || +value < 0 ) this.setYoutubeDuration('')\r\n else this.setYoutubeDuration(+value)\r\n }}\r\n onChange={()=>{}}\r\n value={this.state.youtubeDuration}\r\n />\r\n </FormRow>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={this.saveYoutube}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={this.closeYoutubeModal}/>\r\n </div>\r\n </RightModal> \r\n\r\n <RightModal title=\"Web Page\" show={this.state.showWebPageModal} onRequestClose={this.closeWebPageModal}>\r\n <FormRow>\r\n <FormInput \r\n title=\"Name\" \r\n id=\"webpage-name-id\"\r\n value={this.state.webPageName} \r\n isError={this.state.isWebPageNameError} \r\n errorMessage=\"Invalid Web Page name\" \r\n onChange={()=>{}} \r\n onChangeValue={this.setWebPageName} \r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n title=\"URL\" \r\n id=\"webpage-url-id\" \r\n value={this.state.webPageUrl} \r\n isError={this.state.isWebPageUrlError} \r\n errorMessage=\"Invalid Web Page url\" \r\n onChange={()=>{}} \r\n onChangeValue={this.setWebPageUrl} \r\n />\r\n </FormRow>\r\n <FormRow>\r\n <label>Content Type</label>\r\n <Select\r\n className={`w-100`}\r\n classNamePrefix={`select`}\r\n options={mediaContentTypeOptions}\r\n filterOption={(option, input) => option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option) => `${option.type}`}\r\n onChange={this.onSelectedWebPageContentType}\r\n value={this.state.selectedWebPageContentTypeOption}\r\n isMulti={false}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInputNumber \r\n id=\"webpage-duration\"\r\n title=\"Duration (seconds)\"\r\n isError={false}\r\n errorMessage=\"\"\r\n onChangeValue={value => {\r\n if(value === \"\" || +value < 0 ) this.setWebPageDuration('')\r\n else this.setWebPageDuration(+value)\r\n }}\r\n onChange={()=>{}}\r\n value={this.state.webPageDuration}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n title=\"Clock ID\" \r\n id=\"webpage-clock-id\"\r\n value={this.state.webPageClockId} \r\n isError={false} \r\n errorMessage=\"\" \r\n onChange={()=>{}} \r\n onChangeValue={this.setWebPageClockId} \r\n />\r\n </FormRow>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={this.saveWebPage}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={this.closeWebPageModal}/>\r\n </div>\r\n </RightModal> \r\n\r\n <MediaTranscodeModal \r\n id={this.state.mediaIdForAction} \r\n isShow={this.state.isShowTranscodeModal} \r\n closeHandler={this.hideTranscodeModal} \r\n loadingHandler={this.setIsUploading}\r\n />\r\n \r\n <SmallModal show={this.state.showMediaDeleteModal} onRequestClose={this.closeMediaDeleteModal}> \r\n <p>That you want to delete media <b>{this.state.mediaNameForDelete}</b>?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={this.closeMediaDeleteModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={this.confirmMediaDelete}/>\r\n </div>\r\n </SmallModal>\r\n </div>\r\n \r\n </InnerLayout>\r\n }\r\n}\r\n\r\nexport default withRouter(Media);","import React, { RefObject } from \"react\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport { DayOfWeek, EnableSlotRequest, TimeSlotModel } from \"../../../api/channelsApi\";\r\nimport { addLeadingZero } from \"../../../services/common\";\r\nimport SvgSelector from \"../svgSelector/SvgSelector\";\r\nimport \"./Schedule.css\"\r\n\r\ninterface ScheduleProps {\r\n timeSlots: TimeSlotModel[],\r\n onTimeSlotAdd: (timeSlot: TimeSlotModel) => void;\r\n onTimeSlotRemove: (id: Guid) => void;\r\n onTimeSlotRangeSelect?: (slots:any) => void,\r\n}\r\n \r\ninterface ScheduleState { \r\n startX: number,\r\n startY: number,\r\n endX: number,\r\n endY: number,\r\n isDrawing: boolean\r\n}\r\n\r\n \r\nclass Schedule extends React.Component<ScheduleProps, ScheduleState> {\r\n dragAreaRef: RefObject<HTMLTableElement>;\r\n decoAreaRef: RefObject<HTMLDivElement>;\r\n\r\n constructor(props:ScheduleProps){\r\n super(props)\r\n\r\n this.state = {\r\n startX: 0,\r\n startY: 0,\r\n endX: 0,\r\n endY: 0,\r\n isDrawing: false,\r\n };\r\n this.dragAreaRef = React.createRef<HTMLTableElement>();\r\n this.decoAreaRef = React.createRef<HTMLDivElement>();\r\n \r\n }\r\n\r\n isUseRange = this.props.onTimeSlotRangeSelect ? true : false\r\n\r\n handleMouseDown = (e:React.MouseEvent<Element, MouseEvent>) => {\r\n if(this.dragAreaRef.current && this.decoAreaRef.current && this.isUseRange){\r\n let blockRect = this.dragAreaRef.current?.getBoundingClientRect();\r\n this.setState({\r\n startX: e.clientX - blockRect.left,\r\n startY: e.clientY - blockRect.top,\r\n isDrawing: true\r\n });\r\n this.decoAreaRef.current.style.left = e.clientX - blockRect.left + 'px';\r\n this.decoAreaRef.current.style.top = e.clientY - blockRect.top + 'px';\r\n this.decoAreaRef.current.style.width = '0px';\r\n this.decoAreaRef.current.style.height = '0px';\r\n this.decoAreaRef.current.style.opacity = \"1\"\r\n }\r\n };\r\n\r\n handleMouseMove = (e: React.MouseEvent<Element, MouseEvent>) => {\r\n if (!this.state.isDrawing) return;\r\n\r\n if(this.dragAreaRef.current && this.decoAreaRef.current && this.isUseRange){\r\n let blockRect = this.dragAreaRef.current?.getBoundingClientRect();\r\n\r\n let endX = e.clientX - blockRect.left\r\n let endY = e.clientY - blockRect.top\r\n \r\n const width = Math.abs(endX - this.state.startX);\r\n const height = Math.abs(endY - this.state.startY);\r\n \r\n this.decoAreaRef.current.style.width = width + 'px';\r\n this.decoAreaRef.current.style.height = height + 'px';\r\n \r\n if (endX < this.state.startX) {\r\n this.decoAreaRef.current.style.left = endX + 'px';\r\n }\r\n if (endY < this.state.startY) {\r\n this.decoAreaRef.current.style.top = endY + 'px';\r\n }\r\n }\r\n }\r\n\r\n handleMouseUp = (e: React.MouseEvent<Element, MouseEvent>) => {\r\n if(this.dragAreaRef.current && this.decoAreaRef.current && this.isUseRange){\r\n let blockRect = this.dragAreaRef.current.getBoundingClientRect();\r\n this.setState({\r\n isDrawing: false,\r\n endX: e.clientX - blockRect.left,\r\n endY: e.clientY - blockRect.top\r\n })\r\n\r\n this.decoAreaRef.current.removeAttribute(\"style\")\r\n let selectedSlots = this.selectSlots(this.state.startX, this.state.startY, e.clientX, e.clientY);\r\n \r\n if(this.props.onTimeSlotRangeSelect){\r\n this.props.onTimeSlotRangeSelect({timeSlots: selectedSlots})\r\n }\r\n }\r\n };\r\n\r\n selectSlots = (startX:number, startY:number, endX:number, endY:number) => {\r\n let slots = this.dragAreaRef.current?.querySelectorAll(\".slot-cell\");\r\n if (!slots) {\r\n return;\r\n }\r\n\r\n let blockRect\r\n if(this.dragAreaRef.current){\r\n blockRect = this.dragAreaRef.current.getBoundingClientRect();\r\n startX += blockRect.left\r\n startY += blockRect.top\r\n }\r\n \r\n const newSelectedSlots: Array<EnableSlotRequest> = [];\r\n for (let i = 0; i < slots.length; i++) {\r\n const rect = (slots[i] as HTMLDivElement).getBoundingClientRect();\r\n if (\r\n rect.x + rect.width >= Math.min(startX, endX) &&\r\n rect.x <= Math.max(startX, endX) &&\r\n rect.y + rect.height >= Math.min(startY, endY) &&\r\n rect.y <= Math.max(startY, endY)\r\n ) {\r\n let currentSlot = (slots[i] as HTMLDivElement).dataset.slot\r\n if(currentSlot){\r\n let splittedSlot = currentSlot.split(\"-\")\r\n newSelectedSlots.push({\r\n dayOfWeek: +splittedSlot[0],\r\n hour: +splittedSlot[1],\r\n minute: +splittedSlot[2]\r\n });\r\n }\r\n }\r\n }\r\n\r\n return newSelectedSlots\r\n \r\n };\r\n \r\n hours = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23];\r\n\r\n \r\n isSelected = (dayOfWeek : DayOfWeek, hour: number, minutes: number) => {\r\n const slot = this.props.timeSlots.find(\r\n timeSlot => timeSlot.dayOfWeek == dayOfWeek \r\n && timeSlot.hour == hour\r\n && timeSlot.minute == minutes);\r\n\r\n return slot?.id;\r\n }\r\n\r\n renderScheduleRow = (hour : number, schedule: TimeSlotModel[]) => {\r\n const daysOfWeek = [1, 2, 3, 4, 5, 6, 0]\r\n\r\n return <tr key={hour}>\r\n <td>{addLeadingZero(hour, 2)}:00</td>\r\n {daysOfWeek.map(it => this.renderScheduleIndicator(hour, it))} \r\n </tr>\r\n }\r\n\r\n renderScheduleIndicator = (hour: number, dayOfWeek: DayOfWeek) => {\r\n\r\n const firstHalfId = this.isSelected(dayOfWeek, hour, 0);\r\n const secondHafId = this.isSelected(dayOfWeek, hour, 30); \r\n\r\n if(this.isUseRange){\r\n return <td key={`${dayOfWeek}-${hour}`}>\r\n <div className=\"svg-block\">\r\n <div className=\"slot-cell\" data-slot={`${dayOfWeek}-${hour}-0`}>\r\n <SvgSelector title={ !!firstHalfId ? \"ok\" : \"cross\"} />\r\n </div>\r\n <div className=\"slot-cell\" data-slot={`${dayOfWeek}-${hour}-30`}>\r\n <SvgSelector title={ !!secondHafId ? \"ok\" : \"cross\"} />\r\n </div>\r\n </div>\r\n </td> \r\n }\r\n\r\n return <td key={`${dayOfWeek}-${hour}`}>\r\n <div className=\"svg-block\">\r\n <div className=\"slot-cell\" \r\n data-slot={`${dayOfWeek}-${hour}-0`} \r\n onClick={\r\n () => firstHalfId \r\n ? this.props.onTimeSlotRemove(firstHalfId) \r\n : this.props.onTimeSlotAdd({dayOfWeek: dayOfWeek, hour: hour, minute: 0, id: \"\"})\r\n }\r\n >\r\n <SvgSelector title={ !!firstHalfId ? \"ok\" : \"cross\"} />\r\n </div>\r\n <div className=\"slot-cell\" data-slot={`${dayOfWeek}-${hour}-30`} \r\n onClick={\r\n () => secondHafId \r\n ? this.props.onTimeSlotRemove(secondHafId) \r\n : this.props.onTimeSlotAdd({dayOfWeek: dayOfWeek, hour: hour, minute: 30, id: \"\"})\r\n }\r\n >\r\n <SvgSelector title={ !!secondHafId ? \"ok\" : \"cross\"} />\r\n </div>\r\n </div>\r\n </td> \r\n }\r\n\r\n render() { \r\n return (\r\n <div style={{\"position\":\"relative\"}}>\r\n <table className=\"table schedule-table\" \r\n ref={this.dragAreaRef}\r\n onMouseDown={this.handleMouseDown}\r\n onMouseMove={this.handleMouseMove}\r\n onMouseUp={this.handleMouseUp}\r\n >\r\n <thead>\r\n <tr>\r\n <td></td>\r\n <td>Monday</td>\r\n <td>Tuesday</td>\r\n <td>Wednesday</td>\r\n <td>Thursday</td>\r\n <td>Friday</td>\r\n <td>Saturday</td>\r\n <td>Sunday</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {this.hours.map( it => this.renderScheduleRow(it, this.props.timeSlots))} \r\n </tbody>\r\n </table>\r\n <div className=\"deco-area\" ref={this.decoAreaRef}></div>\r\n </div>\r\n );\r\n }\r\n}\r\n \r\nexport default Schedule;","import React from \"react\";\r\nimport { RouteComponentProps, withRouter } from \"react-router\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport './Channels.css';\r\nimport {Button} from \"../../components/Button\";\r\nimport { CenterModal, RightModal, SmallModal } from \"../../components/sideModal/Modal\";\r\nimport IconButton from \"../../components/iconButton/IconButton\";\r\nimport Search from \"../../components/search/Search\";\r\nimport {FormRow, FormInput, SelectOption, FormSelect } from \"../../components/formRow/FormRow\";\r\nimport FormMultiSelect from \"../../components/formRow/FormMultiSelect\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport { getUnassignedPlayers, unassigneChannelFromPlayer } from \"../../../api/playersApi\";\r\nimport { Channel, ChannelPlayerModel, createChannel, CreateChannelRequest, DayOfWeek, deleteChannel, enableTimeSlots as addTimeSlot, getChannelPlayers, getChannels, getChannelTimeSlots, removeTimeSlots as removeTimeSlot, TestEnum, TimeSlotModel, updateChannel, UpdateChannelRequest, enableRangeOfTimeSlots, EnableRangeOfTimeSlots } from \"../../../api/channelsApi\";\r\nimport Schedule from \"../../components/schedule/Schedule\";\r\nimport { addLeadingZero, formatDuration } from \"../../../services/common\";\r\nimport { formatDate, formatTime } from \"../../../services/dateService\";\r\nimport { createPathWithId, Routes } from \"../../../constants/routes\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport Pagination from \"../../components/pagination/Pagination\";\r\nimport { getPagesCount } from \"../../../services/paginator\";\r\nimport { getCampaignsBase } from \"../../../api/campaingsApi\";\r\nimport CustomSelect, { CustomSelectOption } from \"../../components/customSelect/CustomSelect\";\r\nimport { MultiValue, SingleValue } from \"react-select\";\r\n\r\n\r\nexport interface ChannelsProps extends RouteComponentProps<any>\r\n{\r\n logOut : () => void;\r\n toogleCollapse : () => void;\r\n isCollapsed: boolean;\r\n}\r\n\r\nexport type ChannelsState = \r\n{\r\n options: SelectOption[],\r\n selectedItems: string[],\r\n\r\n showModal: boolean,\r\n showScheduleModal: boolean,\r\n showMediaInfoModal: boolean,\r\n showChannelPlayerListModal: boolean,\r\n\r\n channelName: string,\r\n isChannelNameError: boolean,\r\n dayOfWeekUpdate: string,\r\n isDayOfWeekUpdateError: boolean,\r\n timeOfUpdate: string,\r\n isTimeOfUpdateError: boolean\r\n id: Guid,\r\n playerIds: Guid[],\r\n\r\n channels: Channel[],\r\n\r\n campaignsOption: CustomSelectOption[],\r\n selectedCampaignOption: Guid,\r\n \r\n timeSlots: TimeSlotModel[],\r\n timeSlotChannelId: Guid,\r\n\r\n channelPlayers: ChannelPlayerModel[],\r\n\r\n showSmallModal: boolean,\r\n playerToDeleteId: Guid,\r\n\r\n showSmallModalDelete: boolean,\r\n channelToDeleteId: Guid,\r\n\r\n searchString: string,\r\n currentPage: number,\r\n channelToDeleteName: string,\r\n isLoading: boolean\r\n}\r\n\r\nclass Channels extends React.Component<ChannelsProps, ChannelsState> {\r\n constructor(props: ChannelsProps) {\r\n super(props);\r\n this.state = {\r\n isChannelNameError: false,\r\n isDayOfWeekUpdateError: false,\r\n isTimeOfUpdateError: false,\r\n options: [],\r\n selectedItems: [],\r\n showModal: false,\r\n showScheduleModal: false,\r\n showMediaInfoModal: false,\r\n showChannelPlayerListModal: false,\r\n channelName: \"\",\r\n dayOfWeekUpdate: \"\",\r\n timeOfUpdate: \"\",\r\n id: \"\",\r\n playerIds: [],\r\n\r\n channels: [],\r\n timeSlots: [],\r\n timeSlotChannelId: \"\",\r\n\r\n campaignsOption: [],\r\n selectedCampaignOption: '',\r\n\r\n channelPlayers: [],\r\n\r\n showSmallModal: false,\r\n playerToDeleteId: '',\r\n\r\n showSmallModalDelete: false,\r\n channelToDeleteId: '',\r\n\r\n searchString: '',\r\n currentPage: 1,\r\n channelToDeleteName: '',\r\n isLoading: false\r\n };\r\n }\r\n daysOfWeek : SelectOption[] = [\r\n {name: \"Monday\", value: `${DayOfWeek.Monday}`},\r\n {name: \"Tuesday\", value: `${DayOfWeek.Tuesday}`},\r\n {name: \"Wednesday\", value: `${DayOfWeek.Wednesday}`},\r\n {name: \"Thursday\", value: `${DayOfWeek.Thursday}`},\r\n {name: \"Friday\", value: `${DayOfWeek.Friday}`},\r\n {name: \"Saturday\", value: `${DayOfWeek.Saturday}`},\r\n {name: \"Sunday\", value: `${DayOfWeek.Sunday}`},\r\n ];\r\n\r\n channelsPerPage = 20;\r\n \r\n override async componentDidMount(){\r\n await Promise.all([this.updateChannels(), this.updateCampaigns()])\r\n }\r\n\r\n updateChannels = async (campaignId?: Guid) => {\r\n this.setState({isLoading:true});\r\n let result;\r\n if(campaignId){\r\n result = await getChannels(campaignId);\r\n } else {\r\n result = await getChannels();\r\n }\r\n if(result.type == \"succes\") this.setState({ channels: result.data.items });\r\n this.setState({isLoading:false});\r\n }\r\n\r\n updateCampaigns = async () => {\r\n this.setState({isLoading:true});\r\n var result = await getCampaignsBase();\r\n if(result.type == \"succes\") this.setState({ campaignsOption: result.data.items.map(it => {\r\n return {value: it.id, name:it.name}\r\n }) });\r\n this.setState({isLoading:false});\r\n }\r\n \r\n openModal = async (id: Guid, name: string, playerIds: Guid[], dayOfUpdate: string, timeOfUpdate: string) =>{ \r\n var getPlayersResult = await getUnassignedPlayers(id);\r\n if(getPlayersResult.type == \"succes\"){\r\n var options = getPlayersResult.data.unassignedPlayers.map(it =>{ return {name: it.name, value: it.id} });\r\n this.setState({\r\n showModal: true, \r\n channelName: name, \r\n id: id,\r\n playerIds: playerIds, \r\n options: options,\r\n dayOfWeekUpdate: dayOfUpdate === null ? \"\" : `${dayOfUpdate}`,\r\n timeOfUpdate: timeOfUpdate,\r\n isDayOfWeekUpdateError: false,\r\n isTimeOfUpdateError: false, \r\n isChannelNameError: false}); \r\n } \r\n };\r\n\r\n openScheduleModal = async (id: Guid) => { \r\n var getTimeSlotsResult = await getChannelTimeSlots(id);\r\n if(getTimeSlotsResult.type == \"succes\"){\r\n this.setState({showScheduleModal: true, timeSlots: getTimeSlotsResult.data.items, timeSlotChannelId: id});\r\n }\r\n };\r\n\r\n openChannelPlayerListModal = async (id: Guid) => { \r\n let channelPlayersResult = await getChannelPlayers(id);\r\n if(channelPlayersResult.type == \"succes\"){\r\n this.setState({\r\n showChannelPlayerListModal: true,\r\n channelPlayers: channelPlayersResult.data.items\r\n })\r\n }\r\n };\r\n\r\n closeModal = () => { this.setState({showModal: false, isChannelNameError: false})};\r\n\r\n closeScheduleModal = () => { this.setState({showScheduleModal: false})};\r\n\r\n closeMediaInfoModal = () => { this.setState({showMediaInfoModal: false})};\r\n\r\n closeSmallModal = () => this.setState({showSmallModal: false});\r\n\r\n closeSmallModalDelete = () => this.setState({showSmallModalDelete: false});\r\n\r\n\r\n closeChannelPlayerListModal = () => { this.setState({showChannelPlayerListModal: false})};\r\n\r\n onAdd = (value: string) => this.setState({ selectedItems: [...this.state.selectedItems, value] });\r\n\r\n omRemove = (value: string) => this.setState({ selectedItems: [...this.state.selectedItems.filter(it => it != value)] });\r\n\r\n setChannelName = (newName: string) => this.setState({ channelName: newName, isChannelNameError: false}); \r\n\r\n addPlayer = (id: Guid) => this.setState({ playerIds: [...this.state.playerIds, id]});\r\n\r\n removePlayer = (id: Guid) => this.setState({ playerIds: this.state.playerIds.filter(it => it !== id)});\r\n\r\n\r\n onTimeSlotAdd = async (timeSlot: TimeSlotModel) => {\r\n var result = await addTimeSlot({...timeSlot}, this.state.timeSlotChannelId);\r\n if(result.type == \"succes\"){\r\n this.setState({timeSlots : [...this.state.timeSlots, {...timeSlot, id: result.data.id}]}); \r\n }\r\n }\r\n\r\n onTimeSlotRemove = async (id: Guid) => {\r\n await removeTimeSlot(this.state.timeSlotChannelId, id);\r\n this.setState({timeSlots : this.state.timeSlots.filter(it => it.id !== id)}); \r\n }\r\n\r\n removePlayerFromChannel = async (id: Guid) => { \r\n this.setState({ showSmallModal: true, playerToDeleteId: id });\r\n }\r\n\r\n agreeRemovePlayerFromChannel = async () => {\r\n this.setState({ showSmallModal: false });\r\n let response = await unassigneChannelFromPlayer(this.state.playerToDeleteId);\r\n if(response.type == \"succes\"){\r\n this.setState({\r\n channelPlayers: this.state.channelPlayers.filter(it => it.id !== this.state.playerToDeleteId)\r\n });\r\n this.updateChannels();\r\n }\r\n }\r\n\r\n removeChannel = async (id: Guid, name: string) => { \r\n this.setState({ showSmallModalDelete: true, channelToDeleteId: id, channelToDeleteName: name });\r\n }\r\n\r\n agreeDeleteChannel = async () => {\r\n this.setState({ showSmallModalDelete: false });\r\n let response = await deleteChannel(this.state.channelToDeleteId);\r\n if(response.type == \"succes\"){\r\n this.setState({\r\n channels: this.state.channels.filter(it => it.id !== this.state.channelToDeleteId)\r\n });\r\n this.updateChannels();\r\n }\r\n }\r\n\r\n save = async () => {\r\n var isError = false;\r\n if(!this.state.channelName) { this.setState({isChannelNameError : true}); isError = true; }\r\n\r\n if(isError) return;\r\n if(!!this.state.id){\r\n const updateRequest: UpdateChannelRequest = { \r\n id : this.state.id, \r\n name: this.state.channelName, \r\n playerIds: this.state.playerIds,\r\n dayOfUpdate: this.state.dayOfWeekUpdate === \"\" ? null : Number(this.state.dayOfWeekUpdate),\r\n timeOfUpdate: this.state.timeOfUpdate\r\n };\r\n await updateChannel(updateRequest);\r\n }\r\n else{\r\n const createRequest: CreateChannelRequest = { \r\n name: this.state.channelName, \r\n playerIds: this.state.playerIds,\r\n dayOfUpdate: this.state.dayOfWeekUpdate === \"\" ? null : Number(this.state.dayOfWeekUpdate),\r\n timeOfUpdate: this.state.timeOfUpdate\r\n };\r\n await createChannel(createRequest);\r\n }\r\n\r\n var result = await getChannels();\r\n if(result.type == \"succes\") this.setState({ channels: result.data.items });\r\n this.closeModal();\r\n }\r\n\r\n setSeatchString = (searchStr: string) => this.setState({searchString: searchStr, currentPage: 1});\r\n\r\n getFilteredBySearch = () => this.state.searchString === '' ? \r\n this.state.channels : \r\n this.state.channels.filter( it => !!it.name && it.name.toLowerCase().includes(this.state.searchString.toLowerCase()));\r\n\r\n getPagesNumber = () => {\r\n let length = this.getFilteredBySearch().length;\r\n return getPagesCount(length, this.channelsPerPage)\r\n }\r\n\r\n changePaginationPage = (page: number) => this.setState({currentPage: page});\r\n\r\n getChannelsToDisaplay = () => {\r\n let filterdChannels = this.getFilteredBySearch();\r\n let startIndex = (this.state.currentPage - 1)*this.channelsPerPage;\r\n let finishIndex = startIndex + this.channelsPerPage;\r\n return filterdChannels.slice(startIndex, finishIndex) \r\n }\r\n\r\n renderChannelRow = (channel : Channel) => {\r\n return <tr key={channel.id}>\r\n <td>{channel.name}</td>\r\n <td>{channel.playersIds.length}</td>\r\n <td>{channel.mediaItems} in {channel.playlistsCount} Playlist{channel.playlistsCount > 1 ? \"s\" : \"\"}</td>\r\n <td>{formatDuration(channel.durationMs)}</td>\r\n <td>\r\n <IconButton type=\"clock\" tooltipText=\"Daypart\" onClick={() => this.openScheduleModal(channel.id)} />\r\n <IconButton type=\"player\" tooltipText=\"Players\" onClick={() => this.openChannelPlayerListModal(channel.id)} />\r\n <IconButton type=\"edit\" tooltipText=\"Edit\" onClick={() => this.openModal(channel.id, channel.name, channel.playersIds, channel.dayOfUpdate, channel.timeUpdate)}/>\r\n <IconButton type=\"list-add\" tooltipText=\"Media\" onClick={()=>{this.props.history.push(createPathWithId(Routes.Channels, channel.id))}}/>\r\n <IconButton type=\"delete\" tooltipText=\"Delete\" onClick={()=>{this.removeChannel(channel.id, channel.name)}}/>\r\n </td>\r\n </tr>\r\n }\r\n\r\n renderChannelPlayerRow = (it: ChannelPlayerModel, index: number) => {\r\n return <tr key={it.id}>\r\n <td>{addLeadingZero(index + 1, 2)}</td>\r\n <td>{it.name} <span className=\"player-id-span\">ID: {it.id}</span></td>\r\n <td>{it.tags.map( tag => <span key={tag.id} className=\"tag-name\">{tag.name}</span>)}</td>\r\n <td>{formatDate(it.lastSeen)} - {formatTime(it.lastSeen)}</td>\r\n <td>{it.location}</td>\r\n <td>\r\n <IconButton tooltipText=\"Remove\" tooltipPosition=\"left\" type=\"minus\" onClick={()=>{this.removePlayerFromChannel(it.id)}} />\r\n </td>\r\n </tr>\r\n }\r\n\r\n onSelectedCampaignOption = async (newValue : any) => {\r\n if(newValue){\r\n await this.updateChannels(newValue.value)\r\n } else {\r\n await this.updateChannels()\r\n }\r\n this.setState({currentPage:1})\r\n }\r\n\r\n onTimeSlotRangeSelect = async (slots:EnableRangeOfTimeSlots) => {\r\n await enableRangeOfTimeSlots(slots, this.state.timeSlotChannelId)\r\n let getTimeSlotsResult = await getChannelTimeSlots(this.state.timeSlotChannelId);\r\n if(getTimeSlotsResult.type == \"succes\"){\r\n this.setState({timeSlots: getTimeSlotsResult.data.items});\r\n }\r\n }\r\n\r\n render() {\r\n let channelToDisplayLength = this.getChannelsToDisaplay().length\r\n return <InnerLayout \r\n activeTab=\"channels\" \r\n logOut={this.props.logOut} \r\n toogleCollapse={this.props.toogleCollapse}\r\n isCollapsed={this.props.isCollapsed}\r\n >\r\n <> \r\n <div className=\"d-flex justify-content-end align-items-center mb-20 pt-50\">\r\n <div className=\"d-flex align-items-center gap5\" style={{width:\"250px\", marginRight:\"15px\"}}>\r\n <CustomSelect \r\n isSort={true}\r\n label=\"Campaigns\"\r\n options={this.state.campaignsOption}\r\n className={`w-100`}\r\n classNamePrefix={`select`}\r\n filterOption={(option, input) => option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option) => `${option.value}`}\r\n onChange={this.onSelectedCampaignOption} \r\n isClearable={true}\r\n /> \r\n </div>\r\n <Search onChangeValue={this.setSeatchString}/>\r\n <Button color=\"green\" label=\"Add Network\" onClick={()=>{this.openModal(\"\", \"\", [], \"\", \"\")}} />\r\n </div>\r\n\r\n {channelToDisplayLength ? <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Networks</td>\r\n <td>Players</td>\r\n <td>Media Items</td>\r\n <td>Duration</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {this.getChannelsToDisaplay().map( it => this.renderChannelRow(it))}\r\n </tbody> \r\n </table> : <p className=\"w-100 text-center\">There are no Networks</p>}\r\n\r\n <Pagination \r\n activePage={this.state.currentPage} \r\n pagesCount={this.getPagesNumber()} \r\n changePaginationPage={this.changePaginationPage} \r\n />\r\n\r\n <RightModal title={!!this.state.id ? \"Edit\": \"Create\"} show={this.state.showModal} onRequestClose={this.closeModal} >\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter name\"\r\n id = \"channel_name_input\"\r\n isError = {this.state.isChannelNameError}\r\n title = \"Network Name\"\r\n onChangeValue = {this.setChannelName}\r\n onChange = {() => {}}\r\n value = {this.state.channelName}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormSelect\r\n errorMessage=\"Please select Day Of Week\"\r\n id=\"channel_dayofweek_input\"\r\n isError={false}\r\n options={this.daysOfWeek}\r\n onChange={(value) => this.setState({dayOfWeekUpdate: value, isDayOfWeekUpdateError: false})}\r\n selectedValue={this.state.dayOfWeekUpdate}\r\n title=\"Players Update Day of Week\"\r\n defaultValueText=\"Disable Autoupdate\"\r\n /> \r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n title=\"Players Update Time\" \r\n isError={false} \r\n errorMessage=\"Please select Time\" \r\n type=\"time\" \r\n id=\"channel_time_input\" \r\n value={this.state.timeOfUpdate}\r\n disabled={this.state.dayOfWeekUpdate == \"\" || this.state.dayOfWeekUpdate == null}\r\n onChangeValue={(value) => this.setState({timeOfUpdate: value, isTimeOfUpdateError: false}) }></FormInput>\r\n </FormRow>\r\n <FormRow>\r\n <FormMultiSelect\r\n id=\"players-list\"\r\n title=\"Not Assigned Player\"\r\n titleSelected=\"Selected Players\"\r\n isError={false}\r\n errorMessage=\"Please select palyer\"\r\n onAdd={this.addPlayer}\r\n onRemove={this.removePlayer}\r\n options={this.state.options}\r\n selectedOptions={this.state.playerIds}\r\n />\r\n </FormRow>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={this.save}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={this.closeModal}/>\r\n </div>\r\n </RightModal> \r\n\r\n <CenterModal title=\"Network Schedule\" show={this.state.showScheduleModal} onRequestClose={this.closeScheduleModal}>\r\n <Schedule \r\n timeSlots={this.state.timeSlots} \r\n onTimeSlotAdd={this.onTimeSlotAdd} \r\n onTimeSlotRemove={this.onTimeSlotRemove}\r\n onTimeSlotRangeSelect={this.onTimeSlotRangeSelect}\r\n />\r\n </CenterModal> \r\n\r\n <CenterModal title=\"Network Player List\" show={this.state.showChannelPlayerListModal} onRequestClose={this.closeChannelPlayerListModal}>\r\n <table className=\"table channel-player-table\">\r\n <thead>\r\n <tr>\r\n <td></td>\r\n <td>Player Name</td>\r\n <td>Tags</td>\r\n <td>Heart beat</td>\r\n <td>Location</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {this.state.channelPlayers.map(this.renderChannelPlayerRow)}\r\n </tbody>\r\n </table>\r\n </CenterModal>\r\n \r\n <SmallModal show={this.state.showSmallModal} onRequestClose={this.closeSmallModal}> \r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={this.closeSmallModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={this.agreeRemovePlayerFromChannel}/>\r\n </div>\r\n </SmallModal>\r\n\r\n <SmallModal show={this.state.showSmallModalDelete} onRequestClose={this.closeSmallModalDelete} text={`Delete `}> \r\n <p>That you want to delete network <b>{this.state.channelToDeleteName}</b>.</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={this.closeSmallModalDelete}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={this.agreeDeleteChannel}/>\r\n </div>\r\n </SmallModal>\r\n <GlobalSpinner isShow={this.state.isLoading} />\r\n </>\r\n </InnerLayout>\r\n }\r\n}\r\n\r\nexport default withRouter(Channels);","import React from \"react\";\r\nimport { sunbScribeOnClick, unsubscribe } from \"../../../services/globalEventHandler\";\r\nimport \"./dropdownBlock.css\";\r\n\r\n\r\ninterface dropdownBlockProps {\r\n title: string | JSX.Element,\r\n isRightPosition?: boolean,\r\n children: JSX.Element[] | JSX.Element\r\n}\r\n \r\ninterface dropdownBlockState {\r\n isShowHiddenDropdown: boolean,\r\n}\r\n \r\nclass DropdownBlock extends React.Component<dropdownBlockProps, dropdownBlockState> {\r\n constructor(props:dropdownBlockProps){\r\n super(props);\r\n this.state = {\r\n isShowHiddenDropdown: false,\r\n }\r\n }\r\n\r\n uniqId = \"\";\r\n\r\n componentDidMount(){\r\n this.uniqId = Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);\r\n sunbScribeOnClick(this.hideModal, this.uniqId);\r\n }\r\n\r\n componentWillUnmount(){\r\n unsubscribe(this.uniqId);\r\n }\r\n\r\n modalBackground = \"dropdown-block-layout\";\r\n hideModal = () => this.setState({ isShowHiddenDropdown: false});\r\n\r\n toggleDropdownHiddenBlock = (event: React.MouseEvent<Element, MouseEvent>) => {\r\n event.stopPropagation();\r\n this.setState({ isShowHiddenDropdown: !this.state.isShowHiddenDropdown})\r\n }\r\n\r\n toggleDropdownHiddenBlock2 = (event: React.MouseEvent<Element, MouseEvent>) => {\r\n event.stopPropagation();\r\n }\r\n\r\n render() { \r\n return (\r\n <div className={`dropdown-block ${this.state.isShowHiddenDropdown ? \"show-drop\" : \"\"}`} onClick={this.toggleDropdownHiddenBlock2} >\r\n {typeof this.props.title === 'string' ? <span className=\"dropdown-title\" onClick={this.toggleDropdownHiddenBlock}>\r\n {this.props.title}\r\n </span> :\r\n <span onClick={this.toggleDropdownHiddenBlock}>\r\n {this.props.title}\r\n </span>\r\n }\r\n <div className={`dropdown-hidden-block ${this.props.isRightPosition && 'right'}`}>\r\n {this.props.children}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n \r\nexport default DropdownBlock;","import React from \"react\";\r\n\r\ninterface FormCheckboxProps {\r\n id:string,\r\n checked: boolean,\r\n onChange: (status: boolean) => void\r\n}\r\n \r\ninterface FormCheckboxState {\r\n \r\n}\r\n \r\nclass FormCheckbox extends React.Component<FormCheckboxProps, FormCheckboxState> {\r\n constructor(props:FormCheckboxProps){\r\n super(props)\r\n }\r\n\r\n onChangeHandler = () => this.props.onChange(!this.props.checked);\r\n\r\n render() { \r\n return (\r\n <label htmlFor={this.props.id} className=\"checkbox-control\">\r\n <input id={this.props.id} className=\"checkbox\" type=\"checkbox\" onChange={this.onChangeHandler} checked={this.props.checked} />\r\n <span className=\"checkbox-bg\"></span>\r\n <span className=\"checkbox-cursor\"></span>\r\n </label>\r\n );\r\n }\r\n}\r\n \r\nexport default FormCheckbox;","import React, { Children, FunctionComponent, ReactNode } from \"react\";\r\nimport \"./Tab.css\";\r\n\r\ninterface TabsProps {\r\n children: any\r\n}\r\n \r\ninterface TabsState {\r\n \r\n}\r\n \r\nclass Tabs extends React.Component<TabsProps, TabsState> {\r\n constructor(props : TabsProps){\r\n super(props);\r\n }\r\n\r\n render() { \r\n return ( \r\n <div className=\"tab-block\">\r\n {this.props.children}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\ntype TabsContainerProps = {\r\n children: JSX.Element[] | JSX.Element\r\n}\r\n\r\nexport const TabsContainer:FunctionComponent<TabsContainerProps> = (props) => {\r\n return <div className=\"tab-container\">{props.children}</div>\r\n}\r\n\r\ntype TabNavigationProps = {\r\n children: JSX.Element[] | JSX.Element\r\n}\r\n\r\nexport const TabNavigation:FunctionComponent<TabNavigationProps> = (props) => {\r\n return <div className=\"tab-navigation\">{props.children}</div>\r\n}\r\n\r\ntype TabNavigationElementProps = {\r\n title:string,\r\n tooltip?: number | Promise<number>,\r\n isActive?: boolean,\r\n onClick?: ()=> void\r\n}\r\n\r\nexport const TabNavigationElement:FunctionComponent<TabNavigationElementProps> = (props) => {\r\n let {title, tooltip, isActive, onClick} = props\r\n return <a role=\"button\" className={`tab-navigation__elem ${isActive ? 'active' : ''}`} onClick={onClick}>\r\n <>\r\n {title} {!!tooltip && <span className=\"alert-tooltip\">{tooltip}</span>}\r\n </>\r\n </a>\r\n}\r\n\r\ntype TabElementProps = {\r\n children: JSX.Element,\r\n isActive?: boolean,\r\n}\r\n\r\nexport class TabElement extends React.Component<TabElementProps, TabsState> {\r\n render() {\r\n return <div className={`tab-container__elem ${this.props.isActive ? 'active' : ''}`}>{this.props.children}</div>\r\n }\r\n}\r\n\r\nexport default Tabs;","import { FC, useEffect, useState } from \"react\"\r\nimport { Guid } from \"../../../api/baseApi\"\r\nimport { CenterModal } from \"../sideModal/Modal\"\r\nimport { Button } from \"../Button\"\r\nimport { formatDate, formatTime } from \"../../../services/dateService\"\r\nimport Tabs, { TabElement, TabNavigation, TabNavigationElement, TabsContainer } from \"../tab/Tab\"\r\nimport { MediaAnalyzeProfile, MediaAnalyzeStatus, MediaTranscode, getIsUseOriginal, getMediaAnalyzeProfile, getMediaTranscodes, postMediaTranscodeRequest, postUseOriginal, postUseTranscode } from \"../../../api/mediaApi\"\r\nimport FormCheckbox from \"../formRow/FormCheckbox\"\r\nimport { converFromBytes, formatDuration } from \"../../../services/common\"\r\n\r\ninterface MediaTranscodeModalProps {\r\n id:Guid,\r\n isShow: boolean,\r\n closeHandler: () => void,\r\n loadingHandler: (isLoading: boolean) => void\r\n}\r\n\r\ntype SettingsTab = \"MediaInfo\" | \"MediaTranscodes\";\r\n\r\nconst MediaTranscodeModal:FC<MediaTranscodeModalProps> = ({id, isShow, closeHandler, loadingHandler}) => {\r\n\r\n let [mediaAnalyzeProfile, setMediaAnalyzeProfile] = useState<MediaAnalyzeProfile | null>(null);\r\n let [mediaTranscodesProfiles, setMediaTranscodesProfile] = useState<MediaTranscode[]>([]);\r\n let [isUseTranscode, setIsUseTranscode] = useState(false);\r\n let [activeTab, setActiveTab] = useState<SettingsTab>(\"MediaInfo\");\r\n const checkActive = (tab: SettingsTab) => tab === activeTab;\r\n\r\n useEffect(()=>{\r\n async function fetchData(){\r\n loadingHandler(true);\r\n await Promise.all([updateProfiles(id), checkUseOriginal(id), updateTranscodeProfiles(id)])\r\n loadingHandler(false);\r\n }\r\n\r\n isShow && fetchData()\r\n },[id])\r\n\r\n useEffect(()=>{\r\n\r\n if(activeTab === \"MediaTranscodes\") {\r\n updateTranscodeProfiles(id)\r\n }\r\n\r\n },[activeTab])\r\n\r\n const updateProfiles = async (id:Guid) => {\r\n var getProfilesResult = await getMediaAnalyzeProfile(id);\r\n if(getProfilesResult.type == \"succes\"){\r\n setMediaAnalyzeProfile(getProfilesResult.data.data)\r\n }\r\n }\r\n\r\n const updateTranscodeProfiles = async (id:Guid) => {\r\n var getProfilesResult = await getMediaTranscodes(id);\r\n if(getProfilesResult.type == \"succes\"){\r\n setMediaTranscodesProfile(getProfilesResult.data.items)\r\n }\r\n }\r\n\r\n const checkUseOriginal = async (id:Guid) => {\r\n var getProfilesResult = await getIsUseOriginal(id);\r\n if(getProfilesResult.type == \"succes\"){\r\n setIsUseTranscode(!getProfilesResult.data.data)\r\n }\r\n }\r\n\r\n const toggleHandler = async (val: boolean) => {\r\n setIsUseTranscode(val)\r\n if(val) {\r\n await postUseTranscode(id);\r\n } else {\r\n await postUseOriginal(id)\r\n }\r\n }\r\n\r\n\r\n const sendTranscodeRequest = async (id:Guid, profileId:Guid) => {\r\n await postMediaTranscodeRequest(id, profileId);\r\n await updateTranscodeProfiles(id)\r\n }\r\n\r\n const onRequestClose = () => {\r\n setMediaTranscodesProfile([]);\r\n setMediaAnalyzeProfile(null)\r\n closeHandler();\r\n }\r\n\r\n const renderStatus = (status:MediaAnalyzeStatus) => {\r\n switch(status){\r\n case MediaAnalyzeStatus.Requested : return <span>Requested</span>\r\n case MediaAnalyzeStatus.Posted : return <span>Posted</span>\r\n case MediaAnalyzeStatus.Pending : return <span>Pending</span>\r\n case MediaAnalyzeStatus.Running : return <span>Running</span>\r\n case MediaAnalyzeStatus.Success : return <span>Success</span>\r\n case MediaAnalyzeStatus.Failed : return <span>Failed</span>\r\n case MediaAnalyzeStatus.Cancelled : return <span>Cancelled</span>\r\n case MediaAnalyzeStatus.InternalError : return <span>Internal Error</span>\r\n case MediaAnalyzeStatus.Complete : return <span>Complete</span>\r\n }\r\n }\r\n\r\n const renderMediaAnalyzeProfile = (it: MediaAnalyzeProfile) => {\r\n return <tr key={it.jobId}>\r\n <td>\r\n <p>Requested Time: {formatDate(it.requestedTime)} <br/> {formatTime(it.requestedTime)}</p>\r\n <p>Last Update Time: {formatDate(it.lastUpdateTime)} <br/> {formatTime(it.lastUpdateTime)}</p>\r\n <p>Complete Time: {formatDate(it.completeTime)} <br/> {formatTime(it.completeTime)}</p>\r\n </td>\r\n <td>{renderStatus(it.status)}</td>\r\n <td>\r\n <p>Kind: {it.mediaInfoContainerKind}</p>\r\n <p>Duration: {formatDuration(it.mediaInfoContainerDuration * 1000)}</p>\r\n <p style={{\"whiteSpace\" : \"nowrap\"}}>Bitrate: {converFromBytes(it.mediaInfoContainerBitrate, \"KB\").toFixed(2)} KB/sec</p>\r\n <p>Size: {converFromBytes(it.mediaInfoContainerSize, \"MB\").toFixed(2)} MB</p>\r\n </td>\r\n <td>\r\n <p>Codec: {it.audioCodec}</p>\r\n <p>Channels: {it.audioChannels}</p>\r\n <p>Channel Order: {it.audioChannelOrder}</p>\r\n <p>Sample Rate: {it.audioSampleRate} Hz</p>\r\n <p>Duration: {formatDuration(it.audioDuration * 1000)}</p>\r\n <p style={{\"whiteSpace\" : \"nowrap\"}}>Bitrate: {converFromBytes(it.audioBitrate, \"KB\").toFixed(2)} KB/sec</p>\r\n </td>\r\n <td>\r\n <p>Codec: {it.videoCodec}</p>\r\n <p>Frame Rate: {it.videoFrameRate} FPS</p>\r\n <p>Width: {it.videoWidth}</p>\r\n <p>Height: {it.videoHeight}</p>\r\n <p>Duration: {formatDuration(it.videoDuration * 1000)}</p>\r\n <p style={{\"whiteSpace\" : \"nowrap\"}}>Bitrate: {converFromBytes(it.videoBitrate, \"KB\").toFixed(2)} KB/sec</p>\r\n </td>\r\n <td>\r\n <p style={{\"whiteSpace\" : \"nowrap\"}}>Measured: {it.loudnessMeasured} dB</p>\r\n <p>Range: {it.loudnessRange}</p>\r\n <p>Gating Mode: {it.loudnessGatingMode}</p>\r\n <p style={{\"whiteSpace\" : \"nowrap\"}}>Sample Peak: {it.loudnessSamplePeak} dB</p>\r\n <p style={{\"whiteSpace\" : \"nowrap\"}}>True Peak: {it.loudnessTruePeak} dB</p>\r\n </td>\r\n <td>{it.jobId}</td>\r\n <td>{it.dolbyOutputPath}</td>\r\n </tr>\r\n }\r\n\r\n const renderMediaTranscodes = (transcodes: MediaTranscode[]) => {\r\n return transcodes.map( it => {\r\n return <tr key={it.profileId}>\r\n <td>\r\n <p>{formatDate(it.requestedTime)} {formatTime(it.requestedTime)}</p>\r\n </td>\r\n <td>\r\n <p>{formatDate(it.lastUpdateTime)} {formatTime(it.lastUpdateTime)}</p>\r\n </td>\r\n <td>\r\n <p>{formatDate(it.completeTime)} {formatTime(it.completeTime)}</p>\r\n </td>\r\n <td>{renderStatus(it.status)}</td>\r\n <td>{it.profileName}</td>\r\n <td>\r\n <div className=\"d-flex justify-content-end\">\r\n {it.canBeRequested && <Button color=\"green\" label=\"Request Transcode\" onClick={() => sendTranscodeRequest(id, it.profileId) }/>}\r\n {it.downloadLink && <a href={`${it.downloadLink}`} download>Download</a>}\r\n </div>\r\n </td>\r\n </tr>\r\n })\r\n }\r\n \r\n return (\r\n <CenterModal title=\"Media Transcode\" show={isShow} onRequestClose={onRequestClose}>\r\n <Tabs>\r\n <TabNavigation>\r\n <TabNavigationElement \r\n title=\"Info\" \r\n isActive={checkActive(\"MediaInfo\")} \r\n onClick={() => { setActiveTab(\"MediaInfo\") }} \r\n />\r\n <TabNavigationElement \r\n title=\"Transcodes\" \r\n isActive={checkActive(\"MediaTranscodes\")} \r\n onClick={() => { setActiveTab(\"MediaTranscodes\") }} \r\n />\r\n \r\n </TabNavigation>\r\n <TabsContainer>\r\n <TabElement isActive={checkActive(\"MediaInfo\")}>\r\n {!!mediaAnalyzeProfile ? <table className=\"table report-table\">\r\n <thead>\r\n <tr>\r\n <td>Time</td>\r\n <td>Status</td>\r\n <td>Media Info Container</td>\r\n <td>Audio</td>\r\n <td>Video</td>\r\n <td>Loudness</td>\r\n <td>JobId</td>\r\n <td>Dolby Output Path</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderMediaAnalyzeProfile(mediaAnalyzeProfile)}\r\n </tbody>\r\n </table> : <p>No Info</p>}\r\n </TabElement>\r\n <TabElement isActive={checkActive(\"MediaTranscodes\")}>\r\n <>\r\n <div className=\"d-flex align-items-center w-100\">\r\n <FormCheckbox id=\"use-trancode\" checked={isUseTranscode} onChange={toggleHandler} />\r\n <span className=\"status-block\">\r\n {isUseTranscode ? <span className=\"current-status online\"> Use Transcoded</span> : <span className=\"current-status offline\"> Use Transcoded</span>}\r\n </span>\r\n </div>\r\n {mediaTranscodesProfiles.length ? <table className=\"table report-table table-divider\">\r\n <thead>\r\n <tr>\r\n <td>Requested </td>\r\n <td>Last Update</td>\r\n <td>Complete </td>\r\n <td>Status</td>\r\n <td>Name</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderMediaTranscodes(mediaTranscodesProfiles)}\r\n </tbody>\r\n </table> : <p>No Elements</p>}\r\n </>\r\n </TabElement>\r\n </TabsContainer>\r\n </Tabs>\r\n </CenterModal> \r\n )\r\n}\r\n\r\nexport default MediaTranscodeModal","import axios, { AxiosResponse } from \"axios\";\r\nimport { getToken } from \"./authApi\";\r\nimport { ApiResponse, BaseResponse, BaseResponseWithData, baseUrl, GetParams, getWithAuth, getWithAuthAndParams, Guid, ListRespone, PaginationListRespone, postWithAuth } from \"./baseApi\";\r\nimport { CampaignPeriod, CampaignStatus } from \"./campaingsApi\"\r\nimport { BaseChannelModel } from \"./channelsApi\";\r\nimport { formatDate } from \"../services/dateService\";\r\nimport { MediaContentType } from \"./mediaApi\";\r\n\r\nexport enum ReportAdhocStatus {\r\n Requested = 0,\r\n InProgress = 1,\r\n Generated = 2,\r\n PartiatlyGenerated = 3\r\n}\r\n\r\nexport type ChannelAndCampaignReportRow = {\r\n channel: string,\r\n campaigns: CampaignReportRow[]\r\n}\r\n\r\nexport type CampaignReportRow = {\r\n name: string,\r\n externalCampaignId: string,\r\n status: CampaignStatus,\r\n periods: CampaignPeriod[],\r\n durationMs: number,\r\n playouts: number\r\n}\r\n\r\nexport type MediaReportRow = {\r\n startDateTime: string,\r\n endDateTime: string,\r\n status: ReportAdhocStatus,\r\n dateRequested: string,\r\n downloadUrl: string\r\n}\r\n\r\nexport type SkinReportRow = {\r\n channelName: string,\r\n mosaicName: string,\r\n itemName: string,\r\n durationMs: number,\r\n playouts: number\r\n}\r\n\r\nexport type generateAdhocReportRequest = {\r\n startDateTime: string,\r\n endDateTime: string\r\n}\r\n\r\nexport type generateAdhocReportResponse = {\r\n\r\n}\r\n\r\nexport enum ReportSubscriptionType {\r\n NetworkAndCampaignYesterday = 0,\r\n NetworkAndCampaignWeekToDate = 1,\r\n NetworkAndCampaignLastWeek = 2,\r\n NetworkAndCampaignLast7Days = 3,\r\n NetworkAndCampaignLastMonth = 4,\r\n NetworkAndCampaignMonthToDate = 5,\r\n\r\n AdHocYesterday = 100,\r\n AdHocWeekToDate = 101,\r\n AdHocLastWeek = 102,\r\n AdHocLast7Days = 103,\r\n AdHocLastMonth = 104,\r\n AdHocMonthToDate = 105,\r\n}\r\n\r\nexport type ReportSubscription = {\r\n reportSubscriptionType: ReportSubscriptionType\r\n}\r\n\r\nexport type PlayoutsPerDate = {\r\n date: string,\r\n playouts: number,\r\n durationSeconds: number\r\n}\r\n\r\nexport type PlayoutsReportRow = {\r\n player: string,\r\n campaign: string,\r\n network: string,\r\n media: string,\r\n contentType: MediaContentType,\r\n playouts: number,\r\n duration: number\r\n}\r\n\r\nexport type PlayoutsReportResponse = {\r\n tableRows: PlayoutsReportRow[],\r\n columns: ReportDashboardColumns[],\r\n chart: PlayoutsPerDate[],\r\n totalPlayouts: number,\r\n totalDurationString: string,\r\n totalDurationSeconds: number\r\n}\r\n\r\nexport enum ReportDashboardColumns {\r\n Network = 0,\r\n Campaign = 1,\r\n Player = 2,\r\n Media = 3,\r\n ContentType = 4,\r\n}\r\n\r\nexport type ReportDashboardRequest = {\r\n startTime: string,\r\n endTime: string\r\n columns: ReportDashboardColumns[],\r\n networkIds: Guid[],\r\n campaignIds: Guid[],\r\n playerIds: Guid[],\r\n mediaIds: Guid[],\r\n contentTypes: number[],\r\n}\r\n\r\n\r\nexport const getCampaignAndChannelReport = async (campaigns: Guid[], channels: Guid[], statuses: CampaignStatus[], startDate: string, endDate: string, page: number) : Promise<ApiResponse<PaginationListRespone<ChannelAndCampaignReportRow>>> => {\r\n var params = new GetParams();\r\n params.Add(\"startDate\", startDate);\r\n params.Add(\"endDate\", endDate);\r\n params.Add(\"page\", page+\"\");\r\n params.AddList(\"channelIds\", channels);\r\n params.AddList(\"campaignsIds\", campaigns);\r\n params.AddList(\"campaignStatus\", statuses.map(it => it.toString()));\r\n return await getWithAuthAndParams<PaginationListRespone<ChannelAndCampaignReportRow>>(`${baseUrl}reports/channel`, params); \r\n}\r\n\r\nexport const getCampaignAndChannelReportDownloadLink = (campaigns: Guid[], channels: Guid[], statuses: CampaignStatus[], startDate: string, endDate: string) : string => {\r\n var params = new GetParams();\r\n var token = getToken();\r\n if(token) params.Add(\"token\", token);\r\n params.Add(\"startDate\", startDate);\r\n params.Add(\"endDate\", endDate);\r\n params.AddList(\"channelIds\", channels);\r\n params.AddList(\"campaignsIds\", campaigns);\r\n params.AddList(\"campaignStatus\", statuses.map(it => it.toString()));\r\n return `${baseUrl}reports/channel/download${params.query}`\r\n}\r\n\r\nexport const generateAdhocReport = async(request : generateAdhocReportRequest) : Promise<ApiResponse<generateAdhocReportResponse>> => {\r\n return await postWithAuth<generateAdhocReportRequest, generateAdhocReportResponse>(`${baseUrl}reports/adhoc`, request);\r\n}\r\n\r\nexport const getAdhocReports = async () : Promise<ApiResponse<ListRespone<MediaReportRow>>> => {\r\n return await getWithAuth<ListRespone<MediaReportRow>>({url: `${baseUrl}reports/adhoc`}); \r\n}\r\n\r\nexport const getSkinReports = async (skins: Guid[], sites: Guid[], startDate: string, endDate: string):Promise<ApiResponse<ListRespone<SkinReportRow>>> => {\r\n var params = new GetParams();\r\n params.Add(\"startDate\", startDate);\r\n params.Add(\"endDate\", endDate);\r\n params.AddList(\"skinsIds\", skins);\r\n params.AddList(\"siteIds\", sites);\r\n return await getWithAuthAndParams<ListRespone<SkinReportRow>>(`${baseUrl}reports/skin`, params)\r\n}\r\n\r\nexport const generateSkinAdhocReport = async(request : generateAdhocReportRequest) : Promise<ApiResponse<generateAdhocReportResponse>> => {\r\n return await postWithAuth<generateAdhocReportRequest, generateAdhocReportResponse>(`${baseUrl}reports/skin-adhoc`, request);\r\n}\r\n\r\nexport const getSkinAdhocReports = async () : Promise<ApiResponse<ListRespone<MediaReportRow>>> => {\r\n return await getWithAuth<ListRespone<MediaReportRow>>({url: `${baseUrl}reports/skin-adhoc`}); \r\n}\r\n\r\nexport const getReportSubscriptions = async () : Promise<ApiResponse<ListRespone<ReportSubscription>>> => {\r\n return await getWithAuth<ListRespone<ReportSubscription>>({url: `${baseUrl}reports/subscribtions`}); \r\n}\r\n\r\nexport const reportSubscribe = async(request : ReportSubscription) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<ReportSubscription, BaseResponse>(`${baseUrl}reports/subscribtions/subscribe`, request);\r\n}\r\n\r\nexport const reportUnsubscribe = async(request : ReportSubscription) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<ReportSubscription, BaseResponse>(`${baseUrl}reports/subscribtions/unsubscribe`, request);\r\n}\r\n\r\nexport const getReportsDashboardData = async(request: ReportDashboardRequest) : Promise<ApiResponse<BaseResponseWithData<PlayoutsReportResponse>>> => {\r\n return await postWithAuth<ReportDashboardRequest, BaseResponseWithData<PlayoutsReportResponse>>(`${baseUrl}reports/dashboard`, request);\r\n}\r\n\r\nexport const postReportsDashboardDataRequest = async(request: ReportDashboardRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<ReportDashboardRequest, BaseResponse>(`${baseUrl}reports/adhoc/request`, request);\r\n}\r\n\r\nexport const downloadCSVReportsDashboardData = async (request: ReportDashboardRequest) : Promise<{data: any, filename: string}> => {\r\n const response: AxiosResponse<Blob> = await axios.post(`${baseUrl}reports/dashboard/csv`, request, {\r\n headers: {\r\n 'Authorization' : getToken()\r\n },\r\n responseType: 'blob',\r\n });\r\n\r\n const fileName = `dashboard_report_${formatDate(new Date().toISOString())}.csv`;\r\n\r\n return {\r\n data: response.data,\r\n filename: fileName\r\n }\r\n}","import { FunctionComponent, useState } from \"react\";\r\nimport \"./PlayerStatistic.css\"\r\n\r\n\r\nexport type PlayerGroup = \"total\" | \"online\" | \"offline\" | \"withAssignedChannel\" | \"withoutChannel\";\r\n\r\ninterface PlayerStatisticProps {\r\n activeGroup: PlayerGroup,\r\n total: number,\r\n online: number,\r\n offline: number,\r\n assignedPlayers: number,\r\n unassignedPlayers: number,\r\n onClickFunction: (playerGroup: PlayerGroup) => void \r\n}\r\n\r\ninterface StatisticElementProps {\r\n group: PlayerGroup,\r\n count: number,\r\n text: string\r\n}\r\n \r\nconst PlayerStatistic: FunctionComponent<PlayerStatisticProps> = (props) => {\r\n\r\n let {activeGroup, total, online, offline, assignedPlayers, unassignedPlayers, onClickFunction} = props;\r\n\r\n const checkStatus = (status:PlayerGroup) => status === activeGroup ? \"active\" : \"\";\r\n\r\n const StatisticElement: FunctionComponent<StatisticElementProps> = (props) => {\r\n let { group, count, text} = props;\r\n return(\r\n <div className={`player-statistic__elem ${checkStatus(group)}`} onClick={()=>onClickFunction(group)}>\r\n <span className={`${group}-span`}>{count}</span>\r\n <p>{text}</p>\r\n </div>\r\n )\r\n }\r\n\r\n return (\r\n <div className=\"player-statistic\">\r\n <StatisticElement group=\"total\" count={total} text=\"Total Active Players\"/>\r\n <StatisticElement group=\"online\" count={online} text=\"Players Online\"/>\r\n <StatisticElement group=\"offline\" count={offline} text=\"Players Offline\"/>\r\n <StatisticElement group=\"withAssignedChannel\" count={assignedPlayers} text=\"Assigned Players\"/>\r\n <StatisticElement group=\"withoutChannel\" count={unassignedPlayers} text=\"Unassigned Players\"/>\r\n </div>\r\n );\r\n}\r\n\r\n \r\nexport default PlayerStatistic;","import { FunctionComponent, useEffect, useState } from \"react\";\r\nimport \"./SortIndicator.css\"\r\n\r\ninterface SortIndicatorProps {\r\n isAsc?: boolean,\r\n isActive?: boolean\r\n}\r\n \r\nconst SortIndicator: FunctionComponent<SortIndicatorProps> = (props) => {\r\n let {isAsc, isActive} = props;\r\n\r\n return ( \r\n <div className={`sort-indicator ${isAsc ? 'ASC' : 'DESC'} ${isActive ? 'active':''}`}>\r\n <div className=\"sort-asc\"></div>\r\n <div className=\"sort-desc\"></div>\r\n </div>\r\n );\r\n}\r\n \r\nexport default SortIndicator;","import React, { FunctionComponent, useEffect, useState } from \"react\";\r\nimport { RouteComponentProps, withRouter } from \"react-router\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport { deletePlayer, getPlayers, PlayerModel, PlayerStatus, UpdateConfigurationRequest, updateConfuguration } from \"../../../api/playersApi\";\r\nimport { convertUTCDateToLocalDate, formatDate, formatTime } from \"../../../services/dateService\";\r\nimport IconButton from \"../../components/iconButton/IconButton\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport \"./Players.css\";\r\nimport './../../styles/table.css'\r\nimport { createPathWithId, Routes } from \"../../../constants/routes\";\r\nimport GoogleMapReact from 'google-map-react'\r\nimport SvgSelector from \"../../components/svgSelector/SvgSelector\";\r\nimport PlayerStatistic, { PlayerGroup } from \"../../components/playerStatistic/PlayerStatistic\";\r\nimport Search from \"../../components/search/Search\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport SortIndicator from \"../../components/sortIndicator/SortIndicator\";\r\nimport { SmallModal } from \"../../components/sideModal/Modal\";\r\nimport { Button } from \"../../components/Button\";\r\nimport Pagination from \"../../components/pagination/Pagination\";\r\nimport { getPagesCount } from \"../../../services/paginator\";\r\n\r\nexport interface PlayersProps extends RouteComponentProps<any>\r\n{\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n\r\ninterface PlayerPinProps {\r\n lat: number,\r\n lng: number,\r\n text: string,\r\n status: \"online\" | \"offline\"\r\n}\r\n\r\ntype SortBy = \"\" | \"name\" | \"location\";\r\ntype FilterByEnabled = \"all\" | \"enabled\" | \"disabled\";\r\n\r\nconst PlayerPin = (props: PlayerPinProps) => {\r\n const getColor = () => {\r\n switch(props.status){\r\n case \"offline\" : return \"#FF614C\";\r\n case \"online\" : return \"#4F97DA\";\r\n }\r\n }\r\n\r\n return ( \r\n <>\r\n <span>\r\n <SvgSelector title=\"marker\" color={getColor()}></SvgSelector>\r\n <span>{props.text}</span>\r\n </span> \r\n </>\r\n );\r\n}\r\n\r\nconst Players: FunctionComponent<PlayersProps> = (props: PlayersProps) => {\r\n let {logOut, toogleCollapse, isCollapsed, history} = props;\r\n\r\n let [ players, setPlayers ] = useState<PlayerModel[]>([]);\r\n let [ isLoading, setIsLoading ] = useState<boolean>(false);\r\n let [ filterGroup, setFilterGroup] = useState<PlayerGroup>('total');\r\n let [ filteredPlayers, setFilteredPlayers] = useState<PlayerModel[]>([]);\r\n let [ currentPage, setCurrentPage] = useState<number>(1);\r\n let [ playersPerPage, setPlayersPerPage] = useState<PlayerModel[]>([]);\r\n let [ searchString, setSearchString] = useState<string>('');\r\n let [ sortBy, setSortBy] = useState<SortBy>('');\r\n let [ isAscSort, setIsAscSort] = useState<boolean>(false);\r\n let [ isShowDeleteModal, setIsShowDeleteModal] = useState<boolean>(false);\r\n let [ playerIdForDelete, setPlayerIdForDelete] = useState<Guid>('');\r\n let [ filterByEnabledStatus, setFiltedByEnabled] = useState<FilterByEnabled>(\"all\");\r\n\r\n let [gMap, setGMap] = useState<any>(undefined);\r\n let [gMaps, setGMaps] = useState<any>(undefined);\r\n\r\n const itemsPerPage = 20;\r\n\r\n useEffect(() => {\r\n async function fetchData(){\r\n setIsLoading(true);\r\n await Promise.all([updatePlayers()])\r\n setIsLoading(false);\r\n }\r\n\r\n fetchData();\r\n }, []);\r\n\r\n useEffect(() => {\r\n let filteredBySearch = !!!searchString ? players : players.filter(it => {\r\n return !!it.name && it.name.toLowerCase().includes(searchString.toLowerCase()) ||\r\n !!it.location && it.location.toLowerCase().includes(searchString.toLowerCase()) ||\r\n !!it.channel && it.channel.name.toLowerCase().includes(searchString.toLowerCase()) ||\r\n !!it.id && it.id.toLowerCase().includes(searchString.toLowerCase())\r\n });\r\n\r\n\r\n let filterByGroup: (player: PlayerModel) => boolean;\r\n switch(filterGroup){\r\n case \"total\" : filterByGroup = it => filterByEnabled(it); break;\r\n case \"online\" : filterByGroup = it => it.isOnline && filterByEnabled(it); break;\r\n case \"offline\" : filterByGroup = it => !it.isOnline && filterByEnabled(it); break;\r\n case \"withAssignedChannel\" : filterByGroup = it => it.channel !== null && filterByEnabled(it); break;\r\n case \"withoutChannel\" : filterByGroup = it => it.channel === null && filterByEnabled(it); break;\r\n };\r\n\r\n let sortByParam;\r\n switch(sortBy){\r\n case \"name\" : sortByParam = sortArrayByName; break;\r\n case \"location\" : sortByParam = sortArrayByLocation; break;\r\n }\r\n\r\n setFilteredPlayers(filteredBySearch.filter(filterByGroup).sort(sortByParam));\r\n setCurrentPage(1);\r\n }, [filterGroup, players, searchString, sortBy, isAscSort, filterByEnabledStatus]);\r\n\r\n let filterByEnabled = (player: PlayerModel) => {\r\n switch (filterByEnabledStatus) {\r\n case \"all\" : return true;\r\n case \"disabled\" : return !player.isEnabled;\r\n case \"enabled\" : return player.isEnabled;\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n let startIndex = (currentPage - 1)*itemsPerPage;\r\n let finishIndex = startIndex + itemsPerPage;\r\n if(gMap){\r\n const bounds = getMapBounds(gMap, gMaps);\r\n gMap.fitBounds(bounds);\r\n }\r\n }, [filteredPlayers, filterByEnabledStatus]);\r\n\r\n useEffect(() => {\r\n let startIndex = (currentPage - 1)*itemsPerPage;\r\n let finishIndex = startIndex + itemsPerPage;\r\n setPlayersPerPage(filteredPlayers.slice(startIndex, finishIndex));\r\n }, [currentPage, filteredPlayers, filterByEnabledStatus]);\r\n\r\n const updatePlayers = async () => {\r\n setIsLoading(true);\r\n var players = await getPlayers();\r\n setPlayers(players.players);\r\n setIsLoading(false);\r\n }\r\n\r\n const getPlayersStats = () => {\r\n let filteredByEnabled = players.filter(it => filterByEnabled(it));\r\n\r\n let total = filteredByEnabled?.length;\r\n let active = filteredByEnabled?.filter(it => it.isOnline).length;\r\n let notActive = total - active;\r\n let withAssignedChannel = filteredByEnabled?.filter(it => it.channel !== null).length;\r\n let withoutChannel = total - withAssignedChannel;\r\n\r\n return { total, active, notActive, withAssignedChannel, withoutChannel };\r\n }\r\n\r\n const filterPlayers = (group: PlayerGroup) => {\r\n setFilterGroup(group);\r\n }\r\n \r\n // Return map bounds based on list of places\r\n const getMapBounds = (map: any, maps: any) => {\r\n var places = filteredPlayers.filter(it => !!it.long);\r\n const bounds = new maps.LatLngBounds();\r\n \r\n places.forEach((place) => {\r\n bounds.extend(new maps.LatLng(\r\n place.lat,\r\n place.long,\r\n ));\r\n });\r\n return bounds;\r\n };\r\n\r\n const gMapLoaded = (map: any, maps: any) => { \r\n const bounds = getMapBounds(map, maps);\r\n map.fitBounds(bounds);\r\n\r\n setGMap(map); setGMaps(maps);\r\n };\r\n\r\n const map = () => {\r\n return <GoogleMapReact\r\n defaultCenter={{lat: 51.5072, lng: -0.1076}}\r\n defaultZoom={13}\r\n bootstrapURLKeys={{key:\"AIzaSyB2UbKb3oepkyMSa1Se1yDdXYTOvfaZEDk\"}}\r\n onGoogleApiLoaded={({ map, maps }) => gMapLoaded(map, maps) }\r\n >\r\n {\r\n filteredPlayers.filter(it => !!it.long).map(it => <PlayerPin text={it.name} lat={it.lat} lng={it.long} status={it.isOnline ? \"online\" : \"offline\"}/>)\r\n }\r\n </GoogleMapReact>\r\n }\r\n\r\n const renderPlayerStatus = (status: PlayerStatus) => {\r\n switch (status) {\r\n case PlayerStatus.Online : return 'ok';\r\n case PlayerStatus.Offline : return 'error';\r\n case PlayerStatus.OutOfDayParting : return 'out'\r\n }\r\n }\r\n\r\n const renderPlayerRow = (player : PlayerModel) => {\r\n const statusClass = `status ${renderPlayerStatus(player.playerStatus)}`;\r\n let isNew = !!!player.name || !!!player.location;\r\n return <tr key={player.id}>\r\n <td><span className={statusClass}></span><span className=\"player-name\">{player.name} {isNew && <span className=\"new\">new</span>}</span></td>\r\n <td>{player.id}</td>\r\n <td>{player.channel?.name}</td>\r\n <td>{player.location}</td>\r\n <td>\r\n {convertUTCDateToLocalDate(player.lastSeen)}\r\n </td>\r\n <td>\r\n {player.version}\r\n </td>\r\n <td>\r\n <IconButton tooltipText=\"Edit\" type=\"edit\" onClick={()=>{history.push(createPathWithId(Routes.Players, player.id))}} />\r\n <IconButton tooltipText=\"Delete\" type=\"delete\" onClick={()=>showDeleteModal(player.id)} />\r\n </td> \r\n </tr>\r\n }\r\n\r\n const playerStats = getPlayersStats();\r\n\r\n const sortArrayByName = (x: PlayerModel, y: PlayerModel) =>{\r\n let xName = x.name == null ? '' : x.name;\r\n let yName = y.name == null ? '' : y.name;\r\n let temp = xName > yName ? 1 : -1;\r\n if(!isAscSort) temp*=-1;\r\n return temp\r\n }\r\n\r\n const sortArrayByLocation = (x: PlayerModel, y: PlayerModel) => {\r\n let xLocation = x.location == null ? '' : x.location;\r\n let yLocation = y.location == null ? '' : y.location;\r\n let temp = xLocation > yLocation ? 1 : -1;\r\n if(!isAscSort) temp*=-1;\r\n return temp\r\n }\r\n \r\n const checkCurrentSortColumn = (sortBy: SortBy, currentSort: SortBy) => sortBy === currentSort\r\n \r\n const setSortData = (sortByNew: SortBy) => {\r\n if(sortByNew !== sortBy){\r\n setIsAscSort(true);\r\n setSortBy(sortByNew);\r\n }\r\n else {\r\n setIsAscSort(!isAscSort);\r\n }\r\n }\r\n\r\n const showDeleteModal = (playerId: Guid) => {\r\n setIsShowDeleteModal(true);\r\n setPlayerIdForDelete(playerId);\r\n }\r\n const closeDeleteModal = () => setIsShowDeleteModal(false);\r\n\r\n const deleteCurrentPlayer = async () =>{\r\n setIsLoading(true);\r\n await deletePlayer(playerIdForDelete);\r\n await updatePlayers()\r\n setIsShowDeleteModal(false);\r\n setIsLoading(false);\r\n }\r\n\r\n let getfilterByEnabledCss = (filter: FilterByEnabled) => {\r\n return {marginRight:\"10px\", cursor: \"pointer\", color : filter == filterByEnabledStatus ? \"#4F97DA\" : \"black\" }\r\n }\r\n\r\n return (\r\n\r\n <>\r\n <InnerLayout \r\n activeTab=\"players\" \r\n logOut={logOut} \r\n toogleCollapse={toogleCollapse}\r\n isCollapsed={isCollapsed}\r\n > \r\n <>\r\n \r\n <div style={{\"height\": \"30px\"}}></div>\r\n <div style={{marginBottom:\"10px\"}}>\r\n <span onClick={() => setFiltedByEnabled(\"all\")} style={getfilterByEnabledCss(\"all\")}>All</span>\r\n <span onClick={() => setFiltedByEnabled(\"disabled\")} style={getfilterByEnabledCss(\"disabled\")}>Disabled</span>\r\n <span onClick={() => setFiltedByEnabled(\"enabled\")} style={getfilterByEnabledCss(\"enabled\")}>Enabled</span>\r\n </div>\r\n <PlayerStatistic \r\n activeGroup={filterGroup}\r\n total={playerStats.total}\r\n online={playerStats.active}\r\n offline={playerStats.notActive}\r\n assignedPlayers={playerStats.withAssignedChannel}\r\n unassignedPlayers={playerStats.withoutChannel}\r\n onClickFunction={filterPlayers}\r\n />\r\n {players.length != 0 &&\r\n <>\r\n <div className=\"map-wrapper\">\r\n {map()}\r\n </div>\r\n\r\n <Search value={searchString} onChangeValue={setSearchString} />\r\n\r\n <table className=\"table player-table\">\r\n <thead>\r\n <tr>\r\n <td className=\"sort-cursor\" onClick={()=>{setSortData(\"name\")}}>Player Name <SortIndicator isAsc={isAscSort} isActive={checkCurrentSortColumn(\"name\", sortBy)} /></td>\r\n <td>Player ID</td>\r\n <td>Network</td>\r\n <td className=\"sort-cursor\" onClick={()=>{setSortData(\"location\")}}>Location <SortIndicator isAsc={isAscSort} isActive={checkCurrentSortColumn(\"location\", sortBy)} /></td>\r\n <td>Hearbeat</td>\r\n <td>Version</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {playersPerPage.map(p => renderPlayerRow(p))} \r\n </tbody>\r\n </table> \r\n <Pagination activePage={currentPage} pagesCount={getPagesCount(filteredPlayers.length, itemsPerPage)} changePaginationPage={setCurrentPage} />\r\n </> \r\n }\r\n <SmallModal show={isShowDeleteModal} onRequestClose={closeDeleteModal}> \r\n <p>That you want to delete player with ID - <b>{playerIdForDelete}</b>?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeDeleteModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={deleteCurrentPlayer}/>\r\n </div>\r\n </SmallModal>\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n </InnerLayout>\r\n </>) \r\n}\r\n\r\nexport default withRouter(Players);","import axios from \"axios\";\r\nimport { getToken } from \"./authApi\";\r\nimport { ApiResponse, BaseCreateResponse, BaseInfo, BaseResponse, BaseResponseWithData, baseUrl, deleteWithBodyAndAuth, deleteWithAuth, getWithAuth, Guid, ListRespone, patchWithAuth, postWithAuth, postWithAuthWitoutParams } from \"./baseApi\"\r\n\r\nexport type MosaicCreateRequest = {\r\n name: string,\r\n columnsCount:number,\r\n rowsCount: number,\r\n}\r\n\r\nexport type MosaicModel = {\r\n id: Guid,\r\n name: string,\r\n columnsCount:number,\r\n rowsCount: number,\r\n players: string[],\r\n createdAt: string\r\n}\r\n\r\nexport type MosaicModelSingle = {\r\n id: Guid,\r\n name: string,\r\n columnsCount:number,\r\n rowsCount: number,\r\n elements:MosaicElement[],\r\n}\r\n\r\nexport enum MosaicElementType {\r\n Main = 0,\r\n Image = 1,\r\n Clock = 2,\r\n MediaLoop = 3,\r\n Youtube = 4,\r\n WebView = 5,\r\n}\r\n\r\nexport interface IMediaLoopItem {\r\n id:string,\r\n name: string,\r\n duration?: number\r\n}\r\n\r\nexport interface MosaicElement {\r\n id: Guid,\r\n type: MosaicElementType,\r\n startColumn: number,\r\n width: number,\r\n startRow: number,\r\n height: number,\r\n staticImageUrl?: string,\r\n clockBackgroundColour?: string,\r\n clockTextColour?: string,\r\n clockTextFormat?: string,\r\n mediaLoopMedias?: Guid[],\r\n name?: string,\r\n url?: string,\r\n mute?: boolean,\r\n youtubeIsLive?: boolean,\r\n // webviewName?: string,\r\n // webviewUrl?: string\r\n}\r\n\r\nexport type PlaylistItemAddRequest = {\r\n id: Guid,\r\n duration?:number\r\n}\r\n\r\nexport interface MosaicElementAddRequest {\r\n type: MosaicElementType,\r\n startColumn: number,\r\n width: number,\r\n startRow: number,\r\n height: number,\r\n staticImageName?: string,\r\n clockBackgroundColour?: string,\r\n clockTextColour?: string,\r\n clockTextFormat?: string,\r\n mediaLoopMedias?: PlaylistItemAddRequest[],\r\n name?: string,\r\n url?: string,\r\n mute?: boolean,\r\n youtubeIsLive?: boolean,\r\n // webviewName?: string,\r\n // webviewUrl?: string\r\n}\r\n\r\nexport interface MosaicElementsArrayAddRequest {\r\n elements: MosaicElementAddRequest[]\r\n}\r\n\r\nexport interface MosaicElementsArrayDeleteRequest {\r\n ids: Guid[]\r\n}\r\n\r\nexport type UploadMosaicImage = {\r\n id:Guid,\r\n name:string,\r\n url:string,\r\n originalName: string\r\n}\r\n\r\nexport interface MosaicTimeslotRequest {\r\n name: string,\r\n start: string,\r\n end: string\r\n}\r\n\r\nexport interface MosaicTimeslotResponse extends MosaicTimeslotRequest {\r\n id: Guid\r\n}\r\n\r\nexport const getMosaicSingle = async(id: Guid) : Promise<ApiResponse<BaseResponseWithData<MosaicModelSingle>>> => {\r\n return await getWithAuth({url : `${baseUrl}mosaic/${id}`});\r\n}\r\n\r\nexport const getMosaicList = async() : Promise<ApiResponse<ListRespone<MosaicModel>>> => {\r\n return await getWithAuth<ListRespone<MosaicModel>>({url : `${baseUrl}mosaic`});\r\n}\r\n\r\nexport const postMosaicTemplate = async(request:MosaicCreateRequest) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<MosaicCreateRequest,BaseCreateResponse>(`${baseUrl}mosaic`, request);\r\n}\r\n\r\nexport const postMosaicNewElements = async(request:MosaicElementsArrayAddRequest, id:Guid) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<MosaicElementsArrayAddRequest,BaseCreateResponse>(`${baseUrl}mosaic/${id}/elements`, request);\r\n}\r\n\r\nexport const deleteMosaicElements = async ( id: Guid, mosaicIds: MosaicElementsArrayDeleteRequest) :Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithBodyAndAuth<MosaicElementsArrayDeleteRequest, BaseResponse>(`${baseUrl}mosaic/${id}/elements`, mosaicIds);\r\n}\r\n\r\nexport const deleteMosaic = async (id: Guid) :Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}mosaic`, id);\r\n}\r\n\r\nexport const uploadImage = async (formData: any) : Promise<{data:{data: UploadMosaicImage}, status: number}> => {\r\n return await axios.post(`${baseUrl}recource`, formData, {\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n 'Authorization' : getToken()\r\n }, \r\n });\r\n}\r\n\r\nexport const getMosaicTimeslots = async (id: Guid): Promise<ApiResponse<ListRespone<MosaicTimeslotResponse>>> => {\r\n return await getWithAuth<ListRespone<MosaicTimeslotResponse>>({url : `${baseUrl}mosaic/${id}/timeslots`});\r\n}\r\n\r\nexport const postMosaicTimeslot = async (request: MosaicTimeslotRequest, id:Guid): Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<MosaicTimeslotRequest,BaseCreateResponse>(`${baseUrl}mosaic/${id}/timeslots`, request);\r\n}\r\n\r\nexport const deleteMosaicTimeslot = async (mosaicId:Guid, slotId:Guid):Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}mosaic/${mosaicId}/timeslots`, slotId);\r\n}","import { useEffect, useState } from \"react\";\r\nimport { getReportSubscriptions, reportSubscribe, ReportSubscription, ReportSubscriptionType, reportUnsubscribe } from \"../../../api/reportsApi\";\r\nimport GlobalSpinner from \"../globalsSpinner/GlobalSpinner\";\r\n\r\n\r\ninterface CheckedItems {\r\n [key: string]: boolean;\r\n}\r\n\r\ntype ReportSubscriptionElement = {\r\n type: ReportSubscriptionType,\r\n name: string\r\n}\r\n\r\nconst ReportSubscriptions = () => {\r\n let [subscriptions, setSubscriptions] = useState<ReportSubscription[]>([])\r\n let [checkedItems, setCheckedItems] = useState<CheckedItems>({});\r\n\r\n const subsElementsNetworkAndCampaign:ReportSubscriptionElement[] = [\r\n {name: \"Yesterday\" , type: ReportSubscriptionType.NetworkAndCampaignYesterday},\r\n\r\n {name: \"Week To Date (each day except Monday)\" , type: ReportSubscriptionType.NetworkAndCampaignWeekToDate},\r\n\r\n {name: \"Last Week (On every Monday)\" , type: ReportSubscriptionType.NetworkAndCampaignLastWeek},\r\n\r\n {name: \"Last 7 Days\" , type: ReportSubscriptionType.NetworkAndCampaignLast7Days},\r\n\r\n {name: \"Last Month (On every first day of the month)\" , type: ReportSubscriptionType.NetworkAndCampaignLastMonth},\r\n\r\n {name: \"Month To Date (each day except first day of the month)\" , type: ReportSubscriptionType.NetworkAndCampaignMonthToDate},\r\n ]\r\n\r\n const subsElementsAdhoc:ReportSubscriptionElement[] = [\r\n {name: \"Yesterday\" , type: ReportSubscriptionType.AdHocYesterday},\r\n\r\n {name: \"Week To Date (each day except Monday)\" , type: ReportSubscriptionType.AdHocWeekToDate},\r\n\r\n {name: \"Last Week (On every Monday)\" , type: ReportSubscriptionType.AdHocLastWeek},\r\n\r\n {name: \"Last 7 Days\" , type: ReportSubscriptionType.AdHocLast7Days},\r\n\r\n {name: \"\" , type: ReportSubscriptionType.AdHocLastMonth},\r\n\r\n {name: \"\" , type: ReportSubscriptionType.AdHocMonthToDate},\r\n ]\r\n\r\n useEffect(() => {\r\n async function fetchData(){\r\n await Promise.all([updateSubscribtions()]);\r\n\r\n const initialCheckedItems: CheckedItems = {};\r\n const subsElements = [...subsElementsNetworkAndCampaign, ...subsElementsAdhoc]\r\n subsElements.forEach(item => {\r\n let el = subscriptions.find( el => el.reportSubscriptionType === item.type)\r\n if(el){\r\n initialCheckedItems[item.type] = true;\r\n } else {\r\n initialCheckedItems[item.type] = false;\r\n }\r\n });\r\n setCheckedItems(initialCheckedItems);\r\n }\r\n\r\n fetchData();\r\n }, [])\r\n\r\n useEffect(() => {\r\n const initialCheckedItems: CheckedItems = {};\r\n const subsElements = [...subsElementsNetworkAndCampaign, ...subsElementsAdhoc]\r\n subsElements.forEach(item => {\r\n let el = subscriptions.find( el => el.reportSubscriptionType === item.type)\r\n if(el){\r\n initialCheckedItems[item.type] = true;\r\n } else {\r\n initialCheckedItems[item.type] = false;\r\n }\r\n });\r\n setCheckedItems(initialCheckedItems);\r\n }, [subscriptions])\r\n\r\n const updateSubscribtions = async () => {\r\n let res = await getReportSubscriptions()\r\n if(res.type === \"succes\") {\r\n setSubscriptions(res.data.items)\r\n }\r\n }\r\n\r\n const handleCheckboxChange = async (type: ReportSubscriptionType) => {\r\n\r\n let req: ReportSubscription = {\r\n reportSubscriptionType: type\r\n }\r\n if(checkedItems[type]){\r\n await reportUnsubscribe(req)\r\n } else {\r\n await reportSubscribe(req)\r\n }\r\n\r\n setCheckedItems((prev) => ({\r\n ...prev,\r\n [type]: !prev[type],\r\n }));\r\n\r\n await updateSubscribtions()\r\n };\r\n\r\n const renderSubscribtions = (items: ReportSubscriptionElement[]) => {\r\n return items.map( (el, i) => {\r\n return <div key={`${i}--${el.type}`} className=\"report-subscriptions__cell\">\r\n {\r\n el.name == \"\" \r\n ? <></>\r\n : <>\r\n <span>{el.name}</span>\r\n <label htmlFor={`report-${i}`} className=\"checkbox-control\">\r\n <input \r\n id={`report-${i}`} \r\n className=\"checkbox\" \r\n type=\"checkbox\" \r\n checked={!!checkedItems[el.type]}\r\n onChange={() => handleCheckboxChange(el.type)}\r\n />\r\n <span className=\"checkbox-bg\"></span>\r\n <span className=\"checkbox-cursor\"></span>\r\n </label>\r\n </>\r\n }\r\n \r\n </div>\r\n })\r\n }\r\n\r\n return (\r\n <>\r\n <div className=\"report-subscriptions mb-30\">\r\n <div className=\"report-subscriptions__block\">\r\n <div className=\"report-subscriptions__cell\"><b>Network And Campaign</b></div>\r\n {renderSubscribtions(subsElementsNetworkAndCampaign)}\r\n <div className=\"report-subscriptions__cell\"><b>AdHoc</b></div>\r\n {renderSubscribtions(subsElementsAdhoc)}\r\n </div>\r\n </div>\r\n </>\r\n )\r\n}\r\n\r\nexport default ReportSubscriptions","import { FC, useEffect, useState } from \"react\"\r\nimport GlobalSpinner from \"../globalsSpinner/GlobalSpinner\";\r\nimport Select, { MultiValue } from \"react-select\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport { getPlayersShort } from \"../../../api/playersApi\";\r\nimport { daysSinceLastMonday, daysSinceStartOfMonth, formatDate, formatMsToHHMMSS, generateUniqueId, getDaysInPreviousMonth, getPastDateByDaysAgo, isFirstDateGreaterThanSecond } from \"../../../services/dateService\";\r\nimport Pagination from \"../pagination/Pagination\";\r\nimport { Button } from \"../Button\";\r\nimport \"./ReportDashboard.css\"\r\nimport { FormInput, FormRow } from \"../formRow/FormRow\";\r\nimport { CartesianGrid, Legend, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from \"recharts\";\r\nimport { downloadCSVReportsDashboardData, getReportsDashboardData, PlayoutsPerDate, PlayoutsReportRow, postReportsDashboardDataRequest, ReportDashboardColumns } from \"../../../api/reportsApi\";\r\nimport { ReactSortable } from \"react-sortablejs\";\r\nimport { getCampaignsBase } from \"../../../api/campaingsApi\";\r\nimport { getChannelsShort } from \"../../../api/channelsApi\";\r\nimport { getMediaBaseInfo, MediaContentType, mediaContentTypeOptions } from \"../../../api/mediaApi\";\r\nimport { getPagesCount } from \"../../../services/paginator\";\r\nimport { RightModal, SmallModal } from \"../sideModal/Modal\";\r\nimport { RouteComponentProps, withRouter } from \"react-router-dom\";\r\nimport { Routes } from \"../../../constants/routes\";\r\nimport ReportSubscriptions from \"../reportSubscriptions/ReportSubscriptions\";\r\nimport fileDownload from \"js-file-download\";\r\nimport IconButton from \"../iconButton/IconButton\";\r\nimport { formatDuration } from \"../../../services/common\";\r\n\r\ntype Option<T> = { value: T, label: string}\r\ntype Slice = {\r\n id: number,\r\n name: string,\r\n isActive: boolean\r\n}\r\n\r\ntype SelectedDatePeriodType = \"\" | \"Today\" | \"Yesterday\" | \"WeekToDate\" | \"LastWeek\" | \"Last7Days\" | \"LastMonth\" | \"MonthToDate\"\r\n\r\ntype Preset = {\r\n id: string,\r\n name: string,\r\n startDate: string,\r\n endDate: string,\r\n periodType: SelectedDatePeriodType,\r\n slices: Slice[],\r\n campaignIds: Guid[],\r\n playerIds: Guid[],\r\n networkIds: Guid[],\r\n mediaIds: Guid[],\r\n contentTypes: number[]\r\n}\r\n\r\nconst startSliceData:Slice[] = [{\r\n id: ReportDashboardColumns.Campaign,\r\n name: ReportDashboardColumns[ReportDashboardColumns.Campaign],\r\n isActive: true\r\n},\r\n{\r\n id: ReportDashboardColumns.Network,\r\n name: ReportDashboardColumns[ReportDashboardColumns.Network],\r\n isActive: false\r\n},\r\n{\r\n id: ReportDashboardColumns.Player,\r\n name: ReportDashboardColumns[ReportDashboardColumns.Player],\r\n isActive: false\r\n},\r\n{\r\n id: ReportDashboardColumns.Media,\r\n name: ReportDashboardColumns[ReportDashboardColumns.Media],\r\n isActive: false\r\n},\r\n{\r\n id: ReportDashboardColumns.ContentType,\r\n name: ReportDashboardColumns[ReportDashboardColumns.ContentType],\r\n isActive: false\r\n},\r\n]\r\n\r\ntype DurationMode = \"Hours\" | \"Minutes\"\r\n\r\nconst ReportDashboard:FC<RouteComponentProps> = (props) => {\r\n let [isLoading, setIsLoading] = useState(false);\r\n\r\n let [filteredPlayers, setFilteredPlayers ] = useState<Option<Guid>[]>([]);\r\n let [filteredCampaigns, setFilteredCampaigns ] = useState<Option<Guid>[]>([]);\r\n let [filteredNetworks, setFilteredNetworks ] = useState<Option<Guid>[]>([]);\r\n let [filteredMedias, setFilteredMedias ] = useState<Option<Guid>[]>([]);\r\n let [filteredContentTypes, setFilteredContentTypes ] = useState<Option<number>[]>([]);\r\n let [selectedPlayers, setSelectedPlayers] = useState<Guid[]>([]);\r\n let [selectedCampaigns, setSelectedCampaigns] = useState<Guid[]>([]);\r\n let [selectedNetworks, setSelectedNetworks] = useState<Guid[]>([]);\r\n let [selectedMedias, setSelectedMedias] = useState<Guid[]>([]);\r\n let [selectedContentTypes, setSelectedContentTypes] = useState<number[]>([]);\r\n\r\n\r\n let [currentPage, setCurrentPage] = useState<number>(1);\r\n\r\n let [selectedStartDate, setSelectedStartDate] = useState<string>(\"\")\r\n let [isSelectedStartDateError, setIsSelectedStartDateError] = useState(false)\r\n let [selectedEndDate, setSelectedEndDate] = useState<string>(getPastDateByDaysAgo(0))\r\n let [isSelectedEndDateError, setIsSelectedEndDateError] = useState(false)\r\n\r\n let [playoutsPerDay, setPlayoutsPerDay] = useState<PlayoutsPerDate[]>([])\r\n\r\n let [reportPlayouts, setReportPlayouts] = useState<PlayoutsReportRow[]>([])\r\n let [reportPlayoutsForDisplay, setReportPlayoutsForDisplay] = useState<PlayoutsReportRow[]>([])\r\n\r\n let [selectedDatePeriodType, setSelectedDatePeriodType] = useState<SelectedDatePeriodType>(\"LastMonth\")\r\n\r\n let [sliceColumns, setSliceColumns] = useState<number[]>([])\r\n\r\n\r\n let [isShowSmallModal, setIsShowSmallModal] = useState(false)\r\n let [isShowPresetModal, setIsShowPresetModal] = useState(false)\r\n let [isShowSheduledReportsModal, setIsShowSheduledReportsModal] = useState(false)\r\n let [isShowConfirmResetModal, setIsShowConfirmResetModal] = useState(false)\r\n\r\n let [presetName, setPresetName] = useState(\"\");\r\n let [isPresetNameError, setIsPresetNameError] = useState(false);\r\n let [presetNameErrorMessage, setPresetNameErrorMessage] = useState(\"\");\r\n let [presets, setPresets] = useState<Preset[]>([])\r\n\r\n let [slices, setSlices] = useState<Slice[]>(startSliceData)\r\n\r\n let [totalPlayouts, setTotalPlayouts] = useState(0)\r\n let [totalDurationString, setTotalDurationString] = useState(\"\")\r\n let [totalDurationSeconds, setTotalDurationSeconds] = useState(0)\r\n let [durationMode, setDurationMode] = useState<DurationMode>(\"Hours\")\r\n\r\n let itemsPerPage = 20;\r\n\r\n useEffect(()=>{\r\n async function fetchProfiles(){\r\n setIsLoading(true);\r\n setMonthToDatePeriod();\r\n setPresets(getPresetsState())\r\n setFilteredContentTypes(getContentTypeOptions())\r\n await Promise.all([updatePlayers(), updateCampaigns(), updateNetworks(), updateMedias()]);\r\n setIsLoading(false);\r\n }\r\n\r\n fetchProfiles()\r\n },[])\r\n\r\n const getContentTypeOptions = () => mediaContentTypeOptions.map( el => ({label: el.name, value: el.type}))\r\n\r\n const renderContentTypeName = (type: MediaContentType) => {\r\n switch(type) {\r\n case MediaContentType.Ads : return \"Campaigns\"\r\n case MediaContentType.ClientContent : return \"Network Content\"\r\n case MediaContentType.SelfContent: return \"Inhouse Content\"\r\n case MediaContentType.Backup: return \"Others\"\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n let startIndex = (currentPage - 1)*itemsPerPage;\r\n let finishIndex = startIndex + itemsPerPage;\r\n setReportPlayoutsForDisplay(reportPlayouts.slice(startIndex, finishIndex));\r\n },[reportPlayouts,currentPage])\r\n\r\n useEffect(() => {\r\n validateReportPeriodDates(selectedStartDate,selectedEndDate)\r\n }, [selectedEndDate,selectedStartDate])\r\n\r\n const updateCampaigns = async () => {\r\n var result = await getCampaignsBase();\r\n if(result.type === \"succes\") {\r\n let t = result.data.items.map(el => {\r\n return {\r\n label: el.name,\r\n value: el.id\r\n }\r\n })\r\n setFilteredCampaigns(t)\r\n }\r\n }\r\n const updateNetworks = async () => {\r\n var result = await getChannelsShort();\r\n if(result.type === \"succes\") {\r\n let t = result.data.items.map(el => {\r\n return {\r\n label: el.name,\r\n value: el.id\r\n }\r\n })\r\n setFilteredNetworks(t)\r\n }\r\n }\r\n const updateMedias = async () => {\r\n var result = await getMediaBaseInfo();\r\n if(result.type === \"succes\") {\r\n let t = result.data.items.map(el => {\r\n return {\r\n label: el.name,\r\n value: el.id\r\n }\r\n })\r\n setFilteredMedias(t)\r\n }\r\n }\r\n\r\n const updatePlayers = async () => {\r\n var result = await getPlayersShort();\r\n if(result.type === \"succes\"){\r\n let t = result.data.items.map( el => {\r\n return {\r\n label: el.name,\r\n value: el.id\r\n }\r\n })\r\n setFilteredPlayers(t);\r\n }\r\n }\r\n\r\n const updateReportDashboardData = async () => {\r\n\r\n let isValid = true\r\n\r\n if(selectedStartDate === \"\"){\r\n setIsSelectedStartDateError(true)\r\n isValid = false\r\n }\r\n if(selectedEndDate === \"\"){\r\n setIsSelectedEndDateError(true)\r\n isValid = false\r\n }\r\n\r\n if(!isValid) return\r\n\r\n setCurrentPage(1)\r\n let result = await getReportsDashboardData({\r\n startTime: selectedStartDate,\r\n endTime: selectedEndDate,\r\n columns: getColumnsForRequest(slices),\r\n networkIds: selectedNetworks,\r\n campaignIds: selectedCampaigns,\r\n playerIds: selectedPlayers,\r\n mediaIds: selectedMedias,\r\n contentTypes: selectedContentTypes\r\n })\r\n if(result.type === \"succes\") {\r\n let durMode = checkMode(result.data.data.totalDurationSeconds, result.data.data.chart.length)\r\n setReportPlayouts(result.data.data.tableRows)\r\n setSliceColumns(result.data.data.columns)\r\n setTotalPlayouts(result.data.data.totalPlayouts)\r\n setTotalDurationString(result.data.data.totalDurationString)\r\n setTotalDurationSeconds(result.data.data.totalDurationSeconds)\r\n setDurationMode(durMode)\r\n setPlayoutsPerDay(result.data.data.chart.map(t => {\r\n return {\r\n date: formatDate(t.date),\r\n playouts: t.playouts,\r\n durationSeconds: durationFormatter(durMode,t.durationSeconds)\r\n }\r\n }))\r\n }\r\n }\r\n\r\n const resetReportDashboardData = () => {\r\n setSlices(startSliceData)\r\n setSliceColumns([])\r\n setPlayoutsPerDay([])\r\n setReportPlayouts([])\r\n setSelectedDatePeriodType(\"\")\r\n setSelectedStartDate(\"\")\r\n setIsSelectedStartDateError(false)\r\n setSelectedEndDate(\"\")\r\n setIsSelectedEndDateError(false)\r\n setSelectedCampaigns([])\r\n setSelectedNetworks([])\r\n setSelectedPlayers([])\r\n setSelectedMedias([])\r\n setSelectedContentTypes([])\r\n setCurrentPage(1)\r\n setIsShowConfirmResetModal(false)\r\n }\r\n\r\n const updateReportDashboardDataForAdhoc = async () => {\r\n let result = await postReportsDashboardDataRequest({\r\n startTime: selectedStartDate,\r\n endTime: selectedEndDate,\r\n columns: getColumnsForRequest(slices),\r\n networkIds: selectedNetworks,\r\n campaignIds: selectedCampaigns,\r\n playerIds: selectedPlayers,\r\n mediaIds: selectedMedias,\r\n contentTypes: selectedContentTypes\r\n })\r\n if(result.type === \"succes\") {\r\n setIsShowSmallModal(true)\r\n }\r\n }\r\n\r\n const updateReportDashboardDataFromPreset = async (preset: Preset) => {\r\n setIsLoading(true)\r\n setCurrentPage(1)\r\n let result = await getReportsDashboardData({\r\n startTime: preset.startDate,\r\n endTime: preset.endDate,\r\n columns: getColumnsForRequest(preset.slices),\r\n networkIds: preset.networkIds,\r\n campaignIds: preset.campaignIds,\r\n playerIds: preset.playerIds,\r\n mediaIds: preset.mediaIds,\r\n contentTypes: preset.contentTypes\r\n })\r\n if(result.type === \"succes\") {\r\n let durMode = checkMode(result.data.data.totalDurationSeconds, result.data.data.chart.length)\r\n setReportPlayouts(result.data.data.tableRows)\r\n setSliceColumns(result.data.data.columns)\r\n setTotalPlayouts(result.data.data.totalPlayouts)\r\n setTotalDurationString(result.data.data.totalDurationString)\r\n setTotalDurationSeconds(result.data.data.totalDurationSeconds)\r\n setDurationMode(durMode)\r\n setPlayoutsPerDay(result.data.data.chart.map(t => {\r\n return {\r\n date: formatDate(t.date),\r\n playouts: t.playouts,\r\n durationSeconds: durationFormatter(durMode,t.durationSeconds)\r\n }\r\n }))\r\n }\r\n setIsLoading(false)\r\n }\r\n\r\n const checkMode = (a:number, b:number): DurationMode => a/b >= 3600 ? \"Hours\" : \"Minutes\"\r\n\r\n const durationFormatter = (durationMode: DurationMode,durationSeconds: number) => {\r\n let hours = Math.floor(durationSeconds*100 / 3600)/100;\r\n let minutes = Math.floor(durationSeconds*100 / 60)/100;\r\n return durationMode == \"Hours\" ? hours : minutes\r\n }\r\n\r\n const onStartDateChanged = (date: string) => {\r\n setSelectedStartDate(date);\r\n setSelectedDatePeriodType(\"\")\r\n }\r\n const onEndDateChanged = (date: string) => {\r\n setSelectedEndDate(date);\r\n setSelectedDatePeriodType(\"\")\r\n }\r\n\r\n const validateReportPeriodDates = (start: string, end: string) => {\r\n if(isFirstDateGreaterThanSecond(start, end)){\r\n setIsSelectedEndDateError(true)\r\n setIsSelectedStartDateError(true)\r\n } else {\r\n setIsSelectedEndDateError(false)\r\n setIsSelectedStartDateError(false)\r\n }\r\n }\r\n\r\n const setTodayPeriod = () => {\r\n let start = getPastDateByDaysAgo(0)\r\n let end = getPastDateByDaysAgo(0)\r\n setSelectedStartDate(start);\r\n setSelectedEndDate(end)\r\n setSelectedDatePeriodType(\"Today\")\r\n return {start, end}\r\n }\r\n\r\n const setYesterdayPeriod = () => {\r\n let start = getPastDateByDaysAgo(1)\r\n let end = getPastDateByDaysAgo(1)\r\n setSelectedStartDate(start);\r\n setSelectedEndDate(end)\r\n setSelectedDatePeriodType(\"Yesterday\")\r\n return {start, end}\r\n }\r\n\r\n const setWeekToDatePeriod = () => {\r\n let start = getPastDateByDaysAgo(daysSinceLastMonday())\r\n let end = getPastDateByDaysAgo(0)\r\n setSelectedStartDate(start);\r\n setSelectedEndDate(end)\r\n setSelectedDatePeriodType(\"WeekToDate\")\r\n return {start, end}\r\n }\r\n\r\n const setLastWeekPeriod = () => {\r\n let start = getPastDateByDaysAgo(daysSinceLastMonday() + 7)\r\n let end = getPastDateByDaysAgo(daysSinceLastMonday() + 1)\r\n setSelectedStartDate(start);\r\n setSelectedEndDate(end)\r\n setSelectedDatePeriodType(\"LastWeek\")\r\n return {start, end}\r\n }\r\n\r\n const setMonthToDatePeriod = () => {\r\n let start = getPastDateByDaysAgo(daysSinceStartOfMonth())\r\n let end = getPastDateByDaysAgo(0)\r\n setSelectedStartDate(start);\r\n setSelectedEndDate(end)\r\n setSelectedDatePeriodType(\"MonthToDate\")\r\n return {start, end}\r\n }\r\n\r\n const setLast7DaysPeriod = () => {\r\n let start = getPastDateByDaysAgo(7)\r\n let end = getPastDateByDaysAgo(1)\r\n setSelectedStartDate(start);\r\n setSelectedEndDate(end)\r\n setSelectedDatePeriodType(\"Last7Days\")\r\n return {start, end}\r\n }\r\n\r\n const setLastMonthPeriod = () => {\r\n let start = getPastDateByDaysAgo(daysSinceStartOfMonth() + getDaysInPreviousMonth())\r\n let end = getPastDateByDaysAgo(daysSinceStartOfMonth() + 1)\r\n setSelectedStartDate(start);\r\n setSelectedEndDate(end)\r\n setSelectedDatePeriodType(\"LastMonth\")\r\n return {start, end}\r\n }\r\n\r\n\r\n const onChangeSelectedPlayer = (newValue: MultiValue<Option<Guid>>) => {\r\n if(newValue){\r\n let newIds = newValue.map(el => el.value)\r\n setSelectedPlayers(newIds);\r\n } else {\r\n setSelectedPlayers([]);\r\n }\r\n }\r\n const onChangeSelectedCampaign = (newValue: MultiValue<Option<Guid>>) => {\r\n if(newValue){\r\n let newIds = newValue.map(el => el.value)\r\n setSelectedCampaigns(newIds);\r\n } else {\r\n setSelectedCampaigns([]);\r\n }\r\n }\r\n const onChangeSelectedNetwork = (newValue: MultiValue<Option<Guid>>) => {\r\n if(newValue){\r\n let newIds = newValue.map(el => el.value)\r\n setSelectedNetworks(newIds);\r\n } else {\r\n setSelectedNetworks([]);\r\n }\r\n }\r\n const onChangeSelectedMedia = (newValue: MultiValue<Option<Guid>>) => {\r\n if(newValue){\r\n let newIds = newValue.map(el => el.value)\r\n setSelectedMedias(newIds);\r\n } else {\r\n setSelectedMedias([]);\r\n }\r\n }\r\n const onChangeSelectedContentType = (newValue: MultiValue<Option<number>>) => {\r\n if(newValue){\r\n let newIds = newValue.map(el => el.value)\r\n setSelectedContentTypes(newIds);\r\n } else {\r\n setSelectedContentTypes([]);\r\n }\r\n }\r\n\r\n const renderPlayoutRows = (rows: PlayoutsReportRow[], columns: ReportDashboardColumns[]) => {\r\n return rows.map( (item,i) => {\r\n return <tr key={i}>\r\n {columns.map((el,j) => {\r\n return <td key={j}>{getCellValue(item, el)}</td>\r\n })}\r\n <td>{item.playouts}</td>\r\n <td>{formatMsToHHMMSS(item.duration)}</td>\r\n </tr>\r\n })\r\n }\r\n\r\n const renderTableTitles = (columns: ReportDashboardColumns[]) => {\r\n return columns.map((el,i) => {\r\n return <td key={i}>{ReportDashboardColumns[el]}</td>\r\n })\r\n }\r\n\r\n const changeSliceStatus = (id: number) => {\r\n setSlices(prevSlices => \r\n prevSlices.map((slice) =>\r\n slice.id === id ? { ...slice, isActive: !slice.isActive } : slice\r\n )\r\n );\r\n }\r\n\r\n const getColumnsForRequest = (slices: Slice[]) => {\r\n return slices.filter(t => t.isActive).map(t => t.id)\r\n }\r\n\r\n const renderSlices = (slices: Slice[]) => {\r\n return slices.map( (it) => {\r\n return <span className=\"slices__elem\" key={it.id}>{it.name}  \r\n <label className=\"checkbox-control\">\r\n <input \r\n id={`slice-${it.name}-${it.id}`} \r\n className=\"checkbox\" \r\n type=\"checkbox\" \r\n checked={it.isActive}\r\n onChange={() => {changeSliceStatus(it.id)}}\r\n />\r\n <span className=\"checkbox-bg\"></span>\r\n <span className=\"checkbox-cursor\"></span>\r\n </label>\r\n </span>\r\n })\r\n }\r\n\r\n const getCellValue = (rowTable: PlayoutsReportRow, currentColumn: number) => {\r\n switch(currentColumn) {\r\n case ReportDashboardColumns.Network : return rowTable.network\r\n case ReportDashboardColumns.Campaign : return rowTable.campaign\r\n case ReportDashboardColumns.Player: return rowTable.player\r\n case ReportDashboardColumns.Media: return rowTable.media\r\n case ReportDashboardColumns.ContentType: return renderContentTypeName(rowTable.contentType)\r\n }\r\n }\r\n\r\n const checkActiveDatePeriodType = (type: SelectedDatePeriodType) => {\r\n return selectedDatePeriodType === type ? 'active' : null\r\n }\r\n\r\n const hidePresetModal = () => {\r\n setPresetName(\"\")\r\n setIsPresetNameError(false)\r\n setPresetNameErrorMessage(\"\")\r\n setIsShowPresetModal(false)\r\n }\r\n\r\n const createNewPreset = async () => {\r\n if(presetName === \"\") {\r\n setIsPresetNameError(true);\r\n setPresetNameErrorMessage(\"Please enter Preset Name\")\r\n return;\r\n }\r\n \r\n let presetIndex = presets.findIndex(p => p.name === presetName)\r\n\r\n if(presetIndex !== -1){\r\n setIsPresetNameError(true);\r\n setPresetNameErrorMessage(\"This Preset is already exists\")\r\n return;\r\n }\r\n \r\n let newPreset: Preset \r\n\r\n if(selectedDatePeriodType !== \"\") {\r\n newPreset = {\r\n id: generateUniqueId(),\r\n name: presetName,\r\n slices: slices,\r\n periodType: selectedDatePeriodType,\r\n startDate: \"\",\r\n endDate: \"\",\r\n campaignIds: selectedCampaigns,\r\n networkIds: selectedNetworks,\r\n playerIds: selectedPlayers,\r\n mediaIds: selectedMedias,\r\n contentTypes: selectedContentTypes\r\n };\r\n } else {\r\n newPreset = {\r\n id: generateUniqueId(),\r\n name: presetName,\r\n slices: slices,\r\n periodType: \"\",\r\n startDate: selectedStartDate,\r\n endDate: selectedEndDate,\r\n campaignIds: selectedCampaigns,\r\n networkIds: selectedNetworks,\r\n playerIds: selectedPlayers,\r\n mediaIds: selectedMedias,\r\n contentTypes: selectedContentTypes\r\n };\r\n }\r\n\r\n let newPresetState = [...presets, newPreset]\r\n saveCurrentPresetState(newPresetState)\r\n \r\n hidePresetModal()\r\n }\r\n\r\n const getPresetsState = () => {\r\n const presetsFromStorage = localStorage.getItem('presets')\r\n\r\n if (!presetsFromStorage) {\r\n return []\r\n }\r\n\r\n const presetArray:Preset[] = JSON.parse(presetsFromStorage)\r\n\r\n return presetArray\r\n }\r\n\r\n const removePreset = (id:Guid) => {\r\n let presetIndex = presets.findIndex(p => p.id === id);\r\n let updatedPresets = [...presets]\r\n if(presetIndex !== -1) {\r\n updatedPresets.splice(presetIndex,1)\r\n saveCurrentPresetState(updatedPresets)\r\n }\r\n }\r\n\r\n const saveCurrentPresetState = (data: Preset[]) => {\r\n setPresets(data)\r\n localStorage.setItem('presets', JSON.stringify(data))\r\n }\r\n\r\n const setPeriodFromPreset = (type: SelectedDatePeriodType) => {\r\n switch(type){\r\n case \"Today\" : {\r\n let dates = setTodayPeriod()\r\n return dates\r\n }\r\n case \"Yesterday\" : {\r\n let dates = setYesterdayPeriod()\r\n return dates\r\n }\r\n case \"WeekToDate\" : {\r\n let dates = setWeekToDatePeriod()\r\n return dates\r\n }\r\n case \"LastWeek\" : {\r\n let dates = setLastWeekPeriod()\r\n return dates\r\n }\r\n case \"Last7Days\" : {\r\n let dates = setLast7DaysPeriod()\r\n return dates\r\n }\r\n case \"LastMonth\" : {\r\n let dates = setLastMonthPeriod()\r\n return dates\r\n }\r\n case \"MonthToDate\" : {\r\n let dates = setMonthToDatePeriod()\r\n return dates\r\n }\r\n default: {\r\n return {start:\"\", end: \"\"}\r\n }\r\n }\r\n }\r\n\r\n const restoreDataFromPreset = async (id:Guid) => {\r\n let presetIndex = presets.findIndex(p => p.id === id);\r\n if(presetIndex !== -1) {\r\n let elem = presets[presetIndex]\r\n if(elem.periodType !== \"\"){\r\n setSelectedDatePeriodType(elem.periodType)\r\n let dates = setPeriodFromPreset(elem.periodType)\r\n elem.startDate = dates.start\r\n elem.endDate = dates.end\r\n } else {\r\n setSelectedDatePeriodType(\"\")\r\n setSelectedStartDate(elem.startDate)\r\n setSelectedEndDate(elem.endDate)\r\n }\r\n setIsSelectedStartDateError(false)\r\n setIsSelectedEndDateError(false)\r\n if(elem.slices.findIndex(t => t.id === ReportDashboardColumns.ContentType) == -1){\r\n elem.slices.push({\r\n id: 4,\r\n name: ReportDashboardColumns[ReportDashboardColumns.ContentType],\r\n isActive: false\r\n })\r\n }\r\n setSlices(elem.slices)\r\n setSelectedCampaigns(elem.campaignIds)\r\n setSelectedNetworks(elem.networkIds)\r\n setSelectedPlayers(elem.playerIds)\r\n setSelectedMedias(elem.mediaIds)\r\n setSelectedContentTypes(elem.contentTypes ?? [])\r\n\r\n\r\n\r\n await updateReportDashboardDataFromPreset(elem)\r\n } \r\n\r\n }\r\n\r\n const renderPreset = (presets: Preset[]) => {\r\n return presets.map( el => {\r\n return <span \r\n key={el.id} \r\n className=\"presets__elem\"\r\n >\r\n <span onClick={() => {restoreDataFromPreset(el.id)}}>{el.name} </span>\r\n <span className=\"close__element\" onClick={()=>{removePreset(el.id)}}>x</span>\r\n </span>\r\n })\r\n }\r\n\r\n const downloadFile = async () => {\r\n let result = await downloadCSVReportsDashboardData({\r\n startTime: selectedStartDate,\r\n endTime: selectedEndDate,\r\n columns: getColumnsForRequest(slices),\r\n networkIds: selectedNetworks,\r\n campaignIds: selectedCampaigns,\r\n playerIds: selectedPlayers,\r\n mediaIds: selectedMedias,\r\n contentTypes: selectedContentTypes\r\n })\r\n fileDownload(result.data, result.filename);\r\n }\r\n\r\n return (\r\n <>\r\n\r\n <div className=\"presets mb-30\">\r\n <div className=\"presets__block\">\r\n <h3>Use Preset</h3>\r\n {renderPreset(presets)}\r\n </div>\r\n <div className=\"d-flex justify-content-between align-items-start gap15\">\r\n <Button color=\"green\" label=\"Add Preset\" onClick={() => {setIsShowPresetModal(true)}} isDisabled={isSelectedStartDateError || isSelectedEndDateError}/>\r\n <Button color=\"green\" label=\"Request AdHoc\" onClick={() => {updateReportDashboardDataForAdhoc()}} isDisabled={isSelectedStartDateError || isSelectedEndDateError}/>\r\n <Button color=\"green\" label=\"To Adhoc Reports\" onClick={() => {\r\n props.history.push(Routes.ReportsAdhoc)\r\n }}/>\r\n <Button color=\"green\" label=\"Scheduled Reports\" onClick={()=>{setIsShowSheduledReportsModal(true)}}/>\r\n </div>\r\n </div>\r\n\r\n <div className=\"chart-block d-flex\" style={{height:300}}>\r\n <ResponsiveContainer width=\"100%\" height=\"100%\">\r\n {playoutsPerDay.length !== 0 ? <LineChart\r\n width={500}\r\n height={300}\r\n data={playoutsPerDay}\r\n margin={{\r\n top: 0,\r\n right: 0,\r\n left: 0,\r\n bottom: 0,\r\n }}\r\n >\r\n <Legend align=\"left\" verticalAlign=\"top\" height={30} />\r\n <CartesianGrid strokeDasharray=\"0 0\" />\r\n <XAxis dataKey=\"date\" />\r\n <YAxis yAxisId={\"left\"} dataKey=\"playouts\" />\r\n <YAxis yAxisId={\"right\"} orientation=\"right\" dataKey=\"durationSeconds\" />\r\n <Tooltip />\r\n <Line yAxisId={\"left\"} type=\"monotone\" dataKey=\"playouts\" name=\"Playouts\" stroke=\"#8884d8\" animationDuration={2000} activeDot={{ r: 6 }}/>\r\n <Line yAxisId={\"right\"} type=\"monotone\" dataKey=\"durationSeconds\" name={`Duration ${durationMode}`} stroke=\"#ACE7A8\" animationDuration={2000}/>\r\n </LineChart> : \r\n <div style={{textAlign:\"center\", paddingTop:\"150px\", fontSize:\"18px\"}}>\r\n Please use below options to build your report, click on Update button to display charts and stats.\r\n </div>} \r\n </ResponsiveContainer>\r\n </div>\r\n\r\n <h2 className=\"mb-5 pt-20\">Report Period</h2>\r\n <div className=\"preset-date-inputs\">\r\n <div className=\"d-flex align-items-center gap15\" style={{width:\"50%\"}}>\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"Please select start date that earlier then end date\"\r\n id=\"preset_start_date\"\r\n isError={isSelectedStartDateError}\r\n type=\"date\"\r\n onChangeValue={(v) => {onStartDateChanged(v)}}\r\n value={selectedStartDate}\r\n title=\"Start\"\r\n /> \r\n </FormRow>\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"\"\r\n id=\"preset_end_date\"\r\n isError={isSelectedEndDateError}\r\n type=\"date\"\r\n onChangeValue={(v) => {onEndDateChanged(v)}}\r\n value={selectedEndDate}\r\n title=\"End\"\r\n /> \r\n </FormRow> \r\n </div>\r\n <div className=\"dates-presets\" style={{width:\"50%\"}}>\r\n <span className={`${checkActiveDatePeriodType(\"Today\")}`} onClick={setTodayPeriod}>Today</span>\r\n <span className={`${checkActiveDatePeriodType(\"Yesterday\")}`} onClick={setYesterdayPeriod}>Yesterday</span>\r\n <span className={`${checkActiveDatePeriodType(\"WeekToDate\")}`} onClick={setWeekToDatePeriod}>Week To Date</span>\r\n <span className={`${checkActiveDatePeriodType(\"LastWeek\")}`} onClick={setLastWeekPeriod}>Last Week</span>\r\n <span className={`${checkActiveDatePeriodType(\"Last7Days\")}`} onClick={setLast7DaysPeriod}>Last 7 Days</span>\r\n <span className={`${checkActiveDatePeriodType(\"LastMonth\")}`} onClick={setLastMonthPeriod}>Last Month</span>\r\n <span className={`${checkActiveDatePeriodType(\"MonthToDate\")}`} onClick={setMonthToDatePeriod}>Month To Date</span>\r\n </div>\r\n </div>\r\n\r\n <div className=\"slices\">\r\n <h2>Splits</h2>\r\n <div className=\"d-flex justify-content-between\">\r\n <ReactSortable \r\n list={slices}\r\n setList={(newState) => {\r\n setSlices(newState)\r\n }}\r\n tag={\"div\"}\r\n className=\"slices__sort-block\"\r\n >\r\n {renderSlices(slices)}\r\n </ReactSortable>\r\n <div className=\"d-flex justify-content-end align-items-center gap15\">\r\n <Button color=\"green\" label=\"Reset\" onClick={() => setIsShowConfirmResetModal(true)} />\r\n <Button color=\"green\" label=\"Update\" onClick={updateReportDashboardData} isDisabled={isSelectedStartDateError || isSelectedEndDateError}/>\r\n {reportPlayouts.length ? <div className=\"export-pos\">\r\n <a className=\"link-like__elem md\" target=\"_blank\" onClick={downloadFile}>Download CSV <IconButton tooltipText=\"Download\" type=\"export\" /> </a>\r\n </div> : null}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"d-flex align-items-center pt-30 mb-20 w-100 gap15\">\r\n <div className=\"w-100\">\r\n <label>Campaigns</label>\r\n <Select \r\n options={filteredCampaigns}\r\n classNamePrefix={`select`}\r\n onChange={onChangeSelectedCampaign} \r\n value={filteredCampaigns.filter(c => selectedCampaigns.includes(c.value))}\r\n isClearable={true}\r\n isMulti={true}\r\n />\r\n </div>\r\n <div className=\"w-100\">\r\n <label>Players</label>\r\n <Select \r\n options={filteredPlayers}\r\n classNamePrefix={`select`}\r\n onChange={onChangeSelectedPlayer} \r\n value={filteredPlayers.filter(p => selectedPlayers.includes(p.value))}\r\n isClearable={true}\r\n isMulti={true}\r\n />\r\n </div>\r\n <div className=\"w-100\">\r\n <label>Networks</label>\r\n <Select \r\n options={filteredNetworks}\r\n classNamePrefix={`select`}\r\n onChange={onChangeSelectedNetwork} \r\n value={filteredNetworks.filter(n => selectedNetworks.includes(n.value))}\r\n isClearable={true}\r\n isMulti={true}\r\n />\r\n </div>\r\n <div className=\"w-100\">\r\n <label>Media</label>\r\n <Select \r\n options={filteredMedias}\r\n classNamePrefix={`select`}\r\n onChange={onChangeSelectedMedia} \r\n value={filteredMedias.filter(m => selectedMedias.includes(m.value))}\r\n isClearable={true}\r\n isMulti={true}\r\n />\r\n </div>\r\n <div className=\"w-100\">\r\n <label>Content Types</label>\r\n <Select \r\n options={filteredContentTypes}\r\n classNamePrefix={`select`}\r\n onChange={onChangeSelectedContentType} \r\n value={filteredContentTypes.filter(m => selectedContentTypes.includes(m.value))}\r\n isClearable={true}\r\n isMulti={true}\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"d-flex justify-content-end pt-30 gap15\">\r\n <span>Total Playouts: {totalPlayouts}</span>\r\n <span>Total Duration: {totalDurationString}</span>\r\n </div>\r\n\r\n {reportPlayouts.length ? <><table className=\"table\">\r\n <thead>\r\n <tr>\r\n {renderTableTitles(sliceColumns)}\r\n <td>Playouts</td>\r\n <td>Duration</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderPlayoutRows(reportPlayoutsForDisplay, sliceColumns)}\r\n </tbody>\r\n </table>\r\n\r\n <Pagination activePage={currentPage} pagesCount={getPagesCount(reportPlayouts.length, itemsPerPage)} changePaginationPage={setCurrentPage} />\r\n </> : <p>No Data</p>}\r\n\r\n <RightModal title={`Add Preset`} show={isShowPresetModal} onRequestClose={hidePresetModal}>\r\n <FormRow> \r\n <FormInput \r\n errorMessage = {presetNameErrorMessage}\r\n id = \"preset_name\"\r\n isError = {isPresetNameError}\r\n title = \"Preset Name\"\r\n onChangeValue = {(v) => {setPresetName(v); setIsPresetNameError(false)}}\r\n value = {presetName}\r\n />\r\n </FormRow>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={createNewPreset}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hidePresetModal}/>\r\n </div>\r\n </RightModal> \r\n\r\n <RightModal title={`Daily Report Schedule`} show={isShowSheduledReportsModal} onRequestClose={()=>{setIsShowSheduledReportsModal(false)}}>\r\n <ReportSubscriptions />\r\n <div className=\"modal-btn-group\">\r\n <div></div>\r\n <Button color=\"gray\" label=\"Close\" onClick={()=>{setIsShowSheduledReportsModal(false)}}/>\r\n </div>\r\n </RightModal> \r\n\r\n <SmallModal show={isShowConfirmResetModal} onRequestClose={() => {setIsShowConfirmResetModal(false)}}> \r\n <p>Reset selected data</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={() => {setIsShowConfirmResetModal(false)}}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={resetReportDashboardData}/>\r\n </div>\r\n </SmallModal>\r\n\r\n <SmallModal show={isShowSmallModal} text=\"Your Request has been sent\" onRequestClose={() => setIsShowSmallModal(false)}> \r\n <Button color=\"green\" label=\"Ok\" onClick={() => setIsShowSmallModal(false)}/>\r\n </SmallModal>\r\n\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n )\r\n}\r\n\r\nexport default withRouter(ReportDashboard)","import { FC, useEffect, useState } from \"react\";\r\nimport { RouteComponentProps, withRouter } from \"react-router\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { Routes } from \"../../../constants/routes\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport \"./Report.css\"\r\nimport { ReportSubscriptionType, ReportSubscription, getReportSubscriptions, reportSubscribe, reportUnsubscribe } from \"../../../api/reportsApi\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport ReportDashboard from \"../../components/reportDashboard/ReportDashboard\";\r\n\r\nexport interface ReportsProps extends RouteComponentProps<any>\r\n{\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n\r\n\r\nconst Reports:FC<ReportsProps> = (props) => {\r\n let {logOut, toogleCollapse, isCollapsed} = props;\r\n\r\n return <InnerLayout \r\n activeTab=\"reports\" \r\n logOut={logOut} \r\n toogleCollapse={toogleCollapse} \r\n isCollapsed={isCollapsed}\r\n >\r\n <>\r\n <ReportDashboard {...props} />\r\n </> \r\n </InnerLayout>\r\n\r\n}\r\n\r\nexport default withRouter(Reports);","import React from \"react\";\r\nimport \"./descriptionList.css\"\r\n\r\ninterface DescriptionListProps {\r\n title: string,\r\n value: string | number | JSX.Element\r\n}\r\n \r\ninterface DescriptionListState {\r\n \r\n}\r\n \r\nclass DescriptionList extends React.Component<DescriptionListProps, DescriptionListState> {\r\n constructor(props:DescriptionListProps){\r\n super(props);\r\n }\r\n render() { \r\n return (\r\n <dl className=\"data-description\">\r\n <dt>{this.props.title}</dt>\r\n <dd>{this.props.value}</dd>\r\n </dl>\r\n );\r\n }\r\n}\r\n \r\nexport default DescriptionList;","import React from \"react\";\r\n\r\ninterface FormRangeProps {\r\n id: string,\r\n title: string,\r\n min: number,\r\n max: number,\r\n step: number,\r\n value: number,\r\n sign?: string,\r\n textPosition?: \"bottom\" | \"right\"\r\n changeValue: (value:number) => void\r\n onEndAcion?: () => void\r\n}\r\n \r\n\r\nclass FormRange extends React.Component<FormRangeProps> {\r\n constructor(props:FormRangeProps){\r\n super(props)\r\n\r\n }\r\n\r\n onChange(event:React.ChangeEvent<HTMLInputElement>){\r\n let currentValue = Number(event.target.value);\r\n this.props.changeValue(currentValue)\r\n }\r\n\r\n render() { \r\n const {sign = \"%\", textPosition = \"bottom\"} = this.props\r\n const percentage = Math.round(((this.props.value - this.props.min) / (this.props.max - this.props.min)) * 100);\r\n return (\r\n <>\r\n <label htmlFor={this.props.id}> {this.props.title}</label>\r\n <div className={`range-wrapper ${textPosition === \"right\" ? \"right-text\" : \"\"}`}>\r\n <div className=\"\">\r\n <input \r\n id={this.props.id}\r\n className=\"range-control\" \r\n type=\"range\" \r\n min={this.props.min} \r\n max={this.props.max} \r\n step={this.props.step} \r\n value={this.props.value}\r\n onChange={(event)=>{this.onChange(event)}}\r\n onMouseUp={this.props.onEndAcion}\r\n />\r\n <div className=\"progress\" style={{\"width\": `${percentage}%`}}></div>\r\n </div>\r\n <span>{this.props.value}{sign}</span>\r\n </div>\r\n \r\n </>\r\n );\r\n }\r\n}\r\n \r\nexport default FormRange;","import { ApiResponse, BaseCreateResponse, BaseInfo, BaseResponse, baseUrl, deleteWithAuth, EmptyRequest, getWithAuth, Guid, ListRespone, patchWithAuth, postWithAuth, postWithAuthWitoutParams } from \"./baseApi\"\r\nimport { ChannelStream, CreateChannelStreamRequest, EnableSlotRequest, ReorderItemPair, TimeSlotModel } from \"./channelsApi\"\r\nimport { MediaType } from \"./mediaApi\"\r\n\r\nexport type ScheduledPriorityList = {\r\n id: string\r\n name : string\r\n channels: BaseInfo[],\r\n status: ScheduledPriorityListStatus,\r\n}\r\n\r\nexport type ScheduledPriorityListStream = {\r\n id: Guid,\r\n name: string,\r\n startTime: string,\r\n endTime: string,\r\n isNestedListEnabled: boolean,\r\n showNestedListEachMinutes: number,\r\n isTriggeringSkin: boolean,\r\n nestedPlayListId: Guid,\r\n tvChannelId: Guid | null,\r\n tvChannelName: string,\r\n includeTagIds: BaseInfo[],\r\n excludeTagIds: BaseInfo[],\r\n useORRelationshipForIncludeTags: boolean,\r\n postRollPlaylistId: Guid,\r\n preRollPlaylistId: Guid,\r\n series: string,\r\n season: string,\r\n episode: string,\r\n iabCat: string,\r\n genre: string,\r\n rating: string,\r\n title: string,\r\n}\r\n\r\nexport type CreateScheduledPriorityListStreamRequest = {\r\n name: string,\r\n startTime: string,\r\n endTime: string,\r\n isNestedListEnabled: boolean,\r\n showNestedListEachMinutes: number,\r\n nestedPlayListId: Guid | null,\r\n tvChannelId: Guid | null,\r\n includeTagIds: Guid[],\r\n excludeTagIds: Guid[],\r\n useORRelationshipForIncludeTags: boolean,\r\n postRollPlaylistId: Guid | null,\r\n preRollPlaylistId: Guid | null,\r\n series: string,\r\n season: string,\r\n episode: string,\r\n iabCat: string,\r\n genre: string,\r\n rating: string,\r\n title: string,\r\n}\r\n\r\n\r\nexport type CreateScheduledPriorityListRequest = {\r\n name : string,\r\n channelIds: string[],\r\n}\r\n\r\nexport type UpdateScheduledPriorityListRequest = {\r\n id: Guid,\r\n name : string,\r\n channelIds: string[],\r\n}\r\n\r\nexport type ScheduledPriorityListMedia = {\r\n id: Guid,\r\n name: string,\r\n url: string,\r\n order: number,\r\n durationMs: number,\r\n type: MediaType,\r\n startTime: string,\r\n endTime: string,\r\n isTriggeringSkin: boolean,\r\n schedule: PriorityListMediaSchedule[]\r\n}\r\n\r\nexport type ScheduledPriorityListAddMediaRequest = {\r\n mediaIds: Guid[]\r\n}\r\n\r\nexport type ScheduledPriorityListReorderMedia = {\r\n reorderItems: ReorderItemPair[]\r\n}\r\n\r\nexport enum ScheduledPriorityListStatus {\r\n Active = 0,\r\n Inactive = 1\r\n}\r\n\r\n\r\nexport interface PriorityListMediaFlydatesRequest {\r\n startTime: string | null,\r\n endTime: string | null\r\n}\r\n\r\nexport interface PriorityListMediaFlytimeResponse extends PriorityListMediaFlydatesRequest {\r\n id: Guid\r\n}\r\n\r\nexport interface CreateNestedPlayListRequest {\r\n name: string,\r\n isUseRandomOrder: boolean\r\n}\r\n\r\nexport interface UpdateNestedPlayListRequest {\r\n name: string,\r\n isUseRandomOrder: boolean\r\n}\r\n\r\nexport interface NestedPlayList {\r\n id: Guid,\r\n name: string\r\n}\r\n\r\nexport interface PriorityListMediaSchedule {\r\n id: Guid,\r\n name: string,\r\n start: string,\r\n end: string,\r\n startTime: string,\r\n endTime: string\r\n}\r\n\r\nexport type PriorityListMediaScheduleRequest = Omit<PriorityListMediaSchedule, 'id'>\r\n\r\nexport type WeekDays = {\r\n monday: boolean,\r\n tuesday: boolean,\r\n wednesday: boolean,\r\n thursday: boolean,\r\n friday:boolean,\r\n saturday: boolean,\r\n sunday: boolean\r\n} \r\n\r\nexport type RecurrentPriorityListStream = {\r\n id: Guid,\r\n name: string,\r\n startDate: string,\r\n endDate: string | null,\r\n startTime: string,\r\n endTime: string,\r\n monday: boolean,\r\n tuesday: boolean,\r\n wednesday: boolean,\r\n thursday: boolean,\r\n friday: boolean,\r\n saturday: boolean,\r\n sunday: boolean,\r\n isNestedListEnabled: boolean,\r\n showNestedListEachMinutes: number,\r\n isTriggeringSkin: boolean,\r\n nestedPlayListId: Guid | null,\r\n tvChannelId: Guid | null,\r\n tvChannelName: string,\r\n includeTagIds: BaseInfo[],\r\n excludeTagIds: BaseInfo[],\r\n useORRelationshipForIncludeTags: boolean,\r\n postRollPlayListId: Guid,\r\n preRollPlayListId: Guid,\r\n series: string,\r\n season: string,\r\n episode: string,\r\n iabCat: string,\r\n genre: string,\r\n rating: string,\r\n title: string,\r\n}\r\n\r\nexport type CreateRecurrentPriorityListStreamRequest = {\r\n name: string,\r\n startDate: string,\r\n endDate: string | null,\r\n startTime: string,\r\n endTime: string,\r\n monday: boolean,\r\n tuesday: boolean,\r\n wednesday: boolean,\r\n thursday: boolean,\r\n friday: boolean,\r\n saturday: boolean,\r\n sunday: boolean,\r\n isNestedListEnabled: boolean,\r\n showNestedListEachMinutes: number,\r\n nestedPlayListId: Guid | null,\r\n tvChannelId: Guid | null,\r\n includeTagIds: Guid[],\r\n excludeTagIds: Guid[],\r\n useORRelationshipForIncludeTags: boolean,\r\n postRollPlayListId: Guid | null,\r\n preRollPlayListId: Guid | null,\r\n series: string,\r\n season: string,\r\n episode: string,\r\n iabCat: string,\r\n genre: string,\r\n rating: string,\r\n title: string,\r\n}\r\n\r\nexport const getScheduledPriorityLists = async() : Promise<ApiResponse<ListRespone<ScheduledPriorityList>>> => {\r\n return await getWithAuth<ListRespone<ScheduledPriorityList>>({url : `${baseUrl}scheduled-priority-list`});\r\n}\r\n\r\nexport const createScheduledPriorityList = async(request : CreateScheduledPriorityListRequest) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<CreateScheduledPriorityListRequest,BaseCreateResponse>(`${baseUrl}scheduled-priority-list`, request);\r\n}\r\n\r\nexport const updateScheduledPriorityList = async(request : UpdateScheduledPriorityListRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<UpdateScheduledPriorityListRequest,BaseResponse>(`${baseUrl}scheduled-priority-list`, request);\r\n}\r\n\r\nexport const getScheduledListTimeSlots = async (id: Guid) : Promise<ApiResponse<ListRespone<TimeSlotModel>>> => {\r\n return await getWithAuth<ListRespone<TimeSlotModel>>({url: `${baseUrl}scheduled-priority-list/${id}/timeslots`}); \r\n}\r\n\r\nexport const enableScheduledListTimeSlot = async (timeSlot: EnableSlotRequest, channelId: Guid) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<EnableSlotRequest, BaseCreateResponse>(`${baseUrl}scheduled-priority-list/${channelId}/timeslots`, timeSlot); \r\n}\r\n\r\nexport const removeScheduledListTimeSlots = async (id: Guid, timeSlotId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}scheduled-priority-list/${id}/timeslots`, timeSlotId); \r\n}\r\n\r\nexport const getScheduledPriorityListMedia = async (id: Guid) : Promise<ApiResponse<ListRespone<ScheduledPriorityListMedia>>> => {\r\n return await getWithAuth<ListRespone<ScheduledPriorityListMedia>>({url : `${baseUrl}scheduled-priority-list/${id}/media`});\r\n}\r\n\r\nexport const enableScheduledList = async(id: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuthWitoutParams<BaseResponse>(`${baseUrl}scheduled-priority-list/${id}/enable`);\r\n}\r\n\r\nexport const disableScheduledList = async(id: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuthWitoutParams<BaseResponse>(`${baseUrl}scheduled-priority-list/${id}/disable`);\r\n}\r\n\r\nexport const getScheduledListStreams = async (listId: Guid) : Promise<ApiResponse<ListRespone<ScheduledPriorityListStream>>> => {\r\n return await getWithAuth<ListRespone<ScheduledPriorityListStream>>({url: `${baseUrl}scheduled-priority-list/${listId}/streams`}); \r\n}\r\n\r\nexport const createScheduledListStream = async (request: CreateScheduledPriorityListStreamRequest, listId: Guid) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<CreateScheduledPriorityListStreamRequest, BaseCreateResponse>(`${baseUrl}scheduled-priority-list/${listId}/streams`, request); \r\n}\r\n\r\nexport const updateScheduledListStream = async (request: CreateScheduledPriorityListStreamRequest, streamId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<CreateScheduledPriorityListStreamRequest, BaseResponse>(`${baseUrl}scheduled-priority-list/streams/${streamId}`, request); \r\n}\r\n\r\nexport const deleteScheduledListStream = async (streamId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseCreateResponse>(`${baseUrl}scheduled-priority-list/streams`, streamId); \r\n}\r\n\r\nexport const deleteScheduledList = async (id: Guid) : Promise<ApiResponse<BaseResponse>> =>{\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}scheduled-priority-list`, id)\r\n}\r\n\r\nexport const enableSkinPriorityListMedia = async (priorityListId : Guid, nestedPlaylistId: Guid, mediaId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}scheduled-priority-list/${priorityListId}/nested-playlist/${nestedPlaylistId}/media/${mediaId}/enable-skin`, {}); \r\n}\r\n\r\nexport const disableSkinPriorityListMedia = async (priorityListId : Guid, nestedPlaylistId: Guid, mediaId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}scheduled-priority-list/${priorityListId}/nested-playlist/${nestedPlaylistId}/media/${mediaId}/disable-skin`, {}); \r\n}\r\n\r\nexport const enableSkinPriorityListStream = async (id: Guid, streamId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}scheduled-priority-list/${id}/streams/${streamId}/enable-skin`, {}); \r\n}\r\n\r\nexport const disableSkinPriorityListStream = async (id: Guid, streamId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}scheduled-priority-list/${id}/streams/${streamId}/disable-skin`, {}); \r\n}\r\n\r\n\r\n//ADD NESTED PLAYLIST\r\nexport const getScheduledPriorityNestedPlayLists = async(priorityListId: Guid) : Promise<ApiResponse<ListRespone<NestedPlayList>>> => {\r\n return await getWithAuth<ListRespone<NestedPlayList>>({url : `${baseUrl}scheduled-priority-list/${priorityListId}/nested-playlist`});\r\n}\r\n\r\nexport const createScheduledPriorityNestedPlayList = async(priorityListId : Guid, request : CreateNestedPlayListRequest) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<CreateNestedPlayListRequest,BaseCreateResponse>(`${baseUrl}scheduled-priority-list/${priorityListId}/nested-playlist`, request);\r\n}\r\n\r\nexport const updateScheduledPriorityNestedPlayList = async(priorityListId : Guid, nestedPlayListId: Guid, request : UpdateNestedPlayListRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<UpdateNestedPlayListRequest,BaseResponse>(`${baseUrl}scheduled-priority-list/${priorityListId}/nested-playlist/${nestedPlayListId}`, request);\r\n}\r\n\r\nexport const deleteScheduledPriorityNestedPlayList = async (priorityListId : Guid, nestedPlaylistId: Guid) : Promise<ApiResponse<BaseResponse>> =>{\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}scheduled-priority-list/${priorityListId}/nested-playlist`, nestedPlaylistId)\r\n}\r\n\r\nexport const getScheduledPriorityNestedPlayListMedias = async(priorityListId : Guid, nestedPlaylistId: Guid) : Promise<ApiResponse<ListRespone<ScheduledPriorityListMedia>>> => {\r\n return await getWithAuth<ListRespone<ScheduledPriorityListMedia>>({url : `${baseUrl}scheduled-priority-list/${priorityListId}/nested-playlist/${nestedPlaylistId}/media`});\r\n}\r\n\r\nexport const addMediaToScheduledPriorityNestedPlayList= async (priorityListId : Guid, nestedPlaylistId: Guid, request: ScheduledPriorityListAddMediaRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<ScheduledPriorityListAddMediaRequest, BaseResponse>(`${baseUrl}scheduled-priority-list/${priorityListId}/nested-playlist/${nestedPlaylistId}/media`, request); \r\n}\r\n\r\nexport const deleteScheduledPriorityNestedPlayListMedia = async (priorityListId : Guid, nestedPlaylistId: Guid, mediaId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}scheduled-priority-list/${priorityListId}/nested-playlist/${nestedPlaylistId}/media`, mediaId); \r\n}\r\n\r\nexport const reorderScheduledPriorityNestedPlayListMedia = async (priorityListId : Guid, nestedPlaylistId: Guid, request: ScheduledPriorityListReorderMedia) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<ScheduledPriorityListReorderMedia, BaseResponse>(`${baseUrl}scheduled-priority-list/${priorityListId}/nested-playlist/${nestedPlaylistId}/media/reorder`, request); \r\n}\r\n\r\nexport const getPriorityListMediaSchedule = async (priorityListId : Guid, nestedPlaylistId: Guid, mediaId:Guid): Promise<ApiResponse<ListRespone<PriorityListMediaSchedule>>> => {\r\n return await getWithAuth<ListRespone<PriorityListMediaSchedule>>({url :`${baseUrl}scheduled-priority-list/${priorityListId}/nested-playlist/${nestedPlaylistId}/media/${mediaId}/schedule`});\r\n}\r\n\r\nexport const addPriorityListMediaSchedule = async (request: PriorityListMediaScheduleRequest, priorityListId : Guid, nestedPlaylistId: Guid, mediaId:Guid): Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<PriorityListMediaScheduleRequest,BaseCreateResponse>(`${baseUrl}scheduled-priority-list/${priorityListId}/nested-playlist/${nestedPlaylistId}/media/${mediaId}/schedule`, request);\r\n}\r\n\r\nexport const deletePriorityListMediaSchedule = async (priorityListId : Guid, nestedPlaylistId: Guid, mediaId:Guid, periodId: Guid): Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}scheduled-priority-list/${priorityListId}/nested-playlist/${nestedPlaylistId}/media/${mediaId}/schedule`, periodId);\r\n}\r\n\r\n//Reccurent Streams\r\nexport const getScheduledListRecurrentStreams = async (listId: Guid) : Promise<ApiResponse<ListRespone<RecurrentPriorityListStream>>> => {\r\n return await getWithAuth<ListRespone<RecurrentPriorityListStream>>({url: `${baseUrl}scheduled-priority-list/${listId}/recurrent-streams`}); \r\n}\r\n\r\nexport const createScheduledListRecurrentStream = async (request: CreateRecurrentPriorityListStreamRequest, listId: Guid) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<CreateRecurrentPriorityListStreamRequest, BaseCreateResponse>(`${baseUrl}scheduled-priority-list/${listId}/recurrent-streams`, request); \r\n}\r\n\r\nexport const updateScheduledListRecurrentStream = async (request: CreateRecurrentPriorityListStreamRequest, listId: Guid, streamId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<CreateRecurrentPriorityListStreamRequest, BaseResponse>(`${baseUrl}scheduled-priority-list/${listId}/recurrent-streams/${streamId}`, request); \r\n}\r\n\r\nexport const deleteScheduledListRecurrentStream = async ( listId: Guid, streamId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseCreateResponse>(`${baseUrl}scheduled-priority-list/${listId}/recurrent-streams`, streamId); \r\n}\r\n\r\nexport const enableSkinScheduledListRecurrentStream = async (id: Guid, streamId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}scheduled-priority-list/${id}/recurrent-streams/${streamId}/enable-skin`, {}); \r\n}\r\n\r\nexport const disableSkinScheduledListRecurrentStream = async (id: Guid, streamId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}scheduled-priority-list/${id}/recurrent-streams/${streamId}/disable-skin`, {}); \r\n}\r\n","import { ApiResponse, BaseCreateResponse, BaseResponse, baseUrl, deleteWithAuth, EmptyRequest, getWithAuth, Guid, ListRespone, patchWithAuth, postWithAuth } from \"./baseApi\";\r\n\r\n// TV channels\r\nexport interface TVChannel {\r\n id: Guid,\r\n name: string,\r\n domain: string,\r\n notMappedInProfiles: TVProfile[]\r\n}\r\n\r\nexport interface TVChannelRequest {\r\n name: string,\r\n domain: string,\r\n}\r\n\r\nexport interface TVProfile {\r\n id: Guid,\r\n name: string,\r\n isDefault: boolean\r\n}\r\n\r\nexport interface TVProfileRequest {\r\n name: string,\r\n}\r\n\r\nexport interface TVChannelMapping {\r\n id: Guid,\r\n name: string,\r\n irCommand: string\r\n}\r\n\r\nexport interface TVChannelMappingCreateRequest {\r\n tvChannelId: Guid,\r\n command: string\r\n}\r\n\r\nexport interface TVChannelMappingUpdateRequest {\r\n command: string\r\n}\r\n\r\nexport const getTVChannels = async() : Promise<ApiResponse<ListRespone<TVChannel>>> => {\r\n return await getWithAuth<ListRespone<TVChannel>>({url : `${baseUrl}tvchannels`});\r\n}\r\n\r\nexport const createTVChannel = async( request : TVChannelRequest) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<TVChannelRequest,BaseCreateResponse>(`${baseUrl}tvchannels`, request);\r\n}\r\n\r\nexport const updateTVChannel = async(id : Guid, request : TVChannelRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<TVChannelRequest,BaseResponse>(`${baseUrl}tvchannels/${id}`, request);\r\n}\r\n\r\nexport const deleteTVChannel = async (id : Guid) : Promise<ApiResponse<BaseResponse>> =>{\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}tvchannels`, id)\r\n}\r\n\r\n//TV Profiles\r\nexport const getTVProfiles = async() : Promise<ApiResponse<ListRespone<TVProfile>>> => {\r\n return await getWithAuth<ListRespone<TVProfile>>({url : `${baseUrl}tvchannels/profiles`});\r\n}\r\n\r\nexport const createTVProfile = async( request : TVProfileRequest) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<TVProfileRequest,BaseCreateResponse>(`${baseUrl}tvchannels/profiles`, request);\r\n}\r\n\r\nexport const updateTVProfile = async(id : Guid, request : TVProfileRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<TVProfileRequest,BaseResponse>(`${baseUrl}tvchannels/profiles/${id}`, request);\r\n}\r\n\r\nexport const deleteTVProfile = async (id : Guid) : Promise<ApiResponse<BaseResponse>> =>{\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}tvchannels/profiles`, id)\r\n}\r\n\r\nexport const cloneTVProfile = async (id: Guid,) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}tvchannels/profiles/${id}/clone`, {}); \r\n}\r\n\r\n//TV Channels Mapping\r\nexport const getTVChannelMappings = async(id: Guid) : Promise<ApiResponse<ListRespone<TVChannelMapping>>> => {\r\n return await getWithAuth<ListRespone<TVChannelMapping>>({url : `${baseUrl}tvchannels/profiles/${id}/mappings`});\r\n}\r\n\r\nexport const createTVChannelMapping = async(id:Guid, request : TVChannelMappingCreateRequest) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<TVChannelMappingCreateRequest,BaseCreateResponse>(`${baseUrl}tvchannels/profiles/${id}/mappings`, request);\r\n}\r\n\r\nexport const updateTVChannelMapping = async(profileId:Guid, id : Guid, request : TVChannelMappingUpdateRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<TVChannelMappingUpdateRequest,BaseResponse>(`${baseUrl}tvchannels/profiles/${profileId}/mappings/${id}`, request);\r\n}\r\n\r\nexport const deleteTVChannelMapping = async (profileId: Guid, id : Guid ) : Promise<ApiResponse<BaseResponse>> =>{\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}tvchannels/profiles/${profileId}/mappings`, id)\r\n}","import { FC, useEffect, useState } from 'react'\r\nimport { useParams } from 'react-router-dom';\r\nimport Select, { SingleValue } from 'react-select';\r\nimport { Guid } from '../../../api/baseApi';\r\nimport { getTVChannels, TVChannel } from '../../../api/tvChannelApi';\r\nimport { sortByNameString } from '../../../services/common';\r\nimport { Button } from '../Button';\r\nimport { FormInput, FormRow } from '../formRow/FormRow';\r\nimport GlobalSpinner from '../globalsSpinner/GlobalSpinner'\r\nimport IconButton from '../iconButton/IconButton';\r\nimport { RightModal, SmallModal } from '../sideModal/Modal';\r\nimport { TvChannelOverrideCreateRequest, TvChannelOverrideUpdateRequest, TvChannelOverrided, createTVChannelOverrride, deleteTVChannelOverride, getTVChannelOverrides, updateTVChannelOverride } from '../../../api/playersApi';\r\n\r\ntype ModalAction = \"create\" | \"edit\" | \"nothing\";\r\n\r\nconst TvChannelMappingOverrides:FC = () => {\r\n let [isLoading, setIsLoading] = useState(false);\r\n\r\n let [tvChannelsList, setTvChannelsList] = useState<TVChannel[]>([]);\r\n let [selectedTvChannel, setSelectedTvChannel] = useState<SingleValue<TVChannel>>(null);\r\n let [isSelectedTvChannelError, setIsSelectedTvChannelError] = useState(false);\r\n\r\n let [tvChannelOverridesList, setTvChannelOverridesList] = useState<TvChannelOverrided[]>([]);\r\n let [tvChannelOverrideIdForAction, setTvChannelOverrideIdForAction] = useState<Guid>('');\r\n let [modalAction, setModalAction] = useState<ModalAction>(\"nothing\");\r\n\r\n let [overrideValue, setOverriedValue] = useState(\"\");\r\n let [isOverrideValueError, setIsOverrideValueError] = useState(false);\r\n\r\n let [isShowDeleteTvChannelOverrideModal, setIsShowDeleteTvChannelOverrideModal] = useState(false);\r\n\r\n let {id : playerId} = useParams<{id:string}>();\r\n\r\n useEffect(()=>{\r\n async function fetchData() {\r\n setIsLoading(true);\r\n await Promise.all([updateTvChannelOverridedList(),updateTvChannelList()]);\r\n setIsLoading(false);\r\n }\r\n\r\n fetchData()\r\n },[]);\r\n\r\n const updateTvChannelOverridedList = async () => {\r\n let response = await getTVChannelOverrides(playerId);\r\n if( response.type === \"succes\") {\r\n setTvChannelOverridesList(response.data.items);\r\n }\r\n }\r\n\r\n const updateTvChannelList = async () => {\r\n let response = await getTVChannels();\r\n if( response.type === \"succes\") {\r\n setTvChannelsList(response.data.items);\r\n }\r\n }\r\n\r\n const overrideHandler = (channelNumber: string) => {\r\n setIsOverrideValueError(false);\r\n setOverriedValue(channelNumber)\r\n }\r\n\r\n const showTvChannelOverrideModal = (action: ModalAction, tvChannelOverride?: TvChannelOverrided) => {\r\n setModalAction(action);\r\n if(tvChannelOverride){\r\n setTvChannelOverrideIdForAction(tvChannelOverride.id)\r\n let t = tvChannelsList.find(it => it.id === tvChannelOverride.tvChannelId);\r\n setSelectedTvChannel(t ? t : null);\r\n setOverriedValue(tvChannelOverride.playerValue);\r\n }\r\n }\r\n\r\n const hideTvChannelOverrideModal = () => {\r\n setModalAction(\"nothing\");\r\n setIsOverrideValueError(false);\r\n setOverriedValue('');\r\n setIsSelectedTvChannelError(false);\r\n setSelectedTvChannel(null);\r\n }\r\n\r\n const createOrUpdateTvChannelMappingOverride = async () => {\r\n let isValid = true;\r\n if(!selectedTvChannel){\r\n setIsSelectedTvChannelError(true);\r\n isValid = false;\r\n }\r\n\r\n if(!overrideValue){\r\n setIsOverrideValueError(true);\r\n isValid = false;\r\n } \r\n \r\n if(!isValid) return;\r\n\r\n setIsLoading(true)\r\n if( modalAction === \"edit\" && selectedTvChannel ) {\r\n let request:TvChannelOverrideUpdateRequest = {\r\n command: overrideValue\r\n }\r\n await updateTVChannelOverride(playerId, tvChannelOverrideIdForAction, request)\r\n }\r\n\r\n if( modalAction === \"create\" && selectedTvChannel ) {\r\n let request:TvChannelOverrideCreateRequest = {\r\n tvChannelId: selectedTvChannel!.id,\r\n command: overrideValue\r\n }\r\n await createTVChannelOverrride( playerId, request)\r\n }\r\n\r\n hideTvChannelOverrideModal();\r\n await updateTvChannelOverridedList();\r\n setIsLoading(false);\r\n }\r\n\r\n const showDeleteTvChannelOverrideModal = (id:Guid) => {\r\n setIsShowDeleteTvChannelOverrideModal(true);\r\n setTvChannelOverrideIdForAction(id);\r\n }\r\n\r\n const hideDeleteTvChannelOverrrideModal = () => {\r\n setIsShowDeleteTvChannelOverrideModal(false);\r\n }\r\n\r\n const removeTvChannelOverride = async () => {\r\n setIsLoading(true);\r\n await deleteTVChannelOverride(playerId, tvChannelOverrideIdForAction);\r\n await updateTvChannelOverridedList();\r\n setIsShowDeleteTvChannelOverrideModal(false);\r\n setIsLoading(false);\r\n }\r\n\r\n const onSelectedTvChannel = (newValue: SingleValue<TVChannel>) => {\r\n setIsSelectedTvChannelError(false);\r\n setSelectedTvChannel(newValue);\r\n }\r\n\r\n const renderTvChannelOverrideList = ( items: TvChannelOverrided[]) => {\r\n return items.map( it => {\r\n return <tr key={it.tvChannelId}>\r\n <td>{it.tvChannelName}</td>\r\n <td>{it.originalValue}</td>\r\n <td>{it.playerValue}</td>\r\n <td>\r\n <IconButton tooltipText=\"Edit\" type=\"edit\" onClick={() => showTvChannelOverrideModal(\"edit\", it)} />\r\n <IconButton tooltipText=\"Delete\" type=\"delete\" onClick={() => showDeleteTvChannelOverrideModal(it.id)} />\r\n </td>\r\n </tr>\r\n })\r\n }\r\n\r\n return <>\r\n <div className=\"d-flex justify-content-between align-items-center mb-20 w-100\">\r\n <h2>TV Channel Mapping Overrides</h2>\r\n <Button \r\n color=\"green\" \r\n label=\"Add TV Channel Mapping Override\" \r\n onClick={() => showTvChannelOverrideModal(\"create\")} \r\n />\r\n </div>\r\n\r\n {tvChannelOverridesList.length ? <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>TV Channel Name</td>\r\n <td>Original Value</td>\r\n <td>Player Value</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderTvChannelOverrideList(tvChannelOverridesList)}\r\n </tbody>\r\n </table>: <p>Element list is empty</p>}\r\n\r\n <RightModal title={modalAction === \"edit\" ? \"Edit TV Channel Mapping Override\" : \"Add TV Channel Mapping Override\"} show={modalAction !== \"nothing\"} onRequestClose={hideTvChannelOverrideModal}>\r\n <FormRow>\r\n <label>TV Channel</label>\r\n <Select \r\n className={`${isSelectedTvChannelError ? \"error\" : \"\"}`}\r\n classNamePrefix={`select`}\r\n options={tvChannelsList.filter(it => !tvChannelOverridesList.some(it2 => it2.tvChannelId === it.id))} \r\n filterOption={(option, input)=> option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option) => `${option.id}`}\r\n onChange={onSelectedTvChannel}\r\n value={selectedTvChannel}\r\n isDisabled={modalAction === \"edit\"}\r\n /> \r\n </FormRow>\r\n\r\n <FormRow>\r\n <FormInput\r\n errorMessage = \"Please enter Override Value\"\r\n id = \"override_value_input\"\r\n isError = {isOverrideValueError}\r\n title = \"Override Value\"\r\n onChangeValue = {(e)=>{overrideHandler(e)}}\r\n value = {overrideValue}\r\n />\r\n </FormRow>\r\n\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={createOrUpdateTvChannelMappingOverride}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideTvChannelOverrideModal}/>\r\n </div>\r\n </RightModal> \r\n\r\n <SmallModal show={isShowDeleteTvChannelOverrideModal} onRequestClose={hideDeleteTvChannelOverrrideModal}> \r\n <p>That you want to delete TV Channel Mapping Override?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideDeleteTvChannelOverrrideModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={() => removeTvChannelOverride()}/>\r\n </div>\r\n </SmallModal>\r\n \r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n}\r\n\r\nexport default TvChannelMappingOverrides\r\n","import { ApiResponse, BaseCreateResponse, BaseResponse, Guid, ListRespone, baseUrl, deleteWithAuth, getWithAuth, patchWithAuth, postWithAuth } from \"./baseApi\";\r\n\r\nexport interface MediaTranscodingProfile {\r\n id: Guid,\r\n name: string,\r\n videoFrameRate: number | null,\r\n videoCodec: string | null,\r\n videoBitrateKb: number | null,\r\n videoHeight: number | null,\r\n videoWidth: number | null,\r\n audioCodec: string | null,\r\n audioBitrateKb: number | null,\r\n audioChannels: number | null,\r\n audioSampleRate: number | null,\r\n dynamicsRangeControlEnable: boolean,\r\n dynamicsRangeControlAmount: string | null,\r\n filterDynamicEqEnable: boolean,\r\n filterHighPassEnable: boolean,\r\n filterHighPassFrequency: number | null,\r\n filterHumEnable: boolean,\r\n loudnessEnable: boolean,\r\n loudnessTargetLevel: number | null,\r\n loudnessPeakLimit: number | null,\r\n musicReductionEnable: boolean,\r\n noiseReductionEnable: boolean,\r\n noiseReductionAmount: string | null,\r\n speechClickReductionEnable: boolean,\r\n speechClickReductionAmount: string | null,\r\n speechIsolationEnable: boolean,\r\n speechIsolationAmount: number | null,\r\n speechPlosiveReductionEnable: boolean,\r\n speechPlosiveReductionAmount: string | null,\r\n speechSibilanceReductionEnable: boolean,\r\n speechSibilanceReductionAmount: string | null,\r\n}\r\n\r\nexport type MediaTranscodingProfileRequest = Omit<MediaTranscodingProfile,\"id\">;\r\n\r\n\r\n\r\n// export type SelectOptionNumber = {\r\n// id: Guid,\r\n// value: number | \"Source\"\r\n// }\r\n\r\nexport const getTranscodingProfiles = async() : Promise<ApiResponse<ListRespone<MediaTranscodingProfile>>> => {\r\n return await getWithAuth<ListRespone<MediaTranscodingProfile>>({url : `${baseUrl}transcode-profiles`});\r\n}\r\n\r\nexport const createTranscodingProfile = async(request : MediaTranscodingProfileRequest) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<MediaTranscodingProfileRequest, BaseCreateResponse>(`${baseUrl}transcode-profiles`, request);\r\n}\r\n\r\nexport const updateTranscodingProfile = async(id: Guid, request : MediaTranscodingProfileRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<MediaTranscodingProfileRequest, BaseResponse>(`${baseUrl}transcode-profiles/${id}`, request);\r\n}\r\n\r\nexport const deleteTranscodingProfile = async (id: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}transcode-profiles`, id); \r\n}","import { FC, useEffect, useState } from 'react'\r\nimport { useParams } from 'react-router-dom';\r\nimport { Button } from '../Button';\r\nimport GlobalSpinner from '../globalsSpinner/GlobalSpinner'\r\nimport { RightModal, SmallModal } from '../sideModal/Modal';\r\nimport { Guid } from '../../../api/baseApi';\r\nimport { FormInput, FormRow, FormRowHorizontal, FormRowWithColumns } from '../formRow/FormRow';\r\nimport SvgSelector from '../svgSelector/SvgSelector';\r\nimport { WeekDays } from '../../../api/priorityListApi';\r\nimport FormRange from '../formRow/FormRange';\r\nimport FormCheckbox from '../formRow/FormCheckbox';\r\nimport IconButton from '../iconButton/IconButton';\r\nimport { formatDate, formatTimeOnly } from '../../../services/dateService';\r\nimport { VolumeProfile, VolumeProfileRequest, createVolumeProfile, deleteVolumeProfile, getVolumeProfiles, updateVolumeProfile } from '../../../api/playersApi';\r\n\r\ntype ModalAction = \"create\" | \"edit\" | \"nothing\";\r\n\r\nlet weekDaysStart: WeekDays = {\r\n monday: false,\r\n tuesday: false,\r\n wednesday: false,\r\n thursday: false,\r\n friday: false,\r\n saturday: false,\r\n sunday: false\r\n}\r\n\r\nconst VolumeProfiles:FC = () => {\r\n let [isLoading, setIsLoading] = useState(false);\r\n\r\n let [volumeProfiles, setVolumeProfiles] = useState<VolumeProfile[]>([]);\r\n\r\n let [modalAction, setModalAction] = useState<ModalAction>(\"nothing\");\r\n let [volumeProfileIdForAction, setVolumeProfileIdForAction] = useState<Guid>('');\r\n\r\n let [volumeProfileName, setVolumeProfileName] = useState<string>(\"\");\r\n let [isVolumeProfileError, setIsVolumeProfileNameError] = useState<boolean>(false);\r\n let [volumeProfileStartDate, setVolumeProfileStartDate] = useState('');\r\n let [isVolumeProfileStartDateError, setIsVolumeProfileStartDateError] = useState(false);\r\n let [volumeProfileEndDate, setVolumeProfileEndDate] = useState<string | null>('');\r\n let [isVolumeProfileEndDateError, setIsVolumeProfileEndDateError] = useState(false);\r\n let [volumeProfileStartTime, setVolumeProfileStartTime] = useState('');\r\n let [isVolumeProfileStartTimeError, setIsVolumeProfileStartTimeError] = useState(false);\r\n let [volumeProfileEndTime, setVolumeProfileEndTime] = useState('');\r\n let [isVolumeProfileEndTimeError, setIsVolumeProfileEndTimeError] = useState(false);\r\n\r\n\r\n let [volumeProfileWeekDays, setVolumeProfileWeekDays] = useState<WeekDays>(weekDaysStart);\r\n\r\n let [ volume, setVolume ] = useState<number>(0);\r\n\r\n let [ isUsePrioritization, setIsUsePrioritization ] = useState(false);\r\n\r\n let [isShowDeleteVolumeProfileModal, setIsShowDeleteVolumeProfileModal] = useState(false);\r\n\r\n let {id : playerId} = useParams<{id:string}>();\r\n\r\n useEffect(()=>{\r\n async function fetchData() {\r\n setIsLoading(true);\r\n await Promise.all([updateVolumeProfiles()]);\r\n setIsLoading(false);\r\n }\r\n\r\n fetchData()\r\n },[]);\r\n\r\n const updateVolumeProfiles = async () => {\r\n let response = await getVolumeProfiles(playerId);\r\n if( response.type === \"succes\") {\r\n setVolumeProfiles(response.data.items);\r\n }\r\n }\r\n\r\n const showVolumeModalModal = (action: ModalAction, volumeProfile?:VolumeProfile) => {\r\n setModalAction(action);\r\n if(volumeProfile){\r\n let volumeEndDate = !!volumeProfile.endDate ? volumeProfile.endDate.slice(0,10) : null\r\n setVolumeProfileIdForAction(volumeProfile.id);\r\n setVolumeProfileName(volumeProfile.name);\r\n setVolumeProfileStartDate(volumeProfile.startDate.slice(0,10));\r\n setVolumeProfileEndDate(volumeEndDate);\r\n setVolumeProfileStartTime(volumeProfile.startTime);\r\n setVolumeProfileEndTime(volumeProfile.endTime);\r\n setVolumeProfileWeekDays(\r\n {\r\n monday: volumeProfile.monday,\r\n tuesday: volumeProfile.tuesday,\r\n wednesday: volumeProfile.wednesday,\r\n thursday: volumeProfile.thursday,\r\n friday: volumeProfile.friday,\r\n saturday: volumeProfile.saturday,\r\n sunday: volumeProfile.sunday\r\n }\r\n );\r\n setVolume(volumeProfile.volume);\r\n setIsUsePrioritization(volumeProfile.isPriority);\r\n }\r\n }\r\n\r\n const hideVolumeModal = () => {\r\n setModalAction(\"nothing\");\r\n setVolumeProfileIdForAction(\"\");\r\n setVolumeProfileName(\"\");\r\n setIsVolumeProfileNameError(false)\r\n setVolumeProfileStartDate(\"\");\r\n setIsVolumeProfileStartDateError(false);\r\n setVolumeProfileEndDate(\"\");\r\n setIsVolumeProfileEndDateError(false);\r\n setVolumeProfileStartTime(\"\");\r\n setIsVolumeProfileStartTimeError(false)\r\n setVolumeProfileEndTime(\"\");\r\n setIsVolumeProfileEndTimeError(false);\r\n setVolumeProfileWeekDays(weekDaysStart);\r\n setVolume(0);\r\n setIsUsePrioritization(false);\r\n }\r\n\r\n const saveVolumeProfile = async () => {\r\n let isError = false;\r\n if(volumeProfileName === \"\"){\r\n setIsVolumeProfileNameError(true); isError = true;\r\n }\r\n\r\n if(volumeProfileStartDate === \"\"){\r\n setIsVolumeProfileStartDateError(true); isError = true;\r\n }\r\n\r\n if(volumeProfileStartTime === \"\"){\r\n setIsVolumeProfileStartTimeError(true); isError = true;\r\n }\r\n\r\n if(volumeProfileEndTime === \"\"){\r\n setIsVolumeProfileEndTimeError(true); isError = true;\r\n }\r\n\r\n if(new Date(!!volumeProfileEndDate ? volumeProfileEndDate : '') < new Date(volumeProfileStartDate)){\r\n setIsVolumeProfileEndDateError(true); isError = true;\r\n }\r\n \r\n if(isError) return;\r\n\r\n setIsLoading(true);\r\n let request : VolumeProfileRequest = {\r\n name: volumeProfileName,\r\n startDate: volumeProfileStartDate,\r\n endDate: volumeProfileEndDate,\r\n startTime: volumeProfileStartTime,\r\n endTime: volumeProfileEndTime,\r\n monday: volumeProfileWeekDays.monday,\r\n tuesday: volumeProfileWeekDays.tuesday,\r\n wednesday: volumeProfileWeekDays.wednesday,\r\n thursday: volumeProfileWeekDays.thursday,\r\n friday: volumeProfileWeekDays.friday,\r\n saturday: volumeProfileWeekDays.saturday,\r\n sunday: volumeProfileWeekDays.sunday,\r\n volume: volume,\r\n isPriority: isUsePrioritization,\r\n }\r\n\r\n if(!!!volumeProfileIdForAction){\r\n await createVolumeProfile(playerId, request)\r\n }\r\n else{\r\n await updateVolumeProfile(playerId, volumeProfileIdForAction, request);\r\n }\r\n\r\n await updateVolumeProfiles();\r\n hideVolumeModal();\r\n setIsLoading(false);\r\n }\r\n\r\n const renderWeekDaysInModal = (volumeProfileWeekDays: WeekDays) => {\r\n let d = [];\r\n for (let day in volumeProfileWeekDays) {\r\n d.push({\r\n day: day as keyof WeekDays,\r\n firstThreeChar: day.slice(0,3),\r\n isActive: volumeProfileWeekDays[`${day as keyof WeekDays}`]\r\n })\r\n }\r\n\r\n return d.map( (it,i) => {\r\n return <span key={i} className=\"week-days\" onClick={() => changeVolumeProfileDayActivity(it.day, it.isActive)}>\r\n <SvgSelector title={`${it.isActive ? 'ok' : 'cross'}`} />  {it.firstThreeChar}  \r\n </span>\r\n }) \r\n }\r\n\r\n const changeVolumeProfileDayActivity = (day: keyof WeekDays, isActive: boolean) => {\r\n switch(day){\r\n case \"monday\" : \r\n setVolumeProfileWeekDays({...volumeProfileWeekDays, monday: !isActive});\r\n break;\r\n case \"tuesday\" : \r\n setVolumeProfileWeekDays({...volumeProfileWeekDays, tuesday: !isActive});\r\n break;\r\n case \"wednesday\" : \r\n setVolumeProfileWeekDays({...volumeProfileWeekDays, wednesday: !isActive});\r\n break;\r\n case \"thursday\" : \r\n setVolumeProfileWeekDays({...volumeProfileWeekDays, thursday: !isActive});\r\n break;\r\n case \"friday\" : \r\n setVolumeProfileWeekDays({...volumeProfileWeekDays, friday: !isActive});\r\n break;\r\n case \"saturday\" : \r\n setVolumeProfileWeekDays({...volumeProfileWeekDays, saturday: !isActive});\r\n break;\r\n case \"sunday\" : \r\n setVolumeProfileWeekDays({...volumeProfileWeekDays, sunday: !isActive});\r\n break;\r\n }\r\n }\r\n\r\n const showDeleteVolumeProfileModal = (id: Guid) => {\r\n setIsShowDeleteVolumeProfileModal(true);\r\n setVolumeProfileIdForAction(id);\r\n }\r\n\r\n const hideDeleteVolumeProfileModal = () => {\r\n setIsShowDeleteVolumeProfileModal(false);\r\n setVolumeProfileIdForAction(\"\");\r\n }\r\n\r\n const removeVolumeProfile = async () => {\r\n setIsLoading(true);\r\n await deleteVolumeProfile(playerId, volumeProfileIdForAction);\r\n await updateVolumeProfiles();\r\n hideDeleteVolumeProfileModal()\r\n setIsLoading(false);\r\n }\r\n\r\n const renderVolumeProfile = (volumeProfile: VolumeProfile) => {\r\n return <tr key={volumeProfile.id}>\r\n <td>{volumeProfile.name}</td>\r\n <td>{formatDate(volumeProfile.startDate)}</td>\r\n <td>{!!volumeProfile.endDate && formatDate(volumeProfile.endDate)}</td>\r\n <td>{formatTimeOnly(volumeProfile.startTime)}</td>\r\n <td>{formatTimeOnly(volumeProfile.endTime)}</td>\r\n <td>\r\n <span className=\"table-week-days\">\r\n <span className=\"week-day\">\r\n <span>M</span>\r\n <span>{volumeProfile.monday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n <span className=\"week-day\">\r\n <span>T</span>\r\n <span>{volumeProfile.tuesday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n <span className=\"week-day\">\r\n <span>W</span>\r\n <span>{volumeProfile.wednesday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n <span className=\"week-day\">\r\n <span>Th</span>\r\n <span>{volumeProfile.thursday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n <span className=\"week-day\">\r\n <span>F</span>\r\n <span>{volumeProfile.friday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n <span className=\"week-day\">\r\n <span>S</span>\r\n <span>{volumeProfile.saturday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n <span className=\"week-day\">\r\n <span>Su</span>\r\n <span>{volumeProfile.sunday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n </span>\r\n </td>\r\n <td>\r\n {volumeProfile.volume}%\r\n </td>\r\n \r\n <td>\r\n\t\t\t\t\t\t<IconButton tooltipText=\"Delete\" type=\"delete\" onClick={() => {showDeleteVolumeProfileModal(volumeProfile.id)}} />\r\n <IconButton tooltipText=\"Edit\" type=\"edit\" onClick={() => {showVolumeModalModal('edit', volumeProfile)}} />\r\n </td>\r\n </tr>\r\n }\r\n\r\n\r\n return <>\r\n <div className=\"d-flex justify-content-between align-items-center mb-20 w-100\">\r\n <h2>Priority Profiles</h2>\r\n <Button \r\n color=\"green\" \r\n label=\"Add Volume Profile\" \r\n onClick={() => showVolumeModalModal(\"create\")} \r\n />\r\n </div> \r\n\r\n {volumeProfiles.length ? <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Name</td>\r\n <td>Start Date</td>\r\n <td>End Date</td>\r\n <td>Start Time</td>\r\n <td>End Time</td>\r\n <td>Days of Week</td>\r\n <td>Volume</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {volumeProfiles.filter(it => it.isPriority === true).map(renderVolumeProfile)}\r\n </tbody>\r\n </table> : <p>List of profiles is empty</p>}\r\n\r\n <div className=\"d-flex justify-content-between align-items-center pt-30 mb-20 w-100\">\r\n <h2>Repeat Profiles</h2>\r\n </div> \r\n\r\n {volumeProfiles.length ? <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Name</td>\r\n <td>Start Date</td>\r\n <td>End Date</td>\r\n <td>Start Time</td>\r\n <td>End Time</td>\r\n <td>Days of Week</td>\r\n <td>Volume</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {volumeProfiles.filter(it => it.isPriority === false).map(renderVolumeProfile)}\r\n </tbody>\r\n </table> : <p>List of profiles is empty</p>}\r\n\r\n <RightModal title={modalAction === \"edit\" ? \"Edit Volume Profile\" : \"Add Volume Profile\"} show={modalAction !== \"nothing\"} onRequestClose={hideVolumeModal}>\r\n \r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter name\"\r\n id = \"volume_profile_name_input\"\r\n isError = {isVolumeProfileError}\r\n title = \"Volume Profile Name\"\r\n onChangeValue = {(v) => {setVolumeProfileName(v); setIsVolumeProfileNameError(false)}}\r\n value = {volumeProfileName}\r\n />\r\n </FormRow>\r\n <FormRowWithColumns>\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"Please select Start Date\"\r\n id=\"r_stream_start_date\"\r\n isError={isVolumeProfileStartDateError}\r\n type=\"date\"\r\n onChangeValue={(v) => {setIsVolumeProfileStartDateError(false); setVolumeProfileStartDate(v)}}\r\n value={volumeProfileStartDate}\r\n title=\"Start Date\"\r\n /> \r\n </FormRow>\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"End Date should be later than Start Date\"\r\n id=\"r_stream_end_date\"\r\n isError={isVolumeProfileEndDateError}\r\n type=\"date\"\r\n onChangeValue={(v) => {\r\n setIsVolumeProfileEndDateError(false); \r\n setVolumeProfileEndDate(!!v ? v : null)\r\n }}\r\n value={!!volumeProfileEndDate ? volumeProfileEndDate : ''}\r\n title=\"End Date\"\r\n /> \r\n </FormRow>\r\n </FormRowWithColumns>\r\n <FormRowWithColumns>\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"Please select Start Time\"\r\n id=\"r_stream_start_time\"\r\n isError={isVolumeProfileStartTimeError}\r\n type=\"time\"\r\n onChangeValue={(v) => {setIsVolumeProfileStartTimeError(false); setVolumeProfileStartTime(v)}}\r\n value={volumeProfileStartTime}\r\n title=\"Start Time\"\r\n /> \r\n \r\n </FormRow>\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"Please select End Time\"\r\n id=\"r_stream_end_time\"\r\n isError={isVolumeProfileEndTimeError}\r\n type=\"time\"\r\n onChangeValue={(v) => {setIsVolumeProfileEndTimeError(false); setVolumeProfileEndTime(v)}}\r\n value={volumeProfileEndTime}\r\n title=\"End Time\"\r\n /> \r\n \r\n </FormRow>\r\n </FormRowWithColumns>\r\n <FormRowHorizontal>\r\n {renderWeekDaysInModal(volumeProfileWeekDays)}\r\n </FormRowHorizontal>\r\n\r\n <FormRow>\r\n <FormRange\r\n id=\"volume-range\"\r\n title=\"Volume Volume\"\r\n min={0}\r\n max={100}\r\n step={1}\r\n value={volume}\r\n changeValue={setVolume}\r\n />\r\n </FormRow>\r\n\r\n <FormRowHorizontal>\r\n <div className=\"status-container\">\r\n <span className=\"status-block\">\r\n {isUsePrioritization ? <span className=\"current-status online\">Use Prioritization</span> : <span className=\"current-status offline\">Use Prioritization</span>}\r\n </span>\r\n <FormCheckbox id=\"use-prioritization\" checked={isUsePrioritization} onChange={setIsUsePrioritization} />\r\n </div>\r\n </FormRowHorizontal>\r\n \r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={saveVolumeProfile}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideVolumeModal}/>\r\n </div>\r\n </RightModal> \r\n\r\n <SmallModal show={isShowDeleteVolumeProfileModal} onRequestClose={hideDeleteVolumeProfileModal}> \r\n <p>That you want to delete Volume Profile?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideDeleteVolumeProfileModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={removeVolumeProfile}/>\r\n </div>\r\n </SmallModal>\r\n\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n}\r\n\r\nexport default VolumeProfiles\r\n","import React from \"react\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport { DayOfWeek, TimeSlotModel } from \"../../../api/channelsApi\";\r\nimport { addLeadingZero } from \"../../../services/common\";\r\nimport SvgSelector from \"../svgSelector/SvgSelector\";\r\nimport \"./Schedule.css\"\r\nimport { PlayerScheduleOvviredeType, PlayerTimeSlotOverrideModel, PlayerTimeSlotOverrideRequest } from \"../../../api/playersApi\";\r\n\r\ninterface ScheduleProps {\r\n timeSlots: PlayerTimeSlotOverrideModel[],\r\n onTimeSlotClick: (timeSlot: PlayerTimeSlotOverrideRequest) => void;\r\n}\r\n \r\ninterface ScheduleState { \r\n}\r\n\r\n \r\nclass ScheduleOverride extends React.Component<ScheduleProps, ScheduleState> {\r\n constructor(props:ScheduleProps){\r\n super(props)\r\n }\r\n \r\n hours = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23];\r\n\r\n \r\n isSlotOverrideExist = (dayOfWeek : DayOfWeek, hour: number, minutes: number) => {\r\n const slot = this.props.timeSlots.find(\r\n timeSlot => timeSlot.dayOfWeek == dayOfWeek \r\n && timeSlot.hour == hour\r\n && timeSlot.minute == minutes);\r\n\r\n return slot;\r\n }\r\n\r\n renderScheduleRow = (hour : number) => {\r\n const daysOfWeek = [1, 2, 3, 4, 5, 6, 0]\r\n\r\n return <tr key={hour}>\r\n <td>{addLeadingZero(hour, 2)}:00</td>\r\n {daysOfWeek.map(it => this.renderScheduleIndicator(hour, it))} \r\n </tr>\r\n }\r\n\r\n renderScheduleIcon = (slot: PlayerTimeSlotOverrideModel | undefined) => {\r\n switch(slot?.type){\r\n case PlayerScheduleOvviredeType.Disabled :\r\n return <span className=\"active\"><SvgSelector title={\"cross\"} /></span>;\r\n case PlayerScheduleOvviredeType.Enabled : \r\n return <span className=\"active\"><SvgSelector title={\"ok\"} /></span>;\r\n case PlayerScheduleOvviredeType.EnabledInSite : \r\n return <SvgSelector title={\"ok\"} />;\r\n default : return <SvgSelector title={\"cross\"} />;\r\n }\r\n }\r\n\r\n renderScheduleIndicator = (hour: number, dayOfWeek: DayOfWeek) => {\r\n\r\n const firstHalfSlot = this.isSlotOverrideExist(dayOfWeek, hour, 0);\r\n const secondHafSlot = this.isSlotOverrideExist(dayOfWeek, hour, 30); \r\n\r\n return <td key={`${dayOfWeek}-${hour}`}>\r\n <div className=\"svg-block\">\r\n <div onClick={()=>this.props.onTimeSlotClick({dayOfWeek: dayOfWeek, hour: hour, minute: 0})}>\r\n {this.renderScheduleIcon(firstHalfSlot)}\r\n </div>\r\n <div onClick={()=>this.props.onTimeSlotClick({dayOfWeek: dayOfWeek, hour: hour, minute: 30})}>\r\n {this.renderScheduleIcon(secondHafSlot)}\r\n </div>\r\n </div>\r\n </td> \r\n }\r\n\r\n render() { \r\n return (\r\n <table className=\"table schedule-table\">\r\n <thead>\r\n <tr>\r\n <td></td>\r\n <td>Monday</td>\r\n <td>Tuesday</td>\r\n <td>Wednesday</td>\r\n <td>Thursday</td>\r\n <td>Friday</td>\r\n <td>Saturday</td>\r\n <td>Sunday</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {this.hours.map( it => this.renderScheduleRow(it))} \r\n </tbody>\r\n </table>\r\n );\r\n }\r\n}\r\n \r\n \r\nexport default ScheduleOverride;","import { FC, useEffect, useState } from 'react'\r\nimport GlobalSpinner from '../globalsSpinner/GlobalSpinner';\r\nimport { FormInputNumber, FormRowHorizontal } from '../formRow/FormRow';\r\nimport { Button } from '../Button';\r\nimport { AdvertisingInfo, getAdvertisingInfo, patchAdvertisingInfo } from '../../../api/playersApi';\r\nimport { useParams } from 'react-router-dom';\r\n\r\nconst Advertising:FC = () => {\r\n let [isLoading, setIsLoading] = useState(false)\r\n let [adSlotDuration, setAdSlotDuaration] = useState<number | ''>('')\r\n let [isAdSlotDuartionError, setIsAdSlotDurationError] = useState(false)\r\n let [maxDuration, setMaxDuration] = useState<number | ''>('')\r\n let [isMaxDurationError, setIsMaxDurationError] = useState(false)\r\n let [minDuration, setMinDuration] = useState<number | ''>('')\r\n let [isMinDurationError, setIsMinDurationError] = useState(false)\r\n\r\n let {id : playerId} = useParams<{id:string}>();\r\n\r\n useEffect(() => {\r\n async function fetchData(){\r\n setIsLoading(true);\r\n await updateAdvertisingInfo()\r\n setIsLoading(false);\r\n }\r\n\r\n fetchData()\r\n }, [])\r\n\r\n const isDurationValid = (value: number | '') => {\r\n if (value === '') return false;\r\n \r\n return value >= 0;\r\n };\r\n\r\n const updateAdvertisingInfo = async () => {\r\n let result = await getAdvertisingInfo(playerId)\r\n if (result.type == \"succes\") {\r\n setAdSlotDuaration(result.data.data.slotDuration);\r\n setMaxDuration(result.data.data.maxDuration);\r\n setMinDuration(result.data.data.minDuration);\r\n }\r\n }\r\n\r\n const saveAdvertisingInfo = async () => {\r\n let isValid = true;\r\n if(!isDurationValid(adSlotDuration)){\r\n setIsAdSlotDurationError(true);\r\n isValid = false;\r\n }\r\n if(!isDurationValid(maxDuration)){\r\n setIsMaxDurationError(true);\r\n isValid = false;\r\n }\r\n if(!isDurationValid(minDuration)){\r\n setIsMinDurationError(true);\r\n isValid = false;\r\n }\r\n\r\n if(!isValid) return;\r\n\r\n let request: AdvertisingInfo = {\r\n slotDuration: +adSlotDuration,\r\n maxDuration: +maxDuration,\r\n minDuration: +minDuration\r\n }\r\n\r\n\r\n setIsLoading(true)\r\n await patchAdvertisingInfo(playerId, request);\r\n await updateAdvertisingInfo()\r\n setIsLoading(false)\r\n }\r\n\r\n return <>\r\n <div className=\"advertising-block\" style={{width:500}}>\r\n <FormRowHorizontal>\r\n <FormInputNumber\r\n id=\"ad-slot-duration\"\r\n title=\"Ad Slot Duration (sec)\"\r\n isError={isAdSlotDuartionError}\r\n errorMessage=\"Please enter correct Ad Slot Duartion\"\r\n value={adSlotDuration}\r\n onChange={e => {\r\n setIsAdSlotDurationError(false)\r\n e.target.value === '' ? setAdSlotDuaration('') : setAdSlotDuaration(+e.target.value)\r\n }}\r\n />\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInputNumber\r\n id=\"max-duaration\"\r\n title=\"Max Duration (sec)\"\r\n isError={isMaxDurationError}\r\n errorMessage=\"Please enter correct max duaration\"\r\n value={maxDuration}\r\n onChange={e => {\r\n setIsMaxDurationError(false)\r\n e.target.value === '' ? setMaxDuration('') : setMaxDuration(+e.target.value)\r\n }}\r\n />\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInputNumber\r\n id=\"min-duaration\"\r\n title=\"Min Duration (sec)\"\r\n isError={isMinDurationError}\r\n errorMessage=\"Please enter correct min duaration\"\r\n value={minDuration}\r\n onChange={e => {\r\n setIsMinDurationError(false)\r\n e.target.value === '' ? setMinDuration('') : setMinDuration(+e.target.value)\r\n }}\r\n />\r\n </FormRowHorizontal>\r\n <div className=\"form-btn\">\r\n <Button color=\"green\" label=\"Save\" onClick={saveAdvertisingInfo} />\r\n </div>\r\n </div>\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n}\r\n\r\nexport default Advertising","import { FC, useEffect, useState } from 'react'\r\nimport GlobalSpinner from '../globalsSpinner/GlobalSpinner';\r\nimport { FormRowHorizontal } from '../formRow/FormRow';\r\nimport { Button } from '../Button';\r\nimport { PrivacyInfo, getPrivacyInfo, patchPrivacyInfo } from '../../../api/playersApi';\r\nimport { useParams } from 'react-router-dom';\r\nimport FormCheckbox from '../formRow/FormCheckbox';\r\n\r\nconst Privacy:FC = () => {\r\n let [isLoading, setIsLoading] = useState(false)\r\n\r\n let [isTracking, setIsTracking] = useState(false)\r\n let [isGDPR, setIsGDPR] = useState(false)\r\n\r\n let {id : playerId} = useParams<{id:string}>();\r\n\r\n useEffect(() => {\r\n async function fetchData(){\r\n setIsLoading(true);\r\n await updatePrivacyInfo()\r\n setIsLoading(false);\r\n }\r\n\r\n fetchData()\r\n }, [])\r\n\r\n const updatePrivacyInfo = async () => {\r\n let result = await getPrivacyInfo(playerId)\r\n if (result.type == \"succes\") {\r\n setIsTracking(result.data.data.tracking);\r\n setIsGDPR(result.data.data.gdpr);\r\n }\r\n }\r\n\r\n const savePrivacyInfo = async () => {\r\n\r\n let request: PrivacyInfo = {\r\n tracking: isTracking,\r\n gdpr: isGDPR,\r\n }\r\n\r\n setIsLoading(true)\r\n await patchPrivacyInfo(playerId, request);\r\n await updatePrivacyInfo()\r\n setIsLoading(false)\r\n }\r\n\r\n return <>\r\n <div className=\"privacy-block\" style={{width:500}}>\r\n <FormRowHorizontal>\r\n <label>Tracking</label>\r\n <div className=\"status-container\">\r\n <span className=\"status-block\">\r\n {isTracking ? <span className=\"current-status online\">Allow</span> : <span className=\"current-status offline\">Not allow</span>}\r\n </span>\r\n <FormCheckbox id=\"tracking\" checked={isTracking} onChange={setIsTracking} />\r\n </div>\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <label>GDPR</label>\r\n <div className=\"status-container\">\r\n <span className=\"status-block\">\r\n {isGDPR ? <span className=\"current-status online\">Apply</span> : <span className=\"current-status offline\">Not apply</span>}\r\n </span>\r\n <FormCheckbox id=\"gdpr\" checked={isGDPR} onChange={setIsGDPR} />\r\n </div>\r\n </FormRowHorizontal>\r\n \r\n <div className=\"form-btn\">\r\n <Button color=\"green\" label=\"Save\" onClick={savePrivacyInfo} />\r\n </div>\r\n </div>\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n}\r\n\r\nexport default Privacy","import { FC, useEffect, useState } from 'react'\r\nimport GlobalSpinner from '../globalsSpinner/GlobalSpinner';\r\nimport { FormInputNumber, FormRowHorizontal } from '../formRow/FormRow';\r\nimport { Button } from '../Button';\r\nimport { AdvertisingInfo, ReachTrackerInfo, getAdvertisingInfo, getReachTrackerInfo, patchAdvertisingInfo, patchReachTrackerInfo } from '../../../api/playersApi';\r\nimport { useParams } from 'react-router-dom';\r\n\r\nconst ReachTracker:FC = () => {\r\n let [isLoading, setIsLoading] = useState(false)\r\n let [monday, setMonday] = useState<number | ''>('')\r\n let [isMondayError, setIsMondayError] = useState(false)\r\n let [tuesday, setTuesday] = useState<number | ''>('')\r\n let [isTuesdayError, setIsTuesdayError] = useState(false)\r\n let [wednesday, setWednesday] = useState<number | ''>('')\r\n let [isWednesdayError, setIsWednesdayError] = useState(false)\r\n let [thursday, setThursday] = useState<number | ''>('')\r\n let [isThursdayError, setIsThursdayError] = useState(false)\r\n let [friday, setFriday] = useState<number | ''>('')\r\n let [isFridayError, setIsFridayError] = useState(false)\r\n let [saturday, setSaturday] = useState<number | ''>('')\r\n let [isSaturdayError, setIsSaturdayError] = useState(false)\r\n let [sunday, setSunday] = useState<number | ''>('')\r\n let [isSundayError, setIsSundayError] = useState(false)\r\n\r\n\r\n let {id : playerId} = useParams<{id:string}>();\r\n\r\n useEffect(() => {\r\n async function fetchData(){\r\n setIsLoading(true);\r\n await updateReachTrackerInfo()\r\n setIsLoading(false);\r\n }\r\n\r\n fetchData()\r\n }, [])\r\n\r\n const isDurationValid = (value: number | '') => {\r\n if (value === '') return false;\r\n \r\n return value >= 0;\r\n };\r\n\r\n const updateReachTrackerInfo = async () => {\r\n let result = await getReachTrackerInfo(playerId)\r\n if (result.type == \"succes\") {\r\n setMonday(result.data.data.monday)\r\n setTuesday(result.data.data.tuesday)\r\n setWednesday(result.data.data.wednesday)\r\n setThursday(result.data.data.thursday)\r\n setFriday(result.data.data.friday)\r\n setSaturday(result.data.data.saturday)\r\n setSunday(result.data.data.sunday)\r\n }\r\n }\r\n\r\n const saveReachTrackerInfo = async () => {\r\n let isValid = true;\r\n\r\n if(!isDurationValid(monday)){\r\n setIsMondayError(true);\r\n isValid = false;\r\n }\r\n if(!isDurationValid(tuesday)){\r\n setIsTuesdayError(true);\r\n isValid = false;\r\n }\r\n if(!isDurationValid(wednesday)){\r\n setIsWednesdayError(true);\r\n isValid = false;\r\n }\r\n if(!isDurationValid(thursday)){\r\n setIsThursdayError(true);\r\n isValid = false;\r\n }\r\n if(!isDurationValid(friday)){\r\n setIsFridayError(true);\r\n isValid = false;\r\n }\r\n if(!isDurationValid(saturday)){\r\n setIsSaturdayError(true);\r\n isValid = false;\r\n }\r\n if(!isDurationValid(sunday)){\r\n setIsSundayError(true);\r\n isValid = false;\r\n }\r\n\r\n if(!isValid) return;\r\n\r\n let request: ReachTrackerInfo = {\r\n monday: +monday,\r\n tuesday: +tuesday,\r\n wednesday: +wednesday,\r\n thursday: +thursday,\r\n friday: +friday,\r\n saturday: +saturday,\r\n sunday: +sunday\r\n }\r\n\r\n setIsLoading(true)\r\n await patchReachTrackerInfo(playerId, request);\r\n await updateReachTrackerInfo()\r\n setIsLoading(false)\r\n }\r\n\r\n return <>\r\n <div className=\"advertising-block\" style={{width:500}}>\r\n <FormRowHorizontal>\r\n <FormInputNumber\r\n id=\"monday-duration\"\r\n title=\"Monday Duration\"\r\n isError={isMondayError}\r\n errorMessage=\"Duration should be more than 0\"\r\n value={monday}\r\n onChange={e => {\r\n setIsMondayError(false)\r\n e.target.value === '' ? setMonday(0) : setMonday(+e.target.value)\r\n }}\r\n />\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInputNumber\r\n id=\"tuesday-duaration\"\r\n title=\"Tuesday Duration\"\r\n isError={isTuesdayError}\r\n errorMessage=\"Duration should be more than 0\"\r\n value={tuesday}\r\n onChange={e => {\r\n setIsTuesdayError(false)\r\n e.target.value === '' ? setTuesday(0) : setTuesday(+e.target.value)\r\n }}\r\n />\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInputNumber\r\n id=\"wednesday-duaration\"\r\n title=\"Wednesday Duration\"\r\n isError={isWednesdayError}\r\n errorMessage=\"Duration should be more than 0\"\r\n value={wednesday}\r\n onChange={e => {\r\n setIsWednesdayError(false)\r\n e.target.value === '' ? setWednesday(0) : setWednesday(+e.target.value)\r\n }}\r\n />\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInputNumber\r\n id=\"thursday-duaration\"\r\n title=\"Thursday Duration\"\r\n isError={isThursdayError}\r\n errorMessage=\"Duration should be more than 0\"\r\n value={thursday}\r\n onChange={e => {\r\n setIsThursdayError(false)\r\n e.target.value === '' ? setThursday(0) : setThursday(+e.target.value)\r\n }}\r\n />\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInputNumber\r\n id=\"friday-duaration\"\r\n title=\"Friday Duration\"\r\n isError={isFridayError}\r\n errorMessage=\"Duration should be more than 0\"\r\n value={friday}\r\n onChange={e => {\r\n setIsFridayError(false)\r\n e.target.value === '' ? setFriday(0) : setFriday(+e.target.value)\r\n }}\r\n />\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInputNumber\r\n id=\"saturday-duaration\"\r\n title=\"Saturday Duration\"\r\n isError={isSaturdayError}\r\n errorMessage=\"Duration should be more than 0\"\r\n value={saturday}\r\n onChange={e => {\r\n setIsSaturdayError(false)\r\n e.target.value === '' ? setSaturday(0) : setSaturday(+e.target.value)\r\n }}\r\n />\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInputNumber\r\n id=\"sunday-duaration\"\r\n title=\"Sunday Duration\"\r\n isError={isSaturdayError}\r\n errorMessage=\"Duration should be more than 0\"\r\n value={sunday}\r\n onChange={e => {\r\n setIsSundayError(false)\r\n e.target.value === '' ? setSunday(0) : setSunday(+e.target.value)\r\n }}\r\n />\r\n </FormRowHorizontal>\r\n <div className=\"form-btn\">\r\n <Button color=\"green\" label=\"Save\" onClick={saveReachTrackerInfo} />\r\n </div>\r\n </div>\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n}\r\n\r\nexport default ReachTracker","import { useEffect, useState } from \"react\"\r\nimport GlobalSpinner from \"../globalsSpinner/GlobalSpinner\";\r\nimport { OfflineModeToggleRequest, PlayNowOfflineList, getPlayNowOffline, offlineModeDisable, offlineModeEnable } from \"../../../api/playersApi\";\r\nimport { useParams } from \"react-router-dom\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\n\r\ninterface CheckedItems {\r\n [key: string]: boolean;\r\n}\r\n\r\nconst PlayNowOffline = () => {\r\n let [isLoading, setIsLoading] = useState(false);\r\n let [playNowOfflineList, setPlayNowOfflineList] = useState<PlayNowOfflineList[]>([]);\r\n let [checkedItems, setCheckedItems] = useState<CheckedItems>({});\r\n\r\n let {id : playerId} = useParams<{id:string}>();\r\n\r\n useEffect(()=>{\r\n async function fetchData(){\r\n setIsLoading(true);\r\n await Promise.all([updatePlayNowOfflineList()]);\r\n setIsLoading(false);\r\n }\r\n\r\n fetchData()\r\n },[])\r\n\r\n useEffect(() => {\r\n const initialCheckedItems: CheckedItems = {};\r\n playNowOfflineList.forEach(item => {\r\n initialCheckedItems[item.playNowId] = item.isEnabled;\r\n });\r\n setCheckedItems(initialCheckedItems);\r\n },[playNowOfflineList])\r\n\r\n\r\n const updatePlayNowOfflineList = async () => {\r\n let result = await getPlayNowOffline(playerId)\r\n if(result.type === \"succes\") {\r\n setPlayNowOfflineList(result.data.items)\r\n }\r\n }\r\n\r\n const handleCheckboxChange = async (id: Guid) => {\r\n\r\n let req: OfflineModeToggleRequest = {\r\n playNowId: id\r\n }\r\n\r\n setIsLoading(true)\r\n if(checkedItems[id]){\r\n await offlineModeDisable(playerId, req)\r\n } else {\r\n await offlineModeEnable(playerId, req)\r\n }\r\n\r\n setCheckedItems((prev) => ({\r\n ...prev,\r\n [id]: !prev[id],\r\n }));\r\n\r\n await updatePlayNowOfflineList()\r\n setIsLoading(false)\r\n };\r\n\r\n const renderPlayNowLogs = (items: PlayNowOfflineList[]) => {\r\n return items.map( item => {\r\n return <tr key={item.playNowId}>\r\n <td>{item.hotKey}</td>\r\n <td>{item.name}</td>\r\n <td>\r\n <label htmlFor={`offline-${item.playNowId}`} className=\"checkbox-control\">\r\n <input \r\n id={`offline-${item.playNowId}`} \r\n className=\"checkbox\" \r\n type=\"checkbox\" \r\n checked={checkedItems[item.playNowId]}\r\n onChange={() => handleCheckboxChange(item.playNowId)}\r\n />\r\n <span className=\"checkbox-bg\"></span>\r\n <span className=\"checkbox-cursor\"></span>\r\n </label>\r\n </td>\r\n </tr>\r\n })\r\n }\r\n\r\n return (\r\n <>\r\n <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Hotkey</td>\r\n <td>PlayNow Playlist</td>\r\n <td>Offline Mode Enabled</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderPlayNowLogs(playNowOfflineList)}\r\n </tbody>\r\n </table>\r\n\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n )\r\n}\r\n\r\nexport default PlayNowOffline","import { FunctionComponent, useEffect, useState, PureComponent } from \"react\";\r\nimport { useLocation, useParams } from \"react-router-dom\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport { TimeSlotModel, getBaseChannels } from \"../../../api/channelsApi\";\r\nimport { getMedia, getMediaPlayout, MediaModel, MediaPlayout, MediaPlayoutRequest, MediaType } from \"../../../api/mediaApi\";\r\nimport { addBackgroundImage, addBespokeImage, deleteDownloadTimeslot, deleteSkinTimeslot, DownloadTimeslotRequest, DownloadTimeslotResponse, forceIrCommand, getDownloadTimeslots, getMediaForPlayer, getPlayerAudioDevices, getPlayerConfiguration, getPlayerHealth, getPlayerLogs, getPlayerScheduleOverride, getPlayerTechProfile, getPlayerVideoDevices, getScreenshots, getSkinTimeslots, HealthStatisticEntry, PlayerDevice, PlayerLog, PlayerTimeSlotOverrideModel, PlayerTimeSlotOverrideRequest, postDownloadTimeslots, postPlayerScheduleOverride, postSkinTimeslots, restartPlayer, ScreenShot, SkinTimeslotRequest, SkinTimeslotResponse, takeScreenshot, UpdateConfigurationRequest, updateConfuguration, UpdatePlayerTechProfileRequest, updateTechProfile } from \"../../../api/playersApi\";\r\nimport { createTag, getTags } from \"../../../api/tagApi\";\r\nimport { converFromBytes, getYoutubeImageUrlById } from \"../../../services/common\";\r\nimport { areDatesEqual, convertUTCDateToLocalDateMMDDYY, currentDateString, currentDateTimeString, currentDateTimeStringLocale, dateTimeString, formatDate, formatTime, formatTimeOnly, getDateBefore, getDateBeforeLocale, getPastDateByDaysAgo } from \"../../../services/dateService\";\r\nimport { Button } from \"../../components/Button\";\r\nimport DescriptionList from \"../../components/descriptionList/descriptionList\";\r\nimport FormCheckbox from \"../../components/formRow/FormCheckbox\";\r\nimport FormMultiSelect from \"../../components/formRow/FormMultiSelect\";\r\nimport FormRange from \"../../components/formRow/FormRange\";\r\nimport { FormInput, FormInputNumber, FormInputTextarea, FormRow, FormRowHorizontal, FormSelect, SelectOption } from \"../../components/formRow/FormRow\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport IconButton from \"../../components/iconButton/IconButton\";\r\nimport SvgSelector from \"../../components/svgSelector/SvgSelector\";\r\nimport Tabs, { TabElement, TabNavigation, TabNavigationElement, TabsContainer } from \"../../components/tab/Tab\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, BarChart, Bar } from 'recharts';\r\nimport { CenterModal, SmallModal } from \"../../components/sideModal/Modal\";\r\nimport { getMosaicList } from \"../../../api/mosaicApi\";\r\nimport TvChannelMappingOverrides from \"../../components/tvChannelMapping/TvChannelMappingOverrides\";\r\nimport { currentUserHasPermission, Permission } from \"../../../api/authApi\";\r\nimport Select, { SingleValue } from \"react-select\";\r\nimport { TVProfile, getTVProfiles } from \"../../../api/tvChannelApi\";\r\nimport Pagination from \"../../components/pagination/Pagination\";\r\nimport { getPagesCount } from \"../../../services/paginator\";\r\nimport moment from \"moment\";\r\nimport { MediaTranscodingProfile, getTranscodingProfiles } from \"../../../api/mediaTranscodingApi\";\r\nimport VolumeProfiles from \"../../components/volumeProfiles/VolumeProfiles\";\r\nimport Schedule from \"../../components/schedule/Schedule\";\r\nimport ScheduleOverride from \"../../components/schedule/ScheduleOverride\";\r\nimport Advertising from \"../../components/advertising/Advertising\";\r\nimport Privacy from \"../../components/privacy/Privacy\";\r\nimport ReachTracker from \"../../components/reachTracker/ReachTracker\";\r\nimport PlayNowOffline from \"../../components/playNowOffline/playNowOffline\";\r\nimport { WeekDays } from \"../../../api/priorityListApi\";\r\n\r\n\r\ninterface PlayerDetailsParams{\r\n id: string;\r\n}\r\n\r\ninterface PlayerDetailsProps {\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n \r\ntype PlayerTab = \"techProfile\" | \r\n \"configuration\" | \r\n \"logs\" | \r\n \"health\" | \r\n \"screenshots\" | \r\n \"media\" | \r\n \"tvChannelOverrides\" | \r\n \"volumeProfiles\" | \r\n \"dayPartingOverride\" |\r\n \"advertising\" |\r\n \"privacy\" | \r\n \"reachTracker\" |\r\n \"playnowOffline\";\r\n\r\nlet weekDaysStart: WeekDays = {\r\n monday: false,\r\n tuesday: false,\r\n wednesday: false,\r\n thursday: false,\r\n friday: false,\r\n saturday: false,\r\n sunday: false\r\n}\r\n\r\nconst PlayerDetails: FunctionComponent<PlayerDetailsProps> = (props: PlayerDetailsProps) => {\r\n let [ activeTab, setActiveTab ] = useState<PlayerTab>(\"techProfile\");\r\n let [ playerStatus, setPlayerStatus ] = useState<boolean>(false);\r\n let [ newPlayerTag, setNewPlayerTag ] = useState<string>(\"\");\r\n let [ tags, setTags ] = useState<Guid[]>([]);\r\n let [ channelId, setChannelId ] = useState<Guid>(\"\");\r\n let [ tagsOptions, setTagsOptions ] = useState<SelectOption[]>([]);\r\n let [ сhannelOptions, setChannelOptions ] = useState<SelectOption[]>([]);\r\n let [ defaultImage, setDefaultImage ] = useState<string>(\"\");\r\n let [ volume, setVolume ] = useState<number>(0);\r\n let [ showSize, setShowSize] = useState<string>('');\r\n let [ showAspectRation, setShowAspectRatio] = useState<string>('');\r\n let [ isStreamEnabled, setIsStreamEnabled] = useState<boolean>(false);\r\n let [ skinId, setSkinId] = useState<Guid>(\"\");\r\n let [ skinOptions, setSkinOptions ] = useState<SelectOption[]>([]);\r\n let [ chromaFormat, setChromaFormat] = useState<string>('');\r\n\r\n let [ audioDelay, setAudioDelay] = useState<number | ''>(0);\r\n\r\n let [ playerName, setPlayerName] = useState<string>(\"\");\r\n let [ playerIP, setPlayerIP] = useState(\"\");\r\n let [ playerUserAgent, setPlayerUserAgent] = useState(\"\");\r\n let [ location, setLocation] = useState<string>(\"\");\r\n let [ postalCode, setPostalCode] = useState<string>(\"\");\r\n let [ clientNote, setClientNote] = useState<string>(\"\");\r\n let [ playerId, setPlayerId] = useState<string>(\"\");\r\n let [ horizontalResolution, setHorizontalResolution] = useState<number>(0);\r\n let [ verticalResolution, setVerticalResolution] = useState<number>(0);\r\n let [ totalDiskSpace, setTotalDiskSpace] = useState<number>(0);\r\n let [ availableDiskSpace, setAvailableDiskSpace] = useState<number>(0);\r\n let [ version, setVersion] = useState<string>(\"\");\r\n\r\n let [ playerLogs, setPlayerLogs] = useState<PlayerLog[]>([]);\r\n let [ currentPage, setCurrentPage] = useState<number>(1);\r\n let [ totalPages, setTotalPages] = useState<number>(0);\r\n\r\n let [ isLoading, setIsLoading] = useState(false); \r\n\r\n let { id } = useParams<PlayerDetailsParams>();\r\n\r\n let [spaceUsage, setSpaceUsage] = useState<HealthStatisticEntry[]>([]);\r\n let [totalSpace, setTotalSpace] = useState<number>(1);\r\n let [heartBeats, setHeartBeats] = useState<HealthStatisticEntry[]>([]);\r\n let [gpuUsage, setGpuUsage] = useState<HealthStatisticEntry[]>([]);\r\n let [cpuUsage, setCpuUsage] = useState<HealthStatisticEntry[]>([]);\r\n let [ram, setRam] = useState<HealthStatisticEntry[]>([]);\r\n let [totalRam, setTotalRam] = useState<number>(0);\r\n let [selectedStartDate, setSelectedStartDate] = useState<string>(getPastDateByDaysAgo(1,true));\r\n let [selectedEndDate, setSelectedEndDate] = useState<string>(getPastDateByDaysAgo(0,true));\r\n\r\n let [showScreenModal, setShowScreenModal] = useState<boolean>(false);\r\n let [screenshots, setScreenshots] = useState<ScreenShot[]>([]);\r\n let [screenshotFilterDate, setScreenshotFilterDate] = useState(moment(getPastDateByDaysAgo(0)));\r\n let [currentScreenShot, setCurrentScreenShot] = useState<ScreenShot>();\r\n\r\n let [playerMedia, setPlayerMedia] = useState<MediaModel[]>([]);\r\n let [playouts, setPlayouts] = useState<MediaPlayout[]>([]);\r\n let [currentPagePaginationMedia, setCurrentPagePaginationMedia] = useState(1);\r\n\r\n let [isShowScheduleModal, setIsShowScheduleModal] = useState(false);\r\n let [skinTimeslots, setSkinTimeslots] = useState<SkinTimeslotResponse[]>([]);\r\n let [isPeriodStartError, setIsPeriodStartError] = useState(false);\r\n let [isPeriodEndError, setIsPeriodEndError] = useState(false);\r\n let [periodStart, setPeriodStart] = useState('');\r\n let [periodEnd, setPeriodEnd] = useState('');\r\n let [periodName, setPeriodName] = useState('');\r\n let [isPeriodNameError, setIsPeriodNameError] = useState(false);\r\n\r\n let [videoDeviceList, setVideoDeviceList] = useState<PlayerDevice[]>([]);\r\n let [selectedVideoDevice, setSelectedVideoDevice] = useState<SingleValue<PlayerDevice>>();\r\n let [isVideoDeviceError, setIsVideoDeviceError] = useState(false);\r\n let [wrongVideoDevice, setWrongVideoDevice] = useState<string | null>('');\r\n let [audioDeviceList, setAudioDeviceList] = useState<PlayerDevice[]>([]);\r\n let [selectedAudioDevice, setSelectedAudioDevice] = useState<SingleValue<PlayerDevice>>();\r\n let [isAudioDeviceError, setIsAudioDeviceError] = useState(false);\r\n let [wrongAudioDevice, setWrongAudioDevice] = useState<string | null>('');\r\n\r\n let baseADevices = [{name: 'Default'},{name: 'None'}];\r\n let baseVDevices = [{name: 'Default'}];\r\n\r\n let [playerMappingProfileId, setPlayerMappingProfileId] = useState<Guid | null>(null);\r\n let [tvProfilesList, setTvProfilesList] = useState<TVProfile[]>([]);\r\n let [selectedTvProfile, setSelectedTvProfile] = useState<SingleValue<TVProfile>>(null);\r\n let [isSelectedTvProfileError, setIsSelectedTvProfileError] = useState(false);\r\n\r\n let [isShowRestartModal,setIsShowRestartModal] = useState(false);\r\n\r\n let [transcodingProfiles, setTranscodingProfiles] = useState<MediaTranscodingProfile[]>([]);\r\n let [selectedTranscodingProfile, setSelectedTranscodingProfile] = useState<SingleValue<MediaTranscodingProfile>>(null);\r\n let [currentTranscodingId, setCurrentTranscodingId] = useState<Guid | null>(null);\r\n\r\n let [useProxyServer, setUseProxyServer ] = useState(false);\r\n\r\n let [bespokeImage, setBespokeImage ] = useState(\"\");\r\n let [isBespokeImageEnabled, setIsBespokeImageEnabled] = useState(false);\r\n let [timeSlots, setTimeSlots] = useState<PlayerTimeSlotOverrideModel[]>([]);\r\n\r\n let [isDownloadTimeEnable, setIsDownloadTimeEnable] = useState(false);\r\n let [isShowDownloadTimeModal, setIsShowDownloadTimeModal] = useState(false);\r\n let [downloadTimeslots, setDownloadTimeslots] = useState<DownloadTimeslotResponse[]>([]);\r\n let [isDownloadStartDateError, setIsDownloadStartDateError] = useState(false);\r\n let [isDownloadEndDateError, setIsDownloadEndDateError] = useState(false);\r\n let [isDownloadStartTimeError, setIsDownloadStartTimeError] = useState(false);\r\n let [isDownloadEndTimeError, setIsDownloadEndTimeError] = useState(false);\r\n let [downloadStartDate, setDownloadStartDate] = useState('');\r\n let [downloadStartTime, setDownloadStartTime] = useState('');\r\n let [downloadEndDate, setDownloadEndDate] = useState('');\r\n let [downloadEndTime, setDownloadEndTime] = useState('');\r\n let [downloadName, setDownloadName] = useState('');\r\n let [isDownloadNameError, setIsDownloadNameError] = useState(false);\r\n let [downloadTimeWeekDays, setDownloadTimeWeekDays] = useState<WeekDays>(weekDaysStart);\r\n let [downloadTimeWeekDaysError, setDownloadTimeWeekDaysError] = useState(false);\r\n\r\n const pageLocation = useLocation<{startConfigure:boolean}>();\r\n\r\n useEffect(() => {\r\n async function fetchData() {\r\n setIsLoading(true);\r\n\r\n let getVideoDevicesPromise = getPlayerVideoDevices(id);\r\n let getAudioDevicesResult = getPlayerAudioDevices(id);\r\n let playerConfigurationResult = getPlayerConfiguration(id);\r\n\r\n await Promise.all([updateTVProfiles(), updateTags(), updateChannels(), updateMosaics(), getVideoDevicesPromise, getAudioDevicesResult, playerConfigurationResult, updateTranscodingProfiles(),]).then(\r\n (values) => {\r\n let videoDeviceResult = values[4];\r\n let audioDeviceResult = values[5];\r\n let configurationResult = values[6];\r\n\r\n let videoDevices: PlayerDevice[] = [];\r\n if(videoDeviceResult.type == \"succes\"){\r\n videoDevices = [...baseVDevices, ...videoDeviceResult.data.items];\r\n setVideoDeviceList(videoDevices);\r\n }\r\n \r\n let audioDevices: PlayerDevice[] = [];\r\n if(audioDeviceResult.type == \"succes\"){\r\n audioDevices = [...baseADevices, ...audioDeviceResult.data.items]\r\n setAudioDeviceList(audioDevices)\r\n }\r\n \r\n if(configurationResult.type == \"succes\"){\r\n\r\n let videoDeviceFromConfiguration = getDeviceObject(configurationResult.data.dshowVdev);\r\n if(!(videoDevices.some( it => it.name === videoDeviceFromConfiguration.name))){\r\n setIsVideoDeviceError(true);\r\n setWrongVideoDevice(configurationResult.data.dshowVdev);\r\n }\r\n\r\n let audioDeviceFromConfiguration = getDeviceObject(configurationResult.data.dshowAdev);\r\n if(!(audioDevices.some( it => it.name === audioDeviceFromConfiguration.name))){\r\n setIsAudioDeviceError(true);\r\n setWrongAudioDevice(configurationResult.data.dshowAdev);\r\n }\r\n\r\n setTags(configurationResult.data.tags);\r\n setPlayerStatus(configurationResult.data.isEnabled);\r\n setChannelId(configurationResult.data.channelId ?? undefined);\r\n setVolume(configurationResult.data.volume);\r\n setDefaultImage(configurationResult.data.defaultImageUrl);\r\n setShowSize(configurationResult.data.dshowSize);\r\n setShowAspectRatio(configurationResult.data.dshowAspectRatio);\r\n setIsStreamEnabled(configurationResult.data.isStreamEnabled);\r\n\r\n setSelectedVideoDevice(getDeviceObject(configurationResult.data.dshowVdev));\r\n setSelectedAudioDevice(getDeviceObject(configurationResult.data.dshowAdev));\r\n\r\n setAudioDelay(configurationResult.data.audioDelay);\r\n setChromaFormat(configurationResult.data.chromaFormat);\r\n setSkinId(configurationResult.data.skinId ?? skinId);\r\n\r\n setPlayerMappingProfileId(configurationResult.data.tvChannelMappingProfileId);\r\n setCurrentTranscodingId(configurationResult.data.transcodeProfileId);\r\n\r\n setUseProxyServer(configurationResult.data.useProxyServer);\r\n\r\n setBespokeImage(configurationResult.data.bespokeImageUrl);\r\n setIsBespokeImageEnabled(configurationResult.data.isBespokeImageEnabled);\r\n setIsDownloadTimeEnable(configurationResult.data.isDownloadScheduleEnabled);\r\n };\r\n }\r\n )\r\n\r\n setIsLoading(false);\r\n } \r\n \r\n fetchData();\r\n\r\n if(pageLocation.state && pageLocation.state.startConfigure){\r\n setActiveTab(\"configuration\")\r\n }\r\n }, []);\r\n\r\n useEffect(()=>{\r\n let t = tvProfilesList.find(it => it.id == playerMappingProfileId)\r\n let t2 = t ? t : null\r\n setSelectedTvProfile(t2)\r\n },[tvProfilesList,playerMappingProfileId])\r\n\r\n useEffect(()=>{\r\n let t = transcodingProfiles.find(it => it.id == currentTranscodingId)\r\n let t2 = t ? t : null\r\n setSelectedTranscodingProfile(t2)\r\n },[transcodingProfiles,currentTranscodingId])\r\n\r\n useEffect(()=>{\r\n playerMedia.length && fetchPlayouts();\r\n },[playerMedia])\r\n\r\n useEffect(() => {\r\n async function fetchPlayerLogs(){\r\n setIsLoading(true);\r\n var playerLogsResponse = await getPlayerLogs(id, 1);\r\n if(playerLogsResponse.type === \"succes\"){\r\n setPlayerLogs(playerLogsResponse.data.items);\r\n setCurrentPage(playerLogsResponse.data.page);\r\n setTotalPages(playerLogsResponse.data.totalPages);\r\n }\r\n setIsLoading(false);\r\n }\r\n\r\n if( activeTab == \"techProfile\"){\r\n fetchTechProfile();\r\n }\r\n \r\n if( activeTab == \"logs\"){\r\n fetchPlayerLogs();\r\n }\r\n if(activeTab == \"health\"){\r\n updatePlayerHealth();\r\n }\r\n if( activeTab == \"screenshots\"){\r\n fetchScreenshots(true);\r\n }\r\n\r\n if(activeTab == \"media\"){\r\n fetchMediaForPlayer();\r\n }\r\n\r\n if(activeTab == \"dayPartingOverride\"){\r\n fetchPlayerSchedule();\r\n }\r\n }, [activeTab])\r\n\r\n useEffect(()=>{\r\n setIsPeriodNameError(false)\r\n },[periodName])\r\n\r\n useEffect(()=>{\r\n setIsPeriodStartError(false);\r\n setIsPeriodEndError(false)\r\n },[periodStart, periodEnd])\r\n\r\n const updateTVProfiles = async () => {\r\n let getTvProfilesResult = await getTVProfiles();\r\n if( getTvProfilesResult.type === \"succes\") {\r\n setTvProfilesList(getTvProfilesResult.data.items);\r\n }\r\n }\r\n\r\n const updateTranscodingProfiles = async () => {\r\n let response = await getTranscodingProfiles();\r\n if( response.type === \"succes\") {\r\n setTranscodingProfiles(response.data.items);\r\n }\r\n }\r\n\r\n const updateTags = async () => {\r\n let getTagsResult = await getTags(); \r\n if(getTagsResult.type == \"succes\"){\r\n setTagsOptions(getTagsResult.data.items.map(it => { return {name: it.name, value: it.id}}));\r\n };\r\n }\r\n\r\n const updateChannels = async () => {\r\n let getChannelsResult = await getBaseChannels();\r\n if(getChannelsResult.type == \"succes\"){\r\n setChannelOptions(getChannelsResult.data.items.map(it => { return {name: it.name, value: it.id}}));\r\n }\r\n }\r\n\r\n const updateMosaics = async () => {\r\n let getSkinResult = await getMosaicList();\r\n if(getSkinResult.type == \"succes\"){\r\n setSkinOptions(getSkinResult.data.items.map( it => {return {name: `${it.name} (${it.columnsCount}x${it.rowsCount})`, value: it.id}}).sort((a,b) => a.name < b.name ? -1 : 1))\r\n }\r\n }\r\n\r\n const fetchTechProfile = async () => {\r\n setIsLoading(true);\r\n var playerTechProfileResult = await getPlayerTechProfile(id);\r\n if(playerTechProfileResult.type == \"succes\"){\r\n setPlayerName(playerTechProfileResult.data.playerName);\r\n setPlayerIP(playerTechProfileResult.data.ip);\r\n setPlayerUserAgent(playerTechProfileResult.data.userAgent);\r\n setLocation(playerTechProfileResult.data.location);\r\n setPostalCode(playerTechProfileResult.data.postalCode);\r\n setClientNote(playerTechProfileResult.data.clientNote ?? \"\");\r\n setPlayerId(playerTechProfileResult.data.playerId);\r\n setHorizontalResolution(playerTechProfileResult.data.horizontalResolution);\r\n setVerticalResolution(playerTechProfileResult.data.verticalResolution);\r\n setTotalDiskSpace(playerTechProfileResult.data.totalDiskSpace);\r\n setAvailableDiskSpace(playerTechProfileResult.data.availableDiskSpace);\r\n setVersion(playerTechProfileResult.data.version);\r\n }\r\n setIsLoading(false);\r\n }\r\n\r\n const updatePlayerHealth = async () => {\r\n setIsLoading(true)\r\n var end = dateTimeString(new Date(selectedEndDate));\r\n var start = dateTimeString(new Date(selectedStartDate));\r\n var result = await getPlayerHealth(id, start, end);\r\n if(result.type == \"succes\"){\r\n\r\n let spaceUsage = !result.data.data.spaceUsage ? [] : \r\n [...result.data.data.spaceUsage.map(it => ({value: it.value, dateTime: convertUTCDateToLocalDateMMDDYY(it.dateTime)}))];\r\n let heartbeats = !result.data.data.heartbeats ? [] : \r\n [...result.data.data.heartbeats.map(it => ({value: it.value, dateTime: convertUTCDateToLocalDateMMDDYY(it.dateTime)}))];\r\n let cpuUsage = !result.data.data.cpuUsage ? [] : \r\n [...result.data.data.cpuUsage.map(it => ({value: it.value, dateTime: convertUTCDateToLocalDateMMDDYY(it.dateTime)}))];\r\n let gpuUsage = !result.data.data.gpuUsage ? [] : \r\n [...result.data.data.gpuUsage.map(it => ({value: it.value, dateTime: convertUTCDateToLocalDateMMDDYY(it.dateTime)}))];\r\n let ram = !result.data.data.ram ? [] : \r\n [...result.data.data.ram.map(it => ({value: it.value, dateTime: convertUTCDateToLocalDateMMDDYY(it.dateTime)}))];\r\n\r\n setSpaceUsage(spaceUsage);\r\n setHeartBeats(heartbeats);\r\n setCpuUsage(cpuUsage);\r\n setGpuUsage(gpuUsage);\r\n setRam(ram);\r\n setTotalRam(result.data.data.totalRam);\r\n setTotalSpace(result.data.data.totalSpaceGB);\r\n }\r\n setIsLoading(false)\r\n }\r\n\r\n const fetchScreenshots = async (showLoader: boolean) => {\r\n showLoader && setIsLoading(true);\r\n let result = await getScreenshots(id);\r\n showLoader && setIsLoading(false)\r\n if(result.type === \"succes\") {\r\n if(result.data.items.length !== 0 && (screenshots.length === 0 || result.data.items[0].dateTime !== screenshots[0].dateTime)){\r\n setScreenshots(result.data.items);\r\n setScreenshotFilterDate(moment(getPastDateByDaysAgo(0)));\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n const fetchMediaForPlayer = async () => {\r\n setIsLoading(true);\r\n let result = await getMediaForPlayer(id);\r\n if(result.type === \"succes\") setPlayerMedia(result.data.items);\r\n setIsLoading(false);\r\n }\r\n\r\n const fetchPlayouts = async () => {\r\n let mediaIdsForPlayouts = playerMedia.map(it => it.id);\r\n let playoutRequest:MediaPlayoutRequest = {\r\n ids: mediaIdsForPlayouts,\r\n playerId: id\r\n }\r\n let playoutResponse = await getMediaPlayout(playoutRequest);\r\n if(playoutResponse.type === \"succes\") setPlayouts(playoutResponse.data.items);\r\n }\r\n\r\n const fetchPlayerSchedule = async () => {\r\n setIsLoading(true);\r\n let result = await getPlayerScheduleOverride(id);\r\n if(result.type === \"succes\") setTimeSlots(result.data.items)\r\n setIsLoading(false);\r\n }\r\n \r\n const checkActive = (tab: PlayerTab) => tab == activeTab;\r\n const addTag = (id: Guid)=> setTags([...tags, id]);\r\n const removeTag = (id: Guid) => setTags(tags.filter(it => it !== id));\r\n\r\n const createNewTag = async () => {\r\n setIsLoading(true);\r\n var createTagResult = await createTag({name: newPlayerTag});\r\n\r\n if(createTagResult.type == \"succes\"){\r\n setTagsOptions([...tagsOptions,{ name: newPlayerTag, value: createTagResult.data.id }]);\r\n setNewPlayerTag(\"\");\r\n } \r\n setIsLoading(false);\r\n }\r\n\r\n const onConfigurationUpdate = async () => {\r\n setIsLoading(true);\r\n let delay = audioDelay === '' ? 0 : audioDelay;\r\n var request: UpdateConfigurationRequest = { \r\n tags: tags,\r\n channelId: channelId === '' ? null : channelId,\r\n isEnabled: playerStatus,\r\n volume: volume,\r\n dshowSize: showSize,\r\n dshowAspectRatio: showAspectRation,\r\n isStreamEnabled: isStreamEnabled,\r\n dshowVdev: getDeviceName(selectedVideoDevice),\r\n dshowAdev: getDeviceName(selectedAudioDevice),\r\n audioDelay: delay,\r\n chromaFormat: chromaFormat,\r\n skinId: skinId === '' ? null : skinId,\r\n tvChannelMappingProfileId: selectedTvProfile ? selectedTvProfile.id : null,\r\n transcodeProfileId: selectedTranscodingProfile ? selectedTranscodingProfile.id : null,\r\n useProxyServer: useProxyServer,\r\n isBespokeImageEnabled: isBespokeImageEnabled,\r\n isDownloadScheduleEnabled: isDownloadTimeEnable\r\n };\r\n await updateConfuguration(id, request);\r\n setIsLoading(false);\r\n }\r\n\r\n const getDeviceName = (value : SingleValue<PlayerDevice> | undefined) => {\r\n if(value) {\r\n switch (value.name){\r\n case \"Default\" : return null;\r\n case \"None\" : return 'none'\r\n default: return value.name\r\n }\r\n } else return null\r\n }\r\n\r\n const getDeviceObject = (value : string | null) => {\r\n if(value) {\r\n switch (value){\r\n case \"none\" : return {name: \"None\"}\r\n default: return {name: value}\r\n }\r\n } else return {name: \"Default\"}\r\n }\r\n\r\n const onTechProfileUpdate = async () =>{\r\n setIsLoading(true);\r\n var request: UpdatePlayerTechProfileRequest = {\r\n playerName,\r\n ip: playerIP,\r\n userAgent: playerUserAgent,\r\n location,\r\n postalCode,\r\n clientNote,\r\n }\r\n await updateTechProfile(id, request);\r\n setIsLoading(false);\r\n }\r\n\r\n const onDefaultImageChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if(event.target.files){\r\n const formData = new FormData();\r\n formData.append(\"Image\", event.target.files[0] );\r\n formData.append(\"PlayerId\", id );\r\n var res = await addBackgroundImage(formData);\r\n };\r\n\r\n var playerConfigurationResult = await getPlayerConfiguration(id);\r\n if(playerConfigurationResult.type == \"succes\"){\r\n setDefaultImage(playerConfigurationResult.data.defaultImageUrl);\r\n };\r\n }\r\n\r\n const onBespokeImageChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if(event.target.files){\r\n const formData = new FormData();\r\n formData.append(\"Image\", event.target.files[0] );\r\n formData.append(\"PlayerId\", id );\r\n await addBespokeImage(formData);\r\n };\r\n\r\n var playerConfigurationResult = await getPlayerConfiguration(id);\r\n if(playerConfigurationResult.type == \"succes\"){\r\n setBespokeImage(playerConfigurationResult.data.bespokeImageUrl);\r\n };\r\n }\r\n\r\n const resetImage = async () => {\r\n const formData = new FormData();\r\n formData.append(\"PlayerId\", id );\r\n var res = await addBackgroundImage(formData);\r\n\r\n var playerConfigurationResult = await getPlayerConfiguration(id);\r\n if(playerConfigurationResult.type == \"succes\"){\r\n setDefaultImage(playerConfigurationResult.data.defaultImageUrl);\r\n };\r\n }\r\n\r\n const changeActivePage = async (currentActivePage: number) => {\r\n let newPlayerLogs = await getPlayerLogs(id, currentActivePage);\r\n if(newPlayerLogs.type === \"succes\"){\r\n setPlayerLogs(newPlayerLogs.data.items)\r\n }\r\n setCurrentPage(currentActivePage);\r\n }\r\n\r\n const renderScreenshots = (screenshot: ScreenShot, i: number) =>{\r\n return <div className=\"screen\" key={i}>\r\n <img className=\"screen-img\" src={screenshot.screensShotPreviewUrl} alt=\"\" onClick={()=>showScreenInModal(screenshot)} />\r\n <p className=\"screen-date\">{formatDate(screenshot.dateTime)} {formatTime(screenshot.dateTime)}</p>\r\n </div>\r\n }\r\n\r\n const showScreenInModal = (screenShot: ScreenShot) => {\r\n setShowScreenModal(true);\r\n setCurrentScreenShot(screenShot)\r\n }\r\n\r\n const hideScreenModal = () =>{\r\n setShowScreenModal(false);\r\n setCurrentScreenShot({dateTime: '', screenShotUrl: '', screensShotPreviewUrl: ''});\r\n }\r\n\r\n function sleep(ms: number) {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n }\r\n\r\n const takeScreenShotAction = async () => {\r\n setIsLoading(true);\r\n await takeScreenshot(id);\r\n for(let i = 0; i< 10; i++){\r\n await sleep(1000);\r\n var isUpdated = await fetchScreenshots(false);\r\n if(isUpdated) break;\r\n }\r\n setIsLoading(false);\r\n }\r\n\r\n const renderFilterDates = (days: number = 6) => {\r\n let links = [];\r\n for ( let i = 0; i < days; i++) links.push(i);\r\n return links.map((it, i) => {\r\n let date = moment(getPastDateByDaysAgo(it));\r\n let isActiveDate = areDatesEqual(date, screenshotFilterDate);\r\n if(i){\r\n return <span className={`filter-item ${isActiveDate && \"active\"}`} key={i} onClick={()=> setScreenshotFilterDate(date)}>{date.format(\"D/M/YYYY\")}</span>\r\n } else return <span className={`filter-item ${isActiveDate && \"active\"}`} key={i} onClick={()=> setScreenshotFilterDate(date)}>Today</span>\r\n })\r\n }\r\n\r\n const filterScreenshotsByDate = () => {\r\n let items = !!screenshotFilterDate ? screenshots.filter( it => areDatesEqual(screenshotFilterDate, moment(it.dateTime))) : screenshots;\r\n return items\r\n }\r\n\r\n const getScreenshotsToDisplay = () => {\r\n return filterScreenshotsByDate()\r\n }\r\n\r\n const renderMediaType = (media: MediaModel) => {\r\n switch(media.mediaType){\r\n case MediaType.Image : return `Image (${media.sizeMb}MB)`;\r\n case MediaType.Video : return `Video (${media.sizeMb}MB)`;\r\n case MediaType.VastUrl : return \"VAST Url\";\r\n case MediaType.Youtube : return \"Youtube\";\r\n case MediaType.YoutubeLive : return \"Youtube Live\";\r\n }\r\n }\r\n\r\n const renderMediaTypePreview = (media: MediaModel) => {\r\n switch(media.mediaType){\r\n case MediaType.Image : return <img className=\"media-img\" src={media.previewLink} alt=\"\" />;\r\n case MediaType.Video : return <img className=\"media-img\" src={media.previewLink} alt=\"\" />;\r\n case MediaType.VastUrl : return <SvgSelector title=\"url\" />;\r\n case MediaType.Youtube : return <img className=\"media-img\" src={media.previewLink} alt=\"\" />;\r\n case MediaType.YoutubeLive : return <img className=\"media-img\" src={media.previewLink} alt=\"\" />;\r\n }\r\n }\r\n\r\n const getCurrentPlayout = (id: Guid) => {\r\n let t = playouts.find(it => it.mediaId === id);\r\n if(!t){\r\n return 0\r\n }\r\n return t.count\r\n }\r\n\r\n const renderRow = (media: MediaModel, index:number) => {\r\n return <tr key={index}>\r\n <td>\r\n {renderMediaTypePreview(media)}\r\n </td>\r\n <td>\r\n <span>{media.name}</span>\r\n </td> \r\n <td>{media.transcodeProfile}</td> \r\n <td>\r\n {renderMediaType(media)}\r\n </td>\r\n <td>\r\n {formatDate(media.uploadTime)} {formatTime(media.uploadTime)}\r\n </td>\r\n <td>\r\n {playouts.length ? getCurrentPlayout(media.id) : \"Loading...\"}\r\n </td>\r\n </tr>\r\n }\r\n\r\n const playerMediaItemsPerPage = 10;\r\n const getMediaItemsToDisplay = () => {\r\n let startIndex = (currentPagePaginationMedia - 1)*playerMediaItemsPerPage;\r\n let finishIndex = startIndex + playerMediaItemsPerPage;\r\n return playerMedia.slice(startIndex, finishIndex) \r\n }\r\n\r\n const setStartDatePeriod = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setPeriodStart(event.target.value);\r\n setIsPeriodStartError(false);\r\n }\r\n\r\n const setEndDatePeriod = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setPeriodEnd(event.target.value);\r\n setIsPeriodEndError(false);\r\n }\r\n\r\n const saveTimeslot = async () => {\r\n let isError = false;\r\n if(periodName === '') {\r\n setIsPeriodNameError(true);\r\n isError = true\r\n }\r\n\r\n if(periodStart === ''){\r\n setIsPeriodStartError(true)\r\n isError = true\r\n }\r\n\r\n if(periodEnd === ''){\r\n setIsPeriodEndError(true)\r\n isError = true\r\n }\r\n\r\n if(new Date(periodEnd) <= new Date(periodStart)){\r\n setIsPeriodEndError(true);\r\n isError = true\r\n }\r\n if(isError) return\r\n\r\n let request:SkinTimeslotRequest = {\r\n name: periodName,\r\n start: periodStart,\r\n end: periodEnd \r\n }\r\n\r\n setIsLoading(true);\r\n let result = await postSkinTimeslots(request, id);\r\n if(result.type === \"succes\") {\r\n await updateSkinTimeslots();\r\n }\r\n setPeriodName('');\r\n setPeriodStart('');\r\n setPeriodEnd('');\r\n setIsLoading(false);\r\n }\r\n\r\n const removeTimeslot = async (slotId:Guid) => {\r\n setIsLoading(true)\r\n await deleteSkinTimeslot(id,slotId);\r\n await updateSkinTimeslots();\r\n setIsLoading(false);\r\n }\r\n\r\n const updateSkinTimeslots = async () => {\r\n let result = await getSkinTimeslots(id);\r\n if(result.type === \"succes\") {\r\n setSkinTimeslots(result.data.items.sort((a,b)=>{\r\n return new Date(a.start).getTime() - new Date(b.start).getTime()\r\n }))\r\n }\r\n }\r\n\r\n const openScheduleModal = async () => {\r\n setIsShowScheduleModal(true);\r\n setIsLoading(true);\r\n await updateSkinTimeslots();\r\n setIsLoading(false)\r\n }\r\n\r\n const closeScheduleModal = () => {\r\n setIsShowScheduleModal(false);\r\n setSkinTimeslots([]);\r\n }\r\n\r\n const onSelectedVideoDevice = (newValue: SingleValue<PlayerDevice>) => {\r\n setIsVideoDeviceError(false);\r\n setWrongVideoDevice('');\r\n setSelectedVideoDevice(newValue);\r\n }\r\n\r\n const onSelectedAudioDevice = (newValue: SingleValue<PlayerDevice>) => {\r\n setIsAudioDeviceError(false);\r\n setWrongAudioDevice('');\r\n setSelectedAudioDevice(newValue);\r\n }\r\n\r\n const onSelectedTvProfile = (newValue: SingleValue<TVProfile>) => {\r\n setIsSelectedTvProfileError(false);\r\n setSelectedTvProfile(newValue)\r\n }\r\n\r\n const onSelectedTranscodingProfile = (newValue: SingleValue<MediaTranscodingProfile>) => {\r\n setSelectedTranscodingProfile(newValue)\r\n }\r\n\r\n const renderTimeslotRow = (timeslots: SkinTimeslotResponse[]) => {\r\n return timeslots.map( it => {\r\n return <tr key={it.id}>\r\n <td>{it.name}</td>\r\n <td>{formatDate(it.start)} {formatTime(it.start)}</td>\r\n <td>{formatDate(it.end)} {formatTime(it.end)}</td>\r\n <td>\r\n <IconButton type=\"delete\" tooltipText=\"Delete\" onClick={()=>{removeTimeslot(it.id)}}/>\r\n </td>\r\n </tr>\r\n })\r\n }\r\n\r\n const hideRestartModal = () => {\r\n setIsShowRestartModal(false);\r\n }\r\n\r\n const restartPlayerByRequest = async () => {\r\n setIsLoading(true);\r\n await restartPlayer(id)\r\n setIsShowRestartModal(false);\r\n setIsLoading(false);\r\n }\r\n\r\n const forceCommandToPlayer = async () => {\r\n setIsLoading(true);\r\n await forceIrCommand(id);\r\n setIsLoading(false);\r\n }\r\n\r\n const timeSlotOverride = async (timeSlot:PlayerTimeSlotOverrideRequest) => {\r\n await postPlayerScheduleOverride(timeSlot, id)\r\n await fetchPlayerSchedule();\r\n }\r\n\r\n const updateDownloadTimeslots = async () => {\r\n let result = await getDownloadTimeslots(id);\r\n if(result.type === \"succes\") {\r\n setDownloadTimeslots(result.data.items.sort((a,b)=>{\r\n return new Date(a.startDate).getTime() - new Date(b.startDate).getTime()\r\n }))\r\n }\r\n }\r\n\r\n const openDownloadTimeModal = async () => {\r\n setIsShowDownloadTimeModal(true);\r\n setIsLoading(true);\r\n await updateDownloadTimeslots();\r\n setIsLoading(false)\r\n }\r\n\r\n const closeDownloadTimeModal = () => {\r\n setIsShowDownloadTimeModal(false);\r\n setIsDownloadNameError(false);\r\n setIsDownloadStartDateError(false);\r\n setIsDownloadEndDateError(false);\r\n setIsDownloadStartTimeError(false);\r\n setIsDownloadEndTimeError(false);\r\n setDownloadName('');\r\n setDownloadStartDate('');\r\n setDownloadEndDate('');\r\n setDownloadStartTime('');\r\n setDownloadEndTime('');\r\n setDownloadTimeWeekDays(weekDaysStart);\r\n setDownloadTimeWeekDaysError(false);\r\n setDownloadTimeslots([]);\r\n }\r\n\r\n const setDownloadStartDateFn = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setDownloadStartDate(event.target.value);\r\n setIsDownloadStartDateError(false);\r\n }\r\n\r\n const setDownloadEndDateFn = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setDownloadEndDate(event.target.value);\r\n setIsDownloadEndDateError(false);\r\n }\r\n\r\n const setDownloadStartTimeFn = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setDownloadStartTime(event.target.value);\r\n setIsDownloadStartTimeError(false);\r\n }\r\n\r\n const setDownloadEndTimeFn = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setDownloadEndTime(event.target.value);\r\n setIsDownloadEndTimeError(false);\r\n }\r\n\r\n const renderDownloadTimeslotRow = (timeslots: DownloadTimeslotResponse[]) => {\r\n return timeslots.map( it => {\r\n return <tr key={it.id}>\r\n <td>{it.name}</td>\r\n <td>{formatDate(it.startDate)} - {formatDate(it.endDate)}</td>\r\n <td>{formatTimeOnly(it.startTime)} - {formatTimeOnly(it.endTime)}</td>\r\n <td>\r\n <span className=\"table-week-days\">\r\n <span className=\"week-day\">\r\n <span>M</span>\r\n <span>{it.monday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n <span className=\"week-day\">\r\n <span>T</span>\r\n <span>{it.tuesday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n <span className=\"week-day\">\r\n <span>W</span>\r\n <span>{it.wednesday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n <span className=\"week-day\">\r\n <span>Th</span>\r\n <span>{it.thursday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n <span className=\"week-day\">\r\n <span>F</span>\r\n <span>{it.friday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n <span className=\"week-day\">\r\n <span>S</span>\r\n <span>{it.saturday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n <span className=\"week-day\">\r\n <span>Su</span>\r\n <span>{it.sunday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n </span>\r\n </td>\r\n <td>\r\n <IconButton type=\"delete\" tooltipPosition=\"left\" tooltipText=\"Delete\" onClick={()=>{removeDownloadTimeslot(it.id)}}/>\r\n </td>\r\n </tr>\r\n })\r\n }\r\n\r\n const removeDownloadTimeslot = async (slotId:Guid) => {\r\n setIsLoading(true)\r\n await deleteDownloadTimeslot(id,slotId);\r\n await updateDownloadTimeslots();\r\n setIsLoading(false);\r\n }\r\n\r\n const renderWeekDaysInModal = (downloadTimeDays: WeekDays) => {\r\n let d = [];\r\n for (let day in downloadTimeDays) {\r\n d.push({\r\n day: day as keyof WeekDays,\r\n firstThreeChar: day.slice(0,3),\r\n isActive: downloadTimeDays[`${day as keyof WeekDays}`]\r\n })\r\n }\r\n\r\n return d.map( (it,i) => {\r\n return <span key={i} className=\"week-days\" onClick={() => changeDownloadTimeDayActivity(it.day, it.isActive)}>\r\n <SvgSelector title={`${it.isActive ? 'ok' : 'cross'}`} />  {it.firstThreeChar}  \r\n </span>\r\n }) \r\n }\r\n\r\n const changeDownloadTimeDayActivity = (day: keyof WeekDays, isActive: boolean) => {\r\n switch(day){\r\n case \"monday\" : \r\n setDownloadTimeWeekDays({...downloadTimeWeekDays, monday: !isActive});\r\n break;\r\n case \"tuesday\" : \r\n setDownloadTimeWeekDays({...downloadTimeWeekDays, tuesday: !isActive});\r\n break;\r\n case \"wednesday\" : \r\n setDownloadTimeWeekDays({...downloadTimeWeekDays, wednesday: !isActive});\r\n break;\r\n case \"thursday\" : \r\n setDownloadTimeWeekDays({...downloadTimeWeekDays, thursday: !isActive});\r\n break;\r\n case \"friday\" : \r\n setDownloadTimeWeekDays({...downloadTimeWeekDays, friday: !isActive});\r\n break;\r\n case \"saturday\" : \r\n setDownloadTimeWeekDays({...downloadTimeWeekDays, saturday: !isActive});\r\n break;\r\n case \"sunday\" : \r\n setDownloadTimeWeekDays({...downloadTimeWeekDays, sunday: !isActive});\r\n break;\r\n }\r\n setDownloadTimeWeekDaysError(false)\r\n }\r\n\r\n const saveDownloadTimeslot = async () => {\r\n let isError = false;\r\n if(downloadName === '') {\r\n setIsDownloadNameError(true);\r\n isError = true\r\n }\r\n\r\n if(downloadStartDate === ''){\r\n setIsDownloadStartDateError(true)\r\n isError = true\r\n }\r\n\r\n if(downloadEndDate === ''){\r\n setIsDownloadEndDateError(true)\r\n isError = true\r\n }\r\n\r\n if(downloadStartTime === ''){\r\n setIsDownloadStartTimeError(true)\r\n isError = true\r\n }\r\n\r\n if(downloadEndTime === ''){\r\n setIsDownloadEndTimeError(true)\r\n isError = true\r\n }\r\n\r\n let isAnyDayChecked = Object.values(downloadTimeWeekDays).some(day => day === true)\r\n if(!isAnyDayChecked){\r\n setDownloadTimeWeekDaysError(true)\r\n isError = true\r\n }\r\n\r\n if(new Date(downloadEndDate) <= new Date(downloadStartDate)){\r\n setIsDownloadEndDateError(true);\r\n isError = true\r\n }\r\n\r\n if(isError) return\r\n\r\n let request:DownloadTimeslotRequest = {\r\n name: downloadName,\r\n startDate: downloadStartDate,\r\n endDate: downloadEndDate,\r\n startTime: downloadStartTime,\r\n endTime: downloadEndTime,\r\n ...downloadTimeWeekDays\r\n }\r\n\r\n setIsLoading(true);\r\n let result = await postDownloadTimeslots(request, id);\r\n if(result.type === \"succes\") {\r\n await updateDownloadTimeslots();\r\n }\r\n setDownloadName('');\r\n setDownloadStartDate('');\r\n setDownloadEndDate('');\r\n setDownloadStartTime('');\r\n setDownloadEndTime('');\r\n setDownloadTimeWeekDays(weekDaysStart);\r\n setIsLoading(false);\r\n }\r\n \r\n return ( <>\r\n <InnerLayout\r\n isCollapsed={props.isCollapsed}\r\n logOut={props.logOut}\r\n toogleCollapse={props.toogleCollapse}\r\n activeTab=\"players\">\r\n <>\r\n <div style={{ paddingTop: '30px' }}>\r\n <h2>Player Details</h2>\r\n </div>\r\n <Tabs>\r\n <TabNavigation>\r\n <TabNavigationElement title=\"Profile\" isActive={checkActive(\"techProfile\")} onClick={() => { setActiveTab(\"techProfile\") }} />\r\n <TabNavigationElement title=\"Configuration\" isActive={checkActive(\"configuration\")} onClick={() => { setActiveTab(\"configuration\") }} />\r\n <TabNavigationElement title=\"Logs\" isActive={checkActive(\"logs\")} onClick={() => { setActiveTab(\"logs\") }} />\r\n <TabNavigationElement title=\"Health\" isActive={checkActive(\"health\")} onClick={() => { setActiveTab(\"health\") }} />\r\n <TabNavigationElement title=\"Screenshots\" isActive={checkActive(\"screenshots\")} onClick={() => { setActiveTab(\"screenshots\") }} />\r\n <TabNavigationElement title=\"Media\" isActive={checkActive(\"media\")} onClick={() => { setActiveTab(\"media\") }} />\r\n <>\r\n {\r\n currentUserHasPermission(Permission.Settings) && <TabNavigationElement title=\"TV Channel Mapping Overrides\" isActive={checkActive(\"tvChannelOverrides\")} onClick={() => { setActiveTab(\"tvChannelOverrides\") }} />\r\n }\r\n </>\r\n <TabNavigationElement title=\"Volume Profiles\" isActive={checkActive(\"volumeProfiles\")} onClick={() => { setActiveTab(\"volumeProfiles\") }} />\r\n <TabNavigationElement title=\"Day Parting Override\" isActive={checkActive(\"dayPartingOverride\")} onClick={() => { setActiveTab(\"dayPartingOverride\") }} />\r\n <TabNavigationElement title=\"Advertising\" isActive={checkActive(\"advertising\")} onClick={() => { setActiveTab(\"advertising\") }} />\r\n <TabNavigationElement title=\"Privacy\" isActive={checkActive(\"privacy\")} onClick={() => { setActiveTab(\"privacy\") }} />\r\n <TabNavigationElement title=\"Reach Tracker\" isActive={checkActive(\"reachTracker\")} onClick={() => { setActiveTab(\"reachTracker\") }} />\r\n <TabNavigationElement title=\"PlayNow Offline\" isActive={checkActive(\"playnowOffline\")} onClick={() => { setActiveTab(\"playnowOffline\") }} />\r\n </TabNavigation>\r\n <TabsContainer>\r\n <TabElement isActive={checkActive(\"techProfile\")}>\r\n <div className=\"tech-profile-block\">\r\n <FormRowHorizontal>\r\n <label> </label>\r\n <div className=\"btn-group\">\r\n <Button color=\"green\" label=\"Restart Player\" onClick={()=>{setIsShowRestartModal(true)}} />\r\n \r\n <Button color=\"green\" label=\"Send IR Signal\" onClick={forceCommandToPlayer} />\r\n </div>\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInput\r\n id=\"player-name\"\r\n title=\"Player Name\"\r\n isError={false}\r\n errorMessage=\"Please enter player name\"\r\n value={playerName}\r\n onChange={e => setPlayerName(e.target.value)}\r\n />\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInput\r\n id=\"player-ip\"\r\n title=\"IP\"\r\n isError={false}\r\n errorMessage=\"Please enter player IP\"\r\n value={playerIP}\r\n onChange={e => setPlayerIP(e.target.value)}\r\n />\r\n\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInput\r\n id=\"player-user-agent\"\r\n title=\"User Agent\"\r\n isError={false}\r\n errorMessage=\"Please enter player user agent\"\r\n value={playerUserAgent}\r\n onChange={e => setPlayerUserAgent(e.target.value)}\r\n />\r\n\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInput\r\n id=\"location\"\r\n title=\"Location\"\r\n isError={false}\r\n errorMessage=\"Location invalid\"\r\n value={location}\r\n onChange={e => setLocation(e.target.value)}\r\n />\r\n\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInput\r\n id=\"postal-code\"\r\n title=\"Postal code\"\r\n isError={false}\r\n errorMessage=\"Please enter postal code\"\r\n value={postalCode}\r\n onChange={e => setPostalCode(e.target.value)}\r\n />\r\n\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInputTextarea\r\n id=\"client-note\"\r\n title=\"Note\"\r\n isError={false}\r\n errorMessage=\"Please enter Note\"\r\n value={clientNote}\r\n onChange={e => setClientNote(e.target.value)}\r\n />\r\n </FormRowHorizontal>\r\n\r\n <DescriptionList title=\"Player ID\" value={playerId} />\r\n <DescriptionList title=\"Horizontal Resolution\" value={horizontalResolution} />\r\n <DescriptionList title=\"Vertical Resolution\" value={verticalResolution} />\r\n <DescriptionList title=\"Total Disk Space\" value={`${Math.round(converFromBytes(totalDiskSpace, \"GB\") * 100) / 100} GB`} />\r\n <DescriptionList title=\"Avaliable Disk Space\" value={`${Math.round(converFromBytes(availableDiskSpace, \"GB\") * 100) / 100} GB`} />\r\n <DescriptionList title=\"Version\" value={version} />\r\n <div className=\"form-btn\">\r\n <Button color=\"green\" label=\"Save\" onClick={onTechProfileUpdate} />\r\n </div>\r\n </div>\r\n </TabElement>\r\n <TabElement isActive={checkActive(\"configuration\")}>\r\n <div className=\"update-player-block\">\r\n <FormRowHorizontal>\r\n <FormSelect\r\n id=\"channel-assigment\"\r\n title=\"Network Assignment\"\r\n selectedValue={channelId}\r\n isError={false}\r\n errorMessage=\"Error\"\r\n options={сhannelOptions}\r\n onChange={setChannelId}\r\n />\r\n </FormRowHorizontal>\r\n <div className=\"skin-schedule-pos\">\r\n <FormRowHorizontal>\r\n <FormSelect\r\n id=\"skin-assigment\"\r\n title=\"Skin\"\r\n selectedValue={skinId}\r\n isError={false}\r\n errorMessage=\"Error\"\r\n options={skinOptions}\r\n onChange={setSkinId}\r\n />\r\n </FormRowHorizontal>\r\n {skinId && <IconButton type=\"clock\" tooltipText=\"Schedule\" onClick={() => {openScheduleModal()}} />}\r\n </div>\r\n <FormRowHorizontal>\r\n <label>TV Profile</label>\r\n <Select \r\n className={`${isSelectedTvProfileError ? \"error\" : \"\"}`}\r\n classNamePrefix={`select`}\r\n options={tvProfilesList} \r\n filterOption={(option, input)=> option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option) => `${option.id}`}\r\n onChange={onSelectedTvProfile}\r\n value={selectedTvProfile}\r\n isClearable\r\n /> \r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <label>Transcode Profile</label>\r\n <Select \r\n className={`${isSelectedTvProfileError ? \"error\" : \"\"}`}\r\n classNamePrefix={`select`}\r\n options={transcodingProfiles} \r\n filterOption={(option, input)=> option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option) => `${option.id}`}\r\n onChange={onSelectedTranscodingProfile}\r\n value={selectedTranscodingProfile}\r\n isClearable\r\n /> \r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <label>Player Status</label>\r\n <div className=\"status-container\">\r\n <span className=\"status-block\">\r\n {playerStatus ? <span className=\"current-status online\">Enabled</span> : <span className=\"current-status offline\">Disabled</span>}\r\n </span>\r\n <FormCheckbox id=\"player-status\" checked={playerStatus} onChange={setPlayerStatus} />\r\n </div>\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <label>Use Proxy Server</label>\r\n <div className=\"status-container\">\r\n <span className=\"status-block\">\r\n {useProxyServer ? <span className=\"current-status online\">Enabled</span> : <span className=\"current-status offline\">Disabled</span>}\r\n </span>\r\n <FormCheckbox id=\"use-proxy-server\" checked={useProxyServer} onChange={setUseProxyServer} />\r\n </div>\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInput\r\n id=\"new-tag-name\"\r\n title=\"New Player Tag\"\r\n isError={false}\r\n errorMessage=\"Please enter player tag\"\r\n value={newPlayerTag}\r\n onChange={e => setNewPlayerTag(e.target.value)}\r\n />\r\n <label> </label>\r\n <div className=\"form-btn-group\" style={{ \"paddingTop\": \"30px\" }}>\r\n <Button color=\"green\" label=\"Add tag\" onClick={createNewTag} />\r\n </div>\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormMultiSelect\r\n id=\"player-tags-list\"\r\n title=\"Player Tags\"\r\n titleSelected=\"Selected Tags\"\r\n isError={false}\r\n errorMessage=\"Please select tag\"\r\n onAdd={addTag}\r\n onRemove={removeTag}\r\n options={tagsOptions}\r\n selectedOptions={tags}\r\n />\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <label htmlFor=\"\">Default image</label>\r\n <div className=\"avatar-container\">\r\n {defaultImage &&\r\n <div className=\"avatar\">\r\n <img className=\"avatar-img\" src={defaultImage} alt=\"\" />\r\n </div>}\r\n\r\n <div className=\"avatar-btn-group\">\r\n <IconButton tooltipText=\"Reset image\" type=\"refresh\" roundedButton={true} onClick={resetImage} />\r\n <span>\r\n <label htmlFor=\"upload\" className=\"icon_btn rounded\"> <SvgSelector title={\"plus\"} /></label>\r\n <input type={\"file\"} id=\"upload\" onChange={onDefaultImageChange} />\r\n </span>\r\n\r\n </div>\r\n </div>\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormRange\r\n id=\"volume-range\"\r\n title=\"Volume\"\r\n min={0}\r\n max={200}\r\n step={1}\r\n value={volume}\r\n changeValue={setVolume}\r\n />\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <label htmlFor=\"\">Holding Screen Image</label>\r\n <div className=\"avatar-container\">\r\n {bespokeImage &&\r\n <div className=\"avatar\">\r\n <img className=\"avatar-img\" src={bespokeImage} alt=\"\" />\r\n </div>}\r\n\r\n <div className=\"avatar-btn-group\">\r\n <span>\r\n <label htmlFor=\"upload_second\" className=\"icon_btn rounded\"> <SvgSelector title={\"plus\"} /></label>\r\n <input type={\"file\"} id=\"upload_second\" onChange={onBespokeImageChange} />\r\n </span>\r\n </div>\r\n </div>\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <label>Use Holding Image</label>\r\n <div className=\"status-container\">\r\n <span className=\"status-block\">\r\n {isBespokeImageEnabled ? <span className=\"current-status online\">Enable</span> : <span className=\"current-status offline\">Disable</span>}\r\n </span>\r\n <FormCheckbox id=\"toggle-temp-image-status\" checked={isBespokeImageEnabled} onChange={setIsBespokeImageEnabled} />\r\n </div>\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInput\r\n id=\"dshow-aspect-ratio\"\r\n title=\"Aspect Ratio\"\r\n isError={false}\r\n errorMessage=\"Please enter aspect ratio\"\r\n value={showAspectRation}\r\n onChange={e => setShowAspectRatio(e.target.value)}\r\n />\r\n </FormRowHorizontal>\r\n \r\n <FormRowHorizontal>\r\n <label>Stream</label>\r\n <div className=\"status-container\">\r\n <span className=\"status-block\">\r\n {isStreamEnabled ? <span className=\"current-status online\">Enable</span> : <span className=\"current-status offline\">Disable</span>}\r\n </span>\r\n <FormCheckbox id=\"stream-status\" checked={isStreamEnabled} onChange={setIsStreamEnabled} />\r\n </div>\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInput\r\n id=\"dshow-size\"\r\n title=\"Stream Dimension\"\r\n isError={false}\r\n errorMessage=\"Please enter show size\"\r\n value={showSize}\r\n onChange={e => setShowSize(e.target.value)}\r\n />\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <label>Stream Video Source</label>\r\n <div>\r\n <Select \r\n classNamePrefix={`select`}\r\n options={videoDeviceList} \r\n filterOption={(option, input)=> option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option) => `${option.name.trim().toLowerCase()}`}\r\n onChange={onSelectedVideoDevice}\r\n value={selectedVideoDevice}\r\n /> \r\n {isVideoDeviceError && <span className=\"error\">{`Device ${wrongVideoDevice} is not available`}</span>}\r\n </div>\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <label>Stream Audio Source</label>\r\n <div>\r\n <Select \r\n classNamePrefix={`select`}\r\n options={audioDeviceList} \r\n filterOption={(option, input)=> option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option) => `${option.name.trim().toLowerCase()}`}\r\n onChange={onSelectedAudioDevice}\r\n value={selectedAudioDevice}\r\n /> \r\n {isAudioDeviceError && <span className=\"error\">{`Device ${wrongAudioDevice} is not available`}</span>}\r\n </div>\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInputNumber\r\n id=\"audio-delay\"\r\n title=\"Audio Delay (ms)\"\r\n isError={false}\r\n errorMessage=\"Please enter audio delay\"\r\n value={audioDelay}\r\n onChange={e => {\r\n e.target.value === '' ? setAudioDelay('') : setAudioDelay(+e.target.value)\r\n }}\r\n />\r\n </FormRowHorizontal>\r\n <FormRowHorizontal>\r\n <FormInput\r\n id=\"chroma-format-input\"\r\n title=\"Chroma Format\"\r\n isError={false}\r\n errorMessage=\"Please enter ChromaFormat\"\r\n value={chromaFormat}\r\n onChange={e => setChromaFormat(e.target.value)}\r\n />\r\n </FormRowHorizontal> \r\n\r\n <FormRowHorizontal>\r\n <label>Media Download Schedule</label>\r\n <div className=\"status-container download-schedule-pos\">\r\n <FormCheckbox id=\"download-time\" checked={isDownloadTimeEnable} onChange={setIsDownloadTimeEnable} />\r\n {isDownloadTimeEnable ? <IconButton type=\"clock\" tooltipText=\"\" onClick={openDownloadTimeModal} /> : <span className=\"current-status offline\">Disable</span>}\r\n </div>\r\n </FormRowHorizontal> \r\n \r\n <div className=\"form-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={() => { }} />\r\n <Button color=\"green\" label=\"Update Player\" onClick={onConfigurationUpdate} />\r\n </div>\r\n </div>\r\n </TabElement>\r\n <TabElement isActive={checkActive(\"logs\")}>\r\n <>\r\n <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Event</td>\r\n <td>User</td>\r\n <td>Comment</td>\r\n <td>Date</td>\r\n <td>Time</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {playerLogs.map((it, i) => {\r\n return <tr key={i}>\r\n <td>{it.playerEvent}</td>\r\n <td>{it.user}</td>\r\n <td>{it.comment}</td>\r\n <td>{formatDate(it.dateTime)}</td>\r\n <td>{formatTime(it.dateTime)}</td>\r\n </tr>\r\n })}\r\n </tbody>\r\n </table>\r\n\r\n <Pagination activePage={currentPage} pagesCount={totalPages} changePaginationPage={changeActivePage} />\r\n </>\r\n\r\n </TabElement>\r\n <TabElement isActive={checkActive(\"health\")}>\r\n <div className=\"chart-container\">\r\n <div className=\"chart-legends\">\r\n <div className=\"filter-row\">\r\n <div className=\"filter-group\">\r\n\r\n <div className=\"generate-group\">\r\n <FormRow>\r\n <label>Start</label>\r\n <input className=\"form-control\" type=\"datetime-local\" onChange={(e) => { setSelectedStartDate(e.target.value)}} value={selectedStartDate} min={getPastDateByDaysAgo(30, true)} ></input>\r\n </FormRow>\r\n <FormRow>\r\n <label>End</label>\r\n <input className=\"form-control\" type=\"datetime-local\" onChange={(e) => { setSelectedEndDate(e.target.value)}} value={selectedEndDate} min={selectedStartDate}></input>\r\n </FormRow> \r\n <div className=\"\">\r\n <label style={{ \"marginBottom\": \"4px\", \"display\": \"block\" }} htmlFor=\"\"> </label>\r\n <Button color=\"green\" label=\"Update\" onClick={updatePlayerHealth} />\r\n </div> \r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"chart1\">\r\n <div className=\"chart-title\">Space Usage</div>\r\n <ResponsiveContainer width=\"100%\" height=\"100%\">\r\n <LineChart\r\n width={500}\r\n height={300}\r\n data={spaceUsage}\r\n margin={{\r\n top: 0,\r\n right: 0,\r\n left: 0,\r\n bottom: 0,\r\n }}\r\n >\r\n <CartesianGrid strokeDasharray=\"0 0\" />\r\n <XAxis dataKey=\"dateTime\" />\r\n <YAxis dataKey=\"value\" domain={[0, totalSpace]} />\r\n <Tooltip />\r\n <Legend />\r\n <Line type=\"monotone\" dataKey=\"value\" name=\"Used GB\" stroke=\"#8884d8\" />\r\n </LineChart>\r\n </ResponsiveContainer>\r\n </div>\r\n <div className=\"chart2\">\r\n <div className=\"chart-title\">CPU Usage</div>\r\n <ResponsiveContainer width=\"100%\" height=\"100%\">\r\n <LineChart\r\n width={500}\r\n height={300}\r\n data={cpuUsage}\r\n margin={{\r\n top: 0,\r\n right: 0,\r\n left: 0,\r\n bottom: 0,\r\n }}\r\n >\r\n <CartesianGrid strokeDasharray=\"0 0\" />\r\n <XAxis dataKey=\"dateTime\" />\r\n <YAxis dataKey=\"value\" domain={[0, 100]} />\r\n <Tooltip />\r\n <Legend />\r\n <Line type=\"monotone\" dataKey=\"value\" stroke=\"#8884d8\" name=\"CPU Usage\" />\r\n </LineChart>\r\n </ResponsiveContainer>\r\n </div>\r\n <div className=\"chart3\">\r\n <div className=\"chart-title\">GPU Usage</div>\r\n <ResponsiveContainer width=\"100%\" height=\"100%\">\r\n <LineChart\r\n width={500}\r\n height={300}\r\n data={gpuUsage}\r\n margin={{\r\n top: 0,\r\n right: 0,\r\n left: 0,\r\n bottom: 0,\r\n }}\r\n >\r\n <CartesianGrid strokeDasharray=\"0 0\" />\r\n <XAxis dataKey=\"dateTime\" />\r\n <YAxis dataKey=\"value\" domain={[0, 100]} />\r\n <Tooltip />\r\n <Legend />\r\n <Line type=\"monotone\" dataKey=\"value\" stroke=\"#8884d8\" name=\"GPU Usage\"/>\r\n </LineChart>\r\n </ResponsiveContainer>\r\n </div>\r\n <div className=\"chart4\">\r\n <div className=\"chart-title\">Heartbeat</div>\r\n <ResponsiveContainer>\r\n <BarChart\r\n width={500}\r\n height={300}\r\n data={heartBeats}\r\n margin={{\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0\r\n }}\r\n >\r\n <CartesianGrid />\r\n <XAxis dataKey=\"dateTime\" />\r\n <YAxis dataKey=\"value\" />\r\n <Tooltip />\r\n <Legend />\r\n <Bar dataKey=\"value\" fill=\"#ACE7A8\" name=\"Pings\"/>\r\n </BarChart>\r\n </ResponsiveContainer>\r\n </div>\r\n <div className=\"chart4\">\r\n <div className=\"chart-title\">RAM Usage</div>\r\n <ResponsiveContainer width=\"100%\" height=\"100%\">\r\n <LineChart\r\n width={500}\r\n height={300}\r\n data={ram}\r\n margin={{\r\n top: 0,\r\n right: 0,\r\n left: 0,\r\n bottom: 0,\r\n }}\r\n >\r\n <CartesianGrid strokeDasharray=\"0 0\" />\r\n <XAxis dataKey=\"dateTime\" />\r\n <YAxis dataKey=\"value\" domain={[0, totalRam]}/>\r\n <Tooltip />\r\n <Legend />\r\n <Line type=\"monotone\" dataKey=\"value\" stroke=\"#8884d8\" name=\"RAM Usage\"/>\r\n </LineChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n </div>\r\n </TabElement>\r\n <TabElement isActive={checkActive('screenshots')}>\r\n <>\r\n <div className=\"d-flex align-self-stretch justify-content-between gap15 mb-20\">\r\n <Button color=\"green\" label=\"Take Screenshot\" onClick={takeScreenShotAction} />\r\n <div className=\"d-flex gap5 align-items-center filter-date\">\r\n {renderFilterDates(6)}\r\n </div>\r\n </div>\r\n <div className=\"screenshots-block\">\r\n {getScreenshotsToDisplay().map(renderScreenshots)}\r\n </div>\r\n <CenterModal title={`${formatDate(currentScreenShot?.dateTime ?? \"\")} ${formatTime(currentScreenShot?.dateTime ?? \"\")}`} show={showScreenModal} onRequestClose={hideScreenModal}>\r\n {currentScreenShot && <div className=\"screen\">\r\n <img className=\"screen-img in-modal\" src={currentScreenShot.screenShotUrl} alt=\"\" />\r\n </div>}\r\n </CenterModal>\r\n </>\r\n </TabElement>\r\n <TabElement isActive={checkActive('media')}>\r\n <>\r\n <table className=\"table media-table\">\r\n <thead>\r\n <tr>\r\n <td></td>\r\n <td>File Name</td>\r\n <td>Transcode Profile</td>\r\n <td>Media Type</td>\r\n <td>Downloaded </td>\r\n <td>Playouts</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {!!playerMedia && getMediaItemsToDisplay().map((m, i) => renderRow(m, i)) }\r\n </tbody>\r\n </table> \r\n {!!playerMedia.length && <Pagination activePage={currentPagePaginationMedia} pagesCount={getPagesCount(playerMedia.length, playerMediaItemsPerPage)} changePaginationPage={setCurrentPagePaginationMedia} />}\r\n </>\r\n </TabElement>\r\n <TabElement isActive={checkActive('tvChannelOverrides')}>\r\n { checkActive('tvChannelOverrides') ? <TvChannelMappingOverrides /> : <></>}\r\n </TabElement>\r\n <TabElement isActive={checkActive('volumeProfiles')}>\r\n { checkActive('volumeProfiles') ? <VolumeProfiles /> : <></>}\r\n </TabElement>\r\n <TabElement isActive={checkActive('dayPartingOverride')}>\r\n { checkActive('dayPartingOverride') ? <ScheduleOverride timeSlots={timeSlots} onTimeSlotClick={timeSlotOverride}/> : <></>}\r\n </TabElement>\r\n <TabElement isActive={checkActive('advertising')}>\r\n { checkActive('advertising') ? <Advertising /> : <></>}\r\n </TabElement>\r\n <TabElement isActive={checkActive('privacy')}>\r\n { checkActive('privacy') ? <Privacy /> : <></>}\r\n </TabElement>\r\n <TabElement isActive={checkActive('reachTracker')}>\r\n { checkActive('reachTracker') ? <ReachTracker /> : <></>}\r\n </TabElement>\r\n <TabElement isActive={checkActive('playnowOffline')}>\r\n { checkActive('playnowOffline') ? <PlayNowOffline /> : <></>}\r\n </TabElement>\r\n <GlobalSpinner isShow={isLoading} />\r\n </TabsContainer>\r\n </Tabs>\r\n <CenterModal title=\"Skin Schedule\" show={isShowScheduleModal} onRequestClose={closeScheduleModal}>\r\n <div className=\"mosaic-period-wrapper\">\r\n <div className=\"mosaic-period-inputs\">\r\n <div>\r\n <FormInput \r\n errorMessage = \"Please enter name\"\r\n id = \"period_name\"\r\n isError = {isPeriodNameError}\r\n title = \"Name\"\r\n onChange = {(e)=>{setPeriodName(e.target.value)}}\r\n value = {periodName}\r\n />\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"start\">Start</label>\r\n <input \r\n type=\"datetime-local\" \r\n className={`form-control ${isPeriodStartError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"start\" \r\n onChange={setStartDatePeriod}\r\n value={periodStart}\r\n />\r\n {isPeriodStartError && <span className=\"error\">Please select start period</span>}\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"ends\">End</label>\r\n <input \r\n type=\"datetime-local\" \r\n className={`form-control ${isPeriodEndError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"ends\" \r\n onChange={setEndDatePeriod}\r\n value={periodEnd}\r\n min={periodStart}\r\n disabled={!!!periodStart}\r\n />\r\n {isPeriodEndError && <span className=\"error\">End period should be later than start period</span>}\r\n </div>\r\n <div className=\"\">\r\n <Button color=\"green\" label=\"Add\" onClick={()=>{saveTimeslot()}}/>\r\n </div>\r\n </div>\r\n <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Name</td>\r\n <td>Start</td>\r\n <td>End</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderTimeslotRow(skinTimeslots)}\r\n </tbody>\r\n </table>\r\n </div>\r\n </CenterModal>\r\n\r\n <CenterModal title=\"Media Download Schedule\" show={isShowDownloadTimeModal} onRequestClose={closeDownloadTimeModal}>\r\n <div className=\"downloadtime-wrapper\">\r\n <div className=\"downloadtime-inputs\">\r\n <div>\r\n <FormInput \r\n errorMessage = \"Please enter name\"\r\n id = \"download_name\"\r\n isError = {isDownloadNameError}\r\n title = \"Name\"\r\n onChange = {(e)=>{setDownloadName(e.target.value); setIsDownloadNameError(false)}}\r\n value = {downloadName}\r\n />\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"start\">Start Date</label>\r\n <input \r\n type=\"date\" \r\n className={`form-control ${isDownloadStartDateError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"download-start\" \r\n onChange={setDownloadStartDateFn}\r\n value={downloadStartDate}\r\n />\r\n {isDownloadStartDateError && <span className=\"error\">Please select start date</span>}\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"ends\">End Date</label>\r\n <input \r\n type=\"date\" \r\n className={`form-control ${isDownloadEndDateError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"download-ends\" \r\n onChange={setDownloadEndDateFn}\r\n value={downloadEndDate}\r\n min={downloadStartDate}\r\n disabled={!!!downloadStartDate}\r\n />\r\n {isDownloadEndDateError && <span className=\"error\">End date should be later than start date</span>}\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"start\">Start Time</label>\r\n <input \r\n type=\"time\" \r\n className={`form-control ${isDownloadStartTimeError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"download-start-time\" \r\n onChange={setDownloadStartTimeFn}\r\n value={downloadStartTime}\r\n />\r\n {isDownloadStartTimeError && <span className=\"error\">Please select start time</span>}\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"ends\">End Time</label>\r\n <input \r\n type=\"time\" \r\n className={`form-control ${isDownloadEndTimeError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"download-ends-time\" \r\n onChange={setDownloadEndTimeFn}\r\n value={downloadEndTime}\r\n min={downloadStartTime}\r\n disabled={!!!downloadStartTime}\r\n />\r\n {isDownloadEndTimeError && <span className=\"error\">Please select end time</span>}\r\n </div>\r\n <div className=\"downloadtime-weekdays-row\">\r\n <div className=\"d-flex\">\r\n {renderWeekDaysInModal(downloadTimeWeekDays)}\r\n </div>\r\n {downloadTimeWeekDaysError && <span className=\"error\">Select at least one Day of the Week</span>}\r\n </div>\r\n <div className=\"\">\r\n <Button color=\"green\" label=\"Add\" onClick={saveDownloadTimeslot}/>\r\n </div>\r\n </div>\r\n {downloadTimeslots.length ? <table className=\"table pt-30\">\r\n <thead>\r\n <tr>\r\n <td>Name</td>\r\n <td>Date</td>\r\n <td>Time</td>\r\n <td>Days of week</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderDownloadTimeslotRow(downloadTimeslots)}\r\n </tbody>\r\n </table> : <></>}\r\n </div>\r\n </CenterModal>\r\n\r\n <SmallModal show={isShowRestartModal} onRequestClose={hideRestartModal}> \r\n <p>That you want to Restart Player?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideRestartModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={() => {restartPlayerByRequest()}}/>\r\n </div>\r\n </SmallModal>\r\n </>\r\n </InnerLayout>\r\n </> );\r\n}\r\n \r\nexport default PlayerDetails;\r\n","import React from \"react\";\r\n\r\ninterface FormRangeValuesProps {\r\n id: string,\r\n title: string,\r\n values: number[],\r\n value: number,\r\n sign?: string,\r\n textPosition?: \"bottom\" | \"right\"\r\n changeValue: (value:number) => void\r\n onEndAcion?: () => void\r\n}\r\n \r\n\r\nclass FormRangeValues extends React.Component<FormRangeValuesProps> {\r\n constructor(props:FormRangeValuesProps){\r\n super(props)\r\n\r\n }\r\n\r\n onChange(event:React.ChangeEvent<HTMLInputElement>){\r\n let innerIndex = Number(event.target.value);\r\n let currentValue = this.props.values[innerIndex];\r\n this.props.changeValue(currentValue);\r\n }\r\n\r\n render() { \r\n const {sign = \"%\", textPosition = \"bottom\"} = this.props\r\n const innerValueIndex = this.props.values.findIndex(it => it == this.props.value);\r\n return (\r\n <>\r\n <label htmlFor={this.props.id}> {this.props.title}</label>\r\n <div className={`range-wrapper ${textPosition === \"right\" ? \"right-text\" : \"\"}`}>\r\n <div className=\"\">\r\n <input \r\n id={this.props.id}\r\n className=\"range-control\" \r\n type=\"range\" \r\n min={0} \r\n max={this.props.values.length-1} \r\n step={1} \r\n value={innerValueIndex}\r\n onChange={(event)=>{this.onChange(event)}}\r\n onMouseUp={this.props.onEndAcion}\r\n />\r\n </div>\r\n <span>{this.props.value}{sign}</span>\r\n </div>\r\n \r\n </>\r\n );\r\n }\r\n}\r\n \r\nexport default FormRangeValues;","import { FunctionComponent, useEffect, useRef, useState } from \"react\";\r\nimport { RouteComponentProps, useParams, withRouter } from \"react-router-dom\";\r\nimport Select, { MultiValue, SingleValue } from \"react-select\";\r\nimport { ReactSortable } from \"react-sortablejs\";\r\nimport { BaseInfo, Guid, baseUrl } from \"../../../api/baseApi\";\r\nimport { CampaignStatus } from \"../../../api/campaingsApi\";\r\nimport { ChannelMediaModel, ChannelStream, cloneNestedPlaylistMedia, createChannelStream, CreateChannelStreamRequest, createSiteNestedPlayList, deleteChannelStream, deleteSiteNestedPlayList, disableSkinChannelStream, disableSkinNestedPlaylistMedia, enableSkinChannelStream, enableSkinNestedPlaylistMedia, getChannelById, getChannelStreams, getSiteNestedPlayListMedias, getSiteNestedPlayLists, pauseNestedPlaylistMedia, playNestedPlaylistMedia, ReorderItemPair, reorderNestedPlaylists, SiteNestedPlayList, updateChannelStream, updateSiteNestedPlayList, enableSitePlaylistsRandomOrder, disableSitePlaylistsRandomOrder, LocalFile, LocalFileRequest, createLocalFile, updateLocalFile, deleteLocalFile, getLocalFiles, getSiteNestedPlayListMediaLiveStatistic, NestedPlaylistMediaLiveStatistic, getGroupedMedia, GroupMedia, ReorderedIds, reorderGroupMedia, updateGroupForMedia, GroupForMediaRequest, createGroupForMedia, changeGroupName, cloneGroupMedia, removeGroupMedia, getGroupsForMedia, stopLocalFile, pauseLocalFile, playLocalFile, setSpeedLocalFile, restartLocalFile, jumpToLocalFile } from \"../../../api/channelsApi\";\r\nimport { MediaContentType, MediaType, mediaContentTypeOptions } from \"../../../api/mediaApi\";\r\nimport { getTVChannels, TVChannel } from \"../../../api/tvChannelApi\";\r\nimport { addLeadingZero, formatDuration, formatToPercent, renderMediaType, sortByNameString } from \"../../../services/common\";\r\nimport { formatDate, formatTime } from \"../../../services/dateService\";\r\nimport { Button } from \"../../components/Button\";\r\nimport FormCheckbox from \"../../components/formRow/FormCheckbox\";\r\nimport { FormInput, FormRow } from \"../../components/formRow/FormRow\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport IconButton from \"../../components/iconButton/IconButton\";\r\nimport { RightModal, SmallModal } from \"../../components/sideModal/Modal\";\r\nimport SvgSelector from \"../../components/svgSelector/SvgSelector\";\r\nimport Tabs, { TabElement, TabNavigationElement, TabsContainer } from \"../../components/tab/Tab\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport { getTags } from \"../../../api/tagApi\";\r\nimport { getToken } from \"../../../api/authApi\";\r\nimport FormRange from \"../../components/formRow/FormRange\";\r\nimport FormRangeValues from \"../../components/formRow/FormRangeValues\";\r\nimport { Routes } from \"../../../constants/routes\";\r\n\r\ninterface ChannelMediaParams{\r\n channelId: Guid\r\n}\r\n\r\ninterface ChannelMediaProps extends RouteComponentProps<any>{\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n\r\ntype ModalAction = \"create\" | \"update\" | \"set\" | \"clone\" | \"delete\" | \"nothing\";\r\ntype Option<T> = { value: T, label: string}\r\ninterface CheckedItems {\r\n [key: string]: boolean;\r\n}\r\n \r\nconst ChannelMedia: FunctionComponent<ChannelMediaProps> = (props: ChannelMediaProps) => {\r\n let {isCollapsed, logOut, toogleCollapse } = props;\r\n\r\n let [isLoading, setIsLoading] = useState<boolean>(false);\r\n let [medias, setMedias] = useState<ChannelMediaModel[]>([]);\r\n let [streams, setStreams] = useState<ChannelStream[]>([]);\r\n let [maxOrder, setMaxOrder] = useState<number>(0);\r\n let [totalDuration, setTotalDuration] = useState<number>(0);\r\n let [totalDurationActive, setTotalDurationActive] = useState<number>(0);\r\n\r\n let [showModal, setShowModal] = useState<boolean>(false);\r\n let [streamName, setStreamName] = useState<string>(\"\");\r\n let [isStreamNameError, setIsStreamNameError] = useState<boolean>(false);\r\n let [isStreamStartTimeError, setIsStreamStartTimeError] = useState<boolean>(false);\r\n let [isStreamEndTimeError, setIsStreamEndTimeError] = useState<boolean>(false);\r\n let [streamStartTime, setStreamStartTime] = useState<string>(\"\");\r\n let [streamEndTime, setStreamEndTime] = useState<string>(\"\");\r\n let [streamId, setStreamId] = useState<Guid>();\r\n\r\n let [currentSite, setCurrentSite] = useState('');\r\n\r\n let [nestedPlayListAction, setNestedPlayListAction] = useState<ModalAction>(\"nothing\");\r\n \r\n let [playlistName, setPlaylistName] = useState(\"\");\r\n let [isPlaylistNameError, setIsPlaylistNameError] = useState(false);\r\n let [useRandomOrder, setUseRandomOrder] = useState(false);\r\n let [nestedPlayLists, setNestedPlayLists] = useState<SiteNestedPlayList[]>([]);\r\n let [activeNestedPlaylistId, setActiveNestedPlayListId] = useState<Guid>(\"\");\r\n let [isShowNestedPlaylistDeleteModal, setIsShowNestedPlaylistDeleteModal] = useState(false);\r\n let [playInRandomOrder, setPlayInRandomOrder] = useState(false);\r\n\r\n let [tvChannelsList, setTvChannelsList] = useState<TVChannel[]>([]);\r\n let [selectedTvChannel, setSelectedTvChannel] = useState<SingleValue<TVChannel>>(null);\r\n\r\n let [localFiles, setLocalFiles] = useState<LocalFile[]>([]);\r\n let [localFileIdForAction, setLocalFileIdForAction] = useState<Guid>(\"\");\r\n let [isShowLocalFileModal, setIsShowLocalFileModal] = useState<boolean>(false);\r\n let [localFileName, setLocalFileName] = useState<string>(\"\");\r\n let [isLocalFileNameError, setIsLocalFileNameError] = useState<boolean>(false);\r\n let [localFilePath, setLocalFilePath] = useState<string>(\"\");\r\n let [isLocalFilePathError, setIsLocalFilePathError] = useState<boolean>(false);\r\n let [isLocalFileStartTimeError, setIsLocalFileStartTimeError] = useState<boolean>(false);\r\n let [isLocalFileEndTimeError, setIsLocalFileEndTimeError] = useState<boolean>(false);\r\n let [localFileStartTime, setLocalFileStartTime] = useState<string>(\"\");\r\n let [localFileEndTime, setLocalFileEndTime] = useState<string>(\"\");\r\n let [localFileDelay, setLocalFileDelay] = useState<string>(\"0\");\r\n let [localFileAction, setLocalFileAction] = useState<ModalAction>(\"nothing\");\r\n let [isShowLocalFileDeleteModal, setIsShowLocalFileDeleteModal] = useState(false);\r\n\r\n let [liveStatistic, setLiveStatistic] = useState<NestedPlaylistMediaLiveStatistic>();\r\n\r\n let [isShowPausedMedia, setIsShowPausedMedia] = useState(false);\r\n\r\n let [groupedMedia, setGroupedMedia] = useState<GroupMedia[]>([])\r\n let [isShowGroupModal, setIsShowGroupModal] = useState(false)\r\n let [mediaGroups, setMediaGroups ] = useState<Option<Guid>[]>([]);\r\n let [selectedMediaGroup, setSelectedMediaGroup] = useState<Guid>('');\r\n let [mediaGroupAction, setMediaGroupAction] = useState<ModalAction>(\"nothing\");\r\n let [groupName, setGroupName] = useState(\"\");\r\n let [isGroupNameError, setIsGroupNameError] = useState(false);\r\n let [isShowGroupConfirmModal, setIsShowGroupConfirmModal] = useState(false);\r\n let [groupModalAction, setGroupModalAction] = useState<ModalAction>(\"nothing\");\r\n let [groupIdForAction, setGroupIdForAction] = useState<Guid>(\"\");\r\n let [mediaIdForAction, setMediaIdForAction] = useState<Guid>(\"\");\r\n\r\n let [tags,setTags] = useState<Option<Guid>[]>([]);\r\n let [selectedTagIds, setSelectedTagIds] = useState<Guid[]>([]);\r\n let [checkedItems, setCheckedItems] = useState<CheckedItems>({});\r\n let [isListCollapsed, setIsListCollapsed] = useState(true)\r\n\r\n let [isShowMiniPlayerBlock, setIsShowMiniPlayerBlock] = useState(false)\r\n let [playbackSpeedLocalFiles, setPlaybackSpeedLocalFiles ] = useState<{id:Guid, speed:number}[]>([]);\r\n let [jumpToLocalFiles, setJumpToLocalFiles ] = useState<{id:Guid, timeCode:string}[]>([]);\r\n\r\n let [listHash, setListHash] = useState(0);\r\n\r\n let { channelId } = useParams<ChannelMediaParams>();\r\n \r\n useEffect(() => {\r\n async function fetchData(){\r\n setIsLoading(true);\r\n await Promise.all([\r\n updateStreams(), \r\n updateNestedPlayLists(), \r\n getSiteById(), \r\n updateTvChannelList(), \r\n updateLocalFiles(), \r\n updateTags()]);\r\n\r\n setIsLoading(false);\r\n }\r\n\r\n fetchData();\r\n }, [])\r\n\r\n useEffect(() =>{\r\n const initialCheckedItems: CheckedItems = {};\r\n groupedMedia.forEach(item => {\r\n if(checkedItems[item.id] === undefined){\r\n initialCheckedItems[item.id] = true\r\n } else {\r\n initialCheckedItems[item.id] = checkedItems[item.id]\r\n }\r\n });\r\n setCheckedItems(initialCheckedItems);\r\n },[groupedMedia])\r\n\r\n useEffect(() => {\r\n const allChecked = Object.values(checkedItems).every((checked) => checked);\r\n if(allChecked) setIsListCollapsed(false)\r\n else setIsListCollapsed(true)\r\n },[checkedItems])\r\n\r\n useEffect(()=>{\r\n const getGroupedMediaAndGroups = async () => {\r\n await updateGroupedMedia(selectedTagIds);\r\n await updateGroups();\r\n await updateNestedPlaylistGroupedMediaLiveStatistic(selectedTagIds);\r\n }\r\n if(activeNestedPlaylistId) getGroupedMediaAndGroups();\r\n },[activeNestedPlaylistId])\r\n\r\n const updateTvChannelList = async () => {\r\n let response = await getTVChannels();\r\n if( response.type === \"succes\") {\r\n setTvChannelsList(response.data.items);\r\n }\r\n }\r\n\r\n\r\n const getSiteById = async () => {\r\n let result = await getChannelById(channelId);\r\n if(result.type === \"succes\"){\r\n setCurrentSite(result.data.name);\r\n setPlayInRandomOrder(result.data.playInRandomOrder);\r\n }\r\n }\r\n\r\n\r\n const updateStreams = async () => {\r\n var streamsResponse = await getChannelStreams(channelId);\r\n if(streamsResponse.type == \"succes\"){\r\n setStreams(streamsResponse.data.items);\r\n }\r\n }\r\n\r\n const updateLocalFiles = async () => {\r\n let response = await getLocalFiles(channelId);\r\n if( response.type === \"succes\") {\r\n setLocalFiles(response.data.items);\r\n setPlaybackSpeedLocalFiles(response.data.items.map(el => ({id: el.id, speed:1})))\r\n setJumpToLocalFiles(response.data.items.map(el => ({id: el.id, timeCode:\"00:00:00\"})))\r\n }\r\n }\r\n\r\n const updateGroupedMedia = async ( tagIds: Guid[] = []) => {\r\n let response = await getGroupedMedia(channelId, activeNestedPlaylistId, tagIds);\r\n if( response.type === \"succes\") {\r\n setGroupedMedia(response.data.items)\r\n setListHash(response.data.hash)\r\n }\r\n }\r\n\r\n const updateGroups = async () => {\r\n let response = await getGroupsForMedia(channelId, activeNestedPlaylistId);\r\n if( response.type === \"succes\") {\r\n let arr:Option<Guid>[] = []\r\n response.data.items.forEach( it => {\r\n arr.push({label: it.name, value: it.id}) \r\n })\r\n setMediaGroups(arr)\r\n }\r\n }\r\n\r\n const updateTags = async () => {\r\n let tagResponse = await getTags();\r\n if(tagResponse.type == \"succes\") {\r\n setTags([\r\n {\r\n label: \"No Tags\",\r\n value: \"00000000-0000-0000-0000-000000000000\"\r\n },\r\n ...tagResponse.data.items.map( t => { return {label:t.name, value:t.id}})\r\n ])\r\n }\r\n }\r\n\r\n const onDropMediaInGroup = async (newOrderedMedia: ChannelMediaModel[], myNum: number) => {\r\n let arr = [...groupedMedia]\r\n arr[myNum].groupMedia = newOrderedMedia\r\n setGroupedMedia(arr)\r\n }\r\n\r\n const sendReorderedIds = async () => {\r\n setIsLoading(true)\r\n setTimeout(async () => {\r\n await reorderGroupMedia(getReorderedIdsForRequest(groupedMedia), channelId, activeNestedPlaylistId);\r\n await updateGroupedMedia()\r\n setIsLoading(false)\r\n }, 200)\r\n }\r\n\r\n const onDropPlaylist = async (newOrderedPlaylists: SiteNestedPlayList[]) => {\r\n let reorderItems : ReorderItemPair[] = [];\r\n for(let index = 0; index < newOrderedPlaylists.length; index++){\r\n if(nestedPlayLists[index].id !== newOrderedPlaylists[index].id){\r\n reorderItems.push({ from: newOrderedPlaylists[index].id, to: nestedPlayLists[index].id});\r\n }\r\n } \r\n if(reorderItems.length !== 0){\r\n setIsLoading(true);\r\n await reorderNestedPlaylists({ reorderItems: reorderItems }, channelId);\r\n await updateNestedPlayLists();\r\n setIsLoading(false);\r\n }\r\n }\r\n\r\n const clone = async (mediaId: Guid) => {\r\n setIsLoading(true);\r\n await cloneNestedPlaylistMedia(channelId, activeNestedPlaylistId, mediaId);\r\n await updateGroupedMedia()\r\n await updateNestedPlaylistGroupedMediaLiveStatistic();\r\n setIsLoading(false);\r\n }\r\n\r\n const pause = async (mediaId: Guid) => {\r\n setIsLoading(true);\r\n await pauseNestedPlaylistMedia(channelId, activeNestedPlaylistId, mediaId);\r\n await updateGroupedMedia()\r\n await updateNestedPlaylistGroupedMediaLiveStatistic();\r\n setIsLoading(false);\r\n }\r\n\r\n const play = async (mediaId: Guid) => {\r\n setIsLoading(true);\r\n await playNestedPlaylistMedia(channelId, activeNestedPlaylistId, mediaId);\r\n await updateGroupedMedia()\r\n await updateNestedPlaylistGroupedMediaLiveStatistic();\r\n setIsLoading(false);\r\n }\r\n\r\n const enableSkin = async (mediaId: Guid) => {\r\n setIsLoading(true);\r\n await enableSkinNestedPlaylistMedia(channelId, activeNestedPlaylistId, mediaId);\r\n await updateGroupedMedia()\r\n setIsLoading(false);\r\n }\r\n\r\n const disableSkin = async (mediaId: Guid) => {\r\n setIsLoading(true);\r\n await disableSkinNestedPlaylistMedia(channelId, activeNestedPlaylistId, mediaId);\r\n await updateGroupedMedia()\r\n setIsLoading(false);\r\n }\r\n\r\n const enableSkinStream = async (streamId: Guid) => {\r\n setIsLoading(true);\r\n await enableSkinChannelStream(channelId, streamId);\r\n await updateStreams();\r\n setIsLoading(false);\r\n }\r\n\r\n const disableSkinStream = async (streamId: Guid) => {\r\n setIsLoading(true);\r\n await disableSkinChannelStream(channelId, streamId);\r\n await updateStreams();\r\n setIsLoading(false);\r\n }\r\n\r\n const deleteStream = async (id: Guid) => {\r\n await deleteChannelStream(id);\r\n await updateStreams();\r\n }\r\n\r\n const closeModal = () => {\r\n setShowModal(false);\r\n setStreamName(\"\");\r\n setIsStreamNameError(false);\r\n setStreamStartTime(\"\");\r\n setIsStreamStartTimeError(false)\r\n setStreamEndTime(\"\");\r\n setIsStreamEndTimeError(false);\r\n setStreamId(undefined);\r\n setSelectedTvChannel(null);\r\n }\r\n\r\n const openModal = (stream: ChannelStream) => {\r\n setStreamName(stream.name);\r\n setStreamStartTime(stream.startTime);\r\n setStreamEndTime(stream.endTime);\r\n setStreamId(stream.id);\r\n let currentTvChannel = tvChannelsList.find(it => it.id === stream.tvChannelId)\r\n setSelectedTvChannel( currentTvChannel ? currentTvChannel : null)\r\n setShowModal(true);\r\n }\r\n\r\n const renderCampaignStatus = (status: CampaignStatus) => {\r\n switch(status){\r\n case CampaignStatus.Active : return <td className=\"status-active\">Active</td>;\r\n case CampaignStatus.Draft : return <td className=\"status-draft\">Draft</td>;\r\n case CampaignStatus.Paused : return <td className=\"status-paused\">Paused</td>;\r\n case CampaignStatus.Scheduled : return <td className=\"status-scheduled\">Scheduled</td>;\r\n case CampaignStatus.Expired : return <td className=\"status-expired\">Expired</td>;\r\n default : return <td className=\"status-null\"></td>\r\n }\r\n \r\n }\r\n\r\n const renderStream = (stream: ChannelStream) => {\r\n return <tr key={stream.id}>\r\n <td>{stream.name}</td>\r\n <td>{formatDate(stream.startTime)} {formatTime(stream.startTime)} </td>\r\n <td>{formatDate(stream.endTime)} {formatTime(stream.endTime)}</td>\r\n <td>{stream.tvChannelName}</td>\r\n <td>\r\n {stream.isTriggeringSkin \r\n ? <IconButton tooltipText=\"With Skin\" type=\"mosaic\" onClick={() => {disableSkinStream(stream.id)}}/> \r\n : <span className=\"no-skin-svg-icon\">\r\n <IconButton tooltipText=\"No Skin\" type=\"mosaic\" onClick={() => {enableSkinStream(stream.id)}}/>\r\n </span>}\r\n <IconButton tooltipText=\"Delete\" type=\"delete\" onClick={() => deleteStream(stream.id)} />\r\n <IconButton tooltipText=\"Edit\" type=\"edit\" onClick={() => openModal(stream)} />\r\n </td>\r\n </tr>\r\n }\r\n\r\n const saveStream = async () => {\r\n let isError = false;\r\n if(streamName === \"\"){\r\n setIsStreamNameError(true); isError = true;\r\n }\r\n\r\n if(streamStartTime === \"\"){\r\n setIsStreamStartTimeError(true); isError = true;\r\n }\r\n\r\n if(streamEndTime === \"\"){\r\n setIsStreamEndTimeError(true); isError = true;\r\n }\r\n\r\n if(isError) return;\r\n setIsLoading(true);\r\n var request : CreateChannelStreamRequest = {\r\n name: streamName,\r\n endTime: streamEndTime,\r\n startTime: streamStartTime,\r\n tvChannelId: selectedTvChannel ? selectedTvChannel.id : null,\r\n }\r\n\r\n if(!!!streamId){\r\n await createChannelStream(request, channelId);\r\n }\r\n else{\r\n await updateChannelStream(request, streamId);\r\n }\r\n await updateStreams();\r\n closeModal();\r\n setIsLoading(false);\r\n }\r\n\r\n const renderMediaTypePreview = (media: ChannelMediaModel) => {\r\n switch(media.mediaType){\r\n case MediaType.Image : return <img className=\"sortable__item-img\" src={media.previewUrl} alt=\"\" />\r\n case MediaType.Video : return <img className=\"sortable__item-img\" src={media.previewUrl} alt=\"\" />\r\n case MediaType.VastUrl : return <SvgSelector title=\"url\" />;\r\n case MediaType.Youtube : return <img className=\"sortable__item-img\" src={media.previewUrl} alt=\"\" />;\r\n case MediaType.YoutubeLive : return <img className=\"sortable__item-img\" src={media.previewUrl} alt=\"\" />;\r\n case MediaType.WebPage : return <SvgSelector title=\"webview\" />;\r\n }\r\n }\r\n\r\n let getActiveNestedPlayList = () => nestedPlayLists.find(it => it.id == activeNestedPlaylistId);\r\n const checkActiveTab = (tab: string) => tab === activeNestedPlaylistId;\r\n\r\n const showPlaylistModal = (action: ModalAction) => {\r\n setNestedPlayListAction(action);\r\n if(action == \"update\"){\r\n var nestedPlayList = getActiveNestedPlayList();\r\n if(nestedPlayList) {\r\n setPlaylistName(nestedPlayList.name);\r\n setUseRandomOrder(nestedPlayList.useRandomOrder)\r\n }\r\n } \r\n }\r\n\r\n const closePlaylistModal = () => {\r\n setPlaylistName('');\r\n setUseRandomOrder(false);\r\n setIsPlaylistNameError(false);\r\n setNestedPlayListAction(\"nothing\");\r\n }\r\n\r\n const createOrUpdatePlaylist = async () => {\r\n setIsLoading(true);\r\n if(playlistName === \"\") {\r\n setIsPlaylistNameError(true);\r\n return;\r\n }\r\n \r\n let request = {\r\n name: playlistName,\r\n useRandomOrder: useRandomOrder\r\n };\r\n\r\n if(nestedPlayListAction == \"update\") {\r\n await updateSiteNestedPlayList(channelId, activeNestedPlaylistId, request)\r\n }\r\n if(nestedPlayListAction == \"create\"){\r\n var createResult = await createSiteNestedPlayList(channelId, request);\r\n if(createResult.type == \"succes\") {\r\n setActiveNestedPlayListId(createResult.data.id);\r\n } \r\n }\r\n \r\n await updateNestedPlayLists();\r\n setIsLoading(false);\r\n closePlaylistModal();\r\n } \r\n\r\n const renderNestedPlayListTabs = (nestedPlayLists: SiteNestedPlayList[]) => {\r\n return nestedPlayLists.map( (it, index) => {\r\n return <TabNavigationElement key={index} title={it.name} isActive={checkActiveTab(it.id)} onClick={() => { setActiveNestedPlayListId(it.id) }} />\r\n })\r\n }\r\n\r\n const updateNestedPlayLists = async () => {\r\n setIsLoading(true);\r\n let nestedPlayListResponse = await getSiteNestedPlayLists(channelId);\r\n if (nestedPlayListResponse.type == \"succes\") {\r\n setNestedPlayLists(nestedPlayListResponse.data.items.sort((f, s)=> f.order-s.order));\r\n let activeNestedPlayList = nestedPlayListResponse.data.items.find(it => it.id == activeNestedPlaylistId);\r\n if(!activeNestedPlayList){\r\n if(nestedPlayListResponse.data.items.length){\r\n setActiveNestedPlayListId(nestedPlayListResponse.data.items[0].id);\r\n } \r\n else setActiveNestedPlayListId(\"\");\r\n } \r\n }\r\n\r\n setIsLoading(false);\r\n }\r\n\r\n const updateNestedPlaylistGroupedMediaLiveStatistic = async (tagIds: Guid[] = []) => {\r\n let response = await getSiteNestedPlayListMediaLiveStatistic(channelId, activeNestedPlaylistId, tagIds);\r\n if (response.type == \"succes\") {\r\n setLiveStatistic({\r\n scheduled: response.data.data.scheduled,\r\n live: response.data.data.live\r\n })\r\n }\r\n }\r\n\r\n const showNestedDeleteModal = () => { \r\n setIsShowNestedPlaylistDeleteModal(true);\r\n }\r\n\r\n const closeNestedDeleteModal = () => { \r\n setIsShowNestedPlaylistDeleteModal(false)\r\n }\r\n\r\n const deleteNestedPlaylist = async () => {\r\n await deleteSiteNestedPlayList(channelId, activeNestedPlaylistId);\r\n await updateNestedPlayLists();\r\n closeNestedDeleteModal();\r\n }\r\n\r\n const setRandomOrderForPlaylists = async (status: boolean) => {\r\n setIsLoading(true);\r\n if(status) {\r\n await enableSitePlaylistsRandomOrder(channelId);\r\n } else {\r\n await disableSitePlaylistsRandomOrder(channelId)\r\n }\r\n await getSiteById();\r\n setIsLoading(false);\r\n }\r\n\r\n const onSelectedTvChannel = (newValue: SingleValue<TVChannel>) => {\r\n setSelectedTvChannel(newValue);\r\n }\r\n\r\n const getMediaTotalDurationByContentType = (contentType: MediaContentType) => {\r\n return medias.filter(it => it.contentType === contentType && !(it.isPaused || it.isPausedInCampaign)).map(it => it.durationMs).reduce((a, b) => a+b, 0)\r\n }\r\n\r\n const getPercentOfTotal = (total:number, current:number) => {\r\n let res = Math.round((current/total)*100)\r\n return <span style={{width: \"43px\", display:\"inline-block\"}}>{`(${res}%)`}</span>\r\n }\r\n\r\n const renderContentType = (contentType:MediaContentType) => {\r\n switch(contentType){\r\n case MediaContentType.Ads: return mediaContentTypeOptions[0].name;\r\n case MediaContentType.ClientContent: return mediaContentTypeOptions[1].name;\r\n case MediaContentType.SelfContent: return mediaContentTypeOptions[2].name;\r\n case MediaContentType.Backup: return mediaContentTypeOptions[3].name;\r\n }\r\n }\r\n\r\n const showLocalFileModal = (action: ModalAction, localFile?: LocalFile) => {\r\n setIsShowLocalFileModal(true);\r\n setLocalFileAction(action);\r\n if(action === \"update\" && localFile){\r\n setLocalFileIdForAction(localFile.id);\r\n setLocalFileName(localFile.name);\r\n setLocalFilePath(localFile.path);\r\n setLocalFileStartTime(localFile.startTime);\r\n setLocalFileEndTime(localFile.endTime);\r\n setLocalFileDelay(localFile.subtitlesDelayMs +\"\")\r\n }\r\n }\r\n\r\n const hideLocalFileModal = () => {\r\n setIsShowLocalFileModal(false);\r\n setLocalFileAction(\"nothing\");\r\n setLocalFileIdForAction(\"\");\r\n setLocalFileName(\"\");\r\n setIsLocalFileNameError(false)\r\n setLocalFilePath(\"\");\r\n setIsLocalFilePathError(false);\r\n setLocalFileStartTime(\"\");\r\n setIsLocalFileStartTimeError(false);\r\n setLocalFileEndTime(\"\");\r\n setIsLocalFileEndTimeError(false);\r\n }\r\n\r\n const saveLocalFile = async () => {\r\n let isError = false;\r\n if(localFileName === \"\"){\r\n setIsLocalFileNameError(true); isError = true;\r\n }\r\n\r\n if(localFilePath === \"\"){\r\n setIsLocalFilePathError(true); isError = true;\r\n }\r\n\r\n if(localFileStartTime === \"\"){\r\n setIsLocalFileStartTimeError(true); isError = true;\r\n }\r\n\r\n if(localFileEndTime === \"\"){\r\n setIsLocalFileEndTimeError(true); isError = true;\r\n }\r\n\r\n if(new Date(localFileEndTime) < new Date(localFileStartTime)){\r\n setIsLocalFileEndTimeError(true)\r\n isError = true\r\n }\r\n\r\n if(isError) return;\r\n setIsLoading(true);\r\n var request : LocalFileRequest = {\r\n name: localFileName,\r\n path: localFilePath,\r\n startTime: localFileStartTime,\r\n endTime: localFileEndTime,\r\n subtitlesDelayMs: +localFileDelay\r\n }\r\n\r\n if(!!!localFileIdForAction){\r\n await createLocalFile(channelId,request);\r\n }\r\n else{\r\n await updateLocalFile(channelId, localFileIdForAction, request);\r\n }\r\n await updateLocalFiles();\r\n hideLocalFileModal();\r\n setIsLoading(false);\r\n }\r\n\r\n const showLocalFileDeleteModal = (id: Guid) => {\r\n setIsShowLocalFileDeleteModal(true);\r\n setLocalFileIdForAction(id);\r\n }\r\n\r\n const closeLocalFileDeleteModal = () => {\r\n setIsShowLocalFileDeleteModal(false);\r\n setLocalFileIdForAction(\"\")\r\n }\r\n\r\n const removeLocalFile = async () => {\r\n setIsLoading(true);\r\n await deleteLocalFile(channelId, localFileIdForAction);\r\n await updateLocalFiles();\r\n closeLocalFileDeleteModal();\r\n setIsLoading(false);\r\n }\r\n\r\n const renderLocalFiles = (file: LocalFile) => {\r\n return <tr key={file.id}>\r\n <td>{file.name}</td>\r\n <td>{file.path}</td>\r\n <td>{formatDate(file.startTime)} {formatTime(file.startTime)} </td>\r\n <td>{formatDate(file.endTime)} {formatTime(file.endTime)}</td>\r\n <td style={{width:\"35%\"}}>\r\n <div className={`mini-player__controls ${isShowMiniPlayerBlock && file.id === localFileIdForAction ? \"show\" : \"\"}`}>\r\n <div className=\"mini-player__buttons\">\r\n <IconButton tooltipText=\"\" type=\"play\" onClick={playLocalFileInMiniPlayer} />\r\n <IconButton tooltipText=\"\" type=\"stop-play\" onClick={pauseLocalFileInMiniPlayer} />\r\n <IconButton tooltipText=\"\" type=\"stop\" onClick={stopLocalFileInMiniPlayer} />\r\n <IconButton tooltipText=\"\" type=\"restart\" onClick={restartLocalFileInMiniPlayer} />\r\n <input type=\"time\" step={1} value={getJumpToForLocalFile(file.id)} onChange={e => setJumpToForLocalFile(file.id, e.target.value)}/>\r\n <IconButton tooltipText=\"\" type=\"clock\" onClick={() => jumpToLocalFileInMiniPlayer(file.id)} />\r\n </div>\r\n <div className=\"mini-player__speed-range\">\r\n <FormRangeValues\r\n id=\"playbackSpeed-range\"\r\n title=\"\"\r\n sign=\"x\"\r\n textPosition=\"right\"\r\n values={[0.25, 0.5, 0.75, 0.8, 0.9, 1, 1.1, 1.25, 1.5, 1.75, 2, 2.5, 3, 4, 6, 8, 12, 16, 32, 48, 64]}\r\n value={getPlayBackSpeedForLocalFile(file.id)}\r\n changeValue={setPlayBackSpeedForLocalFile}\r\n onEndAcion={setSpeedLocalFileInMiniPlayer}\r\n />\r\n </div>\r\n </div>\r\n <IconButton tooltipText=\"Mini Player\" type=\"mini-player\" onClick={() => {toggleMiniPlayerBlock(file.id)}} />\r\n <IconButton tooltipText=\"Delete\" type=\"delete\" onClick={() => {showLocalFileDeleteModal(file.id)}} />\r\n <IconButton tooltipText=\"Edit\" type=\"edit\" onClick={() => {showLocalFileModal(\"update\", file)}} />\r\n </td>\r\n </tr>\r\n }\r\n\r\n \r\n let globalMediaIndex = 1\r\n const renderMedia = (medias: ChannelMediaModel[], collapsed: boolean) => {\r\n return medias.map((item) => {\r\n return <tr className={`sortable__item \r\n ${item.isPaused || item.isPausedInCampaign ? \"is-paused\" : \"\"}\r\n ${(isShowPausedMedia) ? '' : 'hide-paused'}\r\n ${(item.isExcluded) ? 'hide-excluded' : ''}\r\n `} \r\n key={item.id}\r\n >\r\n <td>{!item.isExcluded && addLeadingZero(globalMediaIndex++, 2)}</td>\r\n <td>\r\n {renderMediaTypePreview(item)}\r\n </td>\r\n <td>{item.name}</td>\r\n <td>{renderMediaType(item.mediaType)}</td>\r\n <td>{item.campaignName}</td>\r\n {renderCampaignStatus(item.campaignStatus)}\r\n <td>{item.isPausedInCampaign ? \"Yes\": \"No\"}</td>\r\n <td>{renderContentType(item.contentType)}</td>\r\n <td>{formatDuration(item.durationMs)}</td>\r\n <td>\r\n {item.tags.map(t => <p key={t.id}>{t.name}</p>)}\r\n </td>\r\n <td>\r\n <IconButton tooltipText=\"Set Group\" type=\"folder\" onClick={() => {showGroupModal(\"set\"); setMediaIdForAction(item.id)}}/>\r\n {item.isTriggeringSkin \r\n ? <IconButton tooltipText=\"With Skin\" type=\"mosaic\" onClick={() => {disableSkin(item.id)}}/> \r\n : <span className=\"no-skin-svg-icon\">\r\n <IconButton tooltipText=\"No Skin\" type=\"mosaic\" onClick={() => {enableSkin(item.id)}}/>\r\n </span>}\r\n {item.isPaused\r\n ? item.isPausedInCampaign ? '' : <IconButton tooltipText=\"Play\" type=\"play\" onClick={() => play(item.id)}/>\r\n : item.isPausedInCampaign ? '' : <IconButton tooltipText=\"Stop\" type=\"stop-play\" onClick={() => pause(item.id)} />}\r\n <IconButton tooltipText=\"Clone item\" type=\"copy\" onClick={() => clone(item.id)}/>\r\n </td>\r\n </tr>\r\n })\r\n }\r\n\r\n const getReorderedIdsForRequest = (medias: GroupMedia[]) => {\r\n let requestObject:ReorderedIds = {ids:[], hash: listHash}\r\n\r\n medias.forEach((elem) => {\r\n if(elem.singleMedia){\r\n requestObject.ids.push(elem.id)\r\n } \r\n if(elem.groupMedia) {\r\n requestObject.ids.push(...elem.groupMedia.map(it => it.id))\r\n }\r\n })\r\n\r\n return requestObject\r\n }\r\n\r\n const showGroupConfirmModal = (id: Guid, action: ModalAction) => {\r\n setGroupIdForAction(id);\r\n setGroupModalAction(action)\r\n setIsShowGroupConfirmModal(true);\r\n }\r\n\r\n const closeGroupConfirmModal = () => {\r\n setGroupIdForAction(\"\");\r\n setGroupModalAction(\"nothing\")\r\n setIsShowGroupConfirmModal(false);\r\n }\r\n\r\n const cloneGroup = async () => {\r\n setIsLoading(true)\r\n await cloneGroupMedia(channelId, activeNestedPlaylistId, groupIdForAction)\r\n await updateNestedPlaylistGroupedMediaLiveStatistic()\r\n await updateGroupedMedia()\r\n setIsLoading(false)\r\n closeGroupConfirmModal()\r\n }\r\n\r\n const deleteGroup = async () => {\r\n setIsLoading(true)\r\n await removeGroupMedia(channelId, activeNestedPlaylistId, groupIdForAction)\r\n await updateNestedPlaylistGroupedMediaLiveStatistic()\r\n await updateGroups()\r\n await updateGroupedMedia()\r\n setIsLoading(false)\r\n closeGroupConfirmModal()\r\n }\r\n\r\n const renderGroupMedia = (medias: GroupMedia[]) => {\r\n return medias.map((item, index) => {\r\n\r\n if(item.singleMedia){\r\n return renderMedia([item.singleMedia], false)\r\n }\r\n\r\n if(item.groupMedia){\r\n return <>\r\n <tr className=\"no-hover\" key={item.id}>\r\n <td colSpan={11} className=\"group-media-block\" style={{textAlign:'left', padding:\"0 0 15px 30px\"}}>\r\n <div className=\"group-title\">\r\n {item.name}\r\n <span style={{marginLeft:10}}>{formatDuration(item.durationScheduled)} / {formatDuration(item.durationLive)}</span>\r\n <IconButton tooltipText=\"Clone\" type=\"copy\" onClick={() => showGroupConfirmModal(item.id, \"clone\")}/>\r\n <IconButton tooltipText=\"Edit\" type=\"edit\" onClick={() => showGroupModal(\"update\", item)}/>\r\n <IconButton tooltipText=\"Delete\" type=\"delete\" onClick={() => showGroupConfirmModal(item.id, \"delete\")}/>\r\n <div className=\"d-inline-flex justify-content-end\" style={{marginLeft:30}}>\r\n <label htmlFor={`group-${item.id}`} className=\"checkbox-control\" >\r\n <input \r\n id={`group-${item.id}`} \r\n className=\"checkbox\" \r\n type=\"checkbox\" \r\n checked={!!checkedItems[item.id]}\r\n onChange={() => handleCheckboxChange(item.id)}\r\n />\r\n <span className=\"checkbox-bg\"></span>\r\n <span className=\"checkbox-cursor\"></span>\r\n </label>\r\n <span className=\"current-status\"> Expand</span>\r\n </div>\r\n </div>\r\n <ReactSortable\r\n disabled={isSortDisabled()}\r\n list={item.groupMedia}\r\n setList={(newState) => {onDropMediaInGroup(newState, index)}}\r\n onEnd={()=>{sendReorderedIds()}}\r\n tag=\"tbody\"\r\n filter={'.no-sort'}\r\n animation={150}\r\n fallbackOnBody={true}\r\n swapThreshold={0.65}\r\n >\r\n {renderMedia(item.groupMedia, true)}\r\n </ReactSortable>\r\n </td>\r\n </tr>\r\n </>\r\n }\r\n })\r\n }\r\n\r\n const showGroupModal = (action: ModalAction, item?: GroupMedia) => {\r\n if(item){\r\n setGroupName(item.name)\r\n setGroupIdForAction(item.id)\r\n }\r\n setMediaGroupAction(action)\r\n setIsShowGroupModal(true)\r\n }\r\n\r\n const hideGroupModal = () => {\r\n setSelectedMediaGroup(\"\")\r\n setIsGroupNameError(false)\r\n setMediaGroupAction(\"nothing\")\r\n setGroupName(\"\")\r\n setGroupIdForAction(\"\")\r\n setMediaIdForAction(\"\")\r\n setIsShowGroupModal(false)\r\n }\r\n\r\n const onChangeSelectedMediaGroup = (group: SingleValue<Option<Guid>>) => {\r\n if(group){\r\n setSelectedMediaGroup(group.value);\r\n } else {\r\n setSelectedMediaGroup('');\r\n }\r\n }\r\n\r\n const saveGroupForMedia = async () => {\r\n let request: GroupForMediaRequest = {\r\n groupId: selectedMediaGroup ? selectedMediaGroup : null,\r\n hash: listHash\r\n }\r\n setIsLoading(true)\r\n await updateGroupForMedia(request, channelId, activeNestedPlaylistId, mediaIdForAction)\r\n await updateNestedPlaylistGroupedMediaLiveStatistic()\r\n await updateGroupedMedia()\r\n setIsLoading(false)\r\n hideGroupModal()\r\n }\r\n\r\n const createNewGroupForMedia = async () => {\r\n if(groupName === \"\") {\r\n setIsGroupNameError(true);\r\n return;\r\n }\r\n \r\n let request = {name:groupName};\r\n setIsLoading(true)\r\n await createGroupForMedia(request, channelId, activeNestedPlaylistId)\r\n await updateGroups()\r\n setIsLoading(false)\r\n hideGroupModal()\r\n }\r\n\r\n const updateGroupName = async () => {\r\n if(groupName === \"\") {\r\n setIsGroupNameError(true);\r\n return;\r\n }\r\n \r\n let request = {name:groupName};\r\n setIsLoading(true)\r\n await changeGroupName(request, groupIdForAction, channelId, activeNestedPlaylistId)\r\n await updateGroups()\r\n await updateGroupedMedia()\r\n setIsLoading(false)\r\n hideGroupModal()\r\n }\r\n\r\n const onSelectedTag = async (newValue: MultiValue<Option<Guid>>) => {\r\n if(newValue){\r\n let newTagIds = newValue.map(el => el.value)\r\n setSelectedTagIds(newTagIds)\r\n setIsLoading(true)\r\n await updateGroupedMedia(newTagIds)\r\n await updateNestedPlaylistGroupedMediaLiveStatistic(newTagIds)\r\n setIsLoading(false)\r\n } else {\r\n setSelectedTagIds([])\r\n setIsLoading(true)\r\n await updateGroupedMedia()\r\n await updateNestedPlaylistGroupedMediaLiveStatistic()\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n const handleCheckboxChange = (id: string) => {\r\n setCheckedItems((prev) => ({\r\n ...prev,\r\n [id]: !prev[id],\r\n }));\r\n };\r\n\r\n const toggleAllCheckboxes = () => {\r\n const allChecked = Object.values(checkedItems).every((checked) => checked);\r\n const newCheckedItems: CheckedItems = groupedMedia.reduce((acc, item) => {\r\n acc[item.id] = !allChecked;\r\n return acc;\r\n }, {} as CheckedItems);\r\n setCheckedItems(newCheckedItems);\r\n setIsListCollapsed(prev => !prev);\r\n };\r\n\r\n const createDownloadQueryParamsString = () => {\r\n if(selectedTagIds.length != 0) {\r\n return selectedTagIds.map(el => `tagIds=${el}`).join('&') + '&';\r\n }\r\n else {\r\n return ''\r\n }\r\n }\r\n\r\n const isSortDisabled = () => {\r\n return !!selectedTagIds && selectedTagIds?.length != 0;\r\n }\r\n\r\n const toggleMiniPlayerBlock = (fileId: Guid) => {\r\n if (isShowMiniPlayerBlock && localFileIdForAction === fileId) {\r\n setIsShowMiniPlayerBlock(false);\r\n setLocalFileIdForAction(\"\");\r\n } else {\r\n setIsShowMiniPlayerBlock(true);\r\n setLocalFileIdForAction(fileId);\r\n }\r\n };\r\n\r\n const stopLocalFileInMiniPlayer = async () => {\r\n setIsLoading(true)\r\n await stopLocalFile(channelId, localFileIdForAction)\r\n setIsLoading(false)\r\n }\r\n const pauseLocalFileInMiniPlayer = async () => {\r\n setIsLoading(true)\r\n await pauseLocalFile(channelId, localFileIdForAction)\r\n setIsLoading(false)\r\n }\r\n const playLocalFileInMiniPlayer = async () => {\r\n setIsLoading(true)\r\n await playLocalFile(channelId, localFileIdForAction)\r\n setIsLoading(false)\r\n }\r\n const restartLocalFileInMiniPlayer = async () => {\r\n setIsLoading(true)\r\n await restartLocalFile(channelId, localFileIdForAction)\r\n setIsLoading(false)\r\n }\r\n const jumpToLocalFileInMiniPlayer = async (localFileId: Guid) => {\r\n setIsLoading(true) \r\n var timeCode = getJumpToForLocalFile(localFileId);\r\n await jumpToLocalFile(channelId, localFileIdForAction, timeCode)\r\n setIsLoading(false)\r\n }\r\n const setSpeedLocalFileInMiniPlayer = async () => {\r\n await setSpeedLocalFile(channelId, localFileIdForAction, {speed: getPlayBackSpeedForLocalFile(localFileIdForAction)})\r\n }\r\n\r\n const getPlayBackSpeedForLocalFile = (id: Guid) => {\r\n let index = playbackSpeedLocalFiles.findIndex(el => el.id === id)\r\n if(index !== -1) {\r\n return playbackSpeedLocalFiles[index].speed\r\n } else {\r\n return 1\r\n }\r\n }\r\n\r\n const getJumpToForLocalFile = (id: Guid) => {\r\n let index = jumpToLocalFiles.findIndex(el => el.id === id)\r\n if(index !== -1) {\r\n return jumpToLocalFiles[index].timeCode\r\n } else {\r\n return \"00:00:00\";\r\n }\r\n }\r\n\r\n const setPlayBackSpeedForLocalFile = (newSpeed: number) => {\r\n setPlaybackSpeedLocalFiles(prevState =>\r\n prevState.map(item =>\r\n item.id === localFileIdForAction ? { ...item, speed: newSpeed } : item\r\n )\r\n );\r\n };\r\n \r\n const setJumpToForLocalFile = (id: Guid, timeCode: string) => {\r\n setJumpToLocalFiles(prevState =>\r\n prevState.map(item =>\r\n item.id === id ? { ...item, timeCode: timeCode } : item\r\n )\r\n );\r\n };\r\n\r\n const goToPlaylist = () => {\r\n props.history.push(`/channels/${channelId}/nested-playlists/${activeNestedPlaylistId}/days-statistic`);\r\n }\r\n\r\n\r\n return ( \r\n <><InnerLayout\r\n isCollapsed={isCollapsed}\r\n logOut={logOut}\r\n toogleCollapse={toogleCollapse}\r\n activeTab=\"channels\">\r\n <>\r\n <h1 style={{'paddingTop':'45px'}}>{currentSite}</h1>\r\n <div className=\"d-flex justify-content-between align-items-center pt-20\">\r\n <h3>Streams</h3>\r\n <Button color=\"green\" label=\"Add Stream\" onClick={()=>{setShowModal(true)}} />\r\n </div>\r\n \r\n <table className=\"table modal-table\">\r\n <thead>\r\n <tr>\r\n <td>Name</td>\r\n <td>Start</td>\r\n <td>End</td>\r\n <td>TV Channel</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {streams.map(renderStream)}\r\n </tbody>\r\n </table>\r\n \r\n <div className=\"d-flex justify-content-between align-items-center pt-20\">\r\n <h3>Local Files</h3>\r\n <Button color=\"green\" label=\"Add Local File\" onClick={()=>{showLocalFileModal(\"create\")}} />\r\n </div>\r\n \r\n {localFiles.length ? <table className=\"table modal-table\">\r\n <thead>\r\n <tr>\r\n <td>Name</td>\r\n <td>Path</td>\r\n <td>Start Time</td>\r\n <td>End Time</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {localFiles.map(renderLocalFiles)}\r\n </tbody>\r\n </table>: <p>There are no Local Files</p>}\r\n\r\n \r\n\r\n {nestedPlayLists.length === 0 ? <>\r\n <h3 className=\"pt-50\">No Playlists</h3>\r\n <div className=\"d-flex align-items-center\">\r\n <p>Add new playlist</p>     \r\n <IconButton tooltipText=\"Add playlist\" type=\"plus\" roundedButton={true} onClick={()=> showPlaylistModal(\"create\")} />\r\n </div>\r\n </> : <>\r\n <h3 className=\"pt-50\">Playlists</h3>\r\n <Tabs>\r\n <div className=\"tab-navigation justify-content-between gap15 f-no-wrap\">\r\n <ReactSortable\r\n list={nestedPlayLists}\r\n setList={(newState) => {onDropPlaylist(newState)}}\r\n tag=\"div\"\r\n className=\"tab-navigation\"\r\n style={{\"border\":\"none\"}}\r\n >\r\n {renderNestedPlayListTabs(nestedPlayLists)} \r\n </ReactSortable>\r\n\r\n <div className=\"d-flex align-items-center gap15 f-auto-size\">\r\n \r\n <IconButton tooltipText=\"Add playlist\" type=\"plus\" roundedButton={true} onClick={()=> showPlaylistModal(\"create\")} />\r\n\r\n <div className=\"d-flex align-items-center\">\r\n <FormCheckbox id=\"playlist-use-random\" checked={playInRandomOrder} onChange={setRandomOrderForPlaylists} />\r\n <span className=\"status-block\">\r\n {playInRandomOrder ? <span className=\"current-status online\"> Play in Random Order</span> : <span className=\"current-status offline\"> Play in Random Order</span>}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n <TabsContainer>\r\n <TabElement isActive={true}>\r\n <>\r\n <div className=\"d-flex justify-content-end align-items-center mb-20 w-100\">\r\n <Button color=\"green\" label=\"Create Group\" onClick={() => {showGroupModal(\"create\")}} /> \r\n <Button color=\"green\" label=\"Edit\" onClick={() => {showPlaylistModal(\"update\")}} /> \r\n <Button color=\"gray\" label=\"Delete\" onClick={()=>{showNestedDeleteModal()}} />\r\n </div>\r\n\r\n \r\n <div className=\"d-flex justify-content-end align-items-center w-100\">\r\n {liveStatistic ? <div className=\"media-live-statistic\">\r\n <div className=\"media-live-statistic__row\">\r\n <div className=\"\"></div>\r\n <div className=\"\"><b>Scheduled</b></div>\r\n <div className=\"\"><b>Live</b></div>\r\n </div>\r\n <div className=\"media-live-statistic__row\">\r\n <div className=\"\"><b>Campaigns</b></div>\r\n <div className=\"\">{formatDuration(liveStatistic.scheduled.campaignsDurationMs)} ({formatToPercent(liveStatistic.scheduled.campaignsPercentage)})</div>\r\n <div className=\"\">{formatDuration(liveStatistic.live.campaignsDurationMs)} ({formatToPercent(liveStatistic.live.campaignsPercentage)})</div>\r\n </div>\r\n <div className=\"media-live-statistic__row\">\r\n <div className=\"\"><b>Network Content</b></div>\r\n <div className=\"\">{formatDuration(liveStatistic.scheduled.siteContentDurationMs)} ({formatToPercent(liveStatistic.scheduled.siteContentPercentage)})</div>\r\n <div className=\"\">{formatDuration(liveStatistic.live.siteContentDurationMs)} ({formatToPercent(liveStatistic.live.siteContentPercentage)})</div>\r\n </div>\r\n <div className=\"media-live-statistic__row\">\r\n <div className=\"\"><b>Inhouse Content</b></div>\r\n <div className=\"\">{formatDuration(liveStatistic.scheduled.inhouseContentDurationMs)} ({formatToPercent(liveStatistic.scheduled.inhouseContentPercentage)})</div>\r\n <div className=\"\">{formatDuration(liveStatistic.live.inhouseContentDurationMs)} ({formatToPercent(liveStatistic.live.inhouseContentPercentage)})</div>\r\n </div>\r\n <div className=\"media-live-statistic__row\">\r\n <div className=\"\"><b>Others</b></div>\r\n <div className=\"\">{formatDuration(liveStatistic.scheduled.othersDurationMs)} ({formatToPercent(liveStatistic.scheduled.othersPercentage)})</div>\r\n <div className=\"\">{formatDuration(liveStatistic.live.othersDurationMs)} ({formatToPercent(liveStatistic.live.othersPercentage)})</div>\r\n </div>\r\n <div className=\"media-live-statistic__row\">\r\n <div className=\"\"><b>Total</b></div>\r\n <div className=\"\">{formatDuration(liveStatistic.scheduled.total)}</div>\r\n <div className=\"\">{formatDuration(liveStatistic.live.total)}</div>\r\n </div>\r\n </div> : null}\r\n </div> \r\n <div className=\"d-flex justify-content-end align-items-center gap15 w-100\">\r\n <Button color=\"green\" label={`${isListCollapsed ? \"Full List\" : \"Compact View\"}`} onClick={toggleAllCheckboxes} /> \r\n <Button color=\"green\" label={`SoV View`} onClick={goToPlaylist} /> \r\n <div className=\"d-flex align-items-center gap15\" style={{width:300}}>\r\n <label>Tags Filter</label>\r\n <Select \r\n className={`w-100`}\r\n options={tags}\r\n classNamePrefix={`select`}\r\n onChange={onSelectedTag} \r\n isClearable={true}\r\n isMulti={true}\r\n />\r\n </div>\r\n\r\n <div className=\"d-flex justify-content-end\">\r\n <FormCheckbox id=\"hide-paused-media\" checked={isShowPausedMedia} onChange={setIsShowPausedMedia} />\r\n <span className=\"status-block\" style={{overflow: 'unset', paddingTop: '3px'}}>\r\n {isShowPausedMedia ? <span className=\"current-status online\"> Show paused media</span> : <span className=\"current-status offline\"> Show paused media</span>}\r\n </span>\r\n </div>\r\n\r\n <div className=\"export-pos\">\r\n <a href={`${baseUrl}file/channels/${channelId}/nested-playlists/${activeNestedPlaylistId}/media/download-csv?${createDownloadQueryParamsString()}token=${getToken()}`} target=\"_blank\" download>Download CSV <IconButton tooltipText=\"Download\" type=\"export\" /> </a>\r\n </div> \r\n \r\n </div>\r\n\r\n {groupedMedia.length !== 0 ? <table className=\"table modal-table media-list-table\">\r\n <thead>\r\n <tr>\r\n <td></td>\r\n <td></td>\r\n <td>Name</td>\r\n <td>Type</td>\r\n <td>Campaign</td>\r\n <td>Campaign Status</td>\r\n <td>Paused In Campaign </td>\r\n <td>Content Type</td>\r\n <td>Duration</td>\r\n <td>Tags</td>\r\n <td>\r\n \r\n </td>\r\n </tr>\r\n </thead>\r\n <ReactSortable\r\n disabled={isSortDisabled()}\r\n list={groupedMedia}\r\n setList={(newState) => {\r\n setGroupedMedia(newState)\r\n }}\r\n onEnd={()=>{sendReorderedIds()}}\r\n tag=\"tbody\"\r\n animation={150}\r\n fallbackOnBody={true}\r\n swapThreshold={0.65}\r\n >\r\n {renderGroupMedia(groupedMedia)}\r\n </ReactSortable>\r\n </table> : <></>\r\n }\r\n </>\r\n </TabElement>\r\n <></>\r\n </TabsContainer>\r\n </Tabs>\r\n </>}\r\n \r\n <RightModal title={!!!streamId ? \"Add Stream\" : \"Edit Stream\"} show={showModal} onRequestClose={closeModal} >\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter name\"\r\n id = \"stream_name_input\"\r\n isError = {isStreamNameError}\r\n title = \"Stream Name\"\r\n onChangeValue = {(v) => {setStreamName(v); setIsStreamNameError(false)}}\r\n value = {streamName}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"Please select Start Time\"\r\n id=\"stream_start_time\"\r\n isError={isStreamStartTimeError}\r\n type=\"datetime-local\"\r\n onChangeValue={(v) => {setIsStreamStartTimeError(false); setStreamStartTime(v)}}\r\n value={streamStartTime}\r\n title=\"Start Time\"\r\n /> \r\n </FormRow>\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"Please select End Time\"\r\n id=\"stream_end_time\"\r\n isError={isStreamEndTimeError}\r\n type=\"datetime-local\"\r\n onChangeValue={(v) => {setIsStreamEndTimeError(false); setStreamEndTime(v)}}\r\n value={streamEndTime}\r\n title=\"End Time\"\r\n /> \r\n </FormRow> \r\n <FormRow>\r\n <label>TV Channel </label>\r\n <Select \r\n className={``}\r\n classNamePrefix={`select`}\r\n isClearable={true}\r\n options={tvChannelsList.sort((a,b) => sortByNameString(a.name, b.name))} \r\n filterOption={(option, input)=> option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option)=> `${option.id}`}\r\n onChange={onSelectedTvChannel}\r\n value={selectedTvChannel}\r\n /> \r\n </FormRow> \r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={saveStream}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeModal}/>\r\n </div>\r\n </RightModal> \r\n\r\n <RightModal title={`${localFileAction === \"create\" ? \"Add\" : \"Edit\"} Local File`} show={isShowLocalFileModal} onRequestClose={hideLocalFileModal} >\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter name\"\r\n id = \"local_file_name_input\"\r\n isError = {isLocalFileNameError}\r\n title = \"Name\"\r\n onChangeValue = {(v) => {setLocalFileName(v); setIsLocalFileNameError(false)}}\r\n value = {localFileName}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter path\"\r\n id = \"local_file_path_input\"\r\n isError = {isLocalFilePathError}\r\n title = \"File name (in the folder 'CPlayerLocalFiles')\"\r\n onChangeValue = {(v) => {setLocalFilePath(v); setIsLocalFilePathError(false)}}\r\n value = {localFilePath}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"Please select Start Time\"\r\n id=\"local_file_start_time\"\r\n isError={isLocalFileStartTimeError}\r\n type=\"datetime-local\"\r\n onChangeValue={(v) => {setIsLocalFileStartTimeError(false); setLocalFileStartTime(v)}}\r\n value={localFileStartTime}\r\n title=\"Start Time\"\r\n /> \r\n </FormRow>\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"Please select End Time, End Time shoud be later than Start Time\"\r\n id=\"local_file_start_time\"\r\n isError={isLocalFileEndTimeError}\r\n type=\"datetime-local\"\r\n onChangeValue={(v) => {setIsLocalFileEndTimeError(false); setLocalFileEndTime(v)}}\r\n value={localFileEndTime}\r\n title=\"End Time\"\r\n /> \r\n </FormRow> \r\n\r\n <FormRow>\r\n <FormInput \r\n type=\"number\"\r\n errorMessage = \"\"\r\n id = \"delay\"\r\n isError = {false}\r\n title = \"Subtitles Delay MS\"\r\n onChangeValue = {(v) => {setLocalFileDelay(v)}}\r\n value = {localFileDelay}\r\n />\r\n </FormRow> \r\n \r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={saveLocalFile}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideLocalFileModal}/>\r\n </div>\r\n </RightModal> \r\n\r\n <RightModal title=\"Add Playlist\" show={nestedPlayListAction !== \"nothing\"} onRequestClose={closePlaylistModal}>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter Playlist Name\"\r\n id = \"playlist_name_input\"\r\n isError = {isPlaylistNameError}\r\n title = \"Playlist Name\"\r\n onChangeValue = {(v) => {setPlaylistName(v); setIsPlaylistNameError(false)}}\r\n value = {playlistName}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <div className=\"d-flex align-items-center\">\r\n <FormCheckbox id=\"use-random\" checked={useRandomOrder} onChange={setUseRandomOrder} />\r\n <span className=\"status-block\">\r\n {useRandomOrder ? <span className=\"current-status online\"> Play in Random Order</span> : <span className=\"current-status offline\"> Play in Random Order</span>}\r\n </span>\r\n </div>\r\n </FormRow>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={createOrUpdatePlaylist}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closePlaylistModal}/>\r\n </div>\r\n </RightModal> \r\n\r\n <RightModal title={`${mediaGroupAction === \"create\" ? \"Add\" : \"Set\"} Group`} show={isShowGroupModal} onRequestClose={hideGroupModal}>\r\n <FormRow>\r\n {mediaGroupAction === \"set\" && <><label>Groups</label>\r\n <Select \r\n options={mediaGroups}\r\n classNamePrefix={`select`}\r\n onChange={onChangeSelectedMediaGroup} \r\n isClearable={true}\r\n /></>}\r\n {(mediaGroupAction === \"create\" || mediaGroupAction === \"update\") && <FormInput \r\n errorMessage = \"Please enter Group Name\"\r\n id = \"media_group_name\"\r\n isError = {isGroupNameError}\r\n title = \"Group Name\"\r\n onChangeValue = {(v) => {setGroupName(v); setIsGroupNameError(false)}}\r\n value = {groupName}\r\n />}\r\n </FormRow>\r\n <div className=\"modal-btn-group\">\r\n {mediaGroupAction === \"set\" && <Button color=\"green\" label=\"Save\" onClick={saveGroupForMedia}/>}\r\n {mediaGroupAction === \"update\" && <Button color=\"green\" label=\"Save\" onClick={updateGroupName}/>}\r\n {mediaGroupAction === \"create\" && <Button color=\"green\" label=\"Add\" onClick={createNewGroupForMedia}/>}\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideGroupModal}/>\r\n </div>\r\n </RightModal> \r\n\r\n <SmallModal show={isShowNestedPlaylistDeleteModal} onRequestClose={closeNestedDeleteModal}> \r\n <p>That you want to delete Playlist <b>{getActiveNestedPlayList()?.name}</b>?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeNestedDeleteModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={deleteNestedPlaylist}/>\r\n </div>\r\n </SmallModal>\r\n\r\n <SmallModal show={isShowLocalFileDeleteModal} onRequestClose={closeLocalFileDeleteModal}> \r\n <p>That you want to delete Local File?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeLocalFileDeleteModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={removeLocalFile}/>\r\n </div>\r\n </SmallModal>\r\n\r\n <SmallModal show={isShowGroupConfirmModal} onRequestClose={closeGroupConfirmModal}> \r\n <p>That you want to {`${groupModalAction}`} Group?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeGroupConfirmModal}/>\r\n {groupModalAction === \"clone\" && <Button color=\"green\" label=\"Yes\" onClick={cloneGroup}/>}\r\n {groupModalAction === \"delete\" && <Button color=\"green\" label=\"Yes\" onClick={deleteGroup}/>}\r\n </div>\r\n </SmallModal>\r\n\r\n <GlobalSpinner isShow={isLoading}/>\r\n </>\r\n </InnerLayout>\r\n </>\r\n );\r\n}\r\n \r\nexport default withRouter(ChannelMedia);\r\n\r\nfunction getTvChannels() {\r\n throw new Error(\"Function not implemented.\");\r\n}\r\n","import axios from \"axios\"\r\nimport { getToken, Permission } from \"./authApi\"\r\nimport { ApiResponse, BaseCreateResponse, BaseInfo, BaseResponse, BaseResponseWithData, baseUrl, deleteWithAuth, getWithAuth, Guid, ListRespone, patchWithAuth, postWithAuth, postWithAuthWitoutParams } from \"./baseApi\"\r\n\r\n\r\nexport enum AlertType {\r\n //1. System Related (Send email instantly)\r\n NewPlayerRegistered = 1,\r\n PlayerOfflineContinuouslyRorMoreThan5mins = 2,\r\n PlayerOnline = 3,\r\n PlayerUpdatedToNewVersion = 4,\r\n PlayerCrash = 5,\r\n PlayerFreezeForMoreThan30Seconds = 6,\r\n PlayerRestartedByCplayerGuardian = 7,\r\n PlayerCPUUtilizationAbove75PercentContinuouslyAfter3Mins = 8,\r\n PlayerGPUUtilizationAbove60PercentContinuouslyAfter3Mins = 9,\r\n PlayerDiskUtilizationAbove75PercentContinuouslyAfter3Mins = 10,\r\n PlayerNotResponding = 11,\r\n PlayerRestartedByRequest = 12,\r\n PlayerRestartedByFreeze = 13,\r\n Dolby = 14,\r\n RainbowScreen = 15,\r\n\r\n //2. User related(Send email instantly)\r\n NewUserAdded = 101,\r\n UserDisabled = 102,\r\n UserEnabled = 103,\r\n \r\n //3. Campaign related(Group every below email by 5 mins?)\r\n NewCampaignCreated = 201,\r\n CampaignStartedByTheStartDate = 202,\r\n CampaignPlayedByThePlayButton = 203,\r\n CampaignFinishedByTheEndDate = 204,\r\n CampaignStoppedByTheStopButton = 205,\r\n CampaignAchievedByTheArchiveButton = 206,\r\n CampaignStillInDraftMode24hoursAdvancedAlertPriorToStartDate = 207,\r\n CampaignHasNoMediaAssets48HoursAdvancedAlertPriorToStartDate = 208,\r\n\r\n //4. Site related(Group every below email by 5 mins?)\r\n NewSiteCreated = 301,\r\n NewPlayerAddedToTheSite = 302,\r\n NewPlayerRemovedFromTheSite = 303,\r\n NewPlaylistAddedUnderASite = 304,\r\n PlaylistDeletedUnderASite = 305,\r\n\r\n}\r\n\r\nexport type User = {\r\n id: string,\r\n name : string,\r\n email: string,\r\n permissions: Permission[]\r\n isSuspended: boolean\r\n}\r\n\r\nexport type CreateUserRequest = {\r\n name : string,\r\n email: string,\r\n password: string,\r\n permissions: Permission[]\r\n}\r\n\r\nexport type UpdateUserRequest = {\r\n name : string,\r\n email: string,\r\n permissions: Permission[]\r\n}\r\n\r\nexport type UpdateUserNotificationsRequest = {\r\n notificationTypes: AlertType[]\r\n}\r\n\r\nexport type ChangePasswordRequest = { \r\n password: string\r\n}\r\n\r\nexport type ChangeUsernameRequest = { \r\n username: string\r\n}\r\n\r\nexport const getUsersList = async() : Promise<ApiResponse<ListRespone<User>>> => {\r\n return await getWithAuth<ListRespone<User>>({url : `${baseUrl}users`});\r\n}\r\n\r\nexport const getUser = async(id: Guid) : Promise<ApiResponse<User>> => {\r\n return await getWithAuth<User>({url : `${baseUrl}users/${id}`});\r\n}\r\n\r\nexport const getUserNotifications = async(id: Guid) : Promise<ApiResponse<ListRespone<AlertType>>> => {\r\n return await getWithAuth<ListRespone<AlertType>>({url : `${baseUrl}users/${id}/notifications`});\r\n}\r\n\r\nexport const createUser = async ( request:CreateUserRequest) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<CreateUserRequest,BaseCreateResponse>(`${baseUrl}users`, request);\r\n}\r\n\r\nexport const updateUser = async (id: Guid, request:UpdateUserRequest) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await patchWithAuth<UpdateUserRequest,BaseCreateResponse>(`${baseUrl}users/${id}`, request);\r\n}\r\n\r\nexport const updateUserNotifications = async (id: Guid, request:UpdateUserNotificationsRequest) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await patchWithAuth<UpdateUserNotificationsRequest,BaseCreateResponse>(`${baseUrl}users/${id}/notifications`, request);\r\n}\r\n\r\nexport const deleteUser = async (id: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}users`, id)\r\n}\r\n\r\nexport const suspendUser = async (id: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuthWitoutParams<BaseResponse>(`${baseUrl}users/${id}/suspend`);\r\n}\r\n\r\nexport const unSuspendUser = async (id: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuthWitoutParams<BaseResponse>(`${baseUrl}users/${id}/unsuspend`);\r\n}\r\n\r\n\r\nexport const changeUserPassword = async (request: ChangePasswordRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<ChangePasswordRequest, BaseResponse>(`${baseUrl}users/password`, request);\r\n}\r\n\r\nexport const changeUsername = async (request: ChangeUsernameRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<ChangeUsernameRequest, BaseResponse>(`${baseUrl}users/username`, request);\r\n}\r\n\r\n\r\nexport const updateProfilePicture = async (formData: any) : Promise<string> => {\r\n await axios.post(`${baseUrl}users/profilePicture`, formData, {\r\n headers: {\r\n 'Content-Type': 'multipart/form-data',\r\n 'Authorization' : getToken()\r\n }, \r\n });\r\n\r\n return \"ok\";\r\n}\r\n\r\nexport const getProfilePicture = async () : Promise<ApiResponse<BaseResponseWithData<string>>> => {\r\n return await getWithAuth<BaseResponseWithData<string>>({url : `${baseUrl}users/profilePicture`});\r\n}\r\n\r\n\r\n","import { FunctionComponent, useEffect, useRef, useState } from \"react\";\r\nimport { RouteComponentProps, withRouter } from \"react-router-dom\";\r\nimport { BaseInfo, Guid } from \"../../../api/baseApi\";\r\nimport { getBaseChannelsForPriorityList, TimeSlotModel } from \"../../../api/channelsApi\";\r\nimport { createScheduledPriorityList, CreateScheduledPriorityListRequest, deleteScheduledList, disableScheduledList, enableScheduledList, enableScheduledListTimeSlot, getScheduledListTimeSlots, getScheduledPriorityLists, removeScheduledListTimeSlots, ScheduledPriorityList, ScheduledPriorityListStatus, updateScheduledPriorityList, UpdateScheduledPriorityListRequest } from \"../../../api/priorityListApi\";\r\nimport { createPathWithId, Routes } from \"../../../constants/routes\";\r\nimport { Button } from \"../../components/Button\";\r\nimport FormCheckbox from \"../../components/formRow/FormCheckbox\";\r\nimport FormMultiSelect from \"../../components/formRow/FormMultiSelect\";\r\nimport { FormInput, FormInputNumber, FormRow, SelectOption } from \"../../components/formRow/FormRow\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport IconButton from \"../../components/iconButton/IconButton\";\r\nimport Schedule from \"../../components/schedule/Schedule\";\r\nimport { CenterModal, RightModal, SmallModal } from \"../../components/sideModal/Modal\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport Pagination from \"../../components/pagination/Pagination\";\r\nimport { getPagesCount } from \"../../../services/paginator\";\r\n\r\ninterface PriorityListProps extends RouteComponentProps<any>{\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n \r\nconst PriorityList: FunctionComponent<PriorityListProps> = (props : PriorityListProps) => {\r\n let [lists, setLists] = useState<ScheduledPriorityList[]>([]);\r\n let [channels, setChannels] = useState<BaseInfo[]>([]);\r\n let [channelOptions, setChannelOptions] = useState<SelectOption[]>([]);\r\n\r\n let [showModal, setShowModal] = useState<boolean>(false);\r\n let [isLoading, setIsloading] = useState<boolean>(false);\r\n\r\n let [listName, setListName] = useState<string>(\"\");\r\n let [listNameError, setListNameError] = useState<boolean>(false);\r\n let [selectedChannels, setSelectedChannels] = useState<Guid[]>([]);\r\n let [listIdForEdit, setListIdForEdit] = useState<Guid>();\r\n\r\n let [showTimeSlotModal, setShowTimeSlotModal] = useState<boolean>(false);\r\n let [timeSlots, setTimeSlots] = useState<TimeSlotModel[]>([]);\r\n let [timeSlotChannelId, setTimeSlotChannelId] = useState<Guid>(\"\");\r\n\r\n let [currentPagePriority, setCurrentPagePriority] = useState<number>(1);\r\n\r\n let [itemIdForDelete, setItemIdForDelete] = useState<Guid>('');\r\n let [itemNameForDelete, setItemNameForDelete] = useState<string>('');\r\n let [isShowSmallModalDeleteScheduledList, setIsShowSmallModalDeleteScheduledList] = useState(false);\r\n \r\n let [listItemsToDisplay, setListItemsToDisplay] = useState<ScheduledPriorityList[]>([])\r\n \r\n let itemsPerPage = 20;\r\n\r\n useEffect(() => {\r\n async function fetchData() {\r\n setIsloading(true);\r\n await Promise.all([getList(),getChannelsForList()]);\r\n setIsloading(false);\r\n };\r\n fetchData();\r\n }, []);\r\n\r\n useEffect(() => {\r\n let startIndex = (currentPagePriority - 1)*itemsPerPage;\r\n let finishIndex = startIndex + itemsPerPage;\r\n setListItemsToDisplay(lists.slice(startIndex, finishIndex));\r\n }, [lists, currentPagePriority]);\r\n\r\n let getList = async () => {\r\n setIsloading(true);\r\n var result = await getScheduledPriorityLists();\r\n if(result.type == 'succes'){\r\n setLists(result.data.items);\r\n }\r\n setIsloading(false);\r\n }\r\n\r\n let getChannelsForList = async () => {\r\n var channelsResult = await getBaseChannelsForPriorityList();\r\n if(channelsResult.type == \"succes\"){\r\n setChannels(channelsResult.data.items);\r\n }\r\n }\r\n\r\n\r\n const showCreateModal = () => {\r\n setChannelOptions(channels.map(mapChannelToOption));\r\n setShowModal(true);\r\n }\r\n\r\n const showEditModal = (list: ScheduledPriorityList) => {\r\n setChannelOptions([...channels, ...list.channels].map(mapChannelToOption));\r\n setListName(list.name);\r\n setSelectedChannels(list.channels.map(it => it.id));\r\n setListIdForEdit(list.id);\r\n setShowModal(true);\r\n }\r\n\r\n const closeModal = () => {\r\n setListIdForEdit(undefined);\r\n setListName('');\r\n setSelectedChannels([]);\r\n setShowModal(false);\r\n }\r\n\r\n const mapChannelToOption = (it: BaseInfo) : SelectOption => {\r\n return {value: it.id, name: it.name};\r\n }\r\n\r\n const onAddChannel = (id: Guid) => {\r\n setSelectedChannels([...selectedChannels, id]);\r\n } \r\n\r\n const onRemoveChannel = (id: Guid) => {\r\n setSelectedChannels(selectedChannels.filter(it => it !== id));\r\n }\r\n\r\n const saveList = async () => {\r\n if(listName === \"\" || listName === undefined){\r\n setListNameError(true);\r\n return;\r\n }\r\n if(listIdForEdit === undefined){\r\n let request : CreateScheduledPriorityListRequest = { \r\n channelIds: selectedChannels, \r\n name: listName, \r\n };\r\n await createScheduledPriorityList(request);\r\n setListName('');\r\n setSelectedChannels([]);\r\n }\r\n else{\r\n let request : UpdateScheduledPriorityListRequest = { \r\n channelIds: selectedChannels, \r\n name: listName, \r\n id: listIdForEdit,\r\n };\r\n await updateScheduledPriorityList(request);\r\n setListName('');\r\n setSelectedChannels([]);\r\n }\r\n await getList();\r\n await getChannelsForList();\r\n closeModal();\r\n }\r\n\r\n const openScheduleModal = async (id: Guid) => {\r\n setTimeSlotChannelId(id);\r\n let timeSlotsRequest = await getScheduledListTimeSlots(id);\r\n if(timeSlotsRequest.type == \"succes\"){\r\n setTimeSlots(timeSlotsRequest.data.items);\r\n setShowTimeSlotModal(true);\r\n }\r\n } \r\n\r\n const onTimeSlotAdd = async (timeSlot: TimeSlotModel) => {\r\n var result = await enableScheduledListTimeSlot({...timeSlot}, timeSlotChannelId);\r\n if(result.type == \"succes\"){\r\n setTimeSlots([...timeSlots, {...timeSlot, id: result.data.id}]); \r\n }\r\n }\r\n\r\n const onTimeSlotRemove = async (id: Guid) => {\r\n await removeScheduledListTimeSlots(timeSlotChannelId, id);\r\n setTimeSlots(timeSlots.filter(it => it.id !== id)); \r\n }\r\n\r\n const renderStatus = (status: ScheduledPriorityListStatus) => {\r\n switch(status){\r\n case ScheduledPriorityListStatus.Active : return <span className=\"status-active\">Active</span>\r\n case ScheduledPriorityListStatus.Inactive : return <span className=\"status-paused\">Inactive</span>\r\n }\r\n }\r\n\r\n const activate = async (id: Guid) => {\r\n await enableScheduledList(id);\r\n await getList();\r\n }\r\n\r\n const inactivate = async (id: Guid) => {\r\n await disableScheduledList(id);\r\n await getList();\r\n }\r\n\r\n const deleteScheduledPriorityList = async (id:Guid) => {\r\n setIsloading(true);\r\n setItemIdForDelete(id);\r\n await deleteScheduledList(id);\r\n await getList();\r\n await getChannelsForList();\r\n closeSmallModalScheduled();\r\n setIsloading(false);\r\n }\r\n\r\n const renderRow = (item: ScheduledPriorityList) => {\r\n return <tr key={item.id}>\r\n <td>{item.name}</td>\r\n <td>{item.channels.map(it => <p key={it.id}>{it.name}</p>)}</td>\r\n <td>{renderStatus(item.status)}</td>\r\n <td> \r\n <IconButton tooltipText=\"Schedule\" type=\"clock\" onClick={() => openScheduleModal(item.id)} />\r\n { \r\n item.status == ScheduledPriorityListStatus.Active \r\n && <IconButton tooltipText=\"Stop\" type=\"stop-play\" onClick={() => inactivate(item.id)} />\r\n }\r\n { \r\n item.status == ScheduledPriorityListStatus.Inactive \r\n && <IconButton tooltipText=\"Play\" type=\"play\" onClick={() => activate(item.id)} />\r\n }\r\n \r\n <IconButton tooltipText=\"Edit\" type=\"edit\" onClick={() => { showEditModal(item)}}/>\r\n <IconButton tooltipText=\"Media\" type=\"list-add\" onClick={()=>{props.history.push(createPathWithId(Routes.PriorityList, item.id))}}/>\r\n <IconButton tooltipText=\"Delete\" type=\"delete\" onClick={()=>showSmallModalScheduled(item.id, item.name)} />\r\n </td>\r\n </tr>\r\n }\r\n\r\n const showSmallModalScheduled = (id:Guid, name: string) => {\r\n setItemIdForDelete(id);\r\n setItemNameForDelete(name);\r\n setIsShowSmallModalDeleteScheduledList(true);\r\n }\r\n\r\n const closeSmallModalScheduled = () => {\r\n setItemIdForDelete('');\r\n setItemNameForDelete('');\r\n setIsShowSmallModalDeleteScheduledList(false);\r\n }\r\n\r\n return ( \r\n <InnerLayout \r\n isCollapsed={props.isCollapsed}\r\n logOut={props.logOut}\r\n toogleCollapse={props.toogleCollapse}\r\n activeTab=\"priorityList\">\r\n <>\r\n <div className=\"d-flex justify-content-between align-items-center mb-20 pt-50\">\r\n <h2>Streaming</h2>\r\n <Button color=\"green\" label=\"Add Streaming\" onClick={showCreateModal} />\r\n </div>\r\n <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Name</td>\r\n <td>Networks </td>\r\n <td>Status</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {listItemsToDisplay.map(it => renderRow(it))}\r\n </tbody>\r\n </table>\r\n \r\n <Pagination activePage={currentPagePriority} pagesCount={getPagesCount(lists.length, itemsPerPage)} changePaginationPage={setCurrentPagePriority} />\r\n\r\n <RightModal title={listIdForEdit === undefined ? \"Add Streaming\" : \"Edit Streaming\"} \r\n show={showModal}\r\n onRequestClose={closeModal}\r\n >\r\n <FormRow>\r\n <FormInput \r\n id=\"campaign-name\"\r\n title=\"Streaming Name\"\r\n isError={listNameError}\r\n errorMessage=\"Please enter Streaming Name\"\r\n onChange={e => { setListName(e.target.value); setListNameError(false);}}\r\n value={listName}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormMultiSelect\r\n id=\"players-list2\"\r\n title=\"Networks\"\r\n titleSelected=\"Selected Networks\"\r\n isError={false}\r\n errorMessage=\"Please select Networks\"\r\n onAdd={onAddChannel}\r\n onRemove={onRemoveChannel}\r\n options={channelOptions}\r\n selectedOptions={selectedChannels}\r\n />\r\n </FormRow> \r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={saveList}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeModal}/>\r\n </div>\r\n </RightModal>\r\n\r\n <CenterModal title=\"Scheduled Priority List\" show={showTimeSlotModal} onRequestClose={() => setShowTimeSlotModal(false)} >\r\n <Schedule \r\n timeSlots={timeSlots} \r\n onTimeSlotAdd={onTimeSlotAdd} \r\n onTimeSlotRemove={onTimeSlotRemove} \r\n />\r\n </CenterModal> \r\n\r\n <SmallModal show={isShowSmallModalDeleteScheduledList} onRequestClose={closeSmallModalScheduled}> \r\n <p>That you want to delete list <b>{itemNameForDelete}</b>?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeSmallModalScheduled}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={()=>deleteScheduledPriorityList(itemIdForDelete)}/>\r\n </div>\r\n </SmallModal>\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n \r\n </InnerLayout> );\r\n}\r\n \r\nexport default withRouter(PriorityList);","import { FunctionComponent, useEffect, useState } from \"react\";\r\nimport { useLocation, useParams } from \"react-router-dom\";\r\nimport { MultiValue, SingleValue } from \"react-select\";\r\nimport Select from \"react-select\";\r\nimport { ReactSortable } from \"react-sortablejs\";\r\nimport { BaseInfo, Guid } from \"../../../api/baseApi\";\r\nimport { ChannelStream, CreateChannelStreamRequest as CreateStreamRequest, ReorderItemPair } from \"../../../api/channelsApi\";\r\nimport { getMedia, MediaModel, MediaType } from \"../../../api/mediaApi\";\r\nimport { addMediaToScheduledPriorityNestedPlayList, addPriorityListMediaSchedule, CreateRecurrentPriorityListStreamRequest, createScheduledListRecurrentStream, createScheduledListStream, CreateScheduledPriorityListStreamRequest, createScheduledPriorityNestedPlayList, deletePriorityListMediaSchedule, deleteScheduledListRecurrentStream, deleteScheduledListStream, deleteScheduledPriorityNestedPlayList, deleteScheduledPriorityNestedPlayListMedia, disableSkinPriorityListMedia, disableSkinPriorityListStream, disableSkinScheduledListRecurrentStream, enableSkinPriorityListMedia, enableSkinPriorityListStream, enableSkinScheduledListRecurrentStream, getPriorityListMediaSchedule, getScheduledListRecurrentStreams, getScheduledListStreams, getScheduledPriorityNestedPlayListMedias, getScheduledPriorityNestedPlayLists, NestedPlayList, PriorityListMediaFlydatesRequest, PriorityListMediaSchedule, PriorityListMediaScheduleRequest, RecurrentPriorityListStream, reorderScheduledPriorityNestedPlayListMedia, ScheduledPriorityListAddMediaRequest, ScheduledPriorityListMedia, ScheduledPriorityListStream, updateScheduledListRecurrentStream, updateScheduledListStream, updateScheduledPriorityNestedPlayList, WeekDays } from \"../../../api/priorityListApi\";\r\nimport { addLeadingZero, formatDuration, renderMediaType, sortByNameString } from \"../../../services/common\";\r\nimport { formatDate, formatTime, formatTimeOnly } from \"../../../services/dateService\";\r\nimport { Button } from \"../../components/Button\";\r\nimport FormCheckbox from \"../../components/formRow/FormCheckbox\";\r\nimport { FormInput, FormInputNumber, FormRow, FormRowHorizontal, FormRowWithColumns } from \"../../components/formRow/FormRow\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport IconButton from \"../../components/iconButton/IconButton\";\r\nimport Search from \"../../components/search/Search\";\r\nimport { CenterModal, RightModal, SmallModal } from \"../../components/sideModal/Modal\";\r\nimport SvgSelector from \"../../components/svgSelector/SvgSelector\";\r\nimport Tabs, { TabElement, TabNavigation, TabNavigationElement, TabsContainer } from \"../../components/tab/Tab\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport { getTVChannels, TVChannel } from \"../../../api/tvChannelApi\";\r\nimport { getTags } from \"../../../api/tagApi\";\r\nimport Pagination from \"../../components/pagination/Pagination\";\r\nimport { getPagesCount } from \"../../../services/paginator\";\r\nimport moment from \"moment\";\r\n\r\ninterface PriorityListMediaParams {\r\n listId: Guid\r\n}\r\n\r\ninterface PriorityListMediaProps {\r\n logOut: () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n\r\ntype Option<T> = { value: T, label: string} \r\ntype NestedPlayListAction = \"create\" | \"update\" | \"nothing\";\r\n\r\nlet weekDaysStart: WeekDays = {\r\n monday: false,\r\n tuesday: false,\r\n wednesday: false,\r\n thursday: false,\r\n friday: false,\r\n saturday: false,\r\n sunday: false\r\n}\r\n\r\nconst PriorityListMedia: FunctionComponent<PriorityListMediaProps> = (props: PriorityListMediaProps) => {\r\n\r\n\r\n let { listId } = useParams<PriorityListMediaParams>();\r\n\r\n let [isLoading, setIsLoading] = useState<boolean>(false);\r\n let [showMediaModal, setShowMediaModal] = useState<boolean>(false);\r\n\r\n let [searchString, setSearchString] = useState<string>(\"\");\r\n let [media, setMedia] = useState<MediaModel[]>([]);\r\n let [currentPage, setCurrentPage] = useState<number>(1);\r\n let [selectedMedia, setSelectedMedia] = useState<{ id: string, index: number }[]>([]);\r\n let [listMedia, setListMedia] = useState<ScheduledPriorityListMedia[]>([]);\r\n\r\n let [streams, setStreams] = useState<ScheduledPriorityListStream[]>([]);\r\n let [showModalStream, setShowModalStream] = useState<boolean>(false);\r\n let [streamName, setStreamName] = useState<string>(\"\");\r\n let [isStreamNameError, setIsStreamNameError] = useState<boolean>(false);\r\n let [isStartDateError, setIsStartDateError] = useState<boolean>(false);\r\n let [isEndtDateError, setIsEndDateError] = useState<boolean>(false);\r\n let [streamStartTime, setStreamStartTime] = useState<string>(\"\");\r\n let [streamEndTime, setStreamEndTime] = useState<string>(\"\");\r\n let [streamId, setStreamId] = useState<Guid>();\r\n let [isStreamPeriodError, setIsStreamPeriodError] = useState(false);\r\n\r\n let [recurrentStreams, setRecurrentStreams] = useState<RecurrentPriorityListStream[]>([]);\r\n let [recurrentStreamWeekDays, setRecurrentStreamWeekDays] = useState<WeekDays>(weekDaysStart);\r\n let [recurrentStreamStartDate, setRecurrentStreamStartDate] = useState('');\r\n let [isRecurrentStreamStartDateError, setIsRecurrentStreamStartDateError] = useState(false);\r\n let [recurrentStreamEndDate, setRecurrentStreamEndDate] = useState<string | null>('');\r\n let [isRecurrentStreamEndDateError, setIsRecurrentStreamEndDateError] = useState(false);\r\n let [recurrentStreamStartTime, setRecurrentStreamStartTime] = useState('');\r\n let [isRecurrentStreamStartTimeError, setIsRecurrentStreamStartTimeError] = useState(false);\r\n let [recurrentStreamEndTime, setRecurrentStreamEndTime] = useState('');\r\n let [isRecurrentStreamEndTimeError, setIsRecurrentStreamEndTimeError] = useState(false);\r\n let [showModalRecurrentStream, setShowModalRecurrentStream] = useState<boolean>(false);\r\n let [streamIdForDelete, setStreamIdForDelete] = useState<Guid>('');\r\n let [isShowDeleteRecurrentStreamModal, setIsShowDeleteRecurrentStreamModal] = useState(false)\r\n\r\n let [isUseNestedPlaylist, setIsUseNestedPlaylist] = useState(false);\r\n let [nestedPlaylistPeriod, setNestedPlaylistPeriod] = useState<number | string>(15);\r\n let [isShowScheduleModal, setIsShowScheduleModal] = useState(false);\r\n let [isPeriodStartError, setIsPeriodStartError] = useState(false);\r\n let [isPeriodEndError, setIsPeriodEndError] = useState(false);\r\n let [periodStart, setPeriodStart] = useState('');//2022-09-28T16:38\r\n let [periodEnd, setPeriodEnd] = useState('');//2022-09-29T16:38\r\n let [currentMediaId, setCurrentMediaId] = useState<Guid>(\"\");\r\n\r\n let [streamEditAction, setStreamAction] = useState<string>(\"\");\r\n let [saveStreamErrorText, setSaveStreamErrorText] = useState<string>(\"\");\r\n\r\n let [totalDuration, setTotalDuration] = useState<number>(0);\r\n\r\n let [playlistName, setPlaylistName] = useState(\"\");\r\n let [isPlaylistNameError, setIsPlaylistNameError] = useState(false);\r\n let [isUseRandomOrder, setIsUseRandomOrder] = useState(false);\r\n let [nestedPlayListAction, setNestedPlayListAction] = useState<NestedPlayListAction>(\"nothing\");\r\n \r\n let [nestedPlayLists, setNestedPlayLists] = useState<NestedPlayList[]>([]);\r\n let [activeNestedPlaylistId, setActiveNestedPlayListId] = useState<Guid>(\"\");\r\n let [isShowNestedPlaylistDeleteModal, setIsShowNestedPlaylistDeleteModal] = useState(false);\r\n let [selectedNestedPlaylist, setSelectedNestedPlaylist ] = useState<SingleValue<Option<Guid>>>(null);\r\n let [selectedPreRollPlaylist, setSelectedPreRollPlaylist ] = useState<SingleValue<Option<Guid>>>(null);\r\n let [selectedPostRollPlaylist, setSelectedPostRollPlaylist ] = useState<SingleValue<Option<Guid>>>(null);\r\n\r\n let [tvChannelsList, setTvChannelsList] = useState<TVChannel[]>([]);\r\n let [selectedTvChannel, setSelectedTvChannel] = useState<SingleValue<TVChannel>>(null);\r\n\r\n\r\n let [isShowDeletePriorityListMediaScheduleModal, setIsShowDeletePriorityListMediaScheduleModal] = useState(false)\r\n let [priorityListMediaSchedule, setPriorityListMediaSchedule] = useState<PriorityListMediaSchedule[]>([])\r\n let [mediaPeriodName, setMediaPeriodName] = useState('');\r\n let [isMediaPeriodNameError, setIsMediaPeriodNameError] = useState(false);\r\n let [mediaPeriodStart, setMediaPeriodStart] = useState('');\r\n let [isMediaPeriodStartError, setIsMediaPeriodStartError] = useState(false);\r\n let [mediaPeriodEnd, setMediaPeriodEnd] = useState('');\r\n let [isMediaPeriodEndError, setIsMediaPeriodEndError] = useState(false);\r\n let [mediaPeriodStartTime, setMediaPeriodStartTime] = useState('');\r\n let [mediaPeriodEndTime, setMediaPeriodEndTime] = useState('');\r\n let [isMediaPeriodEndTimeError, setIsMediaPeriodEndTimeError] = useState(false);\r\n let [mediaShedulePeriodId, setMediaShedulePeriodId] = useState('')\r\n\r\n let [tags,setTags] = useState<BaseInfo[]>([]);\r\n let [includedTags, setIncludedTags] = useState<BaseInfo[]>([]);\r\n let [excludedTags, setExcludedTags] = useState<BaseInfo[]>([]);\r\n\r\n let [isUseOrRelationshipInPriorityStream, setIsUseOrRelationshipInPriorityStream] = useState(false);\r\n let [isUseOrRelationshipInRepeatStream, setIsUseOrRelationshipInRepeatStream] = useState(false);\r\n\r\n let [series, setSeries] = useState('');\r\n let [season, setSeason] = useState('');\r\n let [episode, setEpisode] = useState('');\r\n let [title, setTitle] = useState('');\r\n let [iabCat, setIabCat] = useState('');\r\n let [genre, setGenre] = useState('');\r\n let [streamRating, setStremRaiting] = useState('')\r\n\r\n const activeStreamIdHighlight = useLocation<Guid>();\r\n\r\n let mediaItemsPerPage = 12;\r\n \r\n useEffect(() => {\r\n let getData = async () => {\r\n setIsLoading(true);\r\n await Promise.all([updateMediaWitoutPlayouts(), updateTvChannels(), updateStreams(), updateNestedPlayLists(), updateRecurrentStreams(), updateTags()])\r\n setIsLoading(false);\r\n };\r\n \r\n getData();\r\n }, []);\r\n \r\n useEffect(()=>{\r\n let getNestedMedias = async () =>{\r\n await updateNestedPlayListMedias();\r\n }\r\n if(activeNestedPlaylistId) getNestedMedias();\r\n },[activeNestedPlaylistId])\r\n \r\n useEffect(()=>{\r\n if(periodStart === \"\") setPeriodEnd(\"\")\r\n setIsPeriodStartError(false);\r\n setIsPeriodEndError(false)\r\n },[periodStart, periodEnd])\r\n\r\n useEffect(()=>{\r\n if(new Date(streamEndTime) <= new Date(streamStartTime)){\r\n setIsStreamPeriodError(true);\r\n } else {setIsStreamPeriodError(false);}\r\n },[streamStartTime, streamEndTime])\r\n \r\n const updateMediaWitoutPlayouts = async () => {\r\n let mediaRequest = await getMedia();\r\n if (mediaRequest.type == \"succes\") {\r\n setMedia(mediaRequest.data.medias);\r\n }\r\n }\r\n\r\n const updateTags = async () => {\r\n let tagResponse = await getTags();\r\n if(tagResponse.type == \"succes\") {\r\n setTags(tagResponse.data.items)\r\n }\r\n }\r\n\r\n let getActiveNestedPlayList = () => nestedPlayLists.find(it => it.id == activeNestedPlaylistId);\r\n \r\n const updateNestedPlayLists = async () => {\r\n setIsLoading(true);\r\n let nestedPlayListResponse = await getScheduledPriorityNestedPlayLists(listId);\r\n if (nestedPlayListResponse.type == \"succes\") {\r\n setNestedPlayLists(nestedPlayListResponse.data.items);\r\n let activeNestedPlayList = nestedPlayListResponse.data.items.find(it => it.id == activeNestedPlaylistId);\r\n if(!activeNestedPlayList){\r\n if(nestedPlayListResponse.data.items.length){\r\n setActiveNestedPlayListId(nestedPlayListResponse.data.items[0].id);\r\n } \r\n else setActiveNestedPlayListId(\"\");\r\n } \r\n }\r\n\r\n setIsLoading(false);\r\n }\r\n\r\n const updateNestedPlayListMedias = async () => {\r\n setIsLoading(true);\r\n let response = await getScheduledPriorityNestedPlayListMedias(listId, activeNestedPlaylistId);\r\n if (response.type == \"succes\") {\r\n setListMedia(response.data.items);\r\n setTotalDuration(response.data.items.map(it => it.durationMs).reduce((a, b) => a+b, 0));\r\n }\r\n\r\n setIsLoading(false);\r\n }\r\n\r\n const updateTvChannels = async () => {\r\n let response = await getTVChannels();\r\n if( response.type === \"succes\") {\r\n setTvChannelsList(response.data.items);\r\n }\r\n }\r\n\r\n const getNestedPlayListObj = (id:Guid | null) =>{\r\n let result = nestedPlayLists.find(it => it.id === id);\r\n console.log(\"Result\", nestedPlayLists, \" = \", id)\r\n if(result) return {value: result.id, label:result.name};\r\n else return null;\r\n }\r\n\r\n const updateStreams = async () => {\r\n var streamsResponse = await getScheduledListStreams(listId);\r\n if(streamsResponse.type == \"succes\") {\r\n setStreams(streamsResponse.data.items);\r\n }\r\n }\r\n\r\n const updateRecurrentStreams = async () => {\r\n var streamsResponse = await getScheduledListRecurrentStreams(listId);\r\n if(streamsResponse.type == \"succes\") {\r\n setRecurrentStreams(streamsResponse.data.items);\r\n }\r\n }\r\n\r\n const getFilteredBySearch = () => {\r\n return searchString === ''\r\n ? media\r\n : media.filter(it => !!it.name && it.name.toLowerCase().includes(searchString.toLowerCase()))\r\n }\r\n\r\n const getMediaItemsToDisplay = () => {\r\n var filteredBySearch = getFilteredBySearch();\r\n let startIndex = (currentPage - 1) * mediaItemsPerPage;\r\n let finishIndex = startIndex + mediaItemsPerPage;\r\n return filteredBySearch.slice(startIndex, finishIndex)\r\n }\r\n\r\n const getNumberOfSelectedMedia = (id: string): number | undefined => {\r\n var element = selectedMedia.find(it => it.id === id);\r\n return element && element.index;\r\n }\r\n\r\n const addOrRemove = (id: Guid) => {\r\n var selectedMediaCopy = [...selectedMedia];\r\n for (var i = 0; i < selectedMediaCopy.length; i++) {\r\n if (selectedMediaCopy[i].id === id) {\r\n selectedMediaCopy.splice(i, 1);\r\n for (var decreaseId = i; decreaseId < selectedMediaCopy.length; decreaseId++) {\r\n selectedMediaCopy[decreaseId].index = selectedMediaCopy[decreaseId].index - 1;\r\n }\r\n setSelectedMedia(selectedMediaCopy);\r\n return;\r\n }\r\n }\r\n\r\n var maxIndex = selectedMediaCopy.length === 0 ? 0 : Math.max(...selectedMediaCopy.map(it => it.index));\r\n selectedMediaCopy.push({ id: id, index: maxIndex + 1 });\r\n setSelectedMedia(selectedMediaCopy);\r\n }\r\n\r\n const closeModal = () => {\r\n setSelectedMedia([]);\r\n setSearchString(\"\");\r\n setShowMediaModal(false);\r\n }\r\n\r\n const addMedia = async () => {\r\n let request: ScheduledPriorityListAddMediaRequest = { mediaIds: selectedMedia.map(it => it.id) };\r\n await addMediaToScheduledPriorityNestedPlayList(listId, activeNestedPlaylistId, request);\r\n await updateNestedPlayListMedias();\r\n closeModal();\r\n }\r\n\r\n const enableSkin = async (mediaId: Guid) => {\r\n setIsLoading(true);\r\n await enableSkinPriorityListMedia(listId, activeNestedPlaylistId, mediaId);\r\n await updateNestedPlayListMedias();\r\n setIsLoading(false);\r\n }\r\n\r\n const disableSkin = async (mediaId: Guid) => {\r\n setIsLoading(true);\r\n await disableSkinPriorityListMedia(listId, activeNestedPlaylistId, mediaId);\r\n await updateNestedPlayListMedias();\r\n setIsLoading(false);\r\n }\r\n\r\n const enableSkinStream = async (streamId: Guid) => {\r\n setIsLoading(true);\r\n await enableSkinPriorityListStream(listId, streamId);\r\n await updateStreams();\r\n setIsLoading(false);\r\n }\r\n\r\n const disableSkinStream = async (streamId: Guid) => {\r\n setIsLoading(true);\r\n await disableSkinPriorityListStream(listId, streamId);\r\n await updateStreams();\r\n setIsLoading(false);\r\n }\r\n\r\n const enableSkinRecurrentStream = async (streamId: Guid) => {\r\n setIsLoading(true);\r\n await enableSkinScheduledListRecurrentStream(listId, streamId);\r\n await updateRecurrentStreams();\r\n setIsLoading(false);\r\n }\r\n\r\n const disableSkinRecurrentStream = async (streamId: Guid) => {\r\n setIsLoading(true);\r\n await disableSkinScheduledListRecurrentStream(listId, streamId);\r\n await updateRecurrentStreams();\r\n setIsLoading(false);\r\n }\r\n\r\n const deleteMedia = async (id: Guid) => {\r\n await deleteScheduledPriorityNestedPlayListMedia(listId, activeNestedPlaylistId, id);\r\n await updateNestedPlayListMedias();\r\n }\r\n\r\n const saveStream = async () => {\r\n let isError = false;\r\n if(streamName === \"\"){\r\n setIsStreamNameError(true); isError = true;\r\n }\r\n\r\n if(streamStartTime === \"\"){\r\n setIsStartDateError(true); isError = true;\r\n }\r\n\r\n if(streamEndTime === \"\"){\r\n setIsEndDateError(true); isError = true;\r\n }\r\n\r\n if(new Date(streamEndTime) <= new Date(streamStartTime)){\r\n setIsStreamPeriodError(true); isError = true;\r\n }\r\n\r\n if(isError) return;\r\n setIsLoading(true);\r\n let request : CreateScheduledPriorityListStreamRequest = {\r\n name: streamName,\r\n startTime: streamStartTime,\r\n endTime: streamEndTime,\r\n isNestedListEnabled: isUseNestedPlaylist,\r\n showNestedListEachMinutes: +nestedPlaylistPeriod,\r\n nestedPlayListId: selectedNestedPlaylist ? selectedNestedPlaylist.value : null,\r\n tvChannelId: selectedTvChannel ? selectedTvChannel.id : null,\r\n includeTagIds: includedTags.map( it => it.id),\r\n excludeTagIds: excludedTags.map( it => it.id),\r\n useORRelationshipForIncludeTags: isUseOrRelationshipInPriorityStream,\r\n preRollPlaylistId: selectedPreRollPlaylist ? selectedPreRollPlaylist.value : null,\r\n postRollPlaylistId: selectedPostRollPlaylist ? selectedPostRollPlaylist.value : null,\r\n series: series,\r\n season: season,\r\n episode: episode,\r\n iabCat: iabCat,\r\n genre: genre,\r\n rating: streamRating,\r\n title: title,\r\n }\r\n\r\n if(!!!streamId){\r\n await createScheduledListStream(request, listId);\r\n }\r\n else{\r\n await updateScheduledListStream(request, streamId);\r\n }\r\n await updateStreams();\r\n closeModalStream();\r\n setIsLoading(false);\r\n }\r\n\r\n const saveRecurrentStream = async () => {\r\n let isError = false;\r\n if(streamName === \"\"){\r\n setIsStreamNameError(true); isError = true;\r\n }\r\n\r\n if(recurrentStreamStartDate === \"\"){\r\n setIsRecurrentStreamStartDateError(true); isError = true;\r\n }\r\n\r\n if(recurrentStreamStartTime === \"\"){\r\n setIsRecurrentStreamStartTimeError(true); isError = true;\r\n }\r\n\r\n if(recurrentStreamEndTime === \"\"){\r\n setIsRecurrentStreamEndTimeError(true); isError = true;\r\n }\r\n\r\n if(new Date(!!recurrentStreamEndDate ? recurrentStreamEndDate : '') < new Date(recurrentStreamStartDate)){\r\n setIsRecurrentStreamEndDateError(true); isError = true;\r\n }\r\n\r\n // let [hoursStart, minutesStart] = recurrentStreamStartTime.split(\":\");\r\n // let [hoursEnd, minutesEnd] = recurrentStreamEndTime.split(\":\");\r\n\r\n // if(hoursStart > hoursEnd){\r\n // setIsRecurrentStreamEndTimeError(true)\r\n // isError = true\r\n // }\r\n\r\n // if(hoursStart = hoursEnd){\r\n // if(minutesStart > minutesEnd){\r\n // setIsRecurrentStreamEndTimeError(true)\r\n // isError = true\r\n // }\r\n // }\r\n\r\n if(isError) return;\r\n\r\n setIsLoading(true);\r\n let request : CreateRecurrentPriorityListStreamRequest = {\r\n name: streamName,\r\n startDate: recurrentStreamStartDate ,\r\n endDate: !!recurrentStreamEndDate ? recurrentStreamEndDate : null,\r\n startTime: recurrentStreamStartTime,\r\n endTime: recurrentStreamEndTime,\r\n ...recurrentStreamWeekDays,\r\n isNestedListEnabled: isUseNestedPlaylist,\r\n showNestedListEachMinutes: +nestedPlaylistPeriod,\r\n nestedPlayListId: selectedNestedPlaylist ? selectedNestedPlaylist.value : null,\r\n tvChannelId: selectedTvChannel ? selectedTvChannel.id : null,\r\n includeTagIds: includedTags.map( it => it.id),\r\n excludeTagIds: excludedTags.map( it => it.id),\r\n useORRelationshipForIncludeTags: isUseOrRelationshipInRepeatStream,\r\n preRollPlayListId: selectedPreRollPlaylist ? selectedPreRollPlaylist.value : null,\r\n postRollPlayListId: selectedPostRollPlaylist ? selectedPostRollPlaylist.value : null,\r\n series: series,\r\n season: season,\r\n episode: episode,\r\n iabCat: iabCat,\r\n genre: genre,\r\n rating: streamRating,\r\n title: title\r\n }\r\n\r\n if(!!!streamId){\r\n await createScheduledListRecurrentStream(request, listId)\r\n }\r\n else{\r\n await updateScheduledListRecurrentStream(request, listId, streamId);\r\n }\r\n await updateRecurrentStreams();\r\n closeModalRecurrentStream();\r\n setIsLoading(false);\r\n }\r\n\r\n const deleteStream = async (id: Guid) => {\r\n setIsLoading(true);\r\n await deleteScheduledListStream(id);\r\n await updateStreams();\r\n setIsLoading(false);\r\n }\r\n\r\n const deleteRecurrentStream = async () => {\r\n setIsLoading(true);\r\n await deleteScheduledListRecurrentStream(listId, streamIdForDelete);\r\n await updateRecurrentStreams();\r\n hideDeleteRecurrentStreamModal();\r\n setIsLoading(false);\r\n }\r\n\r\n const closeModalStream = () => {\r\n setShowModalStream(false);\r\n setStreamName(\"\");\r\n setStreamStartTime(\"\");\r\n setStreamEndTime(\"\");\r\n setStreamId(undefined);\r\n setIsUseNestedPlaylist(false);\r\n setNestedPlaylistPeriod(15);\r\n setSaveStreamErrorText(\"\");\r\n setSelectedNestedPlaylist(null);\r\n setSelectedPreRollPlaylist(null);\r\n setSelectedPostRollPlaylist(null);\r\n setIsStreamNameError(false);\r\n setIsStartDateError(false);\r\n setIsEndDateError(false);\r\n setIsPeriodEndError(false);\r\n setSelectedTvChannel(null);\r\n setIncludedTags([]);\r\n setExcludedTags([]);\r\n setIsUseOrRelationshipInPriorityStream(false);\r\n setSeries('')\r\n setSeason('')\r\n setEpisode('')\r\n setTitle('')\r\n setIabCat('')\r\n setGenre('')\r\n setStremRaiting('')\r\n }\r\n\r\n const closeModalRecurrentStream = () => {\r\n setShowModalRecurrentStream(false);\r\n setStreamId(undefined);\r\n setStreamName(\"\");\r\n setIsStreamNameError(false);\r\n\r\n setRecurrentStreamStartDate(\"\");\r\n setIsRecurrentStreamStartDateError(false);\r\n setRecurrentStreamEndDate(\"\");\r\n setIsRecurrentStreamEndDateError(false);\r\n setRecurrentStreamStartTime(\"\");\r\n setIsRecurrentStreamStartTimeError(false);\r\n setRecurrentStreamEndTime(\"\");\r\n setIsRecurrentStreamEndTimeError(false);\r\n setRecurrentStreamWeekDays(weekDaysStart);\r\n setSelectedTvChannel(null);\r\n\r\n setIsUseNestedPlaylist(false);\r\n setNestedPlaylistPeriod(15);\r\n setSelectedNestedPlaylist(null);\r\n setSelectedPreRollPlaylist(null);\r\n setSelectedPostRollPlaylist(null);\r\n \r\n setSaveStreamErrorText(\"\");\r\n\r\n setIncludedTags([]);\r\n setExcludedTags([]);\r\n setIsUseOrRelationshipInRepeatStream(false);\r\n setSeries('')\r\n setSeason('')\r\n setEpisode('')\r\n setIabCat('')\r\n setTitle('')\r\n setGenre('')\r\n setStremRaiting('')\r\n }\r\n\r\n const openModalStream = (stream: ScheduledPriorityListStream, isDuplicate: boolean) => {\r\n setStreamName(stream.name);\r\n setStreamStartTime(stream.startTime);\r\n setStreamEndTime(stream.endTime);\r\n if(!isDuplicate) setStreamId(stream.id);\r\n setStreamAction(isDuplicate ? \"Duplicate\" : \"Edit\");\r\n setIsUseNestedPlaylist(stream.isNestedListEnabled);\r\n stream.showNestedListEachMinutes === 0 ? setNestedPlaylistPeriod(15) : setNestedPlaylistPeriod(stream.showNestedListEachMinutes);\r\n setShowModalStream(true);\r\n setSelectedNestedPlaylist(getNestedPlayListObj(stream.nestedPlayListId))\r\n setSelectedPostRollPlaylist(getNestedPlayListObj(stream.postRollPlaylistId))\r\n setSelectedPreRollPlaylist(getNestedPlayListObj(stream.preRollPlaylistId))\r\n let currentTvChannel = tvChannelsList.find(it => it.id === stream.tvChannelId);\r\n setSelectedTvChannel(currentTvChannel ? currentTvChannel : null);\r\n setIncludedTags( tags.filter(it => stream.includeTagIds.some(it2 => it2.id === it.id)))\r\n setExcludedTags( tags.filter(it => stream.excludeTagIds.some(it2 => it2.id === it.id)))\r\n setIsUseOrRelationshipInPriorityStream(stream.useORRelationshipForIncludeTags)\r\n setSeries(stream.series)\r\n setSeason(stream.season)\r\n setEpisode(stream.episode)\r\n setTitle(stream.title)\r\n setIabCat(stream.iabCat)\r\n setGenre(stream.genre)\r\n setStremRaiting(stream.rating)\r\n }\r\n\r\n const openModalRecurrentStream = (stream: RecurrentPriorityListStream, isDuplicate: boolean) => {\r\n setStreamAction(isDuplicate ? \"Duplicate\" : \"Edit\");\r\n if(!isDuplicate) setStreamId(stream.id)\r\n let streamEndDate = !!stream.endDate ? stream.endDate.slice(0,10) : null\r\n setStreamName(stream.name);\r\n setRecurrentStreamStartDate(stream.startDate.slice(0,10));\r\n setRecurrentStreamEndDate(streamEndDate);\r\n setRecurrentStreamStartTime(stream.startTime);\r\n setRecurrentStreamEndTime(stream.endTime);\r\n setRecurrentStreamWeekDays({\r\n monday: stream.monday,\r\n tuesday: stream.tuesday,\r\n wednesday: stream.wednesday,\r\n thursday: stream.thursday,\r\n friday: stream.friday,\r\n saturday: stream.saturday,\r\n sunday: stream.sunday\r\n });\r\n let currentTvChannel = tvChannelsList.find(it => it.id === stream.tvChannelId);\r\n setSelectedTvChannel(currentTvChannel ? currentTvChannel : null);\r\n setIsUseNestedPlaylist(stream.isNestedListEnabled);\r\n stream.showNestedListEachMinutes === 0 ? setNestedPlaylistPeriod(15) : setNestedPlaylistPeriod(stream.showNestedListEachMinutes);\r\n setSelectedNestedPlaylist(getNestedPlayListObj(stream.nestedPlayListId));\r\n setSelectedPostRollPlaylist(getNestedPlayListObj(stream.postRollPlayListId));\r\n setSelectedPreRollPlaylist(getNestedPlayListObj(stream.preRollPlayListId));\r\n setIncludedTags( tags.filter(it => stream.includeTagIds.some(it2 => it2.id === it.id)));\r\n setExcludedTags( tags.filter(it => stream.excludeTagIds.some(it2 => it2.id === it.id)));\r\n setIsUseOrRelationshipInRepeatStream(stream.useORRelationshipForIncludeTags);\r\n setShowModalRecurrentStream(true);\r\n setSeries(stream.series)\r\n setSeason(stream.season)\r\n setEpisode(stream.episode)\r\n setTitle(stream.title)\r\n setIabCat(stream.iabCat)\r\n setGenre(stream.genre)\r\n setStremRaiting(stream.rating)\r\n }\r\n\r\n const onDrop = async (newOrderedMedia: ScheduledPriorityListMedia[]) => {\r\n let reorderItems: ReorderItemPair[] = [];\r\n for (let index = 0; index < newOrderedMedia.length; index++) {\r\n if (listMedia[index].id !== newOrderedMedia[index].id) {\r\n reorderItems.push({ from: newOrderedMedia[index].id, to: listMedia[index].id });\r\n }\r\n }\r\n if (reorderItems.length !== 0) {\r\n await reorderScheduledPriorityNestedPlayListMedia(listId, activeNestedPlaylistId, { reorderItems: reorderItems })\r\n await updateNestedPlayListMedias();\r\n }\r\n }\r\n\r\n const renderMediaLibraryItem = (item: { mediaType: MediaType, number?: number, previewLink: string, fileName: string, id: string }) => {\r\n const className = `media-elem ${item.number && \"checked\"}`\r\n return <div key={item.id} className={className} onClick={() => addOrRemove(item.id)}>\r\n <span className=\"check-elem\">{item.number}</span>\r\n {renderMediaTypePreviewModal(item.mediaType, item.previewLink)}\r\n <p className=\"media-title\">{item.fileName}</p>\r\n </div>\r\n }\r\n\r\n const setHighlightClassToStream = (id:Guid) => {\r\n if(activeStreamIdHighlight.state){\r\n return id === activeStreamIdHighlight.state ? 'highlight' : ''\r\n }\r\n return ''\r\n }\r\n\r\n const renderStream = (stream: ScheduledPriorityListStream) => {\r\n return <tr key={stream.id} className={`${setHighlightClassToStream(stream.id)}`}>\r\n <td>{stream.name}</td>\r\n <td>{formatDate(stream.startTime)} {formatTime(stream.startTime)} </td>\r\n <td>{formatDate(stream.endTime)} {formatTime(stream.endTime)}</td>\r\n <td>{stream.tvChannelName}</td>\r\n <td>\r\n <div className=\"d-flex gap5\">\r\n <div style={{paddingRight: '5px'}}>\r\n {stream.includeTagIds.map((it, i) => <p key={i}>{it.name}</p>)}\r\n </div>\r\n <div style={{color: \"#717c76\"}}>\r\n {stream.excludeTagIds.map((it, i) => <p key={i}>{it.name}</p>)}\r\n </div>\r\n </div>\r\n {stream.useORRelationshipForIncludeTags && <div className=\"d-flex align-items-center\" style={{color:\"#2DCC3D\"}}>\r\n Contain any tags\r\n </div>}\r\n </td>\r\n <td>\r\n {stream.isTriggeringSkin\r\n ? <IconButton tooltipText=\"With Skin\" type=\"mosaic\" onClick={() => {disableSkinStream(stream.id)}}/> \r\n : <span className=\"no-skin-svg-icon\">\r\n <IconButton tooltipText=\"No Skin\" type=\"mosaic\" onClick={() => {enableSkinStream(stream.id)}}/>\r\n </span>}\r\n {stream.isNestedListEnabled && <span className=\"nested-list\">\r\n <SvgSelector title=\"nested\" /> <span>{stream.showNestedListEachMinutes} min</span> \r\n </span>}\r\n\r\n <IconButton tooltipText=\"Duplicate\" type=\"copy\" onClick={() => openModalStream(stream, true)}/>\r\n\t\t\t\t\t\t<IconButton tooltipText=\"Delete\" type=\"delete\" onClick={() => deleteStream(stream.id)} />\r\n <IconButton tooltipText=\"Edit\" type=\"edit\" onClick={() => openModalStream(stream, false)} />\r\n </td>\r\n </tr>\r\n }\r\n\r\n const renderRecurrentStream = (stream: RecurrentPriorityListStream) => {\r\n return <tr key={stream.id} className={`${setHighlightClassToStream(stream.id)}`}>\r\n <td>{stream.name}</td>\r\n <td>{formatDate(stream.startDate)}</td>\r\n <td>{!!stream.endDate && formatDate(stream.endDate)}</td>\r\n <td>{formatTimeOnly(stream.startTime)}</td>\r\n <td>{formatTimeOnly(stream.endTime)}</td>\r\n <td>\r\n <span className=\"table-week-days\">\r\n <span className=\"week-day\">\r\n <span>M</span>\r\n <span>{stream.monday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n <span className=\"week-day\">\r\n <span>T</span>\r\n <span>{stream.tuesday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n <span className=\"week-day\">\r\n <span>W</span>\r\n <span>{stream.wednesday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n <span className=\"week-day\">\r\n <span>Th</span>\r\n <span>{stream.thursday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n <span className=\"week-day\">\r\n <span>F</span>\r\n <span>{stream.friday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n <span className=\"week-day\">\r\n <span>S</span>\r\n <span>{stream.saturday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n <span className=\"week-day\">\r\n <span>Su</span>\r\n <span>{stream.sunday ? <SvgSelector title={ \"ok\" } /> : <SvgSelector title={ \"cross\" } />}</span>\r\n </span>\r\n </span>\r\n </td>\r\n <td>{stream.tvChannelName}</td>\r\n <td>\r\n <div className=\"d-flex gap5\">\r\n <div style={{paddingRight: '5px'}}>\r\n {stream.includeTagIds.map((it, i) => <p key={i}>{it.name}</p>)}\r\n </div>\r\n <div style={{color: \"#717c76\"}}>\r\n {stream.excludeTagIds.map((it, i) => <p key={i}>{it.name}</p>)}\r\n </div>\r\n </div>\r\n {stream.useORRelationshipForIncludeTags && <div className=\"d-flex align-items-center\" style={{color:\"#2DCC3D\"}}>\r\n Contain any tags\r\n </div>}\r\n </td>\r\n \r\n <td>\r\n {stream.isTriggeringSkin\r\n ? <IconButton tooltipText=\"With Skin\" type=\"mosaic\" onClick={() => {disableSkinRecurrentStream(stream.id)}}/> \r\n : <span className=\"no-skin-svg-icon\">\r\n <IconButton tooltipText=\"No Skin\" type=\"mosaic\" onClick={() => {enableSkinRecurrentStream(stream.id)}}/>\r\n </span>}\r\n {stream.isNestedListEnabled && <span className=\"nested-list\">\r\n <SvgSelector title=\"nested\" /> <span>{stream.showNestedListEachMinutes} min</span> \r\n </span>}\r\n\r\n <IconButton tooltipText=\"Duplicate\" type=\"copy\" onClick={() => openModalRecurrentStream(stream, true)}/>\r\n\t\t\t\t\t\t<IconButton tooltipText=\"Delete\" type=\"delete\" onClick={() => {showDeleteRecurrentStreamModal(stream.id)}} />\r\n <IconButton tooltipText=\"Edit\" type=\"edit\" onClick={() => {openModalRecurrentStream(stream, false)}} />\r\n </td>\r\n </tr>\r\n }\r\n\r\n const renderWeekDaysInModal = (recurrentStreamWeekDays: WeekDays) => {\r\n let d = [];\r\n for (let day in recurrentStreamWeekDays) {\r\n d.push({\r\n day: day as keyof WeekDays,\r\n firstThreeChar: day.slice(0,3),\r\n isActive: recurrentStreamWeekDays[`${day as keyof WeekDays}`]\r\n })\r\n }\r\n\r\n return d.map( (it,i) => {\r\n return <span key={i} className=\"week-days\" onClick={() => changeRecurrentDayActivity(it.day, it.isActive)}>\r\n <SvgSelector title={`${it.isActive ? 'ok' : 'cross'}`} />  {it.firstThreeChar}  \r\n </span>\r\n }) \r\n }\r\n\r\n const changeRecurrentDayActivity = (day: keyof WeekDays, isActive: boolean) => {\r\n switch(day){\r\n case \"monday\" : \r\n setRecurrentStreamWeekDays({...recurrentStreamWeekDays, monday: !isActive});\r\n break;\r\n case \"tuesday\" : \r\n setRecurrentStreamWeekDays({...recurrentStreamWeekDays, tuesday: !isActive});\r\n break;\r\n case \"wednesday\" : \r\n setRecurrentStreamWeekDays({...recurrentStreamWeekDays, wednesday: !isActive});\r\n break;\r\n case \"thursday\" : \r\n setRecurrentStreamWeekDays({...recurrentStreamWeekDays, thursday: !isActive});\r\n break;\r\n case \"friday\" : \r\n setRecurrentStreamWeekDays({...recurrentStreamWeekDays, friday: !isActive});\r\n break;\r\n case \"saturday\" : \r\n setRecurrentStreamWeekDays({...recurrentStreamWeekDays, saturday: !isActive});\r\n break;\r\n case \"sunday\" : \r\n setRecurrentStreamWeekDays({...recurrentStreamWeekDays, sunday: !isActive});\r\n break;\r\n }\r\n }\r\n\r\n const showDeleteRecurrentStreamModal = (streamId: Guid) => {\r\n setIsShowDeleteRecurrentStreamModal(true);\r\n setStreamIdForDelete(streamId);\r\n }\r\n\r\n const hideDeleteRecurrentStreamModal = () => {\r\n setStreamIdForDelete('');\r\n setIsShowDeleteRecurrentStreamModal(false);\r\n }\r\n \r\n\r\n const openScheduleModal = async (mediaId:Guid) => {\r\n setIsLoading(true);\r\n setCurrentMediaId(mediaId);\r\n await updatePriorityListMediaSchedule(mediaId);\r\n setIsShowScheduleModal(true);\r\n setIsLoading(false)\r\n }\r\n\r\n const closeScheduleModal = async () => {\r\n setIsShowScheduleModal(false);\r\n setCurrentMediaId(\"\");\r\n setMediaPeriodName('');\r\n setIsMediaPeriodNameError(false);\r\n setMediaPeriodStart('');\r\n setIsMediaPeriodStartError(false);\r\n setMediaPeriodEnd('');\r\n setIsMediaPeriodEndError(false);\r\n setMediaPeriodStartTime('');\r\n setIsMediaPeriodEndTimeError(false);\r\n setMediaPeriodEndTime('');\r\n setIsMediaPeriodEndTimeError(false);\r\n await updateNestedPlayListMedias()\r\n }\r\n\r\n const saveMediaSchedule = async () => {\r\n let isError = false;\r\n if(mediaPeriodName === '') {\r\n setIsMediaPeriodNameError(true)\r\n isError = true\r\n }\r\n\r\n if(mediaPeriodStart === '') {\r\n setIsMediaPeriodStartError(true)\r\n isError = true\r\n }\r\n\r\n if(mediaPeriodEnd === '') {\r\n setIsMediaPeriodEndError(true)\r\n isError = true\r\n }\r\n\r\n if(new Date(mediaPeriodEnd) < new Date(mediaPeriodStart)){\r\n setIsMediaPeriodEndError(true)\r\n isError = true\r\n }\r\n\r\n if(mediaPeriodStartTime !== ''){\r\n if(mediaPeriodEndTime === ''){\r\n setIsMediaPeriodEndTimeError(true)\r\n isError = true\r\n } else {\r\n let [hoursStart, minutesStart] = mediaPeriodStartTime.split(\":\");\r\n let [hoursEnd, minutesEnd] = mediaPeriodEndTime.split(\":\");\r\n\r\n if(hoursStart >= hoursEnd){\r\n if(minutesStart > minutesEnd){\r\n setIsMediaPeriodEndTimeError(true)\r\n isError = true\r\n }\r\n }\r\n }\r\n }\r\n \r\n if(isError) return\r\n\r\n let request:PriorityListMediaScheduleRequest = {\r\n name: mediaPeriodName,\r\n start: mediaPeriodStart,\r\n end: mediaPeriodEnd,\r\n startTime: mediaPeriodStartTime,\r\n endTime: mediaPeriodEndTime\r\n }\r\n\r\n setIsLoading(true);\r\n\r\n let result = await addPriorityListMediaSchedule(request, listId, activeNestedPlaylistId, currentMediaId);\r\n if(result.type === \"succes\") {\r\n await updatePriorityListMediaSchedule();\r\n }\r\n\r\n setMediaPeriodName('');\r\n setMediaPeriodStart('');\r\n setMediaPeriodEnd('')\r\n setMediaPeriodStartTime('');\r\n setMediaPeriodEndTime('');\r\n setIsLoading(false);\r\n\r\n }\r\n\r\n const updatePriorityListMediaSchedule = async (mediaId?: Guid) => {\r\n setIsLoading(true)\r\n let id = mediaId ? mediaId : currentMediaId;\r\n let result = await getPriorityListMediaSchedule(listId, activeNestedPlaylistId, id);\r\n if(result.type === \"succes\") {\r\n setPriorityListMediaSchedule(result.data.items)\r\n }\r\n setIsLoading(false)\r\n }\r\n\r\n const removePriorityListMediaSchedulePeriod = async () => {\r\n await deletePriorityListMediaSchedule(listId, activeNestedPlaylistId, currentMediaId, mediaShedulePeriodId);\r\n await updatePriorityListMediaSchedule();\r\n setIsShowDeletePriorityListMediaScheduleModal(false);\r\n }\r\n\r\n const showPriorityListMediaScheduleModal = (periodId: Guid) => {\r\n setIsShowDeletePriorityListMediaScheduleModal(true);\r\n setMediaShedulePeriodId(periodId);\r\n }\r\n\r\n const hidePriorityListMediaScheduleModal = () => {\r\n setIsShowDeletePriorityListMediaScheduleModal(false);\r\n }\r\n\r\n const renderPriorityListMediaScheduleRow = (periods: PriorityListMediaSchedule[]) => {\r\n return periods.map( it => {\r\n return <tr key={it.id}>\r\n <td>{it.name} </td>\r\n <td>{formatDate(it.start)}</td>\r\n <td>{formatDate(it.end)}</td>\r\n <td>{formatTimeOnly(it.startTime)}</td>\r\n <td>{formatTimeOnly(it.endTime)}</td>\r\n <td>\r\n <IconButton type=\"delete\" tooltipText=\"Delete\" tooltipPosition=\"left\" onClick={()=>{\r\n showPriorityListMediaScheduleModal(it.id)}\r\n }/>\r\n </td>\r\n </tr>\r\n })\r\n }\r\n\r\n const renderMediaTypePreview = (media: ScheduledPriorityListMedia) => {\r\n switch(media.type){\r\n case MediaType.Image : return <img className=\"sortable__item-img\" src={media.url} alt=\"\" />\r\n case MediaType.Video : return <img className=\"sortable__item-img\" src={media.url} alt=\"\" />\r\n case MediaType.VastUrl : return <SvgSelector title=\"url\" />;\r\n case MediaType.Youtube : return <img className=\"sortable__item-img\" src={media.url} alt=\"\" />;\r\n case MediaType.YoutubeLive : return <img className=\"sortable__item-img\" src={media.url} alt=\"\" />;\r\n case MediaType.WebPage : return <SvgSelector title=\"webview\" />;\r\n }\r\n }\r\n\r\n const renderMediaTypePreviewModal = (type: MediaType, url: string) => {\r\n switch(type){\r\n case MediaType.Image : return <img className=\"media-img-preview\" src={url} alt=\"\" />\r\n case MediaType.Video : return <img className=\"media-img-preview\" src={url} alt=\"\" />\r\n case MediaType.VastUrl : return <SvgSelector title=\"url\" />;\r\n case MediaType.Youtube : return <img className=\"media-img-preview\" src={url} alt=\"\" />;\r\n case MediaType.YoutubeLive : return <img className=\"media-img-preview\" src={url} alt=\"\" />;\r\n case MediaType.WebPage : return <SvgSelector title=\"webview\" />;\r\n }\r\n }\r\n\r\n const checkActiveTab = (tab: string) => tab === activeNestedPlaylistId;\r\n\r\n const showPlaylistModal = (action: NestedPlayListAction) => {\r\n setNestedPlayListAction(action);\r\n if(action == \"update\"){\r\n var nestedPlayList = getActiveNestedPlayList();\r\n if(nestedPlayList) {\r\n setPlaylistName(nestedPlayList.name)\r\n }\r\n } \r\n }\r\n\r\n const closePlaylistModal = () => {\r\n setPlaylistName('');\r\n setIsUseRandomOrder(false);\r\n setIsPlaylistNameError(false);\r\n setNestedPlayListAction(\"nothing\");\r\n }\r\n\r\n const createOrUpdatePlaylist = async () => {\r\n if(playlistName === \"\") {\r\n setIsPlaylistNameError(true);\r\n return;\r\n }\r\n \r\n let request = {\r\n name: playlistName,\r\n isUseRandomOrder: isUseRandomOrder\r\n };\r\n\r\n if(nestedPlayListAction == \"update\") {\r\n await updateScheduledPriorityNestedPlayList(listId, activeNestedPlaylistId, request)\r\n }\r\n if(nestedPlayListAction == \"create\"){\r\n var createResult = await createScheduledPriorityNestedPlayList(listId, request);\r\n if(createResult.type == \"succes\") {\r\n setActiveNestedPlayListId(createResult.data.id);\r\n } \r\n }\r\n \r\n await updateNestedPlayLists();\r\n closePlaylistModal();\r\n } \r\n\r\n const renderNestedPlayListTabs = (nestedPlayLists: NestedPlayList[]) => {\r\n return nestedPlayLists.map( (it, index) => {\r\n return <TabNavigationElement key={index} title={it.name} isActive={checkActiveTab(it.id)} onClick={() => { setActiveNestedPlayListId(it.id) }} />\r\n })\r\n }\r\n\r\n const showNestedDeleteModal = () => { \r\n setIsShowNestedPlaylistDeleteModal(true);\r\n }\r\n\r\n const closeNestedDeleteModal = () => { \r\n setIsShowNestedPlaylistDeleteModal(false)\r\n }\r\n\r\n const deleteNestedPlaylist = async () => {\r\n await deleteScheduledPriorityNestedPlayList(listId, activeNestedPlaylistId);\r\n await updateNestedPlayLists();\r\n closeNestedDeleteModal();\r\n }\r\n\r\n const onSelectedNestedPlayListChange = (playlist: SingleValue<Option<Guid>>) =>{\r\n setSelectedNestedPlaylist(playlist)\r\n }\r\n\r\n const onSelectedPreRollPlayListChange = (playlist: SingleValue<Option<Guid>>) =>{\r\n setSelectedPreRollPlaylist(playlist)\r\n }\r\n\r\n const onSelectedPostRollPlayListChange = (playlist: SingleValue<Option<Guid>>) =>{\r\n setSelectedPostRollPlaylist(playlist)\r\n }\r\n\r\n const onSelectedTvChannel = (newValue: SingleValue<TVChannel>) => {\r\n setSelectedTvChannel(newValue);\r\n }\r\n\r\n const onSelectedIncludeTag = (tags: MultiValue<BaseInfo>) => {\r\n setIncludedTags([...tags])\r\n }\r\n\r\n const onSelectedExcludeTag = (tags: MultiValue<BaseInfo>) => {\r\n setExcludedTags([...tags])\r\n }\r\n\r\n const checkPeriodStatus = (start: string, end:string) => {\r\n let currentDate = new Date()\r\n if(moment(end).isBefore(currentDate)){\r\n return \"status-expired\"\r\n }\r\n if(moment(currentDate).isBetween(start, end)){\r\n return \"status-active\"\r\n }\r\n return \"\"\r\n }\r\n\r\n const renderSchedule = (periods: PriorityListMediaSchedule[]) => {\r\n return periods.map( it => {\r\n let status = checkPeriodStatus(it.start, it.end)\r\n return <p key={it.id} className={`${status}`}>{formatDate(it.start)} - {formatDate(it.end)}</p>\r\n })\r\n }\r\n\r\n const renderPlaylistMedia = (listMedia: ScheduledPriorityListMedia[]) => {\r\n return listMedia.map((item, index) => (\r\n <tr className={`sortable__item }`} key={item.id}>\r\n <td>{addLeadingZero(index + 1, 2)}</td>\r\n <td>\r\n {renderMediaTypePreview(item)}\r\n </td>\r\n <td>{item.name}</td>\r\n <td>{renderMediaType(item.type)}</td>\r\n <td>{formatDuration(item.durationMs)}</td>\r\n <td>{renderSchedule(item.schedule)}</td>\r\n <td>\r\n {item.isTriggeringSkin\r\n ? <IconButton tooltipText=\"With Skin\" type=\"mosaic\" onClick={() => {disableSkin(item.id)}}/> \r\n : <span className=\"no-skin-svg-icon\">\r\n <IconButton tooltipText=\"No Skin\" type=\"mosaic\" onClick={() => {enableSkin(item.id)}}/>\r\n </span>}\r\n <IconButton tooltipText=\"Schedule\" type=\"clock\" onClick={() => {openScheduleModal(item.id)}} />\r\n <IconButton tooltipText=\"Delete\" type=\"delete\" onClick={() => deleteMedia(item.id)} />\r\n </td>\r\n </tr>\r\n ))\r\n }\r\n\r\n return (\r\n <InnerLayout\r\n isCollapsed={props.isCollapsed}\r\n logOut={props.logOut}\r\n toogleCollapse={props.toogleCollapse}\r\n activeTab=\"priorityList\">\r\n <>\r\n <>\r\n <div className=\"d-flex justify-content-between align-items-center pt-20\">\r\n <h3>Priority Streams</h3>\r\n <Button color=\"green\" label=\"Add Priority Stream\" onClick={() => { setShowModalStream(true); setStreamAction(\"Add\"); }} />\r\n </div>\r\n\r\n <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Name</td>\r\n <td>Start</td>\r\n <td>End</td>\r\n <td>TV Channel</td>\r\n <td>Include/Exclude Tags</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {streams.map(renderStream)}\r\n </tbody>\r\n </table>\r\n\r\n <div className=\"d-flex justify-content-between align-items-center pt-20\">\r\n <h3>Repeat Streams</h3>\r\n <Button color=\"green\" label=\"Add Repeat Stream\" onClick={() => { setShowModalRecurrentStream(true); setStreamAction(\"Add\"); }} />\r\n </div>\r\n\r\n <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Name</td>\r\n <td>Start Date</td>\r\n <td>End Date</td>\r\n <td>Start Time</td>\r\n <td>End Time</td>\r\n <td>Days of Week</td>\r\n <td>TV Channel</td>\r\n <td>Include/Exclude Tags</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {recurrentStreams.map(renderRecurrentStream)}\r\n </tbody>\r\n </table>\r\n </>\r\n\r\n {nestedPlayLists.length === 0 ? <>\r\n <h3 className=\"pt-50\">No Playlists</h3>\r\n <div className=\"d-flex align-items-center\">\r\n <p>Add new playlist</p>     \r\n <IconButton tooltipText=\"Add Playlist\" type=\"plus\" roundedButton={true} onClick={()=> showPlaylistModal(\"create\")} />\r\n </div>\r\n </> : <>\r\n <h3 className=\"pt-50\">Playlists</h3>\r\n <Tabs>\r\n <TabNavigation>\r\n <>\r\n {renderNestedPlayListTabs(nestedPlayLists)}\r\n </>\r\n <IconButton tooltipText=\"Add Playlist\" type=\"plus\" roundedButton={true} onClick={()=> showPlaylistModal(\"create\")} />\r\n </TabNavigation>\r\n <TabsContainer>\r\n <TabElement isActive={true}>\r\n <>\r\n <div className=\"d-flex justify-content-end align-items-center mb-20 w-100\">\r\n <Button color=\"green\" label=\"Add Media\" onClick={() => setShowMediaModal(true)} /> \r\n <Button color=\"green\" label=\"Edit\" onClick={() => {showPlaylistModal(\"update\")}} /> \r\n <Button color=\"gray\" label=\"Delete\" onClick={showNestedDeleteModal} />\r\n </div>\r\n\r\n {listMedia.length ? <> <div className=\"duration-all w-100\">\r\n <p>Total duration: {formatDuration(totalDuration)}</p> \r\n </div>\r\n <table className=\"table modal-table media-list-table\">\r\n <thead>\r\n <tr>\r\n <td></td>\r\n <td></td>\r\n <td>Name</td>\r\n <td>Type</td>\r\n <td>Duration</td>\r\n <td>Schedule</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <ReactSortable\r\n list={listMedia}\r\n setList={(newState) => { onDrop(newState) }}\r\n tag=\"tbody\"\r\n >\r\n {renderPlaylistMedia(listMedia)}\r\n </ReactSortable>\r\n </table></> : <h2>Media not selected</h2>\r\n }\r\n </>\r\n </TabElement>\r\n <></>\r\n </TabsContainer>\r\n </Tabs>\r\n </>}\r\n \r\n\r\n <GlobalSpinner isShow={isLoading} />\r\n\r\n <CenterModal\r\n title=\"Media\"\r\n show={showMediaModal}\r\n onRequestClose={closeModal}\r\n >\r\n <>\r\n <div className={`d-flex justify-content-between align-items-center mb-40 `}>\r\n <Search value={searchString} onChangeValue={setSearchString} />\r\n </div>\r\n <div className=\"media-library\">\r\n {getMediaItemsToDisplay().map(\r\n it => renderMediaLibraryItem(\r\n {\r\n mediaType: it.mediaType,\r\n fileName: it.name,\r\n previewLink: it.previewLink,\r\n id: it.id,\r\n number: getNumberOfSelectedMedia(it.id)\r\n }))}\r\n </div>\r\n\r\n <Pagination activePage={currentPage} pagesCount={getPagesCount(getFilteredBySearch().length, mediaItemsPerPage)} changePaginationPage={setCurrentPage} />\r\n\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Add\" onClick={addMedia} />\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeModal} />\r\n </div></>\r\n </CenterModal>\r\n\r\n <RightModal title={`${streamEditAction} Priority Stream`} wide={true} show={showModalStream} onRequestClose={closeModalStream} >\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter name\"\r\n id = \"stream_name_input\"\r\n isError = {isStreamNameError}\r\n title = \"Stream Name\"\r\n onChangeValue = {(v) => {setStreamName(v); setIsStreamNameError(false)}}\r\n value = {streamName}\r\n />\r\n </FormRow>\r\n <FormRowWithColumns>\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"Please select Start Time\"\r\n id=\"stream_start_time\"\r\n isError={isStartDateError}\r\n type=\"datetime-local\"\r\n onChangeValue={(v) => {setIsStartDateError(false); setStreamStartTime(v)}}\r\n value={streamStartTime}\r\n title=\"Start Time\"\r\n /> \r\n </FormRow>\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"Please select End Time\"\r\n id=\"stream_end_time\"\r\n isError={isEndtDateError}\r\n type=\"datetime-local\"\r\n onChangeValue={(v) => {setIsEndDateError(false); setStreamEndTime(v)}}\r\n value={streamEndTime}\r\n title=\"End Time\"\r\n /> \r\n {!!saveStreamErrorText && <span className=\"error\">{saveStreamErrorText}</span>} \r\n {isStreamPeriodError && <span className=\"error\">End Time should be later than Start Time</span>} \r\n </FormRow>\r\n </FormRowWithColumns>\r\n <FormRow>\r\n <label>TV Channel </label>\r\n <Select \r\n className={``}\r\n classNamePrefix={`select`}\r\n isClearable={true}\r\n options={tvChannelsList.sort((a,b) => sortByNameString(a.name, b.name))} \r\n filterOption={(option, input)=> option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option)=> `${option.id}`}\r\n onChange={onSelectedTvChannel}\r\n value={selectedTvChannel}\r\n /> \r\n </FormRow>\r\n <FormRowWithColumns>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"\"\r\n id = \"series\"\r\n isError = {false}\r\n title = \"Series\"\r\n onChangeValue = {(v) => {setSeries(v);}}\r\n value = {series}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"\"\r\n id = \"season\"\r\n isError = {false}\r\n title = \"Season\"\r\n onChangeValue = {(v) => {setSeason(v);}}\r\n value = {season}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"\"\r\n id = \"episode\"\r\n isError = {false}\r\n title = \"Episode\"\r\n onChangeValue = {(v) => {setEpisode(v);}}\r\n value = {episode}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"\"\r\n id = \"title\"\r\n isError = {false}\r\n title = \"Title\"\r\n onChangeValue = {(v) => {setTitle(v);}}\r\n value = {title}\r\n />\r\n </FormRow>\r\n </FormRowWithColumns>\r\n <FormRowWithColumns>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"\"\r\n id = \"iab-cat\"\r\n isError = {false}\r\n title = \"IAB Cat\"\r\n onChangeValue = {(v) => {setIabCat(v);}}\r\n value = {iabCat}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"\"\r\n id = \"genre\"\r\n isError = {false}\r\n title = \"Genre\"\r\n onChangeValue = {(v) => {setGenre(v);}}\r\n value = {genre}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"\"\r\n id = \"stream-rating\"\r\n isError = {false}\r\n title = \"Rating\"\r\n onChangeValue = {(v) => {setStremRaiting(v);}}\r\n value = {streamRating}\r\n />\r\n </FormRow>\r\n </FormRowWithColumns>\r\n <FormRowWithColumns>\r\n <FormRow>\r\n <div className=\"d-flex align-items-center\" style={{paddingTop:\"30px\"}}>\r\n <FormCheckbox id=\"use-or-priority-stream\" checked={isUseOrRelationshipInPriorityStream} onChange={setIsUseOrRelationshipInPriorityStream} />\r\n <span className=\"status-block\">\r\n {isUseOrRelationshipInPriorityStream ? <span className=\"current-status online\"> Contain any tags</span> : <span className=\"current-status offline\"> Contain any tags</span>}\r\n </span>\r\n </div>\r\n </FormRow>\r\n <FormRow>\r\n <label>Included Tags</label>\r\n <Select \r\n className={``}\r\n classNamePrefix={`select`}\r\n isClearable={true}\r\n options={tags.filter(it => !excludedTags.some( it2 => it2.id === it.id))} \r\n isMulti={true}\r\n filterOption={(option, input)=> option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option)=> `${option.id}`}\r\n onChange={onSelectedIncludeTag}\r\n value={includedTags}\r\n /> \r\n </FormRow>\r\n <FormRow>\r\n <label>Excluded Tags</label>\r\n <Select \r\n className={``}\r\n classNamePrefix={`select`}\r\n isClearable={true}\r\n options={tags.filter(it => !includedTags.some( it2 => it2.id === it.id))} \r\n isMulti={true}\r\n filterOption={(option, input)=> option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option)=> `${option.id}`}\r\n onChange={onSelectedExcludeTag}\r\n value={excludedTags}\r\n /> \r\n </FormRow>\r\n </FormRowWithColumns>\r\n <FormRow>\r\n <div className=\"d-flex align-items-center\">\r\n <FormCheckbox id=\"use-nested\" checked={isUseNestedPlaylist} onChange={setIsUseNestedPlaylist} />\r\n <span className=\"status-block\">\r\n {isUseNestedPlaylist ? <span className=\"current-status online\"> Enable Nested Playlist</span> : <span className=\"current-status offline\"> Enable Nested Playlist</span>}\r\n </span>\r\n </div>\r\n </FormRow>\r\n {isUseNestedPlaylist && <>\r\n <FormRowWithColumns> \r\n <FormRow>\r\n <FormInputNumber \r\n id=\"nested-duration\"\r\n title=\"Play nested list using below interval, in minutes\"\r\n isError={false}\r\n errorMessage=\"\"\r\n onChangeValue={value => {\r\n if(value === \"\" || +value < 0 ) setNestedPlaylistPeriod('')\r\n else setNestedPlaylistPeriod(+value)\r\n }}\r\n onChange={()=>{}}\r\n value={nestedPlaylistPeriod}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <label>Mid Roll Playlist</label>\r\n <Select \r\n classNamePrefix={`select`}\r\n options={nestedPlayLists.map(it => ({value: it.id, label: it.name}))} \r\n onChange={onSelectedNestedPlayListChange}\r\n value={selectedNestedPlaylist}\r\n /> \r\n </FormRow>\r\n </FormRowWithColumns>\r\n <FormRowWithColumns> \r\n <FormRow>\r\n <label>Pre Roll Playlist</label>\r\n <Select \r\n classNamePrefix={`select`}\r\n isClearable\r\n options={nestedPlayLists.map(it => ({value: it.id, label: it.name}))} \r\n onChange={onSelectedPreRollPlayListChange}\r\n value={selectedPreRollPlaylist}\r\n /> \r\n </FormRow>\r\n <FormRow>\r\n <label>Post Roll Playlist</label>\r\n <Select \r\n classNamePrefix={`select`}\r\n isClearable\r\n options={nestedPlayLists.map(it => ({value: it.id, label: it.name}))} \r\n onChange={onSelectedPostRollPlayListChange}\r\n value={selectedPostRollPlaylist}\r\n /> \r\n </FormRow>\r\n </FormRowWithColumns>\r\n </>} \r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={saveStream}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeModalStream}/>\r\n </div>\r\n </RightModal> \r\n\r\n <RightModal title={`${streamEditAction} Repeat Stream`} wide={true} show={showModalRecurrentStream} onRequestClose={closeModalRecurrentStream} >\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter name\"\r\n id = \"r_stream_name_input\"\r\n isError = {isStreamNameError}\r\n title = \"Stream Name\"\r\n onChangeValue = {(v) => {setStreamName(v); setIsStreamNameError(false)}}\r\n value = {streamName}\r\n />\r\n </FormRow>\r\n <FormRowWithColumns>\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"Please select Start Date\"\r\n id=\"r_stream_start_date\"\r\n isError={isRecurrentStreamStartDateError}\r\n type=\"date\"\r\n onChangeValue={(v) => {setIsRecurrentStreamStartDateError(false); setRecurrentStreamStartDate(v)}}\r\n value={recurrentStreamStartDate}\r\n title=\"Start Date\"\r\n /> \r\n </FormRow>\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"End Date should be later than Start Date\"\r\n id=\"r_stream_end_date\"\r\n isError={isRecurrentStreamEndDateError}\r\n type=\"date\"\r\n onChangeValue={(v) => {\r\n setIsRecurrentStreamEndDateError(false); \r\n setRecurrentStreamEndDate(!!v ? v : null)\r\n }}\r\n value={!!recurrentStreamEndDate ? recurrentStreamEndDate : ''}\r\n title=\"End Date\"\r\n /> \r\n </FormRow>\r\n </FormRowWithColumns>\r\n <FormRowWithColumns>\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"Please select Start Time\"\r\n id=\"r_stream_start_time\"\r\n isError={isRecurrentStreamStartTimeError}\r\n type=\"time\"\r\n onChangeValue={(v) => {setIsRecurrentStreamStartTimeError(false); setRecurrentStreamStartTime(v)}}\r\n value={recurrentStreamStartTime}\r\n title=\"Start Time\"\r\n /> \r\n \r\n </FormRow>\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"Please select End Time\"\r\n id=\"r_stream_end_time\"\r\n isError={isRecurrentStreamEndTimeError}\r\n type=\"time\"\r\n onChangeValue={(v) => {setIsRecurrentStreamEndTimeError(false); setRecurrentStreamEndTime(v)}}\r\n value={recurrentStreamEndTime}\r\n title=\"End Time\"\r\n /> \r\n \r\n </FormRow>\r\n </FormRowWithColumns>\r\n <FormRowHorizontal>\r\n {renderWeekDaysInModal(recurrentStreamWeekDays)}\r\n </FormRowHorizontal>\r\n <FormRow>\r\n <label>TV Channel </label>\r\n <Select \r\n className={``}\r\n classNamePrefix={`select`}\r\n isClearable={true}\r\n options={tvChannelsList.sort((a,b) => sortByNameString(a.name, b.name))} \r\n filterOption={(option, input)=> option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option)=> `${option.id}`}\r\n onChange={onSelectedTvChannel}\r\n value={selectedTvChannel}\r\n /> \r\n </FormRow>\r\n <FormRowWithColumns>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"\"\r\n id = \"series2\"\r\n isError = {false}\r\n title = \"Series\"\r\n onChangeValue = {(v) => {setSeries(v);}}\r\n value = {series}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"\"\r\n id = \"season2\"\r\n isError = {false}\r\n title = \"Season\"\r\n onChangeValue = {(v) => {setSeason(v);}}\r\n value = {season}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"\"\r\n id = \"episode2\"\r\n isError = {false}\r\n title = \"Episode\"\r\n onChangeValue = {(v) => {setEpisode(v);}}\r\n value = {episode}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"\"\r\n id = \"title2\"\r\n isError = {false}\r\n title = \"Title\"\r\n onChangeValue = {(v) => {setTitle(v);}}\r\n value = {title}\r\n />\r\n </FormRow>\r\n </FormRowWithColumns>\r\n <FormRowWithColumns>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"\"\r\n id = \"iab-cat2\"\r\n isError = {false}\r\n title = \"IAB Cat\"\r\n onChangeValue = {(v) => {setIabCat(v);}}\r\n value = {iabCat}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"\"\r\n id = \"genre2\"\r\n isError = {false}\r\n title = \"Genre\"\r\n onChangeValue = {(v) => {setGenre(v);}}\r\n value = {genre}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"\"\r\n id = \"stream-rating2\"\r\n isError = {false}\r\n title = \"Rating\"\r\n onChangeValue = {(v) => {setStremRaiting(v);}}\r\n value = {streamRating}\r\n />\r\n </FormRow>\r\n </FormRowWithColumns>\r\n <FormRowWithColumns>\r\n <FormRow>\r\n <div className=\"d-flex align-items-center\" style={{paddingTop:\"30px\"}}>\r\n <FormCheckbox id=\"use-or-repeat-stream\" checked={isUseOrRelationshipInRepeatStream} onChange={setIsUseOrRelationshipInRepeatStream} />\r\n <span className=\"status-block\">\r\n {isUseOrRelationshipInRepeatStream ? <span className=\"current-status online\"> Contain any tags</span> : <span className=\"current-status offline\"> Contain any tags</span>}\r\n </span>\r\n </div>\r\n </FormRow>\r\n <FormRow>\r\n <label>Included Tags</label>\r\n <Select \r\n className={``}\r\n classNamePrefix={`select`}\r\n isClearable={true}\r\n options={tags.filter(it => !excludedTags.some( it2 => it2.id === it.id))} \r\n isMulti={true}\r\n filterOption={(option, input)=> option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option)=> `${option.id}`}\r\n onChange={onSelectedIncludeTag}\r\n value={includedTags}\r\n /> \r\n </FormRow>\r\n <FormRow>\r\n <label>Excluded Tags</label>\r\n <Select \r\n className={``}\r\n classNamePrefix={`select`}\r\n isClearable={true}\r\n options={tags.filter(it => !includedTags.some( it2 => it2.id === it.id))} \r\n isMulti={true}\r\n filterOption={(option, input)=> option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option)=> `${option.id}`}\r\n onChange={onSelectedExcludeTag}\r\n value={excludedTags}\r\n /> \r\n </FormRow>\r\n </FormRowWithColumns>\r\n <FormRow>\r\n <div className=\"d-flex align-items-center\">\r\n <FormCheckbox id=\"use-nested\" checked={isUseNestedPlaylist} onChange={setIsUseNestedPlaylist} />\r\n <span className=\"status-block\">\r\n {isUseNestedPlaylist ? <span className=\"current-status online\"> Enable Nested Playlist</span> : <span className=\"current-status offline\"> Enable Nested Playlist</span>}\r\n </span>\r\n </div>\r\n </FormRow>\r\n {isUseNestedPlaylist && \r\n <>\r\n <FormRowWithColumns> \r\n <FormRow>\r\n <FormInputNumber \r\n id=\"nested-duration\"\r\n title=\"Play nested list using below interval, in minutes\"\r\n isError={false}\r\n errorMessage=\"\"\r\n onChangeValue={value => {\r\n if(value === \"\" || +value < 0 ) setNestedPlaylistPeriod('')\r\n else setNestedPlaylistPeriod(+value)\r\n }}\r\n onChange={()=>{}}\r\n value={nestedPlaylistPeriod}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <label>Mid Roll Playlist</label>\r\n <Select \r\n classNamePrefix={`select`}\r\n options={nestedPlayLists.map(it => ({value: it.id, label: it.name}))} \r\n onChange={onSelectedNestedPlayListChange}\r\n value={selectedNestedPlaylist}\r\n /> \r\n </FormRow>\r\n </FormRowWithColumns>\r\n\r\n <FormRowWithColumns> \r\n <FormRow>\r\n <label>Pre Roll Playlist</label>\r\n <Select \r\n classNamePrefix={`select`}\r\n isClearable\r\n options={nestedPlayLists.map(it => ({value: it.id, label: it.name}))} \r\n onChange={onSelectedPreRollPlayListChange}\r\n value={selectedPreRollPlaylist}\r\n /> \r\n </FormRow>\r\n <FormRow>\r\n <label>Post Roll Playlist</label>\r\n <Select \r\n classNamePrefix={`select`}\r\n isClearable\r\n options={nestedPlayLists.map(it => ({value: it.id, label: it.name}))} \r\n onChange={onSelectedPostRollPlayListChange}\r\n value={selectedPostRollPlaylist}\r\n /> \r\n </FormRow>\r\n </FormRowWithColumns>\r\n </>} \r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={saveRecurrentStream}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeModalRecurrentStream}/>\r\n </div>\r\n </RightModal> \r\n\r\n <CenterModal title=\"Media schedule\" show={isShowScheduleModal} onRequestClose={closeScheduleModal}>\r\n <div className=\"mosaic-period-wrapper\">\r\n <div className=\"mosaic-period-inputs\">\r\n <div>\r\n <FormInput \r\n errorMessage = \"Please enter name\"\r\n id = \"period_name\"\r\n isError = {isMediaPeriodNameError}\r\n title = \"Name\"\r\n onChangeValue = {(v) => {setMediaPeriodName(v); setIsMediaPeriodNameError(false)}}\r\n value = {mediaPeriodName}\r\n />\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"start\">Start Date</label>\r\n <input \r\n type=\"date\" \r\n className={`form-control ${isMediaPeriodStartError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"start\" \r\n onChange = {(v) => {setMediaPeriodStart(v.target.value); setIsMediaPeriodStartError(false)}}\r\n value={mediaPeriodStart}\r\n />\r\n {isMediaPeriodStartError && <span className=\"error\">Please select start period</span>}\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"ends\">End Date</label>\r\n <input \r\n type=\"date\" \r\n className={`form-control ${isMediaPeriodEndError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"ends\" \r\n onChange = {(v) => {setMediaPeriodEnd(v.target.value); setIsMediaPeriodEndError(false)}}\r\n value={mediaPeriodEnd}\r\n min={mediaPeriodStart}\r\n disabled={!!!mediaPeriodStart}\r\n />\r\n {isMediaPeriodEndError && <span className=\"error\">End period should be later than start period</span>}\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"start-time\">Start Time</label>\r\n <input \r\n type=\"time\" \r\n className={`form-control`} \r\n name=\"\" \r\n id=\"start-time\" \r\n onChange = {(v) => {setMediaPeriodStartTime(v.target.value)}}\r\n value={mediaPeriodStartTime}\r\n />\r\n {isMediaPeriodStartError && <span className=\"error\">Please select start period</span>}\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"ends-time\">End Time</label>\r\n <input \r\n type=\"time\" \r\n className={`form-control ${isMediaPeriodEndTimeError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"ends-time\" \r\n onChange = {(v) => {setMediaPeriodEndTime(v.target.value); setIsMediaPeriodEndTimeError(false)}}\r\n value={mediaPeriodEndTime}\r\n disabled={!!!mediaPeriodStartTime}\r\n />\r\n {isMediaPeriodEndTimeError && <span className=\"error\">End period should be later than start period</span>}\r\n </div>\r\n <div className=\"\">\r\n <Button color=\"green\" label=\"Add\" onClick={saveMediaSchedule}/>\r\n </div>\r\n </div>\r\n <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Name</td>\r\n <td>Start Date</td>\r\n <td>End Date</td>\r\n <td>Start Time</td>\r\n <td>End Time</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderPriorityListMediaScheduleRow(priorityListMediaSchedule)}\r\n </tbody>\r\n </table>\r\n </div>\r\n </CenterModal>\r\n\r\n <RightModal title=\"Add Playlist\" show={nestedPlayListAction !== \"nothing\"} onRequestClose={closePlaylistModal}>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter Playlist Name\"\r\n id = \"playlist_name_input\"\r\n isError = {isPlaylistNameError}\r\n title = \"Playlist Name\"\r\n onChangeValue = {(v) => {setPlaylistName(v); setIsPlaylistNameError(false)}}\r\n value = {playlistName}\r\n />\r\n </FormRow>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={createOrUpdatePlaylist}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closePlaylistModal}/>\r\n </div>\r\n </RightModal> \r\n\r\n <SmallModal show={isShowNestedPlaylistDeleteModal} onRequestClose={closeNestedDeleteModal}> \r\n <p>That you want to delete Playlist <b>{getActiveNestedPlayList()?.name}</b>?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeNestedDeleteModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={deleteNestedPlaylist}/>\r\n </div>\r\n </SmallModal>\r\n\r\n <SmallModal show={isShowDeletePriorityListMediaScheduleModal} onRequestClose={hidePriorityListMediaScheduleModal}> \r\n <p>That you want to delete Media Schedule Period</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hidePriorityListMediaScheduleModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={removePriorityListMediaSchedulePeriod}/>\r\n </div>\r\n </SmallModal>\r\n\r\n <SmallModal show={isShowDeleteRecurrentStreamModal} onRequestClose={hideDeleteRecurrentStreamModal}> \r\n <p>That you want to delete Repeat Stream?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideDeleteRecurrentStreamModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={deleteRecurrentStream}/>\r\n </div>\r\n </SmallModal>\r\n </>\r\n </InnerLayout>\r\n );\r\n}\r\n\r\nexport default PriorityListMedia;","import { ApiResponse, BaseCreateResponse, BaseInfo, BaseResponse, baseUrl, deleteWithAuth, EmptyRequest, GetParams, getWithAuth, getWithAuthAndParams, Guid, ListRespone, PaginationListRespone, patchWithAuth, postWithAuth, postWithAuthWitoutParams } from \"./baseApi\"\r\nimport { ReorderItemPair, TimeSlotModel } from \"./channelsApi\"\r\nimport { MediaType } from \"./mediaApi\"\r\n\r\nexport type PlayNowList = {\r\n id: string\r\n name : string\r\n channels: BaseInfo[],\r\n status: PlayNowListStatus,\r\n includeTagIds: BaseInfo[],\r\n excludeTagIds: BaseInfo[],\r\n useORRelationshipForIncludeTags: boolean,\r\n players: {id:Guid, name: string, playerId:Guid, isLocked: boolean}[]\r\n}\r\n\r\nexport type PlayNowLog = {\r\n id:Guid,\r\n playNowLogType: PlayNowLogTypeEnum,\r\n dateTime: string,\r\n playNowListName: string,\r\n playerName: string,\r\n actionDescription: string,\r\n userName: string\r\n}\r\n\r\nexport enum PlayNowLogTypeEnum {\r\n Activated,\r\n Deactivated,\r\n Locked,\r\n Unlocked\r\n}\r\n\r\n\r\nexport type CreatePlayNowListRequest = {\r\n name : string,\r\n channelIds: string[],\r\n includeTagIds: Guid[],\r\n excludeTagIds: Guid[],\r\n useORRelationshipForIncludeTags: boolean,\r\n}\r\n\r\nexport type UpdatePlayNowListRequest = {\r\n name : string,\r\n channelIds: string[],\r\n includeTagIds: Guid[],\r\n excludeTagIds: Guid[],\r\n useORRelationshipForIncludeTags: boolean,\r\n}\r\n\r\nexport type PlayNowListMedia = {\r\n id: Guid,\r\n name: string,\r\n url: string,\r\n order: number,\r\n durationMs: number,\r\n type: MediaType,\r\n isTriggeringSkin: boolean,\r\n schedule: PlayNowMediaSchedule[]\r\n}\r\n\r\nexport type PlayNowListAddMediaRequest = {\r\n mediaIds: Guid[]\r\n}\r\n\r\nexport type PlayNowListReorderMedia = {\r\n reorderItems: ReorderItemPair[]\r\n}\r\n\r\nexport enum PlayNowListStatus {\r\n Active = 0,\r\n Inactive = 1\r\n}\r\n\r\nexport interface PlayNowMediaSchedule {\r\n id: Guid,\r\n name: string,\r\n start: string,\r\n end: string,\r\n startTime: string,\r\n endTime: string\r\n}\r\n\r\nexport type PlayNowMediaMediaScheduleRequest = Omit<PlayNowMediaSchedule, 'id'>\r\n\r\nexport type GroupPlayNowMedia = {\r\n id: Guid,\r\n name: string,\r\n type: number,\r\n singleMedia: PlayNowListMedia | null,\r\n groupMedia: PlayNowListMedia[] | null,\r\n}\r\n\r\nexport type GroupForPlayNowMediaRequest = {\r\n groupId: Guid | null\r\n}\r\n\r\nexport type GroupForPlayNowRequest = {\r\n groupId: Guid | null\r\n}\r\n\r\nexport type ReorderedPlayNowIds = {\r\n ids: Guid[]\r\n}\r\n\r\nexport type GroupedPlayNow = {\r\n groupId: Guid,\r\n name: string,\r\n playNowLists: PlayNowList[]\r\n}\r\n\r\nexport const getPlayNowLists = async() : Promise<ApiResponse<ListRespone<PlayNowList>>> => {\r\n return await getWithAuth<ListRespone<PlayNowList>>({url : `${baseUrl}play-now-list`});\r\n}\r\n\r\nexport const createPlayNowList = async(request : CreatePlayNowListRequest) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<CreatePlayNowListRequest,BaseCreateResponse>(`${baseUrl}play-now-list`, request);\r\n}\r\n\r\nexport const updatePlayNowList = async(request : UpdatePlayNowListRequest, id: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<UpdatePlayNowListRequest,BaseResponse>(`${baseUrl}play-now-list/${id}`, request);\r\n}\r\n\r\nexport const getPlayNowListMedias = async (id: Guid) : Promise<ApiResponse<ListRespone<PlayNowListMedia>>> => {\r\n return await getWithAuth<ListRespone<PlayNowListMedia>>({url: `${baseUrl}play-now-list/${id}/media`}); \r\n}\r\n\r\nexport const addMediaToPlayNowList = async (id: Guid, request: PlayNowListAddMediaRequest) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<PlayNowListAddMediaRequest, BaseResponse>(`${baseUrl}play-now-list/${id}/media`, request); \r\n}\r\n\r\nexport const getPlayNowMediaSchedule = async (listId: Guid, id: Guid) : Promise<ApiResponse<ListRespone<PlayNowMediaSchedule>>> => {\r\n return await getWithAuth<ListRespone<PlayNowMediaSchedule>>({url: `${baseUrl}play-now-list/${listId}/media/${id}/schedule`}); \r\n}\r\n\r\nexport const addPlayNowMediaSchedule = async (request: PlayNowMediaMediaScheduleRequest, listId : Guid, mediaId:Guid): Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<PlayNowMediaMediaScheduleRequest,BaseCreateResponse>(`${baseUrl}play-now-list/${listId}/media/${mediaId}/schedule`, request);\r\n}\r\n\r\nexport const deletePlayNowMediaSchedule = async (listId : Guid, mediaId:Guid, periodId: Guid): Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}play-now-list/${listId}/media/${mediaId}/schedule`, periodId);\r\n}\r\n\r\n// export const getPlayNowListMedia = async (id: Guid) : Promise<ApiResponse<ListRespone<PlayNowListMedia>>> => {\r\n// return await getWithAuth<ListRespone<PlayNowListMedia>>({url : `${baseUrl}play-now-list/${id}/media`});\r\n// }\r\n\r\nexport const reorderPlayNowListMedia = async (id: Guid, request: PlayNowListReorderMedia) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<PlayNowListReorderMedia, BaseResponse>(`${baseUrl}play-now-list/${id}/media/reorder`, request); \r\n}\r\n\r\nexport const playNowListDeleteMedia = async (id: Guid, mediaId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}play-now-list/${id}/media`, mediaId); \r\n}\r\n\r\nexport const enablePlayNowList = async(id: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuthWitoutParams<BaseResponse>(`${baseUrl}play-now-list/${id}/play`);\r\n}\r\n\r\nexport const disablePlayNowList = async(id: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuthWitoutParams<BaseResponse>(`${baseUrl}play-now-list/${id}/stop`);\r\n}\r\n\r\nexport const deletePlayNowListApi = async (id: Guid) : Promise<ApiResponse<BaseResponse>> =>{\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}play-now-list`, id)\r\n}\r\n\r\nexport const enableSkinPlayNowMedia = async (id: Guid, mediaId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}play-now-list/${id}/media/${mediaId}/enable-skin`, {}); \r\n}\r\n\r\nexport const disableSkinPlayNowMedia = async (id: Guid, mediaId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}play-now-list/${id}/media/${mediaId}/disable-skin`, {}); \r\n}\r\n\r\nexport const getPlayNowLogs = async (playerId: Guid, playlistId: Guid, page: number, pageSize: number) : Promise<ApiResponse<PaginationListRespone<PlayNowLog>>> => {\r\n var params = new GetParams();\r\n params.Add(\"playerId\", playerId);\r\n params.Add(\"playlistId\", playlistId);\r\n params.Add(\"page\", page+\"\");\r\n params.Add(\"pageSize\", pageSize+\"\");\r\n return await getWithAuthAndParams<PaginationListRespone<PlayNowLog>>(`${baseUrl}play-now-list/logs`, params); \r\n}\r\n\r\nexport const lockPlayer = async(playNowListId: Guid, playerId: Guid) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseCreateResponse>(`${baseUrl}play-now-list/${playNowListId}/player/${playerId}/lock`, {});\r\n}\r\nexport const unlockPlayer = async(playNowListId: Guid, playerId: Guid) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseCreateResponse>(`${baseUrl}play-now-list/${playNowListId}/player/${playerId}/unlock`, {});\r\n}\r\n\r\n\r\n// groups\r\nexport const getGroupedPlayNowMedia = async (playNowListId: Guid) : Promise<ApiResponse<ListRespone<GroupPlayNowMedia>>> =>{\r\n return await getWithAuth<ListRespone<GroupPlayNowMedia>>({url: `${baseUrl}play-now-list/${playNowListId}/media/grouped`})\r\n}\r\n\r\nexport const updateGroupForPlayNowMedia = async (request: GroupForPlayNowMediaRequest, playNowListId: Guid, mediaId:Guid) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<GroupForPlayNowMediaRequest, BaseCreateResponse>(`${baseUrl}play-now-list/${playNowListId}/media/${mediaId}`, request); \r\n}\r\n\r\nexport const getGroupsForPlayNowMedia = async (playNowListId: Guid) : Promise<ApiResponse<ListRespone<BaseInfo>>> =>{\r\n return await getWithAuth<ListRespone<BaseInfo>>({url: `${baseUrl}play-now-list/${playNowListId}/groups`})\r\n}\r\n\r\nexport const createGroupForPlayNowMedia = async (request: {name:string}, playNowListId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<{name:string}, BaseResponse>(`${baseUrl}play-now-list/${playNowListId}/groups`, request); \r\n}\r\n\r\nexport const changeGroupNameForPlayNowMedia = async (request: {name:string}, groupId: Guid, playNowListId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<{name:string}, BaseResponse>(`${baseUrl}play-now-list/${playNowListId}/groups/${groupId}`, request); \r\n}\r\n\r\nexport const cloneGroupPlayNowMedia = async (playNowListId: Guid, groupId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}play-now-list/${playNowListId}/groups/${groupId}/clone`, {}); \r\n}\r\n\r\nexport const removeGroupPlayNowMedia = async (playNowListId: Guid, groupId: Guid) : Promise<ApiResponse<BaseResponse>> =>{\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}play-now-list/${playNowListId}/groups`, groupId)\r\n}\r\n\r\nexport const cloneGroupedPlayNowMedia = async (playNowListId: Guid, mediaId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}play-now-list/${playNowListId}/media/grouped/${mediaId}/clone`, {}); \r\n}\r\n\r\nexport const reorderGroupPlayNowMedia = async (request: ReorderedPlayNowIds, playNowListId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<ReorderedPlayNowIds, BaseResponse>(`${baseUrl}play-now-list/${playNowListId}/media/grouped/reorder`, request); \r\n}\r\n\r\nexport const getGroupedPlayNowList = async() : Promise<ApiResponse<ListRespone<GroupedPlayNow>>> => {\r\n return await getWithAuth<ListRespone<GroupedPlayNow>>({url : `${baseUrl}play-now-list/grouped`});\r\n}\r\n\r\nexport const getGroupsForPlayNow = async () : Promise<ApiResponse<ListRespone<BaseInfo>>> =>{\r\n return await getWithAuth<ListRespone<BaseInfo>>({url: `${baseUrl}play-now-list/groups`})\r\n}\r\n\r\nexport const createGroupForPlayNow = async (request: {name:string}) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<{name:string}, BaseResponse>(`${baseUrl}play-now-list/groups`, request); \r\n}\r\n\r\nexport const changeGroupNameForPlayNow = async (request: {name:string}, groupId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await patchWithAuth<{name:string}, BaseResponse>(`${baseUrl}play-now-list/groups/${groupId}`, request); \r\n}\r\n\r\nexport const updateGroupForPlayNow = async (request: GroupForPlayNowRequest, playNowListId: Guid) : Promise<ApiResponse<BaseCreateResponse>> => {\r\n return await postWithAuth<GroupForPlayNowRequest, BaseCreateResponse>(`${baseUrl}play-now-list/${playNowListId}/group`, request); \r\n}\r\n\r\nexport const cloneGroupPlayNow = async (groupId: Guid) : Promise<ApiResponse<BaseResponse>> => {\r\n return await postWithAuth<EmptyRequest, BaseResponse>(`${baseUrl}play-now-list/groups/${groupId}/clone`, {}); \r\n}\r\n\r\nexport const removeGroupForPlayNow = async (groupId: Guid) : Promise<ApiResponse<BaseResponse>> =>{\r\n return await deleteWithAuth<BaseResponse>(`${baseUrl}play-now-list/groups`, groupId)\r\n}\r\n","import { FunctionComponent, useEffect, useState } from \"react\";\r\nimport { generatePath, RouteComponentProps, withRouter } from \"react-router-dom\";\r\nimport { Permission } from \"../../../api/authApi\";\r\nimport { BaseInfo, Guid } from \"../../../api/baseApi\";\r\nimport { getBaseChannels, getBaseChannelsForPriorityList, TimeSlotModel } from \"../../../api/channelsApi\";\r\nimport { createScheduledPriorityList, CreateScheduledPriorityListRequest, enableScheduledListTimeSlot, getScheduledListTimeSlots, getScheduledPriorityLists, removeScheduledListTimeSlots, ScheduledPriorityList, updateScheduledPriorityList, UpdateScheduledPriorityListRequest } from \"../../../api/priorityListApi\";\r\nimport { createUser, CreateUserRequest, getUsersList, suspendUser, unSuspendUser, updateUser, UpdateUserRequest, User } from \"../../../api/usersApi\";\r\nimport { createPathWithId, Routes } from \"../../../constants/routes\";\r\nimport { Button } from \"../../components/Button\";\r\nimport FormCheckbox from \"../../components/formRow/FormCheckbox\";\r\nimport FormMultiSelect from \"../../components/formRow/FormMultiSelect\";\r\nimport { FormInput, FormRow, FormRowHorizontal, SelectOption } from \"../../components/formRow/FormRow\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport IconButton from \"../../components/iconButton/IconButton\";\r\nimport Schedule from \"../../components/schedule/Schedule\";\r\nimport { CenterModal, RightModal } from \"../../components/sideModal/Modal\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\n\r\ninterface UsersListProps extends RouteComponentProps<any>{\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n \r\nconst UsersList: FunctionComponent<UsersListProps> = (props : UsersListProps) => {\r\n let {history} = props;\r\n let [isLoading, setIsloading] = useState(false);\r\n let [showModal, setShowModal] = useState<boolean>(false);\r\n let [userName, setUserName] = useState<string>(\"\");\r\n let [userNameError, setUserNameError] = useState<boolean>(false);\r\n let [email, setEmail] = useState<string>(\"\");\r\n let [emailError, setEmailError] = useState<boolean>(false);\r\n let [password, setPassword] = useState<string>(\"\");\r\n let [passwordError, setPasswordError] = useState<boolean>(false);\r\n let [permissions, setPermissions] = useState<Permission[]>([]);\r\n\r\n let [users, setUsers] = useState<User[]>([]);\r\n let [userIdForEdit, setUserIdForEdit] = useState<Guid>();\r\n\r\n useEffect(()=>{\r\n async function getData(){\r\n setIsloading(true);\r\n await Promise.all([updateUserList()]);\r\n setIsloading(false);\r\n }\r\n getData();\r\n },[])\r\n \r\n async function updateUserList(){\r\n setIsloading(true)\r\n let users = await getUsersList();\r\n if(users.type == \"succes\") setUsers(users.data.items);\r\n setIsloading(false);\r\n }\r\n\r\n\r\n const showCreateModal = () => {\r\n setShowModal(true);\r\n }\r\n\r\n const renderRow = (user: User) => {\r\n return <tr key={user.id}>\r\n <td>{user.id}</td>\r\n <td>{user.name}</td>\r\n <td>{user.email}</td>\r\n <td>{user.isSuspended ? \"Yes\" : \"No\"}</td>\r\n <td>\r\n <IconButton tooltipText=\"Notification settings\" type=\"report2\" onClick={()=>{goToSettingsNotification(user.id)}}/>\r\n <IconButton tooltipText={user.isSuspended ? \"Play\" : \"Stop\"} type={user.isSuspended ? \"play\" : \"stop-play\"} \r\n onClick={() => {user.isSuspended ? unsuspend(user.id) : suspend(user.id)}}/>\r\n <IconButton tooltipText=\"Edit\" type=\"edit\" onClick={() => {showEditModal(user)}}/>\r\n </td>\r\n </tr>\r\n }\r\n\r\n const showEditModal = (user: User) => {\r\n setUserIdForEdit(user.id);\r\n setUserName(user.name);\r\n setEmail(user.email);\r\n setPassword('');\r\n setPermissions(user.permissions);\r\n setShowModal(true);\r\n }\r\n\r\n const closeModal = () => {\r\n setUserName('');\r\n setEmail('');\r\n setPassword('');\r\n setPermissions([]);\r\n setUserIdForEdit(undefined);\r\n setShowModal(false);\r\n }\r\n\r\n const saveUser = async () => {\r\n let isError = true;\r\n if(userName === \"\"){\r\n setUserNameError(true);\r\n isError = false;\r\n }\r\n if(email === \"\"){\r\n setEmailError(true);\r\n isError = false;\r\n }\r\n if(userIdForEdit === undefined && password === \"\"){\r\n setPasswordError(true);\r\n isError = false;\r\n }\r\n\r\n if(!isError) return;\r\n\r\n if(userIdForEdit === undefined){\r\n let request : CreateUserRequest = {\r\n name: userName, \r\n email: email, \r\n password: password, \r\n permissions: permissions};\r\n await createUser(request);\r\n }\r\n else{\r\n let request : UpdateUserRequest = {\r\n name: userName, \r\n email: email, \r\n permissions: permissions };\r\n await updateUser(userIdForEdit, request);\r\n }\r\n await updateUserList();\r\n closeModal();\r\n }\r\n\r\n const updatePermission = ( permission: Permission) =>{\r\n if(permissions.findIndex(it => it == permission) !== -1){\r\n setPermissions(permissions.filter(it => it !== permission));\r\n }\r\n else{\r\n setPermissions([...permissions, permission]);\r\n }\r\n } \r\n\r\n const renderPermission = (name: string, permission: Permission) => {\r\n return <FormRowHorizontal>\r\n <div className=\"status-container\">\r\n <span>{name}</span>\r\n <FormCheckbox\r\n checked={permissions.findIndex(it => it == permission) !== -1}\r\n id={`permission_${name}`}\r\n onChange={()=> updatePermission(permission)}\r\n />\r\n </div>\r\n </FormRowHorizontal>\r\n }\r\n\r\n const suspend = async (id: Guid) => {\r\n await suspendUser(id);\r\n await updateUserList();\r\n }\r\n\r\n const unsuspend = async (id: Guid) => {\r\n await unSuspendUser(id);\r\n await updateUserList();\r\n }\r\n\r\n const goToSettingsNotification = (id: Guid) => {\r\n history.push(`${Routes.Users}/${id}/notifications`)\r\n }\r\n\r\n return ( \r\n <InnerLayout \r\n isCollapsed={props.isCollapsed}\r\n logOut={props.logOut}\r\n toogleCollapse={props.toogleCollapse}\r\n activeTab=\"users\">\r\n <>\r\n <div className=\"d-flex justify-content-end align-items-center mb-20 pt-50\">\r\n <Button color=\"green\" label=\"Create User\" onClick={showCreateModal} />\r\n </div>\r\n <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Id</td>\r\n <td>Name</td>\r\n <td>Email </td>\r\n <td>Suspended</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {users.map(it => renderRow(it))}\r\n </tbody>\r\n </table>\r\n \r\n <RightModal title={userIdForEdit === undefined ? \"Add new user\" : \"Edit new user\"} \r\n show={showModal}\r\n onRequestClose={closeModal}\r\n >\r\n <FormRow>\r\n <FormInput \r\n id=\"user-name\"\r\n title=\"Username\"\r\n isError={userNameError}\r\n errorMessage=\"Please enter user name\"\r\n onChange={e => { setUserName(e.target.value); setUserNameError(false);}}\r\n value={userName}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n id=\"user-email\"\r\n title=\"Email\"\r\n isError={emailError}\r\n errorMessage=\"Please enter email\"\r\n onChange={e => { setEmail(e.target.value); setEmailError(false);}}\r\n value={email}\r\n />\r\n </FormRow> \r\n { !!!userIdForEdit &&\r\n <FormRow>\r\n <FormInput \r\n id=\"user-password\"\r\n title=\"Password\"\r\n isError={passwordError}\r\n errorMessage=\"Please enter password\"\r\n onChange={e => { setPassword(e.target.value); setPasswordError(false);}}\r\n value={password}\r\n />\r\n </FormRow> } \r\n {renderPermission(\"Campaign\", Permission.Campaigns)}\r\n {renderPermission(\"Networks\", Permission.Channels)}\r\n {renderPermission(\"Dashboard\", Permission.Dashboard)}\r\n {renderPermission(\"Media\", Permission.Media)}\r\n {renderPermission(\"Players\", Permission.Players)}\r\n {renderPermission(\"Reports\", Permission.Reports)}\r\n {renderPermission(\"Users\", Permission.Users)}\r\n {renderPermission(\"PriorityList\", Permission.PriorityList)}\r\n {renderPermission(\"PlayNowList\", Permission.PlayNowList)}\r\n {renderPermission(\"Mosaic\", Permission.MosaicScreen)}\r\n {renderPermission(\"Settings\", Permission.Settings)}\r\n\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={saveUser}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeModal}/>\r\n </div>\r\n </RightModal>\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n \r\n </InnerLayout> );\r\n}\r\n \r\nexport default withRouter(UsersList);","import { FunctionComponent, useEffect, useState } from \"react\";\r\nimport { RouteComponentProps, withRouter } from \"react-router-dom\";\r\nimport { getUserData, setNewProfilePicture, updateUserName } from \"../../../api/authApi\";\r\nimport { changeUserPassword, changeUsername, updateProfilePicture, getProfilePicture } from \"../../../api/usersApi\";\r\nimport { Button } from \"../../components/Button\";\r\nimport { FormInput, FormRow, FormRowHorizontal, SelectOption } from \"../../components/formRow/FormRow\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport SelectFileButton, { SelectAvatarButton } from \"../../components/selectFileButton/SelectFileButton\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport \"./UserSettings.css\"\r\n\r\ninterface UserSettingsProps extends RouteComponentProps<any>{\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n \r\nconst UserSettings: FunctionComponent<UserSettingsProps> = (props : UserSettingsProps) => {\r\n let [isLoading, setIsloading] = useState(false);\r\n let [newPassword, setNewPassword] = useState<string>(\"\");\r\n let [newPasswordError, setNewPasswordError] = useState<boolean>(false);\r\n\r\n let [confrimPassword, setConfirmPassword] = useState<string>(\"\");\r\n let [confirmPasswordError, setConfirmPasswordError] = useState<boolean>(false);\r\n\r\n let [newUsername, setNewUsername] = useState<string>(\"\");\r\n let [newUsernameError, setNewUsernameError] = useState<boolean>(false);\r\n\r\n let [userAvatar, setUserProfilePicture] = useState<string>(getUserData().profilePicture);\r\n\r\n const changePassword = async () =>{\r\n let isError = true;\r\n if(newPassword === \"\" || newPassword.length < 8){\r\n setNewPasswordError(true);\r\n isError = false;\r\n }\r\n if(confrimPassword === \"\" ){\r\n setConfirmPasswordError(true);\r\n isError = false;\r\n }\r\n if(newPassword !== confrimPassword){\r\n setNewPasswordError(true);\r\n setConfirmPasswordError(true);\r\n isError = false;\r\n }\r\n\r\n if(!isError) return;\r\n setIsloading(true);\r\n var result = await changeUserPassword({ password: newPassword});\r\n if(result.type == \"succes\"){\r\n alert(\"Password changed successfully\");\r\n }\r\n setIsloading(false);\r\n }\r\n\r\n const changeUserNickname = async () =>{\r\n let isError = true;\r\n if(newUsername === \"\"){\r\n setNewUsernameError(true);\r\n isError = false;\r\n }\r\n\r\n if(!isError) return;\r\n\r\n setIsloading(true);\r\n var result = await changeUsername({username: newUsername});\r\n if(result.type == \"succes\"){\r\n updateUserName(newUsername);\r\n alert(\"Username changed successfully\");\r\n }\r\n setIsloading(false);\r\n }\r\n\r\n const onUploadProfilePicture = async (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if(event.target.files){\r\n const formData = new FormData();\r\n formData.append(\"Image\", event.target.files[0]);\r\n await updateProfilePicture(formData); \r\n var profileImageResult = await getProfilePicture();\r\n\r\n if(profileImageResult.type == \"succes\"){\r\n setNewProfilePicture(profileImageResult.data.data);\r\n setUserProfilePicture(profileImageResult.data.data);\r\n alert(\"Profile Picture Updated successfully\");\r\n }\r\n };\r\n\r\n }\r\n\r\n const goBack = () => {\r\n props.history.goBack();\r\n }\r\n\r\n return ( \r\n <InnerLayout \r\n isCollapsed={props.isCollapsed}\r\n logOut={props.logOut}\r\n toogleCollapse={props.toogleCollapse}\r\n activeTab=\"userSettings\">\r\n <>\r\n <div className=\"user-settings-block\">\r\n <h2 className=\"settings-title\">User settings</h2>\r\n <label>Password</label>\r\n <div className=\"double-row\">\r\n <FormRow>\r\n <FormInput \r\n id=\"new-password\"\r\n title=\"New password\"\r\n isError={newPasswordError}\r\n type=\"password\"\r\n errorMessage=\"Password should be 8 symbols long minimum\"\r\n onChange={e => { setNewPassword(e.target.value); setNewPasswordError(false);}}\r\n value={newPassword}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n id=\"confirm-password\"\r\n title=\"Confirm password\"\r\n type=\"password\"\r\n isError={confirmPasswordError}\r\n errorMessage=\"Password do not match\"\r\n onChange={e => { setConfirmPassword(e.target.value); setConfirmPasswordError(false);}}\r\n value={confrimPassword}\r\n />\r\n </FormRow>\r\n </div>\r\n <FormRow>\r\n <label>  </label>\r\n <Button color=\"green\" label=\"Change Password\" onClick={changePassword}/>\r\n </FormRow>\r\n\r\n <label>Username</label>\r\n <FormRow>\r\n <FormInput \r\n id=\"new-name\"\r\n title=\"New name\"\r\n isError={newUsernameError}\r\n type=\"text\"\r\n errorMessage=\"Please enter new user name\"\r\n onChange={e => { setNewUsername(e.target.value); setNewUsernameError(false);}}\r\n value={newUsername}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <label>  </label>\r\n <Button color=\"green\" label=\"Change Username\" onClick={changeUserNickname}/>\r\n </FormRow>\r\n <label>Profile Picture</label>\r\n <FormRowHorizontal>\r\n {userAvatar && \r\n <label className=\"avatar\">\r\n <img className=\"avatar-img\" src={userAvatar} alt=\"\" />\r\n </label>} \r\n <SelectAvatarButton title=\"Upload New Profile Picture\" id=\"upload-new-profile-picture\" onChange={(e)=>{onUploadProfilePicture(e)}}/>\r\n </FormRowHorizontal>\r\n \r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Back\" onClick={goBack}/>\r\n </div>\r\n </div>\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n </InnerLayout> );\r\n}\r\n \r\nexport default withRouter(UserSettings);","import React, { FC, useEffect, useState } from 'react'\r\nimport { Guid } from '../../../api/baseApi'\r\nimport { PlayNowList, PlayNowListStatus } from '../../../api/playNowListApi'\r\nimport { Button } from '../Button'\r\nimport DescriptionList from '../descriptionList/descriptionList'\r\nimport { FormRow, FormSelect } from '../formRow/FormRow'\r\nimport GlobalSpinner from '../globalsSpinner/GlobalSpinner'\r\nimport SvgSelector from '../svgSelector/SvgSelector'\r\nimport './PlayNowFullscreen.css'\r\nimport Select, { SingleValue } from \"react-select\";\r\n\r\ninterface IPlayNowListFullscreen {\r\n playNowLists: PlayNowList[],\r\n isLoading: boolean,\r\n activatePlayNow: (id:Guid) => void,\r\n inactivatePlayNow: (id:Guid) => void,\r\n exitFullscreen: () => void\r\n}\r\n\r\ntype SelectedPlayList = {\r\n id: Guid,\r\n key : number\r\n}\r\n\r\n\r\nconst PlayNowFullscreen:FC<IPlayNowListFullscreen> = ({playNowLists, isLoading, activatePlayNow, inactivatePlayNow, exitFullscreen}) => {\r\n let [selectedPlayLists, setSelectedPlayLists] = useState<SelectedPlayList[]>([]);\r\n let [currentIndex, setCurrentIndex] = useState<number>(0);\r\n let [isDisabledSelectFullscreenMode, setIsDisabledSelectFullscreenMode] = useState(false);\r\n\r\n let findById = (id: Guid) => playNowLists.find(it => it.id == id); \r\n \r\n useEffect(()=>{\r\n // let actualList = playNowLists.filter(it => selectedPlayLists.some(it2 => it2.id === it.id));\r\n // let actualOpt = playNowLists.filter(it => selectedPlayLists.some(it2 => it2.id != it.id));\r\n\r\n // if(curOptions.length === 0){\r\n // setCurOptions(playNowLists);\r\n // if(selectedPlayLists.length === playNowLists.length){\r\n // setCurOptions([]);\r\n // }\r\n // } else {\r\n // setCurOptions(actualOpt)\r\n // }\r\n \r\n // setSelectedPlayLists(actualList);\r\n },[playNowLists])\r\n\r\n useEffect(()=>{\r\n if(currentIndex >= 9 ) {\r\n setIsDisabledSelectFullscreenMode(true)\r\n } else {setIsDisabledSelectFullscreenMode(false)}\r\n },[currentIndex])\r\n\r\n const renderStatusPlayNow = (status: PlayNowListStatus) => {\r\n switch(status){\r\n case PlayNowListStatus.Active : return <span className=\"status-active\">Active</span>\r\n case PlayNowListStatus.Inactive : return <span className=\"status-paused\">Inactive</span>\r\n }\r\n }\r\n\r\n const renderFullscreenPlayNowRow = (selectePlayList: SelectedPlayList) => {\r\n let item = findById(selectePlayList.id);\r\n if(item){\r\n return <div className={`playnow__elem ${item.status === PlayNowListStatus.Active ? 'active' : ''}`} key={item.id}>\r\n <div className=\"playnow__elem-control\">\r\n <span onClick={()=> onPlayNowListRemove(selectePlayList.id)}><SvgSelector title='cross' /></span>\r\n <p>{selectePlayList.key}</p>\r\n </div>\r\n <DescriptionList title='Name' value={item.name}/>\r\n <DescriptionList title='Networks' value={<>{item.channels.map(it => <p>{it.name}</p>)}</>}/>\r\n <DescriptionList title='Status' value={renderStatusPlayNow(item.status)}/>\r\n </div>\r\n }\r\n \r\n }\r\n\r\n const handleKeyboardClick = function(e:any){\r\n let key = +e.key;\r\n if(typeof key === \"number\"){\r\n if(key > 0 && key < 10){\r\n let playListItem = selectedPlayLists.find(it => it.key == key) \r\n if(playListItem){\r\n let playList = findById(playListItem.id);\r\n if(playList){\r\n if(playList.status === PlayNowListStatus.Active){\r\n inactivatePlayNow(playList.id)\r\n } \r\n if(playList.status === PlayNowListStatus.Inactive){\r\n activatePlayNow(playList.id)\r\n } \r\n } \r\n }\r\n }\r\n }\r\n }\r\n\r\n let playNowSelectOptions = () => {\r\n let notSelectedPlayLists = playNowLists.filter(it => selectedPlayLists.findIndex(spl => spl.id === it.id) === -1)\r\n let options = notSelectedPlayLists.map(it => {\r\n return {label: it.name, value: it.id}\r\n });\r\n\r\n return options;\r\n }\r\n\r\n type Option<T> = { value: T, label: string} \r\n\r\n const onPlayNowListSelect = (item: SingleValue<Option<Guid>>) => {\r\n if(!!item){\r\n var key = currentIndex+1;\r\n let playListToAdd : SelectedPlayList = { key: key, id: item.value};\r\n setCurrentIndex(currentIndex+1);\r\n setSelectedPlayLists([...selectedPlayLists, playListToAdd]);\r\n }\r\n }\r\n\r\n const onPlayNowListRemove = (id:Guid) => {\r\n let removedItem = selectedPlayLists.find(it => it.id === id);\r\n if(!!removedItem){\r\n let removedKey = removedItem.key;\r\n let withoutRemovedItem = selectedPlayLists.filter(it => it.id !== id);\r\n withoutRemovedItem.forEach(element => {\r\n if(element.key > removedKey) element.key = element.key-1;\r\n });\r\n setSelectedPlayLists(withoutRemovedItem);\r\n setCurrentIndex(currentIndex-1);\r\n }\r\n \r\n }\r\n\r\n const onExitFullscreen = () => {\r\n // setSelectedPlayLists([]);\r\n // setCurOptions(playNowLists);\r\n exitFullscreen();\r\n }\r\n\r\n return (\r\n <div className=\"fullscreen-container\" tabIndex={0} onKeyDown={(e)=>handleKeyboardClick(e)}>\r\n <div className=\"d-flex justify-content-between align-items-center mb-20 pt-50\">\r\n <div className=\"select-container\" >\r\n <Select \r\n autoFocus={false}\r\n isDisabled={isDisabledSelectFullscreenMode}\r\n options={playNowSelectOptions()}\r\n classNamePrefix={`select`}\r\n onChange={onPlayNowListSelect} \r\n onMenuClose={()=>{}}\r\n controlShouldRenderValue={false}\r\n onKeyDown={e => e.stopPropagation()}\r\n />\r\n </div>\r\n <Button color=\"green\" label=\"Exit Fullscreen Mode\" onClick={onExitFullscreen} />\r\n </div>\r\n <div className=\"playnow__table\">\r\n {selectedPlayLists.map(it => renderFullscreenPlayNowRow(it))}\r\n </div>\r\n <GlobalSpinner isShow={isLoading} />\r\n </div>\r\n )\r\n}\r\n\r\nexport default PlayNowFullscreen\r\n","import { useEffect, useState } from \"react\"\r\nimport GlobalSpinner from \"../globalsSpinner/GlobalSpinner\";\r\nimport { PlayNowLog, PlayNowLogTypeEnum, getPlayNowLists, getPlayNowLogs } from \"../../../api/playNowListApi\";\r\nimport Select, { SingleValue } from \"react-select\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport { getPlayers } from \"../../../api/playersApi\";\r\nimport { convertUTCDateToLocalDate } from \"../../../services/dateService\";\r\nimport Pagination from \"../pagination/Pagination\";\r\n\r\ntype Option<T> = { value: T, label: string}\r\n\r\nconst PlayNowLogs = () => {\r\n let [isLoading, setIsLoading] = useState(false);\r\n let [playNowLogs, setPlayNowLogs] = useState<PlayNowLog[]>([]);\r\n let [filteredPlayers, setFilteredPlayers ] = useState<Option<Guid>[]>([]);\r\n let [filteredPlayNow, setFilteredPlayNow ] = useState<Option<Guid>[]>([]);\r\n let [selectedPlayer, setSelectedPlayer] = useState<Guid>('');\r\n let [selectedPlaylist, setSelectedPlaylist] = useState<Guid>('');\r\n let [currentPage, setCurrentPage] = useState<number>(1);\r\n let [totalPages, setTotalPages] = useState(1)\r\n\r\n let itemsPerPage = 20;\r\n\r\n\r\n useEffect(()=>{\r\n async function fetchProfiles(){\r\n setIsLoading(true);\r\n await Promise.all([updatePlayNowLogs(),updatePlayNowList(),updatePlayers()]);\r\n setIsLoading(false);\r\n }\r\n\r\n fetchProfiles()\r\n },[])\r\n\r\n useEffect(() => {\r\n async function fetchData() {\r\n setIsLoading(true);\r\n await updatePlayNowLogs()\r\n setIsLoading(false);\r\n };\r\n \r\n fetchData()\r\n },[selectedPlayer, selectedPlaylist, currentPage])\r\n\r\n const updatePlayNowList = async () => {\r\n var result = await getPlayNowLists();\r\n if(result.type == 'succes'){\r\n let t = result.data.items.map( el => {\r\n return {\r\n label: el.name,\r\n value: el.id\r\n }\r\n })\r\n setFilteredPlayNow(t);\r\n }\r\n }\r\n\r\n const updatePlayers = async () => {\r\n var result = await getPlayers();\r\n let t = result.players.map( el => {\r\n return {\r\n label: el.name,\r\n value: el.id\r\n }\r\n })\r\n setFilteredPlayers(t);\r\n }\r\n\r\n const updatePlayNowLogs = async () => {\r\n let result = await getPlayNowLogs(selectedPlayer,selectedPlaylist, currentPage, itemsPerPage)\r\n if(result.type === \"succes\") {\r\n setPlayNowLogs(result.data.items)\r\n setTotalPages(result.data.totalPages)\r\n }\r\n }\r\n\r\n const onChangeSelectedPlaylist = (value: SingleValue<Option<Guid>>) => {\r\n if(value){\r\n setSelectedPlaylist(value.value);\r\n } else {\r\n setSelectedPlaylist('');\r\n }\r\n setCurrentPage(1)\r\n }\r\n\r\n const onChangeSelectedPlayer = (value: SingleValue<Option<Guid>>) => {\r\n if(value){\r\n setSelectedPlayer(value.value);\r\n } else {\r\n setSelectedPlayer('');\r\n }\r\n setCurrentPage(1)\r\n }\r\n\r\n const renderLogType = (logType: PlayNowLogTypeEnum) => {\r\n switch (logType) {\r\n case PlayNowLogTypeEnum.Activated:\r\n return <span style={{color:\"#2DCC3D\"}}>Activated</span>\r\n\r\n case PlayNowLogTypeEnum.Deactivated:\r\n return <span style={{color:\"#F43257\"}}>Deactivated</span>\r\n\r\n case PlayNowLogTypeEnum.Locked:\r\n return <span style={{color:\"#2DCC3D\"}}>Locked</span>\r\n\r\n case PlayNowLogTypeEnum.Unlocked:\r\n return <span style={{color:\"#F43257\"}}>Unlocked</span>\r\n \r\n default:\r\n break;\r\n }\r\n }\r\n\r\n const renderPlayNowLogs = (items: PlayNowLog[]) => {\r\n return items.map( item => {\r\n return <tr key={item.id}>\r\n <td>{renderLogType(item.playNowLogType)}</td>\r\n <td>{convertUTCDateToLocalDate(item.dateTime)}</td>\r\n <td>{item.playNowListName}</td>\r\n <td>{item.playerName}</td>\r\n <td>{item.actionDescription}</td>\r\n <td>{item.userName}</td>\r\n </tr>\r\n })\r\n }\r\n\r\n return (\r\n <>\r\n <div className=\"d-flex justify-content-end align-items-center mb-20 w-100 gap15\">\r\n <div className=\"w-300px\">\r\n <label>Playlists</label>\r\n <Select \r\n options={filteredPlayNow}\r\n classNamePrefix={`select`}\r\n onChange={onChangeSelectedPlaylist} \r\n isClearable={true}\r\n />\r\n </div>\r\n <div className=\"w-300px\">\r\n <label>Players</label>\r\n <Select \r\n options={filteredPlayers}\r\n classNamePrefix={`select`}\r\n onChange={onChangeSelectedPlayer} \r\n isClearable={true}\r\n />\r\n </div>\r\n </div>\r\n\r\n <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Action Type</td>\r\n <td>Date Time</td>\r\n <td>Playlist</td>\r\n <td>Player</td>\r\n <td>Action</td>\r\n <td>User</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderPlayNowLogs(playNowLogs)}\r\n </tbody>\r\n </table>\r\n\r\n <Pagination activePage={currentPage} pagesCount={totalPages} aroundElements={2} changePaginationPage={setCurrentPage} />\r\n\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n )\r\n}\r\n\r\nexport default PlayNowLogs","import { FunctionComponent, useEffect, useState } from \"react\";\r\nimport { RouteComponentProps, withRouter } from \"react-router-dom\";\r\nimport { BaseInfo, Guid} from \"../../../api/baseApi\";\r\nimport { getBaseChannels } from \"../../../api/channelsApi\";\r\nimport { createPathWithId, Routes } from \"../../../constants/routes\";\r\nimport { Button } from \"../../components/Button\";\r\nimport FormMultiSelect from \"../../components/formRow/FormMultiSelect\";\r\nimport { FormInput, FormRow, SelectOption } from \"../../components/formRow/FormRow\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport IconButton from \"../../components/iconButton/IconButton\";\r\nimport { RightModal, SmallModal } from \"../../components/sideModal/Modal\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport { changeGroupNameForPlayNow, cloneGroupPlayNow, createGroupForPlayNow, createPlayNowList, CreatePlayNowListRequest, deletePlayNowListApi, disablePlayNowList, enablePlayNowList, getGroupedPlayNowList, getGroupsForPlayNow, getPlayNowLists, GroupedPlayNow, GroupForPlayNowRequest, lockPlayer, PlayNowList, PlayNowListStatus, removeGroupForPlayNow, unlockPlayer, updateGroupForPlayNow, updatePlayNowList, UpdatePlayNowListRequest } from \"../../../api/playNowListApi\"\r\nimport { FullScreen, useFullScreenHandle } from \"react-full-screen\";\r\nimport PlayNowFullscreen from \"../../components/playNowFullscreen/PlayNowFullscreen\";\r\nimport Pagination from \"../../components/pagination/Pagination\";\r\nimport { getPagesCount } from \"../../../services/paginator\";\r\nimport { useErrorHandlingStore } from \"../../../hooks/useErrorHandling\";\r\nimport FormCheckbox from \"../../components/formRow/FormCheckbox\";\r\nimport Select, { MultiValue, SingleValue } from \"react-select\";\r\nimport { getTags } from \"../../../api/tagApi\";\r\nimport Tabs, { TabElement, TabNavigation, TabNavigationElement, TabsContainer } from \"../../components/tab/Tab\";\r\nimport PlayNowLogs from \"../../components/playNowLogs/PlayNowLogs\";\r\n\r\ninterface PlayNowListProps extends RouteComponentProps<any>{\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n\r\ntype SettingsTab = \"List\" | \"Logs\" ;\r\n\r\ntype ModalAction = \"create\" | \"update\" | \"set\" | \"clone\" | \"delete\" | \"nothing\";\r\ntype Option<T> = { value: T, label: string}\r\ninterface CheckedItems {\r\n [key: string]: boolean;\r\n}\r\n \r\nconst CurrentPlayList: FunctionComponent<PlayNowListProps> = (props : PlayNowListProps) => {\r\n let [isLoading, setIsLoading] = useState<boolean>(false);\r\n\r\n let [playNowLists, setPlayNowLists] = useState<PlayNowList[]>([]);\r\n let [playNowChannels, setplayNowChannels] = useState<BaseInfo[]>([]);\r\n let [playNowChannelOptions, setPlayNowChannelOptions] = useState<SelectOption[]>([]);\r\n\r\n let [playNowShowModal, setPlayNowShowModal] = useState<boolean>(false);\r\n\r\n let [playNowListName, setPlayNowListName] = useState<string>(\"\");\r\n let [playNowListNameError, setPlayNowListNameError] = useState<boolean>(false);\r\n let [playNowSelectedChannels, setPlayNowSelectedChannels] = useState<Guid[]>([]);\r\n let [playNowListIdForEdit, setPlayNowListIdForEdit] = useState<Guid>();\r\n\r\n let [isShowSmallModalDeletePlayNowList, setIsShowSmallModalDeletePlayNowList] = useState(false);\r\n let [itemIdForDelete, setItemIdForDelete] = useState<Guid>('');\r\n let [itemNameForDelete, setItemNameForDelete] = useState<string>('');\r\n\r\n let [currentPagePlayNow, setCurrentPagePlayNow] = useState<number>(1);\r\n\r\n let [isUseOrRelationshipInPlayNow, setIsUseOrRelationshipInPlayNow] = useState(false);\r\n let [tags,setTags] = useState<BaseInfo[]>([]);\r\n let [includedTags, setIncludedTags] = useState<BaseInfo[]>([]);\r\n let [excludedTags, setExcludedTags] = useState<BaseInfo[]>([]);\r\n\r\n let [activeTab, setActiveTab] = useState<SettingsTab>(\"List\")\r\n\r\n //group\r\n let [groupedPlayNowList, setGroupedPlayNowList] = useState<GroupedPlayNow[]>([])\r\n let [groupedListItemsToDisplay, setGroupedListItemsToDisplay] = useState<GroupedPlayNow[]>([])\r\n let [isShowGroupModal, setIsShowGroupModal] = useState(false)\r\n let [playNowGroups, setPlayNowGroups ] = useState<Option<Guid>[]>([]);\r\n let [selectedPlayNowGroup, setSelectedPlayNowGroup] = useState<Guid>('');\r\n let [groupName, setGroupName] = useState(\"\");\r\n let [isGroupNameError, setIsGroupNameError] = useState(false);\r\n let [isShowConfirmModal, setIsShowConfirmModal] = useState(false);\r\n let [groupModalAction, setGroupModalAction] = useState<ModalAction>(\"nothing\");\r\n let [itemIdForAction, setItemIdForAction] = useState<Guid>(\"\");\r\n\r\n let [checkedItems, setCheckedItems] = useState<CheckedItems>({});\r\n \r\n let itemsPerPage = 5;\r\n\r\n useEffect(() => {\r\n async function fetchData() {\r\n setIsLoading(true);\r\n await Promise.all([getList(),getChannelsForList(),updateTags(), updateGroups()]);\r\n setIsLoading(false);\r\n };\r\n fetchData();\r\n }, []);\r\n\r\n useEffect(() => {\r\n async function fetchData() {\r\n if(activeTab === \"List\"){\r\n setIsLoading(true);\r\n await Promise.all([getList(),getChannelsForList(),updateTags()]);\r\n setIsLoading(false);\r\n }\r\n };\r\n fetchData();\r\n }, [activeTab]);\r\n\r\n useEffect(() => {\r\n let startIndex = (currentPagePlayNow - 1)*itemsPerPage;\r\n let finishIndex = startIndex + itemsPerPage;\r\n setGroupedListItemsToDisplay(groupedPlayNowList.slice(startIndex, finishIndex));\r\n }, [groupedPlayNowList, currentPagePlayNow]);\r\n\r\n useEffect(() =>{\r\n const initialCheckedItems: CheckedItems = {};\r\n groupedPlayNowList.forEach(item => {\r\n if(checkedItems[item.groupId] === undefined){\r\n initialCheckedItems[item.groupId] = true\r\n } else {\r\n initialCheckedItems[item.groupId] = checkedItems[item.groupId]\r\n }\r\n });\r\n setCheckedItems(initialCheckedItems);\r\n },[groupedPlayNowList])\r\n\r\n const getList = async () => {\r\n setIsLoading(true);\r\n var result = await getGroupedPlayNowList();\r\n if(result.type == 'succes'){\r\n setGroupedPlayNowList(result.data.items);\r\n }\r\n setIsLoading(false);\r\n }\r\n\r\n const getChannelsForList = async () => {\r\n var channelsResult = await getBaseChannels();\r\n if(channelsResult.type == \"succes\"){\r\n setplayNowChannels(channelsResult.data.items);\r\n }\r\n }\r\n\r\n const updateGroups = async () => {\r\n let response = await getGroupsForPlayNow();\r\n if( response.type === \"succes\") {\r\n let t = response.data.items.map( el => {\r\n return {\r\n label: el.name,\r\n value: el.id\r\n }\r\n })\r\n setPlayNowGroups(t);\r\n }\r\n }\r\n\r\n const mapChannelToOption = (it: BaseInfo) : SelectOption => {\r\n return {value: it.id, name: it.name};\r\n }\r\n\r\n const showCreateModalPlayNow = () => {\r\n setPlayNowChannelOptions(playNowChannels.map(mapChannelToOption));\r\n setPlayNowShowModal(true);\r\n }\r\n\r\n const closeModalPlayNow = () => {\r\n setPlayNowListIdForEdit(undefined);\r\n setPlayNowListName('');\r\n setPlayNowSelectedChannels([]);\r\n setPlayNowShowModal(false);\r\n setIncludedTags([]);\r\n setExcludedTags([]);\r\n setIsUseOrRelationshipInPlayNow(false);\r\n }\r\n\r\n const showEditModalPlayNow = (playNow: PlayNowList) => {\r\n setPlayNowChannelOptions([...playNowChannels, ...playNow.channels].map(mapChannelToOption));\r\n setPlayNowListName(playNow.name);\r\n setPlayNowSelectedChannels(playNow.channels.map(it => it.id));\r\n setPlayNowListIdForEdit(playNow.id);\r\n setIncludedTags( tags.filter(it => playNow.includeTagIds.some(it2 => it2.id === it.id)))\r\n setExcludedTags( tags.filter(it => playNow.excludeTagIds.some(it2 => it2.id === it.id)))\r\n setIsUseOrRelationshipInPlayNow(playNow.useORRelationshipForIncludeTags)\r\n setPlayNowShowModal(true);\r\n }\r\n\r\n const onAddChannelPlayNow = (id: Guid) => {\r\n setPlayNowSelectedChannels([...playNowSelectedChannels, id]);\r\n } \r\n\r\n const onRemoveChannelPlayNow = (id: Guid) => {\r\n setPlayNowSelectedChannels(playNowSelectedChannels.filter(it => it !== id));\r\n }\r\n\r\n const deletePlayNowListConfirm = async (id:Guid) => {\r\n setIsLoading(true);\r\n setItemIdForDelete(id);\r\n await deletePlayNowListApi(id);\r\n await getList();\r\n await getChannelsForList();\r\n closeSmallModalPlayNow();\r\n setIsLoading(false);\r\n }\r\n\r\n const saveListPlayNow = async () => {\r\n if(playNowListName === \"\" || playNowListName === undefined){\r\n setPlayNowListNameError(true);\r\n return;\r\n }\r\n if(playNowListIdForEdit === undefined){\r\n let request : CreatePlayNowListRequest = { \r\n channelIds: playNowSelectedChannels, \r\n name: playNowListName,\r\n includeTagIds: includedTags.map( it => it.id),\r\n excludeTagIds: excludedTags.map( it => it.id),\r\n useORRelationshipForIncludeTags: isUseOrRelationshipInPlayNow\r\n };\r\n await createPlayNowList(request);\r\n setPlayNowListName('');\r\n setPlayNowSelectedChannels([]);\r\n }\r\n else{\r\n let request : UpdatePlayNowListRequest = { \r\n channelIds: playNowSelectedChannels, \r\n name: playNowListName,\r\n includeTagIds: includedTags.map( it => it.id),\r\n excludeTagIds: excludedTags.map( it => it.id),\r\n useORRelationshipForIncludeTags: isUseOrRelationshipInPlayNow,\r\n };\r\n await updatePlayNowList(request, playNowListIdForEdit);\r\n setPlayNowListName('');\r\n setPlayNowSelectedChannels([]);\r\n }\r\n await getList();\r\n await getChannelsForList();\r\n closeModalPlayNow();\r\n }\r\n\r\n const activatePlayNow = async (id: Guid) => {\r\n await enablePlayNowList(id);\r\n await getList();\r\n }\r\n \r\n const inactivatePlayNow = async (id: Guid) => {\r\n await disablePlayNowList(id);\r\n await getList();\r\n }\r\n\r\n const renderStatusPlayNow = (status: PlayNowListStatus) => {\r\n switch(status){\r\n case PlayNowListStatus.Active : return <span className=\"status-active\">Active</span>\r\n case PlayNowListStatus.Inactive : return <span className=\"status-paused\">Inactive</span>\r\n }\r\n }\r\n\r\n const updatePlayerLockStatus = async (playlistId: Guid, playerId: Guid, isLocked: boolean) => {\r\n setIsLoading(true)\r\n if(isLocked){\r\n await unlockPlayer(playlistId, playerId)\r\n } else {\r\n await lockPlayer(playlistId, playerId)\r\n }\r\n await getList();\r\n setIsLoading(false)\r\n }\r\n\r\n const renderPlayNowRow = (item: PlayNowList) => {\r\n return <tr key={item.id}>\r\n <td>{item.name}</td>\r\n <td>{item.channels.map(it => <p key={it.id}>{it.name}</p>)}</td>\r\n <td>{renderStatusPlayNow(item.status)}</td>\r\n <td>\r\n <div className=\"d-flex gap5\">\r\n <div style={{paddingRight: '5px'}}>\r\n {item.includeTagIds.map((it, i) => <p key={i}>{it.name}</p>)}\r\n </div>\r\n <div style={{color: \"#717c76\"}}>\r\n {item.excludeTagIds.map((it, i) => <p key={i}>{it.name}</p>)}\r\n </div>\r\n </div>\r\n {item.useORRelationshipForIncludeTags && <div className=\"d-flex align-items-center\" style={{color:\"#2DCC3D\"}}>\r\n Contain any tags\r\n </div>} \r\n </td>\r\n <td>{item.players.map(p => {\r\n return <p key={p.id}>\r\n {p.name}\r\n <span className={`${p.isLocked ? \"\" : \"opacity-50\"}`}>\r\n <IconButton type=\"lock\" tooltipText={`${p.isLocked ? \"Unlock\" : \"Lock\"}`} onClick={()=>{updatePlayerLockStatus(item.id, p.playerId, p.isLocked)}}/>\r\n </span>\r\n </p>\r\n })}\r\n </td>\r\n <td> \r\n { \r\n item.status == PlayNowListStatus.Active \r\n && <IconButton tooltipText=\"Stop\" type=\"stop-play\" onClick={() => inactivatePlayNow(item.id)} />\r\n }\r\n { \r\n item.status == PlayNowListStatus.Inactive \r\n && <IconButton tooltipText=\"Play\" type=\"play\" onClick={() => activatePlayNow(item.id)} />\r\n }\r\n \r\n <IconButton tooltipText=\"Set Group\" type=\"folder\" onClick={() => {showGroupModal(\"set\"); setItemIdForAction(item.id)}} />\r\n <IconButton tooltipText=\"Edit\" type=\"edit\" onClick={() => {showEditModalPlayNow(item)}}/>\r\n <IconButton tooltipText=\"Media\" type=\"list-add\" onClick={()=>{props.history.push(createPathWithId(Routes.PlayNow, item.id))}}/>\r\n <IconButton tooltipText=\"Delete\" type=\"delete\" onClick={()=>showSmallModalPlayNow(item.id, item.name)} />\r\n </td>\r\n </tr>\r\n }\r\n\r\n const renderGroupedPlayNowRow = (items: GroupedPlayNow[]) => {\r\n return items.map((item, index) => {\r\n return <tr className=\"no-hover\" key={item.groupId}>\r\n <td colSpan={11} className=\"group-media-block\" style={{textAlign:'left', padding:\"0 0 15px 30px\"}}>\r\n <div className=\"group-title\">\r\n {item.name}\r\n {!!item.groupId && <>\r\n <IconButton tooltipText=\"Clone\" type=\"copy\" onClick={() => showConfirmModal(item.groupId, \"clone\")}/>\r\n <IconButton tooltipText=\"Edit\" type=\"edit\" onClick={() => showGroupModal(\"update\", item)}/>\r\n <IconButton tooltipText=\"Delete\" type=\"delete\" onClick={() => showConfirmModal(item.groupId, \"delete\")}/>\r\n </>}\r\n <div className=\"d-inline-flex justify-content-end\" style={{marginLeft:30}}>\r\n <label htmlFor={`group-${item.groupId}`} className=\"checkbox-control\" >\r\n <input \r\n id={`group-${item.groupId}`} \r\n className=\"checkbox\" \r\n type=\"checkbox\" \r\n checked={!!checkedItems[item.groupId]}\r\n onChange={() => handleCheckboxChange(item.groupId)}\r\n />\r\n <span className=\"checkbox-bg\"></span>\r\n <span className=\"checkbox-cursor\"></span>\r\n </label>\r\n <span className=\"current-status\"> Expand</span>\r\n </div>\r\n </div>\r\n <tbody>\r\n {item.playNowLists.map(renderPlayNowRow)}\r\n </tbody>\r\n </td>\r\n </tr>\r\n })\r\n }\r\n\r\n \r\n\r\n const showSmallModalPlayNow = (id:Guid, name: string) => {\r\n setItemIdForDelete(id);\r\n setItemNameForDelete(name);\r\n setIsShowSmallModalDeletePlayNowList(true);\r\n }\r\n\r\n const closeSmallModalPlayNow = () => {\r\n setItemIdForDelete('');\r\n setItemNameForDelete('');\r\n setIsShowSmallModalDeletePlayNowList(false);\r\n }\r\n\r\n const handle = useFullScreenHandle();\r\n\r\n const goToFullscreen = () =>{\r\n handle.enter();\r\n }\r\n\r\n const exitFullscreen = () =>{\r\n handle.exit();\r\n }\r\n\r\n const updateTags = async () => {\r\n let tagResponse = await getTags();\r\n if(tagResponse.type == \"succes\") {\r\n setTags(tagResponse.data.items)\r\n }\r\n }\r\n\r\n const onSelectedIncludeTag = (tags: MultiValue<BaseInfo>) => {\r\n setIncludedTags([...tags])\r\n }\r\n\r\n const onSelectedExcludeTag = (tags: MultiValue<BaseInfo>) => {\r\n setExcludedTags([...tags])\r\n }\r\n\r\n const checkActive = (tab: SettingsTab) => tab === activeTab;\r\n\r\n const showGroupModal = (action: ModalAction, item?: GroupedPlayNow) => {\r\n if(item){\r\n setGroupName(item.name)\r\n setItemIdForAction(item.groupId)\r\n }\r\n setGroupModalAction(action)\r\n setIsShowGroupModal(true)\r\n }\r\n\r\n const hideGroupModal = () => {\r\n setSelectedPlayNowGroup(\"\")\r\n setIsGroupNameError(false)\r\n setGroupModalAction(\"nothing\")\r\n setGroupName(\"\")\r\n setItemIdForAction(\"\")\r\n setIsShowGroupModal(false)\r\n }\r\n\r\n const createNewGroupForPlayNow = async () => {\r\n if(groupName === \"\") {\r\n setIsGroupNameError(true);\r\n return;\r\n }\r\n \r\n let request = {name:groupName};\r\n setIsLoading(true)\r\n await createGroupForPlayNow(request)\r\n await updateGroups()\r\n setIsLoading(false)\r\n hideGroupModal()\r\n }\r\n\r\n const updateGroupName = async () => {\r\n if(groupName === \"\") {\r\n setIsGroupNameError(true);\r\n return;\r\n }\r\n \r\n let request = {name:groupName};\r\n setIsLoading(true)\r\n await changeGroupNameForPlayNow(request, itemIdForAction)\r\n await updateGroups()\r\n await getList()\r\n setIsLoading(false)\r\n hideGroupModal()\r\n }\r\n\r\n const saveGroupForPlayNow = async () => {\r\n let request: GroupForPlayNowRequest = {\r\n groupId: selectedPlayNowGroup ? selectedPlayNowGroup : null,\r\n }\r\n setIsLoading(true)\r\n await updateGroupForPlayNow(request, itemIdForAction)\r\n await getList()\r\n setIsLoading(false)\r\n hideGroupModal()\r\n }\r\n\r\n const onChangeSelectedPlayNowGroup = (group: SingleValue<Option<Guid>>) => {\r\n if(group){\r\n setSelectedPlayNowGroup(group.value);\r\n } else {\r\n setSelectedPlayNowGroup('');\r\n }\r\n }\r\n\r\n const handleCheckboxChange = (id: string) => {\r\n setCheckedItems((prev) => ({\r\n ...prev,\r\n [id]: !prev[id],\r\n }));\r\n };\r\n\r\n const showConfirmModal = (id: Guid, action: ModalAction) => {\r\n setItemIdForAction(id);\r\n setGroupModalAction(action)\r\n setIsShowConfirmModal(true);\r\n }\r\n\r\n const closeConfirmModal = () => {\r\n setItemIdForAction(\"\");\r\n setGroupModalAction(\"nothing\")\r\n setIsShowConfirmModal(false);\r\n }\r\n\r\n const cloneGroup = async () => {\r\n setIsLoading(true)\r\n await cloneGroupPlayNow(itemIdForAction)\r\n await updateGroups()\r\n await getList()\r\n setIsLoading(false)\r\n closeConfirmModal()\r\n }\r\n\r\n const deleteGroup = async () => {\r\n setIsLoading(true)\r\n await removeGroupForPlayNow(itemIdForAction)\r\n await updateGroups()\r\n await getList()\r\n setIsLoading(false)\r\n closeConfirmModal()\r\n }\r\n\r\n return ( \r\n <InnerLayout \r\n isCollapsed={props.isCollapsed}\r\n logOut={props.logOut}\r\n toogleCollapse={props.toogleCollapse}\r\n activeTab=\"playNowList\">\r\n <>\r\n <div className=\"d-flex justify-content-between align-items-center mb-20 pt-50\" >\r\n <h2>Play Now</h2>\r\n </div>\r\n \r\n <Tabs>\r\n <TabNavigation>\r\n <TabNavigationElement \r\n title=\"Playlists\" \r\n isActive={checkActive(\"List\")} \r\n onClick={() => { setActiveTab(\"List\") }} \r\n />\r\n <TabNavigationElement \r\n title=\"Logs\" \r\n isActive={checkActive(\"Logs\")} \r\n onClick={() => { setActiveTab(\"Logs\") }} \r\n />\r\n </TabNavigation>\r\n <TabsContainer>\r\n <TabElement isActive={checkActive(\"List\")}>\r\n <>\r\n <div className=\"d-flex justify-content-end align-items-center gap15 w-100 mb-20\" >\r\n <Button color=\"green\" label=\"Add Group\" onClick={() => {showGroupModal(\"create\")}} />\r\n <Button color=\"green\" label=\"Enter Fullscreen Mode\" onClick={goToFullscreen} />\r\n <Button color=\"green\" label=\"Add Play Now\" onClick={showCreateModalPlayNow} />\r\n </div>\r\n <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Name</td>\r\n <td>Networks</td>\r\n <td>Status</td>\r\n <td>Include/Exclude Tags</td>\r\n <td>Players</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {/* {listItemsToDisplay.map(it => renderRowPlayNow(it))} */}\r\n {renderGroupedPlayNowRow(groupedListItemsToDisplay)}\r\n </tbody>\r\n </table>\r\n\r\n <Pagination activePage={currentPagePlayNow} pagesCount={getPagesCount(groupedPlayNowList.length, itemsPerPage)} changePaginationPage={setCurrentPagePlayNow} />\r\n </>\r\n </TabElement>\r\n <TabElement isActive={checkActive(\"Logs\")}>\r\n <>\r\n {checkActive(\"Logs\") && <PlayNowLogs />} \r\n </>\r\n </TabElement>\r\n </TabsContainer>\r\n </Tabs>\r\n\r\n\r\n <FullScreen handle={handle}>\r\n <PlayNowFullscreen \r\n // playNowLists={playNowLists} \r\n playNowLists={groupedPlayNowList.flatMap(el => el.playNowLists)} \r\n isLoading={isLoading}\r\n activatePlayNow={activatePlayNow} \r\n inactivatePlayNow={inactivatePlayNow} \r\n exitFullscreen={exitFullscreen} \r\n />\r\n </FullScreen>\r\n\r\n <RightModal title={playNowListIdForEdit === undefined ? \"Add Play Now\" : \"Edit Play Now\"} \r\n show={playNowShowModal}\r\n onRequestClose={closeModalPlayNow}\r\n >\r\n <FormRow>\r\n <FormInput \r\n id=\"campaign-name\"\r\n title=\"Play Now Name\"\r\n isError={playNowListNameError}\r\n errorMessage=\"Please enter Play Now Name\"\r\n onChange={e => { setPlayNowListName(e.target.value); setPlayNowListNameError(false);}}\r\n value={playNowListName}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormMultiSelect\r\n id=\"players-list\"\r\n title=\"Networks\"\r\n titleSelected=\"Selected Networks\"\r\n isError={false}\r\n errorMessage=\"Please select Networks\"\r\n onAdd={onAddChannelPlayNow}\r\n onRemove={onRemoveChannelPlayNow}\r\n options={playNowChannelOptions}\r\n selectedOptions={playNowSelectedChannels}\r\n />\r\n </FormRow> \r\n <FormRow>\r\n <div className=\"d-flex align-items-center\" style={{paddingTop:\"30px\"}}>\r\n <FormCheckbox id=\"use-or-playnow\" checked={isUseOrRelationshipInPlayNow} onChange={setIsUseOrRelationshipInPlayNow} />\r\n <span className=\"status-block\">\r\n {isUseOrRelationshipInPlayNow ? <span className=\"current-status online\"> Contain any tags</span> : <span className=\"current-status offline\"> Contain any tags</span>}\r\n </span>\r\n </div>\r\n </FormRow>\r\n <FormRow>\r\n <label>Included Tags</label>\r\n <Select \r\n classNamePrefix={`select`}\r\n options={tags.filter(it => !excludedTags.some( it2 => it2.id === it.id))} \r\n isMulti={true}\r\n filterOption={(option, input)=> option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option)=> `${option.id}`}\r\n onChange={onSelectedIncludeTag}\r\n value={includedTags}\r\n /> \r\n </FormRow>\r\n <FormRow>\r\n <label>Excluded Tags</label>\r\n <Select \r\n classNamePrefix={`select`}\r\n options={tags.filter(it => !includedTags.some( it2 => it2.id === it.id))} \r\n isMulti={true}\r\n filterOption={(option, input)=> option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option)=> `${option.id}`}\r\n onChange={onSelectedExcludeTag}\r\n value={excludedTags}\r\n /> \r\n </FormRow>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={saveListPlayNow}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeModalPlayNow}/>\r\n </div>\r\n </RightModal>\r\n\r\n <RightModal title={`${groupModalAction === \"create\" ? \"Add\" : \"Set\"} Group`} show={isShowGroupModal} onRequestClose={hideGroupModal}>\r\n <FormRow>\r\n {groupModalAction === \"set\" && <><label>Groups</label>\r\n <Select \r\n options={playNowGroups}\r\n classNamePrefix={`select`}\r\n onChange={onChangeSelectedPlayNowGroup} \r\n isClearable={true}\r\n /></>}\r\n {(groupModalAction === \"create\" || groupModalAction === \"update\") && <FormInput \r\n errorMessage = \"Please enter Group Name\"\r\n id = \"media_group_name\"\r\n isError = {isGroupNameError}\r\n title = \"Group Name\"\r\n onChangeValue = {(v) => {setGroupName(v); setIsGroupNameError(false)}}\r\n value = {groupName}\r\n />}\r\n </FormRow>\r\n <div className=\"modal-btn-group\">\r\n {groupModalAction === \"set\" && <Button color=\"green\" label=\"Save\" onClick={saveGroupForPlayNow}/>}\r\n {groupModalAction === \"update\" && <Button color=\"green\" label=\"Save\" onClick={updateGroupName}/>}\r\n {groupModalAction === \"create\" && <Button color=\"green\" label=\"Add\" onClick={createNewGroupForPlayNow}/>}\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideGroupModal}/>\r\n </div>\r\n </RightModal> \r\n\r\n <SmallModal show={isShowSmallModalDeletePlayNowList} onRequestClose={closeSmallModalPlayNow}> \r\n <p>That you want to delete list <b>{itemNameForDelete}</b>?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeSmallModalPlayNow}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={()=>deletePlayNowListConfirm(itemIdForDelete)}/>\r\n </div>\r\n </SmallModal>\r\n\r\n <SmallModal show={isShowConfirmModal} onRequestClose={closeConfirmModal}> \r\n {groupModalAction === \"clone\" && <p>That you want to {`${groupModalAction}`} Group?</p>}\r\n {groupModalAction === \"delete\" && <p>That you want to {`${groupModalAction}`} Group?</p>}\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeConfirmModal}/>\r\n {groupModalAction === \"clone\" && <Button color=\"green\" label=\"Yes\" onClick={cloneGroup}/>}\r\n {groupModalAction === \"delete\" && <Button color=\"green\" label=\"Yes\" onClick={deleteGroup}/>}\r\n </div>\r\n </SmallModal>\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n \r\n </InnerLayout> );\r\n}\r\n \r\nexport default withRouter(CurrentPlayList);","import { FunctionComponent, useEffect, useState } from \"react\";\r\nimport { useParams } from \"react-router-dom\";\r\nimport { ReactSortable } from \"react-sortablejs\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport { ReorderItemPair } from \"../../../api/channelsApi\";\r\nimport { getMedia, MediaModel, MediaType } from \"../../../api/mediaApi\";\r\nimport { addLeadingZero, formatDuration, getYoutubeImageUrlById, renderMediaType } from \"../../../services/common\";\r\nimport { Button } from \"../../components/Button\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport IconButton from \"../../components/iconButton/IconButton\";\r\nimport Search from \"../../components/search/Search\";\r\nimport { CenterModal, RightModal, SmallModal } from \"../../components/sideModal/Modal\";\r\nimport SvgSelector from \"../../components/svgSelector/SvgSelector\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport { addMediaToPlayNowList, addPlayNowMediaSchedule, changeGroupNameForPlayNowMedia, cloneGroupedPlayNowMedia, cloneGroupPlayNowMedia, createGroupForPlayNowMedia, deletePlayNowMediaSchedule, disableSkinPlayNowMedia, enableSkinPlayNowMedia, getGroupedPlayNowMedia, getGroupsForPlayNowMedia, getPlayNowListMedias, getPlayNowMediaSchedule, GroupForPlayNowMediaRequest, GroupPlayNowMedia, PlayNowListAddMediaRequest, playNowListDeleteMedia, PlayNowListMedia, PlayNowMediaMediaScheduleRequest, PlayNowMediaSchedule, removeGroupPlayNowMedia, ReorderedPlayNowIds, reorderGroupPlayNowMedia, reorderPlayNowListMedia, updateGroupForPlayNowMedia } from \"../../../api/playNowListApi\"\r\nimport Pagination from \"../../components/pagination/Pagination\";\r\nimport { getPagesCount } from \"../../../services/paginator\";\r\nimport { FormInput, FormRow } from \"../../components/formRow/FormRow\";\r\nimport { formatDate, formatTimeOnly } from \"../../../services/dateService\";\r\nimport Select, { MultiValue, SingleValue } from \"react-select\";\r\n\r\ninterface PlayNowMediaParams {\r\n listId: Guid\r\n}\r\n\r\ninterface PlayNowListMediaProps {\r\n logOut: () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n\r\ntype ModalAction = \"create\" | \"update\" | \"set\" | \"clone\" | \"delete\" | \"nothing\" | \"cloneMedia\" | \"deleteMedia\";\r\ntype Option<T> = { value: T, label: string}\r\ninterface CheckedItems {\r\n [key: string]: boolean;\r\n}\r\n\r\nconst CurrentPlayListMedia: FunctionComponent<PlayNowListMediaProps> = (props: PlayNowListMediaProps) => {\r\n\r\n let { listId } = useParams<PlayNowMediaParams>();\r\n\r\n let [isLoading, setIsLoading] = useState<boolean>(false);\r\n let [showMediaModal, setShowMediaModal] = useState<boolean>(false);\r\n\r\n let [searchString, setSearchString] = useState<string>(\"\");\r\n let [media, setMedia] = useState<MediaModel[]>([]);\r\n let [currentPage, setCurrentPage] = useState<number>(1);\r\n let [selectedMedia, setSelectedMedia] = useState<{ id: string, index: number }[]>([]);\r\n let [totalDuration, setTotalDuration] = useState<number>(0);\r\n\r\n let [isShowScheduleModal, setIsShowScheduleModal] = useState(false);\r\n let [mediaPeriodName, setMediaPeriodName] = useState('');\r\n let [isMediaPeriodNameError, setIsMediaPeriodNameError] = useState(false);\r\n let [mediaPeriodStart, setMediaPeriodStart] = useState('');\r\n let [isMediaPeriodStartError, setIsMediaPeriodStartError] = useState(false);\r\n let [mediaPeriodEnd, setMediaPeriodEnd] = useState('');\r\n let [isMediaPeriodEndError, setIsMediaPeriodEndError] = useState(false);\r\n let [mediaPeriodStartTime, setMediaPeriodStartTime] = useState('');\r\n let [mediaPeriodEndTime, setMediaPeriodEndTime] = useState('');\r\n let [isMediaPeriodEndTimeError, setIsMediaPeriodEndTimeError] = useState(false);\r\n let [mediaShedulePeriodId, setMediaShedulePeriodId] = useState('')\r\n let [currentMediaId, setCurrentMediaId] = useState<Guid>(\"\");\r\n let [playNowMediaSchedule, setPlayNowMediaSchedule] = useState<PlayNowMediaSchedule[]>([])\r\n let [isShowDeletePlayNowMediaScheduleModal, setIsShowDeletePlayNowMediaScheduleModal] = useState(false)\r\n\r\n let [groupedMedia, setGroupedMedia] = useState<GroupPlayNowMedia[]>([])\r\n let [isShowGroupModal, setIsShowGroupModal] = useState(false)\r\n let [mediaGroups, setMediaGroups ] = useState<Option<Guid>[]>([]);\r\n let [selectedMediaGroup, setSelectedMediaGroup] = useState<Guid>('');\r\n let [mediaGroupAction, setMediaGroupAction] = useState<ModalAction>(\"nothing\");\r\n let [groupName, setGroupName] = useState(\"\");\r\n let [isGroupNameError, setIsGroupNameError] = useState(false);\r\n let [isShowConfirmModal, setIsShowConfirmModal] = useState(false);\r\n let [groupModalAction, setGroupModalAction] = useState<ModalAction>(\"nothing\");\r\n let [itemIdForAction, setItemIdForAction] = useState<Guid>(\"\");\r\n let [mediaIdForAction, setMediaIdForAction] = useState<Guid>(\"\");\r\n\r\n let [checkedItems, setCheckedItems] = useState<CheckedItems>({});\r\n\r\n\r\n let mediaItemsPerPage = 12;\r\n\r\n useEffect(() => {\r\n let getData = async () => {\r\n setIsLoading(true);\r\n await Promise.all([updateGroupedMediaList(),updateMedia(), updateGroups()]);\r\n setIsLoading(false);\r\n };\r\n\r\n getData();\r\n }, []);\r\n\r\n useEffect(() =>{\r\n const initialCheckedItems: CheckedItems = {};\r\n groupedMedia.forEach(item => {\r\n if(checkedItems[item.id] === undefined){\r\n initialCheckedItems[item.id] = true\r\n } else {\r\n initialCheckedItems[item.id] = checkedItems[item.id]\r\n }\r\n });\r\n setCheckedItems(initialCheckedItems);\r\n },[groupedMedia])\r\n\r\n const updateGroupedMediaList = async () => {\r\n setIsLoading(true);\r\n let listMediaRequest = await getGroupedPlayNowMedia(listId);\r\n if (listMediaRequest.type == \"succes\") {\r\n setGroupedMedia(listMediaRequest.data.items);\r\n setTotalDuration(calculateTotalDuration(listMediaRequest.data.items));\r\n }\r\n setIsLoading(false);\r\n }\r\n\r\n const calculateTotalDuration = (items: GroupPlayNowMedia[]) => {\r\n let arr: number[] = []\r\n items.map(el => {\r\n if(el.singleMedia){\r\n arr.push(el.singleMedia.durationMs)\r\n }\r\n if(el.groupMedia){\r\n el.groupMedia.map(el2 => {\r\n arr.push(el2.durationMs)\r\n })\r\n }\r\n })\r\n return arr.reduce((a, b) => a+b, 0)\r\n }\r\n\r\n const updateMedia = async () => {\r\n let mediaRequest = await getMedia();\r\n if (mediaRequest.type == \"succes\") {\r\n setMedia(mediaRequest.data.medias);\r\n }\r\n }\r\n\r\n const updateGroups = async () => {\r\n let response = await getGroupsForPlayNowMedia(listId);\r\n if( response.type === \"succes\") {\r\n let t = response.data.items.map( el => {\r\n return {\r\n label: el.name,\r\n value: el.id\r\n }\r\n })\r\n setMediaGroups(t);\r\n }\r\n }\r\n\r\n const getFilteredBySearch = () => {\r\n return searchString === ''\r\n ? media\r\n : media.filter(it => !!it.name && it.name.toLowerCase().includes(searchString.toLowerCase()))\r\n }\r\n\r\n const getMediaItemsToDisplay = () => {\r\n var filteredBySearch = getFilteredBySearch();\r\n let startIndex = (currentPage - 1) * mediaItemsPerPage;\r\n let finishIndex = startIndex + mediaItemsPerPage;\r\n return filteredBySearch.slice(startIndex, finishIndex)\r\n }\r\n\r\n const getNumberOfSelectedMedia = (id: string): number | undefined => {\r\n var element = selectedMedia.find(it => it.id === id);\r\n return element && element.index;\r\n }\r\n\r\n const addOrRemove = (id: Guid) => {\r\n var selectedMediaCopy = [...selectedMedia];\r\n for (var i = 0; i < selectedMediaCopy.length; i++) {\r\n if (selectedMediaCopy[i].id === id) {\r\n selectedMediaCopy.splice(i, 1);\r\n for (var decreaseId = i; decreaseId < selectedMediaCopy.length; decreaseId++) {\r\n selectedMediaCopy[decreaseId].index = selectedMediaCopy[decreaseId].index - 1;\r\n }\r\n setSelectedMedia(selectedMediaCopy);\r\n return;\r\n }\r\n }\r\n\r\n var maxIndex = selectedMediaCopy.length === 0 ? 0 : Math.max(...selectedMediaCopy.map(it => it.index));\r\n selectedMediaCopy.push({ id: id, index: maxIndex + 1 });\r\n setSelectedMedia(selectedMediaCopy);\r\n }\r\n\r\n const closeModal = () => {\r\n setSelectedMedia([]);\r\n setSearchString(\"\");\r\n setShowMediaModal(false);\r\n }\r\n\r\n const addMedia = async () => {\r\n let request: PlayNowListAddMediaRequest = { mediaIds: selectedMedia.map(it => it.id) };\r\n let result = await addMediaToPlayNowList(listId, request);\r\n await updateGroupedMediaList();\r\n closeModal();\r\n }\r\n\r\n const enableSkin = async (mediaId: Guid) => {\r\n setIsLoading(true);\r\n await enableSkinPlayNowMedia(listId, mediaId);\r\n await updateGroupedMediaList();\r\n setIsLoading(false);\r\n }\r\n\r\n const disableSkin = async (mediaId: Guid) => {\r\n setIsLoading(true);\r\n await disableSkinPlayNowMedia(listId, mediaId);\r\n await updateGroupedMediaList();\r\n setIsLoading(false);\r\n }\r\n\r\n const deleteMedia = async () => {\r\n setIsLoading(true)\r\n await playNowListDeleteMedia(listId, itemIdForAction);\r\n await updateGroupedMediaList();\r\n setIsLoading(false)\r\n closeConfirmModal()\r\n }\r\n\r\n const renderMediaLibraryItem = (item: { mediaType: MediaType, number?: number, previewLink: string, fileName: string, id: string }) => {\r\n const className = `media-elem ${item.number && \"checked\"}`\r\n return <div key={item.id} className={className} onClick={() => addOrRemove(item.id)}>\r\n <span className=\"check-elem\">{item.number}</span>\r\n {renderMediaTypePreviewModal(item.mediaType, item.previewLink)}\r\n <p className=\"media-title\">{item.fileName}</p>\r\n </div>\r\n }\r\n\r\n const renderMediaTypePreview = (media: PlayNowListMedia) => {\r\n switch(media.type){\r\n case MediaType.Image : return <img className=\"sortable__item-img\" src={media.url} alt=\"\" />\r\n case MediaType.Video : return <img className=\"sortable__item-img\" src={media.url} alt=\"\" />\r\n case MediaType.VastUrl : return <SvgSelector title=\"url\" />;\r\n case MediaType.Youtube : return <img className=\"sortable__item-img\" src={media.url} alt=\"\" />;\r\n case MediaType.YoutubeLive : return <img className=\"sortable__item-img\" src={media.url} alt=\"\" />;\r\n case MediaType.WebPage : return <SvgSelector title=\"webview\" />;\r\n }\r\n }\r\n\r\n const renderMediaTypePreviewModal = (type: MediaType, url: string) => {\r\n switch(type){\r\n case MediaType.Image : return <img className=\"media-img-preview\" src={url} alt=\"\" />\r\n case MediaType.Video : return <img className=\"media-img-preview\" src={url} alt=\"\" />\r\n case MediaType.VastUrl : return <SvgSelector title=\"url\" />;\r\n case MediaType.Youtube : return <img className=\"media-img-preview\" src={url} alt=\"\" />;\r\n case MediaType.YoutubeLive : return <img className=\"media-img-preview\" src={url} alt=\"\" />;\r\n case MediaType.WebPage : return <SvgSelector title=\"webview\" />;\r\n }\r\n }\r\n\r\n const openScheduleModal = async (mediaId:Guid) => {\r\n setIsLoading(true);\r\n setCurrentMediaId(mediaId);\r\n await updatePlayNowMediaSchedule(mediaId);\r\n setIsShowScheduleModal(true);\r\n setIsLoading(false)\r\n }\r\n\r\n const closeScheduleModal = async () => {\r\n setIsShowScheduleModal(false);\r\n setCurrentMediaId(\"\");\r\n setMediaPeriodName('');\r\n setIsMediaPeriodNameError(false);\r\n setMediaPeriodStart('');\r\n setIsMediaPeriodStartError(false);\r\n setMediaPeriodEnd('');\r\n setIsMediaPeriodEndError(false);\r\n setMediaPeriodStartTime('');\r\n setIsMediaPeriodEndTimeError(false);\r\n setMediaPeriodEndTime('');\r\n setIsMediaPeriodEndTimeError(false);\r\n await updateGroupedMediaList()\r\n }\r\n\r\n const updatePlayNowMediaSchedule = async (mediaId?: Guid) => {\r\n setIsLoading(true)\r\n let id = mediaId ? mediaId : currentMediaId;\r\n let result = await getPlayNowMediaSchedule(listId, id);\r\n if(result.type === \"succes\") {\r\n setPlayNowMediaSchedule(result.data.items)\r\n }\r\n setIsLoading(false)\r\n }\r\n\r\n const saveMediaSchedule = async () => {\r\n let isError = false;\r\n if(mediaPeriodName === '') {\r\n setIsMediaPeriodNameError(true)\r\n isError = true\r\n }\r\n\r\n if(mediaPeriodStart === '') {\r\n setIsMediaPeriodStartError(true)\r\n isError = true\r\n }\r\n\r\n if(mediaPeriodEnd === '') {\r\n setIsMediaPeriodEndError(true)\r\n isError = true\r\n }\r\n\r\n if(new Date(mediaPeriodEnd) < new Date(mediaPeriodStart)){\r\n setIsMediaPeriodEndError(true)\r\n isError = true\r\n }\r\n\r\n if(mediaPeriodStartTime !== ''){\r\n if(mediaPeriodEndTime === ''){\r\n setIsMediaPeriodEndTimeError(true)\r\n isError = true\r\n } else {\r\n let [hoursStart, minutesStart] = mediaPeriodStartTime.split(\":\");\r\n let [hoursEnd, minutesEnd] = mediaPeriodEndTime.split(\":\");\r\n\r\n if(hoursStart >= hoursEnd){\r\n if(minutesStart > minutesEnd){\r\n setIsMediaPeriodEndTimeError(true)\r\n isError = true\r\n }\r\n }\r\n }\r\n }\r\n \r\n if(isError) return\r\n\r\n let request:PlayNowMediaMediaScheduleRequest = {\r\n name: mediaPeriodName,\r\n start: mediaPeriodStart,\r\n end: mediaPeriodEnd,\r\n startTime: mediaPeriodStartTime,\r\n endTime: mediaPeriodEndTime\r\n }\r\n\r\n setIsLoading(true);\r\n\r\n let result = await addPlayNowMediaSchedule(request, listId, currentMediaId);\r\n if(result.type === \"succes\") {\r\n await updatePlayNowMediaSchedule();\r\n }\r\n\r\n setMediaPeriodName('');\r\n setMediaPeriodStart('');\r\n setMediaPeriodEnd('')\r\n setMediaPeriodStartTime('');\r\n setMediaPeriodEndTime('');\r\n setIsLoading(false);\r\n\r\n }\r\n\r\n const showDeletePlayNowMediaScheduleModal = (periodId: Guid) => {\r\n setIsShowDeletePlayNowMediaScheduleModal(true);\r\n setMediaShedulePeriodId(periodId);\r\n }\r\n\r\n const hideDeletePlayNowMediaScheduleModal = () => {\r\n setIsShowDeletePlayNowMediaScheduleModal(false);\r\n setMediaShedulePeriodId('')\r\n }\r\n\r\n const removePlayNowMediaSchedulePeriod = async () => {\r\n await deletePlayNowMediaSchedule(listId, currentMediaId, mediaShedulePeriodId);\r\n await updatePlayNowMediaSchedule();\r\n setIsShowDeletePlayNowMediaScheduleModal(false);\r\n }\r\n\r\n const renderPlayNowMediaScheduleRow = (periods: PlayNowMediaSchedule[]) => {\r\n return periods.map( it => {\r\n return <tr key={it.id}>\r\n <td>{it.name} </td>\r\n <td>{formatDate(it.start)}</td>\r\n <td>{formatDate(it.end)}</td>\r\n <td>{formatTimeOnly(it.startTime)}</td>\r\n <td>{formatTimeOnly(it.endTime)}</td>\r\n <td>\r\n <IconButton type=\"delete\" tooltipText=\"Delete\" tooltipPosition=\"left\" onClick={()=>{\r\n showDeletePlayNowMediaScheduleModal(it.id)}\r\n }/>\r\n </td>\r\n </tr>\r\n })\r\n }\r\n\r\n const renderPlayNowMediaScheduleInTable = (periods: PlayNowMediaSchedule[]) => {\r\n return periods.map( it => {\r\n return <div key={it.id} style={{width:\"285px\"}}>\r\n <p>{it.name} {formatDate(it.start)} - {formatDate(it.end)} {formatTimeOnly(it.startTime)} - {formatTimeOnly(it.endTime)}</p>\r\n </div>\r\n })\r\n }\r\n\r\n const showGroupModal = (action: ModalAction, item?: GroupPlayNowMedia) => {\r\n if(item){\r\n setGroupName(item.name)\r\n setItemIdForAction(item.id)\r\n }\r\n setMediaGroupAction(action)\r\n setIsShowGroupModal(true)\r\n }\r\n\r\n const hideGroupModal = () => {\r\n setSelectedMediaGroup(\"\")\r\n setIsGroupNameError(false)\r\n setMediaGroupAction(\"nothing\")\r\n setGroupName(\"\")\r\n setItemIdForAction(\"\")\r\n setMediaIdForAction(\"\")\r\n setIsShowGroupModal(false)\r\n }\r\n\r\n const createNewGroupForMedia = async () => {\r\n if(groupName === \"\") {\r\n setIsGroupNameError(true);\r\n return;\r\n }\r\n \r\n let request = {name:groupName};\r\n setIsLoading(true)\r\n await createGroupForPlayNowMedia(request, listId)\r\n await updateGroups()\r\n setIsLoading(false)\r\n hideGroupModal()\r\n }\r\n\r\n const updateGroupName = async () => {\r\n if(groupName === \"\") {\r\n setIsGroupNameError(true);\r\n return;\r\n }\r\n \r\n let request = {name:groupName};\r\n setIsLoading(true)\r\n await changeGroupNameForPlayNowMedia(request, itemIdForAction, listId)\r\n await updateGroups()\r\n await updateGroupedMediaList()\r\n setIsLoading(false)\r\n hideGroupModal()\r\n }\r\n\r\n const onChangeSelectedMediaGroup = (group: SingleValue<Option<Guid>>) => {\r\n if(group){\r\n setSelectedMediaGroup(group.value);\r\n } else {\r\n setSelectedMediaGroup('');\r\n }\r\n }\r\n\r\n const handleCheckboxChange = (id: string) => {\r\n setCheckedItems((prev) => ({\r\n ...prev,\r\n [id]: !prev[id],\r\n }));\r\n };\r\n\r\n\r\n const saveGroupForMedia = async () => {\r\n let request: GroupForPlayNowMediaRequest = {\r\n groupId: selectedMediaGroup ? selectedMediaGroup : null,\r\n }\r\n setIsLoading(true)\r\n await updateGroupForPlayNowMedia(request, listId, mediaIdForAction)\r\n await updateGroupedMediaList()\r\n setIsLoading(false)\r\n hideGroupModal()\r\n }\r\n\r\n const showConfirmModal = (id: Guid, action: ModalAction) => {\r\n setItemIdForAction(id);\r\n setGroupModalAction(action)\r\n setIsShowConfirmModal(true);\r\n }\r\n\r\n const closeConfirmModal = () => {\r\n setItemIdForAction(\"\");\r\n setGroupModalAction(\"nothing\")\r\n setIsShowConfirmModal(false);\r\n }\r\n\r\n const cloneGroup = async () => {\r\n setIsLoading(true)\r\n await cloneGroupPlayNowMedia(listId, itemIdForAction)\r\n await updateGroups()\r\n await updateGroupedMediaList()\r\n setIsLoading(false)\r\n closeConfirmModal()\r\n }\r\n\r\n const deleteGroup = async () => {\r\n setIsLoading(true)\r\n await removeGroupPlayNowMedia(listId, itemIdForAction)\r\n await updateGroups()\r\n await updateGroupedMediaList()\r\n setIsLoading(false)\r\n closeConfirmModal()\r\n }\r\n\r\n const cloneMedia = async () => {\r\n setIsLoading(true)\r\n await cloneGroupedPlayNowMedia(listId, itemIdForAction)\r\n await updateGroupedMediaList()\r\n setIsLoading(false)\r\n closeConfirmModal()\r\n }\r\n\r\n const getReorderedIdsForRequest = (medias: GroupPlayNowMedia[]) => {\r\n let requestObject:ReorderedPlayNowIds = {ids:[]}\r\n\r\n medias.forEach((elem) => {\r\n if(elem.singleMedia){\r\n requestObject.ids.push(elem.id)\r\n } \r\n if(elem.groupMedia) {\r\n requestObject.ids.push(...elem.groupMedia.map(it => it.id))\r\n }\r\n })\r\n\r\n return requestObject\r\n }\r\n\r\n const sendReorderedIds = async () => {\r\n setIsLoading(true)\r\n setTimeout(async () => {\r\n await reorderGroupPlayNowMedia(getReorderedIdsForRequest(groupedMedia), listId);\r\n await updateGroupedMediaList()\r\n setIsLoading(false)\r\n }, 200)\r\n }\r\n\r\n const onDropMediaInGroup = async (newOrderedMedia: PlayNowListMedia[], myNum: number) => {\r\n let arr = [...groupedMedia]\r\n arr[myNum].groupMedia = newOrderedMedia\r\n setGroupedMedia(arr)\r\n }\r\n\r\n const renderGroupMedia = (medias: GroupPlayNowMedia[]) => {\r\n return medias.map((item, index) => {\r\n\r\n if(item.singleMedia){\r\n return renderMedia([item.singleMedia])\r\n }\r\n\r\n if(item.groupMedia){\r\n return <>\r\n <tr className=\"no-hover\" key={item.id}>\r\n <td colSpan={11} className=\"group-media-block\" style={{textAlign:'left', padding:\"0 0 15px 30px\"}}>\r\n <div className=\"group-title\">\r\n {item.name}\r\n <IconButton tooltipText=\"Clone\" type=\"copy\" onClick={() => showConfirmModal(item.id, \"clone\")}/>\r\n <IconButton tooltipText=\"Edit\" type=\"edit\" onClick={() => showGroupModal(\"update\", item)}/>\r\n <IconButton tooltipText=\"Delete\" type=\"delete\" onClick={() => showConfirmModal(item.id, \"delete\")}/>\r\n <div className=\"d-inline-flex justify-content-end\" style={{marginLeft:30}}>\r\n <label htmlFor={`group-${item.id}`} className=\"checkbox-control\" >\r\n <input \r\n id={`group-${item.id}`} \r\n className=\"checkbox\" \r\n type=\"checkbox\" \r\n checked={!!checkedItems[item.id]}\r\n onChange={() => handleCheckboxChange(item.id)}\r\n />\r\n <span className=\"checkbox-bg\"></span>\r\n <span className=\"checkbox-cursor\"></span>\r\n </label>\r\n <span className=\"current-status\"> Expand</span>\r\n </div>\r\n </div>\r\n <ReactSortable\r\n disabled={false}\r\n list={item.groupMedia}\r\n setList={(newState) => {onDropMediaInGroup(newState, index)}}\r\n onEnd={sendReorderedIds}\r\n tag=\"tbody\"\r\n filter={'.no-sort'}\r\n animation={150}\r\n fallbackOnBody={true}\r\n swapThreshold={0.65}\r\n >\r\n {renderMedia(item.groupMedia)}\r\n </ReactSortable>\r\n </td>\r\n </tr>\r\n </>\r\n }\r\n })\r\n }\r\n\r\n let globalMediaIndex = 1\r\n const renderMedia = (medias: PlayNowListMedia[]) => {\r\n return medias.map((item) => {\r\n return <tr className={`sortable__item`} key={item.id}>\r\n <td>{addLeadingZero(globalMediaIndex++, 2)}</td>\r\n <td>{renderMediaTypePreview(item)}</td>\r\n <td>{item.name}</td>\r\n <td style={{width:\"6%\"}}>{renderMediaType(item.type)}</td>\r\n <td>{formatDuration(item.durationMs)}</td>\r\n <td>{renderPlayNowMediaScheduleInTable(item.schedule)}</td>\r\n <td>\r\n <IconButton tooltipText=\"Clone\" type=\"copy\" onClick={() => {showConfirmModal(item.id, \"cloneMedia\")}} />\r\n <IconButton tooltipText=\"Set Group\" type=\"folder\" onClick={() => {showGroupModal(\"set\"); setMediaIdForAction(item.id)}} />\r\n {item.isTriggeringSkin\r\n ? <IconButton tooltipText=\"With Skin\" type=\"mosaic\" onClick={() => {disableSkin(item.id)}}/> \r\n : <span className=\"no-skin-svg-icon\">\r\n <IconButton tooltipText=\"No Skin\" type=\"mosaic\" onClick={() => {enableSkin(item.id)}}/>\r\n </span>}\r\n <IconButton tooltipText=\"Schedule\" type=\"clock\" onClick={() => {openScheduleModal(item.id)}} />\r\n <IconButton tooltipText=\"Delete\" type=\"delete\" onClick={() => showConfirmModal(item.id, \"deleteMedia\")} />\r\n </td>\r\n </tr>\r\n })\r\n }\r\n\r\n return (\r\n <InnerLayout\r\n isCollapsed={props.isCollapsed}\r\n logOut={props.logOut}\r\n toogleCollapse={props.toogleCollapse}\r\n activeTab=\"playNowList\">\r\n <>\r\n <div className=\"d-flex justify-content-end align-items-center gap15 mb-20 pt-50\">\r\n <Button color=\"green\" label=\"Create Group\" onClick={() => {showGroupModal(\"create\")}} />\r\n <Button color=\"green\" label=\"Add Media\" onClick={() => setShowMediaModal(true)} />\r\n </div>\r\n\r\n <div className=\"duration-all\">Total duration: {formatDuration(totalDuration)}</div>\r\n\r\n <table className=\"table modal-table media-list-table\">\r\n <thead>\r\n <tr>\r\n <td></td>\r\n <td></td>\r\n <td>Name</td>\r\n <td style={{width:\"6%\"}}>Type</td>\r\n <td>Duration</td>\r\n <td>Schedule</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <ReactSortable\r\n list={groupedMedia}\r\n setList={(newState) => {setGroupedMedia(newState)}}\r\n onEnd={sendReorderedIds}\r\n tag=\"tbody\"\r\n animation={150}\r\n fallbackOnBody={true}\r\n swapThreshold={0.65}\r\n >\r\n {renderGroupMedia(groupedMedia)}\r\n </ReactSortable>\r\n </table>\r\n\r\n <CenterModal\r\n title=\"Media\"\r\n show={showMediaModal}\r\n onRequestClose={closeModal}\r\n >\r\n <>\r\n <div className={`d-flex justify-content-between align-items-center mb-40 `}>\r\n <Search value={searchString} onChangeValue={setSearchString} />\r\n </div>\r\n <div className=\"media-library\">\r\n {getMediaItemsToDisplay().map(\r\n it => renderMediaLibraryItem(\r\n {\r\n mediaType: it.mediaType,\r\n fileName: it.name,\r\n previewLink: it.previewLink,\r\n id: it.id,\r\n number: getNumberOfSelectedMedia(it.id)\r\n }))}\r\n </div>\r\n\r\n <Pagination activePage={currentPage} pagesCount={getPagesCount(getFilteredBySearch().length, mediaItemsPerPage)} changePaginationPage={setCurrentPage} />\r\n\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Add\" onClick={addMedia} />\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeModal} />\r\n </div>\r\n </>\r\n </CenterModal>\r\n\r\n <CenterModal title=\"Media schedule\" show={isShowScheduleModal} onRequestClose={closeScheduleModal}>\r\n <div className=\"mosaic-period-wrapper\">\r\n <div className=\"mosaic-period-inputs\">\r\n <div>\r\n <FormInput \r\n errorMessage = \"Please enter name\"\r\n id = \"period_name\"\r\n isError = {isMediaPeriodNameError}\r\n title = \"Name\"\r\n onChangeValue = {(v) => {setMediaPeriodName(v); setIsMediaPeriodNameError(false)}}\r\n value = {mediaPeriodName}\r\n />\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"start\">Start Date</label>\r\n <input \r\n type=\"date\" \r\n className={`form-control ${isMediaPeriodStartError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"start\" \r\n onChange = {(v) => {setMediaPeriodStart(v.target.value); setIsMediaPeriodStartError(false)}}\r\n value={mediaPeriodStart}\r\n />\r\n {isMediaPeriodStartError && <span className=\"error\">Please select start period</span>}\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"ends\">End Date</label>\r\n <input \r\n type=\"date\" \r\n className={`form-control ${isMediaPeriodEndError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"ends\" \r\n onChange = {(v) => {setMediaPeriodEnd(v.target.value); setIsMediaPeriodEndError(false)}}\r\n value={mediaPeriodEnd}\r\n min={mediaPeriodStart}\r\n disabled={!!!mediaPeriodStart}\r\n />\r\n {isMediaPeriodEndError && <span className=\"error\">End period should be later than start period</span>}\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"start-time\">Start Time</label>\r\n <input \r\n type=\"time\" \r\n className={`form-control`} \r\n name=\"\" \r\n id=\"start-time\" \r\n onChange = {(v) => {setMediaPeriodStartTime(v.target.value)}}\r\n value={mediaPeriodStartTime}\r\n />\r\n {isMediaPeriodStartError && <span className=\"error\">Please select start period</span>}\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"ends-time\">End Time</label>\r\n <input \r\n type=\"time\" \r\n className={`form-control ${isMediaPeriodEndTimeError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"ends-time\" \r\n onChange = {(v) => {setMediaPeriodEndTime(v.target.value); setIsMediaPeriodEndTimeError(false)}}\r\n value={mediaPeriodEndTime}\r\n disabled={!!!mediaPeriodStartTime}\r\n />\r\n {isMediaPeriodEndTimeError && <span className=\"error\">End period should be later than start period</span>}\r\n </div>\r\n <div className=\"\">\r\n <Button color=\"green\" label=\"Add\" onClick={saveMediaSchedule}/>\r\n </div>\r\n </div>\r\n <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Name</td>\r\n <td>Start Date</td>\r\n <td>End Date</td>\r\n <td>Start Time</td>\r\n <td>End Time</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderPlayNowMediaScheduleRow(playNowMediaSchedule)}\r\n </tbody>\r\n </table>\r\n </div>\r\n </CenterModal>\r\n\r\n <RightModal title={`${mediaGroupAction === \"create\" ? \"Add\" : \"Set\"} Group`} show={isShowGroupModal} onRequestClose={hideGroupModal}>\r\n <FormRow>\r\n {mediaGroupAction === \"set\" && <><label>Groups</label>\r\n <Select \r\n options={mediaGroups}\r\n classNamePrefix={`select`}\r\n onChange={onChangeSelectedMediaGroup} \r\n isClearable={true}\r\n /></>}\r\n {(mediaGroupAction === \"create\" || mediaGroupAction === \"update\") && <FormInput \r\n errorMessage = \"Please enter Group Name\"\r\n id = \"media_group_name\"\r\n isError = {isGroupNameError}\r\n title = \"Group Name\"\r\n onChangeValue = {(v) => {setGroupName(v); setIsGroupNameError(false)}}\r\n value = {groupName}\r\n />}\r\n </FormRow>\r\n <div className=\"modal-btn-group\">\r\n {mediaGroupAction === \"set\" && <Button color=\"green\" label=\"Save\" onClick={saveGroupForMedia}/>}\r\n {mediaGroupAction === \"update\" && <Button color=\"green\" label=\"Save\" onClick={updateGroupName}/>}\r\n {mediaGroupAction === \"create\" && <Button color=\"green\" label=\"Add\" onClick={createNewGroupForMedia}/>}\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideGroupModal}/>\r\n </div>\r\n </RightModal> \r\n\r\n <SmallModal show={isShowDeletePlayNowMediaScheduleModal} onRequestClose={hideDeletePlayNowMediaScheduleModal}> \r\n <p>That you want to delete Media Schedule Period</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideDeletePlayNowMediaScheduleModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={removePlayNowMediaSchedulePeriod}/>\r\n </div>\r\n </SmallModal>\r\n\r\n <SmallModal show={isShowConfirmModal} onRequestClose={closeConfirmModal}> \r\n {groupModalAction === \"clone\" && <p>That you want to {`${groupModalAction}`} Group?</p>}\r\n {groupModalAction === \"delete\" && <p>That you want to {`${groupModalAction}`} Group?</p>}\r\n {groupModalAction === \"cloneMedia\" && <p>That you want to clone Media?</p>}\r\n {groupModalAction === \"deleteMedia\" && <p>That you want to delete Media?</p>}\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeConfirmModal}/>\r\n {groupModalAction === \"cloneMedia\" && <Button color=\"green\" label=\"Yes\" onClick={cloneMedia}/>}\r\n {groupModalAction === \"clone\" && <Button color=\"green\" label=\"Yes\" onClick={cloneGroup}/>}\r\n {groupModalAction === \"delete\" && <Button color=\"green\" label=\"Yes\" onClick={deleteGroup}/>}\r\n {groupModalAction === \"deleteMedia\" && <Button color=\"green\" label=\"Yes\" onClick={deleteMedia}/>}\r\n </div>\r\n </SmallModal>\r\n \r\n <GlobalSpinner isShow={isLoading} />\r\n\r\n </>\r\n </InnerLayout>\r\n );\r\n}\r\n\r\nexport default CurrentPlayListMedia;","import { duration } from \"moment\";\r\nimport React, { FunctionComponent, ReactEventHandler, SetStateAction, useEffect, useRef, useState } from \"react\";\r\nimport { RouteComponentProps, useParams, withRouter } from \"react-router-dom\";\r\nimport { ReactSortable } from \"react-sortablejs\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport { getMosaicSingle, MosaicElement, MosaicElementAddRequest, MosaicElementType, postMosaicNewElements, deleteMosaicElements, MosaicElementsArrayAddRequest, MosaicElementsArrayDeleteRequest, uploadImage, IMediaLoopItem as IPlaylistItem, PlaylistItemAddRequest } from \"../../../api/mosaicApi\";\r\nimport { formatDateTime, } from \"../../../services/dateService\";\r\nimport { sunbScribeOnClick, unsubscribe } from \"../../../services/globalEventHandler\";\r\nimport { Button } from \"../../components/Button\";\r\nimport FormCheckbox from \"../../components/formRow/FormCheckbox\";\r\nimport { FormInput, FormInputColorpicker, FormInputNumber, FormRow, FormSelect, SelectOption } from \"../../components/formRow/FormRow\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport IconButton from \"../../components/iconButton/IconButton\";\r\nimport SelectFileButton, { SelectAvatarButton } from \"../../components/selectFileButton/SelectFileButton\";\r\nimport SvgSelector from \"../../components/svgSelector/SvgSelector\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport './MosaicScreen.css'\r\n\r\ninterface MosaicScreenProps extends RouteComponentProps<any>{\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n\r\ninterface IMosaicConfig {\r\n name: string,\r\n gridColumnWidth: string,\r\n gridColumnHeight: string,\r\n columnNumber: number,\r\n rowNumber: number\r\n}\r\n\r\n\r\nconst mosaicContainer: IMosaicConfig = {\r\n name: 'My',\r\n gridColumnWidth: '1fr',\r\n gridColumnHeight: '100px',\r\n columnNumber: 7,\r\n rowNumber:2,\r\n}\r\n\r\ninterface MosaiScreenParams {\r\n skinId: Guid\r\n}\r\n\r\ninterface MosaicElementPreview extends MosaicElementAddRequest {\r\n staticImageUrl?: string,\r\n mediaLoopMediasInfo?: IPlaylistItem[],\r\n}\r\n\r\nconst TimeFormats:SelectOption[] = [\r\n {\r\n name: '14:12:19, 06.09.2022',\r\n value: 'HH:mm:ss, dd.MM.yyyy'\r\n },\r\n {\r\n name:'02:12 PM',\r\n value:'hh:mm tt'\r\n },\r\n {\r\n name:'14:12',\r\n value:'HH:mm'\r\n },\r\n {\r\n name:'14:12:19',\r\n value:'HH:mm:ss'\r\n },\r\n {\r\n name:'02:12:19 PM',\r\n value:'hh:mm:ss tt'\r\n },\r\n {\r\n name:'02/12/19 PM, 06/09/2022',\r\n value:'hh/mm/ss tt, dd/MM/yyyy'\r\n },\r\n {\r\n name:'Tuesday, September 6, 2022 2:12 PM',\r\n value:'f'\r\n },\r\n {\r\n name:'Tuesday, September 6, 2022 2:12:19 PM',\r\n value:'F'\r\n },\r\n]\r\n\r\nlet mockUploadedLoopImage:IPlaylistItem = {\r\n id:'1',\r\n name: 'Test'\r\n}\r\n\r\nconst MosaicScreen: FunctionComponent<MosaicScreenProps> = (props) => {\r\n let {logOut, toogleCollapse, isCollapsed} = props;\r\n\r\n let [mosaic, setMosaic] = useState<MosaicElement[]>([]);\r\n let [mosaicNew, setMosaicNew] = useState<MosaicElementPreview[]>([]);\r\n let [mosaicConfig, setMosaicConfig] = useState<IMosaicConfig>(mosaicContainer);\r\n let [mosaicIdsForDelete, setMosaicIdsForDelete] = useState<Guid[]>([]);\r\n let [idForBackLight, setIdForBackLight] = useState<Guid>('');\r\n let [indexForBackLight, setIndexForBackLight] = useState<number>();\r\n let [uploadedImageName, setUploadedImageName] = useState('');\r\n let [uploadedImageUrl, setUploadedImageUrl] = useState('');\r\n let [uploadedMediaLoopImage, setUploadedMediaLoopImage] = useState<IPlaylistItem>(mockUploadedLoopImage);\r\n\r\n\r\n let [columnStart, setColumnStart] = useState(1);\r\n let [width, setWidth] = useState(1);\r\n let [rowStart, setRowStart] = useState(1);\r\n let [height, setHeight] = useState(1);\r\n let [selectedElementType, setSelectedElementType] = useState<MosaicElementType>(MosaicElementType.Main);\r\n let [currentClickedPositionIndex, setCurrentClickedPositionIndex] = useState(1);\r\n let [chekedCellsNumber, setCheckedCellsNumber] = useState(0);\r\n\r\n let [bgColor, setBgColor] = useState('#ffffff');\r\n let [textColor, setTextColor] = useState('#000000');\r\n\r\n let [selectedTimeFormat, setSelectedTimeFormat] = useState('HH:mm:ss, dd.MM.yyyy');\r\n\r\n let [mosaicValidationErrorText, setMosaicValidationErrorText] = useState('');\r\n\r\n let [imageDuration, setImageDuration] = useState(10);\r\n let [isPlaylistVideoDownloaded, setIsPlaylistVideoDownloaded] = useState(false);\r\n let [isPlaylistMediaDownloaded, setIsPlaylistMediaDownloaded] = useState(false);\r\n let [mediaLoopList, setMediaLoopList] = useState<IPlaylistItem[]>([]);\r\n let [mute, setMute] = useState(true);\r\n let [youtubeIsLive, setYoutubeIsLive] = useState(true);\r\n\r\n let [nameElement, setNameElement] = useState('');\r\n let [youtubeURL, setYoutubeURL] = useState('');\r\n\r\n // let [webviewName, setWebviewName] = useState('');\r\n // let [webviewURL, setWebviewURL] = useState('');\r\n\r\n let [isLoading, setIsLoading] = useState(false);\r\n let {skinId: mosaicId} = useParams<MosaiScreenParams>();\r\n\r\n const mosaicRef = useRef<HTMLDivElement>(null);\r\n\r\n const getElementLimits = (type: MosaicElementType) => {\r\n switch(type) {\r\n case MosaicElementType.Main : return 1\r\n case MosaicElementType.Image: return 10\r\n case MosaicElementType.Clock: return 5\r\n case MosaicElementType.MediaLoop: return 3\r\n case MosaicElementType.Youtube: return 3\r\n case MosaicElementType.WebView: return 3\r\n }\r\n };\r\n\r\n const getElementsCountByType = (type: MosaicElementType) => {\r\n return mosaicNew.filter(it => it.type === type).length + getMosaicReadyToDisplay().filter(it => it.type === type).length;\r\n }\r\n\r\n const isElementOutOfLimit = (type: MosaicElementType) => {\r\n return getElementsCountByType(type) >= getElementLimits(type);\r\n }\r\n\r\n const getIconByType = (type: MosaicElementType) => {\r\n switch(type) {\r\n case MosaicElementType.Main : return <SvgSelector title={`mosaic`}/>\r\n case MosaicElementType.Image: return <SvgSelector title={`image`}/>\r\n case MosaicElementType.Clock: return <SvgSelector title={`clock`}/>\r\n case MosaicElementType.MediaLoop: return <SvgSelector title={`list-add`}/>\r\n case MosaicElementType.Youtube: return <SvgSelector title={`youtube`}/>\r\n case MosaicElementType.WebView: return <SvgSelector title={`webview`}/>\r\n }\r\n }\r\n\r\n const getTimeFormatName = (format:string | undefined) => {\r\n return TimeFormats.find(it => it.value === format)?.name;\r\n }\r\n\r\n\r\n useEffect(()=>{\r\n async function fetchData() {\r\n setIsLoading(true);\r\n await Promise.all([getMosaicDataSingle()])\r\n setIsLoading(false);\r\n };\r\n fetchData();\r\n\r\n sunbScribeOnClick(()=>{\r\n setIdForBackLight('');\r\n setIndexForBackLight(undefined);\r\n }, \"mosaic\")\r\n\r\n return ()=>{\r\n unsubscribe(\"mosaic\");\r\n }\r\n },[])\r\n\r\n useEffect(()=>{\r\n let maxWidth = mosaicConfig.columnNumber - columnStart + 1;\r\n let maxHeight = mosaicConfig.rowNumber - rowStart + 1;\r\n if(columnStart < 1) setColumnStart(1);\r\n if(columnStart > mosaicConfig.columnNumber) setColumnStart(mosaicConfig.columnNumber);\r\n if(rowStart < 1) setRowStart(1);\r\n if(rowStart > mosaicConfig.rowNumber) setRowStart(mosaicConfig.rowNumber);\r\n if(width < 1) setWidth(1);\r\n if(width > maxWidth) setWidth(maxWidth);\r\n if(height < 1) setHeight(1);\r\n if(height > maxHeight) setHeight(maxHeight);\r\n setMosaicValidationErrorText('');\r\n },[columnStart, rowStart, width, height]);\r\n\r\n useEffect(()=>{\r\n if(imageDuration < 0) setImageDuration(0);\r\n },[imageDuration])\r\n\r\n const getMosaicDataSingle = async () => {\r\n setIsLoading(true);\r\n let result = await getMosaicSingle(mosaicId);\r\n\r\n if(result.type === \"succes\") {\r\n let totalWidth = mosaicRef.current?.offsetWidth;\r\n let gridColumnWidth = (totalWidth ? totalWidth : 1) / result.data.data.columnsCount;\r\n setMosaicConfig({...mosaicConfig,\r\n name: result.data.data.name,\r\n gridColumnWidth: gridColumnWidth+'px',\r\n gridColumnHeight: gridColumnWidth+'px',\r\n columnNumber: result.data.data.columnsCount,\r\n rowNumber: result.data.data.rowsCount\r\n })\r\n setMosaic(result.data.data.elements);\r\n }\r\n setIsLoading(false);\r\n }\r\n\r\n const clickOnSavedCell = (id:Guid) => {\r\n if(idForBackLight === id) {\r\n setIdForBackLight('');\r\n } else {setIdForBackLight(id)}\r\n setIndexForBackLight(undefined);\r\n }\r\n\r\n const clickOnPreviewCell = (index: number | undefined) => {\r\n if(indexForBackLight === index) {\r\n setIndexForBackLight(undefined);\r\n } else {setIndexForBackLight(index)}\r\n setIdForBackLight('');\r\n }\r\n\r\n const renderMosaicElements = (mosaic:MosaicElement[]) => {\r\n return mosaic.map( (it) => {\r\n let cellClassnames = `saved-cell ${it.id === idForBackLight && 'backlight'}`;\r\n return <div className={cellClassnames} onClick={()=>clickOnSavedCell(it.id)} key={it.id} style={{\r\n ['--column-start']:`${it.startColumn}`, \r\n ['--column-end']:`${it.startColumn + it.width}`, \r\n ['--row-start']:`${it.startRow}`, \r\n ['--row-end']:`${it.startRow + it.height}`,\r\n }as React.CSSProperties}>\r\n {it.type === MosaicElementType.Image && <img className=\"mosaic-img\" src={it.staticImageUrl} alt=\"\" />}\r\n {it.type === MosaicElementType.Main && <span className=\"txt\">Main</span>}\r\n {it.type === MosaicElementType.Clock && <span className=\"mosaic-clock\" style={{\r\n ['--bg-color']:`${it.clockBackgroundColour}`,\r\n ['--text-color']:`${it.clockTextColour}`\r\n }as React.CSSProperties}><span className=\"txt\">\r\n {formatDateTime(new Date().toISOString(), it.clockTextFormat)}\r\n </span>\r\n </span> }\r\n {it.type === MosaicElementType.MediaLoop && <ol className=\"txt medialoop\">\r\n {it.mediaLoopMedias?.map(it => <li>{it}</li>)}\r\n </ol>}\r\n {it.type === MosaicElementType.Youtube && <span className=\"txt\">YouTube</span>}\r\n {it.type === MosaicElementType.WebView && <span className=\"txt\">WebView: {it.name}<br/>{it.url}</span>}\r\n </div>\r\n })\r\n }\r\n\r\n const renderMosaicElementsNew = (mosaic: MosaicElementPreview[]) => {\r\n return mosaic.map( (it, index) => {\r\n let cellClassnames = `preview-cell ${index === indexForBackLight && 'backlight'}`;\r\n return <div className={cellClassnames} key={`${new Date()}-${index}`} onClick={()=>clickOnPreviewCell(index)} style={{\r\n ['--column-start']:`${it.startColumn}`, \r\n ['--column-end']:`${it.startColumn + it.width}`, \r\n ['--row-start']:`${it.startRow}`, \r\n ['--row-end']:`${it.startRow + it.height}`,\r\n }as React.CSSProperties}>\r\n {it.type === MosaicElementType.Image && <img className=\"mosaic-img\" src={it.staticImageUrl} alt=\"\" />} \r\n {it.type === MosaicElementType.Main && <span className=\"txt\">Main</span>}\r\n {it.type === MosaicElementType.Clock && <span className=\"mosaic-clock\" style={{\r\n ['--bg-color']:`${it.clockBackgroundColour}`,\r\n ['--text-color']:`${it.clockTextColour}`\r\n }as React.CSSProperties}>\r\n <span className=\"txt\">{formatDateTime(new Date().toISOString(), it.clockTextFormat)}</span>\r\n </span> }\r\n {it.type === MosaicElementType.MediaLoop && <ol className=\"txt medialoop\">\r\n {it.mediaLoopMediasInfo?.map(it => <li>{it.name}</li>)}\r\n </ol>}\r\n {it.type === MosaicElementType.Youtube && <span className=\"txt\">YouTube</span>}\r\n {it.type === MosaicElementType.WebView && <span className=\"txt\">WebView: {it.name}<br/>{it.url}</span>}\r\n </div>\r\n })\r\n }\r\n\r\n const renderElementPositionPreview = () => {\r\n return <div className=\"demo-cell\" style={{\r\n ['--column-start']:`${columnStart}`, \r\n ['--column-end']:`${columnStart + width}`, \r\n ['--row-start']:`${rowStart}`, \r\n ['--row-end']:`${rowStart + height}`,\r\n }as React.CSSProperties}>\r\n {!!uploadedImageUrl ? <img className=\"mosaic-img\" src={uploadedImageUrl} alt=\"\" /> : <span className=\"txt\">Preview</span>}\r\n </div>\r\n }\r\n\r\n const calcStartPosition = (posIndex: number) => {\r\n if(chekedCellsNumber != 1){\r\n setCurrentClickedPositionIndex(posIndex);\r\n setColumnStart(posIndex % mosaicConfig.columnNumber === 0 ? mosaicConfig.columnNumber : posIndex % mosaicConfig.columnNumber);\r\n setRowStart(Math.ceil(posIndex/mosaicConfig.columnNumber));\r\n setCheckedCellsNumber(++chekedCellsNumber);\r\n setWidth(1);\r\n setHeight(1);\r\n }\r\n else {\r\n setCheckedCellsNumber(0);\r\n }\r\n }\r\n\r\n const calcEndPosition = (posIndex: number) => {\r\n if(chekedCellsNumber === 1) {\r\n let minColumnStart;\r\n let maxColumnStart;\r\n\r\n let hoverPositionColumn = posIndex % mosaicConfig.columnNumber === 0 ? mosaicConfig.columnNumber : posIndex % mosaicConfig.columnNumber;\r\n\r\n if( currentClickedPositionIndex % mosaicConfig.columnNumber != 0 ) {\r\n minColumnStart = Math.min(currentClickedPositionIndex % mosaicConfig.columnNumber, hoverPositionColumn);\r\n } else {\r\n minColumnStart = hoverPositionColumn;\r\n }\r\n \r\n if(currentClickedPositionIndex % mosaicConfig.columnNumber != 0 ){\r\n maxColumnStart = Math.max(currentClickedPositionIndex % mosaicConfig.columnNumber, hoverPositionColumn);\r\n } else {\r\n maxColumnStart = mosaicConfig.columnNumber;\r\n }\r\n \r\n let minRowStart = Math.min(Math.ceil(currentClickedPositionIndex/mosaicConfig.columnNumber), Math.ceil(posIndex/mosaicConfig.columnNumber));\r\n let maxRowStart = Math.max(Math.ceil(currentClickedPositionIndex/mosaicConfig.columnNumber), Math.ceil(posIndex/mosaicConfig.columnNumber));\r\n\r\n let currentWidth = maxColumnStart - minColumnStart + 1;\r\n let currentHeight = maxRowStart - minRowStart + 1;\r\n \r\n setColumnStart(minColumnStart);\r\n setRowStart(minRowStart);\r\n setWidth(currentWidth);\r\n setHeight(currentHeight);\r\n }\r\n }\r\n\r\n const renderMosaicCells = (columns: number,rows: number) => {\r\n let arr:number[] = [];\r\n let q = columns * rows; \r\n\r\n if( q > 8000) return <></>\r\n\r\n for(let i = 1; i<=q; i++){\r\n arr.push(i)\r\n }\r\n let skipRows = 1;\r\n let skipColumns = 1;\r\n if(rows > 30) skipRows = 5;\r\n if(rows > 100) skipRows = 10;\r\n if(columns > 50) skipColumns = 5;\r\n if(columns > 100) skipColumns = 10;\r\n\r\n return arr.map( (it:any, index:number) => {\r\n if(index < columns){\r\n if(index === 0){\r\n return <div key={index} onClick={()=>calcStartPosition(it)} onMouseEnter={()=>calcEndPosition(it)}>\r\n {skipRows==1 && <span className=\"index-cell y\">{it}</span>}\r\n {skipColumns==1 && <span className=\"index-cell x\">{it}</span>}\r\n </div>\r\n }\r\n\r\n let showColumnNumber = it % skipColumns == 0;\r\n return <div key={index} onClick={()=>calcStartPosition(it)} onMouseEnter={()=>calcEndPosition(it)}>\r\n {showColumnNumber && <span className=\"index-cell x\">{it}</span>}\r\n </div>\r\n }\r\n if(index % columns === 0){\r\n let rowNumber = index/columns + 1;\r\n let showRowNumber = rowNumber % skipRows == 0;\r\n return <div key={index} onClick={()=>calcStartPosition(it)} onMouseEnter={()=>calcEndPosition(it)}>\r\n {showRowNumber && <span className=\"index-cell y\">{rowNumber}</span> }\r\n </div>\r\n } \r\n return <div key={index} onClick={()=>calcStartPosition(it)} onMouseEnter={()=>calcEndPosition(it)}></div>\r\n })\r\n }\r\n\r\n const checkInterceptMainContent = (l1x: number, l1y:number, r1x:number, r1y:number, l2x: number, l2y:number, r2x:number, r2y:number) => {\r\n if (l1x >= r2x || l2x >= r1x) return false;\r\n if (l1y >= r2y || l2y >= r1y) return false;\r\n return true\r\n }\r\n\r\n const updateMosaicTemplate = async () => {\r\n \r\n if(!!mosaicIdsForDelete.length){\r\n await updateMosaicElements();\r\n setMosaicIdsForDelete([]);\r\n }\r\n\r\n let isMainBlockedByClock = false;\r\n let mainElement = [...getMosaicReadyToDisplay(), ...mosaicNew].find(it => it.type === MosaicElementType.Main);\r\n let clockElements = [...getMosaicReadyToDisplay(), ...mosaicNew].filter(it => it.type === MosaicElementType.Clock);\r\n\r\n if(mainElement !== undefined){\r\n let mainElement2: MosaicElement | MosaicElementPreview = mainElement\r\n clockElements.forEach( it => {\r\n let mainStartColumn = mainElement2.startColumn;\r\n let mainStartRow = mainElement2.startRow;\r\n let mainWidth = mainElement2.width;\r\n let mainHeight = mainElement2.height;\r\n let mainEndColumn = mainStartColumn + mainWidth;\r\n let mainEndRow = mainStartRow + mainHeight;\r\n let clockEndColumn = it.startColumn + it.width;\r\n let clockEndRow = it.startRow + it.height;\r\n isMainBlockedByClock = checkInterceptMainContent(mainStartColumn, mainStartRow, mainEndColumn, mainEndRow, it.startColumn, it.startRow, clockEndColumn, clockEndRow);\r\n if(isMainBlockedByClock) {\r\n setMosaicValidationErrorText(\"Can't place Clock Widget over Main Widget\");\r\n }\r\n })\r\n }\r\n\r\n if(!isMainBlockedByClock){\r\n let newMosaicElements: MosaicElementsArrayAddRequest = {\r\n elements: mosaicNew\r\n }; \r\n \r\n await postMosaicNewElements(newMosaicElements, mosaicId);\r\n \r\n await getMosaicDataSingle();\r\n \r\n setColumnStart(1);\r\n setWidth(1);\r\n setRowStart(1);\r\n setHeight(1);\r\n setMosaicNew([]);\r\n setUploadedImageName('');\r\n setUploadedImageUrl('');\r\n setBgColor('#ffffff');\r\n setTextColor('#000000');\r\n setSelectedTimeFormat('HH:mm:ss, dd.MM.yyyy');\r\n setMediaLoopList([]);\r\n setNameElement('');\r\n setYoutubeURL('');\r\n setMute(true);\r\n setYoutubeIsLive(true);\r\n // setWebviewName('');\r\n // setWebviewURL('');\r\n }\r\n }\r\n\r\n\r\n const addLocalNewMosaicElem = async () => {\r\n let newMosaicElement:MosaicElementPreview = {\r\n type: selectedElementType,\r\n startColumn: columnStart,\r\n width: width,\r\n startRow: rowStart,\r\n height: height,\r\n staticImageName: uploadedImageName,\r\n staticImageUrl: uploadedImageUrl,\r\n clockBackgroundColour: bgColor,\r\n clockTextColour: textColor,\r\n clockTextFormat: selectedTimeFormat,\r\n mediaLoopMedias: mediaLoopList.map(it => {\r\n return {\r\n id: it.id,\r\n duration: it.duration,\r\n name: it.name\r\n }\r\n }),\r\n mediaLoopMediasInfo:mediaLoopList.map(it => {\r\n return {\r\n id: it.id,\r\n duration: it.duration,\r\n name: it.name\r\n }\r\n }),\r\n name: nameElement,\r\n url: youtubeURL,\r\n mute: mute,\r\n youtubeIsLive: youtubeIsLive,\r\n // webviewName: webviewName,\r\n // webviewUrl: webviewURL,\r\n }\r\n\r\n \r\n setMosaicNew([...mosaicNew, newMosaicElement])\r\n \r\n setColumnStart(1);\r\n setWidth(1);\r\n setRowStart(1);\r\n setHeight(1);\r\n setUploadedImageName('');\r\n setUploadedImageUrl('');\r\n setBgColor('#ffffff');\r\n setTextColor('#000000');\r\n setSelectedTimeFormat('HH:mm:ss, dd.MM.yyyy');\r\n setMediaLoopList([]);\r\n setNameElement('');\r\n setYoutubeURL('');\r\n setMute(true);\r\n setYoutubeIsLive(true);\r\n // setWebviewName('');\r\n // setWebviewURL('');\r\n }\r\n\r\n const onFileChange = async (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if(event.target.files){\r\n const formData = new FormData();\r\n setIsLoading(true);\r\n formData.append(\"Recource\", event.target.files[0] );\r\n let res = await uploadImage(formData);\r\n if(res.status === 200){\r\n setUploadedImageName(res.data.data.name);\r\n setUploadedImageUrl(res.data.data.url);\r\n setNameElement(res.data.data.name);\r\n event.target.value = '';\r\n }\r\n setIsLoading(false);\r\n }\r\n }\r\n\r\n const onFileChangeMediaLoop = async (event: React.ChangeEvent<HTMLInputElement>) => {\r\n if(event.target.files){\r\n if(event.target.files[0].size > 8*1024*1024 && event.target.files[0].type != 'video/mp4'){\r\n alert(\"Max supported size for image is 8Mb\");\r\n return;\r\n }\r\n\r\n const formData = new FormData();\r\n setIsLoading(true);\r\n formData.append(\"Recource\", event.target.files[0] );\r\n let res = await uploadImage(formData);\r\n if(res.status === 200){\r\n setIsPlaylistMediaDownloaded(true);\r\n if(event.target.files[0].type != 'video/mp4'){\r\n setIsPlaylistVideoDownloaded(false);\r\n setNameElement(res.data.data.originalName);\r\n setUploadedMediaLoopImage({\r\n id: res.data.data.id,\r\n name: res.data.data.originalName,\r\n });\r\n event.target.value = '';\r\n }\r\n else {\r\n setIsPlaylistVideoDownloaded(true);\r\n setNameElement(res.data.data.originalName);\r\n setUploadedMediaLoopImage({\r\n id: res.data.data.id,\r\n name: res.data.data.originalName,\r\n });\r\n event.target.value = '';\r\n }\r\n }\r\n setIsLoading(false);\r\n }\r\n }\r\n\r\n const addToMediaLoopList = () => {\r\n setMediaLoopList([...mediaLoopList,{\r\n id: uploadedMediaLoopImage.id,\r\n name: nameElement,\r\n duration: isPlaylistVideoDownloaded ? 0 : imageDuration\r\n }])\r\n setUploadedMediaLoopImage(mockUploadedLoopImage);\r\n setImageDuration(10);\r\n setNameElement('');\r\n setIsPlaylistVideoDownloaded(false);\r\n setIsPlaylistMediaDownloaded(false);\r\n }\r\n\r\n const resetMediaLoopListItem = () => {\r\n setIsPlaylistVideoDownloaded(false);\r\n setIsPlaylistMediaDownloaded(false);\r\n setUploadedMediaLoopImage(mockUploadedLoopImage);\r\n setImageDuration(10);\r\n setNameElement('');\r\n }\r\n\r\n const updateMosaicElements = async () => {\r\n let idsForDelete:MosaicElementsArrayDeleteRequest = {\r\n ids: [...mosaicIdsForDelete]\r\n }\r\n await deleteMosaicElements(mosaicId, idsForDelete);\r\n await getMosaicDataSingle();\r\n setMosaicIdsForDelete([]);\r\n setUploadedImageName('');\r\n setUploadedImageUrl('')\r\n }\r\n\r\n const removeMosaicElement = (id : Guid) => {\r\n setMosaicValidationErrorText('');\r\n setMosaicIdsForDelete([...mosaicIdsForDelete, id])\r\n }\r\n\r\n const removeMosaicElementNew = (index : number) => {\r\n setMosaicValidationErrorText('');\r\n mosaicNew.splice(index, 1);\r\n setMosaicNew([...mosaicNew]);\r\n }\r\n\r\n const getMosaicElementTypeName = (contentType: MosaicElementType) => {\r\n switch(contentType){\r\n case MosaicElementType.Main : return 'Main';\r\n case MosaicElementType.Image : return 'Image';\r\n case MosaicElementType.Clock : return 'Clock';\r\n case MosaicElementType.MediaLoop : return 'Playlist';\r\n case MosaicElementType.Youtube : return 'Youtube';\r\n case MosaicElementType.WebView : return 'WebView';\r\n }\r\n }\r\n\r\n const renderMosaicElementsToList = (mosaic:MosaicElement[]) => {\r\n return mosaic.map( (it) => {\r\n let isForDelete = mosaicIdsForDelete.includes(it.id);\r\n let isForBacklight = it.id === idForBackLight;\r\n let mosaicListItemClasses = `mosaic-list-item ${isForDelete && 'for-delete'} ${isForBacklight && 'backlight'}`;\r\n return <div className={mosaicListItemClasses} key={it.id} onClick={()=>clickOnSavedCell(it.id)}> \r\n {getIconByType(it.type)}\r\n <div className=\"mosaic-list-content\">\r\n <p><b>{getMosaicElementTypeName(it.type)}</b></p>\r\n <p>Column Start:{it.startColumn} Width:{it.width}</p>\r\n <p>Row Start:{it.startRow} Height:{it.height}</p>\r\n {it.type === MosaicElementType.Image && <>\r\n <img className=\"mosaic-img\" src={it.staticImageUrl} alt=\"\" />\r\n <p>Name: {it.name}</p>\r\n </>} \r\n {it.type === MosaicElementType.Clock && <span>Format: {getTimeFormatName(it.clockTextFormat)}</span>} \r\n {it.type === MosaicElementType.MediaLoop && <ol>\r\n {it.mediaLoopMedias?.map(it2 => {\r\n return <li>{it2}</li>\r\n })}\r\n </ol>} \r\n {it.type === MosaicElementType.Youtube && <>\r\n <p>Name: {it.name}</p>\r\n <p style={{'wordBreak':'break-all'}}>URL: {it.url}</p>\r\n {it.mute && <p>Muted</p>}\r\n {it.youtubeIsLive && <p>Live</p>}\r\n </>} \r\n {it.type === MosaicElementType.WebView && <>\r\n <p>Name: {it.name}</p>\r\n <p style={{'wordBreak':'break-all'}}>URL: {it.url}</p>\r\n </>} \r\n </div>\r\n <IconButton tooltipText=\"Close\" type=\"cross\" onClick={()=>removeMosaicElement(it.id)} />\r\n </div>\r\n })\r\n }\r\n\r\n const renderMosaicElementsNewToList = (mosaic:MosaicElementPreview[], indexForBackLight:number | undefined) => {\r\n return mosaic.map( (it, index) => {\r\n let isForBacklight = index === indexForBackLight;\r\n let mosaicListItemClasses = `mosaic-list-item ${isForBacklight && 'backlight'}`\r\n return <div className={mosaicListItemClasses} key={index} onClick={()=> clickOnPreviewCell(index)}> \r\n {getIconByType(it.type)}\r\n <div className=\"mosaic-list-content\">\r\n <p><b>{getMosaicElementTypeName(it.type)}</b></p>\r\n <p>Column Start:{it.startColumn} Width:{it.width}</p>\r\n <p>Row Start:{it.startRow} Width:{it.height}</p>\r\n {it.type === MosaicElementType.Image && <>\r\n <img className=\"mosaic-img\" src={it.staticImageUrl} alt=\"\" />\r\n <p>Name: {it.name}</p>\r\n </>} \r\n {it.type === MosaicElementType.Clock && <span>Format: {getTimeFormatName(it.clockTextFormat)}</span>} \r\n {it.type === MosaicElementType.MediaLoop && <ol>\r\n {it.mediaLoopMediasInfo?.map(it2 => {\r\n return <li key={it2.id}>{it2.name}</li>\r\n })}\r\n </ol>} \r\n {it.type === MosaicElementType.Youtube && <>\r\n <p>Name: {it.name}</p>\r\n <p style={{'wordBreak':'break-all'}}>URL: {it.url}</p>\r\n {it.mute && <p>Muted</p>}\r\n {it.youtubeIsLive && <p>Live</p>}\r\n </>} \r\n {it.type === MosaicElementType.WebView && <>\r\n <p>Name: {it.name}</p>\r\n <p style={{'wordBreak':'break-all'}}>URL: {it.url}</p>\r\n </>} \r\n </div>\r\n <IconButton tooltipText=\"Close\" type=\"cross\" onClick={()=>removeMosaicElementNew(index)} />\r\n </div>\r\n })\r\n }\r\n\r\n const changeElementType = (type: MosaicElementType) => {\r\n setNameElement('');\r\n setSelectedElementType(type);\r\n }\r\n\r\n const renderElementTypeTab = (type: MosaicElementType) => {\r\n return <span className={`type-item ${selectedElementType === type ? 'active' : ''}`} onClick={()=>{changeElementType(type)}}>\r\n {getIconByType(type)}\r\n {getMosaicElementTypeName(type)}\r\n </span>\r\n }\r\n\r\n const renderElemntTabTilePositionControls = (rowClassnames: string, type: MosaicElementType) => {\r\n return <div className={rowClassnames}>\r\n {isElementOutOfLimit(type) && <span className=\"info-message\">{`You can have ${getElementLimits(type)} elements of this type`}</span>}\r\n <FormRow>\r\n <FormInputNumber \r\n id=\"column-start\"\r\n title=\"Column Start\"\r\n isError={false}\r\n errorMessage=\"Please enter column start\"\r\n onChangeValue={value => setColumnStart(+value)}\r\n onChange={()=>{}}\r\n value={columnStart}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInputNumber \r\n id=\"column-end\"\r\n title=\"Width\"\r\n isError={false}\r\n errorMessage=\"Please enter width\"\r\n onChangeValue={value => setWidth(+value)}\r\n onChange={()=>{}}\r\n value={width}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInputNumber \r\n id=\"row-start\"\r\n title=\"Row Start\"\r\n isError={false}\r\n errorMessage=\"Please enter row start\"\r\n onChangeValue={value => setRowStart(+value)}\r\n onChange={()=>{}}\r\n value={rowStart}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInputNumber \r\n id=\"row-end\"\r\n title=\"Height\"\r\n isError={false}\r\n errorMessage=\"Please enter height\"\r\n onChangeValue={value => setHeight(+value)}\r\n onChange={()=>{}}\r\n value={height}\r\n />\r\n </FormRow>\r\n </div>\r\n }\r\n\r\n const renderElementTypeTabContent = (type: MosaicElementType, isOutOfLimit:boolean) => {\r\n let fixedHeight = '180px';\r\n let rowClassnames = `mosaic-settings-add-elem ${isOutOfLimit ? 'out-of-limit' : ''}`\r\n switch(type){\r\n case MosaicElementType.Main: return <>\r\n <div style={{'minHeight': fixedHeight}}>\r\n {renderElemntTabTilePositionControls(rowClassnames, type)}\r\n </div> \r\n <div className=\"mosaic-settings-add-elem align-items-center\" style={{'marginBottom': '15px'}}>\r\n <Button color=\"green\" label=\"Add Main Widget\" onClick={addLocalNewMosaicElem} isDisabled={isElementOutOfLimit(selectedElementType)} /> \r\n </div>\r\n </>\r\n case MosaicElementType.Image: return <>\r\n <div style={{'minHeight': fixedHeight}}>\r\n {renderElemntTabTilePositionControls(rowClassnames, type)}\r\n <div className=\"image-widget-controls\">\r\n <FormRow>\r\n <div style={{'paddingTop': '15px'}}>\r\n {!isElementOutOfLimit(selectedElementType) && <SelectAvatarButton id=\"mosaic-img\" title=\"Upload Image\" onChange={onFileChange}/>}\r\n </div>\r\n </FormRow>\r\n {uploadedImageName && <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter name\"\r\n id = \"image_name\"\r\n isError = {false}\r\n title = \"Name\"\r\n onChange = {(e)=>{setNameElement(e.target.value)}}\r\n value = {nameElement}\r\n />\r\n </FormRow>}\r\n </div>\r\n </div> \r\n <div className=\"mosaic-settings-add-elem align-items-center\" style={{'marginBottom': '15px'}}>\r\n <Button color=\"green\" label=\"Add Image Widget\" onClick={addLocalNewMosaicElem} isDisabled={isElementOutOfLimit(selectedElementType) || !uploadedImageUrl || !nameElement} /> \r\n {!isElementOutOfLimit(selectedElementType) && !uploadedImageUrl && <span>Please Upload Image</span>}\r\n </div>\r\n </> \r\n case MosaicElementType.Clock: return <>\r\n <div style={{'minHeight': fixedHeight}}>\r\n {renderElemntTabTilePositionControls(rowClassnames, type)}\r\n {!isElementOutOfLimit(selectedElementType) && <div className=\"color-group\">\r\n <FormRow>\r\n <FormSelect\r\n id=\"time-format\"\r\n title=\"Time Format\"\r\n selectedValue={selectedTimeFormat}\r\n isError={false}\r\n errorMessage=\"Error\"\r\n options={TimeFormats}\r\n onChange={setSelectedTimeFormat}\r\n hideDefaultValue={true}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInputColorpicker \r\n id=\"bg-color\"\r\n title=\"Background Color\"\r\n isError={false}\r\n errorMessage=\"Please enter bg color\"\r\n onChangeValue={value => setBgColor(value)}\r\n onChange={()=>{}}\r\n value={bgColor}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInputColorpicker \r\n id=\"text-color\"\r\n title=\"Text Color\"\r\n isError={false}\r\n errorMessage=\"Please enter text color\"\r\n onChangeValue={value => setTextColor(value)}\r\n onChange={()=>{}}\r\n value={textColor}\r\n />\r\n </FormRow>\r\n </div>\r\n }\r\n </div>\r\n <div className=\"mosaic-settings-add-elem align-items-center\" style={{'marginBottom': '15px'}}>\r\n <Button color=\"green\" label=\"Add Clock Widget\" onClick={addLocalNewMosaicElem} isDisabled={isElementOutOfLimit(selectedElementType) || !!!selectedTimeFormat} /> \r\n {!isElementOutOfLimit(selectedElementType) && !!!selectedTimeFormat && <span>Please Select Time Format</span>}\r\n </div> \r\n </> \r\n case MosaicElementType.MediaLoop: return <>\r\n <div style={{'minHeight': fixedHeight, 'paddingBottom':'1px'}}>\r\n {renderElemntTabTilePositionControls(rowClassnames, type)}\r\n <div className=\"d-flex align-items-end medialoop-widget\">\r\n \r\n {!isPlaylistMediaDownloaded && <FormRow>\r\n {!isElementOutOfLimit(selectedElementType) && <SelectFileButton title=\"Upload Media\" onChange={onFileChangeMediaLoop}/>}\r\n </FormRow>}\r\n {isPlaylistMediaDownloaded && <>\r\n {!isPlaylistVideoDownloaded && <FormRow>\r\n <FormInputNumber \r\n id=\"image-duration\"\r\n title=\"Image Duration (seconds)\"\r\n isError={false}\r\n errorMessage=\"Please enter image duration\"\r\n onChangeValue={value => setImageDuration(+value)}\r\n onChange={()=>{}}\r\n value={imageDuration}\r\n />\r\n </FormRow>}\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter name\"\r\n id = \"playlistItem_name\"\r\n isError = {false}\r\n title = \"Name\"\r\n onChange = {(e)=>{setNameElement(e.target.value)}}\r\n value = {nameElement}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={resetMediaLoopListItem} />\r\n </FormRow>\r\n <FormRow>\r\n <Button color=\"green\" label=\"Add To List\" onClick={addToMediaLoopList} isDisabled={!nameElement} />\r\n </FormRow>\r\n </>}\r\n </div>\r\n <div className=\"sort-media-loop\">\r\n <ReactSortable \r\n list={mediaLoopList}\r\n setList={(newState) => { onDrop(newState) }}\r\n tag=\"div\"\r\n >\r\n {renderMediaLoopItems(mediaLoopList)}\r\n </ReactSortable>\r\n </div>\r\n </div> \r\n <div className=\"mosaic-settings-add-elem align-items-center playlist-mute-pos\" style={{'marginBottom': '15px'}}>\r\n <Button color=\"green\" label=\"Add Playlist Widget\" onClick={addLocalNewMosaicElem} isDisabled={isElementOutOfLimit(selectedElementType) || !!!mediaLoopList.length} />\r\n {!isElementOutOfLimit(selectedElementType) && !!!mediaLoopList.length && <span>Please Upload Media</span>}\r\n <div className=\"mute-container\">\r\n <div className=\"block\">\r\n <FormCheckbox id=\"mute-playlist-status\" checked={mute} onChange={setMute} />\r\n <span className=\"mute-block\">\r\n {mute ? <span className=\"mute-status online\">Mute</span> : <span className=\"current-status offline\">Mute</span>}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </> \r\n case MosaicElementType.Youtube: return <>\r\n <div style={{'minHeight': fixedHeight}}>\r\n {renderElemntTabTilePositionControls(rowClassnames, type)}\r\n {!isElementOutOfLimit(selectedElementType) && <div className=\"youtube-widget\">\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter name\"\r\n id = \"yotube_name\"\r\n isError = {false}\r\n title = \"Name\"\r\n onChange = {(e)=>{setNameElement(e.target.value)}}\r\n value = {nameElement}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter url\"\r\n id = \"yotube_url\"\r\n isError = {false}\r\n title = \"URL\"\r\n onChange = {(e)=>{setYoutubeURL(e.target.value)}}\r\n value = {youtubeURL}\r\n />\r\n </FormRow>\r\n <div className=\"mute-container\">\r\n <div className=\"block\">\r\n <FormCheckbox id=\"mute-youtube-status\" checked={mute} onChange={setMute} />\r\n <span className=\"mute-block\">\r\n {mute ? <span className=\"mute-status online\">Mute</span> : <span className=\"current-status offline\">Mute</span>}\r\n </span>\r\n </div>\r\n <div className=\"block\">\r\n <FormCheckbox id=\"live-playlist-status\" checked={youtubeIsLive} onChange={setYoutubeIsLive} />\r\n <span className=\"live-block\">\r\n {youtubeIsLive ? <span className=\"live-status online\">Live</span> : <span className=\"current-status offline\">Live</span>}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n <div className=\"mosaic-settings-add-elem align-items-center\" style={{'marginBottom': '15px'}}>\r\n <Button color=\"green\" label=\"Add Youtube Widget\" onClick={addLocalNewMosaicElem} isDisabled={isElementOutOfLimit(selectedElementType) || nameElement === '' || youtubeURL ===''} />\r\n </div> \r\n </> \r\n case MosaicElementType.WebView: return <>\r\n <div style={{'minHeight': fixedHeight}}>\r\n {renderElemntTabTilePositionControls(rowClassnames, type)}\r\n {!isElementOutOfLimit(selectedElementType) && <div className=\"webview-widget d-flex gap15\">\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter name\"\r\n id = \"webview_name\"\r\n isError = {false}\r\n title = \"Name\"\r\n onChange = {(e)=>{setNameElement(e.target.value)}}\r\n value = {nameElement}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter url\"\r\n id = \"webview_url\"\r\n isError = {false}\r\n title = \"URL\"\r\n onChange = {(e)=>{setYoutubeURL(e.target.value)}}\r\n value = {youtubeURL}\r\n />\r\n </FormRow>\r\n \r\n </div>\r\n }\r\n </div>\r\n <div className=\"mosaic-settings-add-elem align-items-center\" style={{'marginBottom': '15px'}}>\r\n <Button color=\"green\" label=\"Add Webview Widget\" onClick={addLocalNewMosaicElem} isDisabled={isElementOutOfLimit(selectedElementType) || nameElement === '' || youtubeURL ===''} />\r\n </div> \r\n </> \r\n }\r\n }\r\n\r\n const renderMediaLoopItems = (items: IPlaylistItem[]) => {\r\n return items.map(it => {\r\n return <p key={it.id}>{it.name} <IconButton tooltipText=\"Close\" type=\"cross\" onClick={()=>removeFromMediaLoopList(it.id)} /></p>\r\n })\r\n }\r\n\r\n const removeFromMediaLoopList = (id: string) => {\r\n setMediaLoopList([...mediaLoopList.filter(it => it.id != id)]);\r\n }\r\n\r\n const onDrop = async (newOrderedMedia: IPlaylistItem[]) => {\r\n setMediaLoopList([...newOrderedMedia])\r\n }\r\n\r\n const getMosaicReadyToDisplay = () => {\r\n return mosaic.filter( it => !mosaicIdsForDelete.includes(it.id));\r\n }\r\n\r\n return <InnerLayout \r\n activeTab=\"skins\" \r\n logOut={logOut} \r\n toogleCollapse={toogleCollapse}\r\n isCollapsed={isCollapsed}\r\n >\r\n <>\r\n <div className=\"mosaic-settings-block pt-50\">\r\n <div className=\"mosaic-settings-row\">\r\n <h1>{mosaicConfig.name} ({mosaicConfig.columnNumber} x {mosaicConfig.rowNumber})</h1>\r\n </div>\r\n <div className=\"mosaic-settings-row\">\r\n <div className=\"type-content-block\">\r\n {renderElementTypeTab(MosaicElementType.Main)}\r\n {renderElementTypeTab(MosaicElementType.Image)}\r\n {renderElementTypeTab(MosaicElementType.Clock)}\r\n {renderElementTypeTab(MosaicElementType.MediaLoop)}\r\n {renderElementTypeTab(MosaicElementType.Youtube)}\r\n {renderElementTypeTab(MosaicElementType.WebView)}\r\n </div>\r\n {renderElementTypeTabContent(selectedElementType, isElementOutOfLimit(selectedElementType))}\r\n </div>\r\n </div>\r\n <div className=\"mosaic\">\r\n <div className=\"container-mosaic\" onClick={(e)=>{e.stopPropagation()}}>\r\n <div className=\"wrapper-mosaic\">\r\n <div className=\"grid-container\" \r\n ref={mosaicRef}\r\n style={{ \r\n \"--grid-column-width\": `${mosaicConfig.gridColumnWidth}`, \r\n \"--grid-column-height\": `${mosaicConfig.gridColumnHeight}`,\r\n \"--column-number\": `${mosaicConfig.columnNumber}`, \r\n \"--row-number\": `${mosaicConfig.rowNumber}`} as React.CSSProperties\r\n }\r\n >\r\n {renderMosaicElements(getMosaicReadyToDisplay())}\r\n {renderMosaicElementsNew(mosaicNew)}\r\n {renderElementPositionPreview()}\r\n </div>\r\n <div className=\"grid-container abs-pos\" \r\n style={{ \r\n \"--grid-column-width\": `${mosaicConfig.gridColumnWidth}`, \r\n \"--grid-column-height\": `${mosaicConfig.gridColumnHeight}`,\r\n \"--column-number\": `${mosaicConfig.columnNumber}`, \r\n \"--row-number\": `${mosaicConfig.rowNumber}`} as React.CSSProperties\r\n }\r\n >\r\n {renderMosaicCells(mosaicConfig.columnNumber, mosaicConfig.rowNumber)}\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div className=\"mosaic-list\" onClick={(e)=>{e.stopPropagation()}}>\r\n {!!mosaic.length && <h3>List of Elements</h3>}\r\n {renderMosaicElementsToList(mosaic)}\r\n \r\n {!!mosaicNew.length && <h3>New Elements</h3>}\r\n {renderMosaicElementsNewToList(mosaicNew, indexForBackLight)}\r\n {mosaicValidationErrorText && <span className=\"error\">Can't place Clock Widget over Main Widget</span>}\r\n {(!!mosaicNew.length || !!mosaicIdsForDelete.length) && <div className=\"mosaic-settings-add-elem\" style={{'marginBottom': '15px'}}>\r\n <Button color=\"green\" label=\"Save\" onClick={updateMosaicTemplate} />   \r\n <Button color=\"gray\" label=\"Discard\" onClick={()=>{window.location.reload()}} />\r\n </div>}\r\n </div>\r\n\r\n\r\n </div>\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n </InnerLayout>\r\n}\r\n\r\nexport default withRouter(MosaicScreen);","import React, { FunctionComponent, useEffect, useState } from \"react\";\r\nimport { Link, RouteComponentProps, withRouter } from \"react-router-dom\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport { deleteMosaic, deleteMosaicTimeslot, getMosaicList, getMosaicTimeslots, MosaicCreateRequest, MosaicModel, MosaicTimeslotRequest, MosaicTimeslotResponse, postMosaicTemplate, postMosaicTimeslot } from \"../../../api/mosaicApi\";\r\nimport { createPathWithId, Routes } from \"../../../constants/routes\";\r\nimport { formatDate, formatTime } from \"../../../services/dateService\";\r\nimport { Button } from \"../../components/Button\";\r\nimport { FormInput, FormInputNumber, FormRow } from \"../../components/formRow/FormRow\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport IconButton from \"../../components/iconButton/IconButton\";\r\nimport { CenterModal, RightModal, SmallModal } from \"../../components/sideModal/Modal\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport './MosaicScreen.css' \r\nimport Pagination from \"../../components/pagination/Pagination\";\r\nimport { getPagesCount } from \"../../../services/paginator\";\r\n\r\ninterface MosaicScreenProps extends RouteComponentProps<any>{\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n\r\nconst MosaicScreenList: FunctionComponent<MosaicScreenProps> = (props) => {\r\n let {logOut, toogleCollapse, isCollapsed, history} = props;\r\n\r\n let [mosaicList, setMosaicList] = useState<MosaicModel[]>([]);\r\n\r\n let [templateName, setTemplateName] = useState('');\r\n let [templateNameError, setTemplateNameError] = useState(false);\r\n let [columnNumber, setColumnNumber] = useState(1);\r\n let [columnNumberError, setColumnNumberError] = useState(false);\r\n let [rowNumber, setRowNumber] = useState(1);\r\n let [rowNumberError, setRowNumberError] = useState(false);\r\n\r\n let [isShowCreateModal, setIsShowCreateModal] = useState(false);\r\n let [isShowSmallModalDeleteMosaic, setIsShowSmallModalDeleteMosaic] = useState(false);\r\n let [isShowScheduleModal, setIsShowScheduleModal] = useState(false);\r\n let [idForDelete, setIdForDelete] = useState<Guid>('');\r\n let [itemNameForDelete, setItemNameForDelete] = useState('');\r\n let [isLoading, setIsLoading] = useState(false);\r\n\r\n let [mosaicScheduleName, setMosaicScheduleName] = useState<JSX.Element>();\r\n let [isPeriodStartError, setIsPeriodStartError] = useState(false);\r\n let [isPeriodEndError, setIsPeriodEndError] = useState(false);\r\n let [periodStart, setPeriodStart] = useState('');\r\n let [periodEnd, setPeriodEnd] = useState('');\r\n let [periodName, setPeriodName] = useState('');\r\n let [isPeriodNameError, setIsPeriodNameError] = useState(false);\r\n let [currentMosaicId, setCurrentMosaicId] = useState<Guid>('');\r\n let [mosaicTimeslots, setMosaicTimeslots] = useState<MosaicTimeslotResponse[]>([]);\r\n\r\n let [currentPage, setCurrentPage] = useState(1);\r\n let [listItemsForDisplay,setListItemsToDisplay] = useState<MosaicModel[]>([]);\r\n let itemsPerPage = 10;\r\n\r\n useEffect(()=>{\r\n async function fetchData() {\r\n setIsLoading(true);\r\n await Promise.all([getMosaicListData()]);\r\n setIsLoading(false);\r\n };\r\n fetchData();\r\n },[]);\r\n\r\n useEffect(() => {\r\n let startIndex = (currentPage - 1)*itemsPerPage;\r\n let finishIndex = startIndex + itemsPerPage;\r\n setListItemsToDisplay(mosaicList.slice(startIndex, finishIndex));\r\n }, [mosaicList, currentPage]);\r\n\r\n const getMosaicListData = async () => {\r\n setIsLoading(true);\r\n let result = await getMosaicList();\r\n if(result.type === \"succes\") {\r\n setMosaicList(result.data.items)\r\n }\r\n setIsLoading(false);\r\n }\r\n\r\n const showCreateModal = () => {\r\n setIsShowCreateModal(true);\r\n }\r\n\r\n const hideCreateModal = () => {\r\n setIsShowCreateModal(false);\r\n }\r\n\r\n const templateNameHandler = (name: string) => {\r\n setTemplateNameError(false);\r\n setTemplateName(name)\r\n }\r\n\r\n const columnNumberHandler = (columns: number) => {\r\n if(columns > 0){\r\n setColumnNumberError(false);\r\n setColumnNumber(columns)\r\n }\r\n }\r\n\r\n const rowNumberHandler = (rows: number) => {\r\n if(rows > 0) {\r\n setRowNumberError(false);\r\n setRowNumber(rows)\r\n }\r\n }\r\n\r\n const goToCurrentMosaicScreen = (id: Guid) => {\r\n history.push(createPathWithId(Routes.Skins, id))\r\n }\r\n\r\n const goToCurrentSkinReport = (id: Guid) => {\r\n history.push(createPathWithId(Routes.ReportsSkin, id))\r\n }\r\n\r\n const saveTemplate = async () => {\r\n var isError = false;\r\n if(!templateName) { setTemplateNameError(true); isError = true; }\r\n if(columnNumber < 1) { setColumnNumberError(true); isError = true; }\r\n if(rowNumber < 1) { setRowNumberError(true); isError = true; }\r\n\r\n if(isError) return;\r\n\r\n let request: MosaicCreateRequest = {\r\n name: templateName,\r\n columnsCount: columnNumber,\r\n rowsCount: rowNumber,\r\n }\r\n let result = await postMosaicTemplate(request);\r\n if(result.type === 'succes'){\r\n goToCurrentMosaicScreen(result.data.id)\r\n }\r\n }\r\n\r\n const deleteCurrentMosaicScreen = (id: Guid, name: string) => {\r\n setIsShowSmallModalDeleteMosaic(true);\r\n setIdForDelete(id);\r\n setItemNameForDelete(name);\r\n }\r\n\r\n const deleteMosaicConfirm = async (id: Guid) => {\r\n await deleteMosaic(id);\r\n await getMosaicListData();\r\n closeSmallModalMosaic();\r\n }\r\n\r\n const closeSmallModalMosaic = () => {\r\n setIsShowSmallModalDeleteMosaic(false);\r\n setIdForDelete('');\r\n setItemNameForDelete('');\r\n }\r\n\r\n const renderMosaicListRow = (mosaic:MosaicModel) => {\r\n return <tr key={mosaic.id}>\r\n <td>{mosaic.name}</td>\r\n <td>{mosaic.players.map((it,i) => <p key={i}>{it}</p>)}</td>\r\n <td>{mosaic.columnsCount} x {mosaic.rowsCount}</td>\r\n <td>\r\n <IconButton type=\"report2\" tooltipText=\"Skin Report\" onClick={() => {goToCurrentSkinReport(mosaic.id)}} />\r\n <IconButton type=\"clock\" tooltipText=\"Schedule\" onClick={() => {openScheduleModal(mosaic.name, mosaic.id)}} />\r\n <IconButton type=\"edit\" tooltipText=\"Edit\" onClick={()=>{goToCurrentMosaicScreen(mosaic.id)}}/>\r\n <IconButton type=\"delete\" tooltipText=\"Delete\" onClick={()=>{deleteCurrentMosaicScreen(mosaic.id, mosaic.name)}}/>\r\n </td>\r\n </tr>\r\n }\r\n\r\n // const pageLink = (page: number, isActive: boolean) => <a key={page} className={`${isActive ? \"active\": \"\"}`} onClick={()=>{setCurrentPage(page)}} >{page}</a> \r\n\r\n // const renderPagination = ( itemsPerPage: number, activeLinkNumber: number) => {\r\n // let length = mosaicList.length;\r\n // let pagesCount = length % itemsPerPage === 0 ? length / itemsPerPage : Math.floor(length / itemsPerPage) + 1;\r\n // let links = [];\r\n // for ( let i = 1; i <= pagesCount; i++) links.push(i);\r\n // return <div className=\"pagination\">\r\n // {links.map(i => pageLink(i, i === activeLinkNumber))}\r\n // </div>\r\n // }\r\n\r\n\r\n const openScheduleModal = async (title:string, id:Guid) => {\r\n setMosaicScheduleName(<><b>{`${title}`}</b> <span>schedule</span></>)\r\n setIsShowScheduleModal(true);\r\n setCurrentMosaicId(id);\r\n setIsLoading(true);\r\n await updateMosaicTimeslots(id);\r\n setIsLoading(false)\r\n }\r\n\r\n const closeScheduleModal = () => {\r\n setIsShowScheduleModal(false);\r\n setMosaicScheduleName(<></>);\r\n setCurrentMosaicId('');\r\n setMosaicTimeslots([]);\r\n }\r\n\r\n const setStartDatePeriod = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setPeriodStart(event.target.value);\r\n setIsPeriodStartError(false);\r\n }\r\n\r\n const setEndDatePeriod = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setPeriodEnd(event.target.value);\r\n setIsPeriodEndError(false);\r\n }\r\n\r\n useEffect(()=>{\r\n setIsPeriodNameError(false)\r\n },[periodName])\r\n\r\n useEffect(()=>{\r\n setIsPeriodStartError(false);\r\n setIsPeriodEndError(false)\r\n },[periodStart, periodEnd])\r\n\r\n const saveTimeslot = async () => {\r\n let isError = false;\r\n if(periodName === '') {\r\n setIsPeriodNameError(true);\r\n isError = true\r\n }\r\n\r\n if(periodStart === ''){\r\n setIsPeriodStartError(true)\r\n isError = true\r\n }\r\n\r\n if(periodEnd === ''){\r\n setIsPeriodEndError(true)\r\n isError = true\r\n }\r\n\r\n if(new Date(periodEnd) <= new Date(periodStart)){\r\n setIsPeriodEndError(true);\r\n isError = true\r\n }\r\n if(isError) return\r\n\r\n let request:MosaicTimeslotRequest = {\r\n name: periodName,\r\n start: periodStart,\r\n end: periodEnd \r\n }\r\n\r\n setIsLoading(true);\r\n let result = await postMosaicTimeslot(request, currentMosaicId);\r\n if(result.type === \"succes\") {\r\n await updateMosaicTimeslots(currentMosaicId);\r\n }\r\n setPeriodName('');\r\n setPeriodStart('');\r\n setPeriodEnd('');\r\n setIsLoading(false);\r\n }\r\n\r\n const removeTimeslot = async (mosaicId:Guid, slotId:Guid) => {\r\n setIsLoading(true)\r\n await deleteMosaicTimeslot(mosaicId,slotId);\r\n await updateMosaicTimeslots(mosaicId);\r\n setIsLoading(false);\r\n }\r\n\r\n const updateMosaicTimeslots = async (mosaicId:Guid) => {\r\n let result = await getMosaicTimeslots(mosaicId);\r\n if(result.type === \"succes\") {\r\n setMosaicTimeslots(result.data.items.sort((a,b)=>{\r\n return new Date(a.start).getTime() - new Date(b.start).getTime()\r\n }))\r\n }\r\n }\r\n\r\n const renderTimeslotRow = (timeslots: MosaicTimeslotResponse[]) => {\r\n return timeslots.map( it => {\r\n return <tr key={it.id}>\r\n <td>{it.name}</td>\r\n <td>{formatDate(it.start)} {formatTime(it.start)}</td>\r\n <td>{formatDate(it.end)} {formatTime(it.end)}</td>\r\n <td>\r\n <IconButton type=\"delete\" tooltipText=\"Delete\" onClick={()=>{removeTimeslot(currentMosaicId, it.id)}}/>\r\n </td>\r\n </tr>\r\n })\r\n }\r\n\r\n return <InnerLayout \r\n activeTab=\"skins\" \r\n logOut={logOut} \r\n toogleCollapse={toogleCollapse}\r\n isCollapsed={isCollapsed}\r\n >\r\n <> \r\n <div className=\"d-flex justify-content-between align-items-center mb-20 pt-50\">\r\n <div className=\"d-flex gap15\">\r\n <Link to={Routes.ReportsSkin}>\r\n <span className=\"report-link-text\">Skin report</span>\r\n </Link>\r\n <Link to={Routes.ReportsSkinAdhoc}>\r\n <span className=\"report-link-text\">Skin Adhoc report</span>\r\n </Link>\r\n </div>\r\n <Button color=\"green\" label=\"Add Skin\" onClick={showCreateModal} />\r\n </div>\r\n\r\n <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Name</td>\r\n <td>Players</td>\r\n <td>Grid Dimension</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {listItemsForDisplay.map( it => renderMosaicListRow(it))}\r\n </tbody> \r\n </table>\r\n\r\n <Pagination activePage={currentPage} pagesCount={getPagesCount(mosaicList.length, itemsPerPage)} changePaginationPage={setCurrentPage} />\r\n\r\n <RightModal title=\"Add Skin\" show={isShowCreateModal} onRequestClose={hideCreateModal} >\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter name\"\r\n id = \"template_name\"\r\n isError = {templateNameError}\r\n title = \"Skin Name\"\r\n onChange = {(e)=>{templateNameHandler(e.target.value)}}\r\n value = {templateName}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInputNumber \r\n errorMessage = \"Please enter positive column number\"\r\n id = \"column_number_input\"\r\n isError = {columnNumberError}\r\n title = \"Column Number\"\r\n onChange = {(e)=>{columnNumberHandler(+e.target.value)}}\r\n value = {columnNumber}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInputNumber \r\n errorMessage = \"Please enter positiv row number\"\r\n id = \"row_number_input\"\r\n isError = {rowNumberError}\r\n title = \"Row Number\"\r\n onChange = {(e)=>{rowNumberHandler(+e.target.value)}}\r\n value = {rowNumber}\r\n />\r\n </FormRow>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={saveTemplate}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideCreateModal}/>\r\n </div>\r\n </RightModal> \r\n <CenterModal title={mosaicScheduleName} show={isShowScheduleModal} onRequestClose={closeScheduleModal}>\r\n <div className=\"mosaic-period-wrapper\">\r\n <div className=\"mosaic-period-inputs\">\r\n <div>\r\n <FormInput \r\n errorMessage = \"Please enter name\"\r\n id = \"period_name\"\r\n isError = {isPeriodNameError}\r\n title = \"Name\"\r\n onChange = {(e)=>{setPeriodName(e.target.value)}}\r\n value = {periodName}\r\n />\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"start\">Start</label>\r\n <input \r\n type=\"datetime-local\" \r\n className={`form-control ${isPeriodStartError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"start\" \r\n onChange={setStartDatePeriod}\r\n value={periodStart}\r\n />\r\n {isPeriodStartError && <span className=\"error\">Please select start period</span>}\r\n </div>\r\n <div className=\"\">\r\n <label htmlFor=\"ends\">End</label>\r\n <input \r\n type=\"datetime-local\" \r\n className={`form-control ${isPeriodEndError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"ends\" \r\n onChange={setEndDatePeriod}\r\n value={periodEnd}\r\n min={periodStart}\r\n disabled={!!!periodStart}\r\n />\r\n {isPeriodEndError && <span className=\"error\">End period should be later than start period</span>}\r\n </div>\r\n <div className=\"\">\r\n <Button color=\"green\" label=\"Add\" onClick={saveTimeslot}/>\r\n </div>\r\n </div>\r\n <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Name</td>\r\n <td>Start</td>\r\n <td>End</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderTimeslotRow(mosaicTimeslots)}\r\n </tbody>\r\n </table>\r\n </div>\r\n </CenterModal>\r\n <SmallModal show={isShowSmallModalDeleteMosaic} onRequestClose={closeSmallModalMosaic}> \r\n <p>That you want to delete list <b>{itemNameForDelete}</b>?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={closeSmallModalMosaic}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={()=>deleteMosaicConfirm(idForDelete)}/>\r\n </div>\r\n </SmallModal> \r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n </InnerLayout>\r\n}\r\n\r\nexport default withRouter(MosaicScreenList);","import { FC, useEffect, useState } from 'react'\r\nimport { Guid } from '../../../api/baseApi';\r\nimport { createTVChannel, deleteTVChannel, getTVChannels, TVChannel, TVChannelRequest, TVProfile, updateTVChannel } from '../../../api/tvChannelApi';\r\nimport { Button } from '../Button';\r\nimport { FormInput, FormRow } from '../formRow/FormRow';\r\nimport GlobalSpinner from '../globalsSpinner/GlobalSpinner'\r\nimport IconButton from '../iconButton/IconButton';\r\nimport { RightModal, SmallModal } from '../sideModal/Modal';\r\n\r\ntype TvChannelModalAction = \"create\" | \"edit\" | \"nothing\";\r\n\r\nconst TvChannels:FC = () => {\r\n let [isLoading, setIsLoading] = useState(false);\r\n\r\n let [tvChannelsList, setTvChannelsList] = useState<TVChannel[]>([]);\r\n let [tvChannelModalAction, setTvChannelModalAction] = useState<TvChannelModalAction>(\"nothing\");\r\n let [tvChannelName, setTvChannelName] = useState(\"\");\r\n let [isTvChannelNameError, setIsTvChannelNameError] = useState(false);\r\n\r\n let [tvChannelDomain, setTvChannelDomain] = useState('')\r\n\r\n let [isShowDeleteTvChannelModal, setIsShowDeleteTvChannelModal] = useState(false);\r\n let [tvChannelIdForAction, setTvChannelIdForAction] = useState<Guid>('');\r\n\r\n useEffect(()=>{\r\n\r\n async function fetchData() {\r\n setIsLoading(true);\r\n await Promise.all([updateTVChannelList()])\r\n setIsLoading(false);\r\n }\r\n\r\n fetchData()\r\n },[]);\r\n\r\n const updateTVChannelList = async () => {\r\n let response = await getTVChannels();\r\n if( response.type === \"succes\") {\r\n setTvChannelsList(response.data.items);\r\n }\r\n }\r\n\r\n const showTvChannelModal = (action: TvChannelModalAction, tvChannel?: TVChannel) => {\r\n setTvChannelModalAction(action);\r\n if(tvChannel){\r\n setTvChannelIdForAction(tvChannel.id);\r\n setTvChannelName(tvChannel.name);\r\n setTvChannelDomain(tvChannel.domain)\r\n }\r\n }\r\n\r\n const hideTvChannelModal = () => {\r\n setTvChannelModalAction(\"nothing\");\r\n setTvChannelName('');\r\n setIsTvChannelNameError(false);\r\n setTvChannelDomain('')\r\n }\r\n\r\n const createOrUpdateTvChannel = async () => {\r\n let isValid = true;\r\n if(!!!tvChannelName){\r\n setIsTvChannelNameError(true);\r\n isValid = false;\r\n }\r\n \r\n if(!isValid) return;\r\n\r\n let request:TVChannelRequest = {\r\n name: tvChannelName,\r\n domain: tvChannelDomain\r\n }\r\n\r\n setIsLoading(true)\r\n if( tvChannelModalAction === \"edit\" ) {\r\n await updateTVChannel(tvChannelIdForAction,request)\r\n }\r\n\r\n if( tvChannelModalAction === \"create\" ) {\r\n await createTVChannel(request)\r\n }\r\n\r\n setTvChannelName('');\r\n hideTvChannelModal();\r\n await updateTVChannelList();\r\n setIsLoading(false);\r\n }\r\n\r\n const showDeleteTvChannelModal = (id:Guid) => {\r\n setIsShowDeleteTvChannelModal(true);\r\n setTvChannelIdForAction(id);\r\n }\r\n\r\n const hideDeleteTvChannelModal = () => {\r\n setIsShowDeleteTvChannelModal(false);\r\n }\r\n\r\n const removeTvChannel = async () => {\r\n setIsLoading(true);\r\n await deleteTVChannel(tvChannelIdForAction);\r\n await updateTVChannelList();\r\n setIsShowDeleteTvChannelModal(false);\r\n setIsLoading(false);\r\n }\r\n\r\n const renderNotMappedInProfile = (profiles: TVProfile[]) => {\r\n return profiles.map(it => {\r\n return <p key={it.id}>{it.name}</p>\r\n })\r\n }\r\n\r\n const renderTvChannelsList = (TVChannels: TVChannel[]) => {\r\n return TVChannels.map( it => {\r\n return <tr key={it.id}>\r\n <td>{it.name}</td>\r\n <td>{renderNotMappedInProfile(it.notMappedInProfiles)}</td>\r\n <td>{it.domain}</td>\r\n <td>\r\n <IconButton tooltipText=\"Edit\" type=\"edit\" onClick={() => showTvChannelModal(\"edit\", it)} />\r\n <IconButton tooltipText=\"Delete\" type=\"delete\" onClick={() => showDeleteTvChannelModal(it.id)} />\r\n </td>\r\n </tr>\r\n })\r\n }\r\n\r\n return <>\r\n <div className=\"d-flex justify-content-between align-items-center mb-20 w-100\">\r\n <h2>TV Channels</h2>\r\n <Button color=\"green\" label=\"Add TV Channel\" onClick={() => showTvChannelModal(\"create\")} />\r\n </div>\r\n\r\n {tvChannelsList.length ? <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>TV Channel Name</td>\r\n <td>Not Mapped In Profile</td>\r\n <td>Domain</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderTvChannelsList(tvChannelsList)}\r\n </tbody>\r\n </table> : <p>Element list is empty</p>}\r\n\r\n <RightModal title={tvChannelModalAction === \"edit\" ? \"Edit TV Channel\" : \"Add TV Channel\"} show={tvChannelModalAction !== \"nothing\"} onRequestClose={hideTvChannelModal}>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter Name\"\r\n id = \"tv_channel_name\"\r\n isError = {isTvChannelNameError}\r\n title = \"Name\"\r\n onChangeValue = {(v) => {setTvChannelName(v); setIsTvChannelNameError(false)}}\r\n value = {tvChannelName}\r\n />\r\n </FormRow>\r\n\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"\"\r\n id = \"tv_profile_domain\"\r\n isError = {false}\r\n title = \"Domain\"\r\n onChangeValue = {(v) => {setTvChannelDomain(v)}}\r\n value = {tvChannelDomain}\r\n />\r\n </FormRow>\r\n\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={createOrUpdateTvChannel}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideTvChannelModal}/>\r\n </div>\r\n </RightModal> \r\n\r\n <SmallModal show={isShowDeleteTvChannelModal} onRequestClose={hideDeleteTvChannelModal}> \r\n <p>That you want to delete TV Channel?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideDeleteTvChannelModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={removeTvChannel}/>\r\n </div>\r\n </SmallModal>\r\n \r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n}\r\n\r\nexport default TvChannels\r\n","import { type } from 'os'\r\nimport React, { Dispatch, FC, SetStateAction, memo, useCallback, useEffect, useState } from 'react'\r\nimport Select, { SingleValue } from 'react-select'\r\nimport { AlertGroup, getSystemAlertsUnreadCount, getSystemAlertsWithParams, SeverityType, SystemAlertModel, updateAllSystemAlertAsReaded, updateSystemAlertStatus } from '../../../api/alertsApi'\r\nimport { Guid } from '../../../api/baseApi'\r\nimport { useAlertsCountStore } from '../../../hooks/useSystemAlerts'\r\nimport { convertUTCDateToLocalDate, formatDate, formatTime } from '../../../services/dateService'\r\nimport { Button } from '../Button'\r\nimport FormCheckbox from '../formRow/FormCheckbox'\r\nimport { FormInput } from '../formRow/FormRow'\r\nimport GlobalSpinner from '../globalsSpinner/GlobalSpinner'\r\nimport \"./SystemAlerts.css\"\r\nimport Pagination from '../pagination/Pagination'\r\n\r\n\r\ninterface SystemAlertsProps {\r\n}\r\n\r\ntype SeverityOption = {\r\n type: SeverityType,\r\n name: string\r\n}\r\n\r\ntype AlertGroupOption = {\r\n type: AlertGroup,\r\n name: string\r\n}\r\n\r\nlet severityOptions : SeverityOption[] = [\r\n {type: SeverityType.Info, name: \"Info\"},\r\n {type: SeverityType.Warning, name: \"Warning\"},\r\n {type: SeverityType.Important, name: \"Important\"},\r\n]\r\n\r\nconst SystemAlerts: FC<SystemAlertsProps> = memo(() => {\r\n \r\n let alertGroupOptions : AlertGroupOption[] = [\r\n {type: AlertGroup.System, name: AlertGroup[AlertGroup.System]},\r\n {type: AlertGroup.User, name: AlertGroup[AlertGroup.User]},\r\n {type: AlertGroup.Campaign, name: AlertGroup[AlertGroup.Campaign]},\r\n {type: AlertGroup.Site, name: AlertGroup[AlertGroup.Site]},\r\n ];\r\n\r\n let [isLoading, setIsLoading] = useState(false);\r\n let [alerts, setAlerts] = useState<SystemAlertModel[]>([]);\r\n let [isShowUnreadedAlerts, setIsShowUnreadedAlerts] = useState(false);\r\n let [selectedSeverityOption, setSelectedSeverityOption] = useState<SingleValue<SeverityOption>>(severityOptions[0]);\r\n let [currentPage, setCurrentPage] = useState(1);\r\n let [totalPages, setTotalPages] = useState(1);\r\n\r\n let [selectedAlertGroupOption, setSelectedAlertGroupOption] = useState<SingleValue<AlertGroupOption>>(null);\r\n let [searchString, setSearchString] = useState(\"\");\r\n\r\n let [pageLoaded, setPageLoaded] = useState(false)\r\n\r\n let counter = useAlertsCountStore();\r\n\r\n useEffect(() => {\r\n const fetch = async () => {\r\n await updateSystemAlerts(currentPage, selectedSeverityOption?.type, isShowUnreadedAlerts, searchString, selectedAlertGroupOption?.type);\r\n setPageLoaded(true);\r\n }\r\n\r\n fetch();\r\n }, [])\r\n\r\n useEffect(()=>{\r\n let interval = setTimeout(()=> {\r\n setCurrentPage(1);\r\n pageLoaded && updateSystemAlerts(1, selectedSeverityOption?.type, isShowUnreadedAlerts, searchString, selectedAlertGroupOption?.type);\r\n }, 1000)\r\n\r\n return () => {\r\n clearTimeout(interval)\r\n }\r\n },[searchString])\r\n\r\n const updateSystemAlerts = async (currentPage: number, selectedSeverityType: SeverityType = severityOptions[0].type, isShowUnreadedAlerts: boolean, searchString: string, selectedAlertGroup: AlertGroup | undefined) => {\r\n setIsLoading(true);\r\n let alertsResponse = await getSystemAlertsWithParams(currentPage, selectedSeverityType, isShowUnreadedAlerts, searchString, selectedAlertGroup);\r\n counter.update();\r\n if (alertsResponse.type == \"succes\") {\r\n setAlerts(alertsResponse.data.items);\r\n setTotalPages(alertsResponse.data.totalPages);\r\n }\r\n setIsLoading(false);\r\n }\r\n\r\n const updateAllSystemAlertStatus = async () => {\r\n await updateAllSystemAlertAsReaded({})\r\n await updateSystemAlerts(currentPage, selectedSeverityOption?.type, isShowUnreadedAlerts, searchString, selectedAlertGroupOption?.type);\r\n setIsShowUnreadedAlerts(false);\r\n }\r\n\r\n const renderSeverity = (severity: SeverityType) => {\r\n switch (severity) {\r\n case SeverityType.Info: return <span>Info</span>\r\n case SeverityType.Warning: return <span>Warning</span>\r\n case SeverityType.Important: return <span>Important</span>\r\n }\r\n }\r\n\r\n const renderAlertRow = (alerts: SystemAlertModel[]) => {\r\n let currentAlerts = isShowUnreadedAlerts ? alerts.filter(it => it.isRead === false) : alerts;\r\n return currentAlerts.map(it => {\r\n return <tr key={it.id} className={`${!it.isRead ? 'not-read' : ''}`} onClick={() => { !it.isRead && updateAlertStatus(it.id) }}>\r\n <td>{renderSeverity(it.severity)}</td>\r\n <td>{AlertGroup[it.group]}</td>\r\n <td>{convertUTCDateToLocalDate(it.dateTime)} </td>\r\n <td>{it.message}</td>\r\n <td></td>\r\n </tr>\r\n })\r\n }\r\n\r\n const updateAlertStatus = async (id: Guid) => {\r\n await updateSystemAlertStatus(id, {});\r\n await updateSystemAlerts(currentPage, selectedSeverityOption?.type, isShowUnreadedAlerts, searchString, selectedAlertGroupOption?.type);\r\n }\r\n\r\n const onSelectedSeverity = async (newValue: SingleValue<SeverityOption>) => {\r\n setSelectedSeverityOption(newValue);\r\n setCurrentPage(1);\r\n await updateSystemAlerts(1, newValue?.type, isShowUnreadedAlerts, searchString, selectedAlertGroupOption?.type);\r\n }\r\n\r\n const onSelectedAlertGroup = async (newValue: SingleValue<AlertGroupOption>) => {\r\n setCurrentPage(1);\r\n setSelectedAlertGroupOption(newValue);\r\n await updateSystemAlerts(1, selectedSeverityOption?.type, isShowUnreadedAlerts, searchString, newValue?.type);\r\n }\r\n\r\n const onShowUnreadedChange = async (isShow:boolean) => {\r\n setCurrentPage(1);\r\n setIsShowUnreadedAlerts(isShow);\r\n await updateSystemAlerts(1, selectedSeverityOption?.type, isShow, searchString, selectedAlertGroupOption?.type);\r\n }\r\n\r\n const getPaginationItems = async (page: number) => {\r\n setCurrentPage(page);\r\n await updateSystemAlerts(page, selectedSeverityOption?.type, isShowUnreadedAlerts, searchString, selectedAlertGroupOption?.type);\r\n }\r\n\r\n return (\r\n <>\r\n <div className=\"d-flex justify-content-between align-items-center mb-20 w-100\">\r\n <h2>Alerts</h2>\r\n\r\n <div className=\"alerts-control-row\">\r\n <div className=\"d-flex align-items-center\">\r\n <FormInput \r\n errorMessage = \"\"\r\n id = \"alert_search\"\r\n isError = {false}\r\n title = \"Search       \"\r\n onChangeValue = {(v) => {setSearchString(v);}}\r\n value = {searchString}\r\n />\r\n </div>\r\n <div className=\"d-flex\" style={{ 'width': '300px' }}>\r\n <label>Alert Group </label>\r\n <Select\r\n className={`w-100`}\r\n classNamePrefix={`select`}\r\n options={alertGroupOptions}\r\n filterOption={(option, input) => option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option) => `${option.type}`}\r\n onChange={onSelectedAlertGroup}\r\n value={selectedAlertGroupOption}\r\n isMulti={false}\r\n isClearable={true}\r\n />\r\n </div>\r\n <div className=\"d-flex\" style={{ 'width': '300px' }}>\r\n <label>Minimum Severity </label>\r\n <Select\r\n className={`w-100`}\r\n classNamePrefix={`select`}\r\n options={severityOptions}\r\n filterOption={(option, input) => option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option) => `${option.type}`}\r\n onChange={onSelectedSeverity}\r\n value={selectedSeverityOption}\r\n isMulti={false}\r\n />\r\n </div>\r\n <div className=\"status-container\">\r\n <span className=\"status-block\">\r\n {isShowUnreadedAlerts ? <span className=\"current-status online\">Show Unread Alerts </span> : <span className=\"current-status\">Show Unread Alerts </span>}\r\n </span> \r\n <FormCheckbox id=\"readed-status\" checked={isShowUnreadedAlerts} onChange={onShowUnreadedChange} />\r\n </div>\r\n <Button label='Read All' onClick={updateAllSystemAlertStatus} color='transparent' />\r\n </div>\r\n\r\n </div>\r\n\r\n {alerts.length ? <> <table className=\"table table-alerts\">\r\n <thead>\r\n <tr>\r\n <td></td>\r\n <td>Group</td>\r\n <td>Date</td>\r\n <td>Message</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderAlertRow(alerts)}\r\n </tbody>\r\n </table>\r\n <Pagination activePage={currentPage} pagesCount={totalPages} changePaginationPage={getPaginationItems} />\r\n </> : <p>There are no Alerts</p>}\r\n\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n )\r\n})\r\n\r\nexport default SystemAlerts","import { FC, useEffect, useState } from 'react'\r\nimport { Guid } from '../../../api/baseApi';\r\nimport { cloneTVProfile, createTVChannelMapping, createTVProfile, deleteTVChannelMapping, deleteTVProfile, getTVChannelMappings, getTVChannels, getTVProfiles, TVChannel, TVChannelMapping, TVChannelMappingCreateRequest, TVChannelMappingUpdateRequest, TVProfile, TVProfileRequest, updateTVChannelMapping, updateTVProfile } from '../../../api/tvChannelApi';\r\nimport { Button } from '../Button';\r\nimport { FormInput, FormRow } from '../formRow/FormRow';\r\nimport GlobalSpinner from '../globalsSpinner/GlobalSpinner'\r\nimport IconButton from '../iconButton/IconButton';\r\nimport { RightModal, SmallModal } from '../sideModal/Modal';\r\nimport Select, { SingleValue } from 'react-select';\r\nimport Tabs, { TabElement, TabNavigation, TabNavigationElement, TabsContainer } from '../tab/Tab';\r\n\r\ntype ModalAction = \"create\" | \"edit\" | \"nothing\";\r\n\r\nconst TvChannelsMapping:FC = () => {\r\n let [isLoading, setIsLoading] = useState(false);\r\n\r\n let [tvChannelsList, setTvChannelsList] = useState<TVChannel[]>([]);\r\n let [tvProfilesList, setTvProfilesList] = useState<TVProfile[]>([]);\r\n let [tvProfileName, setTvProfileName] = useState(\"\");\r\n let [isTvProfileNameError, setIsTvProfileNameError] = useState(false);\r\n\r\n let [mappingsList, setMappingList] = useState<TVChannelMapping[]>([]);\r\n let [mappingIdForAction, setMappingIdForAction] = useState<Guid>('');\r\n let [isShowDeleteMappingModal, setIsShowDeleteMappingModal] = useState(false);\r\n\r\n let [command, setCommand] = useState('');\r\n let [isCommandError, setIsCommandError] = useState(false);\r\n let [commandErrorMessage, setCommandErrorMessage] = useState('');\r\n\r\n let [selectedTvChannel, setSelectedTvChannel] = useState<SingleValue<TVChannel>>(null);\r\n let [isSelectedTvChannelError, setIsSelectedTvChannelError] = useState(false);\r\n \r\n let [isShowDeleteTvProfileModal, setIsShowDeleteTvProfileModal] = useState(false);\r\n let [tvProfileIdForAction, setTvProfileIdForAction] = useState<Guid>('');\r\n \r\n let [modalAction, setModalAction] = useState<ModalAction>(\"nothing\");\r\n\r\n let [isShowProfileModal, setIsShowProfileModal] = useState(false);\r\n let [isShowMappingModal, setIsShowMappingModal] = useState(false);\r\n\r\n \r\n\r\n useEffect(()=>{\r\n\r\n async function fetchData() {\r\n setIsLoading(true);\r\n await Promise.all([updateTvProfileList(),updateTVChannelList()])\r\n setIsLoading(false);\r\n }\r\n \r\n fetchData()\r\n },[]);\r\n \r\n useEffect(()=> {\r\n async function fetchData() {\r\n setIsLoading(true);\r\n await updateMappingsList();\r\n setIsLoading(false);\r\n }\r\n\r\n fetchData()\r\n },[tvProfileIdForAction])\r\n\r\n const updateTvProfileList = async () => {\r\n let response = await getTVProfiles();\r\n if( response.type === \"succes\") {\r\n setTvProfilesList(response.data.items);\r\n let activeProfile = response.data.items.find(it => it.id == tvProfileIdForAction);\r\n if(!activeProfile){\r\n if(response.data.items.length){\r\n setTvProfileIdForAction(response.data.items[0].id);\r\n } \r\n else setTvProfileIdForAction(\"\");\r\n } \r\n }\r\n }\r\n\r\n const updateTVChannelList = async () => {\r\n let response = await getTVChannels();\r\n if( response.type === \"succes\") {\r\n setTvChannelsList(response.data.items);\r\n }\r\n }\r\n\r\n const updateMappingsList = async () => {\r\n if(tvProfileIdForAction){\r\n let response = await getTVChannelMappings(tvProfileIdForAction);\r\n if( response.type === \"succes\") {\r\n setMappingList(response.data.items);\r\n }\r\n }\r\n }\r\n\r\n const showTvProfileModal = (action: ModalAction, tvProfile?: TVProfile) => {\r\n setIsShowProfileModal(true);\r\n setModalAction(action);\r\n if(tvProfile){\r\n setTvProfileIdForAction(tvProfile.id);\r\n setTvProfileName(tvProfile.name);\r\n }\r\n }\r\n\r\n const hideTvProfileModal = () => {\r\n setIsShowProfileModal(false);\r\n setModalAction(\"nothing\");\r\n setTvProfileName('');\r\n setIsTvProfileNameError(false);\r\n }\r\n\r\n const createOrUpdateTvProfile = async () => {\r\n let isValid = true;\r\n\r\n if(!!!tvProfileName){\r\n setIsTvProfileNameError(true);\r\n isValid = false;\r\n }\r\n \r\n if(!isValid) return;\r\n\r\n let request:TVProfileRequest = {\r\n name: tvProfileName,\r\n }\r\n\r\n setIsLoading(true)\r\n if( modalAction === \"edit\" ) {\r\n await updateTVProfile(tvProfileIdForAction,request)\r\n }\r\n\r\n if( modalAction === \"create\" ) {\r\n let result = await createTVProfile(request);\r\n if(result.type == \"succes\"){\r\n setTvProfileIdForAction(result.data.id)\r\n }\r\n }\r\n\r\n setTvProfileName('');\r\n hideTvProfileModal();\r\n await updateTvProfileList();\r\n setIsLoading(false);\r\n }\r\n\r\n\r\n const showDeleteTvProfileModal = () => {\r\n setIsShowDeleteTvProfileModal(true);\r\n }\r\n\r\n const hideDeleteTvProfileModal = () => {\r\n setIsShowDeleteTvProfileModal(false);\r\n }\r\n\r\n const removeTvProfile = async () => {\r\n setIsLoading(true);\r\n await deleteTVProfile(tvProfileIdForAction);\r\n await updateTvProfileList();\r\n setIsShowDeleteTvProfileModal(false);\r\n setIsLoading(false);\r\n }\r\n\r\n const checkActiveTab = (tab: string) => tab === tvProfileIdForAction;\r\n\r\n const renderTvProfileTabs = (tvProfiles: TVProfile[]) => {\r\n return tvProfiles.map( (it, index) => {\r\n return <TabNavigationElement key={index} title={it.name} isActive={checkActiveTab(it.id)} onClick={() => { setTvProfileIdForAction(it.id) }} />\r\n })\r\n }\r\n\r\n const getActiveProfile = () => tvProfilesList.find( it => it.id === tvProfileIdForAction)\r\n\r\n const duplicateCurrentTvProfile = async () => {\r\n setIsLoading(true);\r\n await cloneTVProfile(tvProfileIdForAction);\r\n await updateTvProfileList();\r\n setIsLoading(false);\r\n }\r\n\r\n const showMappingModal = (action: ModalAction, mappingElement?: TVChannelMapping) => {\r\n setIsShowMappingModal(true);\r\n setModalAction(action);\r\n if(mappingElement){\r\n let t = tvChannelsList.find(it => it.name === mappingElement.name);\r\n setMappingIdForAction(mappingElement.id)\r\n setSelectedTvChannel(t ? t : null)\r\n setCommand(mappingElement.irCommand)\r\n }\r\n }\r\n\r\n const hideMappingModal = () => {\r\n setIsShowMappingModal(false);\r\n setMappingIdForAction('');\r\n setModalAction(\"nothing\");\r\n setSelectedTvChannel(null);\r\n setIsSelectedTvChannelError(false);\r\n setCommand('')\r\n setIsCommandError(false);\r\n setCommandErrorMessage(\"\");\r\n }\r\n\r\n const onSelectedTvChannel = (newValue: SingleValue<TVChannel>) => {\r\n setSelectedTvChannel(newValue);\r\n setIsSelectedTvChannelError(false);\r\n }\r\n\r\n const isCommandAlreadyInUse = (command: string) => {\r\n return mappingsList.some(it => it.irCommand === command);\r\n }\r\n\r\n const createOrUpdateTvChannelMapping = async () => {\r\n let isValid = true;\r\n\r\n if(!selectedTvChannel){\r\n setIsSelectedTvChannelError(true);\r\n isValid = false;\r\n }\r\n\r\n if(!command){\r\n setIsCommandError(true);\r\n setCommandErrorMessage(\"Please enter Command\")\r\n isValid = false;\r\n }\r\n if(isCommandAlreadyInUse(command)){\r\n setIsCommandError(true);\r\n setCommandErrorMessage(\"This Command is already in use\")\r\n isValid = false;\r\n }\r\n\r\n if(!isValid) return;\r\n\r\n setIsLoading(true)\r\n if( modalAction === \"edit\" ) {\r\n let request:TVChannelMappingUpdateRequest = {\r\n command: command,\r\n }\r\n await updateTVChannelMapping(tvProfileIdForAction, mappingIdForAction, request)\r\n }\r\n\r\n if( modalAction === \"create\" ) {\r\n let request:TVChannelMappingCreateRequest = {\r\n tvChannelId: selectedTvChannel!.id,\r\n command: command,\r\n }\r\n await createTVChannelMapping(tvProfileIdForAction, request)\r\n }\r\n\r\n await updateMappingsList();\r\n hideMappingModal();\r\n setIsLoading(false);\r\n }\r\n\r\n const showDeleteMappingModal = (id: Guid) => {\r\n setIsShowDeleteMappingModal(true);\r\n setMappingIdForAction(id);\r\n }\r\n\r\n const hideDeleteMappingModal = () => {\r\n setIsShowDeleteMappingModal(false);\r\n setMappingIdForAction(\"\");\r\n }\r\n\r\n const removeMapping = async () => {\r\n setIsLoading(true);\r\n await deleteTVChannelMapping(tvProfileIdForAction, mappingIdForAction);\r\n await updateMappingsList();\r\n hideDeleteMappingModal();\r\n setIsLoading(false);\r\n }\r\n\r\n const isDefaultTvMappingProfileActive = () => {\r\n let t = tvProfilesList.find(it => it.id === tvProfileIdForAction);\r\n if(t) {\r\n return t.isDefault\r\n }\r\n }\r\n\r\n const renderMappingsList = (mapping: TVChannelMapping[]) => {\r\n return mapping.map( it => {\r\n return <tr key={it.id}>\r\n <td>{it.name}</td>\r\n <td>{it.irCommand}</td>\r\n <td>\r\n <IconButton tooltipText=\"Edit\" type=\"edit\" onClick={() => {showMappingModal(\"edit\", it)}} />\r\n <IconButton tooltipText=\"Delete\" type=\"delete\" onClick={() => {showDeleteMappingModal(it.id)}} />\r\n </td>\r\n </tr>\r\n })\r\n }\r\n\r\n return <>\r\n <div className=\"d-flex justify-content-between align-items-center mb-20 w-100\">\r\n <h2>TV Mapping Profiles</h2>\r\n </div>\r\n\r\n <div className=\"w-100\">\r\n {tvProfilesList.length === 0 ? <div className=\"d-flex align-items-center\">\r\n <p>Add new TV Mapping Profile</p>     \r\n <IconButton tooltipText=\"Add Mapping Profile\" type=\"plus\" roundedButton={true} onClick={()=> showTvProfileModal(\"create\")} />\r\n </div>\r\n : \r\n <Tabs>\r\n <TabNavigation>\r\n <>\r\n {renderTvProfileTabs(tvProfilesList)}\r\n </>\r\n <IconButton tooltipText=\"Add Mapping Profile\" type=\"plus\" roundedButton={true} onClick={()=> {showTvProfileModal(\"create\")}} />\r\n </TabNavigation>\r\n <TabsContainer>\r\n <TabElement isActive={true}>\r\n <>\r\n <div className=\"d-flex justify-content-end align-items-center mb-20 w-100\">\r\n <Button color=\"green\" label=\"Add TV Channel Mapping\" onClick={() => {showMappingModal(\"create\")}} /> \r\n <Button color=\"green\" label=\"Edit\" onClick={() => {showTvProfileModal(\"edit\", getActiveProfile())}} /> \r\n <Button color=\"green\" label=\"Duplicate\" onClick={duplicateCurrentTvProfile} /> \r\n <Button color=\"gray\" label=\"Delete\" onClick={showDeleteTvProfileModal} isDisabled={isDefaultTvMappingProfileActive()} />\r\n </div>\r\n\r\n {mappingsList.length ? <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>TV Channel Name</td>\r\n <td>Command</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderMappingsList(mappingsList)}\r\n </tbody>\r\n </table> : <p>Element list is empty</p>}\r\n </>\r\n </TabElement>\r\n <></>\r\n </TabsContainer>\r\n </Tabs>\r\n }\r\n \r\n </div>\r\n\r\n <RightModal title={modalAction === \"edit\" ? \"Edit TV Mapping Profile\" : \"Add TV Mapping Profile\"} show={isShowProfileModal} onRequestClose={hideTvProfileModal}>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter TV Mapping Profile Name\"\r\n id = \"tv_profile_name\"\r\n isError = {isTvProfileNameError}\r\n title = \"TV Mapping Profile Name\"\r\n onChangeValue = {(v) => {setTvProfileName(v); setIsTvProfileNameError(false)}}\r\n value = {tvProfileName}\r\n />\r\n </FormRow>\r\n\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={createOrUpdateTvProfile}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideTvProfileModal}/>\r\n </div>\r\n </RightModal> \r\n\r\n <RightModal title={modalAction === \"edit\" ? \"Edit TV Channel Mapping\" : \"Add TV Channel Mapping\"} show={isShowMappingModal} onRequestClose={hideMappingModal}>\r\n \r\n <FormRow>\r\n <label>TV Channel</label>\r\n <Select \r\n className={`${isSelectedTvChannelError ? \"error\" : \"\"}`}\r\n classNamePrefix={`select`}\r\n options={tvChannelsList.filter(it => !mappingsList.some(it2 => it2.name === it.name))} \r\n filterOption={(option, input)=> option.label.toLowerCase().includes(input.toLowerCase())}\r\n getOptionLabel={(option) => `${option.name}`}\r\n getOptionValue={(option) => `${option.id}`}\r\n onChange={onSelectedTvChannel}\r\n value={selectedTvChannel}\r\n isDisabled={modalAction === \"edit\"}\r\n /> \r\n </FormRow>\r\n\r\n <FormRow>\r\n <FormInput\r\n errorMessage = {commandErrorMessage}\r\n id = \"command_value_input\"\r\n isError = {isCommandError}\r\n title = \"Command\"\r\n onChangeValue = {(e)=>{setCommand(e); setIsCommandError(false)}}\r\n value = {command}\r\n />\r\n \r\n </FormRow>\r\n\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={createOrUpdateTvChannelMapping}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideMappingModal}/>\r\n </div>\r\n </RightModal> \r\n\r\n <SmallModal show={isShowDeleteTvProfileModal} onRequestClose={hideDeleteTvProfileModal}> \r\n <p>That you want to delete TV Mapping Profile?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideDeleteTvProfileModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={removeTvProfile}/>\r\n </div>\r\n </SmallModal>\r\n\r\n <SmallModal show={isShowDeleteMappingModal} onRequestClose={hideDeleteMappingModal}> \r\n <p>That you want to delete TV Channel Mapping?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideDeleteMappingModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={removeMapping}/>\r\n </div>\r\n </SmallModal>\r\n \r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n}\r\n\r\nexport default TvChannelsMapping\r\n","import Select, { SingleValue } from \"react-select\"\r\n\r\ninterface MyCustomSelectProps<TValue> {\r\n title: string,\r\n options : MyCustomSelectOptions<TValue>[],\r\n selectedValue: TValue,\r\n onChange: (value: TValue | null) => void\r\n}\r\n\r\nexport interface MyCustomSelectOptions<TValue> {\r\n label: string,\r\n value: TValue\r\n}\r\n\r\nconst ReactSelect = <T,>( props: MyCustomSelectProps<T> ) => {\r\n\r\n let {title, options, selectedValue, onChange} = props;\r\n\r\n const onInternalChange = (option: SingleValue<MyCustomSelectOptions<T>>) => {\r\n !!option ? onChange(option.value) : onChange(null)\r\n }\r\n\r\n const getSelectedOption = (selectedValue: T) => {\r\n return options.filter(it => it.value === selectedValue)\r\n }\r\n\r\n return (\r\n <>\r\n <label>{title}</label>\r\n <Select\r\n className={`w-100`}\r\n classNamePrefix={`select`}\r\n options={options}\r\n onChange={onInternalChange}\r\n value={getSelectedOption(selectedValue)}\r\n isClearable={!!selectedValue}\r\n />\r\n </>\r\n )\r\n}\r\n\r\nexport default ReactSelect","import { useEffect, useState } from \"react\"\r\nimport { Button } from \"../Button\"\r\nimport GlobalSpinner from \"../globalsSpinner/GlobalSpinner\";\r\nimport { CenterModal, RightModal, SmallModal } from \"../sideModal/Modal\";\r\nimport { FormInput, FormInputNumber, FormRow, FormRowWithColumns } from \"../formRow/FormRow\";\r\nimport { MediaTranscodingProfile, MediaTranscodingProfileRequest, createTranscodingProfile, deleteTranscodingProfile, getTranscodingProfiles, updateTranscodingProfile} from \"../../../api/mediaTranscodingApi\";\r\nimport IconButton from \"../iconButton/IconButton\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport FormCheckbox from \"../formRow/FormCheckbox\";\r\nimport ReactSelect, { MyCustomSelectOptions } from \"../customSelect/MyCustomSelect\";\r\n\r\ntype ModalAction = \"create\" | \"edit\" | \"nothing\";\r\ntype NumberOrNull = number | null;\r\ntype StringOrNull = string | null;\r\n\r\nconst MediaTranscoding = () => {\r\n\r\n let videoCodecOptions: MyCustomSelectOptions<StringOrNull>[] = [\r\n {\r\n label: \"h264\",\r\n value: \"h264\",\r\n },\r\n {\r\n label: \"h265\",\r\n value: \"h265\",\r\n },\r\n ]\r\n\r\n let audioCodecOptions: MyCustomSelectOptions<StringOrNull>[] = [\r\n {\r\n label:\"aac_lc\",\r\n value:\"aac_lc\"\r\n },\r\n {\r\n label:\"heaac_v1\",\r\n value:\"heaac_v1\"\r\n },\r\n {\r\n label:\"heaac_v2\",\r\n value:\"heaac_v2\"\r\n },\r\n ]\r\n\r\n let levelOptions: MyCustomSelectOptions<StringOrNull>[] = [\r\n {\r\n label:\"low\",\r\n value:\"low\"\r\n },\r\n {\r\n label:\"medium\",\r\n value:\"medium\"\r\n },\r\n {\r\n label:\"high\",\r\n value:\"high\"\r\n },\r\n {\r\n label:\"max\",\r\n value:\"max\"\r\n },\r\n ]\r\n\r\n let videoFrameRateOptions: MyCustomSelectOptions<NumberOrNull>[] = [\r\n {\r\n label: \"Source\",\r\n value: null\r\n },\r\n {\r\n label: \"23.976\",\r\n value: 23.976\r\n },\r\n {\r\n label: \"24\",\r\n value: 24\r\n },\r\n {\r\n label: \"25\",\r\n value: 25\r\n },\r\n {\r\n label: \"29.97\",\r\n value: 29.97\r\n },\r\n {\r\n label: \"30\",\r\n value: 30\r\n },\r\n {\r\n label: \"48\",\r\n value: 48\r\n },\r\n {\r\n label: \"50\",\r\n value: 50\r\n },\r\n {\r\n label: \"59.94\",\r\n value: 59.94\r\n },\r\n {\r\n label: \"60\",\r\n value: 60\r\n },\r\n {\r\n label: \"120\",\r\n value: 120\r\n },\r\n ]\r\n\r\n let videoWidthOptions: MyCustomSelectOptions<NumberOrNull>[] = [\r\n {\r\n label:\"Source\",\r\n value:null\r\n },\r\n {\r\n label:\"320\",\r\n value:320\r\n },\r\n {\r\n label:\"640\",\r\n value:640\r\n },\r\n {\r\n label:\"720\",\r\n value:720\r\n },\r\n {\r\n label:\"1280\",\r\n value:1280\r\n },\r\n {\r\n label:\"1920\",\r\n value:1920\r\n },\r\n {\r\n label:\"3840\",\r\n value:3840\r\n },\r\n {\r\n label:\"4096\",\r\n value:4096\r\n },\r\n ]\r\n\r\n let audioSmapleOptions: MyCustomSelectOptions<NumberOrNull>[] = [\r\n {\r\n label:\"Source\",\r\n value:null\r\n },\r\n {\r\n label:\"44100\",\r\n value:44100\r\n },\r\n {\r\n label:\"48000\",\r\n value:48000\r\n },\r\n ]\r\n\r\n let videoBitrateOptions: MyCustomSelectOptions<NumberOrNull>[] = [\r\n {\r\n label:\"Source\",\r\n value:null\r\n },\r\n {\r\n label:\"250\",\r\n value:250\r\n },\r\n {\r\n label:\"1000\",\r\n value:1000\r\n },\r\n {\r\n label:\"2500\",\r\n value:2500\r\n },\r\n {\r\n label:\"5000\",\r\n value:5000\r\n },\r\n {\r\n label:\"7500\",\r\n value:7500\r\n },\r\n {\r\n label:\"10000\",\r\n value:10000\r\n },\r\n {\r\n label:\"25000\",\r\n value:25000\r\n },\r\n {\r\n label:\"50000\",\r\n value:50000\r\n },\r\n ]\r\n\r\n let audioChannelsOptions: MyCustomSelectOptions<NumberOrNull>[] = [\r\n {\r\n label:\"Source\",\r\n value:null\r\n },\r\n {\r\n label:\"1\",\r\n value:1\r\n },\r\n {\r\n label:\"2\",\r\n value:2\r\n },\r\n {\r\n label:\"6\",\r\n value:6\r\n },\r\n ]\r\n\r\n let audioBitrateOptions: MyCustomSelectOptions<NumberOrNull>[] = [\r\n {\r\n label:\"Source\",\r\n value:null\r\n },\r\n {\r\n label:\"32\",\r\n value:32\r\n },\r\n {\r\n label:\"64\",\r\n value:64\r\n },\r\n {\r\n label:\"128\",\r\n value:128\r\n },\r\n {\r\n label:\"192\",\r\n value:192\r\n },\r\n {\r\n label:\"256\",\r\n value:256\r\n },\r\n {\r\n label:\"320\",\r\n value:320\r\n },\r\n ]\r\n\r\n let [isLoading, setIsLoading] = useState(false);\r\n let [profiles, setProfiles] = useState<MediaTranscodingProfile[]>([]);\r\n let [name, setName] = useState(\"\");\r\n let [isNameError, setIsNameError] = useState(false);\r\n let [selectedVideoFrameRate, setSelectedVideoFrameRate] = useState<NumberOrNull>(null);\r\n let [selectedVideoWidth, setSelectedVideoWidth] = useState<NumberOrNull>(null);\r\n let [videoHeight, setVideoHeight] = useState<NumberOrNull>(null);\r\n let [selectedVideoCodec, setSelectedVideoCodec] = useState<StringOrNull>(null);\r\n let [selectedVideoBitrateKB, setSelectedVideoBitrateKB] = useState<NumberOrNull>(null);\r\n let [selectedAudioCodec, setSelectedAudioCodec] = useState<StringOrNull>(null);\r\n let [selectedAudioBitrateKB, setSelectedAudioBitrateKB] = useState<NumberOrNull>(null);\r\n let [selectedAudioChannels, setSelectedAudioChannels] = useState<NumberOrNull>(null);\r\n let [selectedAudioSampleRate, setSelectedAudioSampleRate] = useState<NumberOrNull>(null);\r\n let [isDynamicsRangeControlEnable, setIsDynamicsRangeControlEnable] = useState(false);\r\n let [selectedDynamicsRangeControlAmount, setSelectedDynamicsRangeControlAmount] = useState<StringOrNull>(null);\r\n\r\n let [isFilterDynamicEqEnable, setIsFilterDynamicEqEnable] = useState(false);\r\n let [isFilterHighPassEnable, setIsFilterHighPassEnable] = useState(false);\r\n let [filterHighPassFrequency, setFilterHighPassFrequency] = useState<string | number | null>(50);\r\n let [isFilterHighPassFrequencyError, setIsFilterHighPassFrequencyError] = useState(false);\r\n let [isFilterHumEnable, setIsFilterHumEnable] = useState(false);\r\n\r\n let [isLoudnessEnabled, setIsLoudnessEnabled] = useState(false);\r\n let [loudness, setLoudness] = useState<string | number | null>(null);\r\n let [isLoudnessError, setIsLoudnessError] = useState(false);\r\n let [truePeak, setTruePeak] = useState<string | number |null>(null);\r\n let [isTruePeakError, setIsTruePeakError] = useState(false);\r\n\r\n let [isMusicReductionEnable, setIsMusicReductionEnable] = useState(false);\r\n let [isNoiseReductionEnable , setIsNoiseReductionEnable] = useState(false);\r\n let [selectedNoiseReductionAmount, setSelectedNoiseReductionAmount] = useState<StringOrNull>(null);\r\n\r\n let [isSpeechClickReductionEnable, setIsSpeechClickReductionEnable] = useState(false);\r\n let [selectedSpeechClickReductionAmount, setSelectedSpeechClickReductionAmount] = useState<StringOrNull>(null);\r\n let [isSpeechIsolationEnable, setIsSpeechIsolationEnable] = useState(false);\r\n let [speechIsolationAmount, setSpeechIsolationAmount] = useState<string | number | null>(0);\r\n let [isSpeechIsolationAmountError, setIspeechIsolationAmountError] = useState(false);\r\n let [isSpeechPlosiveReductionEnable, setIsSpeechPlosiveReductionEnable] = useState(false);\r\n let [selectedPlosiveReductionAmount, setSelectedPlosiveReductionAmount] = useState<StringOrNull>(null);\r\n let [isSpeechSibilanceReductionEnable, setIsSpeechSibilanceReductionEnable] = useState(false);\r\n let [selectedSibilanceReductionAmount, setSelectedSibilanceReductionAmount] = useState<StringOrNull>(null);\r\n\r\n let [modalAction, setModalAction] = useState<ModalAction>(\"nothing\");\r\n let [profileIdForAction, setProfileIdForAction] = useState(\"\");\r\n let [isShowDeleteProfileModal, setIsShowDeleteProfileModal] = useState(false);\r\n\r\n let [isShowModal, setIsShowModal] = useState(false);\r\n\r\n useEffect(()=>{\r\n async function fetchProfiles(){\r\n setIsLoading(true);\r\n await Promise.all([updateTranscodingProfilesList()]);\r\n setIsLoading(false);\r\n }\r\n\r\n fetchProfiles()\r\n },[])\r\n\r\n const updateTranscodingProfilesList = async () => {\r\n let response = await getTranscodingProfiles();\r\n if( response.type === \"succes\") {\r\n setProfiles(response.data.items);\r\n }\r\n }\r\n\r\n const showModal = (action:ModalAction, profile?:MediaTranscodingProfile) => {\r\n setModalAction(action);\r\n setIsShowModal(true);\r\n if(profile){\r\n setProfileIdForAction(profile.id)\r\n setName(profile.name);\r\n setSelectedVideoFrameRate(profile.videoFrameRate);\r\n setSelectedVideoCodec(profile.videoCodec);\r\n setSelectedVideoBitrateKB(profile.videoBitrateKb);\r\n setSelectedVideoWidth(profile.videoWidth);\r\n setVideoHeight(profile.videoHeight);\r\n setSelectedAudioCodec(profile.audioCodec);\r\n setSelectedAudioBitrateKB(profile.audioBitrateKb);\r\n setSelectedAudioChannels(profile.audioChannels);\r\n setSelectedAudioSampleRate(profile.audioSampleRate);\r\n setIsDynamicsRangeControlEnable(profile.dynamicsRangeControlEnable);\r\n setSelectedDynamicsRangeControlAmount(profile.dynamicsRangeControlAmount);\r\n setIsFilterDynamicEqEnable(profile.filterDynamicEqEnable);\r\n setIsFilterHighPassEnable(profile.filterHighPassEnable);\r\n setFilterHighPassFrequency(profile.filterHighPassFrequency);\r\n setIsFilterHumEnable(profile.filterHumEnable);\r\n setIsLoudnessEnabled(profile.loudnessEnable)\r\n setLoudness(profile.loudnessTargetLevel);\r\n setTruePeak(profile.loudnessPeakLimit);\r\n setIsMusicReductionEnable(profile.musicReductionEnable);\r\n setIsNoiseReductionEnable(profile.noiseReductionEnable);\r\n setSelectedNoiseReductionAmount(profile.noiseReductionAmount);\r\n setIsSpeechClickReductionEnable(profile.speechClickReductionEnable);\r\n setSelectedSpeechClickReductionAmount(profile.speechClickReductionAmount);\r\n setIsSpeechIsolationEnable(profile.speechIsolationEnable);\r\n setSpeechIsolationAmount(profile.speechIsolationAmount);\r\n setIsSpeechPlosiveReductionEnable(profile.speechPlosiveReductionEnable);\r\n setSelectedPlosiveReductionAmount(profile.speechPlosiveReductionAmount);\r\n setIsSpeechSibilanceReductionEnable(profile.speechSibilanceReductionEnable);\r\n setSelectedSibilanceReductionAmount(profile.speechSibilanceReductionAmount);\r\n }\r\n }\r\n\r\n const hideModal = () => {\r\n setModalAction(\"nothing\");\r\n setIsShowModal(false);\r\n setProfileIdForAction(\"\");\r\n setName(\"\");\r\n setIsNameError(false);\r\n setSelectedVideoFrameRate(null);\r\n setSelectedVideoCodec(null);\r\n setSelectedVideoBitrateKB(null);\r\n setSelectedVideoWidth(null);\r\n setVideoHeight(null);\r\n setSelectedAudioCodec(null);\r\n setSelectedAudioBitrateKB(null);\r\n setSelectedAudioChannels(null);\r\n setSelectedAudioSampleRate(null);\r\n setIsDynamicsRangeControlEnable(false);\r\n setSelectedDynamicsRangeControlAmount(null);\r\n setIsFilterDynamicEqEnable(false);\r\n setIsFilterHighPassEnable(false);\r\n setFilterHighPassFrequency(50);\r\n setIsFilterHighPassFrequencyError(false);\r\n setIsFilterHumEnable(false);\r\n setIsLoudnessEnabled(false);\r\n setLoudness(0);\r\n setIsLoudnessError(false);\r\n setTruePeak(0);\r\n setIsTruePeakError(false);\r\n setIsMusicReductionEnable(false);\r\n setIsNoiseReductionEnable(false);\r\n setSelectedNoiseReductionAmount(null);\r\n setIsSpeechClickReductionEnable(false);\r\n setSelectedSpeechClickReductionAmount(null);\r\n setIsSpeechIsolationEnable(false);\r\n setSpeechIsolationAmount(0);\r\n setIspeechIsolationAmountError(false);\r\n setIsSpeechPlosiveReductionEnable(false);\r\n setSelectedPlosiveReductionAmount(null);\r\n setIsSpeechSibilanceReductionEnable(false);\r\n setSelectedSibilanceReductionAmount(null);\r\n }\r\n\r\n const showDeleteModal = (id:Guid) => {\r\n setIsShowDeleteProfileModal(true);\r\n setProfileIdForAction(id);\r\n }\r\n\r\n const hideDeleteModal = () => {\r\n setIsShowDeleteProfileModal(false);\r\n setProfileIdForAction(\"\");\r\n }\r\n\r\n const createOrUpdateTranscodingProfile = async () => {\r\n let isValid = true;\r\n\r\n if(!name){\r\n setIsNameError(true);\r\n isValid = false;\r\n }\r\n\r\n if(loudness !== null) {\r\n if(+loudness < -45 || +loudness > -8){\r\n setIsLoudnessError(true);\r\n isValid = false;\r\n }\r\n }\r\n\r\n if(truePeak !== null) {\r\n if(+truePeak < -33 || +truePeak > 0.1){\r\n setIsTruePeakError(true);\r\n isValid = false;\r\n }\r\n }\r\n\r\n if(filterHighPassFrequency !== null){\r\n if( +filterHighPassFrequency < 50 || +filterHighPassFrequency > 120){\r\n setIsFilterHighPassFrequencyError(true);\r\n isValid = false;\r\n }\r\n }\r\n\r\n if(speechIsolationAmount !== null){\r\n if( +speechIsolationAmount < 0 || +speechIsolationAmount > 100){\r\n setIspeechIsolationAmountError(true);\r\n isValid = false;\r\n }\r\n }\r\n \r\n if(!isValid) return;\r\n\r\n let request:MediaTranscodingProfileRequest = {\r\n name: name,\r\n videoFrameRate: selectedVideoFrameRate ?? null,\r\n videoCodec: selectedVideoCodec,\r\n videoBitrateKb:selectedVideoBitrateKB,\r\n videoWidth: selectedVideoWidth,\r\n videoHeight: null,\r\n audioCodec: selectedAudioCodec,\r\n audioBitrateKb: selectedAudioBitrateKB,\r\n audioChannels: selectedAudioChannels,\r\n audioSampleRate: selectedAudioSampleRate,\r\n dynamicsRangeControlEnable: isDynamicsRangeControlEnable,\r\n dynamicsRangeControlAmount: selectedDynamicsRangeControlAmount,\r\n filterDynamicEqEnable: isFilterDynamicEqEnable,\r\n filterHighPassEnable: isFilterHighPassEnable,\r\n filterHighPassFrequency: filterHighPassFrequency !== null ? +filterHighPassFrequency : null,\r\n filterHumEnable: isFilterHumEnable,\r\n loudnessEnable: isLoudnessEnabled,\r\n loudnessTargetLevel: loudness !== null ? +loudness : null,\r\n loudnessPeakLimit: truePeak !==null ? +truePeak : null,\r\n musicReductionEnable: isMusicReductionEnable,\r\n noiseReductionEnable: isNoiseReductionEnable,\r\n noiseReductionAmount: selectedNoiseReductionAmount,\r\n speechClickReductionEnable: isSpeechClickReductionEnable,\r\n speechClickReductionAmount: selectedSpeechClickReductionAmount ,\r\n speechIsolationEnable: isSpeechIsolationEnable,\r\n speechIsolationAmount: speechIsolationAmount !== null ? +speechIsolationAmount : null,\r\n speechPlosiveReductionEnable: isSpeechPlosiveReductionEnable,\r\n speechPlosiveReductionAmount: selectedPlosiveReductionAmount,\r\n speechSibilanceReductionEnable: isSpeechSibilanceReductionEnable,\r\n speechSibilanceReductionAmount: selectedSibilanceReductionAmount,\r\n }\r\n\r\n setIsLoading(true)\r\n if( modalAction === \"edit\" ) {\r\n await updateTranscodingProfile(profileIdForAction,request)\r\n }\r\n\r\n if( modalAction === \"create\" ) {\r\n await createTranscodingProfile(request);\r\n }\r\n\r\n await updateTranscodingProfilesList();\r\n hideModal();\r\n setIsLoading(false);\r\n }\r\n\r\n const removeTranscodingProfile = async () => {\r\n setIsLoading(true);\r\n await deleteTranscodingProfile(profileIdForAction);\r\n await updateTranscodingProfilesList();\r\n hideDeleteModal();\r\n setIsLoading(false);\r\n }\r\n\r\n const videoHeightHandler = (newValue: string) => {\r\n if(newValue === \"\") setVideoHeight(null);\r\n else setVideoHeight(+newValue);\r\n }\r\n\r\n const loudnessHandler = (newValue: string) => {\r\n if(newValue === \"\") setLoudness(null);\r\n else setLoudness(+newValue);\r\n setIsLoudnessError(false);\r\n }\r\n\r\n const truePeakHandler = (newValue: string) => {\r\n if(newValue === \"\") setTruePeak(null)\r\n else setTruePeak(+newValue);\r\n setIsTruePeakError(false);\r\n }\r\n\r\n const highPassFrequencyHandler = (newValue: string) => {\r\n if(newValue === \"\") setFilterHighPassFrequency(null);\r\n else setFilterHighPassFrequency(+newValue);\r\n setIsFilterHighPassFrequencyError(false);\r\n }\r\n\r\n const speechIsolationHandler = (newValue: string) => {\r\n if(newValue === \"\") setSpeechIsolationAmount(null)\r\n else setSpeechIsolationAmount(+newValue);\r\n setIspeechIsolationAmountError(false);\r\n }\r\n\r\n const renderStatus = (status:boolean) =>{\r\n return status ? <span className=\"current-status online\">Enabled</span> : <span className=\"current-status offline\">Disabled</span>\r\n }\r\n\r\n const renderProfilesList = (profiles: MediaTranscodingProfile[]) => {\r\n return profiles.map( it => {\r\n return <tr key={it.id}>\r\n <td>{it.name}</td>\r\n <td>\r\n <p>Codec: {it.videoCodec}</p>\r\n <p>Bit Rate: {it.videoBitrateKb} Kb/sec</p>\r\n <p>Frame Rate: {it.videoFrameRate} FPS</p>\r\n <p>Width: {it.videoWidth}</p>\r\n <p>Height: {it.videoHeight}</p>\r\n </td>\r\n <td>\r\n <p>Codec: {it.audioCodec}</p>\r\n <p>Bit Rate: {it.audioBitrateKb} Kb/sec</p>\r\n <p>Audio Channels: {it.audioChannels}</p>\r\n <p>Audio Sample Rate: {it.audioSampleRate} Hz</p>\r\n </td>\r\n <td>\r\n <p>Enabled: {renderStatus(it.dynamicsRangeControlEnable)}</p>\r\n <p>Amount: {it.dynamicsRangeControlAmount}</p>\r\n </td>\r\n <td>\r\n <p>DynamicEq: {renderStatus(it.filterDynamicEqEnable)}</p>\r\n <p>HighPass: {renderStatus(it.filterHighPassEnable)}</p>\r\n <p>HighPassFrequency: {it.filterHighPassFrequency} Hz</p>\r\n <p>Hum: {renderStatus(it.filterHumEnable)}</p>\r\n </td>\r\n <td>\r\n <p>Loudness: {renderStatus(it.loudnessEnable)}</p>\r\n <p>Target Level: {it.loudnessTargetLevel} dB</p>\r\n <p>Peak Limit: {it.loudnessPeakLimit} dB</p>\r\n </td>\r\n <td>\r\n <p>Music Reduction: {renderStatus(it.musicReductionEnable)}</p>\r\n <p>Noise Reduction: {renderStatus(it.noiseReductionEnable)}</p>\r\n <p>Noise Reduction Amount: {it.noiseReductionAmount}</p>\r\n </td>\r\n <td>\r\n <p>Click Reduction: {renderStatus(it.speechClickReductionEnable)}</p>\r\n <p>Amount: {it.speechClickReductionAmount}</p>\r\n\r\n <p>Isolation: {renderStatus(it.speechIsolationEnable)}</p>\r\n <p>Amount {it.speechIsolationAmount}</p>\r\n\r\n <p>Plosive Reduction {renderStatus(it.speechPlosiveReductionEnable)}</p>\r\n <p>Amount {it.speechPlosiveReductionAmount}</p>\r\n\r\n <p>Sibilance Reduction {renderStatus(it.speechSibilanceReductionEnable)}</p>\r\n <p>Amount {it.speechSibilanceReductionAmount}</p>\r\n </td>\r\n <td>\r\n <IconButton tooltipText=\"Edit\" type=\"edit\" onClick={() => {showModal(\"edit\", it)}} />\r\n <IconButton tooltipText=\"Delete\" type=\"delete\" onClick={() => {showDeleteModal(it.id)}} />\r\n </td>\r\n </tr>\r\n })\r\n }\r\n\r\n return (\r\n <>\r\n <div className=\"d-flex justify-content-between align-items-center mb-20 w-100\">\r\n <h2>Media Transcoding Profiles</h2>\r\n <Button color=\"green\" label=\"Add Media Transcoding Profile\" onClick={() => {showModal(\"create\")}} />\r\n </div>\r\n\r\n {profiles.length ? <table className=\"table transcode-table\">\r\n <thead>\r\n <tr>\r\n <td>Name</td>\r\n <td>Video</td>\r\n <td>Audio</td>\r\n <td>Dynamic Range Control</td>\r\n <td>Filter</td>\r\n <td>Loudness</td>\r\n <td>Noise / Music</td>\r\n <td>Speech</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderProfilesList(profiles)}\r\n </tbody>\r\n </table> : <p>Element list is empty</p>}\r\n\r\n <CenterModal\r\n title={modalAction === \"edit\" ? \"Edit Media Transcoding Profile\" : \"Add Media Transcoding Profile\"} \r\n show={isShowModal} \r\n onRequestClose={hideModal}\r\n >\r\n <FormRowWithColumns>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter Name\"\r\n id = \"profile_name\"\r\n isError = {isNameError}\r\n title = \"Name\"\r\n onChangeValue = {(v) => {setName(v); setIsNameError(false)}}\r\n value = {name}\r\n />\r\n </FormRow>\r\n <FormRow></FormRow>\r\n </FormRowWithColumns>\r\n <FormRowWithColumns>\r\n <FormRow>\r\n <ReactSelect<NumberOrNull>\r\n title=\"Video Frame Rate FPS\"\r\n options={videoFrameRateOptions}\r\n selectedValue={selectedVideoFrameRate}\r\n onChange={setSelectedVideoFrameRate}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <ReactSelect<NumberOrNull>\r\n title=\"Video Width px\"\r\n options={videoWidthOptions}\r\n selectedValue={selectedVideoWidth}\r\n onChange={setSelectedVideoWidth}\r\n />\r\n </FormRow>\r\n {/* <FormRow>\r\n <FormInputNumber\r\n id=\"videoheight\"\r\n title=\"Video Height\"\r\n isError={false}\r\n errorMessage=\"\"\r\n value={videoHeight === null ? \"\" : videoHeight}\r\n onChange={()=>{}}\r\n onChangeValue={videoHeightHandler}\r\n />\r\n </FormRow> */}\r\n <FormRow>\r\n <ReactSelect<StringOrNull>\r\n title=\"Video Codec\"\r\n options={videoCodecOptions}\r\n selectedValue={selectedVideoCodec}\r\n onChange={setSelectedVideoCodec}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <ReactSelect<NumberOrNull>\r\n title=\"Video Bitrate KB\"\r\n options={videoBitrateOptions}\r\n selectedValue={selectedVideoBitrateKB}\r\n onChange={setSelectedVideoBitrateKB}\r\n />\r\n </FormRow>\r\n </FormRowWithColumns>\r\n\r\n <FormRowWithColumns>\r\n <FormRow>\r\n <ReactSelect<NumberOrNull>\r\n title=\"Audio Channels\"\r\n options={audioChannelsOptions}\r\n selectedValue={selectedAudioChannels}\r\n onChange={setSelectedAudioChannels}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <ReactSelect<NumberOrNull>\r\n title=\"Audio Sample Rate Hz\"\r\n options={audioSmapleOptions}\r\n selectedValue={selectedAudioSampleRate}\r\n onChange={setSelectedAudioSampleRate}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <ReactSelect<StringOrNull>\r\n title=\"Audio Codec\"\r\n options={audioCodecOptions}\r\n selectedValue={selectedAudioCodec}\r\n onChange={setSelectedAudioCodec}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <ReactSelect<NumberOrNull>\r\n title=\"Audio Bitrate KB\"\r\n options={audioBitrateOptions}\r\n selectedValue={selectedAudioBitrateKB}\r\n onChange={setSelectedAudioBitrateKB}\r\n />\r\n </FormRow>\r\n </FormRowWithColumns>\r\n\r\n <FormRowWithColumns>\r\n <FormRow>\r\n <div className=\"d-flex align-items-center pt-20\">\r\n <FormCheckbox id=\"loudness_enabled\" checked={isLoudnessEnabled} onChange={setIsLoudnessEnabled} />\r\n <span className=\"status-block\">\r\n {isLoudnessEnabled ? <span className=\"current-status online\"> Loudness Enabled </span> \r\n : <span className=\"current-status offline\"> Loudness Disabled</span>}\r\n </span>\r\n </div>\r\n </FormRow>\r\n <FormRow>\r\n <FormInputNumber\r\n id=\"loudness\"\r\n title=\"Loudness Target Level dB\"\r\n isError={isLoudnessError}\r\n errorMessage=\"Select correct loudness in range -45 : -8\"\r\n min={-45}\r\n max={-8}\r\n step={0.1}\r\n value={loudness !== null ? loudness : \"\"}\r\n onChange={()=>{}}\r\n onChangeValue={loudnessHandler}\r\n />\r\n </FormRow>\r\n\r\n <FormRow>\r\n <FormInputNumber\r\n id=\"true-peak\"\r\n title=\"Loudness True Peak dB\"\r\n isError={isTruePeakError}\r\n errorMessage=\"Select correct true peak in range -3 : 0.1\"\r\n min={-33}\r\n max={0.1}\r\n step={0.1}\r\n value={truePeak !== null ? truePeak : \"\"}\r\n onChange={()=>{}}\r\n onChangeValue={truePeakHandler}\r\n />\r\n </FormRow>\r\n\r\n <FormRow></FormRow>\r\n </FormRowWithColumns>\r\n\r\n <FormRowWithColumns>\r\n <FormRow>\r\n <div className=\"d-flex align-items-center pt-20\">\r\n <FormCheckbox id=\"click_reduction\" checked={isSpeechClickReductionEnable} onChange={setIsSpeechClickReductionEnable} />\r\n <span className=\"status-block\">\r\n {isSpeechClickReductionEnable ? <span className=\"current-status online\"> Speech Click Reduction Enabled</span> \r\n : <span className=\"current-status offline\"> Speech Click Reduction Disabled</span>}\r\n </span>\r\n </div>\r\n </FormRow>\r\n <FormRow>\r\n <div className=\"d-flex align-items-center pt-20\">\r\n <FormCheckbox id=\"speech_isolation\" checked={isSpeechIsolationEnable} onChange={setIsSpeechIsolationEnable} />\r\n <span className=\"status-block\">\r\n {isSpeechIsolationEnable ? <span className=\"current-status online\"> Speech Isolation Enabled</span> \r\n : <span className=\"current-status offline\"> Speech Isolation Disabled</span>}\r\n </span>\r\n </div>\r\n </FormRow>\r\n <FormRow>\r\n <div className=\"d-flex align-items-center pt-20\">\r\n <FormCheckbox id=\"plosive_reduction\" checked={isSpeechPlosiveReductionEnable} onChange={setIsSpeechPlosiveReductionEnable} />\r\n <span className=\"status-block\">\r\n {isSpeechPlosiveReductionEnable ? <span className=\"current-status online\"> Speech Plosive Reduction Enabled</span> \r\n : <span className=\"current-status offline\"> Speech Plosive Reduction Disabled</span>}\r\n </span>\r\n </div>\r\n </FormRow>\r\n <FormRow>\r\n <div className=\"d-flex align-items-center pt-20\">\r\n <FormCheckbox id=\"sibilance_reduction\" checked={isSpeechSibilanceReductionEnable} onChange={setIsSpeechSibilanceReductionEnable} />\r\n <span className=\"status-block\">\r\n {isSpeechSibilanceReductionEnable ? <span className=\"current-status online\"> Speech Sibilance Reduction Enabled</span> \r\n : <span className=\"current-status offline\"> Speech Sibilance Reduction Disabled</span>}\r\n </span>\r\n </div>\r\n </FormRow>\r\n \r\n </FormRowWithColumns>\r\n\r\n <FormRowWithColumns>\r\n <FormRow>\r\n <ReactSelect<StringOrNull>\r\n title=\"Speech Click Reduction Amount\"\r\n options={levelOptions}\r\n selectedValue={selectedSpeechClickReductionAmount}\r\n onChange={setSelectedSpeechClickReductionAmount}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInputNumber\r\n id=\"speech_isolation_amount\"\r\n title=\"Speech Isolation Amount\"\r\n isError={isSpeechIsolationAmountError}\r\n errorMessage=\"Select correct speech isolation in range 0 : 100\"\r\n min={0}\r\n max={100}\r\n step={1}\r\n value={speechIsolationAmount !== null ? +speechIsolationAmount : \"\"}\r\n onChange={()=>{}}\r\n onChangeValue={speechIsolationHandler}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <ReactSelect<StringOrNull>\r\n title=\"Speech Plosive Reduction Amount\"\r\n options={levelOptions}\r\n selectedValue={selectedPlosiveReductionAmount}\r\n onChange={setSelectedPlosiveReductionAmount}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <ReactSelect<StringOrNull>\r\n title=\"Speech Sibilance Reduction Amount\"\r\n options={levelOptions}\r\n selectedValue={selectedSibilanceReductionAmount}\r\n onChange={setSelectedSibilanceReductionAmount}\r\n />\r\n </FormRow>\r\n </FormRowWithColumns>\r\n\r\n <FormRowWithColumns>\r\n <FormRow>\r\n <div className=\"d-flex align-items-center pt-20\">\r\n <FormCheckbox id=\"noise_reduction\" checked={isNoiseReductionEnable} onChange={setIsNoiseReductionEnable} />\r\n <span className=\"status-block\">\r\n {isNoiseReductionEnable ? <span className=\"current-status online\">  Noise Reduction Enabled</span>\r\n : <span className=\"current-status offline\"> Noise Reduction Disabled</span>}\r\n </span>\r\n </div>\r\n </FormRow>\r\n <FormRow>\r\n <div className=\"d-flex align-items-center pt-20\">\r\n <FormCheckbox id=\"high-pass\" checked={isFilterHighPassEnable} onChange={setIsFilterHighPassEnable} />\r\n <span className=\"status-block\">\r\n {isFilterHighPassEnable ? <span className=\"current-status online\"> Dynamic High Pass Enabled</span>\r\n : <span className=\"current-status offline\"> Dynamic High Pass Disabled</span>}\r\n </span>\r\n </div>\r\n </FormRow>\r\n <FormRow>\r\n <div className=\"d-flex align-items-center pt-20\">\r\n <FormCheckbox id=\"dynamic-control-range\" checked={isDynamicsRangeControlEnable} onChange={setIsDynamicsRangeControlEnable} />\r\n <span className=\"status-block\">\r\n {isDynamicsRangeControlEnable ? <span className=\"current-status online\"> Dynamics Range Control Enabled</span> \r\n : <span className=\"current-status offline\"> Dynamics Range Control Disabled</span>}\r\n </span>\r\n </div>\r\n </FormRow>\r\n <FormRow>\r\n <div className=\"\" style={{position:\"absolute\"}}>\r\n <div className=\"d-flex align-items-center pt-20\">\r\n <FormCheckbox id=\"eq\" checked={isFilterDynamicEqEnable} onChange={setIsFilterDynamicEqEnable} />\r\n <span className=\"status-block\">\r\n {isFilterDynamicEqEnable ? <span className=\"current-status online\"> Dynamic Eq Enabled</span> \r\n : <span className=\"current-status offline\"> Dynamic Eq Disabled</span>}\r\n </span>\r\n </div>\r\n\r\n <div className=\"d-flex align-items-center pt-20\">\r\n <FormCheckbox id=\"use-nested\" checked={isFilterHumEnable} onChange={setIsFilterHumEnable} />\r\n <span className=\"status-block\">\r\n {isFilterHumEnable ? <span className=\"current-status online\"> Dynamic HUM Enabled</span> \r\n : <span className=\"current-status offline\"> Dynamic HUM Disabled</span>}\r\n </span>\r\n </div>\r\n\r\n <div className=\"d-flex align-items-center pt-20\">\r\n <FormCheckbox id=\"music_reduction\" checked={isMusicReductionEnable} onChange={setIsMusicReductionEnable} />\r\n <span className=\"status-block\">\r\n {isMusicReductionEnable ? <span className=\"current-status online\"> Music Reduction Enabled</span> \r\n : <span className=\"current-status offline\"> Music Reduction Disabled</span>}\r\n </span>\r\n </div>\r\n </div>\r\n </FormRow>\r\n </FormRowWithColumns>\r\n \r\n <FormRowWithColumns>\r\n <FormRow>\r\n <ReactSelect<StringOrNull>\r\n title=\"Noise Reduction Amount\"\r\n options={levelOptions}\r\n selectedValue={selectedNoiseReductionAmount}\r\n onChange={setSelectedNoiseReductionAmount}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <FormInputNumber\r\n id=\"filterHighPassFrequency\"\r\n title=\"High Pass Frequency Hz\"\r\n isError={isFilterHighPassFrequencyError}\r\n errorMessage=\"Select correct frequency in range 50 : 120\"\r\n min={50}\r\n max={120}\r\n step={1}\r\n value={filterHighPassFrequency !== null ? +filterHighPassFrequency : \"\"}\r\n onChange={()=>{}}\r\n onChangeValue={highPassFrequencyHandler}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n <ReactSelect<StringOrNull>\r\n title=\"Dynamic Range Control Amount\"\r\n options={levelOptions}\r\n selectedValue={selectedDynamicsRangeControlAmount}\r\n onChange={setSelectedDynamicsRangeControlAmount}\r\n />\r\n </FormRow>\r\n <FormRow>\r\n\r\n </FormRow>\r\n </FormRowWithColumns>\r\n\r\n \r\n\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={createOrUpdateTranscodingProfile}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideModal}/>\r\n </div>\r\n </CenterModal> \r\n\r\n <SmallModal show={isShowDeleteProfileModal} onRequestClose={hideDeleteModal}> \r\n <p>That you want to delete Profile?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideDeleteModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={removeTranscodingProfile}/>\r\n </div>\r\n </SmallModal>\r\n\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n )\r\n}\r\n\r\nexport default MediaTranscoding","import { useEffect, useState } from \"react\";\r\nimport GlobalSpinner from \"../globalsSpinner/GlobalSpinner\"\r\nimport { Button } from \"../Button\";\r\nimport IconButton from \"../iconButton/IconButton\";\r\nimport { BaseInfo, Guid } from \"../../../api/baseApi\";\r\nimport { RightModal, SmallModal } from \"../sideModal/Modal\";\r\nimport { FormInput, FormRow } from \"../formRow/FormRow\";\r\nimport Select, { MultiValue, SingleValue } from \"react-select\";\r\nimport { getPlayers } from \"../../../api/playersApi\";\r\nimport { createTag, CreateTagRequest, deleteTag, TagManagmentEntityRequest, deleteTagManagmentEntity, getTagManagment, TagManagmentEntityType, TagManagmentProfile, updateTag, addEntityForTag, getTagStreams, ExtendedBaseInfo } from \"../../../api/tagApi\";\r\nimport { getCampaigns } from \"../../../api/campaingsApi\";\r\nimport { getPlayNowLists } from \"../../../api/playNowListApi\";\r\nimport Pagination from \"../pagination/Pagination\";\r\nimport { getPagesCount } from \"../../../services/paginator\";\r\n\r\ntype ModalAction = \"create\" | \"edit\" | \"nothing\";\r\ntype Option<T> = { value: T, label: string}\r\nconst TagManagment = () => {\r\n let [isLoading, setIsLoading] = useState(false)\r\n let [isShowModal, setIsShowModal] = useState(false)\r\n let [isShowDeleteModal, setIsShowDeleteModal] = useState(false)\r\n let [isShowEntityDeleteModal, setIsShowEntityDeleteModal] = useState(false)\r\n let [isShowEntityAddModal, setIsShowEntityAddModal] = useState(false)\r\n let [idForAction, setIdForAction] = useState(\"\")\r\n let [entityIdForAction, setEntityIdForAction] = useState(\"\")\r\n let [modalAction, setModalAction] = useState<ModalAction>(\"nothing\")\r\n\r\n let [tagName, setTagName] = useState(\"\")\r\n let [isTagNameError, setIsTagNameError] = useState(false)\r\n\r\n let [tagProfiles, setTagProfiles] = useState<TagManagmentProfile[]>([])\r\n let [listItemsToDisplay, setListItemsToDisplay] = useState<TagManagmentProfile[]>([]);\r\n\r\n let [players, setPlayers] = useState<Option<Guid>[]>([]);\r\n let [selectedPlayers, setSelectedPlayers] = useState<Guid[]>([])\r\n let [currentPlayer, setCurrentPlayer] = useState<Guid>(\"\")\r\n\r\n let [campaigns, setCampaigns] = useState<Option<Guid>[]>([]);\r\n let [selectedCampaigns, setSelectedCampaigns] = useState<Guid[]>([])\r\n let [currentCampaign, setCurrentCampaign] = useState<Guid>(\"\")\r\n\r\n let [streams, setStreams] = useState<Option<Guid>[]>([]);\r\n let [selectedStreams, setSelectedStreams] = useState<Guid[]>([])\r\n let [currentStream, setCurrentStream] = useState<Guid>(\"\")\r\n\r\n let [playNows, setPlayNows] = useState<Option<Guid>[]>([]);\r\n let [selectedPlayNows, setSelectedPlayNows] = useState<Guid[]>([])\r\n let [currentPlayNow, setCurrentPlayNow] = useState<Guid>(\"\")\r\n\r\n let [entityType, setEntityType] = useState<TagManagmentEntityType | null>(null)\r\n\r\n let [searchString, setSearchString] = useState(\"\")\r\n let [pageLoaded, setPageLoaded] = useState(false)\r\n\r\n let [currentPage, setCurrentPage] = useState<number>(1);\r\n let itemsPerPage = 20;\r\n\r\n useEffect(()=>{\r\n async function fetchTagManagment(){\r\n setIsLoading(true);\r\n await Promise.all([updateTagManagmentList(), updatePlayersList(), updateCampaigns(), updateStreams(), updatePlayNows()]);\r\n setPageLoaded(true);\r\n setIsLoading(false);\r\n }\r\n\r\n fetchTagManagment()\r\n },[])\r\n\r\n useEffect(()=>{\r\n let interval = setTimeout(()=> {\r\n if(pageLoaded){\r\n updateTagManagmentList();\r\n setCurrentPage(1)\r\n } \r\n }, 1000)\r\n\r\n return () => {\r\n clearTimeout(interval)\r\n }\r\n },[searchString])\r\n\r\n useEffect(()=>{\r\n if(pageLoaded){\r\n updateTagManagmentList();\r\n setCurrentPage(1)\r\n } \r\n },[selectedPlayers, selectedCampaigns, selectedPlayNows, selectedStreams])\r\n\r\n useEffect(() => {\r\n let startIndex = (currentPage - 1)*itemsPerPage;\r\n let finishIndex = startIndex + itemsPerPage;\r\n setListItemsToDisplay(tagProfiles.slice(startIndex, finishIndex));\r\n }, [tagProfiles, currentPage]);\r\n\r\n const updateTagManagmentList = async () => {\r\n let response = await getTagManagment({\r\n searchString: searchString,\r\n playerIds: selectedPlayers,\r\n campaignIds: selectedCampaigns,\r\n playNowIds: selectedPlayNows,\r\n streamIds: selectedStreams\r\n });\r\n if( response.type === \"succes\") {\r\n setTagProfiles(response.data.items);\r\n }\r\n }\r\n\r\n const updatePlayersList = async () => {\r\n let result = await getPlayers();\r\n setPlayers(result.players.map(player => {\r\n return {\r\n label: player.name ? player.name : '',\r\n value: player.id\r\n }\r\n }));\r\n }\r\n\r\n const updateCampaigns = async () => {\r\n let result = await getCampaigns()\r\n if(result.type === \"succes\"){\r\n setCampaigns(result.data.campaigns.map(el => {\r\n return {\r\n label: el.name,\r\n value: el.id\r\n }\r\n }))\r\n }\r\n }\r\n\r\n const updateStreams = async () => {\r\n let result = await getTagStreams()\r\n if(result.type === \"succes\"){\r\n setStreams(result.data.items.map(el => {\r\n return {\r\n label: el.name,\r\n value: el.id\r\n }\r\n }))\r\n }\r\n }\r\n\r\n const updatePlayNows = async () => {\r\n var result = await getPlayNowLists();\r\n if(result.type === 'succes'){\r\n setPlayNows(result.data.items.map(el => {\r\n return {\r\n label: el.name,\r\n value: el.id\r\n }\r\n }));\r\n }\r\n }\r\n\r\n const renderBaseInfo = (arr: ExtendedBaseInfo[], tagId: Guid, entity: TagManagmentEntityType) => {\r\n return arr.map( el => {\r\n return <p key={el.id}>\r\n {el.name}   \r\n {el.isAny ? <span className=\"green-text\" >Any</span> : null} \r\n <span className=\"close__element\" onClick={()=>{showEntityDeleteModal(tagId, el.id, entity)}}>x</span>\r\n </p>\r\n })\r\n }\r\n \r\n const renderProfilesList = (profiles:TagManagmentProfile[]) => {\r\n return profiles.map( it => {\r\n return <tr key={it.id}>\r\n <td>{it.name}</td>\r\n <td>\r\n {renderBaseInfo(it.players, it.id, TagManagmentEntityType.Players)}\r\n <p className=\"link-like__elem\" onClick={() => {showEntityAddModal(it.id, TagManagmentEntityType.Players)}}>+ Add</p>\r\n </td>\r\n <td>\r\n {renderBaseInfo(it.campaigns, it.id, TagManagmentEntityType.Campaigns)}\r\n <p className=\"link-like__elem\" onClick={() => {showEntityAddModal(it.id, TagManagmentEntityType.Campaigns)}}>+ Add</p>\r\n </td>\r\n <td>\r\n {renderBaseInfo(it.includedStreams, it.id, TagManagmentEntityType.IncludedStreams)}\r\n <p className=\"link-like__elem\" onClick={() => {showEntityAddModal(it.id, TagManagmentEntityType.IncludedStreams)}}>+ Add</p>\r\n </td>\r\n <td>\r\n {renderBaseInfo(it.excludedStreams, it.id, TagManagmentEntityType.ExcludedStreams)}\r\n <p className=\"link-like__elem\" onClick={() => {showEntityAddModal(it.id, TagManagmentEntityType.ExcludedStreams)}}>+ Add</p>\r\n </td>\r\n <td>\r\n {renderBaseInfo(it.includedPlayNows, it.id, TagManagmentEntityType.IncludedPlayNows)}\r\n <p className=\"link-like__elem\" onClick={() => {showEntityAddModal(it.id, TagManagmentEntityType.IncludedPlayNows)}}>+ Add</p>\r\n </td>\r\n <td>\r\n {renderBaseInfo(it.excludedPlayNows, it.id, TagManagmentEntityType.ExcludedPlayNows)}\r\n <p className=\"link-like__elem\" onClick={() => {showEntityAddModal(it.id, TagManagmentEntityType.ExcludedPlayNows)}}>+ Add</p>\r\n </td>\r\n <td>\r\n <IconButton tooltipText=\"Edit\" type=\"edit\" onClick={() => {showModal(\"edit\", it)}} />\r\n <IconButton tooltipText=\"Delete\" type=\"delete\" onClick={() => {showDeleteModal(it.id)}} />\r\n </td>\r\n </tr>\r\n })\r\n }\r\n\r\n const showModal = (action: ModalAction, tag?: TagManagmentProfile) => {\r\n setIsShowModal(true);\r\n setModalAction(action)\r\n\r\n if(action === \"edit\" && tag){\r\n setTagName(tag.name)\r\n setIdForAction(tag.id)\r\n }\r\n }\r\n\r\n const hideModal = () => {\r\n setIsShowModal(false);\r\n setTagName(\"\")\r\n setIsTagNameError(false)\r\n setModalAction(\"nothing\")\r\n setIdForAction(\"\")\r\n }\r\n\r\n const showDeleteModal = (id:Guid) => {\r\n setIsShowDeleteModal(true);\r\n setIdForAction(id);\r\n }\r\n\r\n const hideDeleteModal = () => {\r\n setIsShowDeleteModal(false);\r\n setIdForAction(\"\");\r\n }\r\n\r\n const showEntityDeleteModal = (tagId: Guid, entityId: Guid, entity: TagManagmentEntityType) => {\r\n setIsShowEntityDeleteModal(true);\r\n setEntityType(entity);\r\n setIdForAction(tagId)\r\n setEntityIdForAction(entityId)\r\n }\r\n\r\n const hideEntityDeleteModal = () => {\r\n setIsShowEntityDeleteModal(false);\r\n setEntityType(null)\r\n setIdForAction(\"\")\r\n setEntityIdForAction(\"\")\r\n }\r\n\r\n const showEntityAddModal = (tagId: Guid, entity: TagManagmentEntityType) => {\r\n setIsShowEntityAddModal(true);\r\n setEntityType(entity);\r\n setIdForAction(tagId)\r\n }\r\n\r\n const hideEntityAddModal = () => {\r\n setIsShowEntityAddModal(false);\r\n setEntityType(null)\r\n setIdForAction(\"\")\r\n setEntityIdForAction(\"\")\r\n setCurrentPlayer(\"\")\r\n setCurrentCampaign(\"\")\r\n setCurrentStream(\"\")\r\n setCurrentPlayNow(\"\")\r\n }\r\n\r\n const createOrUpdateTag = async () => {\r\n let isValid = true;\r\n\r\n if(!tagName){\r\n setIsTagNameError(true);\r\n isValid = false;\r\n }\r\n\r\n if(!isValid) return;\r\n\r\n let request: CreateTagRequest = {\r\n name: tagName\r\n }\r\n\r\n setIsLoading(true)\r\n if( modalAction === \"edit\" ) {\r\n await updateTag(idForAction, request)\r\n }\r\n\r\n if( modalAction === \"create\" ) {\r\n await createTag(request);\r\n }\r\n\r\n await updateTagManagmentList();\r\n hideModal();\r\n setIsLoading(false);\r\n }\r\n\r\n const removeTag = async () => {\r\n setIsLoading(true)\r\n await deleteTag(idForAction)\r\n await updateTagManagmentList();\r\n setIsLoading(false)\r\n hideDeleteModal()\r\n }\r\n\r\n const addEntity = async () => {\r\n let request\r\n if(entityType === TagManagmentEntityType.Players){\r\n request = {\r\n entityType: entityType,\r\n entityId: currentPlayer,\r\n tagId: idForAction\r\n }\r\n }\r\n if(entityType === TagManagmentEntityType.Campaigns){\r\n request = {\r\n entityType: entityType,\r\n entityId: currentCampaign,\r\n tagId: idForAction\r\n }\r\n }\r\n if(entityType === TagManagmentEntityType.IncludedStreams){\r\n request = {\r\n entityType: entityType,\r\n entityId: currentStream,\r\n tagId: idForAction\r\n }\r\n }\r\n if(entityType === TagManagmentEntityType.ExcludedStreams){\r\n request = {\r\n entityType: entityType,\r\n entityId: currentStream,\r\n tagId: idForAction\r\n }\r\n }\r\n if(entityType === TagManagmentEntityType.IncludedPlayNows){\r\n request = {\r\n entityType: entityType,\r\n entityId: currentPlayNow,\r\n tagId: idForAction\r\n }\r\n }\r\n if(entityType === TagManagmentEntityType.ExcludedPlayNows){\r\n request = {\r\n entityType: entityType,\r\n entityId: currentPlayNow,\r\n tagId: idForAction\r\n }\r\n }\r\n \r\n if(request){\r\n setIsLoading(true)\r\n await addEntityForTag(request)\r\n await updateTagManagmentList();\r\n setIsLoading(false)\r\n hideEntityAddModal()\r\n }\r\n }\r\n\r\n const removeEntity = async () => {\r\n if(entityType){\r\n let request = {\r\n entityType: entityType,\r\n entityId: entityIdForAction,\r\n tagId: idForAction\r\n }\r\n setIsLoading(true)\r\n await deleteTagManagmentEntity(request)\r\n await updateTagManagmentList();\r\n setIsLoading(false)\r\n hideEntityDeleteModal()\r\n }\r\n }\r\n\r\n const onChangeSelectedPlayers = (values: MultiValue<Option<Guid>>) => {\r\n let ids = values.map(it => it.value);\r\n setSelectedPlayers([...ids]);\r\n }\r\n\r\n const onChangeCurrentPlayer = (value: SingleValue<Option<Guid>>) => {\r\n if(value){\r\n setCurrentPlayer(value.value);\r\n } else setCurrentPlayer(\"\")\r\n }\r\n\r\n const onChangeSelectedCampaigns = (values: MultiValue<Option<Guid>>) => {\r\n let ids = values.map(it => it.value);\r\n setSelectedCampaigns([...ids]);\r\n }\r\n\r\n const onChangeCurrentCampaign = (value: SingleValue<Option<Guid>>) => {\r\n if(value){\r\n setCurrentCampaign(value.value);\r\n } else setCurrentCampaign(\"\");\r\n }\r\n\r\n const onChangeSelectedStreams = (values: MultiValue<Option<Guid>>) => {\r\n let ids = values.map(it => it.value);\r\n setSelectedStreams([...ids]);\r\n }\r\n\r\n const onChangeCurrentStream = (value: SingleValue<Option<Guid>>) => {\r\n if(value){\r\n setCurrentStream(value.value);\r\n } else setCurrentStream(\"\");\r\n }\r\n\r\n const onChangeSelectedPlayNows = (values: MultiValue<Option<Guid>>) => {\r\n let ids = values.map(it => it.value);\r\n setSelectedPlayNows([...ids]);\r\n }\r\n\r\n const onChangeCurrentPlayNow = (value: SingleValue<Option<Guid>>) => {\r\n if(value){\r\n setCurrentPlayNow(value.value)\r\n } else setCurrentPlayNow(\"\");\r\n }\r\n\r\n return <>\r\n <div className=\"d-flex justify-content-between align-items-center mb-20 w-100\">\r\n <h2>Tag Management</h2>\r\n <Button color=\"green\" label=\"Add Tag\" onClick={() => {showModal(\"create\")}} />\r\n </div>\r\n\r\n <div className=\"d-flex justify-content-between align-items-center gap15\">\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"\"\r\n id = \"tag_search\"\r\n isError = {false}\r\n title = \"Search\"\r\n onChangeValue = {(v) => {setSearchString(v);}}\r\n value = {searchString}\r\n /> \r\n </FormRow>\r\n\r\n <FormRow>\r\n <label>Players</label>\r\n <Select \r\n classNamePrefix={`select`}\r\n options={players} \r\n isMulti={true}\r\n onChange={onChangeSelectedPlayers}\r\n /> \r\n </FormRow>\r\n\r\n <FormRow>\r\n <label>Campaigns</label>\r\n <Select \r\n classNamePrefix={`select`}\r\n options={campaigns} \r\n isMulti={true}\r\n onChange={onChangeSelectedCampaigns}\r\n /> \r\n </FormRow>\r\n\r\n <FormRow>\r\n <label>Streams</label>\r\n <Select \r\n classNamePrefix={`select`}\r\n options={streams} \r\n isMulti={true}\r\n onChange={onChangeSelectedStreams}\r\n /> \r\n </FormRow>\r\n\r\n <FormRow>\r\n <label>PlayNow</label>\r\n <Select \r\n classNamePrefix={`select`}\r\n options={playNows} \r\n isMulti={true}\r\n onChange={onChangeSelectedPlayNows}\r\n /> \r\n </FormRow>\r\n\r\n \r\n </div>\r\n\r\n {listItemsToDisplay.length ? <><table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Name</td>\r\n <td>Players</td>\r\n <td>Campaigns</td>\r\n <td>Streams Include</td>\r\n <td>Streams Exclude</td>\r\n <td>PlayNow Include</td>\r\n <td>PlayNow Exclude</td>\r\n <td></td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderProfilesList(listItemsToDisplay)}\r\n </tbody>\r\n </table>\r\n <Pagination activePage={currentPage} pagesCount={getPagesCount(tagProfiles.length, itemsPerPage)} changePaginationPage={setCurrentPage} />\r\n </> : <p>Element list is empty</p>}\r\n\r\n\r\n <RightModal title={`${modalAction === \"edit\" ? \"Edit\" : \"Add New\"} Tag`} show={isShowModal} onRequestClose={hideModal}>\r\n <FormRow>\r\n <FormInput \r\n errorMessage = \"Please enter Name\"\r\n id = \"tag_name\"\r\n isError = {isTagNameError}\r\n title = \"Name\"\r\n onChangeValue = {(v) => {setTagName(v); setIsTagNameError(false)}}\r\n value = {tagName}\r\n />\r\n </FormRow>\r\n\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={createOrUpdateTag}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideModal}/>\r\n </div>\r\n </RightModal> \r\n\r\n <RightModal title=\"Add\" show={isShowEntityAddModal} onRequestClose={hideEntityAddModal}>\r\n {entityType === TagManagmentEntityType.Players && <FormRow>\r\n <label>Players</label>\r\n <Select \r\n classNamePrefix={`select`}\r\n options={players} \r\n onChange={onChangeCurrentPlayer}\r\n /> \r\n </FormRow>}\r\n {entityType === TagManagmentEntityType.Campaigns && <FormRow>\r\n <label>Campaigns</label>\r\n <Select \r\n classNamePrefix={`select`}\r\n options={campaigns} \r\n onChange={onChangeCurrentCampaign}\r\n /> \r\n </FormRow>}\r\n {(entityType === TagManagmentEntityType.IncludedStreams || entityType === TagManagmentEntityType.ExcludedStreams) && <FormRow>\r\n <label>Streams</label>\r\n <Select \r\n classNamePrefix={`select`}\r\n options={streams} \r\n onChange={onChangeCurrentStream}\r\n /> \r\n </FormRow>}\r\n {(entityType === TagManagmentEntityType.IncludedPlayNows || entityType === TagManagmentEntityType.ExcludedPlayNows) && <FormRow>\r\n <label>PlayNows</label>\r\n <Select \r\n classNamePrefix={`select`}\r\n options={playNows} \r\n onChange={onChangeCurrentPlayNow}\r\n /> \r\n </FormRow>}\r\n\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label=\"Save\" onClick={addEntity}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideEntityAddModal}/>\r\n </div>\r\n </RightModal> \r\n \r\n <SmallModal show={isShowDeleteModal} onRequestClose={hideDeleteModal}> \r\n <p>That you want to delete Tag?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideDeleteModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={removeTag}/>\r\n </div>\r\n </SmallModal>\r\n\r\n <SmallModal show={isShowEntityDeleteModal} onRequestClose={hideEntityDeleteModal}> \r\n <p>That you want to delete {entityType && TagManagmentEntityType[entityType].slice(0, -1)} ?</p>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideEntityDeleteModal}/>\r\n <Button color=\"green\" label=\"Yes\" onClick={removeEntity}/>\r\n </div>\r\n </SmallModal>\r\n\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n}\r\n\r\nexport default TagManagment","import { FC, useEffect, useState } from \"react\";\r\nimport { useAlertsCountStore } from \"../../../hooks/useSystemAlerts\";\r\nimport TvChannels from \"../../components/tvChannelMapping/TvChannels\";\r\nimport SystemAlerts from \"../../components/systemAlerts/SystemAlerts\";\r\nimport Tabs, { TabElement, TabNavigation, TabNavigationElement, TabsContainer } from \"../../components/tab/Tab\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport TvChannelsMapping from \"../../components/tvChannelMapping/TvChannelsMapping\";\r\nimport MediaTranscoding from \"../../components/mediaTranscoding/MediaTranscoding\";\r\nimport TagManagment from \"../../components/tagManagment/TagManagment\";\r\n\r\n\r\ninterface SettingsProps {\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n \r\ntype SettingsTab = \"TVChannels\" | \"systemAlerts\" | \"TVMappingProfiles\" | \"MediaTranscodingProfiles\" | \"TagManagement\";\r\n\r\nconst Settings: FC<SettingsProps> = (props: SettingsProps) => {\r\n let [activeTab, setActiveTab] = useState<SettingsTab>(\"systemAlerts\");\r\n const checkActive = (tab: SettingsTab) => tab === activeTab;\r\n\r\n let {totalAlerts} = useAlertsCountStore();\r\n\r\n return ( <>\r\n <InnerLayout\r\n isCollapsed={props.isCollapsed}\r\n logOut={props.logOut}\r\n toogleCollapse={props.toogleCollapse}\r\n activeTab=\"settings\"\r\n >\r\n <>\r\n <div style={{ paddingTop: '30px' }}>\r\n <h2>Settings</h2>\r\n </div>\r\n <Tabs>\r\n <TabNavigation>\r\n <TabNavigationElement \r\n title=\"Alerts\" \r\n tooltip={totalAlerts}\r\n isActive={checkActive(\"systemAlerts\")} \r\n onClick={() => { setActiveTab(\"systemAlerts\") }} \r\n />\r\n <TabNavigationElement \r\n title=\"TV Channels\" \r\n isActive={checkActive(\"TVChannels\")} \r\n onClick={() => { setActiveTab(\"TVChannels\") }} \r\n />\r\n <TabNavigationElement \r\n title=\"TV Mapping Profiles\" \r\n isActive={checkActive(\"TVMappingProfiles\")} \r\n onClick={() => { setActiveTab(\"TVMappingProfiles\") }} \r\n />\r\n <TabNavigationElement \r\n title=\"Media Transcoding Profiles\" \r\n isActive={checkActive(\"MediaTranscodingProfiles\")} \r\n onClick={() => { setActiveTab(\"MediaTranscodingProfiles\") }} \r\n />\r\n <TabNavigationElement \r\n title=\"Tag Management\" \r\n isActive={checkActive(\"TagManagement\")} \r\n onClick={() => { setActiveTab(\"TagManagement\") }} \r\n />\r\n </TabNavigation>\r\n <TabsContainer>\r\n <TabElement isActive={checkActive(\"systemAlerts\")}>\r\n <SystemAlerts />\r\n </TabElement>\r\n <TabElement isActive={checkActive(\"TVChannels\")}>\r\n <div className=\"w-100\">\r\n {checkActive(\"TVChannels\") && <TvChannels />}\r\n </div>\r\n </TabElement>\r\n <TabElement isActive={checkActive(\"TVMappingProfiles\")}>\r\n <div className=\"w-100\">\r\n {checkActive(\"TVMappingProfiles\") && <TvChannelsMapping />}\r\n </div>\r\n </TabElement>\r\n <TabElement isActive={checkActive(\"MediaTranscodingProfiles\")}>\r\n <div className=\"w-100\">\r\n {checkActive(\"MediaTranscodingProfiles\") && <MediaTranscoding />}\r\n </div>\r\n </TabElement>\r\n <TabElement isActive={checkActive(\"TagManagement\")}>\r\n <div className=\"w-100\">\r\n {checkActive(\"TagManagement\") && <TagManagment />}\r\n </div>\r\n </TabElement>\r\n </TabsContainer>\r\n </Tabs>\r\n </>\r\n </InnerLayout>\r\n </> );\r\n}\r\n \r\nexport default Settings;\r\n","import { Dispatch, FunctionComponent, SetStateAction, useEffect, useState } from \"react\";\r\nimport { RouteComponentProps, useParams, withRouter } from \"react-router-dom\";\r\nimport { toast, ToastContainer } from \"react-toastify\";\r\nimport \"react-toastify/dist/ReactToastify.css\"\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport { updateUserNotifications, AlertType, getUserNotifications } from \"../../../api/usersApi\";\r\nimport { Button } from \"../../components/Button\";\r\nimport FormCheckbox from \"../../components/formRow/FormCheckbox\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport \"./UserSettings.css\"\r\n\r\ninterface UserSettingsNotificationProps extends RouteComponentProps<any>{\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n\r\ntype NotificationGroups = \"Group1\" | \"Group2\" | \"Group3\" | \"Group4\" | undefined;\r\n \r\nconst UserSettingsNotification: FunctionComponent<UserSettingsNotificationProps> = (props : UserSettingsNotificationProps) => {\r\n let {userId} = useParams<{userId:Guid}>();\r\n let [isLoading, setIsloading] = useState(false);\r\n let [notifications, setNotifications] = useState<AlertType[]>([]);\r\n let [isSaveDisabled, setIsSaveDisabled] = useState(true);\r\n\r\n let [isCheckedGroup1, setIsCheckedGroup1] = useState(false);\r\n let [isCheckedGroup2, setIsCheckedGroup2] = useState(false);\r\n let [isCheckedGroup3, setIsCheckedGroup3] = useState(false);\r\n let [isCheckedGroup4, setIsCheckedGroup4] = useState(false);\r\n\r\n let notificationGroup1 = [\r\n AlertType.NewPlayerRegistered,\r\n AlertType.PlayerOfflineContinuouslyRorMoreThan5mins,\r\n AlertType.PlayerOnline,\r\n AlertType.PlayerUpdatedToNewVersion,\r\n AlertType.PlayerCrash,\r\n AlertType.PlayerFreezeForMoreThan30Seconds,\r\n AlertType.PlayerRestartedByCplayerGuardian,\r\n AlertType.PlayerCPUUtilizationAbove75PercentContinuouslyAfter3Mins,\r\n AlertType.PlayerGPUUtilizationAbove60PercentContinuouslyAfter3Mins,\r\n AlertType.PlayerDiskUtilizationAbove75PercentContinuouslyAfter3Mins,\r\n AlertType.PlayerNotResponding,\r\n AlertType.PlayerRestartedByRequest,\r\n AlertType.PlayerRestartedByFreeze,\r\n AlertType.Dolby,\r\n AlertType.RainbowScreen\r\n ];\r\n\r\n let notificationGroup2 = [\r\n AlertType.NewUserAdded,\r\n AlertType.UserDisabled,\r\n AlertType.UserEnabled,\r\n ];\r\n\r\n let notificationGroup3 = [\r\n AlertType.NewCampaignCreated,\r\n AlertType.CampaignStartedByTheStartDate,\r\n AlertType.CampaignPlayedByThePlayButton,\r\n AlertType.CampaignFinishedByTheEndDate,\r\n AlertType.CampaignStoppedByTheStopButton,\r\n AlertType.CampaignAchievedByTheArchiveButton,\r\n AlertType.CampaignStillInDraftMode24hoursAdvancedAlertPriorToStartDate,\r\n AlertType.CampaignHasNoMediaAssets48HoursAdvancedAlertPriorToStartDate\r\n ];\r\n\r\n let notificationGroup4 = [\r\n AlertType.NewSiteCreated,\r\n AlertType.NewPlayerAddedToTheSite,\r\n AlertType.NewPlayerRemovedFromTheSite,\r\n AlertType.NewPlaylistAddedUnderASite,\r\n AlertType.PlaylistDeletedUnderASite\r\n ]\r\n\r\n useEffect(()=>{\r\n async function getData(){\r\n setIsloading(true);\r\n await Promise.all([fetchUserNotifications()]);\r\n setIsloading(false);\r\n }\r\n getData();\r\n },[])\r\n\r\n useEffect(()=>{\r\n checkIsAllGroupElementsActive(notifications)\r\n },[notifications])\r\n\r\n async function fetchUserNotifications(){\r\n setIsloading(true);\r\n let response = await getUserNotifications(userId)\r\n if(response.type == \"succes\") {\r\n setNotifications(response.data.items);\r\n checkIsAllGroupElementsActive(response.data.items)\r\n }\r\n setIsloading(false);\r\n }\r\n\r\n const saveNotifications = async () => {\r\n setIsloading(true);\r\n let request = {\r\n notificationTypes: notifications\r\n }\r\n await updateUserNotifications(userId, request);\r\n await fetchUserNotifications();\r\n setIsSaveDisabled(true);\r\n setIsloading(false);\r\n }\r\n\r\n const checkNotificationGroup = (notification: AlertType) : NotificationGroups => {\r\n if(notificationGroup1.some(it => it === notification)) {return \"Group1\"}\r\n if(notificationGroup2.some(it => it === notification)) {return \"Group2\"}\r\n if(notificationGroup3.some(it => it === notification)) {return \"Group3\"}\r\n if(notificationGroup4.some(it => it === notification)) {return \"Group4\"}\r\n }\r\n\r\n const checkIsAllGroupElementsActive = (notifications: AlertType[]) => {\r\n if(notificationGroup1.every(it => notifications.includes(it))) setIsCheckedGroup1(true);\r\n if(notificationGroup2.every(it => notifications.includes(it))) setIsCheckedGroup2(true);\r\n if(notificationGroup3.every(it => notifications.includes(it))) setIsCheckedGroup3(true);\r\n if(notificationGroup4.every(it => notifications.includes(it))) setIsCheckedGroup4(true);\r\n }\r\n \r\n const updateNotice = ( notification: AlertType) =>{\r\n if(notifications.findIndex(it => it == notification) !== -1){\r\n setNotifications(notifications.filter(it => it !== notification));\r\n }\r\n else{\r\n setNotifications([...notifications, notification]);\r\n }\r\n switch (checkNotificationGroup(notification)) {\r\n case \"Group1\" : setIsCheckedGroup1(false); break;\r\n case \"Group2\" : setIsCheckedGroup2(false); break;\r\n case \"Group3\" : setIsCheckedGroup3(false); break;\r\n case \"Group4\" : setIsCheckedGroup4(false); break;\r\n }\r\n setIsSaveDisabled(false);\r\n } \r\n\r\n const updateNoticeGroup = (groupNotifications: AlertType[], isCheck: boolean, isCheckCB: Dispatch<SetStateAction<boolean>>) => {\r\n if(!isCheck){\r\n setNotifications([...notifications, ...groupNotifications]);\r\n }\r\n else {\r\n setNotifications(notifications.filter(it => !groupNotifications.some( it2 => it2 === it)))\r\n }\r\n isCheckCB(prev => !prev);\r\n setIsSaveDisabled(false);\r\n }\r\n\r\n const renderNotice = (name: string, notification: AlertType) => {\r\n return <div className=\"notification\">\r\n <div className=\"status-container\">\r\n <span>{name}</span>\r\n <FormCheckbox\r\n checked={notifications.findIndex(it => it == notification) !== -1}\r\n id={`notification_${name}`}\r\n onChange={()=> updateNotice(notification)}\r\n />\r\n </div>\r\n </div>\r\n }\r\n\r\n return ( \r\n <InnerLayout \r\n isCollapsed={props.isCollapsed}\r\n logOut={props.logOut}\r\n toogleCollapse={props.toogleCollapse}\r\n activeTab=\"users\">\r\n <>\r\n <div className=\"d-flex justify-content-between align-items-center mb-20 pt-50\">\r\n <h1>Notifications</h1>\r\n <Button color=\"green\" label=\"Save Changes\" isDisabled={isSaveDisabled} onClick={saveNotifications} />\r\n </div>\r\n\r\n <div className=\"notification-title-block\">\r\n <h2>System </h2>\r\n\r\n <div className=\"status-container\">\r\n <span> </span>\r\n <FormCheckbox\r\n checked={isCheckedGroup1}\r\n id={`check_1`}\r\n onChange={() => {updateNoticeGroup( notificationGroup1, isCheckedGroup1, setIsCheckedGroup1)}}\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"notifications-block\">\r\n {renderNotice(\"New Player registered\", AlertType.NewPlayerRegistered)}\r\n {renderNotice(\"Player offline continuously for more than 5 mins\", AlertType.PlayerOfflineContinuouslyRorMoreThan5mins)}\r\n {renderNotice(\"Player online\", AlertType.PlayerOnline)}\r\n {renderNotice(\"Player updated to new version with new version number\", AlertType.PlayerUpdatedToNewVersion)}\r\n {renderNotice(\"Player crash\", AlertType.PlayerCrash)}\r\n {renderNotice(\"Player freeze for more than 30 seconds\", AlertType.PlayerFreezeForMoreThan30Seconds)}\r\n {renderNotice(\"Player not responding\", AlertType.PlayerNotResponding)}\r\n {renderNotice(\"Player restarted by CplayerGuardian\", AlertType.PlayerRestartedByCplayerGuardian)}\r\n {renderNotice(\"Player CPU utilisation above 75% continuously after 3 mins\", AlertType.PlayerCPUUtilizationAbove75PercentContinuouslyAfter3Mins)}\r\n {renderNotice(\"Player GPU utilisation above 60% continuously after 3 mins\", AlertType.PlayerGPUUtilizationAbove60PercentContinuouslyAfter3Mins)}\r\n {renderNotice(\"Player disk utilisation above 75% continuously after 3 mins\", AlertType.PlayerDiskUtilizationAbove75PercentContinuouslyAfter3Mins)}\r\n {renderNotice(\"Player restarted by request\", AlertType.PlayerRestartedByRequest)}\r\n {renderNotice(\"Player restarted by freeze\", AlertType.PlayerRestartedByFreeze)}\r\n {renderNotice(\"Dolby\", AlertType.Dolby)}\r\n {renderNotice(\"Stream Feed Unavailable\", AlertType.RainbowScreen)}\r\n </div>\r\n\r\n <div className=\"notification-title-block\">\r\n <h2>User </h2>\r\n <div className=\"status-container\">\r\n <span> </span>\r\n <FormCheckbox\r\n checked={isCheckedGroup2}\r\n id={`check_2`}\r\n onChange={() => {updateNoticeGroup( notificationGroup2, isCheckedGroup2, setIsCheckedGroup2)}}\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"notifications-block\">\r\n {renderNotice(\"New user added\", AlertType.NewUserAdded)}\r\n {renderNotice(\"User disabled\", AlertType.UserDisabled)} \r\n {renderNotice(\"User enabled\", AlertType.UserEnabled)}\r\n </div>\r\n\r\n <div className=\"notification-title-block\">\r\n <h2>Campaign </h2>\r\n <div className=\"status-container\">\r\n <span> </span>\r\n <FormCheckbox\r\n checked={isCheckedGroup3}\r\n id={`check_3`}\r\n onChange={() => {updateNoticeGroup( notificationGroup3, isCheckedGroup3, setIsCheckedGroup3)}}\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"notifications-block\">\r\n {renderNotice(\"New campaign created\", AlertType.NewCampaignCreated)}\r\n {renderNotice(\"Campaign started by the start date (email sent from 9am until 5:30pm)\", AlertType.CampaignStartedByTheStartDate)}\r\n {renderNotice(\"Campaign played by the play button\", AlertType.CampaignPlayedByThePlayButton)}\r\n {renderNotice(\"Campaign finished by the end date (email sent from 9am until 5:30pm)\", AlertType.CampaignFinishedByTheEndDate)}\r\n {renderNotice(\"Campaign stopped by the stop button\", AlertType.CampaignStoppedByTheStopButton)}\r\n {renderNotice(\"Campaign achieved by the archive button\", AlertType.CampaignAchievedByTheArchiveButton)}\r\n {renderNotice(\"Campaign still in draft mode 24 hours advanced alert prior to start date\", AlertType.CampaignStillInDraftMode24hoursAdvancedAlertPriorToStartDate)}\r\n {renderNotice(\"Campaign has no media assets 48 hours advanced alert prior to start date\", AlertType.CampaignHasNoMediaAssets48HoursAdvancedAlertPriorToStartDate)}\r\n </div>\r\n\r\n <div className=\"notification-title-block\">\r\n <h2>Network </h2>\r\n <div className=\"status-container\">\r\n <span> </span>\r\n <FormCheckbox\r\n checked={isCheckedGroup4}\r\n id={`check_4`}\r\n onChange={() => {updateNoticeGroup( notificationGroup4, isCheckedGroup4, setIsCheckedGroup4)}}\r\n />\r\n </div>\r\n </div>\r\n\r\n <div className=\"notifications-block\">\r\n {renderNotice(\"New network created with the name\", AlertType.NewSiteCreated)}\r\n {renderNotice(\"New player added to the network with player name and network name\", AlertType.NewPlayerAddedToTheSite)}\r\n {renderNotice(\"New player removed from the network with player name and network name\", AlertType.NewPlayerRemovedFromTheSite)}\r\n {renderNotice(\"New playlist added under a network with the new playlist name and network name\", AlertType.NewPlaylistAddedUnderASite)}\r\n {renderNotice(\"Playlist deleted under a network with the playlist name and network name\", AlertType.PlaylistDeletedUnderASite)}\r\n </div>\r\n\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n \r\n </InnerLayout> );\r\n}\r\n \r\nexport default withRouter(UserSettingsNotification);","import { FunctionComponent } from \"react\";\r\nimport { RouteComponentProps } from \"react-router-dom\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\n\r\ninterface ChangeLogProps {\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n\r\n\r\nexport const ChangeLogPage : FunctionComponent<ChangeLogProps> = (props : ChangeLogProps) => {\r\n return (\r\n <InnerLayout \r\n isCollapsed={props.isCollapsed}\r\n logOut={props.logOut}\r\n toogleCollapse={props.toogleCollapse}\r\n activeTab=\"none\"\r\n >\r\n <>\r\n <h1 style={{paddingTop:30}}>Change Log</h1>\r\n <h2>Release Note, version: 0.6.0 04.02.2025</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul> \r\n <li>Web View Media Element</li> \r\n <li>Web View Mosaic Element</li> \r\n <li>Player Media Download Schedule</li> \r\n <li>Fixes</li> \r\n </ul>\r\n </div>\r\n\r\n <h2>Release Note, UI Update 02.12.2024</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul> \r\n <li>Playlist SoV</li> \r\n </ul>\r\n </div>\r\n\r\n <h2>Release Note, UI Update 29.09.2024</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul> \r\n <li>Additional column for sum of duration per row and sum of total duration for Reporting Dashboard</li> \r\n <li>Additional Split for Content Type and filter for Reporting Dashboard</li> \r\n </ul>\r\n </div>\r\n\r\n <h2>Release Note, version: 0.4.0 01.07.2024</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul> \r\n <li>Play Now grouping and duplicate</li> \r\n <li>Local Large File MiniPlayer</li> \r\n <li>Support of SRT for Local Large Files</li> \r\n </ul>\r\n </div>\r\n <h2>Release Note, UI Update 15.08.2024</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul> \r\n <li>Report Dashboard</li> \r\n </ul>\r\n </div>\r\n\r\n <h2>Release Note, UI Update 29.07.2024</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul> \r\n <li>Filter by multiple tags and empty tag on network playlist</li> \r\n </ul>\r\n </div>\r\n <h2>Release Note, UI Update 17.07.2024</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul> \r\n <li>Switch thumbnails generation to browser</li>\r\n <li>Tag management page under Settings</li> \r\n <li>New col to display scheduled date/time for media item inside each Play Now list</li> \r\n </ul>\r\n </div>\r\n <h2>Release Note, UI Update 09.07.2024</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul> \r\n <li>Clock ID In Media</li>\r\n <li>Network Bested Playlist Export to CSV</li> \r\n </ul>\r\n </div>\r\n <h2>Release Note, version: 0.3.6 01.07.2024</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul> \r\n <li>Local PlayNow</li>\r\n <li>Both Type Reports scheduling to email (yesterday, week to date, last week, last 7 days, last month, month to date)</li>\r\n <li>Network playlist Tags column, with a tag filter</li>\r\n <li>Monitoring dashboard: Rename/Expand</li>\r\n <li>Expand all and collapse all button on Network playlist and Player monitor page</li>\r\n <li>Double the page length for Campaign, Network, Stream, PlayNow, Player</li>\r\n </ul>\r\n </div>\r\n <h2>Release Note, version: 0.3.5 16.06.2024</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul> \r\n <li>Macrosed VAST urls</li>\r\n <li>PDF Generation of TV Guided Look</li>\r\n <li>Play Now - Implement this logic without changing Tags in PlayList/Player on the Fly + add columns of current players that are playing each playlist</li>\r\n <li>Play Now - With on the fly changes in Play now for tag and network</li>\r\n <li>Play Now - Start/stop change log table with playlist, player, action, date and time, user that performed action</li>\r\n <li>Play Now - Lockable player for multiple activated Play Now in sequence</li>\r\n </ul>\r\n </div>\r\n\r\n <h2>Release Note, UI Update 28.05.2024</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul> \r\n <li>Campaign ID field</li>\r\n <li>Monitor page filtering, grouping and reordering, links to Stream record and Player config page</li>\r\n <li>Rename Sites to Networks</li>\r\n <li>Reorder items in the Menu</li>\r\n <li>Rename \"Players Monitoring\" to \"Player Monitor Dashboard\"</li>\r\n </ul>\r\n <br></br> \r\n <h3>Fixes:</h3>\r\n <ul> \r\n <li>Fix Time Sensetive Schedule in Play Now</li>\r\n <li>Fix Stream record stuck in TV guide after deletion</li>\r\n <li>Performace improvement</li>\r\n </ul>\r\n </div>\r\n <h2>Release Note, version: 0.3.2 09.05.2024</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul> \r\n <li>Bookend nested playslit wrapping around Stream content</li>\r\n <li>Media item site playlist grouping and bulk operation</li>\r\n <li>Expandable list for paused media items in site playlist</li>\r\n <li>Priority stream visualisation in TV guide look</li>\r\n </ul>\r\n </div>\r\n <h2>Release Note, version: 0.3.1 29.03.2024</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul> \r\n <li>Time sensitive scheduling in Play Now playlist</li>\r\n <li>Player tagging in Play Now playlist</li>\r\n <li>Advanced day parting hour selection</li>\r\n <li>Duplicate Repeat Stream</li>\r\n <li>Advanced colour-striped screen alert</li>\r\n <li>Player monitor page with auto refresh, screenshots and filter</li>\r\n </ul>\r\n </div>\r\n <h2>Release Note, version: 0.3.0 29.02.2024</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul>\r\n <li>Upgrade to .Net 8</li>\r\n </ul>\r\n </div>\r\n <h2>Release Note, version: 0.2.14 04.02.2024</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul>\r\n <li>Collecting new metric from Player: Memory</li>\r\n </ul>\r\n </div>\r\n\r\n <h2>Release Note - UI Update 24.01.2024</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul>\r\n <li>New filter for players on dashboard: All, Enabled, Disabled</li>\r\n </ul>\r\n </div>\r\n\r\n <h2>Release Note, version: 0.2.13 22.11.2023</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul>\r\n <li>Holding image support for replacing on screen colour stripe error message</li>\r\n <li>Player level day parting override</li>\r\n </ul>\r\n </div>\r\n\r\n <h2>Release Note, version: 0.2.12 19.10.2023</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul>\r\n <li>Player Volume Profiles</li>\r\n <li>Real live SoV mini report for the currently live assets</li>\r\n </ul>\r\n </div>\r\n\r\n <h2>Release Note, version: 0.2.11 28.09.2023</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul>\r\n <li>Proxy Server for external HTTP calls</li>\r\n </ul>\r\n </div>\r\n\r\n <h2>Release Note - UI Update 24.08.2023</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul>\r\n <li>Give user options to select And or OR relationship in player tagging in Stream</li>\r\n </ul>\r\n </div>\r\n\r\n <h2>Release Note, version: 0.2.10 10.07.2023</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul>\r\n <li>Dolby integration for media asset transcoding</li>\r\n </ul>\r\n </div>\r\n\r\n <h2>Release Note - UI Update 05.07.2023</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul>\r\n <li>Allow to create Back to Back Priority Streams</li>\r\n </ul>\r\n </div>\r\n\r\n <h2>Release Note, version: 0.2.9 14.06.2023</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul>\r\n <li>Player restart button for instant restart</li>\r\n <li>Schedule large size local media files</li>\r\n <li>Enforce resend of remote TV IR signal for the current scheduled Stream</li>\r\n </ul>\r\n </div>\r\n\r\n <h2>Release Note - UI Update 23.05.2023</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul>\r\n <li>Data retention policy</li>\r\n <li>Screenshot for 5 days</li>\r\n <li>Option to retain/archieve a campaign</li>\r\n <li>Logging errors, requests and telemetry</li>\r\n <li>User alert on server error</li>\r\n </ul>\r\n </div>\r\n\r\n <h2>Release Note, 27.04.2023</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul>\r\n <li>Multiple TV channel mapping profiles</li>\r\n </ul>\r\n <br></br>\r\n <h3>Fix:</h3>\r\n <ul> \r\n <li>Wrong campaign alert messages (in progress)</li>\r\n </ul>\r\n </div>\r\n\r\n <h2>Release Note, version 0.2.8 19.04.2023</h2>\r\n <div style={{marginLeft: 25, marginBottom: 25}}>\r\n <h3>New Features:</h3>\r\n <ul>\r\n <li>Include/Exclude player tags in Streams</li>\r\n <li>Show and edit added VAST URLs</li>\r\n <li>VAST 2.0 FreeWheel and Publica spec support</li>\r\n <li>Content labeling in Site playlist and share of airtime calculation</li>\r\n </ul>\r\n <br></br>\r\n <h3>Improvements:</h3>\r\n <ul> \r\n <li>Improve colour schema on Campaign Timeline Dashboard</li>\r\n </ul>\r\n </div>\r\n \r\n\r\n <h2>Release Note, version 0.2.7 04.04.2023</h2>\r\n <div style={{marginLeft: 25}}>\r\n <h3>New Features:</h3>\r\n <ul>\r\n <li>In platform alert messaging</li>\r\n <li>Email alert messaging</li>\r\n <li>Side app to detect crash and restart Cplayer</li>\r\n <li>CPlayer Freeze detection</li>\r\n <li>Time sensitive scheduling for media in nested playlist</li>\r\n <li>Schedule repeat stream</li>\r\n <li>Display player version on the player page</li>\r\n </ul>\r\n <br></br> \r\n <h3>Improvements:</h3>\r\n <ul> \r\n <li>Rename Priority Stream Tab to Streaming</li>\r\n <li>IImprove remote TV channel change IR solution</li>\r\n <li>Sort Channels in alphabet order</li>\r\n <li>Optimize priority stream media page load</li>\r\n <li>Fix column width in campaign media time schedule</li>\r\n <li>Display player version on the Player List page</li>\r\n <li>Improve stream stability when Cplayer starts up with scheduled stream</li>\r\n </ul>\r\n </div>\r\n \r\n </> \r\n </InnerLayout>\r\n )\r\n}","import React, { FC, useEffect, useState } from 'react'\r\nimport { CampaignPeriod } from '../../../api/campaingsApi';\r\nimport { generateAdhocReport, generateSkinAdhocReport, getAdhocReports, getSkinAdhocReports, MediaReportRow, ReportAdhocStatus } from '../../../api/reportsApi';\r\nimport { convertUTCDateToLocalDate, formatDate, getPastDateByDaysAgo } from '../../../services/dateService';\r\nimport { Button } from '../../components/Button';\r\nimport GlobalSpinner from '../../components/globalsSpinner/GlobalSpinner';\r\nimport InnerLayout from '../innerLayout/InnerLayout';\r\nimport { RouteComponentProps, withRouter } from 'react-router-dom';\r\n\r\nexport interface ReportPageProps extends RouteComponentProps<any>\r\n{\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n\r\nconst CampaignAndChannelAdhocReport:FC<ReportPageProps> = (props) => {\r\n let {logOut, toogleCollapse, isCollapsed} = props;\r\n\r\n let [adhocReports, setAdhocReports] = useState<MediaReportRow[]>([]);\r\n let [reportDateStart, setReportDateStart] = useState('');\r\n let [isPeriodStartError, setIsPeriodStartError] = useState(false);\r\n let [reportDateEnd, setReportDateEnd] = useState('');\r\n let [isPeriodEndError, setIsPeriodEndError] = useState(false);\r\n let [isLoading, setIsLoading] = useState(false);\r\n let [minDateReport, setMinDateReport] = useState(getPastDateByDaysAgo(360));\r\n\r\n useEffect(()=>{\r\n async function fetchReports(){\r\n setIsLoading(true);\r\n await Promise.all([updateReports()])\r\n setIsLoading(false);\r\n }\r\n \r\n fetchReports();\r\n },[])\r\n\r\n const updateReports = async () => {\r\n setIsLoading(true);\r\n let adhocReport = await getAdhocReports();\r\n if( adhocReport.type === \"succes\"){\r\n setAdhocReports(adhocReport.data.items);\r\n }\r\n setIsLoading(false);\r\n }\r\n\r\n const setStartDatePeriod = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setIsPeriodStartError(false);\r\n setReportDateStart(event.target.value);\r\n }\r\n\r\n const setEndDatePeriod = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setIsPeriodEndError(false); \r\n setReportDateEnd(event.target.value)\r\n }\r\n\r\n const generateReport = async () => {\r\n if(!!!reportDateStart){\r\n setIsPeriodStartError(true);\r\n return\r\n }\r\n\r\n if(!!!reportDateEnd){\r\n setIsPeriodEndError(true);\r\n return\r\n }\r\n\r\n let period = {\r\n startDateTime: reportDateStart,\r\n endDateTime: reportDateEnd\r\n }\r\n\r\n setIsLoading(true);\r\n await generateAdhocReport(period);\r\n\r\n await updateReports()\r\n setIsLoading(false);\r\n } \r\n\r\n const renderStatusAdhoc = (status: ReportAdhocStatus) => {\r\n switch(status){\r\n case ReportAdhocStatus.Generated : return <span className=\"status-active\">Generated</span>;\r\n case ReportAdhocStatus.InProgress : return <span className=\"status-draft\">In progress</span>;\r\n case ReportAdhocStatus.Requested : return <span className=\"status-paused\">Requested</span>;\r\n case ReportAdhocStatus.PartiatlyGenerated : return <span className=\"status-draft\">Partiatly Generated</span>;\r\n } \r\n }\r\n\r\n const renderPeriod = (period: CampaignPeriod) => {\r\n return <p>{formatDate(period.startDate)} - {formatDate(period.endDate)}</p>\r\n } \r\n\r\n const renderAdhocReportRow = (mosaicAdhocReports: MediaReportRow[]) => {\r\n return mosaicAdhocReports.map( (it,i) => {\r\n return <tr key={i}>\r\n <td>{convertUTCDateToLocalDate(it.dateRequested)}</td>\r\n <td>{renderStatusAdhoc(it.status)}</td>\r\n <td>{renderPeriod({startDate: it.startDateTime, endDate: it.endDateTime})}</td>\r\n <td>{it.status !== ReportAdhocStatus.Generated ? \"\" : <a href={`${it.downloadUrl}`} download>Download</a>} </td>\r\n </tr>\r\n })\r\n }\r\n\r\n return (\r\n <InnerLayout \r\n activeTab=\"reports\" \r\n logOut={logOut} \r\n toogleCollapse={toogleCollapse} \r\n isCollapsed={isCollapsed}\r\n >\r\n <>\r\n <div className=\"search-media-report-block\">\r\n <div className=\"form-row\">\r\n <label htmlFor=\"start\">Starts</label>\r\n <input \r\n type=\"date\" \r\n className={`form-control ${isPeriodStartError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"start\" \r\n min={minDateReport}\r\n onChange={setStartDatePeriod}\r\n />\r\n {isPeriodStartError && <span className=\"error\">Please select start period</span>}\r\n </div>\r\n <div className=\"form-row\">\r\n <label htmlFor=\"start\">Ends</label>\r\n <input \r\n type=\"date\" \r\n className={`form-control ${isPeriodEndError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"end\" \r\n onChange={setEndDatePeriod}\r\n min={reportDateStart}\r\n />\r\n {isPeriodEndError && <span className=\"error\">Please select end period</span>}\r\n </div>\r\n <div className=\"\">\r\n <label style={{\"marginBottom\": \"4px\", \"display\": \"block\"}} htmlFor=\"\"> </label>\r\n <Button color=\"green\" label=\"Generate\" onClick={generateReport}/>\r\n </div>\r\n </div>\r\n\r\n <table className=\"table report-table\">\r\n <thead>\r\n <tr>\r\n <td>Date</td>\r\n <td>Status </td>\r\n <td>Period</td>\r\n <td>Download</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderAdhocReportRow(adhocReports)}\r\n </tbody>\r\n </table>\r\n <GlobalSpinner isShow={isLoading} />\r\n </> \r\n </InnerLayout>\r\n )\r\n}\r\n\r\nexport default withRouter(CampaignAndChannelAdhocReport)","import React, { FC, useEffect, useState } from 'react'\r\nimport { CampaignPeriod } from '../../../api/campaingsApi';\r\nimport { generateSkinAdhocReport, getSkinAdhocReports, MediaReportRow, ReportAdhocStatus } from '../../../api/reportsApi';\r\nimport { convertUTCDateToLocalDate, formatDate, getPastDateByDaysAgo } from '../../../services/dateService';\r\nimport { Button } from '../../components/Button';\r\nimport GlobalSpinner from '../../components/globalsSpinner/GlobalSpinner';\r\nimport { RouteComponentProps, withRouter } from 'react-router-dom';\r\nimport InnerLayout from '../innerLayout/InnerLayout';\r\n\r\nexport interface ReportPageProps extends RouteComponentProps<any>\r\n{\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n\r\nconst MosaicAdhocReport:FC<ReportPageProps> = (props) => {\r\n let {logOut, toogleCollapse, isCollapsed} = props;\r\n\r\n let [skinAdhocReports, setSkinAdhocReports] = useState<MediaReportRow[]>([]);\r\n let [reportDateStart, setReportDateStart] = useState('');\r\n let [isPeriodStartError, setIsPeriodStartError] = useState(false);\r\n let [reportDateEnd, setReportDateEnd] = useState('');\r\n let [isPeriodEndError, setIsPeriodEndError] = useState(false);\r\n let [isLoading, setIsLoading] = useState(false);\r\n let [minDateReport, setMinDateReport] = useState(getPastDateByDaysAgo(360));\r\n\r\n useEffect(()=>{\r\n async function fetchReportList(){\r\n setIsLoading(true);\r\n await Promise.all([updateReportList()])\r\n setIsLoading(false);\r\n }\r\n\r\n fetchReportList();\r\n },[])\r\n\r\n async function updateReportList(){\r\n let skinAdhocReport = await getSkinAdhocReports();\r\n if( skinAdhocReport.type === \"succes\"){\r\n setSkinAdhocReports(skinAdhocReport.data.items);\r\n }\r\n }\r\n\r\n const setStartDatePeriod = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setIsPeriodStartError(false);\r\n setReportDateStart(event.target.value);\r\n }\r\n\r\n const setEndDatePeriod = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setIsPeriodEndError(false); \r\n setReportDateEnd(event.target.value)\r\n }\r\n\r\n const generateReport = async () => {\r\n if(!!!reportDateStart){\r\n setIsPeriodStartError(true);\r\n return\r\n }\r\n\r\n if(!!!reportDateEnd){\r\n setIsPeriodEndError(true);\r\n return\r\n }\r\n\r\n let period = {\r\n startDateTime: reportDateStart,\r\n endDateTime: reportDateEnd\r\n }\r\n\r\n setIsLoading(true);\r\n await generateSkinAdhocReport(period);\r\n\r\n let skinAdhocReport = await getSkinAdhocReports();\r\n if( skinAdhocReport.type === \"succes\"){\r\n setSkinAdhocReports(skinAdhocReport.data.items);\r\n }\r\n setIsLoading(false);\r\n } \r\n\r\n const renderStatusAdhoc = (status: ReportAdhocStatus) => {\r\n switch(status){\r\n case ReportAdhocStatus.Generated : return <span className=\"status-active\">Generated</span>;\r\n case ReportAdhocStatus.InProgress : return <span className=\"status-draft\">In progress</span>;\r\n case ReportAdhocStatus.Requested : return <span className=\"status-paused\">Requested</span>;\r\n } \r\n }\r\n\r\n const renderPeriod = (period: CampaignPeriod) => {\r\n return <p>{formatDate(period.startDate)} - {formatDate(period.endDate)}</p>\r\n } \r\n\r\n const renderSkinAdhocReportRow = (mosaicAdhocReports: MediaReportRow[]) => {\r\n return mosaicAdhocReports.map( (it, i) => {\r\n return <tr key={i}>\r\n <td>{convertUTCDateToLocalDate(it.dateRequested)}</td>\r\n <td>{renderStatusAdhoc(it.status)}</td>\r\n <td>{renderPeriod({startDate: it.startDateTime, endDate: it.endDateTime})}</td>\r\n <td>{it.status !== ReportAdhocStatus.Generated ? \"\" : <a href={`${it.downloadUrl}`} download>Download</a>} </td>\r\n </tr>\r\n })\r\n }\r\n\r\n return (\r\n <InnerLayout \r\n activeTab=\"reports\" \r\n logOut={logOut} \r\n toogleCollapse={toogleCollapse} \r\n isCollapsed={isCollapsed}\r\n >\r\n <>\r\n <div className=\"search-media-report-block\">\r\n <div className=\"form-row\">\r\n <label htmlFor=\"start\">Starts</label>\r\n <input \r\n type=\"date\" \r\n className={`form-control ${isPeriodStartError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"start\" \r\n min={minDateReport}\r\n onChange={setStartDatePeriod}\r\n />\r\n {isPeriodStartError && <span className=\"error\">Please select start period</span>}\r\n </div>\r\n <div className=\"form-row\">\r\n <label htmlFor=\"start\">Ends</label>\r\n <input \r\n type=\"date\" \r\n className={`form-control ${isPeriodEndError ? \"error\" : \"\"}`} \r\n name=\"\" \r\n id=\"end\" \r\n onChange={setEndDatePeriod}\r\n min={reportDateStart}\r\n />\r\n {isPeriodEndError && <span className=\"error\">Please select end period</span>}\r\n </div>\r\n <div className=\"\">\r\n <label style={{\"marginBottom\": \"4px\", \"display\": \"block\"}} htmlFor=\"\"> </label>\r\n <Button color=\"green\" label=\"Generate\" onClick={generateReport}/>\r\n </div>\r\n </div>\r\n\r\n <table className=\"table report-table\">\r\n <thead>\r\n <tr>\r\n <td>Date</td>\r\n <td>Status </td>\r\n <td>Period</td>\r\n <td>Download</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderSkinAdhocReportRow(skinAdhocReports)}\r\n </tbody>\r\n </table>\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n </InnerLayout>\r\n )\r\n}\r\n\r\nexport default withRouter(MosaicAdhocReport)","import { FunctionComponent, useCallback, useEffect, useState } from \"react\";\r\nimport { RouteComponentProps, useParams, withRouter } from \"react-router-dom\";\r\nimport Select, { MultiValue } from \"react-select\";\r\nimport AsyncSelect from \"react-select/async\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport { CampaignPeriod, CampaignStatus, getCampaignsBase } from \"../../../api/campaingsApi\";\r\nimport { getBaseChannels, getChannels } from \"../../../api/channelsApi\";\r\nimport { getMosaicList, getMosaicSingle } from \"../../../api/mosaicApi\";\r\nimport { ChannelAndCampaignReportRow, getCampaignAndChannelReport, getCampaignAndChannelReportDownloadLink, getSkinReports, SkinReportRow } from \"../../../api/reportsApi\";\r\nimport { formatDuration, formatDurationLong } from \"../../../services/common\";\r\nimport { currentDateString, formatDate, getPastDateByDaysAgo } from \"../../../services/dateService\";\r\nimport { Button } from \"../../components/Button\";\r\nimport { FormRow } from \"../../components/formRow/FormRow\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport IconButton from \"../../components/iconButton/IconButton\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport Pagination from \"../../components/pagination/Pagination\";\r\nimport { getPagesCount } from \"../../../services/paginator\";\r\n\r\nexport interface ReportPageProps extends RouteComponentProps<any>\r\n{\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n\r\ntype Option<T> = { value: T, label: string} \r\n\r\nconst MosaicCampaignAndChannelReport: FunctionComponent<ReportPageProps> = (props) => {\r\n let {logOut, toogleCollapse, isCollapsed} = props;\r\n\r\n let [ rows, setRows ] = useState<SkinReportRow[]>([]);\r\n let [ rowsToDisplay, setRowsToDisplay ] = useState<SkinReportRow[]>([]);\r\n\r\n let [ skins, setSkins ] = useState<Option<Guid>[]>([]);\r\n let [ sites, setSites ] = useState<Option<Guid>[]>([]);\r\n\r\n let [selectedSkins, setSelectedSkins] = useState<Option<Guid>[]>([]);\r\n let [selectedSites, setSelectedSites] = useState<Guid[]>([]);\r\n\r\n let [selectedStartDate, setSelectedStartDate] = useState<string>(currentDateString());\r\n let [selectedEndDate, setSelectedEndDate] = useState<string>(currentDateString());\r\n\r\n let [isLoading, setIsLoading] = useState<boolean>(false);\r\n let [currentPage, setCurrentPage] = useState<number>(1);\r\n let [minDateReport, setMinDateReport] = useState(getPastDateByDaysAgo(90));\r\n\r\n let { skinId } = useParams<{skinId: Guid}>();\r\n\r\n let itemsPerPage = 25;\r\n\r\n useEffect(() => {\r\n async function fetchData() {\r\n let sitesPromise = getBaseChannels();\r\n let skinPromise = getMosaicList();\r\n \r\n await Promise.all([sitesPromise, skinPromise, updateReportList(skinId)]).then(([sitesResult, skinsResult, reportResult]) => {\r\n if(sitesResult.type === \"succes\") setSites(sitesResult.data.items.map(it => {return {value: it.id, label: it.name}}));\r\n if(skinsResult.type === \"succes\") {\r\n setSkins(skinsResult.data.items.map(it => {return {value: it.id, label: it.name}}));\r\n if(skinId){\r\n setSelectedSkins(skinsResult.data.items.filter(it => it.id === skinId).map(it => {return {value: it.id, label: it.name}}));\r\n }\r\n };\r\n }); \r\n } \r\n\r\n fetchData();\r\n }, [])\r\n\r\n useEffect(() => {\r\n let startIndex = (currentPage - 1)*itemsPerPage;\r\n let finishIndex = startIndex + itemsPerPage;\r\n setRowsToDisplay(rows.slice(startIndex, finishIndex));\r\n }, [rows, currentPage]);\r\n \r\n const updateReportList = async (skinId?: Guid) => {\r\n setIsLoading(true);\r\n let skinsList = skinId ? [skinId] : selectedSkins.map(it => it.value);\r\n var getReportResult = await getSkinReports(skinsList, selectedSites, selectedStartDate, selectedEndDate);\r\n if(getReportResult.type == \"succes\") {\r\n setRows(getReportResult.data.items); \r\n }\r\n setIsLoading(false);\r\n }\r\n\r\n const onSkinsChange = (values: MultiValue<Option<Guid>>) => setSelectedSkins(values.map(it => it)); \r\n const onSitesChange = (values: MultiValue<Option<Guid>>) => setSelectedSites(values.map(it => it.value)); \r\n const onStartDateChanged = (event: React.ChangeEvent<HTMLInputElement>) => setSelectedStartDate(event.target.value);\r\n const onEndDateChanged = (event: React.ChangeEvent<HTMLInputElement>) => setSelectedEndDate(event.target.value); \r\n\r\n const renderReportRow = (rows: SkinReportRow[]) => {\r\n return rows.map( (it, index) => {\r\n return <tr key={index}>\r\n <td>{it.channelName}</td>\r\n <td>{it.mosaicName}</td>\r\n <td>{it.itemName}</td>\r\n <td>{formatDuration(it.durationMs)}</td>\r\n <td>{it.playouts}</td>\r\n </tr>\r\n })\r\n }\r\n \r\n return ( \r\n <InnerLayout \r\n activeTab=\"reports\" \r\n logOut={logOut} \r\n toogleCollapse={toogleCollapse} \r\n isCollapsed={isCollapsed}\r\n >\r\n <>\r\n <div className=\"filter-row\">\r\n <div className=\"filter-group\"> \r\n <FormRow>\r\n <label>Networks</label>\r\n <Select \r\n options={sites} \r\n isMulti\r\n classNamePrefix={`select`}\r\n onChange={onSitesChange}\r\n /> \r\n </FormRow>\r\n <FormRow>\r\n <label>Skins</label> \r\n <Select \r\n options={skins} \r\n isMulti\r\n value={selectedSkins}\r\n classNamePrefix={`select`}\r\n onChange={onSkinsChange}\r\n /> \r\n </FormRow>\r\n </div>\r\n <div className=\"generate-group\">\r\n <FormRow>\r\n <label>Start</label> \r\n <input className=\"form-control\" type=\"date\" onChange={onStartDateChanged} value={selectedStartDate} min={minDateReport} ></input> \r\n </FormRow>\r\n <FormRow>\r\n <label>End</label> \r\n <input className=\"form-control\" type=\"date\" onChange={onEndDateChanged} value={selectedEndDate}></input> \r\n </FormRow> \r\n <div className=\"\">\r\n <label style={{\"marginBottom\": \"4px\", \"display\": \"block\"}} htmlFor=\"\"> </label>\r\n <Button color=\"green\" label=\"Update\" onClick={updateReportList}/>\r\n </div> \r\n {/* <div className=\"export-pos\">\r\n <a href={downloadUrl} target=\"_blank\"> <IconButton tooltipText=\"\" type=\"export\" /> </a>\r\n </div> */}\r\n \r\n </div> \r\n </div>\r\n {\r\n rows.length === 0 ? <h2>No items</h2> : <>\r\n <table className=\"table report-table\">\r\n <thead>\r\n <tr>\r\n <td>Network</td>\r\n <td>Skin </td>\r\n <td>Item</td>\r\n <td>Duration</td>\r\n <td>Playouts</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderReportRow(rowsToDisplay)}\r\n </tbody>\r\n </table>\r\n <Pagination activePage={currentPage} pagesCount={getPagesCount(rows.length, itemsPerPage)} changePaginationPage={setCurrentPage} />\r\n </>\r\n }\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n </InnerLayout>\r\n );\r\n}\r\n \r\nexport default withRouter(MosaicCampaignAndChannelReport);","import { FunctionComponent, useEffect, useState } from \"react\";\r\nimport { RouteComponentProps, withRouter } from \"react-router-dom\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport { CenterModal, RightModal } from \"../../components/sideModal/Modal\";\r\nimport { PlayerWithScreenshots, getPlayers, getPlayersScreenshots } from \"../../../api/playersApi\";\r\nimport \"./PlayersMonitoring.css\";\r\nimport Select, { MultiValue } from \"react-select\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport { formatDate, formatTime } from \"../../../services/dateService\";\r\nimport { Button } from \"../../components/Button\";\r\nimport { Routes, createPathWithId } from \"../../../constants/routes\";\r\nimport { ReactSortable } from \"react-sortablejs\";\r\nimport { FormInput, FormRow } from \"../../components/formRow/FormRow\";\r\nimport IconButton from \"../../components/iconButton/IconButton\";\r\n\r\ninterface PlayersMonitoringProps extends RouteComponentProps<any>{\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n\r\ntype Option<T> = { value: T, label: string}\r\ntype MonitoringGroup = {\r\n id: string,\r\n groupTitle: \"Default\" | string,\r\n playerIds: string[]\r\n}\r\n\r\ntype ModalAction = \"create\" | \"update\" | \"nothing\";\r\ninterface CheckedItems {\r\n [key: string]: boolean;\r\n}\r\n\r\nconst PlayersMonitoring: FunctionComponent<PlayersMonitoringProps> = (props : PlayersMonitoringProps) => {\r\n let {history} = props;\r\n\r\n let [isLoading, setIsLoading] = useState(false);\r\n let [currentScreenShot, setCurrentScreenShot] = useState('');\r\n let [showScreenModal, setShowScreenModal] = useState(false);\r\n let [players, setPlayers] = useState<Option<Guid>[]>([]);\r\n let [selectedPlayers, setSelectedPlayers] = useState<Guid[]>([]);\r\n let [playersWithScreenshots, setPlayersWithScreenshot] = useState<PlayerWithScreenshots[]>([]);\r\n let [lastUpdate, setLastUpdate] = useState(\"\");\r\n\r\n let [isShowGroupModal, setIsShowGroupModal] = useState(false)\r\n let [groupName, setGroupName] = useState(\"\");\r\n let [isGroupNameError, setIsGroupNameError] = useState(false);\r\n let [groupNameErrorMessage, setGroupNameErrorMessage] = useState(\"\");\r\n let [monitoringGroupAction, setMonitoringGroupAction] = useState<ModalAction>(\"nothing\");\r\n let [groupIdForAction, setGroupIdForAction] = useState(\"\")\r\n\r\n let [monitoringGroups, setMonitoringGroups] = useState<MonitoringGroup[]>([])\r\n let [checkedItems, setCheckedItems] = useState<CheckedItems>({})\r\n let [isListCollapsed, setIsListCollapsed] = useState(false)\r\n\r\n useEffect(()=>{\r\n async function fetchData() {\r\n setIsLoading(true);\r\n await updatePlayersList();\r\n setSelectedPlayers(getPlayerIdsFromLocaleStorage())\r\n setMonitoringGroups(getMonitoringState())\r\n\r\n const initialCheckedItems: CheckedItems = {};\r\n getMonitoringState().forEach(item => {\r\n initialCheckedItems[item.id] = true;\r\n });\r\n setCheckedItems(initialCheckedItems);\r\n\r\n setIsLoading(false);\r\n };\r\n \r\n \r\n fetchData()\r\n let refetchInterval = setInterval(async () => {\r\n await updatePlayersScreenshots();\r\n }, 300000)\r\n\r\n return () => {\r\n clearInterval(refetchInterval)\r\n }\r\n },[])\r\n\r\n useEffect(()=>{\r\n async function fetchData() {\r\n await updatePlayersScreenshots();\r\n };\r\n fetchData()\r\n },[selectedPlayers])\r\n\r\n useEffect(() => {\r\n const allChecked = Object.values(checkedItems).every((checked) => checked);\r\n if(allChecked) setIsListCollapsed(false)\r\n else setIsListCollapsed(true)\r\n },[checkedItems])\r\n\r\n const saveCurrentMonitoringState = (data: MonitoringGroup[]) => {\r\n setMonitoringGroups(data)\r\n localStorage.setItem('monitoring', JSON.stringify(data))\r\n }\r\n\r\n const updatePlayersList = async () => {\r\n let result = await getPlayers();\r\n setPlayers(result.players.map(player => {\r\n return {\r\n label: player.name ? player.name : '',\r\n value: player.id\r\n }\r\n }));\r\n refreshUpdateTime()\r\n }\r\n\r\n function getMonitoringState () {\r\n const monitoring = localStorage.getItem('monitoring')\r\n\r\n if (!monitoring) {\r\n localStorage.setItem('monitoring', JSON.stringify([{id: '44', groupTitle:\"Default\", playerIds:[]}]))\r\n return [{id: '44', groupTitle:\"Default\", playerIds:[]}]\r\n }\r\n\r\n const monitoringArr:MonitoringGroup[] = JSON.parse(monitoring)\r\n\r\n return monitoringArr\r\n }\r\n\r\n function addPlayerIdsToGroup(groupTitle: string, newPlayerIds: Guid[], withReplace:boolean = false) {\r\n const groupIndex = monitoringGroups.findIndex(group => group.groupTitle === groupTitle);\r\n\r\n if (groupIndex !== -1) {\r\n const updatedMonitoringGroups = [...monitoringGroups];\r\n \r\n const existingPlayerIds = updatedMonitoringGroups[groupIndex].playerIds;\r\n const uniqueNewPlayerIds = newPlayerIds.filter(id => !existingPlayerIds.includes(id));\r\n const idsForInsert = withReplace ? [...newPlayerIds] : [...existingPlayerIds, ...uniqueNewPlayerIds]\r\n updatedMonitoringGroups[groupIndex] = {\r\n ...updatedMonitoringGroups[groupIndex],\r\n playerIds: idsForInsert\r\n };\r\n \r\n saveCurrentMonitoringState(updatedMonitoringGroups)\r\n }\r\n }\r\n\r\n const removePlayerIdFromGroups = (playerId:Guid) => {\r\n const updatedMonitoringGroups = monitoringGroups.map(group => {\r\n return {\r\n ...group,\r\n playerIds: group.playerIds.filter(id => id !== playerId)\r\n };\r\n });\r\n \r\n saveCurrentMonitoringState(updatedMonitoringGroups)\r\n }\r\n\r\n const getPlayerIdsFromLocaleStorage = () => {\r\n let ids = getMonitoringState().flatMap(item => item.playerIds);\r\n return ids\r\n }\r\n\r\n const refreshUpdateTime = () => {\r\n setLastUpdate(formatTime(new Date().toISOString()))\r\n }\r\n\r\n const updatePlayersScreenshots = async () => {\r\n const result = await getPlayersScreenshots({ playerIds: getPlayerIdsFromLocaleStorage() });\r\n if (result.type === \"succes\") {\r\n setPlayersWithScreenshot(result.data.data.players);\r\n refreshUpdateTime()\r\n }\r\n }\r\n\r\n const forceUpdatePlayersScreenshots = async () => {\r\n setIsLoading(true);\r\n await updatePlayersScreenshots();\r\n refreshUpdateTime();\r\n setIsLoading(false);\r\n }\r\n\r\n const showScreenInModal = (screenShotUrl: string) => {\r\n setShowScreenModal(true);\r\n setCurrentScreenShot(screenShotUrl);\r\n }\r\n\r\n const hideScreenModal = () =>{\r\n setShowScreenModal(false);\r\n setCurrentScreenShot('');\r\n }\r\n\r\n const onChangeSelectedPlayers = (values: MultiValue<Option<Guid>>) => {\r\n let ids = values.map(it => it.value);\r\n setSelectedPlayers([...ids]);\r\n ids = findNonIntersectingElements(selectedPlayers, ids)\r\n addPlayerIdsToGroup(\"Default\", ids)\r\n }\r\n\r\n function findNonIntersectingElements(selectedIds: Guid[], newIds: Guid[]) {\r\n const result: Guid[] = [];\r\n \r\n for (const id of newIds) {\r\n if (!selectedIds.includes(id)) {\r\n result.push(id);\r\n }\r\n }\r\n \r\n return result;\r\n }\r\n\r\n const goToPlayerConfiguration = (playerId: string) => {\r\n const data = {startConfigure: true}\r\n history.push(createPathWithId(Routes.Players, playerId), data)\r\n }\r\n\r\n const goToStream = (listId: Guid | null, streamId: Guid | null) => {\r\n const data = streamId\r\n if(listId && streamId){\r\n history.push(createPathWithId(Routes.PriorityList, listId), data)\r\n }\r\n }\r\n\r\n const renderPlayerRow = (items: PlayerWithScreenshots[]) => {\r\n return items.map( (it) => {\r\n return <div className=\"player-screenshots__elem\" key={it.id} >\r\n <div className=\"player-screenshots__name\">\r\n <span className=\"player-screenshots__name-txt\" onClick={()=>{goToPlayerConfiguration(it.id)}}>{it.playerName} </span>\r\n <span className=\"player-screenshots__close\" onClick={()=>{removeSelectedPlayerByClick(it.id)}}>x</span>\r\n </div>\r\n <div className=\"player-screenshots__area\">\r\n {it.screenshots.map( (s,i) => {\r\n return <div className=\"player-screenshots__block\" key={i}>\r\n <img className=\"player-screenshots__img\" src={s.previewUrl} alt=\"\" onClick={()=>showScreenInModal(s.screenshotUrl)} />\r\n <p className=\"\">{formatDate(s.dateTime)} {formatTime(s.dateTime)}</p>\r\n <p className=\"player-screenshots__info\" onClick={()=>{goToStream(s.priorityListId,s.streamId)}}>{s.siteInfo}</p>\r\n {s.isOffline && <div className=\"offline-layer\"></div>}\r\n </div>\r\n })}\r\n </div>\r\n </div>\r\n })\r\n }\r\n\r\n const removeMonitoringGroup = (id:Guid) => {\r\n const groupIndex = monitoringGroups.findIndex(group => group.id === id);\r\n let updatedMonitoringGroups = [...monitoringGroups]\r\n if(groupIndex !== -1) {\r\n let ids = selectedPlayers.filter( el => {\r\n return !updatedMonitoringGroups[groupIndex].playerIds.includes(el)\r\n })\r\n setSelectedPlayers(ids)\r\n updatedMonitoringGroups.splice(groupIndex,1)\r\n saveCurrentMonitoringState(updatedMonitoringGroups)\r\n }\r\n }\r\n\r\n const renderPlayerGroupRow = (items: MonitoringGroup[]) => {\r\n return items.map( (el, index) => {\r\n let screenshotsToRender = el.playerIds.map( plI => {\r\n let index = playersWithScreenshots.findIndex( p => p.id === plI)\r\n return playersWithScreenshots[index] \r\n }).filter(item => !!item)\r\n\r\n\r\n return <div className=\"player-screenshots__group\" key={el.id}>\r\n <h3 className=\"player-screenshots__group-title\">\r\n {el.groupTitle}\r\n {el.groupTitle !== \"Default\" && <IconButton tooltipText=\"Edit\" type=\"edit\" onClick={() => {showGroupModal(\"update\",el)}}/>}\r\n {el.groupTitle !== \"Default\" && <IconButton tooltipText=\"Delete\" type=\"delete\" onClick={() => {removeMonitoringGroup(el.id)}}/>}\r\n <div className=\"d-inline-flex justify-content-end player-screenshots__expand-block\">\r\n <label htmlFor={`group-${index}`} className=\"checkbox-control\">\r\n <input \r\n id={`group-${index}`} \r\n className=\"checkbox\" \r\n type=\"checkbox\" \r\n checked={!!checkedItems[el.id]}\r\n onChange={() => handleCheckboxChange(el.id)}\r\n />\r\n <span className=\"checkbox-bg\"></span>\r\n <span className=\"checkbox-cursor\"></span>\r\n </label>\r\n <span className=\"current-status\"> Expand</span>\r\n </div>\r\n </h3>\r\n\r\n {playersWithScreenshots.length !== 0 && <ReactSortable \r\n list={screenshotsToRender}\r\n setList={(newState) => {\r\n let newIds = newState.map( i => i.id )\r\n if(newIds.length > 0){\r\n addPlayerIdsToGroup(el.groupTitle, newIds, true)\r\n } else {\r\n addPlayerIdsToGroup(el.groupTitle, newIds, true)\r\n }\r\n }}\r\n group={\"test\"}\r\n tag=\"div\"\r\n className=\"player-screenshots__row\"\r\n animation={150}\r\n fallbackOnBody={true}\r\n swapThreshold={0.65}\r\n >\r\n {screenshotsToRender.length ? renderPlayerRow(screenshotsToRender) : <p className=\"no\">Please select player</p>}\r\n </ReactSortable>}\r\n </div>\r\n })\r\n }\r\n\r\n const removeSelectedPlayerByClick = (playerId: string) => {\r\n let newIds = selectedPlayers.filter(el => el !== playerId)\r\n setSelectedPlayers(newIds)\r\n removePlayerIdFromGroups(playerId)\r\n }\r\n\r\n const showGroupModal = (action: ModalAction, group?: MonitoringGroup) => {\r\n \r\n if(group){\r\n setGroupName(group.groupTitle)\r\n setGroupIdForAction(group.id)\r\n }\r\n setMonitoringGroupAction(action)\r\n setIsShowGroupModal(true)\r\n }\r\n\r\n const hideGroupModal = () => {\r\n setIsGroupNameError(false)\r\n setGroupName(\"\")\r\n setGroupIdForAction(\"\")\r\n setMonitoringGroupAction(\"nothing\")\r\n setIsShowGroupModal(false)\r\n }\r\n\r\n const createNewMonitoringGroup = async () => {\r\n if(groupName === \"\") {\r\n setIsGroupNameError(true);\r\n setGroupNameErrorMessage(\"Please enter Group Name\")\r\n return;\r\n }\r\n \r\n let groupIndex = monitoringGroups.findIndex(g => g.groupTitle === groupName)\r\n\r\n if(groupIndex !== -1){\r\n setIsGroupNameError(true);\r\n setGroupNameErrorMessage(\"This Group is already exists\")\r\n return;\r\n }\r\n \r\n if(monitoringGroupAction === \"create\"){\r\n\r\n let newGroup: MonitoringGroup = {\r\n id: new Date().toString(),\r\n groupTitle:groupName,\r\n playerIds: []\r\n };\r\n \r\n let newGroupState = [...monitoringGroups, newGroup]\r\n saveCurrentMonitoringState(newGroupState)\r\n }\r\n\r\n if(monitoringGroupAction === \"update\"){\r\n let groupIndex = monitoringGroups.findIndex( g => g.id === groupIdForAction)\r\n monitoringGroups[groupIndex].groupTitle = groupName\r\n saveCurrentMonitoringState(monitoringGroups)\r\n }\r\n\r\n hideGroupModal()\r\n }\r\n\r\n const handleCheckboxChange = (id: string) => {\r\n setCheckedItems((prev) => ({\r\n ...prev,\r\n [id]: !prev[id],\r\n }));\r\n };\r\n\r\n const toggleAllCheckboxes = () => {\r\n const allChecked = Object.values(checkedItems).every((checked) => checked);\r\n const newCheckedItems: CheckedItems = monitoringGroups.reduce((acc, item) => {\r\n acc[item.id] = !allChecked;\r\n return acc;\r\n }, {} as CheckedItems);\r\n setCheckedItems(newCheckedItems);\r\n setIsListCollapsed( prev => !prev)\r\n };\r\n \r\n return ( \r\n <InnerLayout \r\n isCollapsed={props.isCollapsed}\r\n logOut={props.logOut}\r\n toogleCollapse={props.toogleCollapse}\r\n activeTab=\"monitoring\">\r\n <>\r\n <div className=\"d-flex justify-content-between align-items-center mb-40 pt-50 gap15\" >\r\n <h2 style={{\"marginBottom\":0}}>Player Monitor Dashboard</h2>\r\n\r\n <div className=\"d-flex justify-content-start align-items-center gap15\" style={{\"width\":\"50%\"}}>\r\n <div style={{\"width\":\"50%\"}}>\r\n <Select \r\n options={players}\r\n className=\"custom-height-select\"\r\n isMulti\r\n value={players.filter(p => selectedPlayers.includes(p.value))}\r\n classNamePrefix={`select`}\r\n onChange={onChangeSelectedPlayers} \r\n /> \r\n </div>\r\n <div className=\"d-flex align-items-center gap15\">\r\n <span style={{\"fontSize\":\"12px\", \"opacity\":\"0.5\"}}>Last update: {lastUpdate}</span>\r\n <Button color=\"green\" label=\"Update Screenshots\" onClick={forceUpdatePlayersScreenshots} />\r\n </div>\r\n </div>\r\n\r\n <div className=\"d-flex justify-content-end align-items-center\">\r\n <Button color=\"green\" label=\"Add Group\" onClick={() => {showGroupModal(\"create\")}} />\r\n </div>\r\n </div>\r\n\r\n <div className=\"d-flex align-items-center mb-20\">\r\n <Button color=\"green\" label={`${isListCollapsed ? \"Full List\" : \"Compact View\"}`} onClick={toggleAllCheckboxes} />\r\n </div>\r\n\r\n {monitoringGroups.length > 0 && <ReactSortable \r\n list={monitoringGroups}\r\n setList={(newState) => {\r\n saveCurrentMonitoringState(newState)\r\n }}\r\n tag={\"div\"}\r\n className=\"player-screenshots\"\r\n >\r\n {renderPlayerGroupRow(monitoringGroups)}\r\n </ReactSortable>}\r\n \r\n <CenterModal title=\"Player Screenshot\" show={showScreenModal} onRequestClose={hideScreenModal}>\r\n {currentScreenShot && <div className=\"screen\">\r\n <img className=\"screen-img in-modal\" src={currentScreenShot} alt=\"\" />\r\n </div>}\r\n </CenterModal>\r\n\r\n <RightModal title={`${monitoringGroupAction === \"update\" ? \"Edit\" : \"Add\"} Group`} show={isShowGroupModal} onRequestClose={hideGroupModal}>\r\n <FormRow> \r\n <FormInput \r\n errorMessage = {groupNameErrorMessage}\r\n id = \"media_group_name\"\r\n isError = {isGroupNameError}\r\n title = \"Group Name\"\r\n onChangeValue = {(v) => {setGroupName(v); setIsGroupNameError(false)}}\r\n value = {groupName}\r\n />\r\n </FormRow>\r\n <div className=\"modal-btn-group\">\r\n <Button color=\"green\" label={`${monitoringGroupAction === \"update\" ? \"Save\" : \"Add\"}`} onClick={createNewMonitoringGroup}/>\r\n <Button color=\"gray\" label=\"Cancel\" onClick={hideGroupModal}/>\r\n </div>\r\n </RightModal> \r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n \r\n </InnerLayout> );\r\n}\r\n\r\nexport default withRouter(PlayersMonitoring)","export default __webpack_public_path__ + \"static/media/tv-guide.a7c5d784.jpg\";","import { FunctionComponent, useEffect, useState } from \"react\";\r\nimport { RouteComponentProps, withRouter } from \"react-router-dom\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport \"./TvGuide.css\";\r\nimport Select, { SingleValue } from \"react-select\";\r\nimport { Guid, baseUrl } from \"../../../api/baseApi\";\r\nimport { getBaseChannels } from \"../../../api/channelsApi\";\r\nimport { formatDate, getPastDateByDaysAgo } from \"../../../services/dateService\";\r\nimport { PlayerModel, PlayerTvGuideRow, TvGuideCell, getPlayerTvGuide, getPlayers } from \"../../../api/playersApi\";\r\nimport tvGuidebanner from '../../images/tv-guide.jpg'\r\nimport { getToken } from \"../../../api/authApi\";\r\n\r\n\r\ninterface TvGuideProps extends RouteComponentProps<any>{\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n\r\ntype Option<T> = { value: T, label: string}\r\n\r\nconst TvGuide: FunctionComponent<TvGuideProps> = (props : TvGuideProps) => {\r\n let [isLoading, setIsloading] = useState(false);\r\n let [channels, setChannels ] = useState<Option<Guid>[]>([]);\r\n let [selectedChannel, setSelectedChannel] = useState<Guid>('');\r\n let [selectedStartDate, setSelectedStartDate] = useState<string>(getPastDateByDaysAgo(0));\r\n let [selectedEndDate, setSelectedEndDate] = useState<string>(getPastDateByDaysAgo(-7));\r\n\r\n let [players, setPlayers ] = useState<PlayerModel[]>([]);\r\n let [filteredPlayers, setFilteredPlayers ] = useState<Option<Guid>[]>([]);\r\n let [selectedPlayer, setSelectedPlayer] = useState<Guid>('');\r\n\r\n let [tvGuide, setTvGuide] = useState<PlayerTvGuideRow[]>([]);\r\n let [downloadUrl, setDownloadUrl] = useState('')\r\n\r\n useEffect(()=>{\r\n async function fetchData() {\r\n setIsloading(true);\r\n await Promise.all([updateChannelsList(),updatePlayersList()])\r\n setIsloading(false);\r\n };\r\n \r\n fetchData()\r\n },[])\r\n\r\n useEffect(()=>{\r\n if(selectedChannel){\r\n filterPlayersByChannelId(players, selectedChannel)\r\n } else {\r\n setSelectedPlayer('')\r\n }\r\n },[selectedChannel])\r\n\r\n useEffect(()=>{\r\n async function fetchData() {\r\n setIsloading(true);\r\n await updateTvGuide();\r\n setIsloading(false);\r\n };\r\n \r\n if(selectedPlayer && selectedStartDate && selectedEndDate){\r\n fetchData()\r\n } else {\r\n setTvGuide([])\r\n }\r\n },[selectedPlayer,selectedStartDate,selectedEndDate])\r\n\r\n const updateChannelsList = async () => {\r\n let result = await getBaseChannels();\r\n if(result.type === \"succes\"){\r\n setChannels(result.data.items.map(it => {return {value: it.id, label: it.name}}));\r\n }\r\n }\r\n\r\n const updatePlayersList = async () => {\r\n const res = await getPlayers();\r\n setPlayers(res.players)\r\n }\r\n\r\n const updateTvGuide = async () => {\r\n let result = await getPlayerTvGuide(selectedPlayer, selectedStartDate, selectedEndDate);\r\n if(result.type === \"succes\"){\r\n setTvGuide(result.data.data.dates)\r\n }\r\n }\r\n\r\n\r\n const filterPlayersByChannelId = (players: PlayerModel[], channelId: Guid) => {\r\n const filteredPlayers = players.filter( it => it.channel?.id === channelId)\r\n setFilteredPlayers(filteredPlayers.map(it => {return {value: it.id, label: it.name}}));\r\n }\r\n\r\n const onChangeSelectedChannel = (value: SingleValue<Option<Guid>>) => {\r\n if(value){\r\n setSelectedChannel(value.value);\r\n } else {\r\n setSelectedChannel('');\r\n }\r\n }\r\n\r\n const onChangeSelectedPlayer = (value: SingleValue<Option<Guid>>) => {\r\n if(value){\r\n setSelectedPlayer(value.value);\r\n } else {\r\n setSelectedPlayer('');\r\n }\r\n }\r\n\r\n const onStartDateChanged = (event: React.ChangeEvent<HTMLInputElement>) => setSelectedStartDate(event.target.value);\r\n const onEndDateChanged = (event: React.ChangeEvent<HTMLInputElement>) => setSelectedEndDate(event.target.value); \r\n\r\n const convertTimeToMinutes = (time:string) => {\r\n const [hours, minutes, seconds] = time.split(':').map(Number);\r\n return hours * 60 + minutes + seconds / 60;\r\n };\r\n\r\n const calculateEventTime = (startTime:string, endTime:string, intervalMinutes:number) => {\r\n const startMinutes = convertTimeToMinutes(startTime);\r\n const endMinutes = convertTimeToMinutes(endTime);\r\n \r\n const startOffset = startMinutes % intervalMinutes;\r\n\r\n const offsetPercentage = (startOffset / intervalMinutes * 100).toFixed(2);\r\n \r\n const startInterval = Math.floor(startMinutes / intervalMinutes) + 1;\r\n\r\n const eventDurationPercentage = ((endMinutes - startMinutes) / intervalMinutes * 100).toFixed(2)\r\n\r\n return {\r\n startInterval,\r\n offsetPercentage,\r\n eventDurationPercentage\r\n };\r\n }\r\n\r\n const renderTvGuide = (tvGuideRows: PlayerTvGuideRow[]) => {\r\n return tvGuideRows.map( it => {\r\n return <div key={`${it.date}-date`} className=\"tv-guide-program\">\r\n <div className=\"program-date\">{formatDate(it.date)}</div>\r\n {renderTvGuideCells(it.spans)}\r\n </div>\r\n })\r\n }\r\n\r\n const renderTvGuideCells = (cells: TvGuideCell[]) => {\r\n return cells.map( it => {\r\n let {startInterval, offsetPercentage, eventDurationPercentage} = calculateEventTime(it.start, it.end, 30)\r\n return <div key={it.start+it.end} className=\"tv-guide-cell\" style={{\r\n ['--column-start']:`${startInterval + 1}`,\r\n ['--left']:`${offsetPercentage}%`,\r\n ['--width']:`${eventDurationPercentage}%`,\r\n }as React.CSSProperties}>\r\n <div className=\"program-info\">\r\n <p className=\"program-title\">{it.title}</p>\r\n <p className=\"program-time\">{it.start.slice(0, -3)} - {it.end.slice(0, -3)}</p>\r\n </div>\r\n </div>\r\n })\r\n }\r\n\r\n const renderTimeline = (withPseudoLines: boolean = false) => {\r\n const timelineElements = [];\r\n\r\n if(!withPseudoLines){\r\n for(let i = 0; i < 24; i++){\r\n timelineElements.push(\r\n <>\r\n <div key={`hour-${i}`} className=\"timeline-slot\">{i.toString().padStart(2, '0')}:00</div>\r\n <div key={`half-hour-${i}`} className=\"timeline-slot\">{i.toString().padStart(2, '0')}:30</div>\r\n </>\r\n );\r\n }\r\n \r\n return timelineElements;\r\n } else {\r\n for(let i = 0; i < 24; i++){\r\n timelineElements.push(\r\n <>\r\n <div key={`hourP-${i}`} className=\"timeline-pseudo-slot\"></div>\r\n <div key={`half-hourP-${i}`} className=\"timeline-pseudo-slot\"></div>\r\n </>\r\n );\r\n }\r\n \r\n return timelineElements;\r\n }\r\n }\r\n\r\n \r\n return ( \r\n <InnerLayout \r\n isCollapsed={props.isCollapsed}\r\n logOut={props.logOut}\r\n toogleCollapse={props.toogleCollapse}\r\n activeTab=\"tvGuide\">\r\n <>\r\n\r\n <div className=\"timeline-settings mb-30\">\r\n <div className=\"tv-guide-banner-block\">\r\n <img src={tvGuidebanner} alt=\"\" className=\"tv-guide-banner\" />\r\n </div>\r\n <div className=\"timeline-settings-elem transformY5\">\r\n <label>Networks</label>\r\n <Select \r\n options={channels}\r\n classNamePrefix={`select`}\r\n onChange={onChangeSelectedChannel} \r\n isClearable={true}\r\n />\r\n </div>\r\n <div className=\"timeline-settings-elem transformY5\">\r\n {selectedChannel && <>\r\n <label>Players</label>\r\n <Select \r\n options={filteredPlayers}\r\n classNamePrefix={`select`}\r\n onChange={onChangeSelectedPlayer} \r\n isClearable={true}\r\n />\r\n </>}\r\n </div>\r\n <div className=\"timeline-settings-elem\">\r\n <label>Start</label> \r\n <input className=\"form-control\" type=\"date\" onChange={onStartDateChanged} value={selectedStartDate} ></input>\r\n </div>\r\n <div className=\"timeline-settings-elem\">\r\n <label>End</label> \r\n <input className=\"form-control\" type=\"date\" onChange={onEndDateChanged} value={selectedEndDate}></input>\r\n </div>\r\n </div>\r\n\r\n { tvGuide.length ? <>\r\n <div className=\"tv-guide-wrapper\">\r\n <div className=\"tv-guide-block\">\r\n <div className=\"timeline\">\r\n <div className=\"\"></div>\r\n {renderTimeline()}\r\n </div>\r\n <div className=\"timeline-pseudo\">\r\n <div className=\"timeline-pseudo-slot\"></div>\r\n {renderTimeline(true)}\r\n </div>\r\n {renderTvGuide(tvGuide)}\r\n </div>\r\n </div></> : <p>Please select Network, Player and Dates</p>}\r\n\r\n <div className=\"tv-guide-text-block\">\r\n <p>© Copyright C-Screens 2024 | <a target=\"_blank\" href=\"https://c-screens.com/\">www.c-screens.com</a> | <a href=\"mailto:prize@c-screens.com\">prize@c-screens.com</a> </p>\r\n <p>TV Guide Viewing Disclaimer</p>\r\n\r\n <ol>\r\n <li>The TV guide provided is subject to change without prior notice.</li>\r\n <li>Adverse weather conditions may have a significant affect on the scheduling and broadcasting of summer sporting events.</li>\r\n <li>Changes may occur at the discretion of the landowner and CScreens LTD.</li>\r\n <li>We strive to provide accurate and up-to-date information but cannot guarantee the timeliness or accuracy of the content.</li>\r\n <li>Users are encouraged to verify scheduling information with the respective TV channels.</li>\r\n <li>By using this TV guide, users agree to acknowledge and accept the possibility of changes.</li>\r\n </ol>\r\n </div>\r\n\r\n {tvGuide.length ? <div className=\"d-flex justify-content-end mb-20\">\r\n <a href={`${baseUrl}pdf/tv-guided-look?playerId=${selectedPlayer}&startTime=${selectedStartDate}&endTime=${selectedEndDate}&token=${getToken()}`} download>Download PDF</a>\r\n </div> : <></>}\r\n <GlobalSpinner isShow={isLoading} />\r\n </>\r\n \r\n </InnerLayout> );\r\n}\r\n\r\nexport default withRouter(TvGuide)","import { FC, useEffect, useState } from \"react\"\r\nimport { getHistoricView, HistoricMedia, HistoricView } from \"../../../api/channelsApi\";\r\nimport { Guid } from \"../../../api/baseApi\";\r\nimport { getTags } from \"../../../api/tagApi\";\r\nimport { useParams } from \"react-router-dom\";\r\nimport { getPastDateByDaysAgo } from \"../../../services/dateService\";\r\nimport { FormInput, FormRow } from \"../formRow/FormRow\";\r\nimport FormCheckbox from \"../formRow/FormCheckbox\";\r\nimport { Button } from \"../Button\";\r\nimport Select, { MultiValue } from \"react-select\";\r\nimport { addLeadingZero, formatDuration, formatToPercent } from \"../../../services/common\";\r\nimport { MediaType } from \"../../../api/mediaApi\";\r\nimport SvgSelector from \"../svgSelector/SvgSelector\";\r\n\r\ninterface ChannelPlaylistParams{\r\n channelId: Guid,\r\n nestedPlayListsId: Guid\r\n}\r\n\r\ntype Option<T> = { value: T, label: string}\r\n\r\nconst HistoricViewBlock:FC = () => {\r\n let [selectedDate, setSelectedDate] = useState<string>(`${getPastDateByDaysAgo(0)}T00:00`)\r\n let [historicView, setHistoricView] = useState<HistoricView>()\r\n let [tags,setTags] = useState<Option<Guid>[]>([]);\r\n let [selectedTagIds, setSelectedTagIds] = useState<Guid[]>([]);\r\n\r\n let [isLiveToggle, setIsLiveToggle] = useState(false);\r\n\r\n let { channelId, nestedPlayListsId } = useParams<ChannelPlaylistParams>();\r\n\r\n useEffect(()=>{\r\n async function fetchData(){\r\n await Promise.all([updateTags()])\r\n }\r\n\r\n fetchData()\r\n },[])\r\n\r\n const updateHistoricView = async () => {\r\n let request = {\r\n dateTimeString: selectedDate,\r\n isLive: isLiveToggle,\r\n tagIds: selectedTagIds\r\n }\r\n\r\n let response = await getHistoricView(channelId, nestedPlayListsId, request);\r\n if( response.type === \"succes\") {\r\n setHistoricView(response.data.data)\r\n }\r\n }\r\n\r\n const updateTags = async () => {\r\n let tagResponse = await getTags();\r\n if(tagResponse.type == \"succes\") {\r\n setTags([\r\n {\r\n label: \"No Tags\",\r\n value: \"00000000-0000-0000-0000-000000000000\"\r\n },\r\n ...tagResponse.data.items.map( t => { return {label:t.name, value:t.id}})\r\n ])\r\n }\r\n }\r\n\r\n const onDateChanged = (date: string) => {\r\n setSelectedDate(date);\r\n }\r\n\r\n const onSelectedTag = async (newValue: MultiValue<Option<Guid>>) => {\r\n if(newValue){\r\n let newTagIds = newValue.map(el => el.value)\r\n setSelectedTagIds(newTagIds)\r\n } else {\r\n setSelectedTagIds([])\r\n }\r\n }\r\n\r\n const renderMediaTypePreview = (media: HistoricMedia) => {\r\n switch(media.mediaType){\r\n case MediaType.Image : return <img className=\"\" src={media.url} alt=\"\" />;\r\n case MediaType.Video : return <img className=\"\" src={media.url} alt=\"\" />;\r\n case MediaType.VastUrl : return <SvgSelector title=\"url\" />;\r\n case MediaType.Youtube : return <img className=\"\" src={media.url} alt=\"\" />;\r\n case MediaType.YoutubeLive : return <img className=\"\" src={media.url} alt=\"\" />;\r\n case MediaType.WebPage : return <SvgSelector title=\"webview\" />;\r\n }\r\n }\r\n\r\n const renderHistoricMedia = (media: HistoricMedia[]) => {\r\n return media.map( (m, i) => {\r\n return <tr key={i}>\r\n <td>{addLeadingZero(++i, 2)}</td>\r\n <td>{renderMediaTypePreview(m)}</td>\r\n <td><p style={{overflowWrap:\"anywhere\", width:150}}>{m.name}</p></td>\r\n <td>{formatDuration(m.durationMs)}</td>\r\n </tr>\r\n })\r\n }\r\n\r\n const renderHistoricView = (data: HistoricView) => {\r\n const [date, time] = data.forDateTime.split(\"T\")\r\n return <div className=\"w-100\">\r\n <h3>{date} / {time.split(\".\")[0]} {data.isHistorian ? <span>Historical</span> : null}</h3>\r\n\r\n <div className=\"media-live-statistic col-2\">\r\n <div className=\"media-live-statistic__row\">\r\n <div className=\"\"></div>\r\n <div className=\"\"></div>\r\n </div>\r\n <div className=\"media-live-statistic__row\">\r\n <div className=\"\"><b>Campaigns</b></div>\r\n <div className=\"\">{formatDuration(data.statistic.campaignsDurationMs)} ({formatToPercent(data.statistic.campaignsPercentage)})</div>\r\n </div>\r\n <div className=\"media-live-statistic__row\">\r\n <div className=\"\"><b>Network Content</b></div>\r\n <div className=\"\">{formatDuration(data.statistic.siteContentDurationMs)} ({formatToPercent(data.statistic.siteContentPercentage)})</div>\r\n </div>\r\n <div className=\"media-live-statistic__row\">\r\n <div className=\"\"><b>Inhouse Content</b></div>\r\n <div className=\"\">{formatDuration(data.statistic.inhouseContentDurationMs)} ({formatToPercent(data.statistic.inhouseContentPercentage)})</div>\r\n </div>\r\n <div className=\"media-live-statistic__row\">\r\n <div className=\"\"><b>Others</b></div>\r\n <div className=\"\">{formatDuration(data.statistic.othersDurationMs)} ({formatToPercent(data.statistic.othersPercentage)})</div>\r\n </div>\r\n <div className=\"media-live-statistic__row\">\r\n <div className=\"\"><b>Total</b></div>\r\n <div className=\"\">{formatDuration(data.statistic.total)}</div>\r\n </div>\r\n </div>\r\n\r\n <div className=\"\" style={{overflow: \"auto\", maxHeight:915, paddingRight:5}}>\r\n {data.media.length ? <table className=\"table modal-table media-list-table\">\r\n <thead>\r\n <tr>\r\n <td></td>\r\n <td></td>\r\n <td>Name</td>\r\n <td>Duration</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderHistoricMedia(data.media)}\r\n </tbody>\r\n </table> : <p>No Items</p>}\r\n </div>\r\n </div>\r\n }\r\n\r\n return (\r\n <>\r\n <div className=\"w-100\">\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"\"\r\n id=\"date1\"\r\n isError={false}\r\n type=\"datetime-local\"\r\n onChangeValue={(v) => {onDateChanged(v)}}\r\n value={selectedDate}\r\n title=\"Time\"\r\n /> \r\n </FormRow>\r\n <div className=\"d-flex gap15 align-items-center\">\r\n <FormRow>\r\n <label>Tags Filter</label>\r\n <Select \r\n className={`w-100`}\r\n options={tags}\r\n classNamePrefix={`select`}\r\n onChange={onSelectedTag} \r\n isClearable={true}\r\n isMulti={true}\r\n />\r\n </FormRow>\r\n\r\n <div className=\"d-flex align-items-center\" style={{flex:\"0 0 auto\", width:\"120px\"}}>\r\n <FormCheckbox id={`playlist-checkbox-${Math.random()}`} checked={isLiveToggle} onChange={setIsLiveToggle} />\r\n <span className=\"status-block\">\r\n {isLiveToggle ? <span className=\"current-status online\"> Live</span> : <span className=\"current-status offline\"> Scheduled</span>}\r\n </span>\r\n </div>\r\n\r\n <Button color=\"green\" label=\"Update\" onClick={updateHistoricView} />\r\n </div>\r\n </div>\r\n {historicView ? renderHistoricView(historicView) : <div style={{minHeight:\"200px\"}}></div>}\r\n </>\r\n )\r\n}\r\n\r\nexport default HistoricViewBlock","import { FunctionComponent, useEffect,useState } from \"react\";\r\nimport { RouteComponentProps, useParams, withRouter } from \"react-router-dom\";\r\nimport { Guid} from \"../../../api/baseApi\";\r\nimport GlobalSpinner from \"../../components/globalsSpinner/GlobalSpinner\";\r\nimport InnerLayout from \"../innerLayout/InnerLayout\";\r\nimport { FormInput, FormRow } from \"../../components/formRow/FormRow\";\r\nimport { getPastDateByDaysAgo, isFirstDateGreaterThanSecond } from \"../../../services/dateService\";\r\nimport FormCheckbox from \"../../components/formRow/FormCheckbox\";\r\nimport { AllDaysStatistic, getDaysStatistic} from \"../../../api/channelsApi\";\r\nimport { formatDurationLong, formatToPercent } from \"../../../services/common\";\r\nimport Select, { MultiValue } from \"react-select\";\r\nimport { getTags } from \"../../../api/tagApi\";\r\nimport { Button } from \"../../components/Button\";\r\nimport HistoricViewBlock from \"../../components/historicVIew/HistoricView\";\r\nimport { Area, AreaChart, CartesianGrid, Legend, ResponsiveContainer, Tooltip, TooltipProps, XAxis, YAxis } from \"recharts\";\r\n\r\n\r\ninterface ChannelPlaylistParams{\r\n channelId: Guid,\r\n nestedPlayListsId: Guid\r\n}\r\n\r\ninterface ChannelPlaylistProps extends RouteComponentProps<any>{\r\n logOut : () => void;\r\n toogleCollapse: () => void;\r\n isCollapsed: boolean;\r\n}\r\n\r\ntype Option<T> = { value: T, label: string}\r\n\r\ntype ChartDataRow = {\r\n date:string, \r\n campaign: number, \r\n inhouseContent: number, \r\n siteContent: number, \r\n other: number\r\n}\r\n \r\nconst ChannelPlaylist: FunctionComponent<ChannelPlaylistProps> = (props: ChannelPlaylistProps) => {\r\n let {isCollapsed, logOut, toogleCollapse } = props;\r\n\r\n let [isLoading, setIsLoading] = useState<boolean>(false);\r\n \r\n let [selectedStartDate, setSelectedStartDate] = useState<string>(getPastDateByDaysAgo(7))\r\n let [isSelectedStartDateError, setIsSelectedStartDateError] = useState(false)\r\n let [selectedEndDate, setSelectedEndDate] = useState<string>(getPastDateByDaysAgo(0))\r\n let [isSelectedEndDateError, setIsSelectedEndDateError] = useState(false)\r\n let [selectedTime, setSelectedTime] = useState<string>(\"00:00\")\r\n\r\n let [tags,setTags] = useState<Option<Guid>[]>([]);\r\n let [selectedTagIds, setSelectedTagIds] = useState<Guid[]>([]);\r\n\r\n let [isLiveToggle, setIsLiveToggle] = useState(false);\r\n\r\n let [statistic, setStatistic] = useState<AllDaysStatistic>()\r\n\r\n let [chartData, setChartData] = useState<ChartDataRow[]>([])\r\n\r\n let { channelId, nestedPlayListsId } = useParams<ChannelPlaylistParams>();\r\n \r\n useEffect(() => {\r\n async function fetchData(){\r\n setIsLoading(true);\r\n await Promise.all([\r\n updateList(), \r\n updateTags(),\r\n ]);\r\n\r\n setIsLoading(false);\r\n }\r\n fetchData();\r\n }, [])\r\n\r\n useEffect(() => {\r\n validateReportPeriodDates(selectedStartDate,selectedEndDate)\r\n }, [selectedEndDate,selectedStartDate])\r\n\r\n const updateList = async () => {\r\n let request = {\r\n startDateString: selectedStartDate,\r\n endDateString: selectedEndDate,\r\n hour: selectedTime.split(\":\")[0],\r\n isLive: isLiveToggle,\r\n tagIds: selectedTagIds\r\n }\r\n\r\n let response = await getDaysStatistic(channelId, nestedPlayListsId, request);\r\n if( response.type === \"succes\") {\r\n setStatistic(response.data.data)\r\n setChartData(convertToChartData(response.data.data))\r\n }\r\n }\r\n\r\n const updateTags = async () => {\r\n let tagResponse = await getTags();\r\n if(tagResponse.type == \"succes\") {\r\n setTags([\r\n {\r\n label: \"No Tags\",\r\n value: \"00000000-0000-0000-0000-000000000000\"\r\n },\r\n ...tagResponse.data.items.map( t => { return {label:t.name, value:t.id}})\r\n ])\r\n }\r\n } \r\n \r\n const convertChartDate = (dateString: string) => {\r\n let [date, time] = dateString.split(\"T\")\r\n return `${date} / ${time.split(\".\")[0]}`\r\n }\r\n\r\n const convertToChartData = (data : AllDaysStatistic):ChartDataRow[] => {\r\n return data.days.map( el => {\r\n return {\r\n date: convertChartDate(el.date),\r\n campaign: el.statistic.campaignsPercentage,\r\n inhouseContent: el.statistic.inhouseContentPercentage,\r\n siteContent: el.statistic.siteContentPercentage,\r\n other: el.statistic.othersPercentage\r\n }\r\n })\r\n }\r\n\r\n const onStartDateChanged = (date: string) => {\r\n setSelectedStartDate(date);\r\n }\r\n const onEndDateChanged = (date: string) => {\r\n setSelectedEndDate(date);\r\n }\r\n\r\n const onTimeChanged = (time: string) => {\r\n setSelectedTime(time);\r\n }\r\n\r\n const validateReportPeriodDates = (start: string, end: string) => {\r\n if(isFirstDateGreaterThanSecond(start, end)){\r\n setIsSelectedEndDateError(true)\r\n setIsSelectedStartDateError(true)\r\n } else {\r\n setIsSelectedEndDateError(false)\r\n setIsSelectedStartDateError(false)\r\n }\r\n }\r\n\r\n const renderRow = (data: AllDaysStatistic) => {\r\n return data.days.map( (d,i) => {\r\n let [date, time] = d.date.split(\"T\")\r\n return <tr key={`${d.date}-${i}`}>\r\n <td>\r\n {date} / {time.split(\".\")[0]}\r\n {d.isFromHistory ? <p>Historical</p> : null}\r\n </td>\r\n <td>{formatDurationLong(d.statistic.campaignsDurationMs)} / {formatToPercent(d.statistic.campaignsPercentage)}</td>\r\n <td>{formatDurationLong(d.statistic.inhouseContentDurationMs)} / {formatToPercent(d.statistic.inhouseContentPercentage)}</td>\r\n <td>{formatDurationLong(d.statistic.siteContentDurationMs)} / {formatToPercent(d.statistic.siteContentPercentage)}</td>\r\n <td>{formatDurationLong(d.statistic.othersDurationMs)} / {formatToPercent(d.statistic.othersPercentage)}</td>\r\n <td>{formatDurationLong(d.statistic.total)}</td>\r\n </tr>\r\n })\r\n }\r\n\r\n const onSelectedTag = async (newValue: MultiValue<Option<Guid>>) => {\r\n if(newValue){\r\n let newTagIds = newValue.map(el => el.value)\r\n setSelectedTagIds(newTagIds)\r\n } else {\r\n setSelectedTagIds([])\r\n }\r\n }\r\n\r\n return ( \r\n <><InnerLayout\r\n isCollapsed={isCollapsed}\r\n logOut={logOut}\r\n toogleCollapse={toogleCollapse}\r\n activeTab=\"channels\">\r\n <>\r\n <div className=\"d-flex justify-content-between align-items-center pt-20\">\r\n <h3>Daily SoV</h3>\r\n \r\n </div>\r\n <div className=\"\" style={{height:500, marginBottom: 40, marginLeft:-33}}>\r\n <ResponsiveContainer width=\"100%\" height=\"100%\">\r\n <AreaChart\r\n width={500}\r\n height={400}\r\n data={chartData}\r\n stackOffset=\"expand\"\r\n margin={{\r\n top: 10,\r\n right: 0,\r\n left: 0,\r\n bottom: 0,\r\n }}\r\n >\r\n <CartesianGrid strokeDasharray=\"3 3\" />\r\n <XAxis dataKey=\"date\" />\r\n <YAxis tickFormatter={formatToPercent} />\r\n <Legend />\r\n <Area type=\"monotone\" name=\"Campaign\" dataKey=\"campaign\" stackId=\"1\" stroke=\"#8884d8\" fill=\"#8884d8\" />\r\n <Area type=\"monotone\" name=\"Inhouse Content\" dataKey=\"inhouseContent\" stackId=\"1\" stroke=\"#82ca9d\" fill=\"#82ca9d\" />\r\n <Area type=\"monotone\" name=\"Site Content\" dataKey=\"siteContent\" stackId=\"1\" stroke=\"#ffc658\" fill=\"#ffc658\" />\r\n <Area type=\"monotone\" name=\"Other\" dataKey=\"other\" stackId=\"1\" stroke=\"#ff0000\" fill=\"#ff0000\" />\r\n </AreaChart>\r\n </ResponsiveContainer>\r\n </div>\r\n\r\n <div className=\"\">\r\n <div className=\"d-flex gap15 align-items-center\">\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"\"\r\n id=\"playlist_start_date\"\r\n isError={isSelectedStartDateError}\r\n type=\"date\"\r\n onChangeValue={(v) => {onStartDateChanged(v)}}\r\n value={selectedStartDate}\r\n min={getPastDateByDaysAgo(7)}\r\n title=\"Start\"\r\n /> \r\n </FormRow>\r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"\"\r\n id=\"playlist_end_date\"\r\n isError={isSelectedEndDateError}\r\n type=\"date\"\r\n onChangeValue={(v) => {onEndDateChanged(v)}}\r\n value={selectedEndDate}\r\n title=\"End\"\r\n /> \r\n </FormRow> \r\n <FormRow>\r\n <FormInput\r\n errorMessage=\"\"\r\n id=\"playlist_time\"\r\n isError={false}\r\n type=\"time\"\r\n onChangeValue={(v) => {onTimeChanged(v)}}\r\n value={selectedTime}\r\n title=\"Time\"\r\n /> \r\n </FormRow> \r\n\r\n <FormRow>\r\n <label>Tags Filter</label>\r\n <Select \r\n className={`w-100`}\r\n options={tags}\r\n classNamePrefix={`select`}\r\n onChange={onSelectedTag} \r\n isClearable={true}\r\n isMulti={true}\r\n />\r\n </FormRow>\r\n\r\n <div className=\"d-flex align-items-center\" style={{flex:\"0 0 auto\", width:\"120px\"}}>\r\n <FormCheckbox id=\"playlist-checkbox\" checked={isLiveToggle} onChange={setIsLiveToggle} />\r\n <span className=\"status-block\">\r\n {isLiveToggle ? <span className=\"current-status online\"> Live</span> : <span className=\"current-status offline\"> Scheduled</span>}\r\n </span>\r\n </div>\r\n\r\n <Button color=\"green\" label=\"Update\" onClick={updateList} />\r\n </div>\r\n\r\n {statistic && <table className=\"table\">\r\n <thead>\r\n <tr>\r\n <td>Dates</td>\r\n <td>Campaign</td>\r\n <td>Inhouse Content</td>\r\n <td>Site Content</td>\r\n <td>Other</td>\r\n <td>Total</td>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {renderRow(statistic)}\r\n </tbody>\r\n </table>}\r\n </div> \r\n\r\n <div className=\"d-flex justify-content-between align-items-center pt-20\">\r\n <h3>Playlist View</h3>\r\n </div>\r\n\r\n <div className=\"historical\">\r\n <div className=\"historical__block\">\r\n <HistoricViewBlock />\r\n </div>\r\n <div className=\"historical__block\">\r\n <HistoricViewBlock />\r\n </div>\r\n <div className=\"historical__block\">\r\n <HistoricViewBlock />\r\n </div>\r\n </div>\r\n <GlobalSpinner isShow={isLoading}/>\r\n </>\r\n </InnerLayout>\r\n </>\r\n );\r\n}\r\n \r\nexport default withRouter(ChannelPlaylist);\r\n\r\n\r\n","import './App.css';\r\nimport './view/styles/variables.css'\r\nimport Login from './view/pages/login/Login';\r\nimport Dashboard from './view/pages/dashboard/Dashboard';\r\nimport { BrowserRouter, Redirect, Route, Switch } from 'react-router-dom';\r\nimport { Routes } from './constants/routes';\r\nimport { getToken, getUserData, Permission, removeToken, removeUserData, UserData } from './api/authApi';\r\nimport { useState } from 'react';\r\nimport Campaigns from './view/pages/campaigns/Campaigns';\r\nimport Channels from './view/pages/channels/Channels';\r\nimport Media from './view/pages/media/Media';\r\nimport Players from './view/pages/players/Players';\r\nimport Reports from './view/pages/reports/Reports2';\r\nimport PlayerDetails from './view/pages/players/PlayerDetails';\r\nimport ChannelMedia from './view/pages/channels/ChannelMedia';\r\nimport PriorityList from './view/pages/priorityLists/PriorityLists';\r\nimport PriorityListMedia from './view/pages/priorityLists/PriorityListMedia';\r\nimport UsersList from './view/pages/users/UsersList';\r\nimport UserSettings from './view/pages/users/UserSettings';\r\nimport CurrentPlayList from './view/pages/playNow/playNowList';\r\nimport CurrentPlayListMedia from './view/pages/playNow/playNowListMedia';\r\nimport MosaicScreen from './view/pages/mosaicScreen/MosaicScreen';\r\nimport MosaicScreenList from './view/pages/mosaicScreen/MosaicScreenList';\r\nimport Settings from './view/pages/settings/Settings';\r\nimport UserSettingsNotification from './view/pages/users/UserSettingsNotification';\r\nimport { ChangeLogPage } from './view/pages/changelog/Changelog';\r\nimport CampaignAndChannelAdhocReport from './view/pages/reports/CampaignAndChannelAdhocReport';\r\nimport MosaicAdhocReport from './view/pages/reports/MosaicAdhocReport';\r\nimport MosaicCampaignAndChannelReport from './view/pages/reports/MosaicCampaignAndChannelReport';\r\nimport PlayersMonitoring from './view/pages/playersMonitoring/PlayersMonitoring';\r\nimport TvGuide from './view/pages/tvGuid/TvGuide';\r\nimport ChannelPlaylist from './view/pages/channels/ChannelPlaylist';\r\n\r\nfunction App() { \r\n\r\n var currentToken = getToken();\r\n const [isAuthorized, setIsAuthorized] = useState<boolean>(!!currentToken); \r\n const [isCollapsed, setIsCollapsed] = useState<boolean>(false); \r\n\r\n const toogleCollapse = () => setIsCollapsed(!isCollapsed);\r\n const logOut = () => {\r\n removeToken();\r\n removeUserData();\r\n setIsAuthorized(false);\r\n }\r\n\r\n const hasPermission = (userData: UserData, permission: Permission) => {\r\n return userData.permissions.findIndex(i => i == permission) !== -1;\r\n}\r\n\r\nconst getDefaultRoute = () => {\r\n var userData = getUserData();\r\n if(hasPermission(userData, Permission.Dashboard)) { return Routes.Dashboard;}\r\n if(hasPermission(userData, Permission.PlayNowList)) return Routes.PlayNow;\r\n if(hasPermission(userData, Permission.PriorityList)) return Routes.PriorityList;\r\n\r\n return Routes.Reports;\r\n }\r\n\r\n\r\n if(!isAuthorized){\r\n return <BrowserRouter>\r\n <Route path={Routes.Login}>\r\n <Login setIsAuthorized={setIsAuthorized}/>\r\n </Route>\r\n <Route path=\"*\">\r\n <Redirect to={Routes.Login} />\r\n </Route> \r\n </BrowserRouter>\r\n }\r\n\r\n \r\n return (\r\n <BrowserRouter>\r\n <Switch>\r\n <Route path={Routes.Login}> \r\n <Login setIsAuthorized={setIsAuthorized} />\r\n </Route>\r\n <Route path={Routes.Dashboard}>\r\n <Dashboard logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route path={Routes.Media}>\r\n <Media logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route path={Routes.Campaigns}>\r\n <Campaigns logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route exact path={Routes.Channels}>\r\n <Channels logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route path={`${Routes.ChannelMedia}/nested-playlists/:nestedPlayListsId/days-statistic`}>\r\n <ChannelPlaylist logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route path={Routes.ChannelMedia}>\r\n <ChannelMedia logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route exact path={Routes.Reports}>\r\n <Reports logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route path={Routes.ReportsAdhoc}>\r\n <CampaignAndChannelAdhocReport logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route path={`${Routes.ReportsSkin}/:skinId?`}>\r\n <MosaicCampaignAndChannelReport logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route path={Routes.ReportsSkinAdhoc}>\r\n <MosaicAdhocReport logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route> \r\n <Route exact path={Routes.PriorityList}>\r\n <PriorityList logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route path={Routes.PriorityListMedia}>\r\n <PriorityListMedia logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route exact path={Routes.PlayNow}>\r\n <CurrentPlayList logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route path={Routes.PlayNowMedia}>\r\n <CurrentPlayListMedia logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route exact path={Routes.UserNotifications}>\r\n <UserSettingsNotification logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route path={Routes.Users}>\r\n <UsersList logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route path={Routes.UserSettings}>\r\n <UserSettings logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route exact path={Routes.Players}>\r\n <Players logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route path={Routes.PlayerDetails}>\r\n <PlayerDetails logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route exact path={Routes.Skins}>\r\n <MosaicScreenList logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route path={`${Routes.SkinDetails}`}>\r\n <MosaicScreen logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route path={`${Routes.Settings}`}>\r\n <Settings logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route path={`${Routes.PlayersMonitoring}`}>\r\n <PlayersMonitoring logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route path={`${Routes.TvGuide}`}>\r\n <TvGuide logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route path={`${Routes.ChangeLog}`}>\r\n <ChangeLogPage logOut={logOut} toogleCollapse={toogleCollapse} isCollapsed={isCollapsed}/>\r\n </Route>\r\n <Route path=\"*\">\r\n <Redirect to={getDefaultRoute()} />\r\n </Route>\r\n </Switch>\r\n </BrowserRouter >\r\n );\r\n}\r\n\r\nexport default App;\r\n","import { ReportHandler } from 'web-vitals';\r\n\r\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './index.css';\r\nimport App from './App';\r\nimport reportWebVitals from './reportWebVitals';\r\nrequire('dotenv').config();\r\n\r\nReactDOM.render(\r\n <React.StrictMode>\r\n <App />\r\n </React.StrictMode>,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n"],"sourceRoot":""}