{"version":3,"sources":["helper/GetAncestorElementHelper.js","temp/config.js","assets/img/rp-bg.png","assets/img/logoPlaceholder.png","assets/icons/svg/pdf.svg","assets/icons/svg/file.svg","assets/icons/png/bitmap@3x.png","components/Base/CustomFilter/FilterDropdown/index.js","components/Base/CustomFilter/FilterRadioButton/index.js","components/Base/Button/index.js","components/Base/CharacterCount/index.js","components/Base/FormInput/index.js","components/Base/Popup/PopupAction/index.js","components/Base/Popup/index.js","components/Base/FormModal/index.js","components/Base/CustomIframe/index.js","components/Base/Popup/PopupPreview/index.js","api/BaseURL.js","api/WorkflowAPI.js","helper/ScrollHelper.js","helper/DateHelper.js","helper/AddClassLazyloadHelper.js","components/Base/Label/index.js","components/Base/FormCheckbox/index.js","components/Base/ListItem/index.js","components/Base/SuccessMessage/index.js","components/Base/CustomFilter/index.js","components/Base/NoResultMessage/index.js","helper/HideBackToTopHelper.js","components/Feature/RetailerPortal/Approvals/index.js","components/Base/RadioButton/index.js","components/Base/PageHeader/index.js","components/Modules/Articles/index.js","api/ArticlesAPI.js","components/Base/FormImageGallery/index.js","components/Base/FormInputMultiple/index.js","components/Base/FormDate/index.js","components/Base/FormListbox/index.js","components/Base/FormListCheckbox/index.js","components/Base/Checkbox/index.js","components/Base/FormErrorMessage/index.js","components/Base/FormImageUpload/index.js","helper/ImageUploadHelper.js","helper/ArticleHelper.js","api/PromotionAPI.js","components/Modules/Forms/FormArticles/index.js","helper/RemoveActiveState.js","components/Feature/RetailerPortal/ArticleListing/index.js","components/Base/ImageUpload/index.js","helper/ImageConversionHelper.js","components/Base/FormFile/index.js","components/Base/DropDown/index.js","components/Base/Modal/index.js","helper/UrlHelper.js","components/Feature/RetailerPortal/Articles/index.js","components/Feature/RetailerPortal/Authorisations/index.js","api/UsersAPI.js","api/DashboardAPI.js","api/StoreAPI.js","components/Base/FormSelect/index.js","api/StorefrontAPI.js","helper/StorefrontHelper.js","components/Modules/Forms/FormStoreFront/index.js","components/Modules/StoreInfo/index.js","components/Feature/RetailerPortal/Stores/index.js","components/Modules/Events/index.js","components/Modules/Offers/index.js","helper/PromotionHelper.js","components/Modules/Forms/FormPromotions/index.js","components/Feature/RetailerPortal/PromotionListing/index.js","api/NotificationAPI.js","components/Modules/MemoItem/index.js","components/Feature/RetailerPortal/Notifications/index.js","components/Feature/RetailerPortal/Dashboard/index.js","api/LoginAPI.js","components/Feature/RetailerPortal/Footer/index.js","components/Feature/RetailerPortal/Hub/index.js","components/Feature/RetailerPortal/LeftNavigation/NavButtons/index.js","components/Feature/RetailerPortal/LeftNavigation/NavLinks/index.js","components/Feature/RetailerPortal/LeftNavigation/index.js","components/Base/Input/index.js","components/Base/ForgotPassword/index.js","components/Feature/RetailerPortal/Login/index.js","components/Base/AvatarUpload/index.js","components/Modules/Profile/EditProfile/index.js","components/Modules/Profile/UpdatePassword/index.js","components/Base/Card/index.js","components/Feature/RetailerPortal/Profile/index.js","components/Feature/RetailerPortal/Promotions/index.js","components/Base/FormDropDown/index.js","components/Feature/RetailerPortal/Storefront/index.js","components/Feature/RetailerPortal/TopNavigation/NavUser/index.js","components/Feature/RetailerPortal/TopNavigation/NavLogo/index.js","components/Feature/RetailerPortal/TopNavigation/NavRetailer/index.js","api/NavigationAPI.js","components/Feature/RetailerPortal/TopNavigation/NavNotification/index.js","components/Feature/RetailerPortal/TopNavigation/index.js","components/Feature/RetailerPortal/UpdatePassword/index.js","api/RecoverPasswordAPI.js","components/Feature/RetailerPortal/User/index.js","helper/UserHelper.js","components/Feature/RetailerPortal/Users/index.js","components/Foundation/Layout/Main/index.js","temp/componentFactory.js","dataFetcher.js","components/Base/BackToTop/index.js","Layout.js","NotFound.js","RouteHandler.js","AppRoot.js","index.js","lib/GraphQLClientFactory.js","assets/icons/png/author.png"],"names":["getAncestorElement","element","ancestorClass","parentElement","classList","contains","module","exports","FilterDropdown","Component","constructor","props","super","handleToggle","e","target","focus","this","setState","show","state","handleBlur","setTimeout","selected","defaultSelected","render","theme","error","title","icon","options","placeholder","noOptionsMessage","addMargin","React","createElement","Fragment","className","style","marginBottom","type","value","onClick","onBlur","length","map","item","index","label","key","handleSelectionChange","FilterRadioButton","handleRadioClick","id","onChange","selectedId","radioGroupName","disabled","plain","name","Button","color","size","tooltip","children","CharacterCount","remaining","FormInput","required","currency","onInputChange","maxLength","width","margin","PopupAction","description","iconBgColor","secondaryBtn","secondaryBtnOnClick","secondaryBtnColor","disabledSecondaryBtn","primaryBtn","primaryBtnOnClick","primaryBtnColor","disabledPrimaryBtn","rejectMessage","withRejectMessage","onRejectMessageChange","backgroundColor","Text","field","RichText","Popup","FormModal","handleScroll","event","headerContainer","querySelector","headerSpace","getBoundingClientRect","top","add","showBackToTop","remove","handleOnClick","parentElem","scrollIntoView","closeOnClick","closeClassName","showModal","showSaveHint","saveHint","saveBtn","saveBtnClassName","saveBtnOnClick","disabledSaveBtn","secondaryBtnClassName","primaryBtnClassName","redBtn","redBtnOnClick","disabledRedBtn","isPreview","isDynamicHeader","onScroll","CustomIframe","isIframeReady","src","frameBorder","allowFullScreen","onLoad","PopupPreview","previewGroupTitle","previewGroupUrl","showPreviewGroupModal","previewTitle","previewLogo","previewList","previewListChildName","btnLabel","btnOnClick","showPreviewModal","previewFormLabel","alt","logoPlaceholder","data-src","Centre","previewListArr","ItemId","Store","PreviewUrl","axios","create","baseURL","getWorkboxItems","params","BaseURL","get","disableBodyScroll","$","document","height","window","scrollTop","addClass","css","enableBodyScroll","parseInt","removeClass","scrollToTop","isNotDesktop","ua","navigator","userAgent","toLowerCase","bodyWrapper","outerWidth","test","scroll","left","behavior","getDate","date","format","moment","getDuration","startDate","endDate","duration","startTime","startDay","startMonth","startYear","endTime","endDay","endMonth","endYear","durationYear","durationMonth","durationDay","getStartDate","addClassLazyload","parentClass","parentWrapper","getElementsByClassName","imageList","querySelectorAll","forEach","el","Label","FormCheckbox","checked","onCheckboxChange","isChecked","tile","ListItem","arguments","handleOnClickCheckbox","checkboxElement","click","convertString","string","replace","handleOnClickListItem","listItemOnClick","checkboxValue","checkboxOnChange","noActionBtn","currentActiveItem","elemListItem","logoBgColor","logoSrc","showNotif","notification","storeDescription","status","previewBtn","previewBtnOnClick","btnOne","btnOneOnClick","btnTwo","btnTwoOnClick","isSelected","descriptionVal","SuccessMessage","handleMouseOver","handleShowSuccess","handleMouseOut","timer","onHover","timerOnHide","clearTimeout","isShown","componentDidMount","linkLabel","showPreviewLink","hideIcon","onMouseOver","onMouseOut","CustomFilter","handleCloseFilter","bodyContainer","backToTop","toggle","right","onCloseFilter","updateBodyClass","showFilter","NoResultMessage","hideBackToTop","isHidden","backToTopWrapper","FeatureRetailerPortalApprovals","getData","async","showLoader","response","data","WorkboxItems","TotalPageNumber","TotalResults","workboxItems","filteredItems","totalPageNumber","totalResults","itemTotal","showPagination","handleChecked","getFilters","handleItems","console","statusText","getOptions","items","all","indexOf","includes","push","sort","a","b","typeItems","centreItems","storeItems","typeOptions","centreOptions","storeOptions","Type","handleResize","paginationRange","isDesktop","handleFilter","filter","activePageNum","uncheckAll","filterCentre","filterStore","filterType","unfiltered","currentPage","until","from","list","slice","listLength","itemCount","Math","ceil","checks","i","selectedItem","selectedItems","handleSelected","splice","isMatch","renderRejectModal","message","showRejectModal","rejectItems","renderApproveModal","modalMessage","showApproveModal","formData","FormData","append","method","url","IsSuccess","Message","resetState","approveItems","modalIcon","previewUrl","previewItemId","pageNumber","handlePaginationClick","renderPagination","ReactPaginate","previousLabel","nextLabel","breakLabel","breakClassName","pageCount","marginPagesDisplayed","pageRangeDisplayed","forcePage","onPageChange","containerClassName","subContainerClassName","activeClassName","renderPreviewModal","previewUrlList","renderItems","Name","StartDate","EndDate","PreviewUrlList","Thumbnail","globalStoreList","storeList","storeItem","Storefronts","handleBulkPreviewForm","logo","showBulkPreview","retailerLogo","handleHeaderIconClick","clearItem","leftNavWrapper","topNavWrapper","renderBulkPreview","isDocumentReady","addEventListener","hasSelection","Select","option","defaultValue","colors","primary","primary25","isSearchable","maxMenuHeight","menuPlacement","RadioButton","radioList","Id","Description","Selected","fields","PageHeader","primaryBtnLabel","primaryBtnIcon","secondaryBtnLabel","Articles","isOnLoad","getArticles","dataUpdate","totalResultCount","Object","keys","dataTotalCount","LivePromotions","ScheduledPromotions","AwaitingApprovalPromotions","DraftPromotions","RejectedPromotions","dashboardArticles","renderItemsLayout","renderDashboardListItem","livePomotionLayout","ScheduledPromotionsLayout","AwaitingApprovalPromotionsLayout","DraftPromotionsLayout","RejectedPromotionsLayout","renderListItem","promotions","noSelectedStore","CentreName","Title","Status","PreviewURL","imageSrc","showDeleteModal","centreName","handleOnClickList","ShortDescription","renderListCount","totalListCount","filterStatus","articleCount","itemId","formModalLabel","activeElement","blur","detail","showFormModal","isNewArticle","isDashboard","centre","componentDidUpdate","prevProps","toString","hideFilter","FormImageGallery","handleAttachments","imageFiles","newImageFiles","newItem","handleAddUpload","addNewValue","Date","now","handleOnDragEnd","result","destination","Array","reorderedItem","source","renderGalleryList","imageGalleryList","DragDropContext","onDragEnd","Droppable","droppableId","provided","assign","droppableProps","ref","innerRef","imgSrc","URL","createObjectURL","Draggable","draggableId","imageItem","isDragging","draggableProps","dragHandleProps","removeFile","htmlFor","accept","updateFile","files","renderGuidelines","initialValue","imageFile","itemIndex","listItem","FormInputMultiple","FormDate","properties","DatePicker","FormListbox","hint","handleListbox","handleSelect","multiple","optionLayout","FormListCheckbox","Checkbox","FormErrorMessage","containsLoginError","href","FormImageUpload","handleFileUpload","file","setFile","preview","alert","renderGuideLines","guidelines","guidelinesOne","guidelinesTwo","guidelinesThree","errorMessage","hasImageUpload","removeImage","imageMimeTypes","validateImageSize","max","undefined","validateImageType","allowedTypes","isEmpty","isObject","validate","removeValidate","articleName","rules","subheading","publishDate","body","heroImage","selectedStores","selectedCategories","thumbnail","imageGallery","socialFeedImage","socialStoryImage","trim","invalidImages","elem","formDataFields","selectedStore","categoryTag","hidePublishDate","imageGalleryChecker","selectedSpecialPromotion","itemIds","setArticleData","Subheading","Body","PublishDate","HidePublishDate","LinkedSpecialHolidays","HolidayId","LinkCategories","CategoryId","ImageGallery","Src","buildFormData","postData","toISOString","promotion","category","storeId","getCentreStores","getCategoriesAndHolidays","RichTextEditor","Loadable","loader","loading","FormArticles","articleData","Article","mode","getArticleDataReady","showImageGallery","categoryListData","Categories","holidayListData","GlobalSpecialHoliday","categoryList","holidayList","CategoryName","HolidayName","categories","holidays","getCentreStoreList","centreStoreList","retailerId","isCheckbox","isSelect","handleStoreListCheckbox","selectAllStores","allStores","StoreList","store","StoreItemId","handleFormUpdate","validateForm","formError","entries","showErrorMessage","formErrorMessage","triggerBackToTop","isSuccess","saveForm","then","articleIdList","timezoneId","getTimezoneOffset","timeZoneId","disableBtn","handleFormData","config","headers","articleList","ArticleList","articlesItem","extractItemIds","previewBulkLogo","setGoogleAnalytics","RetailerLogo","articlePreviewUrl","articlePreviewTitle","setArticleIdList","article","submitForm","log","TagManager","dataLayer","articleCentre","articleRetailer","dataLayerName","centreList","center","handlePreviewForm","renderModal","submitBtn","buildCentreStoreList","CentreIcon","StoreName","imageGalleryHolder","placeholderText","showTimeSelect","timeCaption","timeFormat","timeIntervals","dateFormat","promotionType","heroImageFileType","thumbnailFileType","heroImageFileSize","thumbnailFileSize","imageGalleryFileType","imageGalleryFileSize","removeActiveState","activeItem","FeatureRetailerPortalArticleListing","isMobile","updateCentreOption","CentreList","centreListOption","previewModalData","formModalData","renderFormModal","content","onClickSave","onClickPreview","onClickSubmit","isDashboardUpdate","updateDashboard","updateArticle","onClickUpdate","isSubmit","filterAllStatus","getElementById","filterAllCentreRadio","filterAllCentreDropdown","selectedIndex","successMessage","showSuccessMessage","articlePreviewUrlHolder","articlePreviewTitleHolder","renderDelete","deleteModalData","disableCancelBtn","disableDeleteBtn","deleteArticle","dataCount","statusVar","newData","handleOnClickFilter","setCentreListDropdown","tempCentreList","centreOption","renderCustomFilter","statusOption","filterByCentre","renderContent","HideCreateButton","noStore","articles","isWindowReady","ImageUpload","showCrop","croppedImageUrl","handleCrop","crop","unit","x","y","aspect","onImageLoaded","image","imageRef","onCropComplete","makeClientCrop","convertCroptoFile","onCropChange","canvasImage","getCroppedImg","Promise","resolve","reject","toBlob","blob","revokeObjectURL","fileUrl","lastDot","fileName","fileExtension","split","pop","lastIndexOf","substring","newCropFile","base64String","filename","arr","mime","match","bstr","atob","n","u8arr","Uint8Array","charCodeAt","File","base64StringtoFile","toDataURL","canvas","scaleX","scaleY","naturalWidth","naturalHeight","getContext","drawImage","labelOne","labelTwo","labelThree","ReactCrop","ruleOfThirds","onComplete","keepSelection","FormFile","setList","lists","isError","values","renderList","inputFile","createRef","newList","prototype","apply","DropDown","Modal","modalType","getUrlParameter","results","RegExp","exec","location","search","decodeURIComponent","FeatureRetailerPortalArticles","RetailerList","RedirectUrl","retailerList","setRetailerList","setHolidayList","setCategoryList","retailers","redirectUrl","temp","RetailerName","RetailerId","cta","modalContent","buildPreviewUrls","centrePreview","win","open","param","stores","componentReady","specialHolidayListbox","selectedRetailer","selectedRetailerName","bitmap","FeatureRetailerPortalAuthorisations","getWaitingApprovalUsers","Users","userItems","addAll","Centres","splitCentreArray","centreVal","cIndex","hasFilteredCentre","itemCentre","jsonData","usernames","UserName","FullName","ProfilePicture","Retailers","Email","getStoreInfo","FormSelect","fullWidth","hidden","getStorefrontData","entities","Entities","encode","FormStoreFront","decodeHTML","html","txt","innerHTML","getStoreData","$this","StorefrontDescription","ContactNumber","MenuUrl","BestParking","AcceptsAfterPay","AcceptsGiftCards","IsKidsFriendly","IsVegetarian","RetailerDescription","Website","Instagram","Facebook","LogoImage","HeroImage","StorefrontHeroImage","ImageGalleryChecker","StoreID","IsTemporarilyClosed","IsOpeningSoon","OpeningHoursStatus","Source","MondayOpeningHours","MondayClosingHours","MondaySecondaryOpeningHours","MondaySecondaryClosingHours","MondayIsClosed","TuesdayOpeningHours","TuesdayClosingHours","TuesdaySecondaryOpeningHours","TuesdaySecondaryClosingHours","TuesdayIsClosed","WednesdayOpeningHours","WednesdayClosingHours","WednesdaySecondaryOpeningHours","WednesdaySecondaryClosingHours","WednesdayIsClosed","ThursdayOpeningHours","ThursdayClosingHours","ThursdaySecondaryOpeningHours","ThursdaySecondaryClosingHours","ThursdayIsClosed","FridayOpeningHours","FridayClosingHours","FridaySecondaryOpeningHours","FridaySecondaryClosingHours","FridayIsClosed","SaturdayOpeningHours","SaturdayClosingHours","SaturdaySecondaryOpeningHours","SaturdaySecondaryClosingHours","SaturdayIsClosed","SundayOpeningHours","SundayClosingHours","SundaySecondaryOpeningHours","SundaySecondaryClosingHours","SundayIsClosed","RetailerType","formType","isStoreDataReady","getCarParkData","carparkList","getCategoryData","updateCategoryList","categoryResponse","handleSaveForm","handleSubmitForm","storeInfoCentre","storeInfoRetailer","storeInfoName","renderStoreHours","resetHours","day","newInfo","infoList","info","primaryOpeningHour","primaryClosingHour","secondaryOpeningHour","secondaryClosingHour","closed","TimePicker","use12Hours","allowClear","time","timeString","onTimeChange","suffixIcon","isClosed","dateTime","storeCheckboxList","call","setDropdownValue","optionValue","dropdownValue","StoreOpeningHours","sourceList","openingHoursList","iconList","checkIfBlank","FeatureRetailerPortalStoreInfo","formModalBody","isRetailer","otherFormModalProps","renderDashboardItems","dashboardStores","renderItemLayout","StoreInfoTitle","previewModalTitle","previewModalUrl","formModalProps","storeInfoTitle","StoreInfoList","GlobalList","IsCentreMarketing","RetailerSectionTitle","RetailerSectionSubtext","StoresSectionTitle","StoresSectionSubtext","headerData","RetailerID","RetailerDetails","OpeningToday","OpeningHours","descriptionValue","renderStoreCount","hasPagination","storeCount","dataStoreLength","enablePreview","modalTitle","storeName","Header","FeatureRetailerPortalStores","storeInfo","selectedFilter","StoreInfo","getStoreInfoUpdate","isArray","history","pushState","addParameter","val","modalData","Events","getEvents","dashboardPromotions","promotionCount","isNewPromotion","Offers","getOffers","EmbargoedPromotions","livePromotionsLayout","EmbargoedPromotionsLayout","OfferHighlight","isBlob","Blob","promotionName","summary","embargoStartDate","embargoEndDate","dateToValidate","getTime","dateToCompare","displayStartDate","offerHighlight","displayEndDate","schedule","capacity","price","termsAndConditionsCopy","termsAndConditionsLink","retailerHandles","retailerHashtags","consentToSharing","setPromotionData","Duration","Capacity","Location","CategoryTag","Summary","DisplayStartDate","DisplayEndDate","EmbargoStartDate","EmbargoEndDate","Schedule","Price","RetailerHandles","RetailerHashtags","ConsentToSharing","FormPromotions","promotionData","Promotion","getPromotionDataReady","showScheduleDate","showTermsCondition","handleInputCheckbox","promotionIdList","promotionList","PromotionList","promotionsItem","Promotions","promotionPreviewUrl","promotionPreviewTitle","setPromotionIdList","promotionCentre","promotionRetailer","showModalWrapper","displayStartDateHolder","displayEndDateHolder","termsAndConditionsLinkHolder","termsAndConditionsCopyHolder","dashboardType","charAt","toUpperCase","socialFeedFileType","socialFeedFileSize","socialStoryFileType","socialStoryFileSize","FeatureRetailerPortalPromotionListing","getTab","updatePromotion","promotionPreviewUrlHolder","promotionPreviewTitleHolder","deletePromotion","offer","contentLayout","getNotifications","MemoItem","renderAttachments","attachments","Url","Size","getFileType","pdf","acknowledgeMemo","disabledCb","acknowledged","renderAcknowledgement","hideAcknowledgement","renderMiniModal","Acknowledged","MemoImage","Content","Attachments","MemoType","FeatureRetailerPortalNotifications","Notifications","HideAcknowledgeButton","notifications","hideAcknowledgeButton","getContent","Image","MemoViewed","memoContent","showContentLoader","setMemoStatus","findIndex","find","handleView","isViewed","dateAndCentre","correspondenceDateAndCentre","correspondenceTitle","renderViewModal","showViewModal","acknowledge","isFirefox","notificationsList","FeatureRetailerPortalDashboard","containerWrapper","columnWidth","clientWidth","getCorrespondenceData","correspondenceList","getStoreInfoData","isUpdate","showStoreInfoLoader","storeInfoList","getEventsData","showEventsLoader","eventsList","getOffersData","showOffersLoader","offersList","getArticlesData","showArticlesLoader","articlesList","dashboardPanelLayout","component","headerName","showLink","link","noResultText","panelLayout","Link","querystring","text","renderCorrespondence","correspondenceLayout","renderStoreInfo","storeInfoLayout","Stores","renderEvents","hideCreateButton","eventsLayout","PromotionListing","renderOffers","offersLayout","renderArticles","articlesLayout","ArticleListing","CorrespondenceListingLink","StoresListingLink","EventsListingLink","OffersListingLink","ArticlesListingLink","XMasonry","targetBlockWidth","XBlock","isDashboardReady","UserPhoto","UserRole","DefaultUserLogo","logout","post","FeatureRetailerPortalFooter","FooterTitle","FooterLinks","StatusCode","pathname","logoutUser","LinkTarget","FeatureRetailerPortalHub","Heading","Links","Navigation","NavButtons","getNewApprovals","newApprovals","tab","NavLinks","HideUserManagementLink","HideContentApprovalLink","HideAuthorisationsLink","Nav","iconName","NavFooter","links","linkTarget","FeatureRetailerPortalLeftNavigation","breakpoint","closeNav","backButton","sessionStorage","setItem","Input","onInputKeyDown","responseText","autoComplete","blank","autoFocus","onKeyDown","ForgotPassword","bg","FeatureRetailerPortalLogin","loginWrapper","innerHeight","clearSessionStorageSetPassword","getItem","removeItem","checkBrowser","vendor","browser","login","forgotPassword","sendForgotPassword","form","current","reportValidity","passwordSent","onEnterKeyPress","which","keyCode","forgotPasswordMessage","BackgroundImage","onSubmit","preventDefault","username","password","SiteLogo","SiteLogoClassName","LoginPageBlurb","FooterBlurb","ForgotPasswordMessage","mainLink","blurb","footerBlurb","display","AvatarUpload","EditProfile","EmailAddress","Address","Permissions","profilePicture","fullName","contactNumber","emailAddress","address","permissions","saveData","removeProfilePicture","formSubmit","antiForgeryToken","showMiniModal","refresh","UpdatePassword","sendChangePassword","newPass","confNewPass","Card","textContent","btnText","btnDisabled","FeatureRetailerPortalProfile","renderChangePasswordModal","showChangePasswordModal","renderEditProfileModal","willRefreshPage","showEditProfileModal","reload","renderDetails","FeatureRetailerPortalPromotions","setStoreList","FormDropDown","FeatureRetailerPortalStorefront","OnlineBookingUrl","setCarparkList","CarParkName","CarParkId","selectedStoreName","selectedCarpark","selectedIcon","CarParkList","filterResult","selectedStoreId","Storage","parkList","selectedBestParking","selectedSourceName","disable","NavInfo","handleClick","removeEventListener","node","componentWillUnmount","UserPicture","optionSelected","NavLogo","LogoLink","NavRetailer","handleDropdown","retailersList","removeShowAll","sum","showAll","initialList","offsetHeight","maxHeight","nav","getRetailerList","retailer","setGoogleTagmanager","retailerName","referrer","loginRetailer","loginCentre","handleSwitchRetailer","prevRetailer","newRetailer","newNotif","isSingleRetailer","hasOptions","isBlur","NavNotification","getNewNotification","FeatureNavigationTopNavigation","editProfilePage","changePassword","ShowChangePasswordPrompt","NavUser","FeatureRetailerPortalUpdatePassword","handleServerError","ValidationMessage","errorStatus","decodeUsername","user","URLSearchParams","decodeToken","tokenVal","IsValidUrlToken","token","validateLength","validatePassword","isValidLength","matchesConfPassword","confirmPassword","validationMessage","RecoverPassword","formSubmitted","UpdatePasswordPageBlurb","marginTop","FeatureRetailerPortalUser","Username","Permission","User","centresList","centres","CentreId","email","permission","PermissionValue","handlePermission","finalOptions","PermissionName","isRetailersDisabled","isCentresDisabled","isRetailerRequired","isCentreRequired","retailerRule","centreRule","formatOptionLabelRetailer","_ref","_ref2","inputValue","highlighted","dangerouslySetInnerHTML","__html","DOMPurify","sanitize","formatOptionLabelCentre","_ref3","_ref4","PermissionLevels","isMulti","components","NoOptionsMessage","isClearable","backspaceRemovesValue","formatOptionLabel","isDisabled","FeatureRetailerPortalUsers","getUsers","users","setFilter","levels","userLevel","userList","FilterId","FilterDescription","userName","deleteUser","page","whiteSpace","handleUser","NoUsersText","avatar","UserLevel","FoundationLayoutMain","Placeholder","rendering","Map","componentFactory","componentName","set","BaseCustomFilterFilterDropdown","BaseCustomFilterFilterRadioButton","BasePopupPopupAction","BasePopupPopupPreview","FeatureRetailerPortalTopNavigation","ModulesFormsFormArticles","ModulesFormsFormPromotions","ModulesFormsFormStoreFront","ModulesProfileEditProfile","ModulesProfileUpdatePassword","dataFetcher","withCredentials","BackToTop","handleOnScroll","bodyWrapperContainer","bodyWrapperMargin","bodyContainerMargin","elemPos","backToTopPos","getComputedStyle","getPropertyValue","Layout","initialize","gtmId","objectFitImages","route","Helmet","PageTitle","VisitorIdentification","NotFound","context","site","language","RouteHandler","ssrInitialState","ssrState","notFound","routeData","defaultLanguage","sitecore","componentIsMounted","languageIsChanging","ssrRenderComplete","setSsrRenderComplete","updateRouteData","sitecoreRoutePath","sitecoreRoute","startsWith","fetchOptions","layoutServiceConfig","host","sitecoreApiHost","querystringParams","sc_lang","sc_apikey","sitecoreApiKey","fetcher","dataApi","fetchRouteData","catch","getRouteData","lang","contextFactory","setSitecoreContext","previousProps","existingRoute","newRoute","isExperienceEditorActive","routePatterns","AppRoot","SitecoreContextFactory","path","Router","graphQLClient","routeRenderFunction","ApolloProvider","client","SitecoreContext","Switch","routePattern","Route","ssrRawJson","renderFunction","ReactDOM","__JSS_STATE__","JSON","parse","hydrate","initialGraphQLState","APOLLO_STATE","endpoint","ssr","initialCacheState","createPersistedQueryLink","concat","BatchHttpLink","uri","credentials","cache","InMemoryCache","fragmentMatcher","IntrospectionFragmentMatcher","introspectionQueryResultData","ApolloClient","ssrMode","ssrForceFetchDelay","restore","GraphQLClientFactory","graphQLEndpoint","rootElement","BrowserRouter"],"mappings":"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,sBAAuB,MAC9C+lB,mBAAoBvtB,eAClBuH,EAASC,KACT,2BACA,MAEFgmB,OAAQxtB,eAAIuH,EAASC,KAAM,eAAgB,MAC3CimB,mBAAoBztB,eAClBuH,EAASC,KACT,6CACA,MAEFkmB,mBAAoB1tB,eAClBuH,EAASC,KACT,6CACA,MAEFmmB,4BAA6B3tB,eAC3BuH,EAASC,KACT,sDACA,MAEFomB,4BAA6B5tB,eAC3BuH,EAASC,KACT,sDACA,MAEFqmB,eAAgB7tB,eACduH,EAASC,KACT,yCACA,MAEFsmB,oBAAqB9tB,eACnBuH,EAASC,KACT,8CACA,MAEFumB,oBAAqB/tB,eACnBuH,EAASC,KACT,8CACA,MAEFwmB,6BAA8BhuB,eAC5BuH,EAASC,KACT,uDACA,MAEFymB,6BAA8BjuB,eAC5BuH,EAASC,KACT,uDACA,MAEF0mB,gBAAiBluB,eACfuH,EAASC,KACT,0CACA,MAEF2mB,sBAAuBnuB,eACrBuH,EAASC,KACT,gDACA,MAEF4mB,sBAAuBpuB,eACrBuH,EAASC,KACT,gDACA,MAEF6mB,+BAAgCruB,eAC9BuH,EAASC,KACT,yDACA,MAEF8mB,+BAAgCtuB,eAC9BuH,EAASC,KACT,yDACA,MAEF+mB,kBAAmBvuB,eACjBuH,EAASC,KACT,4CACA,MAEFgnB,qBAAsBxuB,eACpBuH,EAASC,KACT,+CACA,MAEFinB,qBAAsBzuB,eACpBuH,EAASC,KACT,+CACA,MAEFknB,8BAA+B1uB,eAC7BuH,EAASC,KACT,wDACA,MAEFmnB,8BAA+B3uB,eAC7BuH,EAASC,KACT,wDACA,MAEFonB,iBAAkB5uB,eAChBuH,EAASC,KACT,2CACA,MAEFqnB,mBAAoB7uB,eAClBuH,EAASC,KACT,6CACA,MAEFsnB,mBAAoB9uB,eAClBuH,EAASC,KACT,6CACA,MAEFunB,4BAA6B/uB,eAC3BuH,EAASC,KACT,sDACA,MAEFwnB,4BAA6BhvB,eAC3BuH,EAASC,KACT,sDACA,MAEFynB,eAAgBjvB,eACduH,EAASC,KACT,yCACA,MAEF0nB,qBAAsBlvB,eACpBuH,EAASC,KACT,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SC,KACT,6CACA,MAEFkmB,mBAAoB1tB,eAClBuH,EAASC,KACT,6CACA,MAEFmmB,4BAA6B3tB,eAC3BuH,EAASC,KACT,sDACA,MAEFomB,4BAA6B5tB,eAC3BuH,EAASC,KACT,sDACA,MAEFqmB,eAAgB7tB,eACduH,EAASC,KACT,yCACA,MAEFsmB,oBAAqB9tB,eACnBuH,EAASC,KACT,8CACA,MAEFumB,oBAAqB/tB,eACnBuH,EAASC,KACT,8CACA,MAEFwmB,6BAA8BhuB,eAC5BuH,EAASC,KACT,uDACA,MAEFymB,6BAA8BjuB,eAC5BuH,EAASC,KACT,uDACA,MAEF0mB,gBAAiBluB,eACfuH,EAASC,KACT,0CACA,MAEF2mB,sBAAuBnuB,eACrBuH,EAASC,KACT,gDACA,MAEF4mB,sBAAuBpuB,eACrBuH,EAASC,KACT,gDACA,MAEF6mB,+BAAgCruB,eAC9BuH,EAASC,KACT,yDACA,MAEF8mB,+BAAgCtuB,eAC9BuH,EAASC,KACT,yDACA,MAEF+mB,kBAAmBvuB,eACjBuH,EAASC,KACT,4CACA,MAEFgnB,qBAAsBxuB,eACpBuH,EAASC,KACT,+CACA,MAEFinB,qBAAsBzuB,eACpBuH,EAASC,KACT,+CACA,MAEFknB,8BAA+B1uB,eAC7BuH,EAASC,KACT,wDACA,MAEFmnB,8BAA+B3uB,eAC7BuH,EAASC,KACT,wDACA,MAEFonB,iBAAkB5uB,eAChBuH,EAASC,KACT,2CACA,MAEFqnB,mBAAoB7uB,eAClBuH,EAASC,KACT,6CACA,MAEFsnB,mBAAoB9uB,eAClBuH,EAASC,KACT,6CACA,MAEFunB,4BAA6B/uB,eAC3BuH,EAASC,KACT,sDACA,MAEFwnB,4BAA6BhvB,eAC3BuH,EAASC,KACT,sDACA,MAEFynB,eAAgBjvB,eACduH,EAASC,KACT,yCACA,MAEF0nB,qBAAsBlvB,eACpBuH,EAASC,KACT,+CACA,MAEF2nB,qBAAsBnvB,eACpBuH,EAASC,KACT,+CACA,MAEF4nB,8BAA+BpvB,eAC7BuH,EAASC,KACT,wDACA,MAEF6nB,8BAA+BrvB,eAC7BuH,EAAS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","file":"static/js/main.beb7ad91.chunk.js","sourcesContent":["export const getAncestorElement = (element, ancestorClass) => {\n if (element) {\n while ((element = element.parentElement) && !element.classList.contains(ancestorClass));\n }\n return element;\n};","/* eslint-disable */\n// Do not edit this file, it is auto-generated at build time!\n// See scripts/bootstrap.js to modify the generation of this file.\nmodule.exports = {\n \"sitecoreApiKey\": \"D7898185-A43A-4641-9D17-399C4930EE7E\",\n \"sitecoreApiHost\": \"\",\n \"jssAppName\": \"portal\",\n \"defaultLanguage\": \"en\",\n \"graphQLEndpointPath\": \"/api/portal\",\n \"graphQLEndpoint\": \"/api/portal?sc_apikey=D7898185-A43A-4641-9D17-399C4930EE7E\"\n};","module.exports = __webpack_public_path__ + \"static/media/rp-bg.3ef9e69a.png\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAEBSURBVHhe7dExAcAwDMCwdPyhhkP7DIQO6zEAn929E8b3N4iGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBqCaQimIZiGYBpCmXkmQQSLV0662QAAAABJRU5ErkJggg==\"","module.exports = __webpack_public_path__ + \"static/media/pdf.c76a3b07.svg\";","module.exports = __webpack_public_path__ + \"static/media/file.06ddb997.svg\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAA5CAYAAACCsf3qAAAAAXNSR0IArs4c6QAABWtJREFUaAXtmduvX0MUx7XoBXWpakmb3hwqFIlLSxBUldSdREQ8+ssk3oQnEV4c9SR1STx4Ue2hF9VD3U8dDvX5NB3ZZ+zLzN6/87vl902+57f3zJrZa9asWbNmzrILRhfLUX0t3AKn4LVwGTwBD8CTMBk2HCWsQFkHvB1ef/75Yn5j/EbBa/BUXFH1PgqGuBzlN0Jn3dm/Gqbo/Tlyb8IkXJQk1V8hXd7BboPO+iZ4KczFVhqshPMpDXMNobxKlrljyvfqZHR7Z9zBb4Bdv6En7YTGitiDzlL2K/wFnkMsEMrLflVyH7wOOmujjjkG8CmchgsX8icF6xB6Baauz5Q+By2jx22GTurh1KVxF8Jhnc7ynByNkR02uCxchtuh478bHkw1xHqExd/wLXjClxHHi+h/MzSgrk1d60FOQyRFYeSGHcaIgOVhgKEg5TcnwNb1lxqf6vroUrdoHKlLo8sH47Y7KLgVXgUX4FH4CfwRDgz9NIQe4Pa7Oxqt2/Lt0CzwSFTXt9d4abgz3AifhM5aL2F0jo0Q+l/Dw/PwilDQ79+iR+zi4/cVlPm5h8qsoq8qI4TPaAw940Ao6OdvMIR5wv7ow/9E711er6SxMaEJJjgDgUvDffTeJf566g4RJqZJHeUWRf2mBk31dngZTJmtpr7q6j3cnIGr64Soa8pYnbj74S3Q/qbhDOwMO3YL+6tzT/UdeNL7ol7kXNbqHUIdHqByD9wAt0KzQw+BnaEhVPK7zj01d/A+InWp+TT1x2q6MR1+MKq/hPfnoIG2EzSEQfFQp17SGnt99jr8CLpU9ETT9ePwDfghrILXc27p6htjPQXPwE73FyE4Haajh2DZhyjuGX6np3fgB9CLE5fkT9AzTBWMYc66s1+FKSpM1t6uEmgqDwN3aZxuEu5h/Rx9eXP0A6wzgruNnmBMaIIJW+vdLxjCmRlYelszwoepu6mmPq56hALPMtkIhrDhV9mtl7bBbXRvppsDl/rT0JiShaIhjNiu4a7QRV+FL8NNLTuz3X7YJmnyvGRMMbYko2gIo/rR5JblgvdQ/AR0IB7eXoJG9RwYRJ+Fnk/awpiStZMUDeFHD7X9Mu1cm3uj9s6Kp0pnKQW69lNwXYpwg8wN1Mf6VDaJDTGDZJss0zXp2nQgMaxzcGV1sayKO4BeYTcdyUbEhjhNi9wsM2XWjfx7GrS5k3qXVq/xKB26TGsRG8IsM2f3MJtzLabEAff4O2AZtlD4WFlFD8r0RL21NheJDeF3gyFSIrbWTnVl+3scboNFePI1OK4oFvb4Wa+t3UnKDHGSRp4FyuqK+unGu4oFCc8OVoV01dVwI3wBaoylRm2sKgtgf6LRDKwyhMF0ChrY2sDt0RzD7VpjmEb3C+5sZp/vxh8sM4QybqNer8XwXGCOoItXtY3bVL1nJTxVnbQoN1adggvFtlWDMbEqmymDowlT3Umw2P+wPjuRLv//UGUIhTRGDOWr2sSyw/y+EuWuKSpYFQdcAt8XBcf9ucoQ4z7u/41vYojzJpkYYmKIxatj4hETj5h4xGILZHqE549xxnxqjAhH83E0hv9bmU01xGcIfzmGVvAk/R6cT7l8CeM3P/f+wYsYD1+jjLMorycchN84kBxDKB+Q6klBfth+NYQcGrSdiJ4PIEcRr9P2wpw2RYVt5x2Hv2fgLPS/8N9CL40Hipy7BZXfDNe01NjAdBy6A81ADfEHHArkGEKl3TmqruTLBuT/Sb6GDt6gtOhWiPehQY4hVPpjuBNWXb07694HOnDd3hvxoZl1dKlEm/W+g96MFeGqa47nY9AL3yPQbWngax4dstDGEH5gFfQ/R26jDnxoXR7dkvAvDZC2G1F8EEgAAAAASUVORK5CYII=\"","import React, { Component, Fragment } from \"react\";\r\n\r\nclass FilterDropdown extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n show: false,\r\n selected: props.defaultSelected,\r\n };\r\n }\r\n\r\n handleToggle = (e) => {\r\n e.target.focus();\r\n this.setState({ show: !this.state.show });\r\n };\r\n\r\n handleBlur = () => {\r\n if (this.state.show) {\r\n setTimeout(() => {\r\n this.setState({ show: false });\r\n }, 250);\r\n }\r\n };\r\n\r\n render() {\r\n const {\r\n theme,\r\n error,\r\n title,\r\n icon,\r\n options,\r\n placeholder,\r\n noOptionsMessage,\r\n addMargin,\r\n } = this.props;\r\n const { selected, show } = this.state;\r\n return (\r\n <Fragment>\r\n <div\r\n className=\"filter-dropdown-container\"\r\n style={{ marginBottom: show && addMargin ? \"15rem\" : \"0\" }}\r\n >\r\n {icon ? <i className={`icon icon-${icon}`} /> : \"\"}\r\n {title ? <div className=\"title\">{title}</div> : \"\"}\r\n <label\r\n className={`arrow ${theme ? theme : \"\"} ${error ? \"error\" : \"\"}`}\r\n >\r\n <div className=\"dropdown-placeholder\">\r\n <input\r\n type=\"button\"\r\n value={selected ? selected : placeholder}\r\n className=\"dropdown-btn\"\r\n onClick={(e) => this.handleToggle(e)}\r\n onBlur={(e) => this.handleBlur(e)}\r\n />\r\n </div>\r\n <i className=\"icon icon-chevron-down-small\" />\r\n <ul className={`dropdown-list ${show ? \"\" : \"d-none\"}`}>\r\n {options && options.length ? (\r\n options.map((item, index) => {\r\n const { value, label } = item;\r\n\r\n return (\r\n <li\r\n key={`optionId${index}`}\r\n onClick={() => {\r\n this.setState({ selected: label, show: false }, () => {\r\n this.props.handleSelectionChange(value);\r\n });\r\n }}\r\n >\r\n <span>{label}</span>\r\n </li>\r\n );\r\n })\r\n ) : (\r\n <li className=\"empty\">\r\n {noOptionsMessage ? noOptionsMessage : \"No options found\"}\r\n </li>\r\n )}\r\n </ul>\r\n </label>\r\n </div>\r\n </Fragment>\r\n );\r\n }\r\n}\r\n\r\nexport default FilterDropdown;\r\n","import React, { Component } from \"react\";\n\nclass FilterRadioButton extends Component {\n constructor(props) {\n super(props);\n this.state = {\n selectedId: null,\n };\n }\n\n handleRadioClick = (id, onChange) => {\n if (onChange) {\n onChange(id);\n }\n\n this.setState({\n selectedId: id,\n });\n };\n\n render() {\n const {\n defaultSelected = null,\n options = null,\n radioGroupName = null,\n onChange = null,\n disabled = null,\n plain = null,\n } = this.props || {};\n\n const { selectedId } = this.state;\n\n return (\n <div>\n {options &&\n options.map((item, index) => {\n const { value, label } = item;\n return (\n <div\n key={`filter-rb-${index}-${label.value}${index}`}\n className={`filter-radiobutton ${plain ? \"is-plain\" : \"\"}`}\n >\n <label className={disabled ? \"disabled\" : \"\"}>\n <input\n type=\"radio\"\n className={\n selectedId == value\n ? \"is-active\"\n : !selectedId && defaultSelected === value\n ? \"is-active\"\n : \"\"\n }\n id={value}\n name={radioGroupName}\n value={label}\n onClick={() => this.handleRadioClick(value, onChange)}\n disabled={disabled}\n />\n <span className=\"filter-radiobutton__checkmark\" />\n <span className=\"filter-radiobutton__name\">{label}</span>\n </label>\n </div>\n );\n })}\n </div>\n );\n }\n}\n\nexport default FilterRadioButton;\n","import React, { Component } from \"react\";\r\n\r\nclass Button extends Component {\r\n render() {\r\n /**\r\n * Color - primary, secondary, tertiary, tertiary-grey, tertiary-custom, red\r\n * Size - full, small, small-full\r\n **/\r\n const {\r\n color = null,\r\n size = null,\r\n onClick = null,\r\n icon = null,\r\n disabled = false,\r\n tooltip = null,\r\n className = null,\r\n } = this.props || {};\r\n\r\n return (\r\n <button\r\n className={`btn \r\n ${color ? \"btn--\" + color : \"btn--primary\"}\r\n ${size ? \"btn--\" + size : \"\"}\r\n ${icon ? \"btn--icon\" : \"\"}\r\n ${className ? className : \"\"}\r\n `}\r\n onClick={onClick}\r\n disabled={disabled}\r\n >\r\n {tooltip &&\r\n <span className=\"btn__tooltip\">{tooltip}</span>\r\n }\r\n {icon &&\r\n <i className={`icon icon-${icon}`} />\r\n }\r\n <span className=\"btn__label\">\r\n {this.props.children}\r\n </span>\r\n </button>\r\n );\r\n }\r\n}\r\n\r\nexport default Button;\r\n","import React from \"react\";\r\n\r\nconst CharacterCount = props => {\r\n const { remaining } = props;\r\n return (\r\n <div className=\"character-count\">\r\n <span>{remaining}</span>\r\n {\" remaining\"}\r\n </div>\r\n );\r\n};\r\n\r\nexport default CharacterCount;\r\n","import React from \"react\";\nimport CharacterCount from \"../CharacterCount\";\n\nconst FormInput = props => {\n const {\n type = null,\n label = null,\n icon = null,\n placeholder = null,\n required = null,\n currency = null,\n error = null,\n value = null,\n onInputChange = null,\n maxLength = null,\n width = null,\n title = null,\n disabled = null,\n margin = null,\n className = null\n } = props;\n return (\n <div className={`form-group form__input \n ${title ? \"is-title\" : \"\"}\n ${error ? \"has-error\" : \"\"}\n ${margin && margin === \"custom\" ? \"is-custom-margin\" : \"\"}\n ${className ? className : \"\"}\n `}>\n {(label || required) &&\n <label className=\"form__label\">\n {label}\n {required &&\n <span className=\"form__asterisk\">*</span>\n }\n </label>\n }\n <div className={`form__input--details \n ${currency ? \"has-currency\" : \"\"}\n ${width && width == \"max\" ? \"is-max\" :\n width && width == \"min\" ? \"is-min\" :\n width && width == \"badge\" ? \"is-badge\" : \"\"}\n `}>\n {currency &&\n <div className=\"form__input--currency\">\n {\"$\"}\n </div>\n }\n <input\n className=\"form__input--field\"\n type={type ? type : \"text\"}\n value={value ? value : \"\"}\n maxLength={maxLength}\n placeholder={placeholder}\n onChange={e => onInputChange(e.target.value)}\n disabled={disabled}\n />\n </div>\n <div className=\"form__validation-message\">\n {error}\n </div>\n {/* {maxLength && <CharacterCount remaining={maxLength - value.length} />} */}\n </div >\n );\n};\n\nexport default FormInput;\n","import React, { Component } from \"react\";\nimport { Text, RichText } from \"@sitecore-jss/sitecore-jss-react\";\nimport Button from \"../../Button\";\nimport FormInput from \"../../FormInput\";\n\nclass PopupAction extends Component {\n render() {\n const {\n label,\n description,\n icon,\n iconBgColor,\n secondaryBtn,\n secondaryBtnOnClick,\n secondaryBtnColor,\n disabledSecondaryBtn,\n primaryBtn,\n primaryBtnOnClick,\n primaryBtnColor,\n disabledPrimaryBtn,\n rejectMessage,\n withRejectMessage,\n onRejectMessageChange,\n } = this.props;\n return (\n <React.Fragment>\n <div className=\"popup-action\">\n <div className=\"popup-action__close is-tablet\">\n {secondaryBtnOnClick && (\n <Button\n color=\"tertiary\"\n icon=\"close\"\n onClick={secondaryBtnOnClick}\n />\n )}\n </div>\n <div className=\"popup-action__content\">\n <div className=\"popup-action__icon\">\n <i\n className={`icon icon-${icon}`}\n style={{ backgroundColor: iconBgColor }}\n />\n </div>\n\n <div className=\"popup-action__text is-tablet\">\n {label && label.value && (\n <div className=\"popup-action__label\">\n <Text field={label} />\n </div>\n )}\n </div>\n <div className=\"is-tablet\">\n {description && description.value && (\n <div className=\"popup-action__description\">\n <RichText field={description} />\n </div>\n )}\n {withRejectMessage && (\n <FormInput\n type=\"text\"\n placeholder=\"\"\n label=\"Comment\"\n value={rejectMessage}\n onInputChange={(value) => onRejectMessageChange(value)}\n />\n )}\n </div>\n\n <div className=\"popup-action__text is-desktop\">\n {label && label.value && (\n <div className=\"popup-action__label\">\n <Text field={label} />\n </div>\n )}\n {description && description.value && (\n <div className=\"popup-action__description\">\n <RichText field={description} />\n </div>\n )}\n {withRejectMessage && (\n <FormInput\n type=\"text\"\n placeholder=\"\"\n label=\"Comment\"\n value={rejectMessage}\n onInputChange={(value) => onRejectMessageChange(value)}\n />\n )}\n </div>\n </div>\n <div className=\"popup-action__buttons\">\n {primaryBtn && primaryBtnOnClick && (\n <Button\n className=\"is-tablet\"\n color={primaryBtnColor ? primaryBtnColor : \"primary\"}\n onClick={primaryBtnOnClick}\n disabled={disabledPrimaryBtn}\n >\n {primaryBtn}\n </Button>\n )}\n\n {secondaryBtn && secondaryBtnOnClick && (\n <Button\n color={secondaryBtnColor ? secondaryBtnColor : \"secondary\"}\n onClick={secondaryBtnOnClick}\n disabled={disabledSecondaryBtn}\n >\n {secondaryBtn}\n </Button>\n )}\n\n {primaryBtn && primaryBtnOnClick && (\n <Button\n className=\"is-desktop\"\n color={primaryBtnColor ? primaryBtnColor : \"primary\"}\n onClick={primaryBtnOnClick}\n disabled={disabledPrimaryBtn}\n >\n {primaryBtn}\n </Button>\n )}\n </div>\n </div>\n </React.Fragment>\n );\n }\n}\n\nexport default PopupAction;\n","import React, { Component } from \"react\";\r\n\r\nclass Popup extends Component {\r\n render() {\r\n const { show } = this.props;\r\n return (\r\n <React.Fragment>\r\n <div className=\"modal-blur\" />\r\n <div className=\"portal-modal-container\">\r\n <div className=\"portal-modal\">\r\n {show && (\r\n <div\r\n className=\"btn btn--tertiary btn--icon close-button\"\r\n onClick={() => {\r\n show();\r\n }}\r\n >\r\n <i className=\"icon icon-close\" />\r\n </div>\r\n )}\r\n {this.props.children}\r\n </div>\r\n </div>\r\n </React.Fragment>\r\n );\r\n }\r\n}\r\n\r\nexport default Popup;\r\n","import React, { Component } from \"react\";\nimport Button from \"../Button\";\nimport { getAncestorElement } from \"../../../helper/GetAncestorElementHelper\";\n\nclass FormModal extends Component {\n constructor(props) {\n super(props);\n this.state = {\n showBackToTop: false,\n };\n }\n\n handleScroll = (event) => {\n const element = event.target;\n const headerContainer = element.querySelector(\".form__modal--header\");\n const headerSpace = element.querySelector(\".form__modal--header-space\");\n\n if (headerSpace && headerContainer) {\n let elemPos = headerSpace.getBoundingClientRect().top;\n if (elemPos < 0) {\n headerContainer.classList.add(\"is-fixed\");\n this.setState({\n showBackToTop: true,\n });\n } else {\n headerContainer.classList.remove(\"is-fixed\");\n this.setState({\n showBackToTop: false,\n });\n }\n }\n };\n\n handleOnClick = (event) => {\n const element = event.target;\n const parentElem = getAncestorElement(element, \"form__modal\");\n if (parentElem) {\n const headerSpace = parentElem.querySelector(\n \".form__modal--header-space\"\n );\n if (headerSpace) {\n headerSpace.scrollIntoView();\n }\n }\n };\n\n render() {\n const {\n label = null,\n closeOnClick = null,\n closeClassName = null,\n showModal = null,\n showSaveHint = null,\n saveHint = null,\n saveBtn = null,\n saveBtnClassName = null,\n saveBtnOnClick = null,\n disabledSaveBtn = null,\n secondaryBtn = null,\n secondaryBtnClassName = null,\n secondaryBtnOnClick = null,\n disabledSecondaryBtn = null,\n primaryBtn = null,\n primaryBtnClassName = null,\n primaryBtnOnClick = null,\n disabledPrimaryBtn = null,\n redBtn = null,\n redBtnOnClick = null,\n disabledRedBtn = null,\n isPreview = null,\n isDynamicHeader = null,\n } = this.props;\n const { showBackToTop } = this.state;\n\n return (\n <div\n className={`form__modal \n ${showModal ? \"show-modal\" : \"\"}\n ${isPreview ? \"is-preview\" : \"\"}\n `}\n onScroll={this.handleScroll}\n >\n <div className=\"form__modal--header\">\n <div className=\"form__modal--close\">\n <Button\n icon=\"close\"\n size=\"small\"\n color=\"tertiary\"\n className={closeClassName}\n onClick={closeOnClick}\n />\n </div>\n {label && <div className=\"form__modal--path\">{label}</div>}\n\n <div className=\"form__modal--buttons\">\n {showSaveHint && (\n <div className=\"form__modal--buttons-hint\">\n <i className=\"icon icon-upload-cloud\" />\n <span>{saveHint ? saveHint : \"Saving...\"}</span>\n </div>\n )}\n {saveBtnOnClick && (\n <Button\n size=\"small\"\n color=\"secondary\"\n onClick={saveBtnOnClick}\n disabled={disabledSaveBtn}\n className={saveBtnClassName}\n >\n {saveBtn}\n </Button>\n )}\n {secondaryBtnOnClick && (\n <Button\n size=\"small\"\n color=\"secondary\"\n onClick={secondaryBtnOnClick}\n disabled={disabledSecondaryBtn}\n className={secondaryBtnClassName}\n >\n {secondaryBtn}\n </Button>\n )}\n {primaryBtnOnClick && (\n <Button\n size=\"small\"\n color=\"primary\"\n onClick={primaryBtnOnClick}\n disabled={disabledPrimaryBtn}\n className={primaryBtnClassName}\n >\n {primaryBtn}\n </Button>\n )}\n {redBtnOnClick && (\n <Button\n size=\"small\"\n color=\"red\"\n onClick={redBtnOnClick}\n disabled={disabledRedBtn}\n >\n {redBtn}\n </Button>\n )}\n </div>\n </div>\n\n {isDynamicHeader && label && (\n <div className=\"form__modal--path\">{label}</div>\n )}\n <div\n className={`form__modal--header-space ${\n showSaveHint ? \"has-save-hint\" : \"\"\n }`}\n />\n <div className=\"form__modal--body container\">{this.props.children}</div>\n {showBackToTop && showModal && (\n <div className=\"form__modal--back-to-top\">\n <button\n onClick={this.handleOnClick}\n className=\"form__modal--back-to-top-button\"\n >\n <span>Back to top</span>\n <i className=\"icon icon-chevron-up\" />\n </button>\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default FormModal;\n","import React, { Component, Fragment } from \"react\";\n\nclass CustomIframe extends Component {\n constructor(props) {\n super(props);\n this.state = {\n isIframeReady: false,\n };\n }\n\n render() {\n const {\n title,\n src,\n } = this.props || {};\n\n const {\n isIframeReady\n } = this.state;\n return (\n <Fragment>\n <div className=\"custom-iframe\">\n <iframe\n frameBorder=\"0\"\n className={`${isIframeReady ? \"\" : \"is-hidden\"}`}\n allowFullScreen=\"\"\n src={src}\n title={title}\n onLoad={() => {\n this.setState({ isIframeReady: true })\n }}\n >\n </iframe>\n {!isIframeReady &&\n <div className=\"loader-wrapper container\">\n <div className=\"loader\" />\n </div>\n }\n </div>\n </Fragment>\n );\n }\n\n};\n\nexport default CustomIframe;\n","import React, { Component } from \"react\";\nimport { Text } from \"@sitecore-jss/sitecore-jss-react\";\nimport Button from \"../../Button\";\nimport Popup from \"../../Popup\";\nimport FormModal from \"../../FormModal\";\nimport CustomIframe from \"../../CustomIframe\";\nimport logoPlaceholder from \"../../../../assets/img/logoPlaceholder.png\";\n\nclass PopupPreview extends Component {\n constructor(props) {\n super(props);\n this.state = {\n previewGroupTitle: \"\",\n previewGroupUrl: \"\",\n showPreviewGroupModal: false\n };\n }\n\n render() {\n const {\n previewTitle,\n previewLogo,\n previewList,\n previewListChildName,\n btnLabel,\n btnOnClick,\n showPreviewModal,\n previewFormLabel,\n } = this.props;\n\n const {\n previewGroupTitle,\n previewGroupUrl,\n showPreviewGroupModal\n } = this.state;\n\n return (\n <React.Fragment>\n <div className=\"popup-preview\">\n <Popup show={() => showPreviewModal()} >\n <div className=\"preview\">\n <div className=\"preview__title\">\n {previewTitle ? previewTitle : \"Preview\"}\n </div>\n\n <div className=\"preview__group\">\n <div className=\"preview__logo\">\n {previewLogo ?\n <img\n alt=\"preview-logo-alt\"\n src={logoPlaceholder}\n data-src={previewLogo}\n className=\"lazyload\"\n />\n :\n <div className=\"no-image\">\n </div>\n }\n </div>\n <div className=\"preview__content\">\n {previewList.map((item, index) => {\n const {\n Centre,\n } = item || {}\n\n let previewListArr = item[previewListChildName];\n return (\n <div key={`preview-details-${index}`}\n className=\"preview__details\">\n <div className=\"preview__list\">\n <div className=\"preview__list--label\">\n <Text field={Centre} />\n </div>\n </div>\n {previewListArr.map((item, index) => {\n const {\n ItemId,\n Store,\n PreviewUrl\n } = item\n\n let title = Store.value + \" \" + Centre.value;\n return (\n <div key={`preview-list-${index}`}\n className=\"preview__list\">\n <div className=\"preview__list--label\">\n <Text field={Store} />\n </div>\n <div className=\"preview__list--link\"\n onClick={() => {\n this.setState({\n previewGroupTitle: title,\n previewGroupUrl: PreviewUrl.value,\n showPreviewGroupModal: true,\n })\n }}\n >\n {\"Preview\"}\n </div>\n </div>\n )\n })}\n </div>\n )\n })}\n </div>\n </div>\n {btnOnClick &&\n <div className=\"preview__button\">\n <Button\n color=\"primary\"\n onClick={btnOnClick}\n >\n {btnLabel}\n </Button>\n </div>\n }\n </div>\n </Popup>\n <FormModal\n isPreview\n showModal={showPreviewGroupModal}\n label={previewFormLabel ? previewFormLabel : previewGroupTitle}\n closeOnClick={() =>\n this.setState({ showPreviewGroupModal: false })\n }\n >\n {this.state.showPreviewGroupModal &&\n <CustomIframe\n title={previewFormLabel ? previewFormLabel : previewGroupTitle}\n src={previewGroupUrl}\n />\n }\n </FormModal>\n </div>\n\n </React.Fragment>\n );\n }\n}\n\nexport default PopupPreview;\n","import axios from \"axios\";\n\nconst isDev = process.env.REACT_APP_DEV || false;\nexport default axios.create({\n baseURL: isDev ? \"http://localhost:3001\" : \"/api/sitecore\"\n});\n\nexport const DevURL = axios.create({\n baseURL: \"http://localhost:3001\",\n});\n\nexport const DevURL2 = axios.create({\n baseURL: \"http://localhost:3002\",\n});\n\nexport const DevURL3 = axios.create({\n baseURL: \"http://localhost:3003\",\n});\n","import BaseURL, { DevURL } from \"./BaseURL\";\r\n\r\nexport const getWorkboxItems = params => {\r\n return BaseURL.get(\"/workflowapproval/GetWorkboxItems\", {\r\n params: { ...params }\r\n });\r\n // return DevURL.get(\"/GetWorkboxItems\", {\r\n // params: { ...params }\r\n // });\r\n};\r\n","import $ from \"jquery\";\n\nexport const disableBodyScroll = () => {\n if (($(document) && $(document).height()) > $(window).height()) {\n var scrollTop = $(\"html\").scrollTop()\n ? $(\"html\").scrollTop()\n : $(\"body\").scrollTop();\n $(\"html\")\n .addClass(\"noscroll\")\n .css(\"top\", -scrollTop);\n }\n};\n\nexport const enableBodyScroll = () => {\n var scrollTop = parseInt($(\"html\").css(\"top\"));\n $(\"html\").removeClass(\"noscroll\");\n $(\"html,body\").scrollTop(-scrollTop);\n};\n\n// export const disableBodyScrolling = () => {\n// if (document) {\n// let bodyWrapper = document.querySelector(\".body-wrapper\");\n// if (bodyWrapper) {\n// bodyWrapper.classList.add(\"disable-scroll\");\n// }\n// }\n// };\n\n// export const enableBodyScrolling = () => {\n// if (document) {\n// let bodyWrapper = document.querySelector(\".body-wrapper\");\n// if (bodyWrapper) {\n// bodyWrapper.classList.remove(\"disable-scroll\");\n// }\n// }\n// };\n\nexport const scrollToTop = (isNotDesktop) => {\n if (document) {\n const ua = window.navigator.userAgent.toLowerCase();\n const bodyWrapper = document.querySelector(\".body-wrapper\");\n if (isNotDesktop) {\n if (window && window.outerWidth < 992) {\n if ((/msie|trident/.test(ua))) {\n bodyWrapper.scroll(0, 0);\n } else {\n bodyWrapper.scroll({\n top: 0,\n left: 0,\n behavior: 'smooth'\n });\n }\n }\n } else {\n if ((/msie|trident/.test(ua))) {\n bodyWrapper.scroll(0, 0);\n } else {\n bodyWrapper.scroll({\n top: 0,\n left: 0,\n behavior: 'smooth'\n });\n }\n }\n\n }\n};","import moment from \"moment\";\n\nexport const getDate = (date, format) => {\n return moment(date).format(format);\n};\n\nexport const getDuration = (startDate, endDate) => {\n let startTime = getDate(startDate, \"hh:mm a\");\n let startDay = getDate(startDate, \"DD\");\n let startMonth = getDate(startDate, \"MMMM\");\n let startYear = getDate(startDate, \"YYYY\");\n\n let endTime = getDate(endDate, \"hh:mm a\");\n let endDay = getDate(endDate, \"DD\");\n let endMonth = getDate(endDate, \"MMMM\");\n let endYear = getDate(endDate, \"YYYY\");\n\n let duration;\n let durationYear = startYear === endYear ? true : false;\n let durationMonth = startMonth === endMonth ? true : false;\n let durationDay = startDay === endDay ? true : false;\n\n if (durationYear && durationMonth && durationDay) {\n // 24 July 2019, 6:30pm - 7:30pm\n duration = `${startDay} ${startMonth} ${startYear}`;\n }\n\n if (durationYear && durationMonth && !durationDay) {\n // 15 - 24 July 2019, 6:30pm - 7:30pm\n duration = `${startDay}-${endDay} ${startMonth} ${startYear}`;\n }\n\n if (durationYear && !durationMonth) {\n // 15 July - 24 August 2019, 6:30pm - 7:30pm\n duration = `${startDay} ${startMonth} - ${endDay} ${endMonth} ${startYear}`;\n }\n\n if (\n !durationYear &&\n ((!durationMonth && !durationDay) || (durationMonth && durationDay))\n ) {\n // 15 July 2018 - 24 August 2019, 6:30pm - 7:30pm\n // 15 July 2018 - 15 July 2019, 6:30pm - 7:30pm\n duration = `${startDay} ${startMonth} ${startYear} - ${endDay} ${endMonth} ${endYear}`;\n }\n\n if (startTime === endTime) {\n duration = `${duration} ${startTime}`;\n } else {\n duration = `${duration} ${startTime} - ${endTime}`;\n }\n\n return duration;\n};\n\nexport const getStartDate = startDate => {\n let startTime = getDate(startDate, \"hh:mm a\");\n let startDay = getDate(startDate, \"DD\");\n let startMonth = getDate(startDate, \"MMMM\");\n let startYear = getDate(startDate, \"YYYY\");\n\n return `${startDay} ${startMonth} ${startYear} ${startTime}`;\n};\n","export const addClassLazyload = (parentClass) => {\n const parentWrapper = document.getElementsByClassName(parentClass)[0];\n let imageList = \"\";\n if (parentWrapper) {\n imageList = parentWrapper.querySelectorAll(\"img\");\n if (imageList.length > 0) {\n imageList.forEach((el) => {\n el.classList.add('lazyload');\n });\n }\n }\n}","import React from \"react\";\n\nconst Label = props => {\n let color;\n switch (props.color.toLowerCase()) {\n case \"new\":\n color = \"new\";\n break;\n case \"draft\":\n color = \"draft\";\n break;\n case \"pending approval\":\n color = \"pending\";\n break;\n case \"awaiting approval\":\n color = \"pending\";\n break;\n case \"rejected\":\n color = \"rejected\";\n break;\n case \"approved\":\n color = \"approved\";\n break;\n case \"live\":\n color = \"approved\";\n break;\n case \"embargoed\":\n color = \"rejected\";\n break;\n default:\n color = \"default\";\n }\n\n return (\n <div className={`label-wrapper ${color}`}>\n {props.children}\n </div>\n );\n};\n\nexport default Label;\n","import React, { Component } from \"react\";\n\nclass FormCheckbox extends Component {\n constructor(props) {\n super(props);\n this.state = {\n isChecked: false\n };\n }\n\n onInputChange = checked => {\n this.props.onCheckboxChange(this.props.value, checked);\n this.setState({\n isChecked: checked\n })\n };\n\n render() {\n const {\n disabled = null,\n icon = null,\n className = null,\n label = null,\n value = \"\",\n checked = null,\n tile = null,\n plain = null\n } = this.props || {};\n const {\n isChecked\n } = this.state;\n return (\n <React.Fragment>\n <label className={`form-checkbox-container \n ${disabled ? \"disabled\" : \"\"}\n ${tile ? \"is-tile\" : \"\"}\n ${isChecked ? \"is-checked\" : \"\"}\n ${plain ? \"is-plain\" : \"\"}\n `}>\n {icon ? (\n <i className={`icon icon-${icon}`} />\n ) : (\n \"\"\n )}\n <span className={className ? className : \"\"}>\n {label}\n </span>\n <input\n value={value}\n onChange={e => this.onInputChange(e.target.checked)}\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n />\n <span className=\"checkmark\" />\n </label>\n </React.Fragment>\n );\n }\n}\n\nexport default FormCheckbox;\n","import React from \"react\";\nimport { Text, Image, RichText } from \"@sitecore-jss/sitecore-jss-react\";\nimport Button from \"../Button\";\nimport Label from \"../Label\";\nimport FormCheckbox from \"../FormCheckbox\";\nimport { getAncestorElement } from \"../../../helper/GetAncestorElementHelper\";\nimport logoPlaceholder from \"../../../assets/img/logoPlaceholder.png\";\nimport { Fragment } from \"react\";\n\nclass ListItem extends React.Component {\n /*\n ** Sample List Item\n <ListItem key={`itemId-${index}`}\n listItemOnClick={\"Insert listItem onClick event\"}\n logo={{ \"bgColor\": \"#000\", \"src\": \"http://placekitten.com/100/100\" }}\n label={\"label\"}\n title={\"title\"}\n description={\"description\"}\n status={\"DRAFT\"}\n previewBtn={{ \"label\": \"Preview\", \"color\": \"secondary\" }}\n previewBtnOnClick={\"Insert preview onClick event\"}\n btnOne={{ \"icon\": \"trash-2\", \"color\": \"secondary\", \"tooltip\": \"Delete\" }}\n btnOneOnClick={\"Insert btnOne onClick event\"}\n />\n ** Sample List Item using Approval\n <ListItem key={`itemId-${index}`}\n listItemOnClick={\"Insert listItem onClick event\"}\n logo={{ \"bgColor\": \"#000\", \"src\": \"http://placekitten.com/100/100\" }}\n label={\"label\"}\n title={\"title\"}\n description={\"description\"}\n status={\"DRAFT\"}\n previewBtn={{ \"label\": \"Preview\", \"color\": \"secondary\" }}\n previewBtnOnClick={\"Insert preview onClick event\"}\n btnOne={{ \"icon\": \"thumbs-up\", \"color\": \"primary\", \"tooltip\": \"Approve\" }}\n btnOneOnClick={\"Insert btnOne onClick event\"}\n btnTwo={{ \"icon\": \"thumbs-down\", \"color\": \"red\", \"tooltip\": \"Reject\" }}\n btnTwoOnClick={\"Insert btnTwo onClick event\"}\n checkboxValue={\"Sample Value\"}\n checkboxOnChange={(value, checked) =>\n this.handleSelected(value, checked)\n }\n />\n */\n\n handleOnClickCheckbox = (element) => {\n let parentElement = \"\";\n let checkboxElement = \"\";\n if (!/btn|icon|form-checkbox-container|checkmark/.test(element.className)) {\n if (/js-list-item/.test(element.className)) {\n checkboxElement = element.querySelector(\".form-checkbox-container\");\n } else {\n parentElement = getAncestorElement(element, \"js-list-item\");\n checkboxElement = parentElement.querySelector(\n \".form-checkbox-container\"\n );\n }\n checkboxElement.click();\n }\n };\n\n convertString = (string) => {\n return string\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n };\n\n handleOnClickListItem = (e) => {\n const { listItemOnClick, checkboxValue, checkboxOnChange } =\n this.props || {};\n\n const element = e.target;\n if ((window && window.outerWidth >= 992) || this.props.noActionBtn) {\n if (listItemOnClick) {\n listItemOnClick(e);\n } else if (checkboxValue && checkboxOnChange) {\n this.handleOnClickCheckbox(e.target);\n }\n } else {\n let currentActiveItem = document.querySelector(\".js-list-item.active\");\n if (currentActiveItem) {\n currentActiveItem.classList.remove(\"active\");\n }\n let elemListItem = \"\";\n if (/js-list-item/.test(element.className)) {\n elemListItem = element;\n } else {\n elemListItem = getAncestorElement(element, \"js-list-item\");\n }\n elemListItem.classList.add(\"active\");\n }\n };\n\n render() {\n const {\n logoBgColor,\n logoSrc,\n label,\n showNotif,\n notification,\n title,\n description,\n storeDescription,\n status,\n listItemOnClick,\n previewBtn,\n previewBtnOnClick,\n btnOne,\n btnOneOnClick,\n btnTwo,\n btnTwoOnClick,\n checkboxValue,\n checkboxOnChange,\n isSelected,\n } = this.props || {};\n\n let descriptionVal = \"\";\n\n if (description && description.value) {\n descriptionVal = this.convertString(description.value);\n }\n\n return (\n <div\n className={`list-item js-list-item ${status && status.value ? status.value.toLowerCase() : \"\"} \n ${checkboxValue && checkboxOnChange ? \"has-checkbox\" : \"\"}\n ${isSelected ? \"selected\" : \"\"} `}\n onClick={this.handleOnClickListItem}\n >\n {checkboxValue && checkboxOnChange && (\n <div className=\"list-item__checkbox\">\n <FormCheckbox\n value={checkboxValue}\n onCheckboxChange={checkboxOnChange}\n />\n </div>\n )}\n {logoSrc ? (\n <div\n className={`list-item__logo\n ${logoBgColor ? \"has-bg-color\" : \"\"}\n `}\n style={{ backgroundColor: logoBgColor }}\n >\n <img\n alt={`${title && title.value ? title.value : \"list-item-logo\"}`}\n src={logoPlaceholder}\n data-src={logoSrc}\n className=\"lazyload\"\n />\n </div>\n ) : (\n <div className=\"list-item__logo no-logo\" />\n )}\n\n <div className=\"list-item__details\">\n {label && label.value && (\n <div className=\"list-item__label\">\n <Text field={label} />\n </div>\n )}\n {title && title.value && (\n <div className=\"list-item__title\">\n {showNotif ? (\n <Fragment>\n <div\n className={`show-notif ${notification ? \"unread\" : \"\"}`}\n />\n <span>\n <Text field={title} />\n </span>\n </Fragment>\n ) : (\n <Text field={title} />\n )}\n </div>\n )}\n {description && description.value && (\n <div className=\"list-item__description\">\n <RichText field={{ value: descriptionVal }} />\n </div>\n )}\n {storeDescription && (\n <div className=\"list-item__description\">{storeDescription}</div>\n )}\n </div>\n {status && status.value && (\n <div className=\"list-item__status\">\n <Label color={status.value.toLowerCase()}>{status.value}</Label>\n </div>\n )}\n\n <div className=\"list-item__actions\">\n <Button\n className={\"js-btn-edit\"}\n color={\"secondary\"}\n size=\"small\"\n icon={\"edit\"}\n onClick={listItemOnClick}\n />\n {previewBtn && (\n <Button\n className=\"btn-preview\"\n color={previewBtn.color ? previewBtn.color : \"secondary\"}\n size=\"small\"\n icon={\"eye\"}\n onClick={previewBtnOnClick}\n >\n {previewBtn.label}\n </Button>\n )}\n {btnOne && (\n <Button\n color={btnOne.color ? btnOne.color : \"secondary\"}\n size=\"small\"\n icon={btnOne.icon}\n tooltip={btnOne.tooltip}\n onClick={btnOneOnClick}\n />\n )}\n {btnTwo && (\n <Button\n color={btnTwo.color ? btnTwo.color : \"secondary\"}\n size=\"small\"\n icon={btnTwo.icon}\n tooltip={btnTwo.tooltip}\n onClick={btnTwoOnClick}\n />\n )}\n </div>\n </div>\n );\n }\n}\n\nexport default ListItem;\n","import React, { Component } from \"react\";\nclass SuccessMessage extends Component {\n constructor(props) {\n super(props);\n this.state = {\n isShown: false,\n timer: 4000,\n timerOnHide: null,\n };\n }\n\n componentDidMount() {\n this.handleShowSuccess(4000);\n }\n\n handleMouseOver = () => {\n this.handleShowSuccess(0, true);\n };\n\n handleMouseOut = () => {\n this.handleShowSuccess(2000);\n };\n\n handleShowSuccess = (timer, onHover) => {\n if (!onHover) {\n this.setState({\n timerOnHide: setTimeout(() => {\n this.props.handleShowSuccess(false);\n }, timer),\n });\n } else {\n this.setState({\n timerOnHide: clearTimeout(this.state.timerOnHide),\n });\n }\n };\n\n render() {\n const {\n label = null,\n linkLabel = null,\n handleOnClick = null,\n showPreviewLink = null,\n hideIcon = null,\n } = this.props || {};\n return (\n <React.Fragment>\n <div\n className=\"success-message\"\n onMouseOver={this.handleMouseOver}\n onMouseOut={this.handleMouseOut}\n >\n {!hideIcon && <i className=\"icon icon-check-small\" />}\n <span className={`success-message__description ${showPreviewLink ? \"has-view\" : \"\"}`}>\n {label ? label : \"Success update\"}\n </span>\n {showPreviewLink && (\n <a className=\"success-message__link\" onClick={handleOnClick}>\n {linkLabel ? linkLabel : \"View\"}\n </a>\n )}\n </div>\n </React.Fragment>\n );\n }\n}\n\nexport default SuccessMessage;\n","import React, { Component } from \"react\";\nimport Button from \"../Button\";\n\nclass CustomFilter extends Component {\n\n handleCloseFilter = () => {\n let bodyContainer;\n let backToTop;\n if (document) {\n bodyContainer = document.querySelector(\".body-container\");\n bodyContainer.classList.toggle(\"is-filter-shown\");\n\n backToTop = document.querySelector(\".back-to-top__wrapper\");\n if (backToTop) {\n backToTop.style.right = \"36px\";\n }\n }\n this.props.onCloseFilter(false);\n }\n\n updateBodyClass = (showFilter) => {\n let bodyContainer = document.querySelector(\".body-container\");\n let backToTop = document.querySelector(\".back-to-top__wrapper\");\n if (showFilter) {\n bodyContainer.classList.add(\"is-filter-shown\");\n if (backToTop) {\n backToTop.style.right = \"296px\";\n }\n } else {\n bodyContainer.classList.remove(\"is-filter-shown\");\n }\n }\n\n render() {\n const {\n showFilter\n } = this.props;\n this.updateBodyClass(showFilter);\n return (\n <div className={`custom-filter ${(showFilter) ? \"\" : \"is-hidden\"}`}>\n <div className=\"custom-filter__blur\"\n onClick={this.handleCloseFilter}\n >\n </div>\n <div className=\"custom-filter__content\">\n <div className=\"custom-filter__header\">\n <div className=\"custom-filter__title\">\n {\"Filter\"}\n </div>\n <div className=\"custom-filter__btn is-tablet\">\n <Button\n size=\"small\"\n color=\"tertiary\"\n icon=\"close\"\n onClick={this.handleCloseFilter}\n />\n </div>\n <div className=\"custom-filter__btn is-desktop\">\n <Button\n size=\"small\"\n color=\"tertiary\"\n icon=\"log-out\"\n onClick={this.handleCloseFilter}\n />\n </div>\n </div>\n <div className=\"custom-filter__wrapper\">\n {this.props.children}\n </div>\n </div>\n\n </div>\n );\n }\n}\n\nexport default CustomFilter;\n","import React from \"react\";\n\nconst NoResultMessage = props => {\n const {\n label = null,\n description = null\n } = props;\n\n return (\n <div className=\"no-result-message\">\n <div className=\"no-result-message__details\">\n <div className=\"no-result-message__label\">\n {label ? label : \"No results\"}\n </div>\n {description &&\n <div className=\"no-result-message__description\">\n {description}\n </div>\n }\n </div>\n </div>\n );\n};\n\nexport default NoResultMessage;\n","export const hideBackToTop = (isHidden) => {\n if (document) {\n const backToTopWrapper = document.querySelector(\".js-back-to-top\");\n if (backToTopWrapper) {\n if (isHidden) {\n backToTopWrapper.classList.add(\"is-hidden\");\n } else {\n backToTopWrapper.classList.remove(\"is-hidden\");\n }\n }\n }\n}","import React, { Component, Fragment } from \"react\";\r\nimport { getWorkboxItems } from \"../../../../api/WorkflowAPI\";\r\nimport { Text } from \"@sitecore-jss/sitecore-jss-react\";\r\nimport Button from \"../../../Base/Button\";\r\nimport Select from \"react-select\";\r\nimport {\r\n disableBodyScroll,\r\n enableBodyScroll,\r\n} from \"../../../../helper/ScrollHelper\";\r\nimport { getDuration, getStartDate } from \"../../../../helper/DateHelper\";\r\nimport { addClassLazyload } from \"../../../../helper/AddClassLazyloadHelper\";\r\nimport { scrollToTop } from \"../../../../helper/ScrollHelper\";\r\nimport axios from \"axios\";\r\nimport logoPlaceholder from \"../../../../assets/img/logoPlaceholder.png\";\r\nimport ReactPaginate from \"react-paginate\";\r\nimport FormModal from \"../../../Base/FormModal\";\r\nimport Popup from \"../../../Base/Popup\";\r\nimport ListItem from \"../../../Base/ListItem\";\r\nimport SuccessMessage from \"../../../Base/SuccessMessage\";\r\nimport CustomFilter from \"../../../Base/CustomFilter\";\r\nimport FilterRadioButton from \"../../../Base/CustomFilter/FilterRadioButton\";\r\nimport NoResultMessage from \"../../../Base/NoResultMessage\";\r\nimport PopupPreview from \"../../../Base/Popup/PopupPreview\";\r\nimport CustomIframe from \"../../../Base/CustomIframe\";\r\nimport PopupAction from \"../../../Base/Popup/PopupAction\";\r\nimport { hideBackToTop } from \"../../../../helper/HideBackToTopHelper\";\r\n\r\nclass FeatureRetailerPortalApprovals extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n activePageNum: 0,\r\n totalPageNumber: null,\r\n totalResults: null,\r\n showPagination: false,\r\n showLoader: true,\r\n showRejectModal: false,\r\n showApproveModal: false,\r\n showPreviewModal: false,\r\n showFilter: false,\r\n modalMessage: null,\r\n hideIcon: true,\r\n workboxItems: null,\r\n selectedItems: null,\r\n selectedItem: null,\r\n typeOptions: null,\r\n centreOptions: null,\r\n storeOptions: null,\r\n filterType: \"all\",\r\n filterStore: \"all\",\r\n filterCentre: \"all\",\r\n isDocumentReady: false,\r\n previewTitle: null,\r\n previewUrl: null,\r\n previewUrlList: [],\r\n previewItemId: null,\r\n filteredItems: null,\r\n itemCount: null,\r\n itemTotal: null,\r\n showBulkPreview: false,\r\n retailerLogo: null,\r\n rejectMessage: \"\",\r\n paginationRange: 7,\r\n isDesktop: true,\r\n };\r\n }\r\n\r\n getData = async (params) => {\r\n this.setState({\r\n showLoader: true,\r\n });\r\n\r\n try {\r\n const response = await getWorkboxItems(params);\r\n if (response && response.data) {\r\n const { WorkboxItems, TotalPageNumber, TotalResults } = response.data;\r\n this.setState(\r\n {\r\n workboxItems: WorkboxItems,\r\n filteredItems: WorkboxItems,\r\n totalPageNumber: TotalPageNumber.value,\r\n totalResults: TotalResults.value,\r\n itemTotal: TotalResults.value,\r\n showPagination: true,\r\n showLoader: false,\r\n },\r\n () => {\r\n this.handleChecked();\r\n this.getFilters();\r\n this.handleItems(0);\r\n }\r\n );\r\n }\r\n } catch (e) {\r\n console.error(\r\n (\"Get Workbox Items Error: \" + e &&\r\n e.response &&\r\n e.response.statusText) ||\r\n \"\"\r\n );\r\n }\r\n };\r\n\r\n getOptions = (items, value, index, options, all) => {\r\n if (value && value.indexOf(\"Store\") === 0) {\r\n value = \"Store\";\r\n }\r\n if (value && !items.includes(value)) {\r\n items.push(value);\r\n }\r\n if (index === this.state.workboxItems.length - 1) {\r\n options.push({ value: \"all\", label: all });\r\n items\r\n .sort((a, b) => (a > b ? 1 : -1))\r\n .map((el) => options.push({ value: el, label: el }));\r\n }\r\n };\r\n\r\n getFilters = () => {\r\n const { workboxItems } = this.state;\r\n let typeItems = [];\r\n let centreItems = [];\r\n let storeItems = [];\r\n let typeOptions = [];\r\n let centreOptions = [];\r\n let storeOptions = [];\r\n if (workboxItems && workboxItems.length) {\r\n workboxItems.map((el, index) => {\r\n const { Type, Centre, Store } = el;\r\n this.getOptions(\r\n typeItems,\r\n Type && Type.value,\r\n index,\r\n typeOptions,\r\n \"All\"\r\n );\r\n this.getOptions(\r\n centreItems,\r\n Centre && Centre.value,\r\n index,\r\n centreOptions,\r\n \"All centres\"\r\n );\r\n this.getOptions(\r\n storeItems,\r\n Store && Store.value,\r\n index,\r\n storeOptions,\r\n \"All stores\"\r\n );\r\n });\r\n this.setState({ typeOptions, centreOptions, storeOptions });\r\n }\r\n };\r\n\r\n componentDidMount() {\r\n if (window) {\r\n this.handleResize();\r\n window.addEventListener(\"resize\", this.handleResize);\r\n }\r\n if (document) {\r\n this.setState({ isDocumentReady: true });\r\n }\r\n let params = {\r\n pageNumber: 1,\r\n };\r\n this.getData(params);\r\n }\r\n\r\n handleResize = () => {\r\n if (window.outerWidth >= 768) {\r\n this.setState({\r\n paginationRange: 7,\r\n });\r\n } else {\r\n this.setState({\r\n paginationRange: 3,\r\n });\r\n }\r\n if (window.outerWidth >= 992) {\r\n this.setState({\r\n isDesktop: true,\r\n });\r\n } else {\r\n this.setState({\r\n isDesktop: false,\r\n });\r\n }\r\n };\r\n\r\n handleFilter = (filter, id) => {\r\n this.setState({ [filter]: id, activePageNum: 0 }, () => {\r\n this.uncheckAll();\r\n this.handleItems(0);\r\n addClassLazyload(\"approvals-item-container\");\r\n scrollToTop();\r\n });\r\n };\r\n\r\n handleItems = (selected) => {\r\n const {\r\n filterCentre,\r\n filterStore,\r\n filterType,\r\n workboxItems,\r\n totalPageNumber,\r\n } = this.state;\r\n\r\n let unfiltered = workboxItems;\r\n if (unfiltered) {\r\n if (filterType !== \"all\") {\r\n unfiltered = unfiltered.filter(\r\n (item) =>\r\n item && item.Type && item.Type.value.indexOf(filterType) === 0\r\n );\r\n }\r\n if (filterCentre !== \"all\") {\r\n unfiltered = unfiltered.filter(\r\n (item) => item && item.Centre && item.Centre.value === filterCentre\r\n );\r\n }\r\n if (filterStore !== \"all\") {\r\n unfiltered = unfiltered.filter(\r\n (item) => item && item.Type && item.Store.value === filterStore\r\n );\r\n }\r\n const currentPage = selected + 1;\r\n const until = currentPage * 10;\r\n const from = until - 10;\r\n const list = unfiltered.slice(from, until);\r\n\r\n const listLength = unfiltered && unfiltered.length;\r\n let itemCount = from + 1 + \" – \" + until;\r\n if (currentPage == totalPageNumber || listLength < 11) {\r\n itemCount = from + 1 + \" – \" + listLength;\r\n }\r\n if (listLength == 1) {\r\n itemCount = 1;\r\n }\r\n\r\n this.setState(\r\n {\r\n filteredItems: list,\r\n itemCount,\r\n totalPageNumber: listLength ? Math.ceil(listLength / 10) : null,\r\n itemTotal: listLength || null,\r\n },\r\n () => this.handleChecked()\r\n );\r\n }\r\n };\r\n\r\n uncheckAll = () => {\r\n let checks = document.querySelectorAll(\r\n \".approvals-item-container input:checked\"\r\n );\r\n for (let i = 0; i < checks.length; i++) {\r\n checks[i].checked = false;\r\n }\r\n this.setState({ selectedItem: null, selectedItems: null });\r\n };\r\n\r\n handleSelected = (value, checked) => {\r\n let items = this.state.selectedItems || [];\r\n if (checked) {\r\n items.push(value);\r\n } else {\r\n items.map((item, index) =>\r\n item === value ? items.splice(index, 1) : null\r\n );\r\n }\r\n this.setState({ selectedItems: items });\r\n };\r\n\r\n handleChecked = () => {\r\n let items = this.state.selectedItems || [];\r\n if (items && items.length) {\r\n let checks = document.querySelectorAll(\".approvals-item-container input\");\r\n for (let i = 0; i < checks.length; i++) {\r\n let isMatch;\r\n items.map((item) => {\r\n if (item === checks[i].value) {\r\n isMatch = true;\r\n }\r\n });\r\n if (isMatch) {\r\n checks[i].checked = true;\r\n } else checks[i].checked = false;\r\n }\r\n }\r\n };\r\n\r\n renderRejectModal = () => {\r\n disableBodyScroll();\r\n const { selectedItems, selectedItem, rejectMessage } = this.state;\r\n let itemCount = selectedItems && selectedItems.length;\r\n let items = selectedItems;\r\n if (selectedItem && selectedItem.length) {\r\n itemCount = selectedItem.length;\r\n items = selectedItem;\r\n }\r\n const message =\r\n \"You’re about to reject \" +\r\n itemCount +\r\n \" piece\" +\r\n (itemCount === 1 ? \"\" : \"s\") +\r\n \" of content.<br>\" +\r\n \"This cannot be undone.\";\r\n return (\r\n <Popup>\r\n <PopupAction\r\n label={{ value: `Are you sure?` }}\r\n description={{ value: message }}\r\n icon=\"trash-2\"\r\n iconBgColor=\"#d83b42\"\r\n secondaryBtn=\"Cancel\"\r\n secondaryBtnOnClick={() =>\r\n this.setState(\r\n {\r\n showRejectModal: false,\r\n selectedItem: null,\r\n rejectMessage: \"\",\r\n },\r\n () => enableBodyScroll()\r\n )\r\n }\r\n primaryBtn=\"Reject\"\r\n primaryBtnOnClick={() => this.rejectItems(items)}\r\n primaryBtnColor=\"red\"\r\n withRejectMessage={true}\r\n rejectMessage={rejectMessage}\r\n onRejectMessageChange={(value) =>\r\n this.setState({ rejectMessage: value })\r\n }\r\n />\r\n </Popup>\r\n );\r\n };\r\n\r\n renderApproveModal = () => {\r\n const { modalMessage, hideIcon } = this.state;\r\n return (\r\n <SuccessMessage\r\n label={modalMessage}\r\n hideIcon={hideIcon}\r\n handleShowSuccess={(showApproveModal) => {\r\n this.setState({\r\n showApproveModal,\r\n });\r\n }}\r\n />\r\n );\r\n };\r\n\r\n rejectItems = async (items) => {\r\n const { rejectMessage } = this.state;\r\n const formData = new FormData();\r\n formData.append(\"itemIds\", items);\r\n formData.append(\"comments\", rejectMessage);\r\n const url = \"/api/sitecore/workflowapproval/RejectItems\";\r\n this.setState({\r\n rejectMessage: \"\",\r\n });\r\n\r\n try {\r\n let response = await axios({\r\n method: \"POST\",\r\n url,\r\n data: formData,\r\n });\r\n if (response && response.data) {\r\n const { IsSuccess = null, Message = null } = response.data;\r\n if (IsSuccess && IsSuccess.value) {\r\n this.setState(\r\n {\r\n showRejectModal: false,\r\n hideIcon: true,\r\n modalMessage: Message.value,\r\n showApproveModal: true,\r\n showLoader: true,\r\n },\r\n () => {\r\n enableBodyScroll();\r\n this.resetState();\r\n }\r\n );\r\n } else {\r\n this.setState(\r\n {\r\n showRejectModal: false,\r\n hideIcon: true,\r\n modalMessage: Message.value,\r\n showApproveModal: true,\r\n },\r\n () => {\r\n enableBodyScroll();\r\n }\r\n );\r\n }\r\n } else {\r\n this.setState(\r\n {\r\n showRejectModal: false,\r\n hideIcon: true,\r\n modalMessage: \"Something went wrong. Please try again.\",\r\n showApproveModal: true,\r\n },\r\n () => {\r\n enableBodyScroll();\r\n }\r\n );\r\n }\r\n scrollToTop(true);\r\n } catch (e) {\r\n this.setState(\r\n {\r\n showRejectModal: false,\r\n hideIcon: true,\r\n modalMessage: \"Something went wrong. Please try again.\",\r\n showApproveModal: true,\r\n },\r\n () => {\r\n enableBodyScroll();\r\n scrollToTop(true);\r\n }\r\n );\r\n }\r\n };\r\n\r\n approveItems = async () => {\r\n const { selectedItems, selectedItem } = this.state;\r\n let items = selectedItems;\r\n if (selectedItem && selectedItem.length) {\r\n items = selectedItem;\r\n }\r\n const formData = new FormData();\r\n formData.append(\"itemIds\", items);\r\n\r\n const url = \"/api/sitecore/workflowapproval/ApproveItems\";\r\n\r\n try {\r\n let response = await axios({\r\n method: \"POST\",\r\n url,\r\n data: formData,\r\n });\r\n if (response && response.data) {\r\n const { IsSuccess = null, Message = null } = response.data;\r\n if (IsSuccess && IsSuccess.value) {\r\n this.setState(\r\n {\r\n modalMessage: Message.value,\r\n showApproveModal: true,\r\n hideIcon: false,\r\n showLoader: true,\r\n },\r\n () => this.resetState()\r\n );\r\n } else {\r\n this.setState({\r\n modalMessage: Message.value,\r\n showApproveModal: true,\r\n });\r\n }\r\n } else {\r\n this.setState({\r\n modalMessage: \"Something went wrong. Please try again.\",\r\n showApproveModal: true,\r\n });\r\n }\r\n scrollToTop(true);\r\n } catch (e) {\r\n this.setState({\r\n modalMessage: \"Something went wrong. Please try again.\",\r\n showApproveModal: true,\r\n },\r\n () => scrollToTop(true)\r\n );\r\n }\r\n };\r\n\r\n resetState = () => {\r\n this.setState(\r\n {\r\n activePageNum: 0,\r\n showFilter: false,\r\n selectedItems: null,\r\n selectedItem: null,\r\n typeOptions: null,\r\n centreOptions: null,\r\n storeOptions: null,\r\n filterType: \"all\",\r\n filterStore: \"all\",\r\n filterCentre: \"all\",\r\n modalIcon: true,\r\n previewTitle: null,\r\n previewUrl: null,\r\n previewItemId: null,\r\n filteredItems: null,\r\n itemCount: null,\r\n itemTotal: null,\r\n },\r\n () => {\r\n let params = {\r\n pageNumber: 1,\r\n };\r\n setTimeout(() => this.getData(params), 1000);\r\n }\r\n );\r\n };\r\n\r\n handlePaginationClick = (data) => {\r\n this.setState(\r\n {\r\n activePageNum: data.selected,\r\n },\r\n () => scrollToTop()\r\n );\r\n this.handleItems(data.selected);\r\n addClassLazyload(\"approvals-item-container\");\r\n };\r\n\r\n renderPagination = () => {\r\n const { totalPageNumber, paginationRange } = this.state;\r\n return (\r\n totalPageNumber &&\r\n totalPageNumber > 1 && (\r\n <div className=\"react-paginate-wrapper\">\r\n <ReactPaginate\r\n previousLabel={\r\n <div>\r\n <i className=\"icon icon-chevron-outline-left\" />\r\n <span>Previous</span>\r\n </div>\r\n }\r\n nextLabel={\r\n <div>\r\n <i className=\"icon icon-chevron-outline-right\" />\r\n <span>Next</span>\r\n </div>\r\n }\r\n breakLabel={\"...\"}\r\n breakClassName={\"break-me\"}\r\n pageCount={totalPageNumber}\r\n marginPagesDisplayed={0}\r\n pageRangeDisplayed={paginationRange}\r\n forcePage={this.state.activePageNum}\r\n onPageChange={this.handlePaginationClick}\r\n containerClassName={\"pagination\"}\r\n subContainerClassName={\"pages pagination\"}\r\n activeClassName={\"active\"}\r\n />\r\n </div>\r\n )\r\n );\r\n };\r\n\r\n renderPreviewModal = () => {\r\n const {\r\n previewTitle: title = null,\r\n previewUrl: url = null,\r\n previewItemId: id = null,\r\n showPreviewModal,\r\n previewUrlList,\r\n } = this.state || {};\r\n\r\n if (showPreviewModal) {\r\n disableBodyScroll();\r\n }\r\n\r\n hideBackToTop(showPreviewModal);\r\n\r\n return (\r\n <FormModal\r\n isPreview\r\n isDynamicHeader\r\n showModal={showPreviewModal}\r\n label={title || \"\"}\r\n closeOnClick={() =>\r\n this.setState(\r\n {\r\n showPreviewModal: false,\r\n },\r\n () => enableBodyScroll()\r\n )\r\n }\r\n primaryBtn={\r\n <Fragment>\r\n <span className=\"d-none d-lg-block\">Approve</span>\r\n <i className=\"icon icon-thumbs-up d-block d-lg-none\" />\r\n </Fragment>\r\n }\r\n primaryBtnOnClick={\r\n previewUrlList.length === 0\r\n ? () => {\r\n this.setState(\r\n {\r\n selectedItem: [id],\r\n showPreviewModal: false,\r\n },\r\n () => {\r\n enableBodyScroll();\r\n this.approveItems();\r\n }\r\n );\r\n }\r\n : null\r\n }\r\n redBtn={\r\n <Fragment>\r\n <span className=\"d-none d-lg-block\">Reject</span>\r\n <i className=\"icon icon-thumbs-down d-block d-lg-none\" />\r\n </Fragment>\r\n }\r\n redBtnOnClick={\r\n previewUrlList.length === 0\r\n ? () => {\r\n this.setState(\r\n {\r\n selectedItem: [id],\r\n showPreviewModal: false,\r\n showRejectModal: true,\r\n },\r\n () => {\r\n enableBodyScroll();\r\n }\r\n );\r\n }\r\n : null\r\n }\r\n >\r\n {showPreviewModal && <CustomIframe title={title || \"\"} src={url} />}\r\n </FormModal>\r\n );\r\n };\r\n\r\n renderItems = () => {\r\n const { filteredItems, selectedItems } = this.state;\r\n return (\r\n <div className=\"approvals-item-container\">\r\n {filteredItems && filteredItems.length ? (\r\n filteredItems.map((item, index) => {\r\n const {\r\n ItemId,\r\n Name,\r\n Type,\r\n Centre,\r\n StartDate,\r\n EndDate,\r\n PreviewUrl,\r\n PreviewUrlList,\r\n Store,\r\n Thumbnail,\r\n } = item;\r\n let isSelected = false;\r\n let title = \"\";\r\n let url = \"\";\r\n let globalStoreList = [];\r\n if (selectedItems && selectedItems.length) {\r\n selectedItems.map((selected) =>\r\n selected === ItemId.value ? (isSelected = true) : null\r\n );\r\n }\r\n\r\n if (PreviewUrlList && PreviewUrlList.length > 0) {\r\n const storeList = PreviewUrlList;\r\n const storeItem = storeList[0].Storefronts;\r\n\r\n if (storeList.length === 1 && storeItem.length === 1) {\r\n title =\r\n storeItem[0].Store.value + \" \" + storeList[0].Centre.value;\r\n url = storeItem[0].PreviewUrl.value;\r\n } else {\r\n globalStoreList = PreviewUrlList;\r\n }\r\n } else {\r\n if (Name && Name.value) {\r\n title = Name.value;\r\n } else if (Store && Store.value && Centre && Centre.value) {\r\n title = Store.value + \" \" + Centre.value;\r\n }\r\n if (PreviewUrl && PreviewUrl.value) {\r\n url = PreviewUrl.value;\r\n }\r\n }\r\n\r\n return (\r\n <ListItem\r\n key={`itemId-${index}`}\r\n isSelected={isSelected}\r\n noActionBtn={true}\r\n logoSrc={\r\n Thumbnail && Thumbnail.value && Thumbnail.value.src\r\n ? Thumbnail.value.src\r\n : logoPlaceholder\r\n }\r\n label={{\r\n value: (\r\n <Fragment>\r\n <Text field={Store} />\r\n {Centre && Centre.value && Store && Store.value && \" – \"}\r\n <Text field={Centre} />\r\n </Fragment>\r\n ),\r\n }}\r\n title={{\r\n value: (\r\n <Fragment>\r\n <Text field={Type} />\r\n {Type && Type.value && Name && Name.value && \" – \"}\r\n <Text field={Name} />\r\n </Fragment>\r\n ),\r\n }}\r\n description={{\r\n value:\r\n StartDate && StartDate.value && EndDate && EndDate.value\r\n ? getDuration(StartDate.value, EndDate.value)\r\n : StartDate && StartDate.value\r\n ? getStartDate(StartDate.value)\r\n : null,\r\n }}\r\n previewBtn={{\r\n label:\r\n globalStoreList && globalStoreList.length > 0\r\n ? \"Preview...\"\r\n : \"Preview\",\r\n }}\r\n previewBtnOnClick={() => {\r\n if (globalStoreList && globalStoreList.length > 0) {\r\n this.handleBulkPreviewForm(globalStoreList, Thumbnail);\r\n } else {\r\n this.setState({\r\n showPreviewModal: true,\r\n previewTitle: title,\r\n previewUrl: url,\r\n previewUrlList: globalStoreList,\r\n previewItemId: ItemId.value,\r\n });\r\n }\r\n }}\r\n btnOne={{\r\n icon: \"thumbs-up\",\r\n color: \"primary\",\r\n tooltip: \"Approve\",\r\n }}\r\n btnOneOnClick={() => {\r\n this.setState(\r\n {\r\n selectedItem: [ItemId.value],\r\n },\r\n () => this.approveItems()\r\n );\r\n }}\r\n btnTwo={{\r\n icon: \"thumbs-down\",\r\n color: \"red\",\r\n tooltip: \"Reject\",\r\n }}\r\n btnTwoOnClick={() =>\r\n this.setState({\r\n selectedItem: [ItemId.value],\r\n showRejectModal: true,\r\n })\r\n }\r\n checkboxValue={ItemId.value}\r\n checkboxOnChange={(value, checked) =>\r\n this.handleSelected(value, checked)\r\n }\r\n />\r\n );\r\n })\r\n ) : (\r\n <NoResultMessage label=\"No approvals\" />\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n handleBulkPreviewForm = (globalStoreList, logo) => {\r\n this.setState({\r\n showBulkPreview: true,\r\n previewUrlList: globalStoreList,\r\n retailerLogo:\r\n logo && logo.value && logo.value.src ? logo.value.src : null,\r\n },\r\n () => hideBackToTop(true)\r\n );\r\n };\r\n\r\n handleHeaderIconClick = (clearItem) => {\r\n if (clearItem) {\r\n this.uncheckAll();\r\n } else {\r\n const leftNavWrapper = document.querySelector(\".left-nav\");\r\n const topNavWrapper = document.querySelector(\".top-nav .top-nav-wrapper\");\r\n\r\n if (leftNavWrapper && topNavWrapper) {\r\n leftNavWrapper.classList.add(\"show-nav-mobile\");\r\n topNavWrapper.classList.add(\"show-nav-mobile\");\r\n }\r\n }\r\n };\r\n\r\n renderBulkPreview = () => {\r\n const { previewUrlList, retailerLogo } = this.state;\r\n return (\r\n <div className=\"approvals-modal\">\r\n {previewUrlList && previewUrlList.length > 0 && (\r\n <PopupPreview\r\n previewTitle={\"Preview\"}\r\n previewLogo={retailerLogo}\r\n previewList={previewUrlList}\r\n previewListChildName=\"Storefronts\"\r\n showPreviewModal={() => this.setState({ showBulkPreview: false }, () => hideBackToTop(false))}\r\n />\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n render() {\r\n const {\r\n selectedItems,\r\n showPagination,\r\n showLoader,\r\n showRejectModal,\r\n showApproveModal,\r\n showFilter,\r\n isDocumentReady,\r\n itemTotal,\r\n totalResults,\r\n typeOptions,\r\n centreOptions,\r\n storeOptions,\r\n itemCount,\r\n showBulkPreview,\r\n isDesktop,\r\n filterCentre,\r\n filterStore,\r\n } = this.state;\r\n const hasSelection = selectedItems && selectedItems.length;\r\n return (\r\n <div className={`approvals-container ${showApproveModal ? \"has-success-message\" : \"\"}`}>\r\n {showBulkPreview && this.renderBulkPreview()}\r\n <div className=\"approvals-header\">\r\n <div className=\"approvals-header-icon\">\r\n <button onClick={() => this.handleHeaderIconClick(hasSelection)}>\r\n <i className={`icon icon-${hasSelection ? \"close\" : \"menu\"}`} />\r\n </button>\r\n <div className=\"h1-regular\">\r\n {hasSelection ? selectedItems.length + \" selected\" : \"Approvals\"}\r\n </div>\r\n </div>\r\n <div className=\"approvals-header-actions\">\r\n {hasSelection ? (\r\n <Fragment>\r\n <div\r\n className=\"header-cancel\"\r\n onClick={() => this.uncheckAll()}\r\n >\r\n Cancel\r\n </div>\r\n <Button\r\n color=\"primary\"\r\n size=\"small\"\r\n className=\"approvals-approve-btn\"\r\n onClick={() =>\r\n this.setState({ selectedItem: null }, () =>\r\n this.approveItems()\r\n )\r\n }\r\n >\r\n <span className=\"d-none d-lg-block\">Approve</span>\r\n <i className=\"icon icon-thumbs-up\" />\r\n </Button>\r\n\r\n <Button\r\n color=\"red\"\r\n size=\"small\"\r\n className=\"approvals-reject-btn\"\r\n onClick={() =>\r\n this.setState({\r\n selectedItem: null,\r\n showRejectModal: true,\r\n })\r\n }\r\n >\r\n <span className=\"d-none d-lg-block\">Reject</span>\r\n <i className=\"icon icon-thumbs-down\" />\r\n </Button>\r\n </Fragment>\r\n ) : (\r\n \"\"\r\n )}\r\n {!showFilter && !showLoader && totalResults && totalResults > 1 && (\r\n <Button\r\n color=\"secondary\"\r\n className=\"approvals-filter-btn\"\r\n size=\"small\"\r\n onClick={() => this.setState({ showFilter: true })}\r\n >\r\n Filter\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n {showRejectModal && this.renderRejectModal()}\r\n {isDocumentReady && this.renderPreviewModal()}\r\n {isDocumentReady && (\r\n <CustomFilter\r\n showFilter={showFilter}\r\n onCloseFilter={() => this.setState({ showFilter: false })}\r\n >\r\n <div className=\"custom-filter__group\">\r\n <div className=\"custom-filter__label\">Filter by type</div>\r\n {typeOptions && typeOptions.length ? (\r\n <FilterRadioButton\r\n defaultSelected=\"all\"\r\n options={typeOptions}\r\n radioGroupName=\"approvalType\"\r\n onChange={(id) => this.handleFilter(\"filterType\", id)}\r\n plain\r\n />\r\n ) : (\r\n \"\"\r\n )}\r\n </div>\r\n <div className=\"custom-filter__group\">\r\n <div className=\"custom-filter__label\">Filter by centre</div>\r\n {centreOptions && centreOptions.length ? (\r\n centreOptions.length < 5 && isDesktop ? (\r\n <FilterRadioButton\r\n defaultSelected={filterCentre}\r\n options={centreOptions}\r\n radioGroupName=\"approvalCentre\"\r\n onChange={(id) => this.handleFilter(\"filterCentre\", id)}\r\n plain\r\n />\r\n ) : (\r\n <Select\r\n onChange={(option) => {\r\n this.handleFilter(\"filterCentre\", option.value);\r\n }}\r\n defaultValue={\r\n filterCentre === \"all\"\r\n ? centreOptions[0]\r\n : { value: filterCentre, label: filterCentre }\r\n }\r\n options={centreOptions}\r\n theme={(theme) => ({\r\n ...theme,\r\n colors: {\r\n ...theme.colors,\r\n primary: \"#536760\",\r\n primary25: \"#f5f5f6\",\r\n },\r\n })}\r\n isSearchable={false}\r\n maxMenuHeight={200}\r\n menuPlacement=\"auto\"\r\n />\r\n )\r\n ) : (\r\n \"\"\r\n )}\r\n </div>\r\n <div className=\"custom-filter__group\">\r\n <div className=\"custom-filter__label\">Filter by store</div>\r\n {storeOptions && storeOptions.length ? (\r\n storeOptions.length < 5 && isDesktop ? (\r\n <FilterRadioButton\r\n defaultSelected={filterStore}\r\n options={storeOptions}\r\n radioGroupName=\"approvalStore\"\r\n onChange={(id) => this.handleFilter(\"filterStore\", id)}\r\n plain\r\n />\r\n ) : (\r\n <Select\r\n onChange={(option) => {\r\n this.handleFilter(\"filterStore\", option.value);\r\n }}\r\n defaultValue={\r\n filterStore === \"all\"\r\n ? storeOptions[0]\r\n : { value: filterStore, label: filterStore }\r\n }\r\n options={storeOptions}\r\n theme={(theme) => ({\r\n ...theme,\r\n colors: {\r\n ...theme.colors,\r\n primary: \"#536760\",\r\n primary25: \"#f5f5f6\",\r\n },\r\n })}\r\n isSearchable={false}\r\n maxMenuHeight={200}\r\n menuPlacement=\"auto\"\r\n />\r\n )\r\n ) : (\r\n \"\"\r\n )}\r\n </div>\r\n </CustomFilter>\r\n )}\r\n {showApproveModal && this.renderApproveModal()}\r\n {!showLoader && this.renderItems()}\r\n {!showLoader && itemTotal && itemCount && (\r\n <div className=\"list-count\">\r\n Showing {itemCount} of {itemTotal}\r\n </div>\r\n )}\r\n {showLoader && (\r\n <div className=\"loader-wrapper container\">\r\n <div className=\"loader\" />\r\n </div>\r\n )}\r\n {showPagination && <div>{this.renderPagination()}</div>}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default FeatureRetailerPortalApprovals;\r\n","import React, { Component } from \"react\";\n\nclass RadioButton extends Component {\n constructor(props) {\n super(props);\n this.state = {\n selectedId: null,\n };\n }\n\n handleRadioClick = (id, onChange) => {\n if (onChange) {\n onChange(id);\n }\n\n this.setState({\n selectedId: id\n })\n }\n\n render() {\n const {\n defaultSelected = null,\n options = null,\n radioGroupName = null,\n onChange = null,\n disabled = null,\n plain = null,\n } = this.props || {};\n\n const {\n selectedId\n } = this.state;\n\n return (\n <div>\n {options &&\n options.map((radioList, index) => {\n const {\n Id: id = null,\n Name: name = null,\n Description: description = null,\n Selected: selected = null,\n } = radioList.fields || radioList;\n\n return (\n <div key={`${name.value}-${name.id}-${index}-radiobutton`}\n className={`form-radiobutton ${plain ? \"is-plain\" : \"\"}`}\n >\n <label key={`${name.value}-${name.id}-${index}-radiobutton`}\n className={disabled ? \"disabled\" : \"\"}>\n <input\n type=\"radio\"\n className={selectedId == id.value ? \"is-active\" :\n (!selectedId && ((selected && selected.value === true) || (defaultSelected === id.value))) ? \"is-active\" : \"\"}\n id={id.value}\n name={radioGroupName}\n value={name.value}\n onClick={() => this.handleRadioClick(id.value, onChange)}\n disabled={disabled}\n />\n <span className=\"form-radiobutton__checkmark\"></span>\n <span className=\"form-radiobutton__name\">\n {name.value}\n {description &&\n description.value &&\n <div className=\"form-radiobutton__description\">\n {description.value}\n </div>\n }\n </span>\n\n </label>\n </div>\n );\n })}\n </div>\n )\n }\n};\n\nexport default RadioButton;","import React from \"react\";\nimport { Text } from \"@sitecore-jss/sitecore-jss-react\";\nimport Button from \"../../Base/Button\";\n\nclass PageHeader extends React.Component {\n handleOnClick = () => {\n const leftNavWrapper = document.querySelector(\".left-nav\");\n const topNavWrapper = document.querySelector(\".top-nav .top-nav-wrapper\");\n\n if (leftNavWrapper && topNavWrapper) {\n leftNavWrapper.classList.add(\"show-nav-mobile\");\n topNavWrapper.classList.add(\"show-nav-mobile\");\n }\n };\n\n render() {\n const {\n title = null,\n primaryBtnLabel = null,\n primaryBtnColor = null,\n primaryBtnOnClick = null,\n primaryBtnClassName = null,\n primaryBtnIcon = null,\n secondaryBtnLabel = null,\n secondaryBtnColor = null,\n secondaryBtnOnClick = null,\n secondaryBtnClassName = null,\n } = this.props || {};\n return (\n <div className=\"page-header__wrapper\">\n <div className=\"page-header__hamburger\">\n <button onClick={this.handleOnClick}>\n <i className=\"icon icon-menu\" />\n </button>\n </div>\n <div className=\"page-header__title\">\n <Text field={title} />\n </div>\n <div className=\"page-header__button\">\n {secondaryBtnLabel && secondaryBtnOnClick && (\n <Button\n onClick={secondaryBtnOnClick}\n size=\"small\"\n color={secondaryBtnColor ? secondaryBtnColor : \"secondary\"}\n className={secondaryBtnClassName}\n >\n {secondaryBtnLabel}\n </Button>\n )}\n {primaryBtnLabel && primaryBtnOnClick && (\n <Button\n onClick={primaryBtnOnClick}\n size=\"small\"\n color={primaryBtnColor ? primaryBtnColor : \"primary\"}\n className={primaryBtnClassName}\n icon={primaryBtnIcon}\n >\n {primaryBtnLabel}\n </Button>\n )}\n </div>\n </div>\n );\n }\n}\n\nexport default PageHeader;\n","import React from \"react\";\nimport {\n getArticles,\n} from \"../../../api/ArticlesAPI\";\nimport PageHeader from \"../../Base/PageHeader\";\nimport ListItem from \"../../Base/ListItem\";\nimport NoResultMessage from \"../../Base/NoResultMessage\";\n\n// import GetArticlesResponse from \"./GetArticlesResponse.json\";\n\nclass Articles extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n showLoader: true,\n };\n }\n\n componentDidMount() {\n const {\n isDashboard\n } = this.props\n\n if (!isDashboard) {\n let params = {\n centre: \"\"\n };\n this.getData(params, true);\n } else {\n this.setState({\n showLoader: false,\n });\n }\n }\n\n componentDidUpdate(prevProps) {\n const {\n filterCentre,\n isDashboard\n } = this.props\n\n if (!isDashboard) {\n if ((filterCentre !== prevProps.filterCentre)) {\n let params = {\n centre: filterCentre.toString()\n }\n this.getData(params);\n }\n }\n }\n\n getData = async (params, isOnLoad) => {\n this.setState({\n showLoader: true\n })\n\n try {\n const response = await getArticles(params);\n if (response.status === 200 && response.data) {\n this.props.dataUpdate(response.data);\n let totalResultCount = 0;\n Object.keys(response.data).map(item => {\n totalResultCount = totalResultCount + response.data[item].length\n })\n this.props.dataTotalCount(totalResultCount)\n this.setState({\n showLoader: false,\n });\n }\n }\n catch (e) {\n console.error(\"Get Articles Data Error: \" + e.response.statusText);\n // this.props.dataUpdate(GetArticlesResponse);\n // let totalResultCount = 0;\n // Object.keys(GetArticlesResponse).map(item => {\n // totalResultCount = totalResultCount + GetArticlesResponse[item].length\n // })\n // this.props.dataTotalCount(totalResultCount)\n // this.setState({\n // showLoader: false,\n // });\n }\n };\n\n renderItems = (data, filter) => {\n const {\n LivePromotions,\n ScheduledPromotions,\n AwaitingApprovalPromotions,\n DraftPromotions,\n RejectedPromotions,\n dashboardArticles\n } = data || {};\n\n let renderItemsLayout = \"\";\n\n if (dashboardArticles && dashboardArticles.length > 0) {\n renderItemsLayout =\n this.renderDashboardListItem(dashboardArticles)\n } else {\n let livePomotionLayout = \"\",\n ScheduledPromotionsLayout = \"\",\n AwaitingApprovalPromotionsLayout = \"\",\n DraftPromotionsLayout = \"\",\n RejectedPromotionsLayout = \"\";\n\n if (LivePromotions && LivePromotions.length > 0) {\n livePomotionLayout =\n this.renderListItem(LivePromotions, \"Live\", filter)\n }\n if (ScheduledPromotions && ScheduledPromotions.length > 0) {\n ScheduledPromotionsLayout =\n this.renderListItem(ScheduledPromotions, \"Scheduled\", filter)\n }\n if (AwaitingApprovalPromotions && AwaitingApprovalPromotions.length > 0) {\n AwaitingApprovalPromotionsLayout =\n this.renderListItem(AwaitingApprovalPromotions, \"Awaiting approval\", filter)\n }\n if (DraftPromotions && DraftPromotions.length > 0) {\n DraftPromotionsLayout =\n this.renderListItem(DraftPromotions, \"Draft\", filter)\n }\n if (RejectedPromotions && RejectedPromotions.length > 0) {\n RejectedPromotionsLayout =\n this.renderListItem(RejectedPromotions, \"Rejected\", filter)\n }\n\n if (filter === \"allStatus\") {\n renderItemsLayout =\n <div>\n {livePomotionLayout}\n {ScheduledPromotionsLayout}\n {AwaitingApprovalPromotionsLayout}\n {DraftPromotionsLayout}\n {RejectedPromotionsLayout}\n </div>\n }\n else if (filter === \"LivePromotions\") {\n renderItemsLayout = livePomotionLayout;\n }\n else if (filter === \"ScheduledPromotions\") {\n renderItemsLayout = ScheduledPromotionsLayout;\n }\n else if (filter === \"AwaitingApprovalPromotions\") {\n renderItemsLayout = AwaitingApprovalPromotionsLayout;\n }\n else if (filter === \"DraftPromotions\") {\n renderItemsLayout = DraftPromotionsLayout;\n }\n else if (filter === \"RejectedPromotions\") {\n renderItemsLayout = RejectedPromotionsLayout;\n }\n }\n\n return renderItemsLayout;\n }\n\n renderDashboardListItem = (promotions) => {\n const {\n noSelectedStore\n } = this.props\n\n return (\n <div className=\"list__group\">\n {promotions.map((item, index) => {\n const {\n ItemId,\n Thumbnail,\n CentreName,\n Title,\n Status,\n PreviewURL\n } = item || {};\n\n let imageSrc = \"\";\n\n if (Thumbnail && Thumbnail.value && Thumbnail.value.src) {\n imageSrc = Thumbnail.value.src;\n }\n\n return (\n <ListItem\n key={`articles-list-${ItemId + index}`}\n logoSrc={imageSrc}\n label={CentreName}\n title={Title}\n status={Status}\n previewBtn={{ \"label\": \"Preview\" }}\n previewBtnOnClick={() => {\n this.props.showPreviewModal({\n url: PreviewURL.value,\n title: (Title && Title.value) ? Title.value : \"\",\n })\n }}\n btnOne={{ \"icon\": \"trash-2\", \"tooltip\": \"Delete\" }}\n btnOneOnClick={() => {\n this.props.showDeleteModal({\n id: ItemId.value,\n name: Title.value,\n centreName: CentreName.value,\n status: Status.value,\n })\n }}\n listItemOnClick={(e) => {\n if (noSelectedStore) {\n if (!(/btn|icon/.test(e.target.className))) {\n this.props.showPreviewModal({\n url: PreviewURL.value,\n title: (Title && Title.value) ? Title.value : \"\",\n })\n }\n } else {\n this.handleOnClickList(e, ItemId.value)\n }\n }\n }\n />\n )\n })\n }\n </div>\n )\n }\n\n renderListItem = (promotions, label, filter) => {\n const {\n noSelectedStore\n } = this.props;\n return (\n <div className=\"list__group\">\n {filter === \"allStatus\" &&\n <div className=\"list__header\">\n {label}\n </div>\n }\n {promotions.map((item, index) => {\n const {\n ItemId,\n Thumbnail,\n CentreName,\n Title,\n ShortDescription,\n Status,\n PreviewURL\n } = item || {};\n\n let imageSrc = \"\";\n\n if (Thumbnail && Thumbnail.value && Thumbnail.value.src) {\n imageSrc = Thumbnail.value.src;\n }\n\n return (\n <ListItem\n key={`articles-list-${ItemId + index}`}\n logoSrc={imageSrc}\n label={CentreName}\n title={Title}\n description={ShortDescription}\n status={Status}\n previewBtn={{ \"label\": \"Preview\" }}\n previewBtnOnClick={() => {\n this.props.showPreviewModal({\n url: PreviewURL.value,\n title: (Title && Title.value) ? Title.value : \"\",\n })\n }}\n btnOne={{ \"icon\": \"trash-2\", \"tooltip\": \"Delete\" }}\n btnOneOnClick={() => {\n this.props.showDeleteModal({\n id: ItemId.value,\n name: Title.value,\n centreName: CentreName.value,\n status: Status.value,\n })\n }}\n listItemOnClick={(e) => {\n if (noSelectedStore) {\n if (!(/btn|icon/.test(e.target.className))) {\n this.props.showPreviewModal({\n url: PreviewURL.value,\n title: (Title && Title.value) ? Title.value : \"\",\n })\n }\n } else {\n this.handleOnClickList(e, ItemId.value)\n }\n }\n }\n />\n )\n })\n }\n </div>\n )\n }\n\n renderListCount = (data, totalListCount, filterStatus) => {\n let articleCount = 0;\n Object.keys(data).map(item => {\n if (filterStatus !== \"allStatus\") {\n if (filterStatus === item) {\n articleCount = data[item].length;\n }\n } else {\n articleCount = articleCount + data[item].length;\n }\n })\n return (\n <div>\n {articleCount > 0 ?\n <div className=\"list-count no-pagination\">\n {\"Showing \"}\n {articleCount}\n {\" of \"}\n {totalListCount}\n </div> :\n <NoResultMessage\n label=\"No articles\"\n description=\"Create an article to boost customer engagement with your store!\"\n />\n }\n </div>\n )\n }\n\n handleOnClickList = (e, itemId) => {\n let element = e.target;\n let formModalLabel = \"\";\n document.activeElement.blur();\n if (e.detail > 1) {\n return;\n }\n if ((/btn-form-create|btn__label|icon-plus/.test(element.className))) {\n if(/btn__label/.test(element.className) && !(/btn-form-create/.test(element.parentElement.className))) {\n return;\n }\n formModalLabel =\n <span>\n {\"Website content\"}\n \n {\"»\"}\n \n {\"Articles\"}\n \n {\"»\"}\n \n {\"New article\"}\n </span>\n\n this.props.showFormModal({\n title: formModalLabel,\n itemId: \"\",\n isNewArticle: true\n })\n }\n else if (!(/btn|icon/.test(element.className)) || (/js-btn-edit|icon-edit/.test(element.className))) {\n formModalLabel =\n <span>\n {\"Website content\"}\n \n {\"»\"}\n \n {\"Articles\"}\n \n {\"»\"}\n \n {\"Update article\"}\n </span>\n\n this.props.showFormModal({\n title: formModalLabel,\n itemId: itemId,\n isNewArticle: false\n })\n }\n }\n\n render() {\n const {\n data,\n showFilter,\n filterStatus,\n isDashboard,\n hideFilter,\n totalListCount\n } = this.props;\n const {\n showLoader,\n } = this.state;\n return (\n <div>\n <div className={`articles ${hideFilter ? \"hide-filter\" : \"\"}`}>\n <PageHeader\n title={{ value: \"Articles\" }}\n primaryBtnLabel={\"New article\"}\n primaryBtnClassName=\"btn-form-create\"\n primaryBtnIcon={\"plus\"}\n primaryBtnOnClick={(e) =>\n this.handleOnClickList(e)}\n secondaryBtnLabel={\"Filter\"}\n secondaryBtnClassName=\"filter-btn\"\n secondaryBtnOnClick={() => showFilter()}\n />\n {showLoader &&\n <div className=\"loader-wrapper container\">\n <div className=\"loader\">\n </div>\n </div>\n }\n {!showLoader &&\n this.renderItems(data, filterStatus)\n }\n {!isDashboard &&\n !showLoader &&\n data &&\n this.renderListCount(data, totalListCount, filterStatus)\n }\n </div>\n </div>\n );\n }\n}\n\nexport default Articles;\n","import BaseURL from \"./BaseURL\";\r\n\r\nconst isDev = process.env.REACT_APP_DEV || false;\r\n\r\nexport const getArticles = (params) => {\r\n const endpoint = isDev ? \"/GetArticles\" : \"/article/GetArticles\";\r\n return BaseURL.get(endpoint, { params: { ...params}});\r\n\r\n};\r\n\r\nexport const deleteArticle = params => {\r\n return BaseURL.get(\"/article/DeleteArticle\", { params: { ...params } });\r\n};\r\n\r\nexport const getArticleData = params => {\r\n const endpoint = isDev ? \"/GetCentreStores\" : \"/article/GetArticleData\";\r\n return BaseURL.get(endpoint, { params: { ...params}});\r\n};","import React, { Component } from \"react\";\nimport { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';\nimport Button from \"../Button\";\n\nclass FormImageGallery extends Component {\n constructor(props) {\n super(props);\n this.state = {\n imageFiles: [],\n };\n\n }\n\n componentDidMount() {\n const {\n value\n } = this.props || {}\n\n if (document) {\n let imageFiles = []\n if (value.length > 0) {\n imageFiles = value\n } else {\n let initialValue = {\n name: Date.now().toString(),\n id: Date.now().toString(),\n src: null,\n newItem: true\n }\n imageFiles.push(initialValue)\n }\n this.setState({\n imageFiles\n })\n }\n }\n\n handleAttachments = () => {\n const {\n imageFiles\n } = this.state\n let newImageFiles = imageFiles.filter((el) => {\n return !el.newItem\n })\n this.props.handleAttachments(newImageFiles);\n };\n\n updateFile(imageFile, itemIndex) {\n const { imageFiles } = this.state;\n let listItem = [];\n imageFiles.map((item, index) => {\n if (index == itemIndex) {\n listItem.push(imageFile)\n } else {\n listItem.push(item);\n }\n })\n let newImageFiles = listItem;\n this.setState({\n imageFiles: newImageFiles\n },\n this.handleAttachments\n );\n }\n\n removeFile(index) {\n const {\n imageFiles\n } = this.state;\n imageFiles.splice(index, 1);\n this.setState({\n imageFiles,\n },\n this.handleAttachments\n );\n\n if (imageFiles.length === 0) {\n let initialValue = {\n name: Date.now().toString(),\n id: Date.now().toString(),\n src: null,\n newItem: true\n }\n imageFiles.push(initialValue)\n this.setState({\n imageFiles\n })\n }\n }\n\n handleAddUpload = () => {\n const {\n imageFiles\n } = this.state;\n let newImageFiles = imageFiles;\n let addNewValue = {\n name: Date.now().toString(),\n id: Date.now().toString(),\n src: null,\n newItem: true\n }\n\n newImageFiles.push(addNewValue)\n\n this.setState({\n imageFiles: newImageFiles\n },\n this.handleAttachments)\n\n }\n\n handleOnDragEnd = (result) => {\n const {\n imageFiles\n } = this.state;\n if (!result.destination) return;\n\n const items = Array.from(imageFiles);\n const [reorderedItem] = items.splice(result.source.index, 1);\n items.splice(result.destination.index, 0, reorderedItem);\n\n this.setState({\n imageFiles: items\n },\n this.handleAttachments)\n }\n\n renderGalleryList = (imageGalleryList, placeholder) => {\n return (\n <React.Fragment>\n {imageGalleryList.length > 1 ?\n <DragDropContext onDragEnd={this.handleOnDragEnd}>\n <Droppable droppableId=\"form-image-gallery__drag-drop\">\n {(provided) => (\n <div className=\"form-image-gallery__drag-drop\" {...provided.droppableProps} ref={provided.innerRef}>\n {imageGalleryList.map((item, index) => {\n const {\n name,\n id,\n src,\n newItem\n } = item || {};\n let imgSrc = \"\";\n if (newItem) {\n imgSrc = \"\"\n }\n else if (item.src) {\n imgSrc = src\n } else {\n imgSrc = URL.createObjectURL(item)\n }\n return (\n <div className=\"form-image-gallery__list--container\" key={id ? id : name + index}>\n <Draggable key={id ? id : name + index} draggableId={id ? id : name + index} index={index}>\n {(provided, imageItem) => (\n <div className={`form-image-gallery__list ${imageItem.isDragging ? \"is-dragging\" : \"\"}`} ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps}>\n <div className=\"form-image-gallery__action\">\n <i className=\"icon icon-move\" />\n <i\n className=\"icon icon-trash\"\n onClick={() => this.removeFile(index)}\n />\n </div>\n {imgSrc ?\n <div className=\"form-image-gallery__image\">\n <img alt={`${name}-${index}`}\n src={imgSrc ? imgSrc : \"\"}\n />\n <label className=\"image-gallery-btn-change\" htmlFor={name + index}>\n <span>\n {\"Change\"}\n </span>\n <input\n id={name + index}\n type=\"file\"\n accept=\"image/png,image/jpeg\"\n onChange={e => this.updateFile(e.target.files[0], index)}\n />\n </label>\n </div>\n :\n < div className=\"form-image-gallery__image\">\n <label className=\"form-image-gallery__upload btn-choose\">\n <span>\n {placeholder ? placeholder : \"Choose image\"}\n </span>\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={e => this.updateFile(e.target.files[0], index)}\n />\n </label>\n </div>\n }\n </div>\n )}\n </Draggable>\n </div>\n );\n })}\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext > :\n imageGalleryList.map((item, index) => {\n const {\n name,\n id,\n src,\n newItem\n } = item || {};\n let imgSrc = \"\";\n if (newItem) {\n imgSrc = \"\"\n }\n else if (item.src) {\n imgSrc = src\n } else {\n imgSrc = URL.createObjectURL(item)\n }\n return (\n <div className=\"form-image-gallery__list\" key={id ? id : name + index}>\n <div className=\"form-image-gallery__action\">\n <i\n className=\"icon icon-trash\"\n onClick={() => this.removeFile(index)}\n />\n </div>\n {imgSrc ?\n <div className=\"form-image-gallery__image\">\n <img alt={`${name}-${index}`}\n src={imgSrc ? imgSrc : \"\"}\n />\n <label className=\"image-gallery-btn-change\" htmlFor={name + index}>\n <span>\n {\"Change\"}\n </span>\n <input\n id={name + index}\n type=\"file\"\n accept=\"image/png,image/jpeg\"\n onChange={e => this.updateFile(e.target.files[0], index)}\n />\n </label>\n </div>\n :\n < div className=\"form-image-gallery__image\">\n <label className=\"form-image-gallery__upload btn-choose\">\n <span>\n {placeholder ? placeholder : \"Choose image\"}\n </span>\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={e => this.updateFile(e.target.files[0], index)}\n />\n </label>\n </div>\n }\n </div>\n )\n })\n }\n </React.Fragment>\n )\n }\n\n renderGuidelines = (isDesktop) => {\n return (\n <div className={`form-image-gallery__guidelines ${isDesktop ? \"is-desktop\" : \"is-tablet\"}`}>\n <div className=\"form-image-gallery__guidelines-text\">\n <div>\n {\"To keep the quality of our websites high, the hero banner image needs to be:\"}\n </div>\n <br />\n <div>\n {\"• At least 1920px wide\"}\n </div>\n <div>\n {\"• At least 1080px tall.\"}\n </div>\n <div>\n {\"• To avoid your image being cropped, use a ratio of 16:9\"}\n </div>\n <div>\n {\"• Accepted file types: JPG, PNG, SVG, WEBP, TIFF\"}\n </div>\n <div>\n {\"• Maximum file size: 5MB\"}\n </div>\n </div>\n </div >\n )\n }\n render() {\n const {\n imageFiles\n } = this.state;\n\n const {\n placeholder,\n error\n } = this.props;\n\n return (\n <div className={`form-group form-image-gallery\n ${error ? \"has-error\" : \"\"} `}>\n {this.renderGuidelines()}\n <div className=\"form-image-gallery__content\">\n {imageFiles &&\n imageFiles.length > 0 &&\n this.renderGalleryList(imageFiles, placeholder)\n }\n <div className=\"form-image-gallery__button\">\n <Button\n color=\"tertiary-grey\"\n size=\"full\"\n onClick={this.handleAddUpload}\n >\n {\"Add image\"}\n </Button>\n </div>\n <div className=\"form__validation-message\">\n {error}\n </div>\n </div>\n {this.renderGuidelines(true)}\n </div>\n );\n }\n}\n\nexport default FormImageGallery;\n","import React from \"react\";\nimport CharacterCount from \"../CharacterCount\";\n\nconst FormInputMultiple = props => {\n const {\n label = null,\n placeholder = null,\n required = null,\n maxLength = null,\n value = null,\n error = null,\n onInputChange = null,\n disabled = null,\n } = props;\n return (\n <div className={`form-group form__input-multiple \n ${error ? \"has-error\" : \"\"}\n `}>\n {(label || required) &&\n <label className=\"form__label\">\n {label}\n {required &&\n <span className=\"form__asterisk\">*</span>\n }\n </label>\n }\n <div className=\"form__input-multiple--details\">\n <textarea\n value={value}\n maxLength={maxLength}\n placeholder={placeholder}\n onChange={e => onInputChange(e.target.value)}\n disabled={disabled}\n />\n <CharacterCount remaining={maxLength - value.length} />\n </div>\n <div className=\"form__validation-message\">\n {error}\n </div>\n </div>\n );\n};\n\nexport default FormInputMultiple;\n","import React from \"react\";\nimport DatePicker from \"react-datepicker\";\nimport \"react-datepicker/dist/react-datepicker.css\";\n\nconst FormDate = props => {\n const {\n icon,\n error,\n label,\n required,\n ...properties\n } = props;\n\n return (\n <div className=\"form__date--details\">\n {(label || required) &&\n <label className=\"form__label\">\n {label}\n {required &&\n <span className=\"form__asterisk\">*</span>\n }\n </label>\n }\n <div className={`form__date-picker--wrapper ${error ? \"error\" : \"no-error\"}`}>\n <DatePicker className=\"form__date-picker--field\" {...properties} />\n {icon &&\n <i className={`icon icon-${icon}`} />\n }\n </div>\n <div className=\"form__validation-message\">\n {error}\n </div>\n </div>\n );\n};\n\nexport default FormDate;\n","import React, { Component } from \"react\";\r\n\r\nclass FormListbox extends Component {\r\n render() {\r\n const {\r\n label = null,\r\n id = null,\r\n options = null,\r\n hint = null,\r\n handleListbox = null,\r\n handleSelect = null,\r\n field = null,\r\n selected = null,\r\n required = null,\r\n error = null,\r\n disabled = null,\r\n } = this.props;\r\n return (\r\n <div className={`form-group form__listbox\r\n ${error ? \"has-error\" : \"\"}\r\n `}>\r\n <div className=\"form__listbox--header\">\r\n {(label || required) &&\r\n <label className=\"form__label\">\r\n {label}\r\n {required &&\r\n <span className=\"form__asterisk\">*</span>\r\n }\r\n </label>\r\n }\r\n <div className={`form__listbox--action\r\n ${disabled ? \"disabled\" : \"\"}\r\n `}>\r\n <div className=\"form__listbox--action-btn\"\r\n onClick={() => {\r\n if (disabled) {\r\n return\r\n }\r\n handleSelect(true, field, options)\r\n }}\r\n >\r\n {\"Select all\"}\r\n </div>\r\n <div className=\"form__listbox--action-btn\"\r\n onClick={() => {\r\n if (disabled) {\r\n return\r\n }\r\n handleSelect(false, field, options)\r\n }}\r\n >\r\n {\"Deselect all\"}\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"form__listbox--field\">\r\n <select\r\n multiple\r\n id={id}\r\n onChange={() => handleListbox(id, field)}\r\n disabled={disabled}\r\n value={selected}\r\n >\r\n {options.map((item, index) => {\r\n const {\r\n value = null,\r\n name = null\r\n } = item;\r\n\r\n let optionLayout = \"\";\r\n\r\n if (value && name) {\r\n optionLayout =\r\n <option key={`list-${value}-${index}`}\r\n value={value}\r\n >\r\n {name}\r\n </option>\r\n }\r\n return optionLayout;\r\n })}\r\n </select>\r\n </div>\r\n\r\n <div className=\"form__validation-message\">\r\n {error}\r\n </div>\r\n\r\n {hint && (\r\n <div className=\"form__hint\">\r\n <i className=\"icon icon-info\" />\r\n <span>{hint}</span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default FormListbox;\r\n","import React, { Component } from \"react\";\nimport FormCheckbox from \"../FormCheckbox\";\n\nclass FormListCheckbox extends Component {\n render() {\n const {\n label = null,\n id = null,\n options = null,\n handleListbox = null,\n handleSelect = null,\n field = null,\n selected = null,\n required = null,\n error = null,\n disabled = null,\n } = this.props;\n return (\n <div className={`form-group form__listcheckbox\n ${error ? \"has-error\" : \"\"}\n `}>\n <div className=\"form__listcheckbox--header\">\n {(label || required) &&\n <label className=\"form__label\">\n {label}\n {required &&\n <span className=\"form__asterisk\">*</span>\n }\n </label>\n }\n <div className={`form__listcheckbox--action\n ${disabled ? \"disabled\" : \"\"}\n `}>\n <div className=\"form__listcheckbox--action-btn\"\n onClick={() => {\n if (disabled) {\n return\n }\n handleSelect(true, field, options)\n }}\n >\n {\"Select all\"}\n </div>\n <div className=\"form__listcheckbox--action-btn\"\n onClick={() => {\n if (disabled) {\n return\n }\n handleSelect(false, field, options)\n }}\n >\n {\"Deselect all\"}\n </div>\n </div>\n </div>\n <div className=\"form__listcheckbox--field\">\n {options &&\n options.length > 0 &&\n <div id={id} className=\"form__listcheckbox--option\">\n {options.map((item, index) => {\n const {\n name,\n value\n } = item || {}\n\n return (\n <FormCheckbox\n key={id + index}\n label={name}\n value={value}\n onCheckboxChange={() => handleListbox(id, field)}\n plain\n checked={selected.length > 0 &&\n selected.indexOf(\n value\n ) > -1\n }\n />\n )\n })}\n </div>\n }\n </div>\n\n <div className=\"form__validation-message\">\n {error}\n </div>\n </div>\n );\n }\n}\n\nexport default FormListCheckbox;\n","import React from \"react\";\n\nconst Checkbox = props => {\n const {\n label,\n value,\n checked,\n disabled,\n onCheckboxChange\n } = props || {};\n \n return (\n <React.Fragment>\n <label className={`checkbox-container ${disabled ? \"\":\"\"}`}>\n {label}\n <input\n value={value ? value : \"\"}\n onChange={e => onCheckboxChange(e.target.checked)}\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n />\n <span className=\"checkmark\" />\n </label>\n </React.Fragment>\n );\n};\n\nexport default Checkbox;\n","import React from \"react\";\n\nconst FormErrorMessage = props => {\n const {\n error\n } = props;\n\n const containsLoginError =\n error.indexOf('User session is Ended') !== -1 ||\n error.indexOf(\"Parameter 'retailerId' is null\") !== -1;\n\n return (\n <div className=\"form__error\">\n <i className=\"icon icon-alert-triangle\" />\n <div className=\"form__error--message\">\n <div>\n {error}\n {containsLoginError && (\n <>\n <br />\n <a href=\"/\" target=\"_blank\" className=\"form__error--message-link\">Please login again</a> in the new tab, selected a retailer and submit this form again.\n </>\n )}\n </div>\n </div>\n </div>\n );\n};\nexport default FormErrorMessage;\n","import React from \"react\";\nimport { RichText } from \"@sitecore-jss/sitecore-jss-react\";\n\nclass FormImageUpload extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n file: props.value ? props.value : null,\n preview: props.value ? props.value : null,\n errorMessage: null,\n hasImageUpload: false\n };\n }\n\n handleFileUpload = () => {\n this.props.handleFileUpload(this.state.file);\n };\n\n setFile = file => {\n if (file && file.type.indexOf(\"image\") !== -1) {\n this.setState(\n {\n file,\n preview: URL.createObjectURL(file),\n },\n this.handleFileUpload\n );\n\n } else {\n alert(\"Please select an image\");\n }\n };\n\n removeFile = () => {\n this.setState(\n {\n file: null,\n preview: null\n },\n this.handleFileUpload\n );\n }\n\n renderGuideLines = (isDesktop) => {\n const {\n guidelines,\n guidelinesOne,\n guidelinesTwo,\n guidelinesThree,\n } = this.props;\n\n return (\n <div className={`form__image-upload--guidelines ${isDesktop ? \"is-desktop\" : \"is-tablet\"}`}>\n <div className=\"form__image-upload--guidelines-text\">\n <div>\n {guidelines}\n </div>\n {(guidelinesOne || guidelinesTwo || guidelinesThree) &&\n <br />\n }\n <div>\n {guidelinesOne}\n </div>\n <div>\n {guidelinesTwo}\n </div>\n <div>\n {guidelinesThree}\n </div>\n <div>\n {\"• Accepted file types: JPG, PNG, SVG, WEBP, TIFF\"}\n </div>\n <div>\n {\"• Maximum file size: 5MB\"}\n </div>\n </div>\n </div>\n )\n }\n\n render() {\n const {\n preview,\n } = this.state;\n const {\n required,\n label,\n type,\n placeholder,\n error,\n removeImage = false\n } = this.props;\n return (\n <div className=\"form__container\">\n {(label || required) &&\n <label className=\"form__header\">\n {label}\n {required &&\n <span className=\"form__asterisk\">*</span>\n }\n </label>\n }\n <div className={`form-group form__image-upload\n ${type ? type : \"\"}\n ${error ? \"has-error\" : \"\"}\n `}>\n {this.renderGuideLines()}\n <div className=\"form__image-upload--details\">\n {preview &&\n <div className=\"form__image-upload--image\">\n <img\n src={preview ? preview : placeholder}\n alt={type ? type + \"image\" : label + \" upload\"}\n />\n\n <label className={`form__image-upload--btn btn-change ${removeImage ? \"has-delete-btn\" : \"\"}`}>\n {\"Change\"}\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={e => this.setFile(e.target.files[0])}\n />\n </label>\n {removeImage &&\n <button className=\"form__image-upload--btn btn-delete\"\n onClick={() => this.removeFile()}>\n <i className=\"icon icon-trash-2\" />\n </button>\n }\n </div>\n }\n {!preview &&\n <div className=\"form__image-upload--image\">\n <label className=\"form__image-upload--btn btn-choose\">\n <span>\n {placeholder ? placeholder : \"Choose image\"}\n </span>\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={e => this.setFile(e.target.files[0])}\n />\n </label>\n </div>\n }\n </div>\n {this.renderGuideLines(true)}\n <div className=\"form__validation-message\">\n {error}\n </div>\n </div>\n </div>\n );\n }\n}\n\nexport default FormImageUpload;\n","const imageMimeTypes = [\r\n 'image/webp',\r\n 'image/tiff',\r\n 'image/svg+xml',\r\n 'image/jpeg',\r\n 'image/jpg',\r\n 'image/png'\r\n ];\r\n\r\nexport const validateImageSize = (file, max = 5000000) => {\r\n return file.size <= max;\r\n}\r\n\r\nexport const validateImageType = (file, allowedTypes = imageMimeTypes) => {\r\n return allowedTypes.includes(file.type);\r\n}\r\n\r\n","import { get } from \"lodash\";\nimport { validateImageType, validateImageSize } from \"./ImageUploadHelper\";\n\nconst isEmpty = value => {\n return value ? false : true;\n};\n\nconst isObject = (value) => typeof value === 'object' && value !== null;\n\n\nexport const validate = (state, removeValidate) => {\n let list = [\n // {\n // name: \"selectedStore\",\n // value: state.selectedStore,\n // rules: \"required\"\n // },\n {\n name: \"articleName\",\n value: state.articleName,\n rules: \"required\"\n },\n {\n name: \"subheading\",\n value: state.subheading,\n rules: \"required\"\n },\n {\n name: \"publishDate\",\n value: state.publishDate,\n rules: \"required\"\n },\n {\n name: \"body\",\n value: state.body,\n rules: \"required\"\n },\n {\n name: \"heroImage\",\n value: state.heroImage,\n rules: \"required\"\n },\n {\n name: \"selectedStores\",\n value: state.selectedStores,\n rules: \"required\"\n },\n {\n name: \"selectedCategories\",\n value: state.selectedCategories,\n rules: \"required-array\"\n },\n {\n name: \"thumbnailFileType\",\n value: state.thumbnail,\n rules: \"image-file-type\"\n },\n {\n name: \"heroImageFileType\",\n value: state.heroImage,\n rules: \"image-file-type\"\n },\n {\n name: \"imageGalleryFileType\",\n value: state.imageGallery,\n rules: \"image-gallery-file-type\"\n },\n {\n name: \"thumbnailFileSize\",\n value: state.thumbnail,\n rules: \"image-file-size\"\n },\n {\n name: \"heroImageFileSize\",\n value: state.heroImage,\n rules: \"image-file-size\"\n },\n {\n name: \"socialFeedFileSize\",\n value: state.socialFeedImage,\n rules: \"image-file-size\"\n },\n {\n name: \"socialStoryFileSize\",\n value: state.socialStoryImage,\n rules: \"image-file-size\"\n },\n {\n name: \"imageGalleryFileSize\",\n value: state.imageGallery,\n rules: \"image-gallery-file-size\"\n }\n ];\n\n let result = {};\n list.forEach(element => {\n if (removeValidate.indexOf(element.name) > -1) {\n return;\n }\n if (element.rules === \"required\") {\n if (isEmpty(element.value)) {\n result[element.name] = \"Required\";\n }\n\n if (element.value && element.value.length && element.value.length < 1) {\n result[element.name] = \"Required\";\n }\n }\n\n if (element.rules === \"required-richtext\") {\n if (isEmpty(element.value)) {\n result[element.name] = \"Required\";\n }\n\n if (element.value && element.value.trim().length < 8) {\n result[element.name] = \"Required\";\n }\n }\n\n if (element.rules === \"required-array\") {\n if (element.value && !element.value.length && element.value.length < 1) {\n result[element.name] = \"Required\";\n }\n }\n\n if (element.rules === 'image-file-type') {\n if(isObject(element.value)){ \n const imageValidity = validateImageType(element.value);\n if (imageValidity === false) {\n result[element.name] = \"Invalid file type\";\n }\n } else {}\n }\n\n if (element.rules === 'image-file-size') {\n if(isObject(element.value)){ \n const imageValidity = validateImageSize(element.value);\n if (imageValidity === false) {\n result[element.name] = \"Your file is too large. File upload image size limit is 5MB\";\n }\n }\n }\n\n if (element.rules === 'image-gallery-file-type') {\n if (!isEmpty(element.value)) {\n let invalidImages = [];\n element.value.forEach(elem => {\n if(isObject(elem)){\n let imageValidity = validateImageType(elem);\n if(imageValidity === false) {\n invalidImages.push(elem);\n }\n }\n });\n if (invalidImages.length > 0) {\n result[element.name] = \"Invalid file type\";\n }\n }\n }\n\n if (element.rules === 'image-gallery-file-size') {\n if (!isEmpty(element.value)) {\n let invalidImages = [];\n element.value.forEach(elem => {\n if(isObject(elem)){\n let imageValidity = validateImageSize(elem);\n if(imageValidity === false) {\n invalidImages.push(elem);\n }\n }\n });\n if (invalidImages.length > 0) {\n result[element.name] = \"A file is too large. File upload image size limit is 5MB\";\n }\n }\n }\n\n //Other Validation Rules\n });\n return result;\n};\n\nexport const formDataFields = {\n itemId: null,\n selectedStore: null,\n categoryTag: \"\",\n articleName: \"\",\n subheading: \"\",\n body: \"\",\n publishDate: \"\",\n endDate: \"\",\n hidePublishDate: false,\n heroImage: \"\",\n thumbnail: \"\",\n imageGalleryChecker: [],\n imageGallery: [],\n selectedStores: [],\n selectedSpecialPromotion: [],\n selectedCategories: [],\n itemIds: []\n};\n\nexport const setArticleData = data => {\n return {\n itemId: data.ItemId.value,\n heroImage: get(data, \"HeroImage.value.src\", null),\n thumbnail: get(data, \"Thumbnail.value.src\", null),\n articleName: data.Title.value,\n subheading: data.Subheading.value,\n body: data.Body.value,\n publishDate: data.PublishDate.value,\n endDate: data.EndDate.value,\n hidePublishDate: data.HidePublishDate.value,\n categoryTag: get(data, \"CategoryTag.value\", null),\n selectedSpecialPromotion: data.LinkedSpecialHolidays.map(\n el => el.HolidayId.value\n ),\n selectedCategories: data.LinkCategories.map(\n el => el.CategoryId.value\n ),\n imageGalleryChecker: data.ImageGallery.map(el => el.Id.value),\n imageGallery: data.ImageGallery.map(el => {\n return {\n name: el.Name.value,\n id: el.Id.value,\n src: el.Src.value\n };\n })\n };\n};\n\nexport const buildFormData = postData => {\n const formData = new FormData();\n Object.keys(postData).forEach(function (key) {\n if (key === \"itemId\") {\n return;\n }\n\n if (key === \"publishDate\" || (key === \"endDate\" && postData[key])) {\n return formData.append(key, new Date(postData[key]).toISOString());\n }\n\n if (key === \"imageGalleryChecker\") {\n if (postData[\"imageGallery\"].length > 0) {\n return postData[\"imageGallery\"].map((item) =>\n formData.append(key, item.id ? item.id : null)\n );\n }\n return;\n }\n\n if (key === \"imageGallery\") {\n if (postData[key].length > 0) {\n let newimageGallery = postData[key].filter(item => item.size)\n return newimageGallery.map((file) => formData.append(key, file));\n }\n return;\n }\n\n if (key === \"selectedSpecialPromotion\" && postData[key].length) {\n return postData[key].map(promotion => formData.append(key, promotion));\n }\n\n if (key === \"selectedCategories\" && postData[key].length) {\n return postData[key].map(category => formData.append(key, category));\n }\n\n if (key === \"heroImage\" || key === \"thumbnail\") {\n if (typeof postData[key] !== \"string\") {\n return formData.append(key, postData[key]);\n }\n return;\n }\n\n if (key === \"selectedStores\" && postData[key].length) {\n return postData[key].map(storeId => formData.append(key, storeId));\n }\n\n if (key === \"itemIds\" && postData[key].length) {\n return postData[key].map(itemId => formData.append(key, itemId));\n }\n\n return formData.append(key, postData[key]);\n });\n\n return formData;\n};\n","import BaseURL, { DevURL} from \"./BaseURL\";\n\nconst isDev = process.env.REACT_APP_DEV || false;\n\n\nexport const getPromotions = () => {\n const endpoint = isDev ? \"/GetPromotions\" : \"/store/GetEvents\";\n return BaseURL.get(endpoint);\n};\n\nexport const getCentreStores = params => {\n const endpoint = isDev ? \"/GetCentreStores\" : \"/promotion/GetCentreStores\";\n return BaseURL.get(endpoint, { params: { ...params } });\n\n};\n\nexport const getDashboardPromotions = () => {\n const endpoint = isDev ? \"/GetDashboardPromotions\" : \"/promotion/GetDashboardPromotions\";\n return BaseURL.get(endpoint);\n\n};\n\nexport const getCategoriesAndHolidays = params => {\n const endpoint = isDev ? \"/GetCategoriesAndHolidays\" : \"/promotion/GetCategoriesAndHolidays\";\n return BaseURL.get(endpoint, { params: { ...params } });\n\n};\n\nexport const getPromotionData = params => {\n const endpoint = isDev ? \"/GetCentreStores\" : \"/promotion/GetPromotionData\";\n return BaseURL.get(endpoint, { params: { ...params } });\n};\n","import React from \"react\";\nimport { Text } from \"@sitecore-jss/sitecore-jss-react\";\nimport axios from \"axios\";\nimport Loadable from \"react-loadable\";\nimport logoPlaceholder from \"../../../../assets/img/logoPlaceholder.png\";\nimport TagManager from \"react-gtm-module\";\nimport FormImageGallery from \"../../../Base/FormImageGallery\";\nimport FormInput from \"../../../Base/FormInput\";\nimport FormInputMultiple from \"../../../Base/FormInputMultiple\";\nimport FormDate from \"../../../Base/FormDate\";\nimport FormCheckbox from \"../../../Base/FormCheckbox\";\nimport FormListbox from \"../../../Base/FormListbox\";\nimport FormListCheckbox from \"../../../Base/FormListCheckbox\";\nimport Checkbox from \"../../../Base/Checkbox\";\nimport FormErrorMessage from \"../../../Base/FormErrorMessage\";\nimport FormImageUpload from \"../../../Base/FormImageUpload\";\nimport PopupPreview from \"../../../Base/Popup/PopupPreview\";\nimport { get } from \"lodash\";\nimport {\n validate,\n setArticleData,\n buildFormData,\n formDataFields,\n} from \"../../../../helper/ArticleHelper\";\nimport {\n getCentreStores,\n getCategoriesAndHolidays,\n} from \"../../../../api/PromotionAPI\";\nimport { getArticleData } from \"../../../../api/ArticlesAPI\";\n\n// import getCentreStoresResponseApi from \"./jsonResponse/getCentreStoresResponseApi.json\";\n// import getCategoriesAndHolidaysApi from \"./jsonResponse/getCategoriesAndHolidaysApi.json\";\n// import getArticleDataResponse from \"./jsonResponse/getArticleDataResponse.json\";\n// import saveArticleResponse from \"./jsonResponse/saveArticleResponse.json\";\n// import saveBulkArticleResponse from \"./jsonResponse/saveBulkArticleResponse.json\";\n\nconst RichTextEditor = Loadable({\n loader: () => import(\"../../../Base/RichTextEditor\"),\n loading: () => null,\n});\n\nclass FormArticles extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n mode: \"new\",\n showModal: false,\n formError: {},\n centreStoreList: [],\n categories: [],\n holidays: [],\n formData: { ...formDataFields },\n showImageGallery: false,\n disableBtn: true,\n showSaveHint: false,\n showErrorMessage: false,\n formErrorMessage: \"\",\n imageGalleryHolder: [],\n articlePreviewUrl: \"\",\n articlePreviewTitle: \"\",\n articleList: [],\n getArticleDataReady: false,\n previewBulkLogo: \"\",\n articleIdList: [],\n retailerId: null\n };\n }\n\n componentDidMount() {\n const { itemId } = this.props;\n if (itemId) {\n this.getData(itemId);\n } else {\n this.getCentreStoreList();\n }\n this.getCategoriesAndHolidays();\n this.handleFormData();\n }\n\n getData = async (itemId) => {\n try {\n let response = await getArticleData({ itemId });\n if (response.status === 200 && response.data) {\n let articleData = setArticleData(response.data.Article);\n\n this.setState({\n mode: \"edit\",\n getArticleDataReady: true,\n formData: { ...this.state.formData, ...articleData },\n showImageGallery:\n articleData.imageGallery && articleData.imageGallery.length > 0\n ? true\n : false,\n });\n }\n } catch (e) {\n console.error(\"Get Article Data Error: \" + e.response.statusText);\n this.setState({\n getArticleDataReady: true,\n });\n // if (itemId) {\n // let articleData = setArticleData(getArticleDataResponse.Article);\n\n // this.setState({\n // mode: \"edit\",\n // getArticleDataReady: true,\n // formData: { ...this.state.formData, ...articleData },\n // showImageGallery: (articleData.imageGallery && articleData.imageGallery.length > 0) ? true : false\n // });\n // }\n }\n };\n\n getCategoriesAndHolidays = async () => {\n try {\n let response = await getCategoriesAndHolidays();\n if (response.status === 200 && response.data) {\n let categoryListData = response.data.Categories;\n let holidayListData = response.data.GlobalSpecialHoliday;\n let categoryList = [];\n let holidayList = [];\n if (categoryListData.length > 0) {\n categoryListData.forEach((el) =>\n categoryList.push({\n name: el.CategoryName.value,\n value: el.CategoryId.value,\n })\n );\n }\n if (holidayListData.length > 0) {\n holidayListData.forEach((el) =>\n holidayList.push({\n name: el.HolidayName.value,\n value: el.HolidayId.value,\n })\n );\n }\n this.setState({\n categories: categoryList,\n holidays: holidayList,\n });\n }\n } catch (e) {\n console.error(\n \"Get Categories And Holidays Error: \" + e.response.statusText\n );\n // let categoryListData = getCategoriesAndHolidaysApi.Categories;\n // let holidayListData = getCategoriesAndHolidaysApi.GlobalSpecialHoliday;\n // let categoryList = [];\n // let holidayList = [];\n // if (categoryListData.length > 0) {\n // categoryListData.forEach((el) =>\n // categoryList.push({\n // name: el.CategoryName.value,\n // value: el.CategoryId.value,\n // })\n // );\n // }\n // if (holidayListData.length > 0) {\n // holidayListData.forEach((el) =>\n // holidayList.push({\n // name: el.HolidayName.value,\n // value: el.HolidayId.value,\n // })\n // );\n // }\n // this.setState({\n // categories: categoryList,\n // holidays: holidayList,\n // });\n }\n };\n\n getCentreStoreList = async () => {\n try {\n let response = await getCentreStores();\n if (response.status === 200 && response.data) {\n if (response.data.IsSuccess.value) {\n this.setState({\n centreStoreList: get(response.data, \"CentreStoreList\", []),\n retailerId: get(response.data, \"Retailer.RetailerId.value\", \"\"),\n getArticleDataReady: true,\n });\n }\n }\n } catch (e) {\n console.error(\"Get centre stores data error: \" + e.response.statusText);\n this.setState({\n getArticleDataReady: true,\n });\n // this.setState({\n // centreStoreList: get(getCentreStoresResponseApi, \"CentreStoreList\", []),\n // retailerId: get(getCentreStoresResponseApi, \"Retailer.RetailerId.value\", \"\"),\n // getArticleDataReady: true,\n // });\n }\n };\n\n handleListbox = (id, field, isCheckbox) => {\n const { formData } = this.state;\n let options;\n let selected = [];\n if (document) {\n if (isCheckbox) {\n options = document.querySelectorAll(`#${id} input:checked`);\n } else {\n options = document.querySelectorAll(`#${id} option:checked`);\n }\n if (options) {\n for (let i = 0; i < options.length; i++) {\n selected.push(options[i].value);\n }\n }\n }\n this.setState({\n formData: {\n ...formData,\n [field]: selected,\n },\n });\n };\n\n handleSelect = (isSelect, field, options) => {\n const { formData } = this.state;\n this.setState({\n formData: {\n ...formData,\n [field]: isSelect ? options.map((el) => el.value) : [],\n },\n });\n };\n\n handleStoreListCheckbox = (value, selectAllStores) => {\n const { formData, centreStoreList } = this.state;\n\n if (value === \"0\") {\n let allStores = [];\n centreStoreList.map((centre) => {\n centre.StoreList.map((store) => {\n allStores.push(store.StoreItemId.value);\n });\n });\n\n this.setState({\n formData: {\n ...formData,\n selectedStores: selectAllStores ? allStores : [],\n },\n });\n } else if (formData.selectedStores.indexOf(value) > -1) {\n this.setState({\n formData: {\n ...formData,\n selectedStores: formData.selectedStores.filter((el) => el !== value),\n },\n });\n } else {\n this.setState({\n formData: {\n ...formData,\n selectedStores: [...formData.selectedStores, value],\n },\n });\n }\n };\n\n handleFormUpdate = (value) => {\n this.setState({\n formData: {\n ...this.state.formData,\n ...value,\n },\n });\n };\n\n validateForm = async () => {\n let formError = validate(\n this.state.formData,\n this.state.mode === \"edit\" ? [\"selectedRetailer\"] : []\n );\n let response;\n if (Object.entries(formError).length !== 0) {\n this.setState({\n formError,\n showErrorMessage: true,\n formErrorMessage: \"Please fill out all mandatory fields marked below\",\n });\n this.triggerBackToTop();\n response = {\n isSuccess: false,\n };\n } else {\n this.setState({\n formError,\n });\n response = await this.saveForm().then((result) => {\n if (result.isSuccess) {\n return { isSuccess: true };\n }\n });\n }\n return response;\n };\n\n saveForm = async () => {\n const { formData, mode, articleIdList } = this.state;\n var timezoneId = new Date().getTimezoneOffset();\n const url = \"/api/sitecore/article/SaveArticle\";\n let data = buildFormData({\n ...formData,\n timeZoneId: timezoneId,\n });\n\n this.setState(\n {\n showSaveHint: true,\n disableBtn: true,\n },\n this.handleFormData\n );\n\n try {\n let response = await axios({\n method: \"POST\",\n url,\n data,\n params: {\n ...(mode === \"edit\"\n ? { itemId: formData.itemId }\n : { itemId: articleIdList.toString() }),\n },\n config: { headers: { \"Content-Type\": \"multipart/form-data\" } },\n });\n\n if (response) {\n if (response.data.IsSuccess.value && mode === \"new\") {\n const articleList = response.data.ArticleList;\n const articlesItem = articleList[0].Articles;\n const itemIds = this.extractItemIds(articleList);\n let previewBulkLogo;\n\n this.setGoogleAnalytics(articleList);\n\n if (response.data.RetailerLogo && response.data.RetailerLogo.value) {\n previewBulkLogo = response.data.RetailerLogo.value;\n }\n\n if (articleList.length === 1 && articlesItem.length === 1) {\n this.setState(\n {\n formData: {\n ...formData,\n itemIds,\n },\n showSaveHint: false,\n disableBtn: false,\n showErrorMessage: false,\n articlePreviewUrl: articlesItem[0].PreviewUrl.value,\n // articlePreviewTitle: articlesItem[0].Store.value,\n articlePreviewTitle: formData.articleName,\n articleList: articleList,\n previewBulkLogo: \"\",\n articleIdList: this.setArticleIdList(articleList),\n },\n this.handleFormData\n );\n } else {\n this.setState(\n {\n formData: {\n ...formData,\n itemIds,\n },\n showSaveHint: false,\n disableBtn: false,\n showErrorMessage: false,\n articlePreviewUrl: \"\",\n articlePreviewTitle: \"\",\n articleList: articleList,\n previewBulkLogo,\n articleIdList: this.setArticleIdList(articleList),\n },\n this.handleFormData\n );\n }\n\n return {\n isSuccess: true,\n };\n } else if (response.data.IsSuccess.value && mode === \"edit\") {\n const articleList = response.data.ArticleList[0];\n const article = articleList.Articles[0];\n const articlePreviewUrl = article.PreviewUrl.value;\n const articlePreviewTitle =\n article.Store.value + \" \" + articleList.Centre.value;\n this.setState(\n {\n formData: {\n ...formData,\n itemIds: [`${article.ItemId.value}`],\n },\n showErrorMessage: false,\n showSaveHint: false,\n disableBtn: false,\n articlePreviewUrl,\n articlePreviewTitle: formData.articleName,\n },\n this.handleFormData\n );\n\n return {\n isSuccess: true,\n };\n } else {\n this.setState(\n {\n showSaveHint: false,\n disableBtn: true,\n showErrorMessage: true,\n formErrorMessage:\n \"Article Not Saved \" + response.data.Message.value,\n },\n this.handleFormData\n );\n\n this.triggerBackToTop();\n return {\n isSuccess: false,\n };\n }\n }\n } catch (e) {\n console.error(\"Article Save Error: \" + e.response.statusText);\n this.setState({\n showErrorMessage: true,\n formErrorMessage: \"Article Save Error: \" + e.response.statusText,\n });\n this.triggerBackToTop();\n return {\n isSuccess: false,\n };\n\n // Condition on mode === new\n // const articleList = saveBulkArticleResponse.ArticleList;\n // const articlesItem = articleList[0].Articles;\n // const itemIds = this.extractItemIds(articleList);\n // let previewBulkLogo;\n\n // if (saveBulkArticleResponse.RetailerLogo && saveBulkArticleResponse.RetailerLogo.value) {\n // previewBulkLogo = saveBulkArticleResponse.RetailerLogo.value;\n // }\n // this.setState({\n // formData: {\n // ...formData,\n // itemIds\n // },\n // showSaveHint: false,\n // disableBtn: false,\n // },\n // this.handleFormData\n // );\n\n // if (articleList.length === 1 && articlesItem.length === 1) {\n // this.setState({\n // formData: {\n // ...formData,\n // itemIds\n // },\n // showSaveHint: false,\n // disableBtn: false,\n // showErrorMessage: false,\n // articlePreviewUrl: articlesItem[0].PreviewUrl.value,\n // articlePreviewTitle: formData.articleName,\n // articleList: articleList,\n // previewBulkLogo: \"\",\n // articleIdList: this.setArticleIdList(articleList)\n // },\n // this.handleFormData\n // );\n // } else {\n // this.setState({\n // formData: {\n // ...formData,\n // itemIds\n // },\n // showSaveHint: false,\n // disableBtn: false,\n // showErrorMessage: false,\n // articlePreviewUrl: \"\",\n // articlePreviewTitle: \"\",\n // articleList: articleList,\n // previewBulkLogo,\n // articleIdList: this.setArticleIdList(articleList)\n // },\n // this.handleFormData\n // );\n // }\n\n // return {\n // isSuccess: true\n // };\n }\n };\n\n submitForm = async () => {\n const {\n formData,\n mode,\n articlePreviewUrl,\n articlePreviewTitle,\n } = this.state;\n const url = \"/api/sitecore/article/SubmitArticle\";\n let data = buildFormData({\n itemIds: mode === \"edit\" ? [`${formData.itemId}`] : formData.itemIds,\n });\n\n try {\n let response = await axios({\n method: \"POST\",\n url,\n data,\n config: { headers: { \"Content-Type\": \"multipart/form-data\" } },\n });\n\n if (response) {\n if (response.data.IsSuccess.value) {\n this.setState({\n showErrorMessage: false,\n });\n return {\n isSuccess: true,\n articlePreviewUrl: mode === \"edit\" ? articlePreviewUrl : \"\",\n articlePreviewTitle: mode === \"edit\" ? articlePreviewTitle : \"\",\n };\n } else {\n this.setState({\n showErrorMessage: true,\n formErrorMessage:\n \"Article Not Submitted \" + response.data.Message.value,\n });\n return {\n isSuccess: false,\n };\n }\n }\n } catch (e) {\n console.error(\"Article Submit Error: \" + e.response.statusText);\n this.setState({\n showErrorMessage: true,\n formErrorMessage: \"Article Submit Error: \" + e.response.statusText,\n });\n this.triggerBackToTop();\n return {\n isSuccess: false,\n };\n\n // return {\n // isSuccess: true,\n // articlePreviewUrl: mode === \"edit\" ? articlePreviewUrl : \"\",\n // articlePreviewTitle: mode === \"edit\" ? articlePreviewTitle : \"\",\n // };\n }\n };\n\n triggerBackToTop = () => {\n let backToTop;\n if (document) {\n backToTop = document.querySelector(\".form__modal--back-to-top-button\");\n if (backToTop) {\n backToTop.click();\n }\n }\n };\n\n setGoogleAnalytics = (articleList) => {\n articleList.map((item) => {\n const { Centre, Articles } = item;\n Articles.map((article) => {\n console.log(Centre.value, article.Store.value);\n TagManager.dataLayer({\n dataLayer: {\n event: \"createdArticles\",\n articleCentre: Centre && Centre.value,\n articleRetailer: article && article.Store && article.Store.value,\n },\n dataLayerName: \"dataLayer\",\n });\n });\n });\n };\n\n setArticleIdList = (articleList) => {\n let articleIdList = [];\n\n if (articleList.length > 0) {\n articleList.map((item) => {\n const { Articles } = item;\n\n if (Articles.length > 0) {\n Articles.map((item) => {\n const { ItemId } = item;\n\n if (ItemId && ItemId.value) {\n articleIdList.push(ItemId.value);\n }\n });\n }\n });\n }\n\n return articleIdList;\n };\n\n extractItemIds = (centreList) => {\n let itemIds = [];\n centreList.map((center) => {\n center.Articles.map((article) => {\n itemIds.push(article.ItemId.value);\n });\n });\n return itemIds;\n };\n\n handlePreviewForm = () => {\n this.setState({\n showModal: true,\n });\n };\n\n renderModal = () => {\n const { articleList, showModal, previewBulkLogo } = this.state;\n\n const { articleName } = this.state.formData || {};\n return (\n <div className=\"article-modal\">\n {articleList && articleList.length > 0 && (\n <PopupPreview\n previewTitle={\"Preview\"}\n previewLogo={previewBulkLogo}\n previewList={articleList}\n previewListChildName=\"Articles\"\n previewFormLabel={articleName}\n btnLabel={\"Submit\"}\n btnOnClick={() => {\n let submitBtn = document.querySelector(\".article-submit-btn\");\n if (submitBtn) {\n submitBtn.click();\n }\n }}\n showPreviewModal={() => this.setState({ showModal: false })}\n />\n )}\n </div>\n );\n };\n\n handleFormData = () => {\n const {\n showSaveHint,\n disableBtn,\n articlePreviewUrl,\n articlePreviewTitle,\n } = this.state;\n this.props.handleFormData(\n showSaveHint,\n disableBtn,\n articlePreviewUrl,\n articlePreviewTitle,\n this.validateForm,\n this.handlePreviewForm,\n this.submitForm\n );\n };\n\n buildCentreStoreList = (centreStoreList) => {\n const { type, formData } = this.state;\n\n return (\n <div className=\"form__multiple-stores\">\n <div className=\"form__multiple-stores--header\">\n <label className=\"form__label\">\n {`Publish this article for the multiple centres`}\n </label>\n <div className=\"form__multiple-stores--action\">\n <div\n className=\"form__multiple-stores--action-btn\"\n onClick={() => this.handleStoreListCheckbox(\"0\", true)}\n >\n {\"Select all\"}\n </div>\n <div\n className=\"form__multiple-stores--action-btn\"\n onClick={() => this.handleStoreListCheckbox(\"0\", false)}\n >\n {\"Deselect all\"}\n </div>\n </div>\n </div>\n <div className=\"form__multiple-stores--content\">\n {centreStoreList.map((centre, index) => {\n const { CentreName, CentreIcon, StoreList } = centre;\n return (\n <div key={`centreStoreList-container-${index}`} className=\"row\">\n <div className=\"col col-12 col-md-6\">\n <div className=\"form__multiple-stores--logo\">\n {CentreIcon && CentreIcon.value ? (\n <img\n alt={`CentreIcon-${index}`}\n src={logoPlaceholder}\n data-src={CentreIcon.value}\n className=\"lazyload\"\n />\n ) : (\n <div className=\"no-image\" />\n )}\n </div>\n <div className=\"form__multiple-stores--label\">\n {CentreName.value}\n </div>\n </div>\n <div className=\"col col-12 col-md-6\">\n {StoreList.map((store, index) => {\n const { StoreItemId, StoreName } = store;\n return (\n <FormCheckbox\n key={`store-${StoreItemId.value}-${index}`}\n value={StoreItemId.value}\n label={StoreName.value}\n checked={\n formData.selectedStores.indexOf(StoreItemId.value) >\n -1\n }\n onCheckboxChange={(value) =>\n this.handleStoreListCheckbox(value)\n }\n plain\n />\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n };\n\n render() {\n const {\n itemId = null\n } = this.props\n const {\n formError,\n formData,\n categories,\n showModal,\n centreStoreList,\n holidays,\n showImageGallery,\n showErrorMessage,\n formErrorMessage,\n imageGalleryHolder,\n getArticleDataReady,\n articleIdList,\n retailerId\n } = this.state;\n return (\n <div className=\"article-form\">\n {showModal && this.renderModal()}\n {showErrorMessage && <FormErrorMessage error={formErrorMessage} />}\n <div className=\"form__container\">\n <FormInput\n title\n type=\"text\"\n placeholder={`Article title`}\n label=\"Article Name\"\n value={formData.articleName}\n required\n error={formError.articleName}\n onInputChange={(articleName) =>\n this.handleFormUpdate({ articleName })\n }\n />\n </div>\n <div className=\"form__container\">\n <label className=\"form__header\">{`Article duration`}</label>\n <div\n className={`form-group form__date--container\n ${formError.publishDate || formError.endDate\n ? \"has-error\"\n : \"\"\n }\n `}\n >\n <div className=\"form__date--wrapper\">\n <div className=\"form__date--duration--wrapper\">\n <FormDate\n required\n label=\"Publish from\"\n icon=\"calendar\"\n placeholderText=\"MM/DD/YYYY\"\n showTimeSelect\n timeCaption=\"Time\"\n timeFormat=\"HH:mm\"\n timeIntervals={5}\n dateFormat=\"d MMM yyyy - h:mmaa\"\n value={formData.publishDate && new Date(formData.publishDate)}\n error={formError.publishDate}\n selected={\n formData.publishDate && new Date(formData.publishDate)\n }\n onChange={(publishDate) =>\n this.handleFormUpdate({ publishDate })\n }\n />\n <div className=\"form__date--divider\" />\n <FormDate\n label=\"Publish until\"\n icon=\"calendar\"\n placeholderText=\"MM/DD/YYYY\"\n showTimeSelect\n timeCaption=\"Time\"\n timeFormat=\"HH:mm\"\n timeIntervals={5}\n dateFormat=\"d MMM yyyy - h:mmaa\"\n value={formData.endDate && new Date(formData.endDate)}\n selected={formData.endDate && new Date(formData.endDate)}\n onChange={(endDate) => this.handleFormUpdate({ endDate })}\n />\n </div>\n <Checkbox\n checked={formData.hidePublishDate}\n label={\"Hide publish date\"}\n onCheckboxChange={(hidePublishDate) => {\n // console.log(hidePublishDate)\n // console.log(formData)\n this.handleFormUpdate({ hidePublishDate })\n\n }}\n />\n </div>\n </div>\n </div>\n\n <div className=\"form__container\">\n <label className=\"form__header\">{`Article description`}</label>\n <FormInputMultiple\n label=\"Sub title\"\n placeholder=\"Provide a short description\"\n required\n value={formData.subheading}\n maxLength={120}\n error={formError.subheading}\n onInputChange={(subheading) =>\n this.handleFormUpdate({ subheading })\n }\n />\n {getArticleDataReady && (\n <RichTextEditor\n required\n width=\"max\"\n label={\"Description\"}\n placeholder=\"Provide a description\"\n initialValue={formData.body}\n error={formError.body}\n onInputChange={(body) => this.handleFormUpdate({ body })}\n retailerId={retailerId}\n itemId={itemId}\n promotionType={\"Article\"}\n />\n )}\n </div>\n\n {((categories && categories.length > 0) ||\n (holidays && holidays.length > 0)) && (\n <div className=\"form__container\">\n <label className=\"form__header\">{\"Meta information\"}</label>\n {categories && categories.length > 0 && (\n <div>\n <div className=\"is-desktop\">\n <FormListbox\n label=\"Category\"\n id=\"LB_Cat_Desktop\"\n required\n error={formError.selectedCategories}\n options={categories}\n field=\"selectedCategories\"\n selected={formData.selectedCategories}\n hint=\"Press [ctrl] + click to select multiple\"\n handleListbox={(id, field) => this.handleListbox(id, field)}\n handleSelect={(isSelect, field, options) =>\n this.handleSelect(isSelect, field, options)\n }\n />\n </div>\n <div className=\"is-tablet\">\n <FormListCheckbox\n label=\"Category\"\n id=\"LB_Cat_Mobile\"\n required\n error={formError.selectedCategories}\n options={categories}\n field=\"selectedCategories\"\n selected={formData.selectedCategories}\n handleListbox={(id, field) => this.handleListbox(id, field, true)}\n handleSelect={(isSelect, field, options) =>\n this.handleSelect(isSelect, field, options)\n }\n />\n </div>\n </div>\n\n )}\n {holidays && holidays.length > 0 && (\n <div>\n <div className=\"is-desktop\">\n <FormListbox\n label=\"Special promotions\"\n id=\"LB_SH_Desktop\"\n options={holidays}\n field=\"selectedSpecialPromotion\"\n selected={formData.selectedSpecialPromotion}\n hint=\"Press [ctrl] + click to select multiple\"\n handleListbox={(id, field) => this.handleListbox(id, field)}\n handleSelect={(isSelect, field) =>\n this.handleSelect(isSelect, field, holidays)\n }\n />\n </div>\n <div className=\"is-tablet\">\n <FormListCheckbox\n label=\"Special promotions\"\n id=\"LB_SH_Mobile\"\n options={holidays}\n field=\"selectedSpecialPromotion\"\n selected={formData.selectedSpecialPromotion}\n handleListbox={(id, field) => this.handleListbox(id, field, true)}\n handleSelect={(isSelect, field, options) =>\n this.handleSelect(isSelect, field, options)\n }\n />\n </div>\n </div>\n )}\n </div>\n )}\n\n <div className={`form__container\" ${formError.heroImage || formError.thumbnail || formError.heroImageFileType || formError.thumbnailFileType\n ? \"has-error\"\n : \"\"\n }`}>\n {getArticleDataReady && (\n <FormImageUpload\n required\n type=\"hero\"\n label={\"Hero image\"}\n guidelines={\n \"To keep the quality of our websites high, the hero banner image needs to be:\"\n }\n guidelinesOne={\"• At least 1920px wide\"}\n guidelinesTwo={\"• At least 1080px tall.\"}\n guidelinesThree={\n \"• To avoid your image being cropped, use a ratio of 16:9\"\n }\n error={formError.heroImage || formError.heroImageFileType || formError.heroImageFileSize}\n value={formData.heroImage}\n handleFileUpload={(heroImage) =>\n this.handleFormUpdate({ heroImage })\n }\n />\n )}\n </div>\n\n <div className=\"form__container\">\n {getArticleDataReady && (\n <FormImageUpload\n label={\"Thumbnail image\"}\n guidelines={\"The hero thumbnail image needs to be:\"}\n guidelinesOne={\"• At least 800px wide\"}\n guidelinesTwo={\"• At least 800px tall.\"}\n guidelinesThree={\n \"• To avoid your image being cropped, use a ratio of 1:1\"\n }\n error={formError.thumbnail || formError.thumbnailFileType || formError.thumbnailFileSize}\n value={formData.thumbnail}\n handleFileUpload={(thumbnail) =>\n this.handleFormUpdate({ thumbnail })\n }\n />\n )}\n </div>\n\n <div className=\"form__container\">\n <label className=\"form__header\">{\"Image gallery\"}</label>\n <Checkbox\n checked={showImageGallery}\n label={\"Display an additional image gallery?\"}\n onCheckboxChange={(showImageGallery) => {\n this.setState({\n showImageGallery,\n });\n if (showImageGallery) {\n this.handleFormUpdate({ imageGallery: imageGalleryHolder });\n } else {\n this.handleFormUpdate({ imageGallery: [] });\n }\n }}\n />\n {showImageGallery && (\n <FormImageGallery\n value={formData.imageGallery}\n error={formError.imageGalleryFileType || formError.imageGalleryFileSize}\n handleAttachments={(imageGallery) => {\n this.setState({\n imageGalleryHolder: imageGallery,\n });\n this.handleFormUpdate({ imageGallery });\n }}\n />\n )}\n </div>\n\n {centreStoreList && centreStoreList.length > 0 && (\n <div\n className={`form__container ${articleIdList.length > 0 ? \"is-hidden\" : \"\"\n }`}\n >\n <label className=\"form__header\">{`Article visibility`}</label>\n {this.buildCentreStoreList(centreStoreList)}\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default FormArticles;\n","export const removeActiveState = () => {\n let activeItem = document.querySelector(\".js-list-item.active\");\n if (activeItem) {\n activeItem.classList.remove(\"active\");\n }\n}","import React from 'react';\nimport Select from \"react-select\";\nimport RadioButton from \"../../../Base/RadioButton\";\nimport FormModal from \"../../../Base/FormModal\";\nimport Popup from \"../../../Base/Popup\";\nimport PopupAction from \"../../../Base/Popup/PopupAction\";\nimport SuccessMessage from \"../../../Base/SuccessMessage\";\nimport Articles from \"../../../Modules/Articles\";\nimport {\n deleteArticle,\n} from \"../../../../api/ArticlesAPI\";\nimport CustomFilter from '../../../Base/CustomFilter';\nimport CustomIframe from '../../../Base/CustomIframe';\nimport FormArticles from \"../../../Modules/Forms/FormArticles\";\nimport { addClassLazyload } from \"../../../../helper/AddClassLazyloadHelper\";\nimport { scrollToTop } from \"../../../../helper/ScrollHelper\";\nimport { removeActiveState } from \"../../../../helper/RemoveActiveState\";\nimport { hideBackToTop } from \"../../../../helper/HideBackToTopHelper\";\n\nclass FeatureRetailerPortalArticleListing extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n isDocumentReady: false,\n isWindowReady: false,\n content: null,\n articles: null,\n showPreviewModal: false,\n showFormModal: false,\n showDeleteModal: false,\n previewModalData: null,\n formModalData: null,\n deleteModalData: null,\n showFilter: false,\n statusOption: [\n {\n Id: {\n value: \"allStatus\"\n },\n Name: {\n value: \"All\"\n }\n },\n {\n Id: {\n value: \"DraftPromotions\"\n },\n Name: {\n value: \"Draft\"\n }\n },\n {\n Id: {\n value: \"LivePromotions\"\n },\n Name: {\n value: \"Live\"\n }\n },\n {\n Id: {\n value: \"AwaitingApprovalPromotions\"\n },\n Name: {\n value: \"Awaiting approval\"\n }\n },\n {\n Id: {\n value: \"ScheduledPromotions\"\n },\n Name: {\n value: \"Scheduled\"\n }\n },\n {\n Id: {\n value: \"RejectedPromotions\"\n },\n Name: {\n value: \"Rejected\"\n }\n }\n ],\n filterCentre: null,\n filterStatus: \"allStatus\",\n disableCancelBtn: false,\n disableDeleteBtn: false,\n articleList: [],\n articlePreviewUrlHolder: \"\",\n articlePreviewTitleHolder: \"\",\n isDashboardUpdate: false,\n isMobile: false,\n dataCount: 0,\n centreListOption: [],\n filterByCentre: \"allCentre\"\n };\n }\n\n componentDidMount() {\n if (document) {\n this.setState({\n isDocumentReady: true,\n content: \"articles\"\n },\n () => {\n this.handleResize()\n this.updateCentreOption()\n }\n );\n\n }\n\n if (window) {\n window.addEventListener(\"resize\", this.handleResize);\n }\n }\n\n handleResize = () => {\n if (window.outerWidth >= 992) {\n this.setState({\n isMobile: false\n })\n } else {\n this.setState({\n isMobile: true\n })\n }\n }\n\n updateCentreOption = () => {\n const {\n CentreList,\n } = this.props.fields || {};\n\n let centreListOption = [\n {\n value: \"allCentre\",\n label: \"All centres\"\n }\n ]\n if (CentreList && CentreList.length > 0) {\n CentreList.map((item, index) => {\n const {\n Name\n } = item.fields\n centreListOption.push({ value: Name.value, label: Name.value });\n })\n }\n\n this.setState({ centreListOption });\n }\n\n renderPreviewModal = () => {\n const {\n title,\n url\n } = this.state.previewModalData || {};\n\n const {\n previewUrl,\n previewTitle,\n } = this.state.formModalData || {}\n\n const {\n showFormModal,\n showPreviewModal\n } = this.state;\n\n hideBackToTop(showPreviewModal || showFormModal);\n\n return (\n <FormModal\n isPreview\n showModal={showPreviewModal}\n label={previewTitle ? previewTitle : title ? title : \"\"}\n closeOnClick={() => this.setState({ showPreviewModal: false })}\n >\n {showPreviewModal &&\n <CustomIframe\n title={previewTitle ? previewTitle : title ? title : \"\"}\n src={previewUrl ? previewUrl : url ? url : \"\"}\n />\n }\n </FormModal>\n );\n }\n\n renderFormModal = () => {\n const {\n title,\n content,\n itemId,\n previewUrl,\n showSaveHint,\n disableBtn,\n onClickSave,\n onClickPreview,\n onClickSubmit,\n isNewArticle,\n } = this.state.formModalData || {}\n\n const {\n showFormModal,\n isDashboardUpdate,\n isMobile,\n showPreviewModal\n } = this.state;\n\n const {\n updateDashboard\n } = this.props\n\n if (!showFormModal && isDashboardUpdate && updateDashboard) {\n this.setState({\n isDashboardUpdate: false\n },\n () => updateDashboard(true))\n }\n\n hideBackToTop(showPreviewModal || showFormModal);\n\n return (\n <FormModal\n showModal={showFormModal}\n label={title}\n closeOnClick={() => this.setState({ showFormModal: false })}\n closeClassName={\"article-close-btn\"}\n showSaveHint={showSaveHint}\n saveBtn={\"Save draft\"}\n saveBtnOnClick={() => this.updateArticle(onClickSave)}\n secondaryBtn={`Preview${isNewArticle && !isMobile ? \"…\" : \"\"}`}\n secondaryBtnOnClick={() => {\n if (previewUrl) {\n this.setState({\n showPreviewModal: true,\n })\n } else {\n onClickPreview();\n }\n }\n }\n disabledSecondaryBtn={disableBtn}\n primaryBtn={\"Submit\"}\n primaryBtnClassName={\"article-submit-btn\"}\n primaryBtnOnClick={() => this.updateArticle(onClickSubmit, true)}\n disabledPrimaryBtn={disableBtn}\n >\n {showFormModal &&\n <FormArticles\n itemId={itemId}\n handleFormData={(showSaveHint, disableBtn, previewUrl, previewTitle, onClickSave, onClickPreview, onClickSubmit) => {\n this.handleFormUpdate(\n showSaveHint,\n disableBtn,\n previewUrl,\n previewTitle,\n onClickSave,\n onClickPreview,\n onClickSubmit,\n );\n }}\n />\n }\n </FormModal>\n );\n }\n\n handleFormUpdate = (showSaveHint, disableBtn, previewUrl, previewTitle, onClickSave, onClickPreview, onClickSubmit) => {\n this.setState({\n formModalData: {\n ...this.state.formModalData,\n showSaveHint,\n disableBtn,\n onClickSave,\n onClickPreview,\n onClickSubmit,\n previewUrl,\n previewTitle\n }\n })\n }\n\n updateArticle = (onClickUpdate, isSubmit) => {\n if (isSubmit) {\n onClickUpdate().then((result) => {\n if (result && result.isSuccess) {\n let articlePreviewUrl = \"\",\n articlePreviewTitle = \"\";\n\n if (result.articlePreviewUrl) {\n articlePreviewUrl = result.articlePreviewUrl\n }\n if (result.articlePreviewTitle) {\n articlePreviewTitle = result.articlePreviewTitle\n }\n let filterAllStatus = document.getElementById(\"allStatus\");\n let filterAllCentreRadio = document.getElementById(\"allCentre\");\n let filterAllCentreDropdown = document.querySelector(\".is-filter-centre .form__select--field\");\n if (filterAllStatus) {\n filterAllStatus.click()\n }\n if (filterAllCentreRadio) {\n filterAllCentreRadio.click()\n } else if (filterAllCentreDropdown) {\n filterAllCentreDropdown.selectedIndex = 0;\n }\n\n this.setState({\n formModalData: {\n ...this.state.formModalData,\n successMessage: \"Article successfully updated.\",\n previewUrl: articlePreviewUrl,\n previewTitle: articlePreviewTitle,\n },\n showFormModal: false,\n showSuccessMessage: true,\n filterCentre: [],\n articlePreviewUrlHolder: articlePreviewUrl,\n articlePreviewTitleHolder: articlePreviewTitle,\n isDashboardUpdate: true\n },\n () => {\n scrollToTop()\n addClassLazyload(\"article-listing__content\")\n }\n )\n }\n });\n } else {\n onClickUpdate().then((result) => {\n if (result && result.isSuccess) {\n let filterAllStatus = document.getElementById(\"allStatus\");\n let filterAllCentreRadio = document.getElementById(\"allCentre\");\n let filterAllCentreDropdown = document.querySelector(\".is-filter-centre .form__select--field\");\n if (filterAllStatus) {\n filterAllStatus.click()\n }\n if (filterAllCentreRadio) {\n filterAllCentreRadio.click()\n } else if (filterAllCentreDropdown) {\n filterAllCentreDropdown.selectedIndex = 0;\n }\n this.setState({\n filterCentre: [],\n isDashboardUpdate: true\n },\n () => addClassLazyload(\"article-listing__content\")\n )\n }\n });\n }\n }\n\n renderDelete = () => {\n const {\n deleteModalData,\n disableCancelBtn,\n disableDeleteBtn,\n } = this.state;\n\n return (\n <Popup>\n <PopupAction\n label={{ value: `Delete article?` }}\n description={{ value: `Are you sure you’d like to delete this article?<br/>This cannot be undone.` }}\n icon=\"trash-2\"\n iconBgColor=\"#d83b42\"\n secondaryBtn=\"Cancel\"\n disabledSecondaryBtn={disableCancelBtn}\n secondaryBtnOnClick={() => this.setState({ showDeleteModal: false })}\n primaryBtn={`Delete article`}\n primaryBtnOnClick={() => this.deleteArticle(deleteModalData)}\n primaryBtnColor=\"red\"\n disabledPrimaryBtn={disableDeleteBtn}\n />\n </Popup>\n );\n };\n\n deleteArticle = async deleteModalData => {\n const {\n isDashboard = false,\n updateDashboard\n } = this.props || {}\n const {\n id,\n status\n } = deleteModalData;\n const {\n content,\n dataCount\n } = this.state;\n this.setState({\n disableCancelBtn: true,\n disableDeleteBtn: true\n })\n let successMessage = \"\";\n try {\n let response = await deleteArticle({ itemId: id });\n if (response.status === 200 && response.data) {\n if (response.data.IsSuccess.value) {\n successMessage = \"Article successfully deleted.\";\n\n if (!isDashboard) {\n let statusVar = \"\";\n if (status.toLowerCase() === \"live\") {\n statusVar = \"LivePromotions\";\n }\n else if (status.toLowerCase() === \"scheduled\") {\n statusVar = \"ScheduledPromotions\";\n }\n else if (status.toLowerCase() === \"awaiting approval\") {\n statusVar = \"AwaitingApprovalPromotions\";\n }\n else if (status.toLowerCase() === \"draft\") {\n statusVar = \"DraftPromotions\";\n }\n else if (status.toLowerCase() === \"rejected\") {\n statusVar = \"RejectedPromotions\";\n }\n\n let newData =\n this.state[content][statusVar].filter(item => {\n return item.ItemId.value !== id;\n });\n\n this.setState(\n {\n [this.state.content]: {\n ...this.state[content],\n [statusVar]: newData\n },\n showDeleteModal: false,\n showSuccessMessage: true,\n disableCancelBtn: false,\n disableDeleteBtn: false,\n formModalData: {\n ...this.state.formModalData,\n successMessage\n },\n dataCount: dataCount - 1\n },\n () => {\n scrollToTop()\n addClassLazyload(\"article-listing__content\");\n }\n );\n } else {\n this.setState(\n {\n showDeleteModal: false,\n showSuccessMessage: true,\n disableCancelBtn: false,\n disableDeleteBtn: false,\n formModalData: {\n ...this.state.formModalData,\n successMessage\n }\n },\n () => {\n scrollToTop()\n if (updateDashboard) {\n updateDashboard(true)\n }\n addClassLazyload(\"article-listing__content\");\n }\n );\n }\n } else {\n successMessage = \"Article delete failed.\"\n\n this.setState({\n showDeleteModal: false,\n showSuccessMessage: true,\n disableCancelBtn: false,\n disableDeleteBtn: false,\n formModalData: {\n ...this.state.formModalData,\n successMessage\n }\n },\n () => scrollToTop()\n );\n }\n }\n else {\n successMessage = \"Article delete failed.\"\n\n this.setState({\n showDeleteModal: false,\n showSuccessMessage: true,\n formModalData: {\n ...this.state.formModalData,\n successMessage\n }\n },\n () => scrollToTop()\n );\n }\n removeActiveState();\n }\n catch (e) {\n console.error(\"Article Delete Error: \" + e.response.statusText);\n successMessage = \"Article delete error.\";\n this.setState({\n showDeleteModal: false,\n showSuccessMessage: true,\n disableCancelBtn: false,\n disableDeleteBtn: false,\n formModalData: {\n ...this.state.formModalData,\n successMessage\n }\n },\n () => scrollToTop()\n )\n removeActiveState();\n // this.setState(\n // {\n // showDeleteModal: false,\n // showSuccessMessage: true,\n // disableCancelBtn: false,\n // disableDeleteBtn: false,\n // formModalData: {\n // ...this.state.formModalData,\n // successMessage\n // }\n // },\n // () => {\n // if (updateDashboard) {\n // updateDashboard(true)\n // }\n // }\n // );\n }\n };\n\n handleOnClickFilter = (type, value) => {\n if (type === \"status\") {\n this.setState({\n filterStatus: value\n })\n } else if (type === \"centre\") {\n this.setState({\n filterCentre: value === \"allCentre\" ? [] : value,\n })\n }\n addClassLazyload(\"article-listing__content\");\n scrollToTop();\n }\n\n setCentreListDropdown = (CentreList) => {\n let tempCentreList = [];\n let allOption = {\n Id: { value: \"allCentre\" },\n Name: { value: \"All centres\" }\n }\n tempCentreList.push(allOption)\n\n CentreList.map((item) => {\n const {\n Name\n } = item.fields;\n\n if (Name && Name.value) {\n let centreOption = {\n Id: { value: Name.value },\n Name: { value: Name.value }\n }\n tempCentreList.push(centreOption)\n }\n })\n return tempCentreList;\n }\n\n renderCustomFilter = (CentreList) => {\n const {\n showFilter,\n statusOption,\n centreListOption,\n filterByCentre,\n isMobile\n } = this.state;\n\n return (\n <CustomFilter\n showFilter={showFilter}\n onCloseFilter={() => this.setState({ showFilter: false })}\n >\n <div className=\"custom-filter__group is-filter-status\">\n <div className=\"custom-filter__label\">\n {\"Filter by status\"}\n </div>\n <RadioButton\n defaultSelected=\"allStatus\"\n options={statusOption}\n radioGroupName=\"articleListing\"\n onChange={(id) => this.handleOnClickFilter(\"status\", id)}\n plain\n />\n </div>\n <div className=\"custom-filter__group is-filter-centre\">\n <div className=\"custom-filter__label\">\n {\"Filter by centre\"}\n </div>\n {CentreList &&\n CentreList.length > 0 && (\n (CentreList.length > 5 || isMobile) ?\n <Select\n onChange={(option) => this.handleOnClickFilter(\"centre\", option.value)}\n defaultValue={{ value: \"allCentre\", label: \"All centres\" }}\n options={centreListOption}\n theme={(theme) => ({\n ...theme,\n colors: {\n ...theme.colors,\n primary: \"#536760\",\n primary25: \"#f5f5f6\",\n },\n })}\n isSearchable={false}\n maxMenuHeight={200}\n menuPlacement=\"auto\"\n /> :\n <RadioButton\n defaultSelected=\"allCentre\"\n options={this.setCentreListDropdown(CentreList)}\n radioGroupName=\"articleListingCentreList\"\n onChange={(id) => this.handleOnClickFilter(\"centre\", id)}\n plain\n />\n )\n }\n </div>\n </CustomFilter>\n )\n }\n\n renderContent = (HideCreateButton) => {\n const {\n isDashboard = false,\n articleList = [],\n noStore = false\n } = this.props || {}\n\n const {\n articles,\n filterStatus,\n filterCentre,\n dataCount\n } = this.state;\n\n let noSelectedStore = false;\n if (noStore.toString() === \"true\" || (HideCreateButton && HideCreateButton.value.toString() === \"true\")) {\n noSelectedStore = true;\n }\n\n return (\n <Articles\n data={(articleList && articleList.length > 0) ? { dashboardArticles: articleList } : articles}\n filterStatus={filterStatus}\n filterCentre={filterCentre}\n showPreviewModal={previewModalData =>\n this.setState({\n showPreviewModal: true,\n previewModalData,\n formModalData: {\n ...this.state.formModalData,\n previewUrl: \"\",\n previewTitle: \"\",\n },\n })\n }\n showFormModal={formModalData =>\n this.setState({ showFormModal: true, formModalData })\n }\n showDeleteModal={deleteModalData =>\n this.setState({\n showDeleteModal: true,\n deleteModalData,\n formModalData: {\n ...this.state.formModalData,\n previewUrl: \"\",\n previewTitle: \"\",\n },\n })\n }\n showFilter={() => {\n this.setState({ showFilter: true })\n }}\n dataUpdate={articles => this.setState({ articles })}\n noSelectedStore={noSelectedStore}\n isDashboard={isDashboard}\n dataTotalCount={dataCount => this.setState({ dataCount })}\n hideFilter={dataCount == 0}\n totalListCount={dataCount}\n />\n );\n };\n\n render() {\n const {\n content,\n showDeleteModal,\n showSuccessMessage,\n formModalData,\n isDocumentReady,\n articlePreviewUrlHolder,\n articlePreviewTitleHolder\n } = this.state;\n const {\n CentreList,\n HideCreateButton,\n } = this.props.fields || {};\n\n\n const {\n noStore = false\n } = this.props || {}\n\n return (\n <div className={`article-listing__container ${showSuccessMessage ? \"has-success-message\" : \"\"}`}>\n {showDeleteModal && this.renderDelete()}\n {isDocumentReady &&\n this.renderPreviewModal()\n }\n {isDocumentReady &&\n this.renderFormModal()\n }\n\n {isDocumentReady &&\n CentreList &&\n CentreList.length > 0 &&\n this.renderCustomFilter(CentreList)\n }\n\n {showSuccessMessage &&\n <SuccessMessage\n showPreviewLink={formModalData && formModalData.previewUrl}\n label={formModalData.successMessage}\n handleOnClick={() => {\n if (formModalData.previewUrl) {\n this.setState({\n showPreviewModal: true,\n formModalData: {\n ...this.state.formModalData,\n previewUrl: articlePreviewUrlHolder,\n previewTitle: articlePreviewTitleHolder,\n },\n })\n } else {\n console.log(\"Preview Group\")\n }\n }}\n handleShowSuccess={(showSuccessMessage) => {\n this.setState({\n showSuccessMessage\n })\n }}\n />\n }\n\n <div className={`article-listing__content ${(noStore.toString() === \"true\" || (HideCreateButton && HideCreateButton.value.toString() === \"true\")) ? \"hide-create-btn\" : \"\"}`}>\n {content && this.renderContent(HideCreateButton)}\n </div>\n </div>\n );\n }\n}\nexport default FeatureRetailerPortalArticleListing;","import React from \"react\";\nimport ReactCrop from 'react-image-crop';\nimport 'react-image-crop/dist/ReactCrop.css';\nimport {\n base64StringtoFile\n} from \"../../../helper/ImageConversionHelper\";\n\nclass ImageUpload extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n file: props.value ? props.value : null,\n preview: props.value ? props.value : null,\n errorMessage: null,\n showCrop: false,\n croppedImageUrl: null,\n crop: {\n unit: '%',\n width: 50,\n aspect: 16 / 9,\n },\n };\n }\n\n handleFileUpload = () => {\n this.props.handleFileUpload(this.state.file, this.state.errorMessage);\n };\n\n removeFile = () => {\n this.setState(\n {\n file: null,\n preview: null\n },\n this.handleFileUpload\n );\n }\n\n setFile = file => {\n if (file && file.type.indexOf(\"image\") !== -1) {\n this.setState(\n {\n file,\n preview: URL.createObjectURL(file),\n showCrop: false,\n croppedImageUrl: null\n },\n this.handleFileUpload\n );\n\n } else {\n alert(\"Please select an image\");\n }\n };\n\n handleCrop = (e, type) => {\n this.setState({\n showCrop: !this.state.showCrop,\n crop: {\n unit: '%',\n width: 80,\n x: 10,\n y: 10,\n aspect: type === \"hero\" ? 16 / 9 : 1,\n },\n });\n }\n\n onImageLoaded = image => {\n this.imageRef = image;\n };\n\n onCropComplete = crop => {\n this.makeClientCrop(crop);\n this.convertCroptoFile(crop);\n };\n\n onCropChange = (crop) => {\n this.setState({ crop: crop });\n };\n\n async makeClientCrop(crop) {\n if (this.imageRef && crop.width && crop.height) {\n const canvasImage = this.getCroppedImg(\n this.imageRef,\n crop\n );\n const croppedImageUrl = await new Promise((resolve, reject) => {\n canvasImage.toBlob(blob => {\n if (!blob) {\n console.error('Canvas is empty');\n return;\n }\n blob.name = 'cropImage.jpeg';\n window.URL.revokeObjectURL(this.fileUrl);\n this.fileUrl = window.URL.createObjectURL(blob);\n resolve(this.fileUrl);\n }, 'image/jpeg');\n });\n\n this.setState({\n croppedImageUrl: croppedImageUrl\n })\n }\n }\n\n convertCroptoFile(crop) {\n const { file } = this.state;\n let name, lastDot, fileName, fileExtension;\n const canvasImage = this.getCroppedImg(\n this.imageRef,\n crop\n );\n if (canvasImage.width > 0 && canvasImage.height > 0) {\n if (file.name) {\n name = file.name;\n }\n else {\n name = file.split('/').pop().split('?')[0];\n\n }\n lastDot = name.lastIndexOf('.');\n fileName = name.substring(0, lastDot);\n fileExtension = name.substring(lastDot + 1);\n const imageData64 = canvasImage.toDataURL(\"image/\" + (fileExtension === \"jpg\" ? \"jpeg\" : fileExtension));\n const cropFileName = fileName + \".\" + fileExtension;\n const newCropFile = base64StringtoFile(imageData64, cropFileName);\n this.setState(\n {\n file: newCropFile\n },\n this.handleFileUpload\n );\n }\n }\n getCroppedImg(image, crop) {\n if (document) {\n const canvas = document.createElement('canvas');\n let scaleX, scaleY;\n scaleX = image.naturalWidth / image.width;\n scaleY = image.naturalHeight / image.height;\n\n canvas.width = crop.width * scaleX;\n canvas.height = crop.height * scaleY;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(\n image,\n crop.x * scaleX,\n crop.y * scaleY,\n crop.width * scaleX,\n crop.height * scaleY,\n 0,\n 0,\n crop.width * scaleX,\n crop.height * scaleY,\n );\n return canvas;\n }\n }\n\n render() {\n const { preview, showCrop, crop, croppedImageUrl } = this.state;\n const {\n type,\n error,\n placeholder,\n labelOne,\n labelTwo,\n labelThree,\n removeImage = false\n } = this.props;\n return (\n <div className={\"imageupload-container \" + type}>\n <div className={`image-container ${preview ? \"\" : \"default\"}`}>\n <img\n src={croppedImageUrl ? croppedImageUrl : preview ? preview : placeholder}\n alt=\"\"\n className={`image ${type ? type : \"\"} ${error ? \"error\" : \"\"} ${preview ? \"\" : \"default\"} ${showCrop ? \"hide\" : \"\"}`}\n />\n {showCrop &&\n (preview) && (\n <ReactCrop\n src={preview}\n crop={crop}\n ruleOfThirds\n onImageLoaded={this.onImageLoaded}\n onComplete={this.onCropComplete}\n onChange={this.onCropChange}\n keepSelection={true}\n />\n )}\n </div>\n <div className=\"imageupload-details\">\n <label className=\"imageupload-btn btn btn-light-primary\">\n {preview ? \"Change image\" : \"Upload an image\"}\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={e => this.setFile(e.target.files[0])}\n />\n </label>\n {(removeImage && preview) &&\n <button className=\"imageupload-btn imageupload-btn--delete btn btn-light-primary\"\n onClick={() => this.removeFile()}>\n <i\n className=\"icon icon-trash\"\n />\n </button>\n }\n <button className=\"imageupload-crop btn btn-light-primary\"\n onClick={e => this.handleCrop(e, type)}\n disabled={preview ? false : true}\n >\n <i className={`icon ${showCrop ? \"icon-check\" : \"icon-crop\"}`}></i>\n </button>\n <div className=\"text-container\">\n <span>{labelOne}</span>\n <span className=\"bold\">{labelTwo}</span>\n <span>{labelThree}</span>\n </div>\n </div>\n </div>\n );\n }\n}\n\nexport default ImageUpload;\n","/*\n** A few JavaScript Functions for Images and Files\n** Author: Justin Mitchel\n** Source: https://kirr.co/ndywes\n*/\n\n//Download a Base64-encoded file\nexport function downloadBase64File(base64Data, filename) {\n if (document) {\n var element = document.createElement('a');\n element.setAttribute('href', base64Data);\n element.setAttribute('download', filename);\n element.style.display = 'none';\n document.body.appendChild(element);\n element.click();\n document.body.removeChild(element);\n }\n}\n\n//Convert a Base64-encoded string to a File object\nexport function base64StringtoFile(base64String, filename) {\n var arr = base64String.split(','), mime = arr[0].match(/:(.*?);/)[1],\n bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n return new File([u8arr], filename, { type: mime });\n}\n\n//Extract an Base64 Image's File Extension\nexport function extractImageFileExtensionFromBase64(base64Data) {\n return base64Data.substring(\"data:image/\".length, base64Data.indexOf(\";base64\"))\n}","import React, { Component } from \"react\";\nimport { values } from \"lodash\";\nimport bitmap from \"../../../assets/icons/png/bitmap@3x.png\";\nclass FormFile extends Component {\n constructor(props) {\n super(props);\n this.inputFile = React.createRef(null);\n }\n\n state = {\n files: this.props.value,\n errorMessage: null,\n };\n\n handleAttachments = () => {\n this.props.handleAttachments(this.state.files, this.state.errorMessage);\n };\n\n setList = files => {\n if (files && files.length) {\n let lists = [];\n let isError = false;\n for (let i = 0; i < files.length; i++) {\n if (\n files[i] &&\n (files[i].type === \"image/png\" || files[i].type === \"image/jpeg\")\n ) {\n lists.push(files[i]);\n } else {\n isError = true;\n }\n }\n\n this.setState(\n {\n files: [...this.state.files, ...values(lists)],\n errorMessage: isError\n ? \"One or more files could not be uploaded. Only files with jpeg and png extension are allowed.\"\n : null,\n },\n this.handleAttachments\n );\n }\n };\n\n updateFile(imageFile, filename) {\n const { files } = this.state;\n let listItem = [];\n files.map((item, index) => {\n if (item.name == filename) {\n listItem.push(imageFile)\n } else {\n listItem.push(item);\n }\n })\n let newList = listItem;\n this.setState(\n { files: newList, errorMessage: null },\n this.handleAttachments\n );\n }\n\n removeFile(filename) {\n const { files } = this.state;\n if (document) {\n document.getElementsByClassName(\"file-btn\")[0].querySelector(\"input\").value = null;\n const uploadInput = Array.prototype.slice.apply(\n document.getElementsByClassName(\"file-list\")[0].querySelectorAll(\"input\")\n );\n uploadInput.map((item, index) => {\n item.value = null;\n })\n let newList = files.filter(file => file.name !== filename);\n this.setState(\n {\n files: newList,\n errorMessage: null,\n },\n this.handleAttachments\n );\n }\n }\n\n renderList = () => {\n const { files } = this.state;\n\n if (files.length > 0) {\n let list = [];\n for (let i = 0; i < files.length; i++) {\n const element = files[i];\n list.push(element);\n }\n\n return (\n <div className=\"file-list\">\n {list.map((item, index) => {\n let imgSrc;\n if (item.src) {\n imgSrc = item.src\n } else {\n imgSrc = URL.createObjectURL(item)\n }\n return (\n <React.Fragment key={`fileId-${index}`}>\n <div className=\"file-item\">\n <div className=\"file-item__action\">\n <i\n className=\"icon icon-trash\"\n onClick={() => this.removeFile(item.name)}\n />\n </div>\n <div className=\"file-item__image\">\n <img src={imgSrc} alt=\"upload source\" />\n <label className=\"image-gallery-btn-change\" htmlFor={item.name + index}>\n <span>\n {\"Change\"}\n </span>\n <input\n id={item.name + index}\n type=\"file\"\n accept=\"image/png,image/jpeg\"\n onChange={e => this.updateFile(e.target.files[0], item.name)}\n />\n </label>\n </div>\n </div>\n </React.Fragment>\n );\n })}\n </div>\n );\n }\n };\n\n render() {\n const { files } = this.state;\n\n return (\n <div className={`form-file-wrapper ${files.length > 0 ? \"\": \"no-image\"}`}>\n <div className=\"form-file\">\n {this.renderList()}\n <div className=\"file-btn\">\n <label className=\"image-gallery-btn\">\n {\"Add image\"}\n <input\n ref={this.inputFile}\n type=\"file\"\n multiple\n accept=\"image/png,image/jpeg\"\n onChange={e => this.setList(e.target.files)}\n />\n </label>\n </div>\n </div>\n <div className=\"imageupload-text\">\n <div className=\"text-container\">\n <div>\n {\"To keep the quality of our websites high, the hero banner image needs to be:\"}\n </div>\n <br />\n <div>\n {\"• At least 1920px wide\"}\n </div>\n <div>\n {\"• At least 1080px tall.\"}\n </div>\n <div>\n {\"• To avoid your image being cropped, use a ratio of 16:9\"}\n </div>\n </div>\n </div>\n </div>\n );\n }\n}\n\nexport default FormFile;\n","import React, { Component, Fragment } from \"react\";\r\n\r\n// Input [{name: value}]\r\n\r\nclass DropDown extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n show: false,\r\n selected: props.defaultSelected\r\n };\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n if(prevProps.defaultSelected != this.props.defaultSelected) {\r\n this.setState({\r\n selected: this.props.defaultSelected\r\n })\r\n }\r\n }\r\n\r\n handleToggle = e => {\r\n e.target.focus();\r\n this.setState({ show: !this.state.show });\r\n };\r\n\r\n handleBlur = () => {\r\n if (this.state.show) {\r\n setTimeout(() => {\r\n this.setState({ show: !this.state.show });\r\n }, 120);\r\n }\r\n };\r\n\r\n render() {\r\n const { theme, error } = this.props;\r\n return (\r\n <Fragment>\r\n <div className=\"dropdown-container\">\r\n <label\r\n className={`arrow ${theme ? theme : \"\"} ${error ? \"error\" : \"\"}`}\r\n >\r\n <div className=\"dropdown-placeholder\">\r\n <input\r\n type=\"button\"\r\n value={this.state.selected}\r\n className=\"dropdown-btn\"\r\n onClick={e => this.handleToggle(e)}\r\n // onBlur={e => this.handleBlur(e)}\r\n />\r\n </div>\r\n <i className=\"icon icon-chevron-down\"></i>\r\n <ul className={`dropdown-list ${this.state.show ? \"\" : \"d-none\"}`}>\r\n {this.props.options && this.props.options.length ? (\r\n this.props.options.map((item, index) => {\r\n return (\r\n <li\r\n key={`optionId${index}`}\r\n onClick={() => {\r\n this.setState(\r\n { selected: item.name },\r\n this.props.handleSelectionChange(item.name)\r\n );\r\n }}\r\n >\r\n <span>{item.name}</span>\r\n </li>\r\n );\r\n })\r\n ) : (\r\n <li className=\"empty\">No store found</li>\r\n )}\r\n </ul>\r\n </label>\r\n </div>\r\n </Fragment>\r\n );\r\n }\r\n}\r\n\r\nexport default DropDown;\r\n","import React, { Component } from \"react\";\r\n\r\nclass Modal extends Component {\r\n render() {\r\n const { type, show } = this.props;\r\n let modalType = type ? `modal-${type}` : \"modal-small\";\r\n\r\n return (\r\n <React.Fragment>\r\n <div className=\"modal-bg-blur\" />\r\n <div className=\"retailer-modal-container\">\r\n <div className={`retailer-modal ${modalType}`}>\r\n <div className={`header ${modalType}`}>\r\n <div className=\"title\">{this.props.title}</div>\r\n {show &&\r\n <div className=\"close-button\" onClick={() => show()}>\r\n <i className=\"icon icon-cancel\" />\r\n </div>\r\n }\r\n </div>\r\n {this.props.children}\r\n </div>\r\n </div>\r\n </React.Fragment>\r\n );\r\n }\r\n}\r\n\r\nexport default Modal;\r\n","export const getUrlParameter = name => {\n // name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n var regex = new RegExp(\"[\\\\?&]\" + name + \"=([^&#]*)\");\n var results = regex.exec(window.location.search);\n return results === null\n ? \"\"\n : decodeURIComponent(results[1].replace(/\\+/g, \" \"));\n};\n\nexport const changeUrlParameter = (name, value) => {\n window.location.search = `?${name}=${value}&sc_mode=normal`;\n};\n\n\nexport const addParameter = (url, param, value) => {\n // Using a positive lookahead (?=\\=) to find the\n // given parameter, preceded by a ? or &, and followed\n // by a = with a value after than (using a non-greedy selector)\n // and then followed by a & or the end of the string\n var val = new RegExp('(\\\\?|\\\\&)' + param + '=.*?(?=(&|$))'),\n qstring = /\\?.+$/;\n\n // Check if the parameter exists\n if (val.test(url)) {\n // if it does, replace it, using the captured group\n // to determine & or ? at the beginning\n return url.replace(val, '$1' + param + '=' + value);\n }\n else if (qstring.test(url)) {\n // otherwise, if there is a query string at all\n // add the param to the end of it\n return url + '&' + param + '=' + value;\n }\n else {\n // if there's no query string, add one\n return url + '?' + param + '=' + value;\n }\n}","import React from \"react\";\nimport axios from \"axios\";\nimport Loadable from \"react-loadable\";\nimport TagManager from \"react-gtm-module\";\nimport ImageUpload from \"../../../Base/ImageUpload\";\nimport FormFile from \"../../../Base/FormFile\";\nimport DropDown from \"../../../Base/DropDown\";\nimport FormInput from \"../../../Base/FormInput\";\nimport FormInputMultiple from \"../../../Base/FormInputMultiple\";\nimport FormDate from \"../../../Base/FormDate\";\nimport FormCheckbox from \"../../../Base/FormCheckbox\";\nimport Button from \"../../../Base/Button\";\nimport Modal from \"../../../Base/Modal\";\nimport { get } from \"lodash\";\nimport {\n disableBodyScroll,\n enableBodyScroll\n} from \"../../../../helper/ScrollHelper\";\nimport {\n validate,\n setArticleData,\n buildFormData,\n formDataFields\n} from \"../../../../helper/ArticleHelper\";\nimport { getUrlParameter } from \"../../../../helper/UrlHelper\";\nimport bitmap from \"../../../../assets/icons/png/bitmap@3x.png\";\nimport { getCentreStores } from \"../../../../api/PromotionAPI\";\nimport FormListbox from \"../../../Base/FormListbox\";\n\nconst RichTextEditor = Loadable({\n loader: () => import(\"../../../Base/RichTextEditor\"),\n loading: () => null\n});\n\nclass FeatureRetailerPortalArticles extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n mode: \"new\",\n stores: null,\n retailers: null,\n showModal: false,\n modalContent: null,\n formError: {},\n storeList: null,\n centreStoreList: null,\n formData: { ...formDataFields },\n componentReady: false,\n selectAllStores: false,\n holidays: null,\n categories: null,\n specialHolidayListbox: null,\n status: \"dirty\",\n redirectUrl: \"\",\n retailerId: \"\"\n };\n }\n componentDidMount() {\n this.setState({\n centre: getUrlParameter(\"centre\"),\n componentReady: true\n });\n this.getData();\n let retailerList = this.setRetailerList(this.props.fields.RetailerList);\n if (!getUrlParameter(\"itemId\") && retailerList && retailerList.length) {\n this.getCentreStoreList(retailerList[0].value);\n }\n }\n\n getData = () => {\n const {\n RetailerList,\n Article,\n RedirectUrl,\n GlobalSpecialHoliday,\n Categories\n } = this.props.fields;\n let retailerList = this.setRetailerList(RetailerList);\n let holidayList = this.setHolidayList(GlobalSpecialHoliday);\n let categoryList = this.setCategoryList(Categories);\n if (getUrlParameter(\"itemId\")) {\n let articleData = setArticleData(Article.fields);\n this.setState({\n mode: \"edit\",\n retailers: retailerList,\n categories: categoryList,\n formData: { ...this.state.formData, ...articleData },\n redirectUrl: RedirectUrl.value,\n holidays: holidayList\n });\n } else {\n this.setState({\n retailers: retailerList,\n categories: categoryList,\n redirectUrl: RedirectUrl && RedirectUrl.value ? RedirectUrl.value : \"\",\n holidays: holidayList\n });\n }\n };\n\n setRetailerList = list => {\n let temp = [];\n list.forEach(el =>\n temp.push({\n name: el.fields.RetailerName.value,\n value: el.fields.RetailerId.value\n })\n );\n return temp;\n };\n\n setHolidayList = list => {\n let temp = [];\n if (list && list.length) {\n list.forEach(el =>\n temp.push({\n name: el.fields.HolidayName.value,\n value: el.fields.HolidayId.value\n })\n );\n }\n return temp;\n };\n\n setCategoryList = list => {\n let temp = [];\n list.forEach(el =>\n temp.push({\n name: el.fields.CategoryName.value,\n value: el.fields.CategoryId.value\n })\n );\n return temp;\n };\n\n handleListbox = (id, field) => {\n const { formData } = this.state;\n let options;\n let selected = [];\n if (document) {\n options = document.querySelectorAll(`#${id} option:checked`);\n if (options) {\n for (let i = 0; i < options.length; i++) {\n selected.push(options[i].value);\n }\n }\n }\n this.setState({\n formData: {\n ...formData,\n [field]: selected\n }\n });\n };\n\n handleSelect = (isSelect, field, options) => {\n const { formData } = this.state;\n this.setState({\n formData: {\n ...formData,\n [field]: isSelect ? options.map(el => el.value) : []\n }\n });\n };\n\n handleFormUpdate = value => {\n this.setState({ formData: { ...this.state.formData, ...value } });\n };\n\n renderModal = () => {\n disableBodyScroll();\n const { mode, status, redirectUrl } = this.state;\n const { title, body, cta } = this.state.modalContent;\n return (\n <Modal\n type=\"small\"\n title={title}\n show={() => {\n if (status === \"submitted\" || status === \"saved\") {\n window.location.href = `${redirectUrl}`;\n } else {\n this.setState({ showModal: false, modalContent: null }, () =>\n enableBodyScroll()\n );\n }\n }}\n >\n <div className=\"modal-body\">{body}</div>\n {(mode === \"edit\" || status === \"submitted\") && cta && (\n <div className=\"cta modal-controls-container\">\n <Button\n color=\"primary\"\n onClick={() => (window.location.href = cta.url)}\n >\n {cta.label}\n </Button>\n </div>\n )}\n {mode === \"new\" && status === \"saved\" && (\n <div className=\"modal-controls-container\">\n <Button\n color=\"secondary\"\n onClick={() => (window.location.href = `${redirectUrl}`)}\n >\n CANCEL\n </Button>\n <Button\n disabled={false}\n color=\"primary\"\n onClick={() => this.submitForm()}\n >\n SUBMIT\n </Button>\n </div>\n )}\n {mode === \"new\" && status === \"dirty\" && (\n <div className=\"modal-controls-container\">\n <Button\n color=\"secondary\"\n onClick={() =>\n this.setState({ showModal: false, modalContent: null }, () =>\n enableBodyScroll()\n )\n }\n >\n CLOSE\n </Button>\n </div>\n )}\n </Modal>\n );\n };\n\n validateForm = () => {\n let formError = validate(\n this.state.formData,\n this.state.mode === \"edit\" ? [\"selectedRetailer\"] : []\n );\n let errorMessage = {\n title: \"Form Saving Failed\",\n body: \"Required fields are missing\"\n };\n if (Object.entries(formError).length !== 0) {\n this.setState({ formError, showModal: true, modalContent: errorMessage });\n } else {\n this.saveForm();\n }\n };\n\n extractItemIds = centreList => {\n let itemIds = [];\n centreList.map(center => {\n center.Articles.map(article => {\n itemIds.push(article.ItemId.value);\n });\n });\n return itemIds;\n };\n\n buildPreviewUrls = centreList => {\n let preview = \"\";\n preview = centreList.map(centre => {\n let centrePreview = [];\n centrePreview = centre.Articles.map(article => {\n return (\n <div className=\"preview-link\">\n <i className={`icon icon-external`} />\n <a href={article.PreviewUrl.value} target=\"_blank\">\n {article.Store.value}\n </a>\n </div>\n );\n });\n TagManager.dataLayer({\n dataLayer: {\n event: \"createdArticles\",\n centreName: centre.Centre.value\n },\n dataLayerName: \"dataLayer\"\n });\n return (\n <div className=\"col-3\">\n <div className=\"centre-name\">{centre.Centre.value}</div>\n <div className=\"centre-preview-list\">{centrePreview}</div>\n </div>\n );\n });\n return <div className=\"row\">{preview}</div>;\n };\n\n saveForm = async () => {\n const { formData, mode } = this.state;\n var timezoneId = new Date().getTimezoneOffset();\n const url = \"/api/sitecore/article/SaveArticle\";\n let data = buildFormData({\n ...formData,\n timeZoneId: timezoneId\n });\n try {\n let response = await axios({\n method: \"POST\",\n url,\n data,\n params: {\n ...(mode === \"edit\" ? { itemId: `&itemId=${formData.itemId}` } : \"\")\n },\n config: { headers: { \"Content-Type\": \"multipart/form-data\" } }\n });\n\n if (response) {\n if (response.data.IsSuccess.value && mode === \"new\") {\n let successMessage = {\n title: \"Article drafts have been created\",\n body: this.buildPreviewUrls(response.data.ArticleList)\n };\n const itemIds = this.extractItemIds(response.data.ArticleList);\n this.setState({\n showModal: true,\n modalContent: successMessage,\n formData: { ...formData, itemIds },\n status: \"saved\"\n });\n } else if (response.data.IsSuccess.value && mode === \"edit\") {\n let successMessage = {\n title: \"Form Saved\",\n body: response.data.Message.value\n };\n const article = response.data.ArticleList[0].Articles[0];\n this.setState(\n {\n showModal: true,\n modalContent: successMessage,\n formData: { ...formData, itemIds: [`${article.ItemId.value}`] }\n },\n () => {\n const win = window.open(article.PreviewUrl.value, \"_blank\");\n if (win != null) {\n win.focus();\n }\n }\n );\n } else {\n let errorMessage = {\n title: \"Form Not Saved\",\n body: response.data.Message.value\n };\n\n this.setState({\n showModal: true,\n modalContent: errorMessage\n });\n }\n }\n } catch (e) {\n console.log(e.response.statusText);\n }\n };\n\n submitForm = async () => {\n const { formData, mode } = this.state;\n const url = \"/api/sitecore/article/SubmitArticle\";\n let data = buildFormData({\n itemIds: mode === \"edit\" ? [`${formData.itemId}`] : formData.itemIds\n });\n\n try {\n let response = await axios({\n method: \"POST\",\n url,\n data,\n config: { headers: { \"Content-Type\": \"multipart/form-data\" } }\n });\n\n if (response) {\n if (response.data.IsSuccess.value) {\n let successMessage = {\n title: \"Form Submitted\",\n body: response.data.Message.value,\n cta: {\n label: \"Article list\",\n url: response.data.RedirectUrl.value\n }\n };\n this.setState({\n showModal: true,\n modalContent: successMessage,\n status: \"submitted\"\n });\n } else {\n let errorMessage = {\n title: \"Form Not Submitted\",\n body: response.data.Message.value\n };\n\n this.setState({\n showModal: true,\n modalContent: errorMessage\n });\n }\n }\n } catch (e) {\n console.log(e.response.statusText);\n }\n };\n\n getCentreStoreList = async retailerId => {\n let response = await getCentreStores({ retailerId });\n if (response.status === 200 && response.data) {\n this.setState({\n centreStoreList: get(response.data, \"CentreStoreList\", []),\n retailerId\n });\n } else {\n alert(\"Getting centre stores data failed\");\n }\n };\n\n handleStoreListCheckbox = value => {\n const { formData, selectAllStores, centreStoreList } = this.state;\n if (value === \"0\") {\n let allStores = [];\n centreStoreList.map(centre => {\n centre.StoreList.map(store => {\n allStores.push(store.StoreItemId.value);\n });\n });\n\n this.setState({\n selectAllStores: !selectAllStores,\n formData: {\n ...formData,\n selectedStores: !selectAllStores ? allStores : []\n }\n });\n } else if (formData.selectedStores.indexOf(value) > -1) {\n this.setState({\n formData: {\n ...formData,\n selectedStores: formData.selectedStores.filter(el => el !== value)\n }\n });\n } else {\n this.setState({\n formData: {\n ...formData,\n selectedStores: [...formData.selectedStores, value]\n }\n });\n }\n };\n\n buildCentreStoreList = param => {\n // const cetnreStoreList = getCentreStoreList\n const { formData, centreStoreList, selectAllStores } = this.state;\n if (centreStoreList && centreStoreList.length) {\n return (\n <div className=\"form-stores\">\n <div className=\"form-label\">Multiple Stores</div>\n <div className=\"content\">\n <div className=\"row line\">\n <div className=\"col-3\">\n <FormCheckbox\n // key={`store-${store.StoreItemId.value}`}\n value=\"0\"\n label=\"Select All\"\n checked={selectAllStores}\n onCheckboxChange={value =>\n this.handleStoreListCheckbox(value)\n }\n />\n </div>\n </div>\n <div className=\"row\">\n {centreStoreList.map((centre, index) => {\n return (\n <div className=\"col-3\">\n <div className=\"form-label\">{centre.CentreName.value}</div>\n {centre.StoreList.map(store => {\n return (\n <FormCheckbox\n // key={`store-${store.StoreItemId.value}`}\n value={store.StoreItemId.value}\n label={store.StoreName.value}\n // checked={false}\n checked={\n formData.selectedStores.indexOf(\n store.StoreItemId.value\n ) > -1\n }\n // onCheckboxChange={value => this.getCentreStoreList(value)}\n onCheckboxChange={value =>\n this.handleStoreListCheckbox(value)\n }\n />\n );\n })}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n }\n };\n\n render() {\n const {\n mode,\n formError,\n formData,\n retailers,\n showModal,\n componentReady,\n centreStoreList,\n redirectUrl,\n holidays,\n categories\n } = this.state;\n\n if (!retailers) {\n return null;\n }\n\n return (\n <div className=\"article-container\">\n {showModal && this.renderModal()}\n <div className=\"body-section-title\">\n {mode === \"new\" ? `Create an Article` : `Update an Article`}\n </div>\n {mode === \"new\" && (\n <div className=\"form-type-wrapper d-none\">\n <DropDown\n theme=\"light\"\n options={retailers}\n error={formError.selectedRetailer}\n defaultSelected={retailers[0].name}\n // defaultSelected=\"Select Retailer\"\n handleSelectionChange={selectedRetailerName => {\n this.getCentreStoreList(\n retailers.filter(el => el.name === selectedRetailerName)[0]\n .value\n );\n }}\n />\n </div>\n )}\n\n {centreStoreList && this.buildCentreStoreList(centreStoreList)}\n\n <div className=\"form-images-container\">\n <div className=\"hero-wrapper\">\n <div className=\"form-label\">\n Hero Image<span>*</span>\n </div>\n <ImageUpload\n type=\"hero\"\n labelOne=\"*Images must be a min of \"\n labelTwo=\"1920x1080 px \"\n labelThree=\"(16:9 ratio)\"\n placeholder={bitmap}\n error={formError.heroImage}\n value={formData.heroImage}\n handleFileUpload={(heroImage, errorMessage) =>\n this.handleFormUpdate({ heroImage })\n }\n />\n {/* <div className=\"form-subtext\">\n *Please do not use images that contain text\n </div> */}\n </div>\n <div className=\"thumbnail-wrapper\">\n <div className=\"form-label\">Thumbnail Image</div>\n <ImageUpload\n type=\"thumbnail\"\n labelOne=\"*Images must be a min of \"\n labelTwo=\"800x800 px \"\n labelThree=\"(1:1 ratio)\"\n placeholder={bitmap}\n error={formError.thumbnail}\n value={formData.thumbnail}\n handleFileUpload={(thumbnail, errorMessage) =>\n this.handleFormUpdate({ thumbnail })\n }\n />\n </div>\n </div>\n {/* <FormInput\n type=\"text\"\n placeholder=\"Please add a category tag.\"\n label=\"Category Tag\"\n value={formData.categoryTag}\n error={formError.categoryTag}\n onInputChange={categoryTag => this.handleFormUpdate({ categoryTag })}\n /> */}\n\n {categories && categories.length ? (\n <FormListbox\n label=\"Category\"\n id=\"LB_Cat\"\n required\n error={formError.selectedCategories}\n options={categories}\n field=\"selectedCategories\"\n selected={formData.selectedCategories}\n hint=\"Press [ctrl] + click to select multiple\"\n handleListbox={(id, field) => this.handleListbox(id, field)}\n handleSelect={(isSelect, field, options) =>\n this.handleSelect(isSelect, field, options)\n }\n />\n ) : (\n \"\"\n )}\n\n {holidays && holidays.length ? (\n <FormListbox\n label=\"Special Promotions\"\n id=\"LB_SH\"\n options={holidays}\n field=\"selectedSpecialPromotion\"\n selected={formData.selectedSpecialPromotion}\n hint=\"Press [ctrl] + click to select multiple\"\n handleListbox={(id, field) => this.handleListbox(id, field)}\n handleSelect={(isSelect, field) =>\n this.handleSelect(isSelect, field, holidays)\n }\n />\n ) : (\n \"\"\n )}\n <FormInput\n type=\"text\"\n placeholder=\"Please add an article title.\"\n label=\"Article Name\"\n value={formData.articleName}\n required\n error={formError.articleName}\n onInputChange={articleName => this.handleFormUpdate({ articleName })}\n />\n <FormInputMultiple\n label=\"Subheading\"\n required\n value={formData.subheading}\n maxLength={120}\n error={formError.subheading}\n onInputChange={subheading => this.handleFormUpdate({ subheading })}\n />\n\n <div className=\"form-dates-container\">\n <div className=\"form-dates-wrapper\">\n <div className=\"date-wrapper\">\n <div className=\"form-label\">\n Publish Date<span>*</span>\n </div>\n <FormDate\n icon=\"calendar\"\n placeholderText=\"MM/DD/YYYY\"\n dateFormat=\"MM/dd/yyyy\"\n value={formData.publishDate}\n error={formError.publishDate}\n selected={\n formData.publishDate && new Date(formData.publishDate)\n }\n onChange={publishDate => this.handleFormUpdate({ publishDate })}\n />\n </div>\n <div className=\"date-wrapper\">\n <div className=\"form-label\">End Date</div>\n <FormDate\n icon=\"calendar\"\n placeholderText=\"MM/DD/YYYY\"\n dateFormat=\"MM/dd/yyyy\"\n value={formData.endDate}\n selected={formData.endDate && new Date(formData.endDate)}\n onChange={endDate => this.handleFormUpdate({ endDate })}\n />\n </div>\n </div>\n </div>\n\n {componentReady && (\n <RichTextEditor\n required\n label={\"Body\"}\n initialValue={formData.body}\n error={formError.body}\n onInputChange={body => this.handleFormUpdate({ body })}\n retailerId={this.state.retailerId}\n />\n )}\n\n <div className=\"form-imagegallery-container\">\n <div className=\"form-label\">Image Gallery</div>\n <FormFile\n icon=\"plus\"\n label=\"Add Image\"\n // value={[{ name: \"sample.png\" }]}\n value={formData.imageGallery}\n handleAttachments={(imageGallery, errorMessage) =>\n this.handleFormUpdate({ imageGallery })\n }\n />\n </div>\n\n <div className=\"form-controls-container\">\n {mode === \"new\" && (\n <Button\n color=\"secondary\"\n onClick={() => (window.location.href = `${redirectUrl}`)}\n >\n CANCEL\n </Button>\n )}\n <Button\n size=\"medium\"\n color={mode === \"edit\" ? \"secondary\" : \"primary\"}\n onClick={() => this.validateForm()}\n // onClick={() => this.saveForm()}\n >\n {mode === \"edit\" ? \"SAVE & PREVIEW\" : \"SAVE\"}\n </Button>\n {mode === \"edit\" && (\n <Button\n disabled={formData.itemId ? false : true}\n color=\"primary\"\n onClick={() => this.submitForm()}\n >\n SUBMIT\n </Button>\n )}\n </div>\n </div>\n );\n }\n}\n\nexport default FeatureRetailerPortalArticles;\n","import React, { Component, Fragment } from \"react\";\r\nimport { Text } from \"@sitecore-jss/sitecore-jss-react\";\r\nimport Select from \"react-select\";\r\nimport axios from \"axios\";\r\nimport { getWaitingApprovalUsers } from \"../../../../api/UsersAPI\";\r\nimport Button from \"../../../Base/Button\";\r\nimport {\r\n disableBodyScroll,\r\n enableBodyScroll,\r\n} from \"../../../../helper/ScrollHelper\";\r\nimport { addClassLazyload } from \"../../../../helper/AddClassLazyloadHelper\";\r\nimport { scrollToTop } from \"../../../../helper/ScrollHelper\";\r\nimport logoPlaceholder from \"../../../../assets/img/logoPlaceholder.png\";\r\nimport ReactPaginate from \"react-paginate\";\r\nimport Popup from \"../../../Base/Popup\";\r\nimport ListItem from \"../../../Base/ListItem\";\r\nimport SuccessMessage from \"../../../Base/SuccessMessage\";\r\nimport CustomFilter from \"../../../Base/CustomFilter\";\r\nimport FilterRadioButton from \"../../../Base/CustomFilter/FilterRadioButton\";\r\nimport NoResultMessage from \"../../../Base/NoResultMessage\";\r\nimport PopupAction from \"../../../Base/Popup/PopupAction\";\r\n\r\nclass FeatureRetailerPortalAuthorisations extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n activePageNum: 0,\r\n totalPageNumber: null,\r\n totalResults: null,\r\n showPagination: false,\r\n showLoader: true,\r\n showRejectModal: false,\r\n showApproveModal: false,\r\n showFilter: false,\r\n modalMessage: null,\r\n hideIcon: true,\r\n userItems: null,\r\n selectedItems: null,\r\n selectedItem: null,\r\n centreOptions: null,\r\n filterCentre: \"all\",\r\n isDocumentReady: false,\r\n filteredItems: null,\r\n itemCount: null,\r\n itemTotal: null,\r\n retailerLogo: null,\r\n rejectMessage: \"\",\r\n paginationRange: 7,\r\n isDesktop: true,\r\n };\r\n }\r\n\r\n getData = async (params) => {\r\n this.setState({\r\n showLoader: true,\r\n });\r\n\r\n try {\r\n const response = await getWaitingApprovalUsers(params);\r\n if (response && response.data) {\r\n const { Users, TotalPageNumber, TotalResults } = response.data;\r\n this.setState(\r\n {\r\n userItems: Users,\r\n filteredItems: Users,\r\n totalPageNumber: TotalPageNumber.value,\r\n totalResults: TotalResults.value,\r\n itemTotal: TotalResults.value,\r\n showPagination: true,\r\n showLoader: false,\r\n },\r\n () => {\r\n this.handleChecked();\r\n this.getFilters();\r\n this.handleItems(0);\r\n }\r\n );\r\n }\r\n } catch (e) {\r\n console.error(\r\n (\"Get Workbox Items Error: \" + e &&\r\n e.response &&\r\n e.response.statusText) ||\r\n \"\"\r\n );\r\n }\r\n };\r\n\r\n getOptions = (items, value, addAll, options, all) => {\r\n if (value && value.indexOf(\"Store\") === 0) {\r\n value = \"Store\";\r\n }\r\n if (value && !items.includes(value)) {\r\n items.push(value);\r\n }\r\n // if (index === this.state.userItems.length - 1) {\r\n if (addAll) {\r\n options.push({ value: \"all\", label: all });\r\n items\r\n .sort((a, b) => (a > b ? 1 : -1))\r\n .map((el) => options.push({ value: el, label: el }));\r\n }\r\n };\r\n\r\n getFilters = () => {\r\n const { userItems } = this.state;\r\n let centreItems = [];\r\n let centreOptions = [];\r\n if (userItems && userItems.length) {\r\n userItems.map((el, index) => {\r\n const { Centres } = el;\r\n if (Centres) {\r\n const splitCentreArray = Centres.value.split(', ');\r\n splitCentreArray.forEach((centreVal, cIndex) => {\r\n this.getOptions(\r\n centreItems,\r\n centreVal,\r\n (index === userItems.length - 1 && cIndex === splitCentreArray.length - 1),\r\n centreOptions,\r\n \"All centres\"\r\n );\r\n });\r\n }\r\n });\r\n this.setState({ centreOptions });\r\n }\r\n };\r\n\r\n componentDidMount() {\r\n if (window) {\r\n this.handleResize();\r\n window.addEventListener(\"resize\", this.handleResize);\r\n }\r\n if (document) {\r\n this.setState({ isDocumentReady: true });\r\n }\r\n let params = {\r\n pageNumber: 1,\r\n };\r\n this.getData(params);\r\n }\r\n\r\n handleResize = () => {\r\n if (window.outerWidth >= 768) {\r\n this.setState({\r\n paginationRange: 7,\r\n });\r\n } else {\r\n this.setState({\r\n paginationRange: 3,\r\n });\r\n }\r\n if (window.outerWidth >= 992) {\r\n this.setState({\r\n isDesktop: true,\r\n });\r\n } else {\r\n this.setState({\r\n isDesktop: false,\r\n });\r\n }\r\n };\r\n\r\n handleFilter = (filter, id) => {\r\n this.setState({ [filter]: id, activePageNum: 0 }, () => {\r\n this.uncheckAll();\r\n this.handleItems(0);\r\n addClassLazyload(\"approvals-item-container\");\r\n scrollToTop();\r\n });\r\n };\r\n\r\n handleItems = (selected) => {\r\n const {\r\n filterCentre,\r\n userItems,\r\n totalPageNumber,\r\n } = this.state;\r\n\r\n let unfiltered = userItems;\r\n if (unfiltered) {\r\n if (filterCentre !== \"all\") {\r\n unfiltered = unfiltered.filter(\r\n (item) => {\r\n if (!item || !item.Centres) {\r\n return false;\r\n }\r\n const splitCentreArray = item.Centres.value.split(', ');\r\n let hasFilteredCentre = false;\r\n splitCentreArray.forEach(itemCentre => {\r\n if (itemCentre === filterCentre) {\r\n hasFilteredCentre = true;\r\n }\r\n });\r\n return hasFilteredCentre;\r\n }\r\n );\r\n }\r\n const currentPage = selected + 1;\r\n const until = currentPage * 10;\r\n const from = until - 10;\r\n const list = unfiltered.slice(from, until);\r\n\r\n const listLength = unfiltered && unfiltered.length;\r\n let itemCount = from + 1 + \" – \" + until;\r\n if (currentPage == totalPageNumber || listLength < 11) {\r\n itemCount = from + 1 + \" – \" + listLength;\r\n }\r\n if (listLength == 1) {\r\n itemCount = 1;\r\n }\r\n\r\n this.setState(\r\n {\r\n filteredItems: list,\r\n itemCount,\r\n totalPageNumber: listLength ? Math.ceil(listLength / 10) : null,\r\n itemTotal: listLength || null,\r\n },\r\n () => this.handleChecked()\r\n );\r\n }\r\n };\r\n\r\n uncheckAll = () => {\r\n let checks = document.querySelectorAll(\r\n \".approvals-item-container input:checked\"\r\n );\r\n for (let i = 0; i < checks.length; i++) {\r\n checks[i].checked = false;\r\n }\r\n this.setState({ selectedItem: null, selectedItems: null });\r\n };\r\n\r\n handleSelected = (value, checked) => {\r\n let items = this.state.selectedItems || [];\r\n if (checked) {\r\n items.push(value);\r\n } else {\r\n items.map((item, index) =>\r\n item === value ? items.splice(index, 1) : null\r\n );\r\n }\r\n this.setState({ selectedItems: items });\r\n };\r\n\r\n handleChecked = () => {\r\n let items = this.state.selectedItems || [];\r\n if (items && items.length) {\r\n let checks = document.querySelectorAll(\".approvals-item-container input\");\r\n for (let i = 0; i < checks.length; i++) {\r\n let isMatch;\r\n items.map((item) => {\r\n if (item === checks[i].value) {\r\n isMatch = true;\r\n }\r\n });\r\n if (isMatch) {\r\n checks[i].checked = true;\r\n } else checks[i].checked = false;\r\n }\r\n }\r\n };\r\n\r\n renderRejectModal = () => {\r\n disableBodyScroll();\r\n const { selectedItems, selectedItem, rejectMessage } = this.state;\r\n let itemCount = selectedItems && selectedItems.length;\r\n let items = selectedItems;\r\n if (selectedItem && selectedItem.length) {\r\n itemCount = selectedItem.length;\r\n items = selectedItem;\r\n }\r\n const message =\r\n \"You’re about to reject \" +\r\n itemCount +\r\n \" piece\" +\r\n (itemCount === 1 ? \"\" : \"s\") +\r\n \" of user request.<br>\" +\r\n \"This cannot be undone.\";\r\n return (\r\n <Popup>\r\n <PopupAction\r\n label={{ value: `Are you sure?` }}\r\n description={{ value: message }}\r\n icon=\"trash-2\"\r\n iconBgColor=\"#d83b42\"\r\n secondaryBtn=\"Cancel\"\r\n secondaryBtnOnClick={() =>\r\n this.setState(\r\n {\r\n showRejectModal: false,\r\n selectedItem: null,\r\n rejectMessage: \"\",\r\n },\r\n () => enableBodyScroll()\r\n )\r\n }\r\n primaryBtn=\"Reject\"\r\n primaryBtnOnClick={() => this.rejectItems(items)}\r\n primaryBtnColor=\"red\"\r\n withRejectMessage={false}\r\n />\r\n </Popup>\r\n );\r\n };\r\n\r\n renderApproveModal = () => {\r\n const { modalMessage, hideIcon } = this.state;\r\n return (\r\n <SuccessMessage\r\n label={modalMessage}\r\n hideIcon={hideIcon}\r\n handleShowSuccess={(showApproveModal) => {\r\n this.setState({\r\n showApproveModal,\r\n });\r\n }}\r\n />\r\n );\r\n };\r\n\r\n rejectItems = async (items) => {\r\n const jsonData = { usernames: items };\r\n const url = \"/api/sitecore/user/RejectUser\";\r\n this.setState({\r\n rejectMessage: \"\",\r\n });\r\n\r\n try {\r\n // let response = await BaseURL.post(url, formData);\r\n let response = await axios({\r\n method: \"POST\",\r\n url,\r\n headers: { 'Content-Type': 'application/json' },\r\n data: jsonData,\r\n });\r\n if (response && response.data) {\r\n const { IsSuccess = null, Message = null } = response.data;\r\n if (IsSuccess && IsSuccess.value) {\r\n this.setState(\r\n {\r\n showRejectModal: false,\r\n hideIcon: true,\r\n modalMessage: Message.value,\r\n showApproveModal: true,\r\n showLoader: true,\r\n },\r\n () => {\r\n enableBodyScroll();\r\n this.resetState();\r\n }\r\n );\r\n } else {\r\n this.setState(\r\n {\r\n showRejectModal: false,\r\n hideIcon: true,\r\n modalMessage: Message.value,\r\n showApproveModal: true,\r\n },\r\n () => {\r\n enableBodyScroll();\r\n }\r\n );\r\n }\r\n } else {\r\n this.setState(\r\n {\r\n showRejectModal: false,\r\n hideIcon: true,\r\n modalMessage: \"Something went wrong. Please try again.\",\r\n showApproveModal: true,\r\n },\r\n () => {\r\n enableBodyScroll();\r\n }\r\n );\r\n }\r\n scrollToTop(true);\r\n } catch (e) {\r\n this.setState(\r\n {\r\n showRejectModal: false,\r\n hideIcon: true,\r\n modalMessage: \"Something went wrong. Please try again.\",\r\n showApproveModal: true,\r\n },\r\n () => {\r\n enableBodyScroll();\r\n scrollToTop(true);\r\n }\r\n );\r\n }\r\n };\r\n\r\n approveItems = async () => {\r\n const { selectedItems, selectedItem } = this.state;\r\n let items = selectedItems;\r\n if (selectedItem && selectedItem.length) {\r\n items = selectedItem;\r\n }\r\n const jsonData = { usernames: items };\r\n const url = \"/api/sitecore/user/ApproveUser\";\r\n\r\n try {\r\n // let response = await BaseURL.post(url, formData);\r\n let response = await axios({\r\n method: \"POST\",\r\n url,\r\n headers: { 'Content-Type': 'application/json' },\r\n data: jsonData,\r\n });\r\n if (response && response.data) {\r\n const { IsSuccess = null, Message = null } = response.data;\r\n console.log(response);\r\n if (IsSuccess && IsSuccess.value) {\r\n this.setState(\r\n {\r\n modalMessage: Message.value,\r\n showApproveModal: true,\r\n hideIcon: false,\r\n showLoader: true,\r\n },\r\n () => this.resetState()\r\n );\r\n } else {\r\n this.setState({\r\n modalMessage: Message.value,\r\n showApproveModal: true,\r\n });\r\n }\r\n } else {\r\n this.setState({\r\n modalMessage: \"Something went wrong. Please try again.\",\r\n showApproveModal: true,\r\n });\r\n }\r\n scrollToTop(true);\r\n } catch (e) {\r\n this.setState({\r\n modalMessage: \"Something went wrong. Please try again.\",\r\n showApproveModal: true,\r\n },\r\n () => scrollToTop(true)\r\n );\r\n }\r\n };\r\n\r\n resetState = () => {\r\n this.setState(\r\n {\r\n activePageNum: 0,\r\n showFilter: false,\r\n selectedItems: null,\r\n selectedItem: null,\r\n centreOptions: null,\r\n filterCentre: \"all\",\r\n modalIcon: true,\r\n filteredItems: null,\r\n itemCount: null,\r\n itemTotal: null,\r\n },\r\n () => {\r\n let params = {\r\n pageNumber: 1,\r\n };\r\n setTimeout(() => this.getData(params), 1000);\r\n }\r\n );\r\n };\r\n\r\n handlePaginationClick = (data) => {\r\n this.setState(\r\n {\r\n activePageNum: data.selected,\r\n },\r\n () => scrollToTop()\r\n );\r\n this.handleItems(data.selected);\r\n addClassLazyload(\"approvals-item-container\");\r\n };\r\n\r\n renderPagination = () => {\r\n const { totalPageNumber, paginationRange } = this.state;\r\n return (\r\n totalPageNumber &&\r\n totalPageNumber > 1 && (\r\n <div className=\"react-paginate-wrapper\">\r\n <ReactPaginate\r\n previousLabel={\r\n <div>\r\n <i className=\"icon icon-chevron-outline-left\" />\r\n <span>Previous</span>\r\n </div>\r\n }\r\n nextLabel={\r\n <div>\r\n <i className=\"icon icon-chevron-outline-right\" />\r\n <span>Next</span>\r\n </div>\r\n }\r\n breakLabel={\"...\"}\r\n breakClassName={\"break-me\"}\r\n pageCount={totalPageNumber}\r\n marginPagesDisplayed={0}\r\n pageRangeDisplayed={paginationRange}\r\n forcePage={this.state.activePageNum}\r\n onPageChange={this.handlePaginationClick}\r\n containerClassName={\"pagination\"}\r\n subContainerClassName={\"pages pagination\"}\r\n activeClassName={\"active\"}\r\n />\r\n </div>\r\n )\r\n );\r\n };\r\n\r\n renderItems = () => {\r\n const { filteredItems, selectedItems } = this.state;\r\n return (\r\n <div className=\"approvals-item-container\">\r\n {filteredItems && filteredItems.length ? (\r\n filteredItems.map((item, index) => {\r\n const {\r\n UserName,\r\n FullName,\r\n Centres,\r\n ProfilePicture,\r\n Retailers,\r\n Email\r\n } = item;\r\n let isSelected = false;\r\n if (selectedItems && selectedItems.length) {\r\n selectedItems.map((selected) =>\r\n selected === UserName.value ? (isSelected = true) : null\r\n );\r\n }\r\n\r\n let title = '';\r\n if (FullName && FullName.value) {\r\n title = FullName.value;\r\n } else if (Retailers && Retailers.value && Centres && Centres.value) {\r\n title = Retailers.value + \" \" + Centres.value;\r\n }\r\n\r\n return (\r\n <ListItem\r\n key={`itemId-${index}`}\r\n isSelected={isSelected}\r\n noActionBtn={true}\r\n logoSrc={\r\n ProfilePicture && ProfilePicture.value && ProfilePicture.value.src\r\n ? ProfilePicture.value.src\r\n : logoPlaceholder\r\n }\r\n label={{\r\n value: (\r\n <Fragment>\r\n <Text field={Retailers} />\r\n {Centres && Centres.value && Retailers && Retailers.value && \" – \"}\r\n <Text field={Centres} />\r\n </Fragment>\r\n ),\r\n }}\r\n title={{\r\n value: (\r\n <Fragment>\r\n <Text field={FullName} />\r\n </Fragment>\r\n ),\r\n }}\r\n description={{\r\n value:\r\n Email && Email.value\r\n ? Email.value\r\n : null,\r\n }}\r\n btnOne={{\r\n icon: \"thumbs-up\",\r\n color: \"primary\",\r\n tooltip: \"Approve\",\r\n }}\r\n btnOneOnClick={() => {\r\n this.setState(\r\n {\r\n selectedItem: [UserName.value],\r\n },\r\n () => this.approveItems()\r\n );\r\n }}\r\n btnTwo={{\r\n icon: \"thumbs-down\",\r\n color: \"red\",\r\n tooltip: \"Reject\",\r\n }}\r\n btnTwoOnClick={() =>\r\n this.setState({\r\n selectedItem: [UserName.value],\r\n showRejectModal: true,\r\n })\r\n }\r\n checkboxValue={UserName.value}\r\n checkboxOnChange={(value, checked) =>\r\n this.handleSelected(value, checked)\r\n }\r\n />\r\n );\r\n })\r\n ) : (\r\n <NoResultMessage label=\"No approvals\" />\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n handleHeaderIconClick = (clearItem) => {\r\n if (clearItem) {\r\n this.uncheckAll();\r\n } else {\r\n const leftNavWrapper = document.querySelector(\".left-nav\");\r\n const topNavWrapper = document.querySelector(\".top-nav .top-nav-wrapper\");\r\n\r\n if (leftNavWrapper && topNavWrapper) {\r\n leftNavWrapper.classList.add(\"show-nav-mobile\");\r\n topNavWrapper.classList.add(\"show-nav-mobile\");\r\n }\r\n }\r\n };\r\n\r\n render() {\r\n const {\r\n selectedItems,\r\n showPagination,\r\n showLoader,\r\n showRejectModal,\r\n showApproveModal,\r\n showFilter,\r\n isDocumentReady,\r\n itemTotal,\r\n totalResults,\r\n centreOptions,\r\n itemCount,\r\n isDesktop,\r\n filterCentre,\r\n } = this.state;\r\n const hasSelection = selectedItems && selectedItems.length;\r\n return (\r\n <div className={`authorisations-container ${showApproveModal ? \"has-success-message\" : \"\"}`}>\r\n <div className=\"approvals-header\">\r\n <div className=\"approvals-header-icon\">\r\n <button onClick={() => this.handleHeaderIconClick(hasSelection)}>\r\n <i className={`icon icon-${hasSelection ? \"close\" : \"menu\"}`} />\r\n </button>\r\n <div className=\"h1-regular\">\r\n {hasSelection ? selectedItems.length + \" selected\" : \"Authorisations\"}\r\n </div>\r\n </div>\r\n <div className=\"approvals-header-actions\">\r\n {hasSelection ? (\r\n <Fragment>\r\n <div\r\n className=\"header-cancel\"\r\n onClick={() => this.uncheckAll()}\r\n >\r\n Cancel\r\n </div>\r\n <Button\r\n color=\"primary\"\r\n size=\"small\"\r\n className=\"approvals-approve-btn\"\r\n onClick={() =>\r\n this.setState({ selectedItem: null }, () =>\r\n this.approveItems()\r\n )\r\n }\r\n >\r\n <span className=\"d-none d-lg-block\">Approve</span>\r\n <i className=\"icon icon-thumbs-up\" />\r\n </Button>\r\n\r\n <Button\r\n color=\"red\"\r\n size=\"small\"\r\n className=\"approvals-reject-btn\"\r\n onClick={() =>\r\n this.setState({\r\n selectedItem: null,\r\n showRejectModal: true,\r\n })\r\n }\r\n >\r\n <span className=\"d-none d-lg-block\">Reject</span>\r\n <i className=\"icon icon-thumbs-down\" />\r\n </Button>\r\n </Fragment>\r\n ) : (\r\n \"\"\r\n )}\r\n {!showFilter && !showLoader && totalResults && totalResults > 1 && (\r\n <Button\r\n color=\"secondary\"\r\n className=\"approvals-filter-btn\"\r\n size=\"small\"\r\n onClick={() => this.setState({ showFilter: true })}\r\n >\r\n Filter\r\n </Button>\r\n )}\r\n </div>\r\n </div>\r\n {showRejectModal && this.renderRejectModal()}\r\n {isDocumentReady && (\r\n <CustomFilter\r\n showFilter={showFilter}\r\n onCloseFilter={() => this.setState({ showFilter: false })}\r\n >\r\n <div className=\"custom-filter__group\">\r\n <div className=\"custom-filter__label\">Filter by centre</div>\r\n {centreOptions && centreOptions.length ? (\r\n centreOptions.length < 5 && isDesktop ? (\r\n <FilterRadioButton\r\n defaultSelected={filterCentre}\r\n options={centreOptions}\r\n radioGroupName=\"approvalCentre\"\r\n onChange={(id) => this.handleFilter(\"filterCentre\", id)}\r\n plain\r\n />\r\n ) : (\r\n <Select\r\n onChange={(option) => {\r\n this.handleFilter(\"filterCentre\", option.value);\r\n }}\r\n defaultValue={\r\n filterCentre === \"all\"\r\n ? centreOptions[0]\r\n : { value: filterCentre, label: filterCentre }\r\n }\r\n options={centreOptions}\r\n theme={(theme) => ({\r\n ...theme,\r\n colors: {\r\n ...theme.colors,\r\n primary: \"#536760\",\r\n primary25: \"#f5f5f6\",\r\n },\r\n })}\r\n isSearchable={false}\r\n maxMenuHeight={200}\r\n menuPlacement=\"auto\"\r\n />\r\n )\r\n ) : (\r\n \"\"\r\n )}\r\n </div>\r\n </CustomFilter>\r\n )}\r\n {showApproveModal && this.renderApproveModal()}\r\n {!showLoader && this.renderItems()}\r\n {!showLoader && itemTotal && itemCount && (\r\n <div className=\"list-count\">\r\n Showing {itemCount} of {itemTotal}\r\n </div>\r\n )}\r\n {showLoader && (\r\n <div className=\"loader-wrapper container\">\r\n <div className=\"loader\" />\r\n </div>\r\n )}\r\n {showPagination && <div>{this.renderPagination()}</div>}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default FeatureRetailerPortalAuthorisations;\r\n","import BaseURL from \"./BaseURL\";\r\n\r\nconst isDev = process.env.REACT_APP_DEV || false;\r\n\r\nexport const getUsers = (params) => {\r\n const endpoint = isDev ? \"/GetUsers\" : \"/user/GetUsers\";\r\n return BaseURL.get(endpoint, { params: { ...params } });\r\n};\r\n\r\nexport const deleteUser = (params) => {\r\n return BaseURL.get(\"/user/DeleteUser\", { params: { ...params } });\r\n};\r\n\r\nexport const getRetailerList = () => {\r\n const endpoint = isDev ? \"/GetRetailerList\" : \"/user/GetRetailerList\";\r\n return BaseURL.get(endpoint);\r\n\r\n};\r\n\r\nexport const getCreateEditUser = (params) => {\r\n const endpoint = isDev ? \"/GetCreateEditUser\" : \"/user/GetCreateEditUser\";\r\n return BaseURL.get(endpoint, { params: { ...params } });\r\n};\r\n\r\nexport const getWaitingApprovalUsers = (params) => {\r\n const endpoint = \"/user/GetWaitingApprovalUsers\";\r\n return BaseURL.get(endpoint, { params: { ...params } });\r\n};\r\n","import BaseURL from \"./BaseURL\";\n\n\nexport const getDashboardCorrespondences = params => {\n return BaseURL.get(\"/dashboard/GetDashboardCorrespondences\", { params: { ...params } });\n};\n\nexport const getDashboardStoreInfos = params => {\n return BaseURL.get(\"/dashboard/GetDashboardStoreInfos\", { params: { ...params } });\n};\n\nexport const getDashboardEvents = params => {\n return BaseURL.get(\"/dashboard/GetDashboardEvents\", { params: { ...params } });\n};\n\nexport const getDashboardOffers = params => {\n return BaseURL.get(\"/dashboard/GetDashboardOffers\", { params: { ...params } });\n};\n\nexport const getDashboardArticles = params => {\n return BaseURL.get(\"/dashboard/GetDashboardArticles\", { params: { ...params } });\n};","import BaseURL, {DevURL} from \"./BaseURL\";\n\nconst isDev = process.env.REACT_APP_DEV || false;\n\nexport const getEvents = (params) => {\n const endpoint = isDev ? \"/GetEvents\" : \"/store/GetEvents\";\n return BaseURL.get(endpoint, { params: { ...params } });\n;\n};\n\nexport const getOffers = (params) => {\n const endpoint = isDev ? \"/GetOffers\" : \"/store/GetOffers\";\n return BaseURL.get(endpoint, { params: { ...params } });\n};\n\nexport const deletePromotion = params => {\n return BaseURL.get(\"/store/DeletePromotion\", { params: { ...params } });\n};\n\nexport const createPromotion = params => {\n return BaseURL.get(\"/store/CreatePromotion\", { params: { ...params } });\n};\n\nexport const editPromotion = async () => {\n // const response = await BaseURL.get(\"/store/EditPromotion\");\n};\n\nexport const savePromotion = async () => {\n // const response = await BaseURL.post(\"/store/SavePromotion\");\n};\n\nexport const getStoreInfo = params => {\n const endpoint = isDev ? \"/GetStoreInfo\" : \"/store/GetStoreInfo\";\n return BaseURL.get(endpoint, { params: { ...params } });\n};\n\nexport const updateStoreInfo = params => {\n // return BaseURL.get(\"/store/UpdateStoreInfo\", { params: { ...params } });\n // return DevURL.get(\"/UpdateStoreInfo\", { params: { ...params } });\n};\n","import React, { Component, Fragment } from \"react\";\n\nclass FormSelect extends Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n const {\n label = null,\n required = null,\n disabled = null,\n error = null,\n onChange = null,\n options = [],\n defaultValue = null,\n noOptionsMessage = null,\n fullWidth = null,\n placeholder = null,\n } = this.props || {}\n\n return (\n <Fragment>\n <div className={`form-group form__select\n ${error ? \"has-error\" : \"\"}\n ${fullWidth ? \"is-full-width\" : \"\"}\n `}>\n {(label || required) &&\n <label className=\"form__label\">\n {label}\n {required &&\n <span className=\"form__asterisk\">*</span>\n }\n </label>\n }\n {(options && options.length > 0) ?\n <div className={`form__select--details\n ${disabled ? \"disabled\" : \"\"}\n `}>\n <select className=\"form__select--field\"\n onChange={e => onChange(e.target.value)}\n disabled={disabled}\n defaultValue={defaultValue}\n >\n {!defaultValue &&\n <option value={\"\"} hidden>\n {placeholder ? placeholder : \"Select your option\"}\n </option>\n }\n {options.map((item, index) => {\n const {\n Id: id = null,\n Name: name = null,\n } = item.fields || item;\n let optionLayout = \"\"\n\n if (id && id.value && name && name.value) {\n optionLayout =\n <option value={id.value}\n key={id.value + index}\n >\n {name.value}\n </option>\n }\n return optionLayout;\n })\n }\n </select>\n </div>\n : <div className=\"form__select--no-option\">\n {noOptionsMessage ? noOptionsMessage : \"No available option\"}\n </div>\n }\n <div className=\"form__validation-message\">\n {error}\n </div>\n </div>\n </Fragment >\n );\n }\n}\n\nexport default FormSelect;\n","import BaseURL, { DevURL } from \"./BaseURL\";\n\nconst isDev = process.env.REACT_APP_DEV || false;\n\nexport const getStorefrontData = params => {\n const endpoint = isDev ? \"/GetStorefrontData\" : \"/store/GetStorefrontData\";\n return BaseURL.get(endpoint, { params: { ...params } });\n\n};\n\nexport const getCarParkList = params => {\n const endpoint = isDev ? \"/GetStorefrontData\" : \"/store/GetCarParkList\";\n return BaseURL.get(endpoint, { params: { ...params } });\n\n};\n\nexport const getBookingIcon = params => {\n const endpoint = isDev ? \"/GetStorefrontData\" : \"/store/GetBookingIcons\";\n return BaseURL.get(endpoint, { params: { ...params } });\n\n};\n\nexport const getCategoryList = params => {\n const endpoint = isDev ? \"/GetStorefrontData\" : \"/store/GetCategoryList\";\n return BaseURL.get(endpoint, { params: { ...params } });\n\n};","// import { get } from \"lodash\";\n// import { AllHtmlEntities } from \"html-entities\"\nimport { AllHtmlEntities as Entities } from \"html-entities\";\n\nconst isEmpty = (value) => {\n return value ? true : false;\n};\n\nexport const validate = (state, removeValidate) => {\n let list = [\n {\n name: \"selectedStore\",\n value: state.selectedStore,\n rules: \"required\",\n },\n {\n name: \"promotionName\",\n value: state.promotionName,\n rules: \"required\",\n },\n {\n name: \"startDate\",\n value: state.startDate,\n rules: \"required\",\n },\n {\n name: \"endDate\",\n value: state.endDate,\n rules: \"required\",\n },\n {\n name: \"heroImage\",\n value: state.heroImage,\n rules: \"required\",\n },\n ];\n\n let result = {};\n list.forEach((element) => {\n if (removeValidate.indexOf(element.name) > -1) {\n return;\n }\n if (element.rules === \"required\") {\n if (!isEmpty(element.value)) {\n result[element.name] = \"Required\";\n }\n }\n\n //Other Validation Rules\n });\n return result;\n};\n\n// export const formDataFields = {\n// itemId: null,\n// selectedStore: null,\n// categoryTag: \"\",\n// promotionName: \"\",\n// summary: \"\",\n// startDate: \"\",\n// endDate: \"\",\n// location: \"\",\n// schedule: \"\",\n// duration: \"\",\n// capacity: \"\",\n// price: \"\",\n// description: \"\",\n// bookNowLink: \"\",\n// bookNowLinkCaption: \"\",\n// selectedCategories: [],\n// heroImage: \"\",\n// thumbnail: \"\",\n// imageGalleryChecker: [],\n// imageGallery: []\n// };\n\n// export const setPromotionData = data => {\n// return {\n// itemId: data.ItemId.value,\n// heroImage: get(data, \"HeroImage.value.src\", null),\n// thumbnail: get(data, \"Thumbnail.value.src\", null),\n// promotionName: data.Name.value,\n// duration: data.Duration.value,\n// capacity: data.Capacity.value,\n// location: data.Location.value,\n// categoryTag: data.CategoryTag.value,\n// summary: data.Summary.value,\n// startDate: data.StartDate.value,\n// endDate: data.EndDate.value,\n// schedule: data.Schedule.value,\n// price: data.Price.value,\n// description: data.Description.value,\n// bookNowLink: data.BookNowLink.value,\n// bookNowLinkCaption: data.BookNowLinkCaption.value,\n// selectedCategories: data.LinkCategories.map(\n// el => el.fields.CategoryId.value\n// ),\n// imageGalleryChecker: data.ImageGallery.map(el => el.fields.Id.value),\n// imageGallery: data.ImageGallery.map(el => {\n// return { name: el.fields.Name.value, id: el.fields.Id.value };\n// })\n// };\n// };\n\nexport const buildFormData = (postData) => {\n const formData = new FormData();\n const entities = new Entities();\n Object.keys(postData).forEach(function (key) {\n // if ((key === \"startDate\" || key === \"endDate\") && postData[key]) {\n // return formData.append(key, new Date(postData[key]).toISOString());\n // }\n if (key === \"RetailerDescription\" || key === \"StorefrontDescription\") {\n formData.append(key, entities.encode(postData[key]));\n return;\n }\n\n if (key === \"ImageGalleryChecker\") {\n if (postData[\"ImageGallery\"].length > 0) {\n return postData[\"ImageGallery\"].map((item) =>\n formData.append(key, item.id ? item.id : null)\n );\n }\n return;\n }\n\n if (key === \"ImageGallery\") {\n if (postData[key].length > 0) {\n let newimageGallery = postData[key].filter(item => item.size)\n return newimageGallery.map((file) => formData.append(key, file));\n }\n return;\n }\n\n if (key === \"Categories\" && postData[key].length) {\n return postData[key].map((category) => formData.append(key, category));\n }\n // if (key === \"selectedCategories\" && postData[key].length) {\n // return postData[key].map(category => formData.append(key, category));\n // }\n // if (key === \"RetailerDetails\") {\n // let retailerData = {};\n // Object.keys((postData[key])).forEach(function(rkey) {\n // const rData = postData[key];\n // if (rkey === \"LogoImage\" || rkey === \"HeroImage\") {\n // if (typeof rData[rkey] !== \"string\") {\n // return formData.append(rkey, rData[rkey]);\n // }\n // return;\n // } else {\n // retailerData[rkey] = rData[rkey]\n // // retailerData.push({rData[rkey]});\n // }\n // // return formData.append(key, postData[key]);\n // })\n // return formData.append(key, retailerData);\n // }\n if (key === \"LogoImage\" || key === \"HeroImage\") {\n if (typeof postData[key] !== \"string\") {\n return formData.append(key, postData[key]);\n }\n return;\n }\n\n if (key === \"StorefrontHeroImage\") {\n if (postData[key]) {\n return formData.append(key, postData[key]);\n } else {\n return formData.append(\"ClearStorefrontHeroImage\", true);\n }\n }\n return formData.append(key, postData[key]);\n });\n\n return formData;\n};\n","import React from \"react\";\nimport axios from \"axios\";\nimport Loadable from \"react-loadable\";\nimport TagManager from \"react-gtm-module\";\nimport { TimePicker } from \"antd\";\nimport \"antd/dist/antd.css\";\nimport moment from \"moment\";\nimport { get } from \"lodash\";\n\nimport FormInput from \"../../../Base/FormInput\";\nimport Checkbox from \"../../../Base/Checkbox\";\nimport FormSelect from \"../../../Base/FormSelect\";\nimport FormCheckbox from \"../../../Base/FormCheckbox\";\nimport FormImageGallery from \"../../../Base/FormImageGallery\";\nimport RadioButton from \"../../../Base/RadioButton\";\nimport FormImageUpload from \"../../../Base/FormImageUpload\";\nimport FormListbox from \"../../../Base/FormListbox\";\nimport FormErrorMessage from \"../../../Base/FormErrorMessage\";\nimport PopupPreview from \"../../../Base/Popup/PopupPreview\";\nimport FormListCheckbox from \"../../../Base/FormListCheckbox\";\n\nimport {\n getStorefrontData,\n getCarParkList,\n getCategoryList\n} from \"../../../../api/StorefrontAPI\";\nimport { buildFormData } from \"../../../../helper/StorefrontHelper\";\nimport {\n disableBodyScroll,\n enableBodyScroll,\n} from \"../../../../helper/ScrollHelper\";\n\n//getStoreData\n//getRetailerData\n// import getStorefrontDataJson from \"./getStoreData.json\";\n// import getCarParkListJson from \"./getCarParkListJson.json\";\n// import getCategoryListJson from \"./getCategoryListJson.json\";\n\nconst RichTextEditor = Loadable({\n loader: () => import(\"../../../Base/RichTextEditor\"),\n loading: () => null,\n});\n\nclass FormStoreFront extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n formData: {\n StoreID: \"\",\n Name: \"\",\n StorefrontDescription: \"\",\n ContactNumber: \"\",\n MenuUrl: \"\",\n BestParking: \"\",\n AcceptsAfterPay: false,\n AcceptsGiftCards: false,\n IsKidsFriendly: false,\n IsVegetarian: false,\n RetailerName: \"\",\n RetailerDescription: \"\",\n Website: \"\",\n Instagram: \"\",\n Facebook: \"\",\n LogoImage: null,\n HeroImage: null,\n ImageGallery: [],\n ImageGalleryChecker: [],\n MondayOpeningHours: \"\",\n MondayClosingHours: \"\",\n MondaySecondaryOpeningHours: \"\",\n MondaySecondaryClosingHours: \"\",\n MondayIsClosed: \"\",\n TuesdayOpeningHours: \"\",\n TuesdayClosingHours: \"\",\n TuesdaySecondaryOpeningHours: \"\",\n TuesdaySecondaryClosingHours: \"\",\n TuesdayIsClosed: \"\",\n WednesdayOpeningHours: \"\",\n WednesdayClosingHours: \"\",\n WednesdaySecondaryOpeningHours: \"\",\n WednesdaySecondaryClosingHours: \"\",\n WednesdayIsClosed: \"\",\n ThursdayOpeningHours: \"\",\n ThursdayClosingHours: \"\",\n ThursdaySecondaryOpeningHours: \"\",\n ThursdaySecondaryClosingHours: \"\",\n ThursdayIsClosed: \"\",\n FridayOpeningHours: \"\",\n FridayClosingHours: \"\",\n FridaySecondaryOpeningHours: \"\",\n FridaySecondaryClosingHours: \"\",\n FridayIsClosed: \"\",\n SaturdayOpeningHours: \"\",\n SaturdayClosingHours: \"\",\n SaturdaySecondaryOpeningHours: \"\",\n SaturdaySecondaryClosingHours: \"\",\n SaturdayIsClosed: \"\",\n SundayOpeningHours: \"\",\n SundayClosingHours: \"\",\n SundaySecondaryOpeningHours: \"\",\n SundaySecondaryClosingHours: \"\",\n SundayIsClosed: \"\",\n StorefrontHeroImage: null,\n Categories: [],\n },\n StoreOpeningHours: \"\",\n RetailerType: \"\",\n formType: null,\n componentReady: false,\n sourceList: [\n {\n Id: {\n value: \"Centre\",\n },\n Name: {\n value: \"Match \" + props.centreName + \" Shopping Centre hours\",\n },\n },\n {\n Id: {\n value: \"Store\",\n },\n Name: {\n value: \"Set custom hours\",\n },\n },\n ],\n openingHoursList: [\n {\n Id: {\n value: \"IsOpeningSoon\",\n },\n Name: {\n value: \"Opening soon\",\n },\n },\n {\n Id: {\n value: \"IsTemporarilyClosed\",\n },\n Name: {\n value: \"Temporarily closed\",\n },\n },\n {\n Id: {\n value: \"Open\",\n },\n Name: {\n value: \"Open\",\n },\n },\n ],\n carparkList: [],\n iconList: [],\n categoryList: [],\n modalContent: null,\n showImageGallery: false,\n disableBtn: true,\n showSaveHint: false,\n imageGalleryHolder: [],\n showErrorMessage: false,\n formErrorMessage: \"\",\n isStoreDataReady: false,\n showModal: false,\n };\n }\n\n componentDidMount() {\n const { storeId, centreName } = this.props;\n this.setState(\n {\n componentReady: true,\n },\n () => this.getStoreData(storeId)\n );\n this.getCategoryData();\n if (centreName) {\n this.getCarParkData(centreName);\n }\n this.handleFormData();\n }\n\n decodeHTML = (html) => {\n if (document) {\n var txt = document.createElement(\"textarea\");\n txt.innerHTML = html;\n return txt.value;\n }\n };\n\n getStoreData = async (storeId) => {\n try {\n // const $this = this;\n // let response = {\n // data: getStorefrontDataJson\n // }\n // if (response.status !== 200 && response.data) {\n let response = await getStorefrontData({ storeId });\n const $this = this;\n if (response.status === 200 && response.data) {\n const ImageGallery = get(response.data, \"ImageGallery\", []);\n const Categories = get(response.data, \"Categories\", []);\n this.setState({\n formData: {\n Name: get(response.data, \"Name.value\", null),\n StorefrontDescription: $this.decodeHTML(\n get(response.data, \"Description.value\", \"\")\n ),\n ContactNumber: get(response.data, \"ContactNumber.value\", \"\"),\n MenuUrl: get(response.data, \"MenuUrl.value\", \"\"),\n BestParking: get(response.data, \"BestParking.value\", \"\"),\n AcceptsAfterPay: get(response.data, \"AcceptsAfterPay.value\", false),\n AcceptsGiftCards: get(\n response.data,\n \"AcceptsGiftCards.value\",\n false\n ),\n IsKidsFriendly: get(response.data, \"IsKidsFriendly.value\", false),\n IsVegetarian: get(response.data, \"IsVegetarian.value\", false),\n RetailerName: get(\n response.data,\n \"RetailerDetails.Name.value\",\n null\n ),\n RetailerDescription: $this.decodeHTML(\n get(response.data, \"RetailerDetails.Description.value\", \"\")\n ),\n Website: get(response.data, \"RetailerDetails.Website.value\", null),\n Instagram: get(\n response.data,\n \"RetailerDetails.Instagram.value\",\n null\n ),\n Facebook: get(\n response.data,\n \"RetailerDetails.Facebook.value\",\n null\n ),\n LogoImage: get(\n response.data,\n \"RetailerDetails.LogoImage.value.src\",\n null\n ),\n HeroImage: get(\n response.data,\n \"RetailerDetails.HeroImage.value.src\",\n null\n ),\n StorefrontHeroImage: get(\n response.data,\n \"StorefrontHeroImage.value.src\",\n null\n ),\n ImageGalleryChecker:\n ImageGallery && ImageGallery.length > 0\n ? ImageGallery.map((el) => el.Id.value)\n : [],\n ImageGallery:\n ImageGallery && ImageGallery.length > 0\n ? ImageGallery.map((el) => {\n return {\n name: el.Name.value,\n id: el.Id.value,\n src: el.Src.value,\n };\n })\n : [],\n StoreID: get(response.data, \"StoreID.value\", null),\n IsTemporarilyClosed: get(\n response.data,\n \"IsTemporarilyClosed.value\",\n null\n ),\n IsOpeningSoon: get(response.data, \"IsTemporarilyClosed.value\", null)\n ? false\n : get(response.data, \"IsOpeningSoon.value\", null),\n OpeningHoursStatus: get(\n response.data,\n \"OpeningHoursStatus.value\",\n null\n ),\n Source: get(response.data, \"Source.value\", null),\n MondayOpeningHours: get(\n response.data,\n \"StoreOpeningHours.MondayOpeningHours.value\",\n null\n ),\n MondayClosingHours: get(\n response.data,\n \"StoreOpeningHours.MondayClosingHours.value\",\n null\n ),\n MondaySecondaryOpeningHours: get(\n response.data,\n \"StoreOpeningHours.MondaySecondaryOpeningHours.value\",\n null\n ),\n MondaySecondaryClosingHours: get(\n response.data,\n \"StoreOpeningHours.MondaySecondaryClosingHours.value\",\n null\n ),\n MondayIsClosed: get(\n response.data,\n \"StoreOpeningHours.MondayIsClosed.value\",\n null\n ),\n TuesdayOpeningHours: get(\n response.data,\n \"StoreOpeningHours.TuesdayOpeningHours.value\",\n null\n ),\n TuesdayClosingHours: get(\n response.data,\n \"StoreOpeningHours.TuesdayClosingHours.value\",\n null\n ),\n TuesdaySecondaryOpeningHours: get(\n response.data,\n \"StoreOpeningHours.TuesdaySecondaryOpeningHours.value\",\n null\n ),\n TuesdaySecondaryClosingHours: get(\n response.data,\n \"StoreOpeningHours.TuesdaySecondaryClosingHours.value\",\n null\n ),\n TuesdayIsClosed: get(\n response.data,\n \"StoreOpeningHours.TuesdayIsClosed.value\",\n null\n ),\n WednesdayOpeningHours: get(\n response.data,\n \"StoreOpeningHours.WednesdayOpeningHours.value\",\n null\n ),\n WednesdayClosingHours: get(\n response.data,\n \"StoreOpeningHours.WednesdayClosingHours.value\",\n null\n ),\n WednesdaySecondaryOpeningHours: get(\n response.data,\n \"StoreOpeningHours.WednesdaySecondaryOpeningHours.value\",\n null\n ),\n WednesdaySecondaryClosingHours: get(\n response.data,\n \"StoreOpeningHours.WednesdaySecondaryClosingHours.value\",\n null\n ),\n WednesdayIsClosed: get(\n response.data,\n \"StoreOpeningHours.WednesdayIsClosed.value\",\n null\n ),\n ThursdayOpeningHours: get(\n response.data,\n \"StoreOpeningHours.ThursdayOpeningHours.value\",\n null\n ),\n ThursdayClosingHours: get(\n response.data,\n \"StoreOpeningHours.ThursdayClosingHours.value\",\n null\n ),\n ThursdaySecondaryOpeningHours: get(\n response.data,\n \"StoreOpeningHours.ThursdaySecondaryOpeningHours.value\",\n null\n ),\n ThursdaySecondaryClosingHours: get(\n response.data,\n \"StoreOpeningHours.ThursdaySecondaryClosingHours.value\",\n null\n ),\n ThursdayIsClosed: get(\n response.data,\n \"StoreOpeningHours.ThursdayIsClosed.value\",\n null\n ),\n FridayOpeningHours: get(\n response.data,\n \"StoreOpeningHours.FridayOpeningHours.value\",\n null\n ),\n FridayClosingHours: get(\n response.data,\n \"StoreOpeningHours.FridayClosingHours.value\",\n null\n ),\n FridaySecondaryOpeningHours: get(\n response.data,\n \"StoreOpeningHours.FridaySecondaryOpeningHours.value\",\n null\n ),\n FridaySecondaryClosingHours: get(\n response.data,\n \"StoreOpeningHours.FridaySecondaryClosingHours.value\",\n null\n ),\n FridayIsClosed: get(\n response.data,\n \"StoreOpeningHours.FridayIsClosed.value\",\n null\n ),\n SaturdayOpeningHours: get(\n response.data,\n \"StoreOpeningHours.SaturdayOpeningHours.value\",\n null\n ),\n SaturdayClosingHours: get(\n response.data,\n \"StoreOpeningHours.SaturdayClosingHours.value\",\n null\n ),\n SaturdaySecondaryOpeningHours: get(\n response.data,\n \"StoreOpeningHours.SaturdaySecondaryOpeningHours.value\",\n null\n ),\n SaturdaySecondaryClosingHours: get(\n response.data,\n \"StoreOpeningHours.SaturdaySecondaryClosingHours.value\",\n null\n ),\n SaturdayIsClosed: get(\n response.data,\n \"StoreOpeningHours.SaturdayIsClosed.value\",\n null\n ),\n SundayOpeningHours: get(\n response.data,\n \"StoreOpeningHours.SundayOpeningHours.value\",\n null\n ),\n SundayClosingHours: get(\n response.data,\n \"StoreOpeningHours.SundayClosingHours.value\",\n null\n ),\n SundaySecondaryOpeningHours: get(\n response.data,\n \"StoreOpeningHours.SundaySecondaryOpeningHours.value\",\n null\n ),\n SundaySecondaryClosingHours: get(\n response.data,\n \"StoreOpeningHours.SundaySecondaryClosingHours.value\",\n null\n ),\n SundayIsClosed: get(\n response.data,\n \"StoreOpeningHours.SundayIsClosed.value\",\n null\n ),\n Categories:\n Categories && Categories.length > 0\n ? Categories.map((el) => el.CategoryId.value)\n : [],\n },\n RetailerType: get(\n response.data,\n \"RetailerDetails.RetailerType.value\",\n \"\"\n ),\n formType:\n storeId === \"\"\n ? \"\"\n : get(response.data, \"RetailerDetails.RetailerType.value\", \"\"),\n imageGalleryHolder:\n ImageGallery && ImageGallery.length > 0\n ? ImageGallery.map((el) => {\n return {\n name: el.Name.value,\n id: el.Id.value,\n src: el.Src.value,\n };\n })\n : [],\n showImageGallery:\n ImageGallery && ImageGallery.length > 0 ? true : false,\n isStoreDataReady: true,\n });\n }\n } catch (e) {\n console.error(\"Getting store data failed\");\n this.setState({\n isStoreDataReady: true,\n });\n }\n };\n\n getCarParkData = async (centre) => {\n try {\n let response = await getCarParkList({ centre });\n if (response.status === 200 && response.data) {\n this.setState({\n carparkList: get(response.data, \"CarParkList\", []),\n });\n }\n } catch (e) {\n console.error(\"Getting car park data failed\");\n // this.setState({\n // carparkList: get(getCarParkListJson, \"CarParkList\", []),\n // });\n }\n };\n\n getCategoryData = async () => {\n try {\n // let response = {\n // data: getCategoryListJson\n // }\n // let updateCategoryList = [];\n // if (response.status !== 200 && response.data) {\n let response = await getCategoryList();\n\n let updateCategoryList = [];\n if (response.status === 200 && response.data) {\n let categoryResponse = get(response.data, \"Categories\", []);\n\n if (categoryResponse.length > 0) {\n categoryResponse.forEach((el) => {\n updateCategoryList.push({\n name: el.CategoryName.value,\n value: el.CategoryId.value,\n });\n });\n }\n this.setState({\n categoryList: updateCategoryList,\n });\n }\n } catch (e) {\n console.error(\"Getting category list data failed\");\n }\n };\n\n handleFormData = () => {\n const { showSaveHint, disableBtn } = this.state;\n this.props.handleFormData(\n showSaveHint,\n disableBtn,\n this.handleSaveForm,\n this.handleSubmitForm,\n this.handlePreviewForm\n );\n };\n\n handleFormUpdate = (value) => {\n this.setState(\n {\n disableBtn: true,\n formData: {\n ...this.state.formData,\n ...value,\n },\n },\n this.handleFormData\n );\n };\n\n handleSaveForm = async () => {\n const { formData } = this.state;\n var timezoneId = new Date().getTimezoneOffset();\n const url = \"/api/sitecore/store/SaveStorefrontData\";\n let data = buildFormData({ ...formData, timeZoneId: timezoneId });\n let backToTop = document.querySelector(\n \".form__modal--back-to-top-button\"\n );\n if (backToTop) {\n backToTop.click();\n }\n this.setState(\n {\n showSaveHint: true,\n disableBtn: true,\n },\n this.handleFormData\n );\n\n try {\n let response = await axios({\n method: \"POST\",\n url,\n data,\n config: { headers: { \"Content-Type\": \"multipart/form-data\" } },\n });\n\n if (response) {\n if (get(response.data, \"IsSuccess.value\", false)) {\n this.setState(\n {\n showSaveHint: false,\n disableBtn: false,\n showErrorMessage: false,\n },\n this.handleFormData\n );\n\n return true;\n } else {\n let errorMessage =\n \"Form Not Saved: \" +\n get(response.data, \"message.value\", \"Invalid response\");\n\n this.setState(\n {\n showSaveHint: false,\n disableBtn: true,\n formErrorMessage: errorMessage,\n showErrorMessage: true,\n },\n this.handleFormData\n );\n\n return false;\n }\n }\n } catch (e) {\n console.error(\"Form Save Error: \" + e.response.statusText);\n let errorMessage = \"Form Save Error: \" + e.response.statusText;\n this.setState(\n {\n showSaveHint: false,\n disableBtn: true,\n formErrorMessage: errorMessage,\n showErrorMessage: true,\n },\n this.handleFormData\n );\n\n\n return false;\n }\n };\n\n handleSubmitForm = async () => {\n const { formData } = this.state;\n var timezoneId = new Date().getTimezoneOffset();\n const url = \"/api/sitecore/store/SubmitStorefrontData\";\n let data = buildFormData({ ...formData, timeZoneId: timezoneId });\n\n try {\n let response = await axios({\n method: \"POST\",\n url,\n data,\n params: {\n storeId: formData.StoreID,\n },\n config: { headers: { \"Content-Type\": \"multipart/form-data\" } },\n });\n\n if (response) {\n if (get(response.data, \"IsSuccess.value\", false)) {\n this.setState({\n showErrorMessage: false,\n });\n TagManager.dataLayer({\n dataLayer: {\n event: \"updatedStoreInfo\",\n storeInfoCentre: this.props.centreName,\n storeInfoRetailer: formData.RetailerName,\n storeInfoName: formData.Name,\n },\n dataLayerName: \"dataLayer\",\n });\n return true;\n } else {\n console.log(response.data);\n\n let errorMessage =\n \"Form Not Submitted: \" +\n get(response.data, \"message.value\", \"Invalid response\");\n\n this.setState({\n formErrorMessage: errorMessage,\n showErrorMessage: true,\n });\n\n let backToTop = document.querySelector(\n \".form__modal--back-to-top-button\"\n );\n if (backToTop) {\n backToTop.click();\n }\n return false;\n }\n }\n } catch (e) {\n console.error(\"Form Submit Error: \" + e.response.statusText);\n let errorMessage = \"Form Submit Error: \" + e.response.statusText;\n\n this.setState({\n formErrorMessage: errorMessage,\n showErrorMessage: true,\n });\n\n return false;\n }\n };\n\n handlePreviewForm = () => {\n this.setState({\n showModal: true,\n });\n };\n\n renderBulkPreview = () => {\n const { previewList } = this.props || {};\n const { LogoImage } = this.state.formData;\n return (\n <div className=\"article-modal\">\n {previewList && previewList.length > 0 && (\n <PopupPreview\n previewTitle={\"Preview\"}\n previewLogo={LogoImage}\n previewList={previewList}\n previewListChildName=\"Storefronts\"\n btnLabel={\"Submit\"}\n btnOnClick={() => {\n let submitBtn = document.querySelector(\".store-submit-btn\");\n if (submitBtn) {\n submitBtn.click();\n }\n }}\n showPreviewModal={() => this.setState({ showModal: false })}\n />\n )}\n </div>\n );\n };\n\n // saveForm = async () => {\n // const { formData } = this.state;\n // var timezoneId = new Date().getTimezoneOffset();\n // const url = \"/api/sitecore/store/SaveStorefrontData\";\n // let data = buildFormData({ ...formData, timeZoneId: timezoneId });\n // try {\n // let response = await axios({\n // method: \"POST\",\n // url,\n // data,\n // params: {\n // storeId: formData.StoreID,\n // },\n // config: { headers: { \"Content-Type\": \"multipart/form-data\" } },\n // });\n // if (response) {\n // if (get(response.data, \"IsSuccess.value\", false)) {\n // let successMessage = {\n // title: \"Form Saved\",\n // body: get(response.data, \"message.value\", \"Successful\"),\n // };\n // this.setState({\n // showModal: true,\n // modalContent: successMessage,\n // });\n // TagManager.dataLayer({\n // dataLayer: {\n // event: \"updateStoreInfo\",\n // },\n // dataLayerName: \"dataLayer\",\n // });\n\n // return true;\n // } else {\n // let errorMessage = {\n // title: \"Form Not Saved\",\n // body: get(response.data, \"message.value\", \"Invalid response\"),\n // };\n // this.setState({\n // showModal: true,\n // modalContent: errorMessage,\n // });\n // return false;\n // }\n // }\n // } catch (e) {\n // console.log(e.response.statusText);\n // let successMessage = {\n // title: \"Form Saved\",\n // body: get(e.response.data, \"message.value\", \"Successful\"),\n // };\n // this.setState({\n // showModal: true,\n // modalContent: successMessage,\n // });\n // return false;\n // }\n // };\n\n renderStoreHours = (formData) => {\n const days = [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n ];\n\n return (\n <div className=\"storehours-container\">\n <div className=\"form-sub-header\">\n <div className=\"form-sub-label\">Customise store hours</div>\n <div\n className=\"form-sub-label-right\"\n onClick={() => this.resetHours()}\n >\n {\"Reset hours\"}\n </div>\n </div>\n <div className=\"hours-table\">\n <div className=\"row is-tablet-desktop\">\n <div className=\"col col-3\">Day</div>\n <div className=\"col col-4\">Opening hours</div>\n <div className=\"col col-4\">Secondary hours</div>\n <div className=\"col col-1\">Closed</div>\n </div>\n {days.map((day, index) => {\n let newInfo = [];\n const infoList = [\n \"OpeningHours\",\n \"ClosingHours\",\n \"SecondaryOpeningHours\",\n \"SecondaryClosingHours\",\n \"IsClosed\",\n ];\n infoList.map((info) => {\n newInfo.push(formData[day + info]);\n });\n const primaryOpeningHour = newInfo[0];\n const primaryClosingHour = newInfo[1];\n const secondaryOpeningHour = newInfo[2];\n const secondaryClosingHour = newInfo[3];\n const closed = newInfo[4];\n return (\n <div className=\"row\" key={`StoreOpeningHours${index}`}>\n <div className=\"col col-3 is-tablet-desktop\">{day}</div>\n <input className=\"storehours-day-checkbox js-openinghours is-mobile\" type=\"checkbox\" id={day + index} name={day + index} value={day} />\n <label className=\"storehours-day-label is-mobile\" htmlFor={day + index}>\n <span>{day}</span>\n <i className=\"icon icon-chevron-down-small\" />\n </label>\n <div className=\"storehours-time-label is-mobile\">{\"Opening hours\"}</div>\n <div className=\"col col-4\">\n <TimePicker\n use12Hours\n format=\"h:mma\"\n size=\"large\"\n allowClear={false}\n value={\n primaryOpeningHour ? moment(primaryOpeningHour) : null\n }\n onChange={(time, timeString) =>\n this.onTimeChange(time, timeString, day, infoList[0])\n }\n suffixIcon={<i className=\"icon icon-chevron-down-small\" />}\n placeholder=\"Not set\"\n disabled={closed}\n />\n <TimePicker\n use12Hours\n format=\"h:mma\"\n size=\"large\"\n allowClear={false}\n value={\n primaryClosingHour ? moment(primaryClosingHour) : null\n }\n onChange={(time, timeString) =>\n this.onTimeChange(time, timeString, day, infoList[1])\n }\n suffixIcon={<i className=\"icon icon-chevron-down-small\" />}\n placeholder=\"Not set\"\n disabled={closed}\n />\n </div>\n <div className=\"storehours-time-label is-secondary is-mobile\">{\"Secondary hours\"}</div>\n <div className=\"col col-4\">\n <TimePicker\n use12Hours\n format=\"h:mma\"\n size=\"large\"\n allowClear={false}\n value={\n secondaryOpeningHour ? moment(secondaryOpeningHour) : null\n }\n onChange={(time, timeString) =>\n this.onTimeChange(time, timeString, day, infoList[2])\n }\n suffixIcon={<i className=\"icon icon-chevron-down-small\" />}\n placeholder=\"Not set\"\n disabled={closed}\n />\n <TimePicker\n use12Hours\n format=\"h:mma\"\n size=\"large\"\n allowClear={false}\n value={\n secondaryClosingHour ? moment(secondaryClosingHour) : null\n }\n onChange={(time, timeString) =>\n this.onTimeChange(time, timeString, day, infoList[3])\n }\n suffixIcon={<i className=\"icon icon-chevron-down-small\" />}\n placeholder=\"Not set\"\n disabled={closed}\n />\n </div>\n <div className=\"col col-1\">\n <FormCheckbox\n checked={closed}\n onCheckboxChange={(value, isClosed) => {\n this.handleFormUpdate({\n [day + infoList[4]]: isClosed,\n });\n }}\n className=\"storehours-close is-mobile\"\n label={\"Closed\"}\n />\n </div>\n </div>\n );\n })}\n <div className=\"row\">\n <div className=\"col col-12\">\n <div className=\"hint\">\n <i className=\"icon icon-info\" />\n <span>\n {\n \"Secondary hours: The retailer will close and re-open in a single day (eg: Sunday 9am - 12pm, 4pm - 6pm)\"\n }\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n };\n\n onTimeChange = (time, timeString, day, info) => {\n let dateTime;\n if (timeString) {\n dateTime =\n moment().format(\"YYYYMMDDT\") +\n moment(timeString, [\"h:mm A\"])\n .format(\"HH:mm\")\n .replace(\":\", \"\") +\n \"00\";\n }\n this.handleFormUpdate({\n [day + info]: dateTime ? dateTime : null,\n });\n };\n\n resetHours = () => {\n this.setState(\n {\n disableBtn: true,\n formData: {\n ...this.state.formData,\n MondayOpeningHours: null,\n MondayClosingHours: null,\n MondaySecondaryOpeningHours: null,\n MondaySecondaryClosingHours: null,\n TuesdayOpeningHours: null,\n TuesdayClosingHours: null,\n TuesdaySecondaryOpeningHours: null,\n TuesdaySecondaryClosingHours: null,\n WednesdayOpeningHours: null,\n WednesdayClosingHours: null,\n WednesdaySecondaryOpeningHours: null,\n WednesdaySecondaryClosingHours: null,\n ThursdayOpeningHours: null,\n ThursdayClosingHours: null,\n ThursdaySecondaryOpeningHours: null,\n ThursdaySecondaryClosingHours: null,\n FridayOpeningHours: null,\n FridayClosingHours: null,\n FridaySecondaryOpeningHours: null,\n FridaySecondaryClosingHours: null,\n SaturdayOpeningHours: null,\n SaturdayClosingHours: null,\n SaturdaySecondaryOpeningHours: null,\n SaturdaySecondaryClosingHours: null,\n SundayOpeningHours: null,\n SundayClosingHours: null,\n SundaySecondaryOpeningHours: null,\n SundaySecondaryClosingHours: null,\n },\n },\n () => {\n this.handleFormData();\n const storeCheckboxList = document.querySelectorAll(\".js-openinghours\");\n if (storeCheckboxList.length > 0) {\n Array.prototype.slice.call(storeCheckboxList).map((item, index) => {\n item.checked = true;\n })\n }\n }\n );\n };\n\n handleListbox = (id, field, isCheckbox) => {\n const { formData } = this.state;\n let options;\n let selected = [];\n if (document) {\n if (isCheckbox) {\n options = document.querySelectorAll(`#${id} input:checked`);\n } else {\n options = document.querySelectorAll(`#${id} option:checked`);\n }\n if (options) {\n for (let i = 0; i < options.length; i++) {\n selected.push(options[i].value);\n }\n }\n }\n this.setState(\n {\n disableBtn: true,\n formData: {\n ...formData,\n [field]: selected,\n },\n },\n this.handleFormData\n );\n };\n\n handleSelect = (isSelect, field, options) => {\n const { formData } = this.state;\n this.setState(\n {\n disableBtn: true,\n formData: {\n ...formData,\n [field]: isSelect ? options.map((el) => el.value) : [],\n },\n },\n this.handleFormData\n );\n };\n\n setDropdownValue = (value, options) => {\n if (value && options && options.length) {\n let optionValue = options.filter((el) => el.Id.value === value);\n let dropdownValue = \"\";\n if (optionValue.length > 0 && optionValue[0].Id.value) {\n dropdownValue = optionValue[0].Id.value;\n }\n return dropdownValue;\n } else return null;\n };\n\n render() {\n const {\n formData,\n formType,\n componentReady,\n sourceList,\n openingHoursList,\n carparkList,\n iconList,\n showImageGallery,\n categoryList,\n imageGalleryHolder,\n formErrorMessage,\n showErrorMessage,\n isStoreDataReady,\n showModal,\n } = this.state;\n return (\n <div className=\"form-storefront storefront-container\">\n {showModal && this.renderBulkPreview()}\n {showErrorMessage && <FormErrorMessage error={formErrorMessage} />}\n {(formType === \"\" || formType === null) && (\n <div className=\"form-storefront__retailer\">\n <div className=\"form__container\">\n <FormInput\n className={\"is-box\"}\n title\n type=\"text\"\n placeholder=\"Type retailer name.\"\n label=\"Retailer Name\"\n value={formData.RetailerName}\n onInputChange={(RetailerName) => {\n this.handleFormUpdate({ RetailerName });\n }}\n />\n </div>\n <div className=\"form__container\">\n <label className=\"form__header\">{\"Retailer information\"}</label>\n {componentReady && isStoreDataReady && (\n <RichTextEditor\n label={\"Description\"}\n initialValue={formData.RetailerDescription}\n onInputChange={(RetailerDescription) => {\n this.handleFormUpdate({ RetailerDescription });\n }}\n />\n )}\n </div>\n </div>\n )}\n\n {(formType === \"Retail\" || formType === \"Food\") && (\n <div className=\"form-storefront__store\">\n <div className=\"form__container\">\n <FormInput\n className={\"is-box\"}\n title\n type=\"text\"\n placeholder=\"Type retailer name.\"\n label=\"Retailer Name\"\n value={formData.Name}\n onInputChange={(Name) => {\n this.handleFormUpdate({ Name });\n }}\n />\n </div>\n <div className=\"form__container\">\n <label className=\"form__header\">{\"Retailer information\"}</label>\n {componentReady && (\n <RichTextEditor\n label={\"Description\"}\n checkIfBlank={true}\n initialValue={formData.StorefrontDescription}\n onInputChange={(StorefrontDescription) => {\n this.handleFormUpdate({ StorefrontDescription });\n }}\n />\n )}\n </div>\n <div className=\"form__container\">\n <label className=\"form__header\">{\"Contact details\"}</label>\n <FormInput\n type=\"text\"\n placeholder=\"(88) 888-8888\"\n label=\"Phone number\"\n value={formData.ContactNumber}\n onInputChange={(ContactNumber) =>\n this.handleFormUpdate({ ContactNumber })\n }\n />\n {formType === \"Food\" && (\n <FormInput\n className=\"viewMenuMargin\"\n type=\"text\"\n placeholder=\"e.g. http://view-menu.com\"\n label=\"View Menu URL\"\n value={formData.MenuUrl}\n onInputChange={(MenuUrl) =>\n this.handleFormUpdate({ MenuUrl })\n }\n />\n )}\n </div>\n </div>\n )}\n\n <div className=\"form-storefront__common\">\n <div className=\"form__container\">\n <label className=\"form__header\">{\"Social Media\"}</label>\n <FormInput\n type=\"text\"\n placeholder=\"Insert link (e.g. http://...)\"\n label=\"Website\"\n value={formData.Website}\n onInputChange={(Website) => {\n this.handleFormUpdate({ Website });\n }}\n />\n <FormInput\n type=\"text\"\n placeholder=\"http://facebook.com\"\n label=\"Facebook\"\n value={formData.Facebook}\n onInputChange={(Facebook) => {\n this.handleFormUpdate({ Facebook });\n }}\n />\n <FormInput\n type=\"text\"\n placeholder=\"http://instagram.com\"\n label=\"Instagram\"\n value={formData.Instagram}\n onInputChange={(Instagram) => {\n this.handleFormUpdate({ Instagram });\n }}\n />\n </div>\n </div>\n\n {(formType === \"Retail\" || formType === \"Food\") && (\n <div className=\"form-storefront__store\">\n <div className=\"form__container\">\n <label className=\"form__header\">{\"Available services\"}</label>\n {formType === \"Retail\" && (\n <FormCheckbox\n label={\"Afterpay\"}\n checked={formData.AcceptsAfterPay}\n onCheckboxChange={(value, AcceptsAfterPay) =>\n this.handleFormUpdate({ AcceptsAfterPay })\n }\n />\n )}\n {formType === \"Food\" && (\n <div>\n <FormCheckbox\n label={\"Vegetarian\"}\n checked={formData.IsVegetarian}\n onCheckboxChange={(value, IsVegetarian) =>\n this.handleFormUpdate({ IsVegetarian })\n }\n />\n <FormCheckbox\n label={\"Kids-Friendly\"}\n checked={formData.IsKidsFriendly}\n onCheckboxChange={(value, IsKidsFriendly) =>\n this.handleFormUpdate({ IsKidsFriendly })\n }\n />\n </div>\n )}\n <FormCheckbox\n label={\"Gift Cards\"}\n checked={formData.AcceptsGiftCards}\n onCheckboxChange={(value, AcceptsGiftCards) =>\n this.handleFormUpdate({ AcceptsGiftCards })\n }\n />\n </div>\n <div className=\"form__container\">\n <label className=\"form__header\">{\"Parking\"}</label>\n <FormSelect\n label={\"Best parking\"}\n placeholder={\"Select a car park\"}\n defaultValue={this.setDropdownValue(\n formData.BestParking,\n carparkList\n )}\n options={carparkList}\n onChange={(BestParking) =>\n this.handleFormUpdate({ BestParking })\n }\n noOptionsMessage={\"No car park found\"}\n />\n </div>\n <div className=\"form__container\">\n <label className=\"form__header\">{\"Opening hours\"}</label>\n <div className=\"opening-hours-status\">\n <RadioButton\n defaultSelected={formData.OpeningHoursStatus}\n radioGroupName=\"Opening Hours List\"\n options={openingHoursList}\n onChange={(OpeningHoursStatus) => {\n this.handleFormUpdate({ OpeningHoursStatus });\n }}\n />\n </div>\n <label className=\"form__label\">{\"Set opening hours\"}</label>\n <RadioButton\n defaultSelected={formData.Source}\n radioGroupName=\"Source List\"\n options={sourceList}\n onChange={(Source) => {\n this.handleFormUpdate({ Source });\n }}\n />\n\n {formData &&\n formData.Source &&\n formData.Source === \"Store\" &&\n this.renderStoreHours(formData)}\n </div>\n <div className=\"form__container\">\n <label className=\"form__header\">{\"Meta information\"}</label>\n\n <div className=\"store-list-box is-desktop\">\n <FormListbox\n label=\"Category\"\n id=\"Storefront_Category_Desktop\"\n options={categoryList}\n field=\"Categories\"\n selected={formData.Categories}\n hint=\"Press [ctrl] + click to select multiple\"\n handleListbox={(id, field) => this.handleListbox(id, field)}\n handleSelect={(isSelect, field, options) =>\n this.handleSelect(isSelect, field, options)\n }\n />\n </div>\n\n <div className=\"is-tablet\">\n <FormListCheckbox\n label=\"Category\"\n id=\"Storefront_Category_Mobile\"\n options={categoryList}\n field=\"Categories\"\n selected={formData.Categories}\n handleListbox={(id, field) => this.handleListbox(id, field, true)}\n handleSelect={(isSelect, field, options) =>\n this.handleSelect(isSelect, field, options)\n }\n />\n </div>\n </div>\n <div className=\"form__container\">\n <FormImageUpload\n type=\"hero\"\n label={\"Header image\"}\n guidelines={\n \"To keep the quality of our websites high, the hero banner image needs to be:\"\n }\n guidelinesOne={\"• At least 1920px wide\"}\n guidelinesTwo={\"• At least 1080px tall.\"}\n guidelinesThree={\n \"• To avoid your image being cropped, use a ratio of 16:9\"\n }\n value={formData.StorefrontHeroImage}\n handleFileUpload={(StorefrontHeroImage) => {\n this.handleFormUpdate({ StorefrontHeroImage });\n }}\n removeImage\n />\n </div>\n <div className=\"form__container\">\n <label className=\"form__header\">{\"Image gallery\"}</label>\n <Checkbox\n checked={showImageGallery}\n label={\"Display an additional image gallery?\"}\n onCheckboxChange={(showImageGallery) => {\n this.setState({\n showImageGallery,\n });\n if (showImageGallery) {\n this.handleFormUpdate({ ImageGallery: imageGalleryHolder });\n } else {\n this.handleFormUpdate({ ImageGallery: [] });\n }\n }}\n />\n {showImageGallery && (\n <FormImageGallery\n value={formData.ImageGallery}\n handleAttachments={(ImageGallery) => {\n this.setState({\n imageGalleryHolder: ImageGallery,\n });\n this.handleFormUpdate({ ImageGallery });\n }}\n />\n )}\n </div>\n </div>\n )}\n\n {(formType === \"\" || formType === null) && (\n <div className=\"form-storefront__retailer\">\n <div className=\"form__container\">\n {isStoreDataReady && (\n <FormImageUpload\n label={\"Thumbnail image\"}\n guidelines={\"The hero thumbnail image needs to be:\"}\n guidelinesOne={\"• At least 800px wide\"}\n guidelinesTwo={\"• At least 800px tall.\"}\n guidelinesThree={\n \"• To avoid your image being cropped, use a ratio of 1:1\"\n }\n value={formData.StorefrontHeroImage}\n value={formData.LogoImage}\n handleFileUpload={(LogoImage) => {\n this.handleFormUpdate({ LogoImage });\n }}\n />\n )}\n </div>\n <div className=\"form__container\">\n {isStoreDataReady && (\n <FormImageUpload\n type=\"hero\"\n label={\"Header image\"}\n guidelines={\n \"To keep the quality of our websites high, the hero banner image needs to be:\"\n }\n guidelinesOne={\"• At least 1920px wide\"}\n guidelinesTwo={\"• At least 1080px tall.\"}\n guidelinesThree={\n \"• To avoid your image being cropped, use a ratio of 16:9\"\n }\n value={formData.HeroImage}\n handleFileUpload={(HeroImage) => {\n this.handleFormUpdate({ HeroImage });\n }}\n />\n )}\n </div>\n </div>\n )}\n </div>\n );\n }\n}\nexport default FormStoreFront;\n","import React from \"react\";\nimport { Text, RichText } from \"@sitecore-jss/sitecore-jss-react\";\nimport ReactPaginate from \"react-paginate\";\nimport { getStoreInfo } from \"../../../api/StoreAPI\";\nimport PageHeader from \"../../Base/PageHeader\";\nimport ListItem from \"../../Base/ListItem\";\nimport NoResultMessage from \"../../Base/NoResultMessage\";\nimport FormStoreFront from \"../Forms/FormStoreFront\";\nimport { scrollToTop } from \"../../../helper/ScrollHelper\";\n\n// import GetStoreInfo_Response from \"./GetStoreInfo_Response.json\";\n\nclass FeatureRetailerPortalStoreInfo extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n activePageNum: 1,\n showPagination: false,\n showLoader: true,\n showSaveHint: false,\n enablePreview: false,\n onClickSave: null,\n onClickSubmit: null,\n modalTitle: null,\n title: null,\n content: null,\n previewTitle: null,\n previewUrl: null,\n storeName: null,\n centreName: null,\n isRetailer: false,\n paginationRange: 7\n };\n }\n\n componentDidMount() {\n const {\n isDashboard\n } = this.props\n if (window) {\n window.addEventListener(\"resize\", this.handleResize);\n }\n if (document) {\n this.handleResize();\n if (!isDashboard) {\n let params = {\n pageNumber: 1\n };\n this.getData(params, 1);\n } else {\n this.setState({\n showLoader: false,\n });\n }\n }\n }\n\n handleResize = () => {\n if (window.outerWidth >= 768) {\n this.setState({\n paginationRange: 7\n })\n } else {\n this.setState({\n paginationRange: 3\n })\n }\n }\n getData = async (params, activePageNum) => {\n this.setState({\n showLoader: true\n });\n\n try {\n const response = await getStoreInfo(params);\n if (response) {\n this.props.dataUpdate(response.data, activePageNum);\n scrollToTop();\n this.setState({\n showPagination: true,\n showLoader: false\n });\n }\n } catch (e) {\n console.error(\"Get Store Info Data Error: \" + e.response.statusText);\n // this.props.dataUpdate(GetStoreInfo_Response, activePageNum);\n // scrollToTop();\n // this.setState({\n // showPagination: true,\n // showLoader: false\n // });\n }\n };\n\n handleOnClickList = (element, formModalLabel, formModalBody, previewUrl, previewTitle, isRetailer) => {\n if (!(/btn|icon|btn__label/.test(element.className)) || (/js-btn-edit|icon-edit/.test(element.className))) {\n this.setState({\n title: formModalLabel,\n content: formModalBody,\n previewTitle,\n previewUrl,\n isRetailer\n })\n this.props.showFormModal({\n title: formModalLabel,\n content: formModalBody,\n previewTitle,\n previewUrl,\n isRetailer\n })\n }\n }\n\n handleFormUpdate = (showSaveHint, disableBtn, onClickSave, onClickSubmit, onClickPreview, otherFormModalProps) => {\n const {\n title,\n content,\n previewTitle,\n previewUrl,\n isRetailer\n } = this.state;\n\n this.props.showFormModal({\n title,\n content,\n previewTitle,\n previewUrl,\n isRetailer,\n showSaveHint,\n disableBtn,\n onClickSave,\n onClickSubmit,\n onClickPreview,\n ...otherFormModalProps\n })\n }\n\n renderDashboardItems = (data) => {\n const {\n dashboardStores\n } = data || {};\n let renderItemLayout = \"\";\n\n if (dashboardStores && dashboardStores.length > 0) {\n renderItemLayout =\n <div className=\"store-info__content\">\n <div className=\"store-info__store-list\">\n <div className=\"store-info__section--wrapper\">\n {dashboardStores.map((item, index) => {\n const {\n ItemId,\n CentreName,\n CentreIcon,\n StoreInfoTitle,\n PreviewUrl,\n } = item\n\n let previewModalTitle = \"\";\n let previewModalUrl = PreviewUrl.value;\n if (StoreInfoTitle && StoreInfoTitle.value && CentreName && CentreName.value) {\n previewModalTitle = StoreInfoTitle.value + \" \" + CentreName.value;\n }\n\n let formModalLabel =\n <span>\n {\"Manage stores\"}\n \n {\"»\"}\n \n <Text field={StoreInfoTitle} />\n \n <Text field={CentreName} />\n </span>\n\n let formModalProps = {\n previewUrl: PreviewUrl.value,\n storeInfoTitle: StoreInfoTitle.value,\n successMessage: StoreInfoTitle.value + \" \" + CentreName.value + \" store info updated\",\n }\n\n let formModalBody =\n <FormStoreFront\n centreName={CentreName && CentreName.value ? CentreName.value : \"\"}\n storeId={(ItemId && ItemId.value) ? ItemId.value : \"\"}\n handleFormData={(showSaveHint, disableBtn, onClickSave, onClickSubmit, onClickPreview) => {\n this.handleFormUpdate(\n showSaveHint,\n disableBtn,\n onClickSave,\n onClickSubmit,\n onClickPreview,\n formModalProps\n );\n }}\n />\n return (\n\n <ListItem\n key={`store-list-${index}`}\n logoSrc={(CentreIcon && CentreIcon.value) ? CentreIcon.value : \"\"}\n label={StoreInfoTitle}\n title={CentreName}\n previewBtn={{ \"label\": \"Preview\" }}\n previewBtnOnClick={() => {\n this.props.showPreviewModal({\n url: previewModalUrl,\n title: previewModalTitle,\n })\n }}\n listItemOnClick={(e) =>\n this.handleOnClickList(e.target, formModalLabel, formModalBody, previewModalUrl, previewModalTitle)\n }\n />\n )\n })}\n </div>\n </div>\n </div>\n }\n\n return renderItemLayout;\n }\n\n renderItems = (data) => {\n const {\n StoreInfoList,\n GlobalList,\n IsCentreMarketing\n } = data || {};\n const {\n RetailerSectionTitle = null,\n RetailerSectionSubtext = null,\n StoresSectionTitle = null,\n StoresSectionSubtext = null,\n } = this.props.headerData || {};\n let renderItemLayout = \"\";\n\n if ((StoreInfoList && StoreInfoList.length > 0) || (GlobalList && GlobalList.length > 0)) {\n renderItemLayout =\n <div className=\"store-info__content\">\n {(GlobalList && GlobalList.length > 0 &&\n (IsCentreMarketing && !IsCentreMarketing.value)) &&\n <div className=\"store-info__global-list\">\n {RetailerSectionTitle &&\n RetailerSectionTitle.value &&\n <div className=\"store-info__section--header\">\n <Text field={RetailerSectionTitle} />\n </div>\n }\n {RetailerSectionSubtext &&\n RetailerSectionSubtext.value &&\n <div className=\"store-info__section--description\">\n <Text field={RetailerSectionTitle} />\n </div>\n }\n\n <div className=\"store-info__section--wrapper\">\n {GlobalList.map((item, index) => {\n const {\n Name,\n Description,\n LogoImage,\n PreviewUrlList\n } = item\n\n let previewModalTitle = \"\";\n let previewModalUrl;\n\n if (PreviewUrlList && PreviewUrlList.length > 0) {\n const storeList = PreviewUrlList;\n const storeItem = storeList[0].Storefronts;\n\n if (storeList.length === 1 && storeItem.length === 1) {\n previewModalUrl = storeItem[0].PreviewUrl.value;\n previewModalTitle = storeItem[0].Store.value + \" \" + storeList[0].Centre.value;\n } else {\n previewModalUrl = PreviewUrlList\n }\n }\n\n\n let imageSrc = \"\";\n\n if (LogoImage && LogoImage.value && LogoImage.value.src) {\n imageSrc = LogoImage.value.src;\n }\n\n let formModalLabel =\n <span>\n {\"Manage stores\"}\n \n {\"»\"}\n \n <Text field={Name} />\n </span>\n\n let formModalProps = {\n successMessage: Name.value + \" store info updated\",\n }\n\n let formModalBody =\n <FormStoreFront\n centreName={\"\"}\n storeId={\"\"}\n previewList={PreviewUrlList}\n handleFormData={(showSaveHint, disableBtn, onClickSave, onClickSubmit, onClickPreview) => {\n this.handleFormUpdate(\n showSaveHint,\n disableBtn,\n onClickSave,\n onClickSubmit,\n onClickPreview,\n formModalProps,\n );\n }}\n />\n return (\n <ListItem\n key={`global-list-${index}`}\n logoBgColor={\"#fff\"}\n logoSrc={imageSrc}\n label={{ value: \"All centres\" }}\n title={Name}\n description={Description}\n listItemOnClick={(e) =>\n this.handleOnClickList(e.target, formModalLabel, formModalBody, previewModalUrl, previewModalTitle, true)\n }\n />\n )\n })}\n </div>\n </div>\n }\n {StoreInfoList &&\n StoreInfoList.length > 0 &&\n <div className=\"store-info__store-list\">\n {StoresSectionTitle &&\n StoresSectionTitle.value &&\n <div className=\"store-info__section--header\">\n <Text field={StoresSectionTitle} />\n </div>\n }\n {StoresSectionSubtext &&\n StoresSectionSubtext.value &&\n <div className=\"store-info__section--description\">\n <Text field={StoresSectionSubtext} />\n </div>\n }\n <div className=\"store-info__section--wrapper\">\n {StoreInfoList.map((item, index) => {\n const {\n ItemId,\n CentreName,\n CentreIcon,\n Website,\n ContactNumber,\n PreviewUrl,\n StoreInfoTitle,\n } = item\n\n const {\n RetailerID,\n Name\n } = item.RetailerDetails || {};\n const {\n OpeningToday\n } = item.OpeningHours || {};\n\n let previewModalTitle = \"\";\n let previewModalUrl = PreviewUrl.value;\n if (StoreInfoTitle && StoreInfoTitle.value && CentreName && CentreName.value) {\n previewModalTitle = StoreInfoTitle.value + \" \" + CentreName.value;\n }\n let descriptionValue =\n <div>\n {OpeningToday &&\n OpeningToday.value &&\n <span>\n <Text field={OpeningToday} />\n <span>\n , \n </span>\n </span>\n }\n {ContactNumber &&\n ContactNumber.value &&\n <span>\n <Text field={ContactNumber} />\n <span>\n , \n </span>\n </span>\n }\n {Website &&\n Website.value &&\n <span>\n <Text field={Website} />\n <span>\n , \n </span>\n </span>\n }\n </div>\n let formModalLabel =\n <span>\n {\"Manage stores\"}\n \n {\"»\"}\n \n <Text field={Name} />\n \n <Text field={CentreName} />\n </span>\n\n let formModalProps = {\n previewUrl: PreviewUrl.value,\n storeInfoTitle: StoreInfoTitle.value,\n successMessage: Name.value + \" \" + CentreName.value + \" store info updated\",\n }\n\n let formModalBody =\n <FormStoreFront\n centreName={CentreName && CentreName.value ? CentreName.value : \"\"}\n storeId={(ItemId && ItemId.value) ? ItemId.value : \"\"}\n handleFormData={(showSaveHint, disableBtn, onClickSave, onClickSubmit, onClickPreview) => {\n this.handleFormUpdate(\n showSaveHint,\n disableBtn,\n onClickSave,\n onClickSubmit,\n onClickPreview,\n formModalProps\n );\n }}\n />\n return (\n\n <ListItem\n key={`store-list-${index}`}\n logoSrc={(CentreIcon && CentreIcon.value) ? CentreIcon.value : \"\"}\n label={StoreInfoTitle}\n title={CentreName}\n storeDescription={descriptionValue}\n previewBtn={{ \"label\": \"Preview\" }}\n previewBtnOnClick={() => {\n this.props.showPreviewModal({\n url: previewModalUrl,\n title: previewModalTitle,\n })\n }}\n listItemOnClick={(e) =>\n this.handleOnClickList(e.target, formModalLabel, formModalBody, previewModalUrl, previewModalTitle)\n }\n />\n )\n })}\n </div>\n </div>\n }\n </div>\n } else {\n renderItemLayout =\n <NoResultMessage\n label=\"No Result\"\n />\n }\n\n return renderItemLayout;\n }\n\n renderStoreCount = (data) => {\n const {\n activePageNum\n } = this.state;\n\n let hasPagination = false;\n let storeCount = 0;\n let dataStoreLength = data.StoreInfoList.length;\n if (activePageNum > 1) {\n storeCount = ((activePageNum - 1) * 10) + dataStoreLength;\n } else {\n storeCount = dataStoreLength\n }\n if (data &&\n data.TotalPageNumber &&\n data.TotalPageNumber.value > 1) {\n hasPagination = true;\n }\n return (\n <div className={`list-count ${!hasPagination ? \"no-pagination\" : \"\"}`}>\n {\"Showing \"}\n {storeCount}\n {\" of \"}\n {data.TotalResults.value}\n </div>\n )\n }\n handlePaginationClick = data => {\n this.setState({\n activePageNum: data.selected + 1\n })\n let params = {\n pageNumber: data.selected + 1\n };\n this.getData(params, data.selected + 1);\n };\n\n renderPagination = () => {\n const { data } = this.props;\n const {\n paginationRange\n } = this.state;\n return (\n data &&\n data.TotalPageNumber &&\n data.TotalPageNumber.value > 1 && (\n <ReactPaginate\n previousLabel={\n <div>\n <i className=\"icon icon-chevron-outline-left\" />\n <span>{\"Previous\"}</span>\n </div>\n }\n nextLabel={\n <div>\n <i className=\"icon icon-chevron-outline-right\" />\n <span>{\"Next\"}</span>\n </div>\n }\n breakLabel={\"...\"}\n breakClassName={\"break-me\"}\n pageCount={data.TotalPageNumber.value}\n marginPagesDisplayed={0}\n pageRangeDisplayed={paginationRange}\n onPageChange={this.handlePaginationClick}\n containerClassName={\"pagination\"}\n subContainerClassName={\"pages pagination\"}\n activeClassName={\"active\"}\n />\n )\n );\n };\n\n render() {\n const {\n Header = null\n } = this.props.headerData || {};\n const {\n data,\n isDashboard\n } = this.props;\n const {\n showPagination,\n showLoader\n } = this.state;\n return (\n <div className=\"store-info\">\n <PageHeader\n title={isDashboard ? { value: \"Store information\" } : Header}\n />\n {showLoader && (\n <div className=\"loader-wrapper container\">\n <div className=\"loader\"></div>\n </div>\n )}\n {(!showLoader && !isDashboard) ?\n this.renderItems(data) :\n this.renderDashboardItems(data)\n }\n {(!isDashboard &&\n !showLoader &&\n data &&\n data.TotalResults &&\n data.TotalResults.value &&\n data.StoreInfoList &&\n data.StoreInfoList.length > 0) &&\n this.renderStoreCount(data)\n }\n {!isDashboard &&\n showPagination &&\n <div>\n {this.renderPagination()}\n </div>\n }\n </div>\n );\n }\n}\n\nexport default FeatureRetailerPortalStoreInfo;\n","import React from \"react\";\nimport FormModal from \"../../../Base/FormModal\";\nimport SuccessMessage from \"../../../Base/SuccessMessage\";\nimport CustomIframe from \"../../../Base/CustomIframe\";\nimport StoreInfo from \"../../../Modules/StoreInfo\";\nimport {\n addParameter\n} from \"../../../../helper/UrlHelper\";\nimport {\n getStoreInfo,\n} from \"../../../../api/StoreAPI\";\nimport {\n scrollToTop\n} from \"../../../../helper/ScrollHelper\";\nimport { hideBackToTop } from \"../../../../helper/HideBackToTopHelper\";\n\nclass FeatureRetailerPortalStores extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n selectedFilter: null,\n showPreviewModal: false,\n showFormModal: false,\n storeInfo: null,\n modalData: null,\n formModalData: null,\n previewModalData: null,\n showSuccessMessage: false,\n activePageNum: 1,\n isDocumentReady: false,\n isDashboardUpdate: false,\n isMobile: false\n };\n }\n\n componentDidMount() {\n if (document) {\n this.setState({ isDocumentReady: true }, this.handleResize());\n }\n if (window) {\n window.addEventListener(\"resize\", this.handleResize);\n }\n }\n\n handleResize = () => {\n if (window.outerWidth >= 768) {\n this.setState({\n isMobile: false\n })\n } else {\n this.setState({\n isMobile: true\n })\n }\n }\n\n renderContent = () => {\n const {\n isDashboard = false,\n storeList = []\n } = this.props\n const {\n storeInfo,\n selectedFilter\n } = this.state;\n\n return (\n <StoreInfo\n headerData={this.props.fields}\n data={storeInfo}\n data={(storeList && storeList.length > 0) ? { dashboardStores: storeList } : storeInfo}\n filter={selectedFilter}\n dataUpdate={(storeInfo, activePageNum) =>\n this.setState({ storeInfo, activePageNum })}\n showPreviewModal={previewModalData =>\n this.setState({ showPreviewModal: true, previewModalData })\n }\n showFormModal={formModalData => {\n this.setState({\n showFormModal: true,\n formModalData,\n previewModalData: {\n ...this.state.previewModalData,\n title: formModalData.previewTitle,\n url: formModalData.previewUrl,\n }\n })\n }\n }\n isDashboard={isDashboard}\n />\n );\n };\n\n renderPreviewModal = () => {\n const {\n title,\n url\n } = this.state.previewModalData || {};\n\n const {\n previewUrl,\n storeInfoTitle\n } = this.state.formModalData || {}\n\n const {\n showFormModal,\n showPreviewModal\n } = this.state;\n\n hideBackToTop(showPreviewModal || showFormModal);\n \n return (\n <FormModal\n isPreview\n showModal={showPreviewModal}\n label={title ? title : storeInfoTitle}\n closeOnClick={() =>\n this.setState({\n showPreviewModal: false\n })}\n >\n {showPreviewModal &&\n <CustomIframe\n title={title ? title : storeInfoTitle}\n src={url ? url : previewUrl}\n />\n }\n </FormModal>\n );\n }\n\n renderFormModal = () => {\n const {\n updateDashboard\n } = this.props || {};\n const {\n title,\n content,\n previewUrl,\n showSaveHint,\n disableBtn,\n onClickSave,\n onClickSubmit,\n onClickPreview,\n successMessage = \"\",\n } = this.state.formModalData || {}\n\n const {\n showFormModal,\n isDashboardUpdate,\n isMobile,\n showPreviewModal\n } = this.state\n\n if (!showFormModal && isDashboardUpdate && updateDashboard) {\n this.setState({\n isDashboardUpdate: false\n },\n () => updateDashboard(true))\n }\n\n hideBackToTop(showPreviewModal || showFormModal);\n\n return (\n <FormModal\n showModal={showFormModal}\n label={title}\n closeOnClick={() =>\n this.setState({\n showFormModal: false\n })\n }\n showSaveHint={showSaveHint}\n saveBtn={\"Save draft\"}\n saveBtnOnClick={() => {\n onClickSave().then((result) => {\n if (result) {\n if (!updateDashboard) {\n this.getStoreInfoUpdate();\n } else {\n this.setState({\n isDashboardUpdate: true\n })\n }\n }\n });\n }}\n secondaryBtn={`Preview${Array.isArray(previewUrl) && !isMobile ? \"…\" : \"\"}`}\n secondaryBtnOnClick={() => {\n if (Array.isArray(previewUrl)) {\n onClickPreview();\n } else if (previewUrl) {\n this.setState({\n showPreviewModal: true,\n })\n }\n }\n }\n disabledSecondaryBtn={disableBtn}\n primaryBtn={\"Submit\"}\n primaryBtnClassName={\"store-submit-btn\"}\n primaryBtnOnClick={() => {\n onClickSubmit().then((result) => {\n if (result) {\n if (!updateDashboard) {\n this.getStoreInfoUpdate();\n }\n this.setState({\n showFormModal: false,\n showSuccessMessage: true,\n formModalData: {\n ...this.state.formModalData,\n successMessage\n },\n isDashboardUpdate: updateDashboard ? true : false\n },\n () => scrollToTop()\n )\n }\n });\n }}\n disabledPrimaryBtn={disableBtn}\n >\n {this.state.showFormModal &&\n content\n }\n </FormModal>\n );\n }\n\n getStoreInfoUpdate = async () => {\n const { activePageNum } = this.state;\n let params = {\n pageNumber: activePageNum\n };\n const url = window.location.href;\n window.history.pushState(null, \"Store Info\", addParameter(url, \"date\", Date.now()));\n let response = await getStoreInfo(params);\n if (response && response.status == 200) {\n this.setState({\n storeInfo: response.data\n })\n }\n }\n\n render() {\n const {\n showSuccessMessage,\n isDocumentReady,\n } = this.state;\n\n const {\n successMessage,\n previewUrl,\n isRetailer\n } = this.state.formModalData || {};\n\n return (\n <div className={`stores__container ${showSuccessMessage ? \"has-success-message\" : \"\"}`}>\n {isDocumentReady &&\n this.renderPreviewModal()\n }\n {isDocumentReady &&\n this.renderFormModal()\n }\n {showSuccessMessage &&\n <SuccessMessage\n showPreviewLink={previewUrl && !isRetailer}\n label={successMessage}\n handleOnClick={() => this.setState({\n showPreviewModal: true\n })}\n handleShowSuccess={(showSuccessMessage) => {\n this.setState({\n showSuccessMessage\n })\n }}\n />\n }\n <div className=\"stores__content\">\n {this.renderContent()}\n </div>\n </div>\n );\n }\n}\nexport default FeatureRetailerPortalStores;\n","import React from \"react\";\nimport {\n getEvents,\n} from \"../../../api/StoreAPI\";\nimport PageHeader from \"../../Base/PageHeader\";\nimport ListItem from \"../../Base/ListItem\";\nimport NoResultMessage from \"../../Base/NoResultMessage\";\n\n// import GetEvents_Response from \"./GetEvents_Response.json\";\n// GetEventBackup\n// GetEvents_Response\n\nclass Events extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n showLoader: true,\n };\n }\n\n componentDidMount() {\n const {\n isDashboard\n } = this.props\n\n if (!isDashboard) {\n let params = {\n centre: \"\"\n };\n this.getData(params, true);\n } else {\n this.setState({\n showLoader: false,\n });\n }\n }\n\n componentDidUpdate(prevProps) {\n const {\n filterCentre,\n isDashboard\n } = this.props\n\n if (!isDashboard) {\n if ((filterCentre !== prevProps.filterCentre)) {\n let params = {\n centre: filterCentre.toString()\n }\n this.getData(params);\n }\n }\n }\n\n getData = async (params, isOnLoad) => {\n this.setState({\n showLoader: true\n })\n\n try {\n const response = await getEvents(params);\n if (response.status === 200 && response.data) {\n this.props.dataUpdate(response.data);\n let totalResultCount = 0;\n Object.keys(response.data).map(item => {\n totalResultCount = totalResultCount + response.data[item].length\n })\n this.props.dataTotalCount(totalResultCount)\n this.setState({\n showLoader: false,\n });\n }\n }\n catch (e) {\n console.error(\"Get Events Data Error: \" + e.response.statusText);\n // this.props.dataUpdate(GetEvents_Response);\n // let totalResultCount = 0;\n // Object.keys(GetEvents_Response).map(item => {\n // totalResultCount = totalResultCount + GetEvents_Response[item].length\n // })\n // this.props.dataTotalCount(totalResultCount)\n // this.setState({\n // showLoader: false,\n // });\n }\n };\n\n renderItems = (data, filter) => {\n const {\n LivePromotions,\n ScheduledPromotions,\n AwaitingApprovalPromotions,\n DraftPromotions,\n RejectedPromotions,\n dashboardPromotions\n } = data || {};\n\n let renderItemsLayout = \"\";\n\n if (dashboardPromotions && dashboardPromotions.length > 0) {\n renderItemsLayout =\n this.renderDashboardListItem(dashboardPromotions)\n } else {\n let livePomotionLayout = \"\",\n ScheduledPromotionsLayout = \"\",\n AwaitingApprovalPromotionsLayout = \"\",\n DraftPromotionsLayout = \"\",\n RejectedPromotionsLayout = \"\";\n\n if (LivePromotions && LivePromotions.length > 0) {\n livePomotionLayout =\n this.renderListItem(LivePromotions, \"Live\", filter)\n }\n if (ScheduledPromotions && ScheduledPromotions.length > 0) {\n ScheduledPromotionsLayout =\n this.renderListItem(ScheduledPromotions, \"Scheduled\", filter)\n }\n if (AwaitingApprovalPromotions && AwaitingApprovalPromotions.length > 0) {\n AwaitingApprovalPromotionsLayout =\n this.renderListItem(AwaitingApprovalPromotions, \"Awaiting approval\", filter)\n }\n if (DraftPromotions && DraftPromotions.length > 0) {\n DraftPromotionsLayout =\n this.renderListItem(DraftPromotions, \"Draft\", filter)\n }\n if (RejectedPromotions && RejectedPromotions.length > 0) {\n RejectedPromotionsLayout =\n this.renderListItem(RejectedPromotions, \"Rejected\", filter)\n }\n\n if (filter === \"allStatus\") {\n renderItemsLayout =\n <div>\n {livePomotionLayout}\n {ScheduledPromotionsLayout}\n {AwaitingApprovalPromotionsLayout}\n {DraftPromotionsLayout}\n {RejectedPromotionsLayout}\n </div>\n }\n else if (filter === \"LivePromotions\") {\n renderItemsLayout = livePomotionLayout;\n }\n else if (filter === \"ScheduledPromotions\") {\n renderItemsLayout = ScheduledPromotionsLayout;\n }\n else if (filter === \"AwaitingApprovalPromotions\") {\n renderItemsLayout = AwaitingApprovalPromotionsLayout;\n }\n else if (filter === \"DraftPromotions\") {\n renderItemsLayout = DraftPromotionsLayout;\n }\n else if (filter === \"RejectedPromotions\") {\n renderItemsLayout = RejectedPromotionsLayout;\n }\n }\n\n return renderItemsLayout;\n }\n\n renderDashboardListItem = (promotions) => {\n const {\n noSelectedStore\n } = this.props\n\n return (\n <div className=\"list__group\">\n {promotions.map((item, index) => {\n const {\n ItemId,\n Thumbnail,\n CentreName,\n Name,\n Status,\n PreviewURL\n } = item || {};\n\n let imageSrc = \"\";\n\n if (Thumbnail && Thumbnail.value && Thumbnail.value.src) {\n imageSrc = Thumbnail.value.src;\n }\n\n return (\n <ListItem\n key={`events-list-${ItemId + index}`}\n logoSrc={imageSrc}\n label={CentreName}\n title={Name}\n status={Status}\n previewBtn={{ \"label\": \"Preview\" }}\n previewBtnOnClick={() => {\n this.props.showPreviewModal({\n url: PreviewURL.value,\n title: (Name && Name.value) ? Name.value : \"\",\n })\n }}\n btnOne={{ \"icon\": \"trash-2\", \"tooltip\": \"Delete\" }}\n btnOneOnClick={() => {\n this.props.showDeleteModal({\n id: ItemId.value,\n name: Name.value,\n centreName: CentreName.value,\n status: Status.value,\n })\n }}\n listItemOnClick={(e) => {\n if (noSelectedStore) {\n if (!(/btn|icon/.test(e.target.className))) {\n this.props.showPreviewModal({\n url: PreviewURL.value,\n title: (Name && Name.value) ? Name.value : \"\",\n })\n }\n } else {\n this.handleOnClickList(e, ItemId.value)\n }\n }\n }\n />\n )\n })\n }\n </div>\n )\n }\n\n renderListItem = (promotions, label, filter) => {\n const {\n noSelectedStore\n } = this.props\n return (\n <div className=\"list__group\">\n {filter === \"allStatus\" &&\n <div className=\"list__header\">\n {label}\n </div>\n }\n {promotions.map((item, index) => {\n const {\n ItemId,\n Thumbnail,\n CentreName,\n Name,\n StartDate,\n EndDate,\n Status,\n PreviewURL\n } = item || {};\n\n let imageSrc = \"\";\n\n if (Thumbnail && Thumbnail.value && Thumbnail.value.src) {\n imageSrc = Thumbnail.value.src;\n }\n\n let description = \"\";\n\n if (StartDate && StartDate.value || EndDate && EndDate.value) {\n description =\n <span>\n {StartDate.value}\n {EndDate && EndDate.value ? \" - \" : \"\"}\n {EndDate.value}\n </span>\n }\n\n return (\n <ListItem\n key={`events-list-${ItemId + index}`}\n logoSrc={imageSrc}\n label={CentreName}\n title={Name}\n storeDescription={description}\n status={Status}\n previewBtn={{ \"label\": \"Preview\" }}\n previewBtnOnClick={() => {\n this.props.showPreviewModal({\n url: PreviewURL.value,\n title: (Name && Name.value) ? Name.value : \"\",\n })\n }}\n btnOne={{ \"icon\": \"trash-2\", \"tooltip\": \"Delete\" }}\n btnOneOnClick={() => {\n this.props.showDeleteModal({\n id: ItemId.value,\n name: Name.value,\n centreName: CentreName.value,\n status: Status.value,\n })\n }}\n listItemOnClick={(e) => {\n if (noSelectedStore) {\n if (!(/btn|icon/.test(e.target.className))) {\n this.props.showPreviewModal({\n url: PreviewURL.value,\n title: (Name && Name.value) ? Name.value : \"\",\n })\n }\n } else {\n this.handleOnClickList(e, ItemId.value)\n }\n }\n }\n />\n )\n })\n }\n </div>\n )\n }\n\n renderListCount = (data, totalListCount, filterStatus) => {\n let promotionCount = 0;\n \n Object.keys(data).map(item => {\n if (filterStatus !== \"allStatus\") {\n if (filterStatus === item) {\n promotionCount = data[item].length;\n }\n } else {\n promotionCount = promotionCount + data[item].length;\n }\n })\n\n return (\n <div>\n {promotionCount > 0 ?\n <div className=\"list-count no-pagination\">\n {\"Showing \"}\n {promotionCount}\n {\" of \"}\n {totalListCount}\n </div> :\n <NoResultMessage\n label=\"No events\"\n description=\"Create an event to boost customer engagement with your store!\"\n />\n }\n </div>\n )\n }\n\n handleOnClickList = (e, itemId) => {\n let element = e.target;\n let formModalLabel = \"\";\n document.activeElement.blur();\n if (e.detail > 1) {\n return;\n }\n if ((/btn-form-create|btn__label|icon-plus/.test(element.className))) {\n if(/btn__label/.test(element.className) && !(/btn-form-create/.test(element.parentElement.className))) {\n return;\n }\n formModalLabel =\n <span>\n {\"Website content\"}\n \n {\"»\"}\n \n {\"Events\"}\n \n {\"»\"}\n \n {\"New event\"}\n </span>\n\n this.props.showFormModal({\n title: formModalLabel,\n itemId: \"\",\n isNewPromotion: true\n })\n }\n else if (!(/btn|icon/.test(element.className)) || (/js-btn-edit|icon-edit/.test(element.className))) {\n formModalLabel =\n <span>\n {\"Website content\"}\n \n {\"»\"}\n \n {\"Events\"}\n \n {\"»\"}\n \n {\"Update event\"}\n </span>\n\n this.props.showFormModal({\n title: formModalLabel,\n itemId: itemId,\n isNewPromotion: false\n })\n }\n }\n\n render() {\n const {\n data,\n showFilter,\n filterStatus,\n isDashboard,\n hideFilter,\n totalListCount\n } = this.props;\n const {\n showLoader,\n } = this.state;\n\n return (\n <div>\n <div className={`events ${hideFilter ? \"hide-filter\" : \"\"}`}>\n <PageHeader\n title={{ value: \"Events\" }}\n primaryBtnLabel={\"New event\"}\n primaryBtnClassName=\"btn-form-create\"\n primaryBtnIcon={\"plus\"}\n primaryBtnOnClick={(e) =>\n this.handleOnClickList(e)}\n secondaryBtnLabel={\"Filter\"}\n secondaryBtnClassName=\"filter-btn\"\n secondaryBtnOnClick={() => showFilter()}\n />\n {showLoader &&\n <div className=\"loader-wrapper container\">\n <div className=\"loader\">\n </div>\n </div>\n }\n {!showLoader &&\n this.renderItems(data, filterStatus)\n }\n {!isDashboard &&\n !showLoader &&\n data &&\n this.renderListCount(data, totalListCount, filterStatus)\n }\n </div>\n </div>\n );\n }\n}\n\nexport default Events;\n","import React from \"react\";\nimport {\n getOffers\n} from \"../../../api/StoreAPI\";\nimport PageHeader from \"../../Base/PageHeader\";\nimport ListItem from \"../../Base/ListItem\";\nimport NoResultMessage from \"../../Base/NoResultMessage\";\n\n// import GetOffers_Response from \"./GetOfferBackup.json\";\n\nclass Offers extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n showLoader: true,\n };\n }\n\n componentDidMount() {\n const {\n isDashboard\n } = this.props\n\n if (!isDashboard) {\n let params = {\n centre: \"\"\n };\n this.getData(params, true);\n } else {\n this.setState({\n showLoader: false,\n });\n }\n }\n\n componentDidUpdate(prevProps) {\n const {\n filterCentre,\n isDashboard\n } = this.props\n\n if (!isDashboard) {\n if ((filterCentre !== prevProps.filterCentre)) {\n let params = {\n centre: filterCentre.toString()\n }\n this.getData(params);\n }\n }\n }\n\n getData = async (params, isOnLoad) => {\n this.setState({\n showLoader: true\n })\n\n try {\n const response = await getOffers(params);\n if (response.status === 200 && response.data) {\n this.props.dataUpdate(response.data);\n let totalResultCount = 0;\n Object.keys(response.data).map(item => {\n totalResultCount = totalResultCount + response.data[item].length\n })\n this.props.dataTotalCount(totalResultCount)\n this.setState({\n showLoader: false,\n });\n }\n }\n catch (e) {\n console.error(\"Get Offers Data Error: \" + e.response.statusText);\n // this.props.dataUpdate(GetOffers_Response);\n // let totalResultCount = 0;\n // Object.keys(GetOffers_Response).map(item => {\n // totalResultCount = totalResultCount + GetOffers_Response[item].length\n // })\n // this.props.dataTotalCount(totalResultCount)\n // this.setState({\n // showLoader: false,\n // });\n }\n };\n\n renderItems = (data, filter) => {\n const {\n LivePromotions,\n ScheduledPromotions,\n AwaitingApprovalPromotions,\n DraftPromotions,\n RejectedPromotions,\n EmbargoedPromotions,\n dashboardPromotions\n } = data || {};\n\n let renderItemsLayout = \"\";\n\n if (dashboardPromotions && dashboardPromotions.length > 0) {\n renderItemsLayout =\n this.renderDashboardListItem(dashboardPromotions)\n } else {\n let livePromotionsLayout = \"\",\n ScheduledPromotionsLayout = \"\",\n EmbargoedPromotionsLayout = \"\",\n AwaitingApprovalPromotionsLayout = \"\",\n DraftPromotionsLayout = \"\",\n RejectedPromotionsLayout = \"\";\n\n if (LivePromotions && LivePromotions.length > 0) {\n livePromotionsLayout =\n this.renderListItem(LivePromotions, \"Live\", filter)\n }\n if (ScheduledPromotions && ScheduledPromotions.length > 0) {\n ScheduledPromotionsLayout =\n this.renderListItem(ScheduledPromotions, \"Scheduled\", filter)\n }\n if (AwaitingApprovalPromotions && AwaitingApprovalPromotions.length > 0) {\n AwaitingApprovalPromotionsLayout =\n this.renderListItem(AwaitingApprovalPromotions, \"Awaiting approval\", filter)\n }\n if (DraftPromotions && DraftPromotions.length > 0) {\n DraftPromotionsLayout =\n this.renderListItem(DraftPromotions, \"Draft\", filter)\n }\n if (RejectedPromotions && RejectedPromotions.length > 0) {\n RejectedPromotionsLayout =\n this.renderListItem(RejectedPromotions, \"Rejected\", filter)\n }\n\n if (EmbargoedPromotions && EmbargoedPromotions.length > 0) {\n EmbargoedPromotionsLayout =\n this.renderListItem(EmbargoedPromotions, \"Embargoed\", filter)\n }\n\n if (filter === \"allStatus\") {\n renderItemsLayout =\n <div>\n {livePromotionsLayout}\n {ScheduledPromotionsLayout}\n {EmbargoedPromotionsLayout}\n {AwaitingApprovalPromotionsLayout}\n {DraftPromotionsLayout}\n {RejectedPromotionsLayout}\n </div>\n }\n else if (filter === \"LivePromotions\") {\n renderItemsLayout = livePromotionsLayout;\n }\n else if (filter === \"ScheduledPromotions\") {\n renderItemsLayout = ScheduledPromotionsLayout;\n }\n else if (filter === \"AwaitingApprovalPromotions\") {\n renderItemsLayout = AwaitingApprovalPromotionsLayout;\n }\n else if (filter === \"DraftPromotions\") {\n renderItemsLayout = DraftPromotionsLayout;\n }\n else if (filter === \"RejectedPromotions\") {\n renderItemsLayout = RejectedPromotionsLayout;\n }\n else if (filter === \"EmbargoedPromotions\") {\n renderItemsLayout = EmbargoedPromotionsLayout;\n }\n }\n\n return renderItemsLayout;\n }\n\n renderDashboardListItem = (promotions) => {\n const {\n noSelectedStore\n } = this.props\n\n return (\n <div className=\"list__group\">\n {promotions.map((item, index) => {\n const {\n ItemId,\n Thumbnail,\n CentreName,\n Name,\n Status,\n PreviewURL\n } = item || {};\n\n let imageSrc = \"\";\n\n if (Thumbnail && Thumbnail.value && Thumbnail.value.src) {\n imageSrc = Thumbnail.value.src;\n }\n\n return (\n <ListItem\n key={`offers-list-${ItemId + index}`}\n logoSrc={imageSrc}\n label={CentreName}\n title={Name}\n status={Status}\n previewBtn={{ \"label\": \"Preview\" }}\n previewBtnOnClick={() => {\n this.props.showPreviewModal({\n url: PreviewURL.value,\n title: (Name && Name.value) ? Name.value : \"\",\n })\n }}\n btnOne={{ \"icon\": \"trash-2\", \"tooltip\": \"Delete\" }}\n btnOneOnClick={() => {\n this.props.showDeleteModal({\n id: ItemId.value,\n name: Name.value,\n centreName: CentreName.value,\n status: Status.value,\n })\n }}\n listItemOnClick={(e) => {\n if (noSelectedStore) {\n if (!(/btn|icon/.test(e.target.className))) {\n this.props.showPreviewModal({\n url: PreviewURL.value,\n title: (Name && Name.value) ? Name.value : \"\",\n })\n }\n } else {\n this.handleOnClickList(e, ItemId.value)\n }\n }\n }\n />\n )\n })\n }\n </div>\n )\n }\n\n renderListItem = (promotions, label, filter) => {\n const {\n noSelectedStore\n } = this.props\n return (\n <div className=\"list__group\">\n {filter === \"allStatus\" &&\n <div className=\"list__header\">\n {label}\n </div>\n }\n {promotions.map((item, index) => {\n const {\n ItemId,\n Thumbnail,\n CentreName,\n Name,\n StartDate,\n EndDate,\n Status,\n PreviewURL,\n OfferHighlight\n } = item || {};\n\n let imageSrc = \"\";\n\n if (Thumbnail && Thumbnail.value && Thumbnail.value.src) {\n imageSrc = Thumbnail.value.src;\n }\n\n let description = \"\";\n\n if (StartDate && StartDate.value || EndDate && EndDate.value) {\n description =\n <span>\n {StartDate.value}\n {EndDate && EndDate.value ? \" - \" : \"\"}\n {EndDate.value}\n {OfferHighlight && OfferHighlight.value ? \", \" + OfferHighlight.value : \"\"}\n </span>\n }\n\n return (\n <ListItem\n key={`offers-list-${ItemId + index}`}\n logoSrc={imageSrc}\n label={CentreName}\n title={Name}\n storeDescription={description}\n status={Status}\n previewBtn={{ \"label\": \"Preview\" }}\n previewBtnOnClick={() => {\n this.props.showPreviewModal({\n url: PreviewURL.value,\n title: (Name && Name.value) ? Name.value : \"\",\n })\n }}\n btnOne={{ \"icon\": \"trash-2\", \"tooltip\": \"Delete\" }}\n btnOneOnClick={() => {\n this.props.showDeleteModal({\n id: ItemId.value,\n name: Name.value,\n centreName: CentreName.value,\n status: Status.value,\n })\n }}\n listItemOnClick={(e) => {\n if (noSelectedStore) {\n if (!(/btn|icon/.test(e.target.className))) {\n this.props.showPreviewModal({\n url: PreviewURL.value,\n title: (Name && Name.value) ? Name.value : \"\",\n })\n }\n } else {\n this.handleOnClickList(e, ItemId.value)\n }\n }\n }\n />\n )\n })\n }\n </div>\n )\n }\n\n renderListCount = (data, totalListCount, filterStatus) => {\n let promotionCount = 0;\n Object.keys(data).map(item => {\n if (filterStatus !== \"allStatus\") {\n if (filterStatus === item) {\n promotionCount = data[item].length;\n }\n } else {\n promotionCount = promotionCount + data[item].length;\n }\n })\n\n return (\n <div>\n {promotionCount > 0 ?\n <div className=\"list-count no-pagination\">\n {\"Showing \"}\n {promotionCount}\n {\" of \"}\n {totalListCount}\n </div> :\n <NoResultMessage\n label=\"No offers\"\n description=\"Create an offer to boost customer engagement with your store!\"\n />\n }\n </div>\n )\n }\n\n handleOnClickList = (e, itemId) => {\n let element = e.target;\n let formModalLabel = \"\";\n document.activeElement.blur();\n if (e.detail > 1) {\n return;\n }\n if ((/btn-form-create|btn__label|icon-plus/.test(element.className))) {\n if(/btn__label/.test(element.className) && !(/btn-form-create/.test(element.parentElement.className))) {\n return;\n }\n formModalLabel =\n <span>\n {\"Website content\"}\n \n {\"»\"}\n \n {\"Offers\"}\n \n {\"»\"}\n \n {\"New offer\"}\n </span>\n\n this.props.showFormModal({\n title: formModalLabel,\n itemId: \"\",\n isNewPromotion: true\n })\n }\n else if (!(/btn|icon/.test(element.className)) || (/js-btn-edit|icon-edit/.test(element.className))) {\n formModalLabel =\n <span>\n {\"Website content\"}\n \n {\"»\"}\n \n {\"Offers\"}\n \n {\"»\"}\n \n {\"Update offer\"}\n </span>\n\n this.props.showFormModal({\n title: formModalLabel,\n itemId: itemId,\n isNewPromotion: false\n })\n }\n }\n\n render() {\n const {\n data,\n showFilter,\n filterStatus,\n isDashboard,\n hideFilter,\n totalListCount\n } = this.props;\n\n const {\n showLoader,\n } = this.state;\n\n return (\n <div>\n <div className={`offers ${hideFilter ? \"hide-filter\" : \"\"}`}>\n <PageHeader\n title={{ value: \"Offers\" }}\n primaryBtnLabel={\"New offer\"}\n primaryBtnClassName=\"btn-form-create\"\n primaryBtnIcon={\"plus\"}\n primaryBtnOnClick={(e) =>\n this.handleOnClickList(e)}\n secondaryBtnLabel={\"Filter\"}\n secondaryBtnClassName=\"filter-btn\"\n secondaryBtnOnClick={() => showFilter()}\n />\n {showLoader &&\n <div className=\"loader-wrapper container\">\n <div className=\"loader\">\n </div>\n </div>\n }\n {!showLoader &&\n this.renderItems(data, filterStatus)\n }\n {!isDashboard &&\n !showLoader &&\n data &&\n this.renderListCount(data, totalListCount, filterStatus)\n }\n </div>\n </div>\n );\n }\n}\n\nexport default Offers;\n","import { get } from \"lodash\";\nimport { AllHtmlEntities as Entities } from \"html-entities\";\nimport { validateImageSize, validateImageType } from \"./ImageUploadHelper\";\n\nconst isEmpty = (value) => {\n return value ? false : true;\n};\n\nconst isObject = (value) => typeof value === 'object' && value !== null;\n\nconst isBlob = (value) => value instanceof Blob && value !== null;\n\nexport const validate = (state, removeValidate) => {\n let list = [\n // {\n // name: \"selectedStore\",\n // value: state.selectedStore,\n // rules: \"required\"\n // },\n {\n name: \"promotionName\",\n value: state.promotionName,\n rules: \"required\",\n },\n {\n name: \"summary\",\n value: state.summary,\n rules: \"required\",\n },\n {\n name: \"startDate\",\n value: state.startDate,\n rules: \"required\",\n },\n {\n name: \"endDate\",\n value: state.endDate,\n rules: \"required\",\n },\n {\n name: \"heroImage\",\n value: state.heroImage,\n rules: \"required\",\n },\n {\n name: \"selectedStores\",\n value: state.selectedStores,\n rules: \"required\",\n },\n {\n name: \"description\",\n value: state.description,\n rules: \"required-richtext\",\n },\n {\n name: \"selectedCategories\",\n value: state.selectedCategories,\n rules: \"required-array\",\n },\n {\n name: \"embargoStartDate\",\n value: state.embargoStartDate,\n rules: \"optional-before-start\"\n },\n {\n name: \"embargoEndDate\",\n value: state.embargoEndDate,\n rules: \"end-before-start\"\n },\n {\n name: \"embargoEndDate\",\n value: state.embargoEndDate,\n rules: \"optional-before-start\"\n },\n {\n name: \"embargoStartDate\",\n value: state.embargoStartDate,\n rules: \"start-after-end\"\n },\n {\n name: \"embargoEndDate\",\n value: state.embargoEndDate,\n rules: \"publish-before-embargo\"\n },\n {\n name: \"thumbnailFileType\",\n value: state.thumbnail,\n rules: \"image-file-type\"\n },\n {\n name: \"heroImageFileType\",\n value: state.heroImage,\n rules: \"image-file-type\"\n },\n {\n name: \"socialFeedFileType\",\n value: state.socialFeedImage,\n rules: \"image-file-type\"\n },\n {\n name: \"socialStoryFileType\",\n value: state.socialStoryImage,\n rules: \"image-file-type\"\n },\n {\n name: \"imageGalleryFileType\",\n value: state.imageGallery,\n rules: \"image-gallery-file-type\"\n },\n {\n name: \"thumbnailFileSize\",\n value: state.thumbnail,\n rules: \"image-file-size\"\n },\n {\n name: \"heroImageFileSize\",\n value: state.heroImage,\n rules: \"image-file-size\"\n },\n {\n name: \"socialFeedFileSize\",\n value: state.socialFeedImage,\n rules: \"image-file-size\"\n },\n {\n name: \"socialStoryFileSize\",\n value: state.socialStoryImage,\n rules: \"image-file-size\"\n },\n {\n name: \"imageGalleryFileSize\",\n value: state.imageGallery,\n rules: \"image-gallery-file-size\"\n }\n ];\n\n let result = {};\n list.forEach((element) => {\n if (removeValidate.indexOf(element.name) > -1) {\n return;\n }\n if (element.rules === \"required\") {\n if (isEmpty(element.value)) {\n result[element.name] = \"Required\";\n }\n\n if (element.value && element.value.length && element.value.length < 1) {\n result[element.name] = \"Required\";\n }\n }\n\n if (element.rules === \"required-richtext\") {\n if (isEmpty(element.value)) {\n result[element.name] = \"Required\";\n }\n\n if (element.value && element.value.trim().length < 8) {\n result[element.name] = \"Required\";\n }\n }\n if (element.rules === \"required-array\") {\n if (element.value && !element.value.length && element.value.length < 1) {\n result[element.name] = \"Required\";\n }\n }\n\n if (element.rules === \"optional-before-start\") {\n let dateToValidate = new Date(element.value).getTime();\n let dateToCompare = new Date(state.startDate).getTime();\n if (dateToValidate && !(dateToValidate < dateToCompare)) {\n result[element.name] = \"Embargo must end before offer can start\";\n }\n }\n\n if (element.rules === \"end-before-start\") {\n let dateToValidate = new Date(element.value).getTime();\n let dateToCompare = new Date(state.embargoStartDate).getTime();\n if (dateToValidate < dateToCompare) {\n result[element.name] = \"End date cannot be before start date\";\n }\n }\n\n if (element.rules === \"start-after-end\") {\n let dateToValidate = new Date(element.value).getTime();\n let dateToCompare = new Date(state.embargoEndDate).getTime();\n if (dateToValidate > dateToCompare) {\n result[element.name] = \"Start date cannot be before end date\";\n }\n }\n\n if (element.rules === \"publish-before-embargo\") {\n let dateToValidate = new Date(element.value).getTime();\n let dateToCompare = new Date(state.displayStartDate).getTime();\n if (dateToCompare && (dateToValidate > dateToCompare)) {\n result[element.name] = \"Cannot display during embargo period\";\n }\n }\n\n if (element.rules === 'image-file-type') {\n if(isObject(element.value)){ \n const imageValidity = validateImageType(element.value);\n if (imageValidity === false) {\n result[element.name] = \"Invalid file type\";\n }\n } else {}\n }\n\n if (element.rules === 'image-file-size') {\n if(isObject(element.value)){ \n const imageValidity = validateImageSize(element.value);\n if (imageValidity === false) {\n result[element.name] = \"Your file is too large. File upload image size limit is 5MB\";\n }\n }\n }\n\n if (element.rules === 'image-gallery-file-type') {\n if (!isEmpty(element.value)) {\n let invalidImages = [];\n element.value.forEach(elem => {\n if(isObject(elem) && isBlob(elem)){\n let imageValidity = validateImageType(elem);\n if(imageValidity === false) {\n invalidImages.push(elem);\n }\n }\n });\n if (invalidImages.length > 0) {\n result[element.name] = \"Invalid file type\";\n }\n }\n }\n\n if (element.rules === 'image-gallery-file-size') {\n if (!isEmpty(element.value)) {\n let invalidImages = [];\n element.value.forEach(elem => {\n if(isObject(elem) && isBlob(elem)){\n let imageValidity = validateImageSize(elem);\n if(imageValidity === false) {\n invalidImages.push(elem);\n }\n }\n });\n if (invalidImages.length > 0) {\n result[element.name] = \"A file is too large. File upload image size limit is 5MB\";\n }\n }\n }\n\n //Other Validation Rules\n });\n return result;\n};\n\nexport const formDataFields = {\n itemId: null,\n selectedStore: null,\n categoryTag: \"\",\n offerHighlight: \"\",\n promotionName: \"\",\n summary: \"\",\n startDate: \"\",\n endDate: \"\",\n displayStartDate: null,\n displayEndDate: null,\n embargoStartDate: \"\",\n embargoEndDate: \"\",\n location: \"\",\n schedule: \"\",\n duration: \"\",\n capacity: \"\",\n price: \"\",\n description: \"\",\n termsAndConditionsCopy: \"\",\n termsAndConditionsLink: \"\",\n selectedCategories: [],\n heroImage: \"\",\n thumbnail: \"\",\n imageGalleryChecker: [],\n imageGallery: [],\n selectedStores: [],\n selectedSpecialPromotion: [],\n itemIds: [],\n socialFeedImage: \"\",\n socialStoryImage: \"\",\n retailerHandles: \"\",\n retailerHashtags: \"\",\n consentToSharing: false\n};\n\nexport const setPromotionData = (data) => {\n return {\n itemId: data.ItemId.value,\n heroImage: get(data, \"HeroImage.value.src\", null),\n thumbnail: get(data, \"Thumbnail.value.src\", null),\n promotionName: data.Name.value,\n offerHighlight: data.OfferHighlight.value,\n duration: data.Duration.value,\n capacity: data.Capacity.value,\n location: data.Location.value,\n categoryTag: data.CategoryTag.value,\n summary: data.Summary.value,\n startDate: data.StartDate.value,\n endDate: data.EndDate.value,\n displayStartDate: data.DisplayStartDate.value,\n displayEndDate: data.DisplayEndDate.value,\n embargoStartDate: data.EmbargoStartDate.value,\n embargoEndDate: data.EmbargoEndDate.value,\n schedule: data.Schedule.value,\n price: data.Price.value,\n description: data.Description.value,\n selectedSpecialPromotion: data.LinkedSpecialHolidays.map(\n (el) => el.HolidayId.value\n ),\n termsAndConditionsCopy: get(data, \"TermsAndConditionsCopy.value\", null),\n termsAndConditionsLink: get(\n data,\n \"TermsAndConditionsLink.value.href\",\n null\n ),\n selectedCategories: data.LinkCategories.map(\n (el) => el.CategoryId.value\n ),\n imageGalleryChecker: data.ImageGallery.map((el) => el.Id.value),\n imageGallery: data.ImageGallery.map((el) => {\n return {\n name: el.Name.value,\n id: el.Id.value,\n src: el.Src.value,\n };\n }),\n socialFeedImage: get(data, \"SocialFeedImage.value.src\", null),\n socialStoryImage: get(data, \"SocialStoryImage.value.src\", null),\n retailerHandles: data.RetailerHandles.value,\n retailerHashtags: data.RetailerHashtags.value,\n consentToSharing: data.ConsentToSharing.value\n };\n};\n\nexport const buildFormData = (postData) => {\n const formData = new FormData();\n const entities = new Entities();\n\n Object.keys(postData).forEach(function (key) {\n if (key === \"itemId\") {\n return\n }\n if (\n (key === \"startDate\" ||\n key === \"embargoStartDate\" ||\n key === \"embargoEndDate\" ||\n key === \"endDate\" ||\n key === \"displayStartDate\" ||\n key === \"displayEndDate\") &&\n postData[key]\n ) {\n return formData.append(key, new Date(postData[key]).toISOString());\n }\n\n if (key === \"description\") {\n formData.append(key, entities.encode(postData[key]));\n return;\n }\n\n if (key === \"imageGalleryChecker\") {\n // if (postData[key].length) {\n // let newimageGalleryChecker = postData[\"imageGallery\"].filter((item) => {\n // if (postData[key].indexOf(item.id) > -1) {\n // return item.id;\n // } \n // });\n // return newimageGalleryChecker.map((item) =>\n // formData.append(key, item.id)\n // );\n // }\n\n if (postData[\"imageGallery\"].length > 0) {\n return postData[\"imageGallery\"].map((item) =>\n formData.append(key, item.id ? item.id : null)\n );\n }\n return;\n }\n\n if (key === \"imageGallery\") {\n // if (postData[key].length > 0) {\n // let newimageGallery = postData[key].filter((item) => {\n // return item.size ? item : null;\n // });\n\n // return newimageGallery.map((file) => formData.append(key, file));\n // }\n if (postData[key].length > 0) {\n let newimageGallery = postData[key].filter(item => item.size)\n return newimageGallery.map((file) => formData.append(key, file));\n }\n return;\n }\n\n if (key === \"selectedCategories\" && postData[key].length) {\n return postData[key].map((category) => formData.append(key, category));\n }\n\n if (key === \"selectedSpecialPromotion\" && postData[key].length) {\n return postData[key].map((promotion) => formData.append(key, promotion));\n }\n\n if (key === \"heroImage\" || key === \"thumbnail\" || key === \"socialStoryImage\" || key === \"socialFeedImage\") {\n if (typeof postData[key] !== \"string\") {\n return formData.append(key, postData[key]);\n }\n return;\n }\n\n if (key === \"selectedStores\" && postData[key].length) {\n return postData[key].map((storeId) => formData.append(key, storeId));\n }\n\n if (key === \"itemIds\" && postData[key].length) {\n return postData[key].map((itemId) => formData.append(key, itemId));\n }\n\n return formData.append(key, postData[key]);\n });\n\n return formData;\n};\n","import React from \"react\";\r\nimport axios from \"axios\";\r\nimport Loadable from \"react-loadable\";\r\nimport logoPlaceholder from \"../../../../assets/img/logoPlaceholder.png\";\r\nimport TagManager from \"react-gtm-module\";\r\nimport FormImageGallery from \"../../../Base/FormImageGallery\";\r\nimport FormInput from \"../../../Base/FormInput\";\r\nimport FormInputMultiple from \"../../../Base/FormInputMultiple\";\r\nimport FormDate from \"../../../Base/FormDate\";\r\nimport FormCheckbox from \"../../../Base/FormCheckbox\";\r\nimport FormListbox from \"../../../Base/FormListbox\";\r\nimport FormListCheckbox from \"../../../Base/FormListCheckbox\";\r\nimport Checkbox from \"../../../Base/Checkbox\";\r\nimport FormErrorMessage from \"../../../Base/FormErrorMessage\";\r\nimport FormImageUpload from \"../../../Base/FormImageUpload\";\r\nimport PopupPreview from \"../../../Base/Popup/PopupPreview\";\r\nimport { get } from \"lodash\";\r\nimport {\r\n validate,\r\n setPromotionData,\r\n buildFormData,\r\n formDataFields,\r\n} from \"../../../../helper/PromotionHelper\";\r\nimport { getUrlParameter } from \"../../../../helper/UrlHelper\";\r\nimport { getAncestorElement } from \"../../../../helper/GetAncestorElementHelper\";\r\nimport {\r\n getPromotionData,\r\n getCentreStores,\r\n getCategoriesAndHolidays,\r\n} from \"../../../../api/PromotionAPI\";\r\n\r\n// import promotionProps from \"./jsonResponse/editPropsJson.json\";\r\n// import newSaveResponse from \"./jsonResponse/newSaveResponse.json\";\r\n// import getCentreStoresResponseApi from \"./jsonResponse/getCentreStoresResponseApi.json\";\r\n// import getCategoriesAndHolidaysApi from \"./jsonResponse/getCategoriesAndHolidaysApi.json\";\r\n// import GetPromotionDataResponse from \"./jsonResponse/GetPromotionDataResponse.json\";\r\n\r\nconst RichTextEditor = Loadable({\r\n loader: () => import(\"../../../Base/RichTextEditor\"),\r\n loading: () => null,\r\n});\r\n\r\nclass FormPromotions extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n mode: \"new\",\r\n showModal: false,\r\n formError: {},\r\n centreStoreList: [],\r\n categories: [],\r\n holidays: [],\r\n formData: { ...formDataFields },\r\n componentReady: false,\r\n showScheduleDate: false,\r\n showTermsCondition: false,\r\n showImageGallery: false,\r\n disableBtn: true,\r\n showSaveHint: false,\r\n showErrorMessage: false,\r\n formErrorMessage: \"\",\r\n imageGalleryHolder: [],\r\n displayStartDateHolder: null,\r\n displayEndDateHolder: null,\r\n termsAndConditionsLinkHolder: \"\",\r\n termsAndConditionsCopyHolder: \"\",\r\n promotionPreviewUrl: \"\",\r\n promotionPreviewTitle: \"\",\r\n promotionList: [],\r\n getPromotionDataReady: false,\r\n previewBulkLogo: \"\",\r\n promotionIdList: [],\r\n retailerId: null,\r\n consentToSharing: false,\r\n retailerHandles: \"\",\r\n retailerHashtags: \"\",\r\n socialFeedImage: \"\",\r\n socialStoryImage: \"\",\r\n retailerId: null\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n const { itemId, dashboardType } = this.props;\r\n\r\n let type = \"\";\r\n\r\n if (dashboardType) {\r\n type = dashboardType.charAt(0).toUpperCase() + dashboardType.slice(1);\r\n } else {\r\n type = getUrlParameter(\"type\").replace(\"?sc_mode=normal\", \"\");\r\n }\r\n\r\n this.setState({\r\n type,\r\n componentReady: true,\r\n });\r\n\r\n if (itemId) {\r\n this.getData(itemId);\r\n } else {\r\n this.getCentreStoreList();\r\n }\r\n this.getCategoriesAndHolidays();\r\n this.handleFormData();\r\n }\r\n\r\n getData = async (itemId) => {\r\n try {\r\n let response = await getPromotionData({ itemId });\r\n if (response.status === 200 && response.data) {\r\n let promotionData = setPromotionData(response.data.Promotion);\r\n\r\n this.setState({\r\n mode: \"edit\",\r\n getPromotionDataReady: true,\r\n formData: { ...this.state.formData, ...promotionData },\r\n showScheduleDate:\r\n promotionData.displayStartDate || promotionData.displayEndDate\r\n ? true\r\n : false,\r\n showTermsCondition:\r\n promotionData.termsAndConditionsLink ||\r\n promotionData.termsAndConditionsCopy\r\n ? true\r\n : false,\r\n showImageGallery:\r\n promotionData.imageGallery && promotionData.imageGallery.length > 0\r\n ? true\r\n : false,\r\n consentToSharing: promotionData.consentToSharing\r\n });\r\n }\r\n } catch (e) {\r\n console.error(\"Get Promotion Data Error: \" + e);\r\n this.setState({\r\n getPromotionDataReady: true,\r\n });\r\n // if (itemId) {\r\n // let promotionData = setPromotionData(GetPromotionDataResponse.Promotion);\r\n\r\n // this.setState({\r\n // mode: \"edit\",\r\n // getPromotionDataReady: true,\r\n // formData: { ...this.state.formData, ...promotionData },\r\n // showScheduleDate: (promotionData.displayStartDate || promotionData.displayEndDate) ? true : false,\r\n // showExternalPage: (promotionData.bookNowLink || promotionData.bookNowLinkCaption) ? true : false,\r\n // showTermsCondition: (promotionData.termsAndConditionsLink || promotionData.termsAndConditionsCopy) ? true : false,\r\n // showImageGallery: (promotionData.imageGallery.length > 0) ? true : false\r\n // });\r\n // }\r\n }\r\n };\r\n\r\n getCategoriesAndHolidays = async () => {\r\n try {\r\n let response = await getCategoriesAndHolidays();\r\n if (response.status === 200 && response.data) {\r\n let categoryListData = response.data.Categories;\r\n let holidayListData = response.data.GlobalSpecialHoliday;\r\n let categoryList = [];\r\n let holidayList = [];\r\n if (categoryListData.length > 0) {\r\n categoryListData.forEach((el) =>\r\n categoryList.push({\r\n name: el.CategoryName.value,\r\n value: el.CategoryId.value,\r\n })\r\n );\r\n }\r\n if (holidayListData.length > 0) {\r\n holidayListData.forEach((el) =>\r\n holidayList.push({\r\n name: el.HolidayName.value,\r\n value: el.HolidayId.value,\r\n })\r\n );\r\n }\r\n this.setState({\r\n categories: categoryList,\r\n holidays: holidayList,\r\n });\r\n }\r\n } catch (e) {\r\n console.error(\r\n \"Get Categories And Holidays Error: \" + e.response.statusText\r\n );\r\n // let categoryListData = getCategoriesAndHolidaysApi.Categories;\r\n // let holidayListData = getCategoriesAndHolidaysApi.GlobalSpecialHoliday;\r\n // let categoryList = [];\r\n // let holidayList = [];\r\n // if (categoryListData.length > 0) {\r\n // categoryListData.forEach((el) =>\r\n // categoryList.push({\r\n // name: el.CategoryName.value,\r\n // value: el.CategoryId.value,\r\n // })\r\n // );\r\n // }\r\n // if (holidayListData.length > 0) {\r\n // holidayListData.forEach((el) =>\r\n // holidayList.push({\r\n // name: el.HolidayName.value,\r\n // value: el.HolidayId.value,\r\n // })\r\n // );\r\n // }\r\n // this.setState({\r\n // categories: categoryList,\r\n // holidays: holidayList,\r\n // });\r\n }\r\n };\r\n\r\n getCentreStoreList = async () => {\r\n try {\r\n let response = await getCentreStores();\r\n if (response.status === 200 && response.data) {\r\n if (response.data.IsSuccess.value) {\r\n this.setState({\r\n centreStoreList: get(response.data, \"CentreStoreList\", []),\r\n retailerId: get(response.data, \"Retailer.RetailerId.value\", \"\"),\r\n getPromotionDataReady: true,\r\n });\r\n }\r\n }\r\n } catch (e) {\r\n console.error(\"Get centre stores data error: \" + e.response.statusText);\r\n this.setState({\r\n getPromotionDataReady: true,\r\n });\r\n // this.setState({\r\n // centreStoreList: get(getCentreStoresResponseApi, \"CentreStoreList\", []),\r\n // retailerId: get(getCentreStoresResponseApi, \"Retailer.RetailerId.value\", \"\"),\r\n // getPromotionDataReady: true,\r\n // });\r\n }\r\n };\r\n\r\n handleListbox = (id, field, isCheckbox) => {\r\n const { formData } = this.state;\r\n let options;\r\n let selected = [];\r\n if (document) {\r\n if (isCheckbox) {\r\n options = document.querySelectorAll(`#${id} input:checked`);\r\n } else {\r\n options = document.querySelectorAll(`#${id} option:checked`);\r\n }\r\n if (options) {\r\n for (let i = 0; i < options.length; i++) {\r\n selected.push(options[i].value);\r\n }\r\n }\r\n }\r\n this.setState({\r\n formData: {\r\n ...formData,\r\n [field]: selected,\r\n },\r\n });\r\n };\r\n\r\n handleSelect = (isSelect, field, options) => {\r\n const { formData } = this.state;\r\n this.setState({\r\n formData: {\r\n ...formData,\r\n [field]: isSelect ? options.map((el) => el.value) : [],\r\n },\r\n });\r\n };\r\n\r\n handleInputCheckbox = (value) => {\r\n const { formData } = this.state;\r\n if (formData.selectedCategories.indexOf(value) > -1) {\r\n this.setState({\r\n formData: {\r\n ...formData,\r\n selectedCategories: formData.selectedCategories.filter(\r\n (el) => el !== value\r\n ),\r\n },\r\n });\r\n } else {\r\n this.setState({\r\n formData: {\r\n ...formData,\r\n selectedCategories: [...formData.selectedCategories, value],\r\n },\r\n });\r\n }\r\n };\r\n\r\n handleStoreListCheckbox = (value, selectAllStores) => {\r\n const { formData, centreStoreList } = this.state;\r\n\r\n if (value === \"0\") {\r\n let allStores = [];\r\n centreStoreList.map((centre) => {\r\n centre.StoreList.map((store) => {\r\n allStores.push(store.StoreItemId.value);\r\n });\r\n });\r\n\r\n this.setState({\r\n formData: {\r\n ...formData,\r\n selectedStores: selectAllStores ? allStores : [],\r\n },\r\n });\r\n } else if (formData.selectedStores.indexOf(value) > -1) {\r\n this.setState({\r\n formData: {\r\n ...formData,\r\n selectedStores: formData.selectedStores.filter((el) => el !== value),\r\n },\r\n });\r\n } else {\r\n this.setState({\r\n formData: {\r\n ...formData,\r\n selectedStores: [...formData.selectedStores, value],\r\n },\r\n });\r\n }\r\n };\r\n\r\n handleFormUpdate = (value) => {\r\n this.setState({\r\n formData: {\r\n ...this.state.formData,\r\n ...value,\r\n },\r\n });\r\n };\r\n\r\n validateForm = async () => {\r\n let formError = validate(\r\n this.state.formData,\r\n this.state.mode === \"edit\" ? [\"selectedRetailer\"] : []\r\n );\r\n let response;\r\n if (Object.entries(formError).length !== 0) {\r\n this.setState({\r\n formError,\r\n showErrorMessage: true,\r\n formErrorMessage: \"Please fill out all mandatory fields marked below\",\r\n });\r\n this.triggerBackToTop();\r\n response = {\r\n isSuccess: false,\r\n };\r\n } else {\r\n this.setState({\r\n formError,\r\n });\r\n response = await this.saveForm().then((result) => {\r\n if (result.isSuccess) {\r\n return { isSuccess: true };\r\n }\r\n });\r\n }\r\n return response;\r\n };\r\n\r\n saveForm = async () => {\r\n const { formData, mode, type, promotionIdList } = this.state;\r\n var timezoneId = new Date().getTimezoneOffset();\r\n const url = \"/api/sitecore/promotion/SavePromotion\";\r\n let data = buildFormData({\r\n ...formData,\r\n timeZoneId: timezoneId,\r\n });\r\n\r\n this.triggerBackToTop();\r\n\r\n this.setState(\r\n {\r\n showSaveHint: true,\r\n disableBtn: true,\r\n },\r\n this.handleFormData\r\n );\r\n\r\n try {\r\n let response = await axios({\r\n method: \"POST\",\r\n url,\r\n data,\r\n params: {\r\n type,\r\n ...(mode === \"edit\"\r\n ? { itemId: formData.itemId }\r\n : { itemId: promotionIdList.toString() }),\r\n },\r\n config: { headers: { \"Content-Type\": \"multipart/form-data\" } },\r\n });\r\n\r\n if (response) {\r\n if (response.data.IsSuccess.value && mode === \"new\") {\r\n const promotionList = response.data.PromotionList;\r\n const promotionsItem = promotionList[0].Promotions;\r\n const itemIds = this.extractItemIds(promotionList);\r\n let previewBulkLogo;\r\n\r\n this.setGoogleAnalytics(promotionList);\r\n\r\n if (response.data.RetailerLogo && response.data.RetailerLogo.value) {\r\n previewBulkLogo = response.data.RetailerLogo.value;\r\n }\r\n\r\n if (promotionList.length === 1 && promotionsItem.length === 1) {\r\n this.setState(\r\n {\r\n formData: {\r\n ...formData,\r\n itemIds,\r\n },\r\n showSaveHint: false,\r\n disableBtn: false,\r\n showErrorMessage: false,\r\n promotionPreviewUrl: promotionsItem[0].PreviewUrl.value,\r\n // promotionPreviewTitle: promotionsItem[0].Store.value,\r\n promotionPreviewTitle: formData.promotionName,\r\n promotionList: promotionList,\r\n previewBulkLogo: \"\",\r\n promotionIdList: this.setPromotionIdList(promotionList),\r\n },\r\n this.handleFormData\r\n );\r\n } else {\r\n this.setState(\r\n {\r\n formData: {\r\n ...formData,\r\n itemIds,\r\n },\r\n showSaveHint: false,\r\n disableBtn: false,\r\n showErrorMessage: false,\r\n promotionPreviewUrl: \"\",\r\n promotionPreviewTitle: \"\",\r\n promotionList: promotionList,\r\n previewBulkLogo,\r\n promotionIdList: this.setPromotionIdList(promotionList),\r\n },\r\n this.handleFormData\r\n );\r\n }\r\n\r\n return {\r\n isSuccess: true,\r\n };\r\n } else if (response.data.IsSuccess.value && mode === \"edit\") {\r\n const promotionList = response.data.PromotionList[0];\r\n const promotion = promotionList.Promotions[0];\r\n const promotionPreviewUrl = promotion.PreviewUrl.value;\r\n const promotionPreviewTitle =\r\n promotion.Store.value + \" \" + promotionList.Centre.value;\r\n this.setState(\r\n {\r\n formData: {\r\n ...formData,\r\n itemIds: [`${promotion.ItemId.value}`],\r\n },\r\n showErrorMessage: false,\r\n showSaveHint: false,\r\n disableBtn: false,\r\n promotionPreviewUrl,\r\n promotionPreviewTitle: formData.promotionName,\r\n },\r\n this.handleFormData\r\n );\r\n\r\n return {\r\n isSuccess: true,\r\n };\r\n } else {\r\n this.setState(\r\n {\r\n showSaveHint: false,\r\n disableBtn: true,\r\n showErrorMessage: true,\r\n formErrorMessage:\r\n \"Promotion Not Saved \" + response.data.Message.value,\r\n },\r\n this.handleFormData\r\n );\r\n\r\n return {\r\n isSuccess: false,\r\n };\r\n }\r\n }\r\n } catch (e) {\r\n console.error(\"Promotion Save Error: \" + e.response.statusText);\r\n // Condition of catch\r\n this.setState({\r\n showErrorMessage: true,\r\n formErrorMessage: \"Promotion Save Error: \" + e.response.statusText,\r\n });\r\n return {\r\n isSuccess: false,\r\n };\r\n\r\n // Condition on mode === edit\r\n // const promotionList = newSaveResponse.PromotionList[0]\r\n // const promotion = promotionList.Promotions[0];\r\n // const promotionPreviewUrl = promotion.PreviewUrl.value;\r\n // const promotionPreviewTitle = promotion.Store.value + \" \" + promotionList.Centre.value;\r\n\r\n // this.setState(\r\n // {\r\n // formData: {\r\n // ...formData,\r\n // itemIds: [`${promotion.ItemId.value}`]\r\n // },\r\n // showErrorMessage: false,\r\n // showSaveHint: false,\r\n // disableBtn: false,\r\n // promotionPreviewUrl,\r\n // promotionPreviewTitle: formData.promotionName\r\n // },\r\n // this.handleFormData\r\n // );\r\n\r\n // return {\r\n // isSuccess: true\r\n // };\r\n\r\n // condition new\r\n // const promotionList = newSaveResponse.PromotionList;\r\n // const promotionsItem = promotionList[0].Promotions;\r\n // const itemIds = this.extractItemIds(promotionList);\r\n // let previewBulkLogo;\r\n\r\n // if (newSaveResponse.RetailerLogo && newSaveResponse.RetailerLogo.value) {\r\n // previewBulkLogo = newSaveResponse.RetailerLogo.value;\r\n // }\r\n // this.setState({\r\n // formData: {\r\n // ...formData,\r\n // itemIds\r\n // },\r\n // showSaveHint: false,\r\n // disableBtn: false,\r\n // },\r\n // this.handleFormData\r\n // );\r\n\r\n // if (promotionList.length === 1 && promotionsItem.length === 1) {\r\n // this.setState({\r\n // formData: {\r\n // ...formData,\r\n // itemIds\r\n // },\r\n // showSaveHint: false,\r\n // disableBtn: false,\r\n // showErrorMessage: false,\r\n // promotionPreviewUrl: promotionsItem[0].PreviewUrl.value,\r\n // // promotionPreviewTitle: promotionsItem[0].Store.value,\r\n // promotionPreviewTitle: formData.promotionName,\r\n // promotionList: promotionList,\r\n // previewBulkLogo: \"\",\r\n // promotionIdList: this.setPromotionIdList(promotionList)\r\n // },\r\n // this.handleFormData\r\n // );\r\n // } else {\r\n // this.setState({\r\n // formData: {\r\n // ...formData,\r\n // itemIds\r\n // },\r\n // showSaveHint: false,\r\n // disableBtn: false,\r\n // showErrorMessage: false,\r\n // promotionPreviewUrl: \"\",\r\n // promotionPreviewTitle: \"\",\r\n // promotionList: promotionList,\r\n // previewBulkLogo,\r\n // promotionIdList: this.setPromotionIdList(promotionList)\r\n // },\r\n // this.handleFormData\r\n // );\r\n // }\r\n\r\n // return {\r\n // isSuccess: true\r\n // };\r\n }\r\n };\r\n\r\n submitForm = async () => {\r\n const {\r\n formData,\r\n mode,\r\n promotionPreviewUrl,\r\n promotionPreviewTitle,\r\n } = this.state;\r\n const url = \"/api/sitecore/promotion/SubmitPromotion\";\r\n let data = buildFormData({\r\n itemIds: mode === \"edit\" ? [`${formData.itemId}`] : formData.itemIds,\r\n });\r\n this.triggerBackToTop();\r\n\r\n try {\r\n let response = await axios({\r\n method: \"POST\",\r\n url,\r\n data,\r\n config: { headers: { \"Content-Type\": \"multipart/form-data\" } },\r\n });\r\n\r\n if (response) {\r\n if (response.data.IsSuccess.value) {\r\n this.setState({\r\n showErrorMessage: false,\r\n });\r\n return {\r\n isSuccess: true,\r\n promotionPreviewUrl: mode === \"edit\" ? promotionPreviewUrl : \"\",\r\n promotionPreviewTitle: mode === \"edit\" ? promotionPreviewTitle : \"\",\r\n };\r\n } else {\r\n this.setState({\r\n showErrorMessage: true,\r\n formErrorMessage:\r\n \"Promotion Not Submitted \" + response.data.Message.value,\r\n });\r\n return {\r\n isSuccess: false,\r\n };\r\n }\r\n }\r\n } catch (e) {\r\n console.error(\"Promotion Submit Error: \" + e.response.statusText);\r\n this.setState({\r\n showErrorMessage: true,\r\n formErrorMessage: \"Promotion Submit Error: \" + e.response.statusText,\r\n });\r\n return {\r\n isSuccess: false,\r\n };\r\n\r\n // this.setState({\r\n // showErrorMessage: false,\r\n // });\r\n // return {\r\n // isSuccess: true,\r\n // promotionPreviewUrl: mode === \"edit\" ? promotionPreviewUrl : \"\",\r\n // promotionPreviewTitle: mode === \"edit\" ? promotionPreviewTitle : \"\"\r\n // };\r\n }\r\n };\r\n\r\n triggerBackToTop = () => {\r\n let backToTop;\r\n if (document) {\r\n backToTop = document.querySelector(\".form__modal--back-to-top-button\");\r\n if (backToTop) {\r\n backToTop.click();\r\n }\r\n }\r\n };\r\n\r\n setGoogleAnalytics = (promotionList) => {\r\n promotionList.map((item) => {\r\n const { Centre, Promotions } = item;\r\n Promotions.map((promotion) => {\r\n TagManager.dataLayer({\r\n dataLayer: {\r\n event: \"createdPromotions\",\r\n promotionType: this.state.type,\r\n promotionCentre: Centre && Centre.value,\r\n promotionRetailer:\r\n promotion && promotion.Store && promotion.Store.value,\r\n },\r\n dataLayerName: \"dataLayer\",\r\n });\r\n });\r\n });\r\n };\r\n\r\n setPromotionIdList = (promotionList) => {\r\n let promotionIdList = [];\r\n\r\n if (promotionList.length > 0) {\r\n promotionList.map((item) => {\r\n const { Promotions } = item;\r\n\r\n if (Promotions.length > 0) {\r\n Promotions.map((item) => {\r\n const { ItemId } = item;\r\n\r\n if (ItemId && ItemId.value) {\r\n promotionIdList.push(ItemId.value);\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n return promotionIdList;\r\n };\r\n\r\n extractItemIds = (centreList) => {\r\n let itemIds = [];\r\n centreList.map((center) => {\r\n center.Promotions.map((promotion) => {\r\n itemIds.push(promotion.ItemId.value);\r\n });\r\n });\r\n return itemIds;\r\n };\r\n\r\n handlePreviewForm = () => {\r\n this.setState({\r\n showModal: true,\r\n });\r\n };\r\n\r\n renderModal = () => {\r\n const { promotionList, showModal, previewBulkLogo } = this.state;\r\n\r\n const { promotionName } = this.state.formData || {};\r\n\r\n return (\r\n <div className=\"promotion-modal\">\r\n {promotionList && promotionList.length > 0 && (\r\n <PopupPreview\r\n previewTitle={\"Preview\"}\r\n previewLogo={previewBulkLogo}\r\n previewList={promotionList}\r\n previewListChildName=\"Promotions\"\r\n previewFormLabel={promotionName}\r\n btnLabel={\"Submit\"}\r\n btnOnClick={(e) => {\r\n let showModalWrapper = getAncestorElement(\r\n e.target,\r\n \"form__modal\"\r\n );\r\n if (showModalWrapper) {\r\n let submitBtn = showModalWrapper.querySelector(\r\n \".promotion-submit-btn\"\r\n );\r\n if (submitBtn) {\r\n submitBtn.click();\r\n }\r\n }\r\n }}\r\n showPreviewModal={() => this.setState({ showModal: false })}\r\n />\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n handleFormData = () => {\r\n const {\r\n showSaveHint,\r\n disableBtn,\r\n promotionPreviewUrl,\r\n promotionPreviewTitle,\r\n } = this.state;\r\n this.props.handleFormData(\r\n showSaveHint,\r\n disableBtn,\r\n promotionPreviewUrl,\r\n promotionPreviewTitle,\r\n this.validateForm,\r\n this.handlePreviewForm,\r\n this.submitForm\r\n );\r\n };\r\n\r\n buildCentreStoreList = (centreStoreList) => {\r\n const { type, formData } = this.state;\r\n\r\n return (\r\n <div className=\"form__multiple-stores\">\r\n <div className=\"form__multiple-stores--header\">\r\n <label className=\"form__label\">\r\n {`Publish this ${type.toLowerCase()} for the multiple centres`}\r\n </label>\r\n <div className=\"form__multiple-stores--action\">\r\n <div\r\n className=\"form__multiple-stores--action-btn\"\r\n onClick={() => this.handleStoreListCheckbox(\"0\", true)}\r\n >\r\n {\"Select all\"}\r\n </div>\r\n <div\r\n className=\"form__multiple-stores--action-btn\"\r\n onClick={() => this.handleStoreListCheckbox(\"0\", false)}\r\n >\r\n {\"Deselect all\"}\r\n </div>\r\n </div>\r\n </div>\r\n <div className=\"form__multiple-stores--content\">\r\n {centreStoreList.map((centre, index) => {\r\n const { CentreName, CentreIcon, StoreList } = centre;\r\n return (\r\n <div key={`centreStoreList-container-${index}`} className=\"row\">\r\n <div className=\"col col-12 col-md-6\">\r\n <div className=\"form__multiple-stores--logo\">\r\n {CentreIcon && CentreIcon.value ? (\r\n <img\r\n alt={`CentreIcon-${index}`}\r\n src={logoPlaceholder}\r\n data-src={CentreIcon.value}\r\n className=\"lazyload\"\r\n />\r\n ) : (\r\n <div className=\"no-image\" />\r\n )}\r\n </div>\r\n <div className=\"form__multiple-stores--label\">\r\n {CentreName.value}\r\n </div>\r\n </div>\r\n <div className=\"col col-12 col-md-6\">\r\n {StoreList.map((store, index) => {\r\n const { StoreItemId, StoreName } = store;\r\n return (\r\n <FormCheckbox\r\n key={`store-${StoreItemId.value}-${index}`}\r\n value={StoreItemId.value}\r\n label={StoreName.value}\r\n checked={\r\n formData.selectedStores.indexOf(StoreItemId.value) >\r\n -1\r\n }\r\n onCheckboxChange={(value) =>\r\n this.handleStoreListCheckbox(value)\r\n }\r\n plain\r\n />\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n render() {\r\n const {\r\n itemId = null\r\n } = this.props;\r\n const {\r\n formError,\r\n formData,\r\n categories,\r\n type,\r\n showModal,\r\n componentReady,\r\n centreStoreList,\r\n holidays,\r\n showScheduleDate,\r\n showTermsCondition,\r\n showImageGallery,\r\n showErrorMessage,\r\n formErrorMessage,\r\n imageGalleryHolder,\r\n displayStartDateHolder,\r\n displayEndDateHolder,\r\n termsAndConditionsLinkHolder,\r\n termsAndConditionsCopyHolder,\r\n getPromotionDataReady,\r\n promotionIdList,\r\n retailerId,\r\n consentToSharing,\r\n retailerHandles,\r\n retailerHashtags,\r\n socialFeedImage,\r\n socialStoryImage\r\n } = this.state;\r\n return (\r\n <div\r\n className={`promotion-container \r\n ${type && type.toLowerCase() === \"offer\"\r\n ? \"is-offer\"\r\n : \"is-event\"\r\n }`}\r\n >\r\n {showModal && this.renderModal()}\r\n {showErrorMessage && <FormErrorMessage error={formErrorMessage} />}\r\n <div className=\"form__container\">\r\n <FormInput\r\n title\r\n type=\"text\"\r\n placeholder={`${type} title`}\r\n label=\"Promotion Name\"\r\n value={formData.promotionName}\r\n required\r\n error={formError.promotionName}\r\n onInputChange={(promotionName) =>\r\n this.handleFormUpdate({ promotionName })\r\n }\r\n />\r\n </div>\r\n <div className=\"form__container\">\r\n <label className=\"form__header\">{`${type} duration`}</label>\r\n <div\r\n className={`form-group form__date--container\r\n ${formError.startDate || formError.endDate\r\n ? \"has-error\"\r\n : \"\"\r\n }\r\n `}\r\n >\r\n <div className=\"form__date--wrapper\">\r\n <FormDate\r\n required\r\n label=\"Start Date\"\r\n icon=\"calendar\"\r\n placeholderText=\"MM/DD/YYYY\"\r\n showTimeSelect\r\n timeCaption=\"Time\"\r\n timeFormat=\"HH:mm\"\r\n timeIntervals={5}\r\n dateFormat=\"d MMM yyyy - h:mmaa\"\r\n value={formData.startDate && new Date(formData.startDate)}\r\n error={formError.startDate}\r\n selected={formData.startDate && new Date(formData.startDate)}\r\n onChange={(startDate) => this.handleFormUpdate({ startDate })}\r\n />\r\n <div className=\"form__date--divider\" />\r\n <FormDate\r\n required\r\n label=\"End Date\"\r\n icon=\"calendar\"\r\n placeholderText=\"MM/DD/YYYY\"\r\n showTimeSelect\r\n timeCaption=\"Time\"\r\n timeFormat=\"HH:mm\"\r\n timeIntervals={5}\r\n dateFormat=\"d MMM yyyy - h:mmaa\"\r\n value={formData.endDate && new Date(formData.endDate)}\r\n error={formError.endDate}\r\n selected={formData.endDate && new Date(formData.endDate)}\r\n onChange={(endDate) => this.handleFormUpdate({ endDate })}\r\n />\r\n </div>\r\n <div className=\"form__hint\">*Maximum of 31 days(1 month)</div>\r\n </div>\r\n <Checkbox\r\n checked={showScheduleDate}\r\n label={\"Schedule a different publish date\"}\r\n onCheckboxChange={(showScheduleDate) => {\r\n this.setState({\r\n showScheduleDate,\r\n });\r\n if (showScheduleDate) {\r\n this.handleFormUpdate({\r\n displayStartDate: displayStartDateHolder,\r\n displayEndDate: displayEndDateHolder\r\n });\r\n } else {\r\n this.handleFormUpdate({\r\n displayStartDate: null,\r\n displayEndDate: null\r\n });\r\n }\r\n }}\r\n />\r\n {showScheduleDate && (\r\n <div className=\"form-group form__date--container\">\r\n <div className=\"form__date--wrapper\">\r\n <FormDate\r\n label=\"Publish from\"\r\n icon=\"calendar\"\r\n placeholderText=\"MM/DD/YYYY\"\r\n showTimeSelect\r\n timeCaption=\"Time\"\r\n timeFormat=\"HH:mm\"\r\n timeIntervals={5}\r\n dateFormat=\"d MMM yyyy - h:mmaa\"\r\n error={formError.displayStartDate}\r\n value={\r\n formData.displayStartDate &&\r\n new Date(formData.displayStartDate)\r\n }\r\n selected={\r\n formData.displayStartDate &&\r\n new Date(formData.displayStartDate)\r\n }\r\n onChange={(displayStartDate) => {\r\n this.setState({\r\n displayStartDateHolder: displayStartDate,\r\n });\r\n this.handleFormUpdate({ displayStartDate });\r\n }}\r\n />\r\n <div className=\"form__date--divider\" />\r\n <FormDate\r\n label=\"Publish until\"\r\n icon=\"calendar\"\r\n placeholderText=\"MM/DD/YYYY\"\r\n showTimeSelect\r\n timeCaption=\"Time\"\r\n timeFormat=\"HH:mm\"\r\n timeIntervals={5}\r\n dateFormat=\"d MMM yyyy - h:mmaa\"\r\n value={\r\n formData.displayEndDate && new Date(formData.displayEndDate)\r\n }\r\n error={formError.endDate}\r\n selected={\r\n formData.displayEndDate && new Date(formData.displayEndDate)\r\n }\r\n onChange={(displayEndDate) => {\r\n this.setState({\r\n displayEndDateHolder: displayEndDate,\r\n });\r\n this.handleFormUpdate({ displayEndDate });\r\n }}\r\n />\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n \r\n\r\n {type && type.toLowerCase() === \"event\" && (\r\n <div className=\"form__container\">\r\n <label className=\"form__header\">{`${type} details`}</label>\r\n <FormInput\r\n type=\"text\"\r\n icon=\"calendar\"\r\n placeholder=\"Eg: Every Monday\"\r\n label=\"Schedule\"\r\n value={formData.schedule}\r\n error={formError.schedule}\r\n onInputChange={(schedule) => this.handleFormUpdate({ schedule })}\r\n />\r\n\r\n <FormInput\r\n type=\"text\"\r\n placeholder=\"Eg: HH:MM\"\r\n label=\"Duration\"\r\n icon=\"time\"\r\n value={formData.duration}\r\n width=\"min\"\r\n onInputChange={(duration) => this.handleFormUpdate({ duration })}\r\n />\r\n\r\n <FormInput\r\n type=\"text\"\r\n placeholder=\"Eg: 10\"\r\n label=\"Capacity\"\r\n icon=\"capacity\"\r\n value={formData.capacity}\r\n width=\"min\"\r\n onInputChange={(capacity) => this.handleFormUpdate({ capacity })}\r\n />\r\n\r\n <FormInput\r\n type=\"number\"\r\n icon=\"price\"\r\n placeholder=\"Eg: 0.00\"\r\n label=\"Price\"\r\n currency\r\n value={formData.price}\r\n width=\"min\"\r\n onInputChange={(price) => this.handleFormUpdate({ price })}\r\n />\r\n </div>\r\n )}\r\n\r\n <div className=\"form__container\">\r\n <label className=\"form__header\">{`${type} description`}</label>\r\n {type && type.toLowerCase() === \"offer\" && (\r\n <FormInput\r\n type=\"text\"\r\n placeholder=\"Eg: 50% off\"\r\n label=\"Badge label\"\r\n width=\"badge\"\r\n margin=\"custom\"\r\n value={formData.offerHighlight}\r\n maxLength={7}\r\n onInputChange={(offerHighlight) =>\r\n this.handleFormUpdate({ offerHighlight })\r\n }\r\n />\r\n )}\r\n <FormInputMultiple\r\n label=\"Sub title\"\r\n placeholder=\"Provide a short description\"\r\n required\r\n value={formData.summary}\r\n maxLength={120}\r\n error={formError.summary}\r\n onInputChange={(summary) => this.handleFormUpdate({ summary })}\r\n />\r\n {getPromotionDataReady && (\r\n <RichTextEditor\r\n required\r\n width=\"max\"\r\n label={\"Description\"}\r\n placeholder=\"Provide a description\"\r\n initialValue={formData.description}\r\n error={formError.description}\r\n onInputChange={(description) =>\r\n this.handleFormUpdate({ description })\r\n }\r\n retailerId={retailerId}\r\n itemId={itemId}\r\n promotionType={type}\r\n />\r\n )}\r\n\r\n <div className=\"form__container--small\">\r\n <label className=\"form__header--small\">\r\n {\"Terms and conditions\"}\r\n </label>\r\n <Checkbox\r\n checked={showTermsCondition}\r\n label={\"Display link to an external terms and conditions page?\"}\r\n onCheckboxChange={(showTermsCondition) => {\r\n this.setState({\r\n showTermsCondition,\r\n });\r\n\r\n if (showScheduleDate) {\r\n this.handleFormUpdate({\r\n termsAndConditionsLink: termsAndConditionsLinkHolder,\r\n termsAndConditionsCopy: termsAndConditionsCopyHolder\r\n });\r\n\r\n } else {\r\n this.handleFormUpdate({\r\n termsAndConditionsLink: \"\",\r\n termsAndConditionsCopy: \"\"\r\n });\r\n }\r\n }}\r\n />\r\n {showTermsCondition && (\r\n <div>\r\n <FormInput\r\n type=\"text\"\r\n placeholder=\"Eg: www.terms-and-conditions.com\"\r\n label=\"External link\"\r\n value={formData.termsAndConditionsLink}\r\n onInputChange={(termsAndConditionsLink) => {\r\n this.setState({\r\n termsAndConditionsLinkHolder: termsAndConditionsLink,\r\n });\r\n this.handleFormUpdate({ termsAndConditionsLink });\r\n }}\r\n />\r\n\r\n <FormInput\r\n type=\"text\"\r\n placeholder=\"Eg: Please view terms and conditions\"\r\n label=\"Link label\"\r\n value={formData.termsAndConditionsCopy}\r\n onInputChange={(termsAndConditionsCopy) => {\r\n this.setState({\r\n termsAndConditionsCopyHolder: termsAndConditionsCopy,\r\n });\r\n this.handleFormUpdate({ termsAndConditionsCopy });\r\n }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"form__container\">\r\n {type && type.toLowerCase() === \"offer\" && (\r\n <>\r\n <label className=\"form__header\">{\"QIC Social & Digital Use\"}</label>\r\n <Checkbox\r\n checked={consentToSharing}\r\n label={\"I give permission for centre marketing teams to share this content to QIC centre owned social pages (Facebook and Instagram)\"}\r\n onCheckboxChange={(consentToSharing) => {\r\n this.setState({\r\n consentToSharing,\r\n });\r\n if (consentToSharing) {\r\n this.handleFormUpdate({\r\n socialFeedImage: socialFeedImage,\r\n socialStoryImage: socialStoryImage,\r\n retailerHandles: retailerHandles,\r\n retailerHashtags: retailerHashtags,\r\n consentToSharing: consentToSharing\r\n });\r\n\r\n } else {\r\n this.handleFormUpdate({\r\n socialFeedImage: '',\r\n socialStoryImage: '',\r\n retailerHandles: \"\",\r\n retailerHashtags: \"\",\r\n consentToSharing: false,\r\n embargoEndDate: \"\",\r\n embargoStartDate: \"\"\r\n });\r\n\r\n this.setState({\r\n retailerHandles: \"\",\r\n retailerHashtags: \"\"\r\n })\r\n }\r\n }}\r\n />\r\n {consentToSharing && type.toLowerCase() === \"offer\" && (\r\n <div className=\"embargo-group\">\r\n <div className=\"form-group form__date--container\">\r\n <div className=\"form__date--wrapper\">\r\n <div className=\"form__container\">\r\n <label className=\"form__header\">{`Embargo Period`}</label>\r\n <div className=\"form__label embargo-fields\">\r\n <p><i>Note</i> - An Embargo Period is the period of time in which an offer <strong>cannot be shared publicly</strong>.<br /> This period must end before the offer Start Date. </p>\r\n </div>\r\n <div\r\n className={`form-group form__date--container\r\n ${\r\n formError.embargoStartDate || formError.embargoEndDate\r\n ? \"has-error\"\r\n : \"\"\r\n }\r\n `}\r\n >\r\n <div className=\"form__date--wrapper\">\r\n <FormDate\r\n label=\"Embargo - Start Date\"\r\n icon=\"calendar\"\r\n placeholderText=\"MM/DD/YYYY\"\r\n showTimeSelect\r\n timeCaption=\"Time\"\r\n timeFormat=\"HH:mm\"\r\n timeIntervals={5}\r\n dateFormat=\"d MMM yyyy - h:mmaa\"\r\n value={formData.embargoStartDate && new Date(formData.embargoStartDate)}\r\n error={formError.embargoStartDate}\r\n selected={formData.embargoStartDate && new Date(formData.embargoStartDate)}\r\n onChange={(embargoStartDate) => this.handleFormUpdate({ embargoStartDate })}\r\n />\r\n <div className=\"form__date--divider\" />\r\n <FormDate\r\n label=\"Embargo - End Date\"\r\n icon=\"calendar\"\r\n placeholderText=\"MM/DD/YYYY\"\r\n showTimeSelect\r\n timeCaption=\"Time\"\r\n timeFormat=\"HH:mm\"\r\n timeIntervals={5}\r\n dateFormat=\"d MMM yyyy - h:mmaa\"\r\n value={formData.embargoEndDate && new Date(formData.embargoEndDate)}\r\n error={formError.embargoEndDate}\r\n selected={formData.embargoEndDate && new Date(formData.embargoEndDate)}\r\n onChange={(embargoEndDate) => this.handleFormUpdate({ embargoEndDate })}\r\n />\r\n </div>\r\n <div className=\"form__hint\">*Maximum of 31 days(1 month)</div>\r\n </div>\r\n </div>\r\n <div className=\"form-group\">\r\n <div className={`form__container ${\r\n formError.socialFeedImage || formError.socialFeedFileType || formError.socialFeedFileSize\r\n ? \"has-error\"\r\n : \"\"\r\n }`}>\r\n <FormImageUpload\r\n type=\"thumbnail\"\r\n label={\"Social Feed Image\"}\r\n guidelines={\r\n \"To ensure the quality of the shared content, the social feed image needs to be:\"\r\n }\r\n guidelinesOne={\"• At least 1080px wide\"}\r\n guidelinesTwo={\"• At least 1080px tall.\"}\r\n guidelinesThree={\r\n \"• To avoid your image being cropped, use a ratio of 1:1\"\r\n }\r\n error={formError.socialFeedImage || formError.socialFeedFileType || formError.socialFeedFileSize}\r\n value={formData.socialFeedImage}\r\n handleFileUpload={(socialFeedImage) =>\r\n this.handleFormUpdate({ socialFeedImage })\r\n }\r\n />\r\n </div> \r\n </div>\r\n <div className={`form__container ${\r\n formError.socialStoryImage || formError.socialStoryFileType || formError.socialStoryFileSize\r\n ? \"has-error\"\r\n : \"\"\r\n }`}> <FormImageUpload\r\n type=\"thumbnail\"\r\n label={\"Social Stories Image\"}\r\n guidelines={\r\n \"To ensure the quality of the shared content, the social stories image needs to be:\"\r\n }\r\n guidelinesOne={\"• At least 1080px wide\"}\r\n guidelinesTwo={\"• At least 1920px tall.\"}\r\n guidelinesThree={\r\n \"• To avoid your image being cropped, use a ratio of 9:16\"\r\n }\r\n error={formError.socialStoryImage || formError.socialStoryFileType || formError.socialStoryFileSize}\r\n value={formData.socialStoryImage}\r\n handleFileUpload={(socialStoryImage) =>\r\n this.handleFormUpdate({ socialStoryImage })\r\n }\r\n />\r\n </div>\r\n <FormInput\r\n type=\"text\"\r\n placeholder=\"Eg: @\"\r\n label=\"Retailer Handles\"\r\n value={formData.retailerHandles}\r\n onInputChange={(retailerHandles) => {\r\n this.setState({\r\n retailerHandles: retailerHandles,\r\n });\r\n this.handleFormUpdate({retailerHandles});\r\n }}\r\n />\r\n <FormInput\r\n type=\"text\"\r\n placeholder=\"Eg: #\"\r\n label=\"Retailer Hashtags\"\r\n value={formData.retailerHashtags}\r\n onInputChange={(retailerHashtags) => {\r\n this.setState({\r\n retailerHashtags: retailerHashtags,\r\n });\r\n this.handleFormUpdate({ retailerHashtags });\r\n }}\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n {(categories && categories.length > 0 ||\r\n (holidays && holidays.length > 0)) && (\r\n categories && categories.length > 0 && (\r\n <div>\r\n <div className=\"is-desktop\">\r\n <FormListbox\r\n label=\"Category\"\r\n id=\"LB_Cat_Desktop\"\r\n required\r\n error={formError.selectedCategories}\r\n options={categories}\r\n field=\"selectedCategories\"\r\n selected={formData.selectedCategories}\r\n hint=\"Press [ctrl] + click to select multiple\"\r\n handleListbox={(id, field) => this.handleListbox(id, field)}\r\n handleSelect={(isSelect, field, options) =>\r\n this.handleSelect(isSelect, field, options)\r\n }\r\n />\r\n </div>\r\n <div className=\"is-tablet\">\r\n <FormListCheckbox\r\n label=\"Category\"\r\n id=\"LB_Cat_Mobile\"\r\n required\r\n error={formError.selectedCategories}\r\n options={categories}\r\n field=\"selectedCategories\"\r\n selected={formData.selectedCategories}\r\n handleListbox={(id, field) => this.handleListbox(id, field, true)}\r\n handleSelect={(isSelect, field, options) =>\r\n this.handleSelect(isSelect, field, options)\r\n }\r\n />\r\n </div>\r\n </div>))}\r\n {holidays && holidays.length > 0 && (\r\n <div>\r\n <div className=\"is-desktop\">\r\n <FormListbox\r\n label=\"Special promotions\"\r\n id=\"LB_SH_Desktop\"\r\n options={holidays}\r\n field=\"selectedSpecialPromotion\"\r\n selected={formData.selectedSpecialPromotion}\r\n hint=\"Press [ctrl] + click to select multiple\"\r\n handleListbox={(id, field) => this.handleListbox(id, field)}\r\n handleSelect={(isSelect, field) =>\r\n this.handleSelect(isSelect, field, holidays)\r\n }\r\n />\r\n </div>\r\n <div className=\"is-tablet\">\r\n <FormListCheckbox\r\n label=\"Special promotions\"\r\n id=\"LB_SH_Mobile\"\r\n options={holidays}\r\n field=\"selectedSpecialPromotion\"\r\n selected={formData.selectedSpecialPromotion}\r\n handleListbox={(id, field) => this.handleListbox(id, field, true)}\r\n handleSelect={(isSelect, field, options) =>\r\n this.handleSelect(isSelect, field, options)\r\n }\r\n />\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n <div className={`form__container ${formError.heroImage || formError.heroImageFileSize || formError.heroImageFileType\r\n ? \"has-error\"\r\n : \"\"\r\n }`}>\r\n {getPromotionDataReady && (\r\n <FormImageUpload\r\n required\r\n type=\"hero\"\r\n label={\"Hero image\"}\r\n guidelines={\r\n \"To keep the quality of our websites high, the hero banner image needs to be:\"\r\n }\r\n guidelinesOne={\"• At least 1920px wide\"}\r\n guidelinesTwo={\"• At least 1080px tall.\"}\r\n guidelinesThree={\r\n \"• To avoid your image being cropped, use a ratio of 16:9\"\r\n }\r\n error={formError.heroImage || formError.heroImageFileType || formError.heroImageFileSize}\r\n value={formData.heroImage}\r\n handleFileUpload={(heroImage) =>\r\n this.handleFormUpdate({ heroImage })\r\n }\r\n />\r\n )}\r\n </div>\r\n\r\n <div className={`form__container ${formError.thumbnail || formError.thumbnailFileSize || formError.thumbnailFileType\r\n ? \"has-error\"\r\n : \"\"\r\n }`}>\r\n {getPromotionDataReady && (\r\n <FormImageUpload\r\n label={\"Thumbnail image\"}\r\n guidelines={\"The hero thumbnail image needs to be:\"}\r\n guidelinesOne={\"• At least 800px wide\"}\r\n guidelinesTwo={\"• At least 800px tall.\"}\r\n guidelinesThree={\r\n \"• To avoid your image being cropped, use a ratio of 1:1\"\r\n }\r\n error={formError.thumbnail || formError.thumbnailFileType || formError.thumbnailFileSize}\r\n value={formData.thumbnail}\r\n handleFileUpload={(thumbnail) =>\r\n this.handleFormUpdate({ thumbnail })\r\n }\r\n />\r\n )}\r\n </div>\r\n\r\n <div className={`form__container ${formError.imageGalleryFileType || formError.imageGalleryFileSize\r\n ? \"has-error\"\r\n : \"\"\r\n }`}> <label className=\"form__header\">{\"Image gallery\"}</label>\r\n <Checkbox\r\n checked={showImageGallery}\r\n label={\"Display an additional image gallery?\"}\r\n onCheckboxChange={(showImageGallery) => {\r\n this.setState({\r\n showImageGallery,\r\n });\r\n if (showImageGallery) {\r\n this.handleFormUpdate({ imageGallery: imageGalleryHolder });\r\n } else {\r\n this.handleFormUpdate({ imageGallery: [] });\r\n }\r\n }}\r\n />\r\n {showImageGallery && (\r\n <FormImageGallery\r\n value={formData.imageGallery}\r\n error={formError.imageGalleryFileType || formError.imageGalleryFileSize}\r\n handleAttachments={(imageGallery) => {\r\n this.setState({\r\n imageGalleryHolder: imageGallery,\r\n });\r\n this.handleFormUpdate({ imageGallery });\r\n }}\r\n />\r\n )}\r\n </div>\r\n\r\n {centreStoreList && centreStoreList.length > 0 && (\r\n <div\r\n className={`form__container ${promotionIdList.length > 0 ? \"is-hidden\" : \"\"\r\n }`}\r\n >\r\n <label className=\"form__header\">{`${type} visibility`}</label>\r\n {this.buildCentreStoreList(centreStoreList)}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default FormPromotions;\r\n","import React from 'react';\nimport Select from \"react-select\";\nimport RadioButton from \"../../../Base/RadioButton\";\nimport FormModal from \"../../../Base/FormModal\";\nimport Popup from \"../../../Base/Popup\";\nimport PopupAction from \"../../../Base/Popup/PopupAction\";\nimport SuccessMessage from \"../../../Base/SuccessMessage\";\nimport Events from \"../../../Modules/Events\";\nimport Offers from \"../../../Modules/Offers\";\nimport {\n getUrlParameter,\n} from \"../../../../helper/UrlHelper\";\nimport {\n deletePromotion,\n} from \"../../../../api/StoreAPI\";\nimport CustomFilter from '../../../Base/CustomFilter';\nimport CustomIframe from '../../../Base/CustomIframe';\nimport FormPromotions from \"../../../Modules/Forms/FormPromotions\";\nimport { addClassLazyload } from \"../../../../helper/AddClassLazyloadHelper\";\nimport { scrollToTop } from \"../../../../helper/ScrollHelper\";\nimport { removeActiveState } from \"../../../../helper/RemoveActiveState\";\nimport { hideBackToTop } from \"../../../../helper/HideBackToTopHelper\";\n\nclass FeatureRetailerPortalPromotionListing extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n isDocumentReady: false,\n isWindowReady: false,\n content: null,\n event: null,\n offer: null,\n showPreviewModal: false,\n showFormModal: false,\n showDeleteModal: false,\n previewModalData: null,\n formModalData: null,\n deleteModalData: null,\n showFilter: false,\n statusOption: [\n {\n Id: {\n value: \"allStatus\"\n },\n Name: {\n value: \"All\"\n }\n },\n {\n Id: {\n value: \"DraftPromotions\"\n },\n Name: {\n value: \"Draft\"\n }\n },\n {\n Id: {\n value: \"LivePromotions\"\n },\n Name: {\n value: \"Live\"\n }\n },\n {\n Id: {\n value: \"AwaitingApprovalPromotions\"\n },\n Name: {\n value: \"Awaiting approval\"\n }\n },\n {\n Id: {\n value: \"ScheduledPromotions\"\n },\n Name: {\n value: \"Scheduled\"\n }\n },\n {\n Id: {\n value: \"RejectedPromotions\"\n },\n Name: {\n value: \"Rejected\"\n }\n },\n {\n Id: {\n value: \"EmbargoedPromotions\"\n },\n Name: {\n value: \"Embargoed\"\n }\n }\n ],\n filterCentre: null,\n filterStatus: \"allStatus\",\n disableCancelBtn: false,\n disableDeleteBtn: false,\n promotionList: [],\n promotionPreviewUrlHolder: \"\",\n promotionPreviewTitleHolder: \"\",\n isDashboardUpdate: false,\n isMobile: false,\n dataCount: 0,\n centreListOption: [],\n filterByCentre: \"allCentre\"\n };\n }\n\n componentDidMount() {\n const {\n dashboardType = null\n } = this.props || {}\n if (document) {\n this.setState({\n isDocumentReady: true\n },\n () => {\n this.handleResize()\n this.updateCentreOption()\n }\n );\n }\n if (window) {\n this.getTab(dashboardType);\n window.addEventListener(\"resize\", this.handleResize);\n }\n }\n\n updateCentreOption = () => {\n const {\n CentreList,\n } = this.props.fields || {};\n\n let centreListOption = [\n {\n value: \"allCentre\",\n label: \"All centres\"\n }\n ]\n if (CentreList && CentreList.length > 0) {\n CentreList.map((item, index) => {\n const {\n Name\n } = item.fields\n centreListOption.push({ value: Name.value, label: Name.value });\n })\n }\n\n this.setState({ centreListOption });\n }\n\n handleResize = () => {\n if (window.outerWidth >= 992) {\n this.setState({\n isMobile: false\n })\n } else {\n this.setState({\n isMobile: true\n })\n }\n }\n\n getTab = (dashboardType) => {\n let type = \"\";\n if (dashboardType) {\n type = dashboardType;\n } else {\n type = getUrlParameter(\"type\").toLowerCase().replace(\"?sc_mode=normal\", \"\");\n }\n this.setState({ content: type });\n };\n\n renderPreviewModal = () => {\n const {\n title,\n url\n } = this.state.previewModalData || {};\n\n const {\n previewUrl,\n previewTitle,\n } = this.state.formModalData || {}\n\n const {\n showFormModal,\n showPreviewModal\n } = this.state;\n\n hideBackToTop(showPreviewModal || showFormModal);\n\n return (\n <FormModal\n isPreview\n showModal={showPreviewModal}\n label={previewTitle ? previewTitle : title ? title : \"\"}\n closeOnClick={() => this.setState({ showPreviewModal: false })}\n >\n {showPreviewModal &&\n <CustomIframe\n title={previewTitle ? previewTitle : title ? title : \"\"}\n src={previewUrl ? previewUrl : url ? url : \"\"}\n />\n }\n </FormModal>\n );\n }\n\n renderFormModal = () => {\n const {\n dashboardType = null\n } = this.props || {}\n\n const {\n title,\n content,\n itemId,\n previewUrl,\n showSaveHint,\n disableBtn,\n onClickSave,\n onClickPreview,\n onClickSubmit,\n isNewPromotion,\n } = this.state.formModalData || {}\n\n const {\n showFormModal,\n isDashboardUpdate,\n isMobile,\n showPreviewModal\n } = this.state;\n\n const {\n updateDashboard\n } = this.props\n\n if (!showFormModal && isDashboardUpdate && updateDashboard) {\n this.setState({\n isDashboardUpdate: false\n },\n () => updateDashboard(true))\n }\n\n hideBackToTop((showPreviewModal || showFormModal));\n\n return (\n <FormModal\n showModal={showFormModal}\n label={title}\n closeOnClick={() =>\n this.setState({ showFormModal: false })\n }\n closeClassName={\"promotion-close-btn\"}\n showSaveHint={showSaveHint}\n saveBtn={\"Save draft\"}\n saveBtnOnClick={() => this.updatePromotion(onClickSave)}\n secondaryBtn={`Preview${isNewPromotion && !isMobile ? \"…\" : \"\"}`}\n secondaryBtnOnClick={() => {\n if (previewUrl) {\n this.setState({\n showPreviewModal: true,\n })\n } else {\n onClickPreview();\n }\n }\n }\n disabledSecondaryBtn={disableBtn}\n primaryBtn={\"Submit\"}\n primaryBtnClassName={\"promotion-submit-btn\"}\n primaryBtnOnClick={() => this.updatePromotion(onClickSubmit, true)}\n disabledPrimaryBtn={disableBtn}\n >\n {showFormModal &&\n <FormPromotions\n dashboardType={dashboardType}\n itemId={itemId}\n handleFormData={(showSaveHint, disableBtn, previewUrl, previewTitle, onClickSave, onClickPreview, onClickSubmit) => {\n this.handleFormUpdate(\n showSaveHint,\n disableBtn,\n previewUrl,\n previewTitle,\n onClickSave,\n onClickPreview,\n onClickSubmit,\n );\n }}\n />\n }\n </FormModal>\n );\n }\n\n handleFormUpdate = (showSaveHint, disableBtn, previewUrl, previewTitle, onClickSave, onClickPreview, onClickSubmit) => {\n this.setState({\n formModalData: {\n ...this.state.formModalData,\n showSaveHint,\n disableBtn,\n onClickSave,\n onClickPreview,\n onClickSubmit,\n previewUrl,\n previewTitle\n }\n })\n }\n\n updatePromotion = (onClickUpdate, isSubmit) => {\n if (isSubmit) {\n onClickUpdate().then((result) => {\n if (result && result.isSuccess) {\n let promotionPreviewUrl = \"\",\n promotionPreviewTitle = \"\";\n if (result.promotionPreviewUrl) {\n promotionPreviewUrl = result.promotionPreviewUrl\n }\n if (result.promotionPreviewTitle) {\n promotionPreviewTitle = result.promotionPreviewTitle\n }\n\n let filterAllStatus = document.getElementById(\"allStatus\");\n let filterAllCentreRadio = document.getElementById(\"allCentre\");\n let filterAllCentreDropdown = document.querySelector(\".is-filter-centre .form__select--field\");\n if (filterAllStatus) {\n filterAllStatus.click()\n }\n if (filterAllCentreRadio) {\n filterAllCentreRadio.click()\n } else if (filterAllCentreDropdown) {\n filterAllCentreDropdown.selectedIndex = 0;\n }\n\n this.setState({\n formModalData: {\n ...this.state.formModalData,\n successMessage: \"Promotion successfully updated.\",\n previewUrl: promotionPreviewUrl,\n previewTitle: promotionPreviewTitle,\n },\n showFormModal: false,\n showSuccessMessage: true,\n filterCentre: [],\n promotionPreviewUrlHolder: promotionPreviewUrl,\n promotionPreviewTitleHolder: promotionPreviewTitle,\n isDashboardUpdate: true\n },\n () => {\n scrollToTop()\n addClassLazyload(\"promotions__content\")\n }\n )\n }\n\n });\n } else {\n onClickUpdate().then((result) => {\n if (result && result.isSuccess) {\n let filterAllStatus = document.getElementById(\"allStatus\");\n let filterAllCentreRadio = document.getElementById(\"allCentre\");\n let filterAllCentreDropdown = document.querySelector(\".is-filter-centre .form__select--field\");\n if (filterAllStatus) {\n filterAllStatus.click()\n }\n if (filterAllCentreRadio) {\n filterAllCentreRadio.click()\n } else if (filterAllCentreDropdown) {\n filterAllCentreDropdown.selectedIndex = 0;\n this.setState({\n filterCentre: [],\n })\n }\n this.setState({\n filterCentre: [],\n isDashboardUpdate: true\n },\n () => addClassLazyload(\"promotions__content\")\n )\n }\n });\n }\n }\n\n renderDelete = () => {\n const {\n content,\n deleteModalData,\n disableCancelBtn,\n disableDeleteBtn,\n } = this.state;\n\n return (\n <Popup>\n <PopupAction\n label={{ value: `Delete ${content}?` }}\n description={{ value: `Are you sure you’d like to delete this ${content}?<br/>This cannot be undone.` }}\n icon=\"trash-2\"\n iconBgColor=\"#d83b42\"\n secondaryBtn=\"Cancel\"\n disabledSecondaryBtn={disableCancelBtn}\n secondaryBtnOnClick={() => this.setState({ showDeleteModal: false })}\n primaryBtn={`Delete ${content}`}\n primaryBtnOnClick={() => this.deletePromotion(deleteModalData)}\n primaryBtnColor=\"red\"\n disabledPrimaryBtn={disableDeleteBtn}\n />\n </Popup>\n );\n };\n\n deletePromotion = async deleteModalData => {\n const {\n isDashboard = false,\n updateDashboard\n } = this.props || {}\n\n const {\n id,\n name,\n centreName,\n status\n } = deleteModalData;\n\n const {\n content,\n dataCount\n } = this.state;\n this.setState({\n disableCancelBtn: true,\n disableDeleteBtn: true\n })\n let successMessage = \"\";\n try {\n let response = await deletePromotion({ itemId: id });\n if (response.status === 200 && response.data) {\n if (response.data.IsSuccess.value) {\n successMessage = \"Promotion successfully deleted.\";\n\n if (!isDashboard) {\n let statusVar = \"\";\n if (status.toLowerCase() === \"live\") {\n statusVar = \"LivePromotions\";\n }\n else if (status.toLowerCase() === \"scheduled\") {\n statusVar = \"ScheduledPromotions\";\n }\n else if (status.toLowerCase() === \"awaiting approval\") {\n statusVar = \"AwaitingApprovalPromotions\";\n }\n else if (status.toLowerCase() === \"draft\") {\n statusVar = \"DraftPromotions\";\n }\n else if (status.toLowerCase() === \"rejected\") {\n statusVar = \"RejectedPromotions\";\n }\n else if (status.toLowerCase() === \"embargoed\") {\n statusVar = \"EmbargoedPromotions\";\n }\n\n let newData =\n this.state[content][statusVar].filter(item => {\n return item.ItemId.value !== id;\n });\n\n this.setState(\n {\n [this.state.content]: {\n ...this.state[content],\n [statusVar]: newData\n },\n showDeleteModal: false,\n showSuccessMessage: true,\n disableCancelBtn: false,\n disableDeleteBtn: false,\n formModalData: {\n ...this.state.formModalData,\n successMessage\n },\n dataCount: dataCount - 1\n },\n () => {\n scrollToTop()\n addClassLazyload(\"promotions__content\");\n }\n );\n } else {\n this.setState(\n {\n showDeleteModal: false,\n showSuccessMessage: true,\n disableCancelBtn: false,\n disableDeleteBtn: false,\n formModalData: {\n ...this.state.formModalData,\n successMessage\n }\n },\n () => {\n scrollToTop();\n if (updateDashboard) {\n updateDashboard(true)\n }\n addClassLazyload(\"promotions__content\");\n }\n );\n }\n } else {\n successMessage = \"Promotion delete failed.\"\n\n this.setState({\n showDeleteModal: false,\n showSuccessMessage: true,\n disableCancelBtn: false,\n disableDeleteBtn: false,\n formModalData: {\n ...this.state.formModalData,\n successMessage\n }\n },\n () => scrollToTop()\n );\n }\n }\n else {\n successMessage = \"Promotion delete failed.\"\n\n this.setState({\n showDeleteModal: false,\n showSuccessMessage: true,\n formModalData: {\n ...this.state.formModalData,\n successMessage\n }\n },\n () => scrollToTop()\n );\n }\n removeActiveState();\n\n }\n catch (e) {\n console.error(\"Promotion Delete Error: \" + e.response.statusText);\n successMessage = \"Promotion delete error.\";\n this.setState({\n showDeleteModal: false,\n showSuccessMessage: true,\n disableCancelBtn: false,\n disableDeleteBtn: false,\n formModalData: {\n ...this.state.formModalData,\n successMessage\n }\n },\n () => scrollToTop()\n )\n removeActiveState();\n\n // let statusVar = \"\";\n // if (status.toLowerCase() === \"live\") {\n // statusVar = \"LivePromotions\";\n // }\n // else if (status.toLowerCase() === \"scheduled\") {\n // statusVar = \"ScheduledPromotions\";\n // }\n // else if (status.toLowerCase() === \"awaiting approval\") {\n // statusVar = \"AwaitingApprovalPromotions\";\n // }\n // else if (status.toLowerCase() === \"draft\") {\n // statusVar = \"DraftPromotions\";\n // }\n // else if (status.toLowerCase() === \"rejected\") {\n // statusVar = \"RejectedPromotions\";\n // }\n\n // let newData =\n // this.state[content][statusVar].filter(item => {\n // return item.ItemId.value !== id;\n // });\n\n // this.setState(\n // {\n // [this.state.content]: {\n // ...this.state[content],\n // [statusVar]: newData\n // },\n // showDeleteModal: false,\n // showSuccessMessage: true,\n // disableCancelBtn: false,\n // disableDeleteBtn: false,\n // formModalData: {\n // ...this.state.formModalData,\n // successMessage\n // },\n // dataCount: dataCount - 1\n // },\n // () => scrollToTop()\n // );\n // removeActiveState();\n }\n };\n\n handleOnClickFilter = (type, value) => {\n if (type === \"status\") {\n this.setState({\n filterStatus: value\n })\n } else if (type === \"centre\") {\n this.setState({\n filterCentre: value === \"allCentre\" ? [] : value,\n filterByCentre: value\n })\n }\n addClassLazyload(\"promotions__content\");\n scrollToTop();\n }\n\n setCentreListDropdown = (CentreList) => {\n let tempCentreList = [];\n let allOption = {\n Id: { value: \"allCentre\" },\n Name: { value: \"All centres\" }\n }\n tempCentreList.push(allOption)\n\n CentreList.map((item) => {\n const {\n Name\n } = item.fields;\n\n if (Name && Name.value) {\n let centreOption = {\n Id: { value: Name.value },\n Name: { value: Name.value }\n }\n tempCentreList.push(centreOption)\n }\n })\n return tempCentreList;\n }\n\n renderCustomFilter = (CentreList) => {\n const {\n showFilter,\n statusOption,\n centreListOption,\n filterByCentre,\n isMobile\n } = this.state;\n\n return (\n <CustomFilter\n showFilter={showFilter}\n onCloseFilter={() => this.setState({ showFilter: false })}\n >\n <div className=\"custom-filter__group is-filter-status\">\n <div className=\"custom-filter__label\">\n {\"Filter by status\"}\n </div>\n <RadioButton\n defaultSelected=\"allStatus\"\n options={statusOption}\n radioGroupName=\"promotionListing\"\n onChange={(id) => this.handleOnClickFilter(\"status\", id)}\n plain\n />\n </div>\n <div className=\"custom-filter__group is-filter-centre\">\n <div className=\"custom-filter__label\">\n {\"Filter by centre\"}\n </div>\n {CentreList &&\n CentreList.length > 0 && (\n (CentreList.length > 5 || isMobile) ?\n <Select\n onChange={(option) => this.handleOnClickFilter(\"centre\", option.value)}\n defaultValue={{ value: \"allCentre\", label: \"All centres\" }}\n options={centreListOption}\n theme={(theme) => ({\n ...theme,\n colors: {\n ...theme.colors,\n primary: \"#536760\",\n primary25: \"#f5f5f6\",\n },\n })}\n isSearchable={false}\n maxMenuHeight={200}\n menuPlacement=\"auto\"\n />\n :\n <RadioButton\n defaultSelected=\"allCentre\"\n options={this.setCentreListDropdown(CentreList)}\n radioGroupName=\"promotionListingCentreList\"\n onChange={(id) => this.handleOnClickFilter(\"centre\", id)}\n plain\n />\n )\n }\n </div>\n </CustomFilter>\n )\n }\n\n renderContent = (HideCreateButton) => {\n const {\n isDashboard = false,\n promotionList = [],\n noStore = false\n } = this.props || {}\n\n const {\n content,\n event,\n offer,\n filterStatus,\n filterCentre,\n dataCount\n } = this.state;\n\n let contentLayout = \"\";\n let noSelectedStore = false;\n if (noStore.toString() === \"true\" || (HideCreateButton && HideCreateButton.value.toString() === \"true\")) {\n noSelectedStore = true;\n }\n if (content && content === \"event\") {\n contentLayout =\n <Events\n data={(promotionList && promotionList.length > 0) ? { dashboardPromotions: promotionList } : event}\n filterStatus={filterStatus}\n filterCentre={filterCentre}\n showPreviewModal={previewModalData =>\n this.setState({\n showPreviewModal: true,\n previewModalData,\n formModalData: {\n ...this.state.formModalData,\n previewUrl: \"\",\n previewTitle: \"\",\n },\n })\n }\n showFormModal={formModalData =>\n this.setState({ showFormModal: true, formModalData })\n }\n showDeleteModal={deleteModalData =>\n this.setState({\n showDeleteModal: true,\n deleteModalData,\n formModalData: {\n ...this.state.formModalData,\n previewUrl: \"\",\n previewTitle: \"\",\n },\n })\n }\n showFilter={() => {\n this.setState({ showFilter: true })\n }}\n dataUpdate={event => this.setState({ event })}\n noSelectedStore={noSelectedStore}\n isDashboard={isDashboard}\n dataTotalCount={dataCount => this.setState({ dataCount })}\n hideFilter={dataCount == 0}\n totalListCount={dataCount}\n />\n }\n if (content && content === \"offer\") {\n contentLayout =\n <Offers\n data={(promotionList && promotionList.length > 0) ? { dashboardPromotions: promotionList } : offer}\n filterStatus={filterStatus}\n filterCentre={filterCentre}\n showPreviewModal={previewModalData =>\n this.setState({\n showPreviewModal: true,\n previewModalData,\n formModalData: {\n ...this.state.formModalData,\n previewUrl: \"\",\n previewTitle: \"\",\n },\n })\n }\n showFormModal={formModalData =>\n this.setState({ showFormModal: true, formModalData })\n }\n showDeleteModal={deleteModalData =>\n this.setState({\n showDeleteModal: true,\n deleteModalData,\n formModalData: {\n ...this.state.formModalData,\n previewUrl: \"\",\n previewTitle: \"\",\n },\n })\n }\n showFilter={() => {\n this.setState({ showFilter: true })\n }}\n dataUpdate={offer => this.setState({ offer })}\n noSelectedStore={noSelectedStore}\n isDashboard={isDashboard}\n dataTotalCount={dataCount => this.setState({ dataCount })}\n hideFilter={dataCount == 0}\n totalListCount={dataCount}\n />\n }\n\n return (contentLayout);\n };\n\n render() {\n const {\n content,\n showDeleteModal,\n showSuccessMessage,\n formModalData,\n isDocumentReady,\n promotionPreviewUrlHolder,\n promotionPreviewTitleHolder\n } = this.state;\n const {\n CentreList,\n HideCreateButton,\n } = this.props.fields || {};\n\n const {\n noStore = false\n } = this.props || {}\n return (\n <div className={`promotions-listing__container ${showSuccessMessage ? \"has-success-message\" : \"\"}`}>\n {showDeleteModal && this.renderDelete()}\n {isDocumentReady &&\n this.renderPreviewModal()\n }\n {isDocumentReady &&\n this.renderFormModal()\n }\n\n {isDocumentReady &&\n CentreList &&\n CentreList.length > 0 &&\n this.renderCustomFilter(CentreList)\n }\n\n {showSuccessMessage &&\n <SuccessMessage\n showPreviewLink={formModalData && formModalData.previewUrl}\n label={formModalData.successMessage}\n handleOnClick={() => {\n if (formModalData.previewUrl) {\n this.setState({\n showPreviewModal: true,\n formModalData: {\n ...this.state.formModalData,\n previewUrl: promotionPreviewUrlHolder,\n previewTitle: promotionPreviewTitleHolder,\n },\n })\n }\n }}\n handleShowSuccess={(showSuccessMessage) => {\n this.setState({\n showSuccessMessage\n })\n }}\n />\n }\n\n <div className={`promotions__content ${(noStore.toString() === \"true\" || (HideCreateButton && HideCreateButton.value.toString() === \"true\")) ? \"hide-create-btn\" : \"\"}`}>\n {content && this.renderContent(HideCreateButton)}\n </div>\n </div>\n );\n }\n}\nexport default FeatureRetailerPortalPromotionListing;","import BaseURL, { DevURL } from \"./BaseURL\";\n\nconst isDev = process.env.REACT_APP_DEV || false;\n\nexport const getNotifications = () => {\n const endpoint = isDev ? \"/GetNotifications\" : \"/notification/GetNotifications\";\n return BaseURL.get(endpoint);\n};\n\nexport const getNotificationContent = (params) => {\n const endpoint = isDev ? \"/GetNotificationContent\" : \"/notification/GetNotificationsContent\";\n return BaseURL.get(endpoint, { params: { ...params } });\n};\n\nexport const updateMemoStatus = (params) => {\n return BaseURL.get(\"/notification/MemoViewed\", { params: { ...params } });\n};\n\nexport const acknowledgeMemo = (params) => {\n return BaseURL.get(\"/notification/Acknowledged\", { params: { ...params } });\n};\n","import React from \"react\";\nimport { acknowledgeMemo } from \"../../../api/NotificationAPI\";\nimport { Text } from \"@sitecore-jss/sitecore-jss-react\";\nimport pdf from \"../../../assets/icons/svg/pdf.svg\";\nimport file from \"../../../assets/icons/svg/file.svg\";\nimport ListItem from \"../../Base/ListItem\";\nimport SuccessMessage from \"../../Base/SuccessMessage\";\nimport FormCheckbox from \"../../Base/FormCheckbox\";\nimport Button from \"../../Base/Button\";\nimport TagManager from \"react-gtm-module\";\nimport logoPlaceholder from \"../../../assets/img/logoPlaceholder.png\";\n\nclass MemoItem extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n acknowledged: null,\n checked: null,\n disableBtn: true,\n disabledCb: false,\n message: null,\n showModal: false,\n modalMessage: null,\n };\n }\n componentDidMount() {\n const { Acknowledged = null } = this.props.data || {};\n this.setState({\n acknowledged: Acknowledged && Acknowledged.value,\n checked: Acknowledged && Acknowledged.value,\n message:\n Acknowledged && Acknowledged.value ? \"This has been acknowledged.\" : \"\",\n });\n }\n\n renderAttachments = (attachments) => {\n if (attachments && attachments.length) {\n return (\n <div className=\"attachments-container\">\n {attachments.map((item, index) => {\n const { Name, Url, Size } = item;\n const type = this.getFileType(Url);\n return (\n <ListItem\n key={`attachmentMemo-${index}`}\n logoSrc={(type && pdf) || file}\n label={{ value: type }}\n title={Name}\n description={Size}\n btnTwo={{\n icon: \"download\",\n color: \"secondary\",\n tooltip: \"Download\",\n }}\n listItemOnClick={() =>\n window && Url && Url.value && window.open(Url.value)\n }\n noActionBtn={true}\n />\n );\n })}\n </div>\n );\n } else return null;\n };\n\n onChange = (val) => {\n this.setState({ checked: val, disableBtn: !val });\n };\n\n acknowledgeMemo = async (itemId) => {\n this.setState({\n disableBtn: true,\n disabledCb: true,\n });\n try {\n const response = await acknowledgeMemo({ itemId });\n if (response && response.data) {\n const { IsSuccess, message } = response.data;\n if (IsSuccess && IsSuccess.value) {\n this.setState({\n modalMessage: message && message.value,\n message: \"This has been acknowledged.\",\n acknowledged: true,\n showModal: true,\n });\n TagManager.dataLayer({\n dataLayer: {\n event: \"correspondenceAcknowledged\",\n },\n dataLayerName: \"dataLayer\",\n });\n } else {\n this.setState({\n modalMessage: message && message.value,\n disableBtn: false,\n disabledCb: false,\n hideIcon: true,\n showModal: true,\n });\n }\n } else {\n this.setState({\n modalMessage: \"Something went wrong. Please try again.\",\n disableBtn: false,\n disabledCb: false,\n hideIcon: true,\n showModal: true,\n });\n }\n } catch (e) {\n this.setState({\n modalMessage: \"Something went wrong. Please try again.\",\n disableBtn: false,\n disabledCb: false,\n hideIcon: true,\n showModal: true,\n });\n }\n };\n\n renderAcknowledgement = (id, type) => {\n const { hideAcknowledgement } = this.props;\n const {\n acknowledged,\n checked,\n disableBtn,\n disabledCb,\n message,\n } = this.state;\n if (\n !hideAcknowledgement &&\n type &&\n type &&\n type.value &&\n type.value.toLowerCase().indexOf(\"compliance\") > -1\n ) {\n if (message) {\n return (\n <div className=\"memo-footer\">\n <div className=\"memo-message\">{message}</div>\n </div>\n );\n } else {\n return (\n <div className=\"memo-footer\">\n {!acknowledged && (\n <div className=\"memo-acknowledgment\">\n <FormCheckbox\n plain\n label=\"Acknowledge\"\n checked={checked}\n onCheckboxChange={(val, checked) => this.onChange(checked)}\n disabled={disabledCb}\n />\n <Button\n color=\"primary\"\n onClick={() => this.acknowledgeMemo(id && id.value)}\n disabled={disableBtn}\n >\n Submit\n </Button>\n </div>\n )}\n </div>\n );\n }\n }\n };\n\n renderMiniModal = () => {\n const { modalMessage, hideIcon } = this.state;\n\n return (\n <SuccessMessage\n label={modalMessage}\n hideIcon={hideIcon}\n handleShowSuccess={(showModal) => {\n this.setState({ showModal });\n }}\n />\n );\n };\n\n getFileType = (url) => {\n const file = url && url.value;\n let type = null;\n\n if (file) {\n const isIB = file.includes(\"intelligencebank.com\");\n\n if (!isIB) {\n type = file.slice(file.lastIndexOf(\".\") + 1).toUpperCase();\n }\n }\n\n return type;\n };\n\n render() {\n const { ItemId, Title, MemoImage, Content, Attachments, MemoType } =\n this.props.data || {};\n const { showModal } = this.state;\n return (\n <div className=\"memoitem-container\">\n {showModal && this.renderMiniModal()}\n <div className=\"memo-title\">\n <Text field={Title} />\n </div>\n {MemoImage && MemoImage.value && MemoImage.value.src && (\n <div className=\"memo-img\">\n <img\n alt={`${\n MemoImage.value.alt ? MemoImage.value.alt : \"Memo-image-alt\"\n }`}\n src={logoPlaceholder}\n data-src={MemoImage.value.src}\n className=\"lazyload\"\n />\n </div>\n )}\n {Content && Content.value && (\n <div className=\"memo-content\">\n <Text field={Content} />\n </div>\n )}\n {this.renderAttachments(Attachments)}\n {this.renderAcknowledgement(ItemId, MemoType)}\n </div>\n );\n }\n}\n\nexport default MemoItem;\n","import React from \"react\";\nimport {\n getNotifications,\n updateMemoStatus,\n getNotificationContent,\n} from \"../../../../api/NotificationAPI\";\nimport TagManager from \"react-gtm-module\";\nimport MemoItem from \"../../../Modules/MemoItem\";\nimport PageHeader from \"../../../Base/PageHeader\";\nimport ListItem from \"../../../Base/ListItem\";\nimport FormModal from \"../../../Base/FormModal\";\nimport NoResultMessage from \"../../../Base/NoResultMessage\";\nimport {\n disableBodyScroll,\n enableBodyScroll,\n} from \"../../../../helper/ScrollHelper\";\nimport { hideBackToTop } from \"../../../../helper/HideBackToTopHelper\";\n\nclass FeatureRetailerPortalNotifications extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n showLoader: true,\n showContentLoader: true,\n notifications: null,\n showViewModal: false,\n modalData: null,\n acknowledge: false,\n hideAcknowledgeButton: false,\n memoContent: null,\n isFirefox: false,\n };\n }\n\n componentDidMount() {\n const { isDashboard, notificationsList, hideAcknowledgeButton } =\n this.props || {};\n if (\n navigator &&\n navigator.userAgent &&\n navigator.userAgent.toUpperCase().indexOf(\"FIREFOX\") !== -1\n ) {\n this.setState({ isFirefox: true });\n }\n if (document) {\n this.setState({ isDocumentReady: true });\n if (!isDashboard) {\n this.getData();\n } else {\n this.setState({\n notifications: notificationsList,\n hideAcknowledgeButton,\n showLoader: false,\n });\n }\n }\n }\n\n getData = async () => {\n try {\n const response = await getNotifications();\n if (response && response.data) {\n const { Notifications, HideAcknowledgeButton } = response.data;\n this.setState({\n notifications: Notifications,\n hideAcknowledgeButton:\n HideAcknowledgeButton && HideAcknowledgeButton.value,\n showLoader: false,\n });\n }\n } catch (e) {\n if (e && e.response && e.response.statusText) {\n console.error(\"Get Notifications Data Error: \" + e.response.statusText);\n } else console.log(e);\n }\n };\n\n getContent = async (itemId) => {\n try {\n const response = await getNotificationContent({ itemId });\n if (response && response.data) {\n const {\n ItemId,\n Title,\n Date,\n Image: MemoImage,\n Content,\n Attachments,\n MemoType,\n MemoViewed,\n Acknowledged,\n } = response.data;\n this.setState({\n memoContent: {\n ItemId,\n Title,\n Date,\n MemoImage,\n Content,\n Attachments,\n MemoType,\n MemoViewed,\n Acknowledged,\n },\n showContentLoader: false,\n itemId: ItemId,\n });\n }\n return null;\n } catch (e) {\n console.error(\"Get Notifications Data Error: \" + e.response.statusText);\n return null;\n }\n };\n\n setMemoStatus = (itemId) => {\n const { notifications } = this.state;\n let items = [...notifications];\n if (items) {\n let i = items.findIndex((el) => el.ItemId.value === itemId);\n if (items[i] && items[i].MemoViewed && !items[i].MemoViewed.value) {\n items[i].MemoViewed.value = true;\n }\n\n if (items.find((el) => el && el.MemoViewed && !el.MemoViewed.value)) {\n } else {\n if (this.state.isDocumentReady) {\n document.getElementById(\"notif-count\") &&\n document.getElementById(\"notif-count\").remove();\n }\n }\n }\n };\n\n handleView = async (itemId, isViewed, dateAndCentre, title) => {\n if (!isViewed) {\n const response = await updateMemoStatus({ itemId });\n if (\n response &&\n response.data &&\n response.data.IsSuccess &&\n response.data.IsSuccess.value\n ) {\n TagManager.dataLayer({\n dataLayer: {\n event: \"correspondenceViewed\",\n correspondenceDateAndCentre: dateAndCentre,\n correspondenceTitle: title,\n },\n dataLayerName: \"dataLayer\",\n });\n }\n }\n };\n\n renderViewModal = () => {\n const {\n showViewModal,\n showContentLoader,\n memoContent,\n hideAcknowledgeButton,\n } = this.state || {};\n\n if (showViewModal) {\n disableBodyScroll();\n }\n\n hideBackToTop(showViewModal);\n\n return (\n <FormModal\n showModal={showViewModal}\n label={\n <span>\n {\"Correspondence\"}\n \n {\"»\"} {\"Message\"}\n </span>\n }\n closeOnClick={() =>\n this.setState(\n {\n showViewModal: false,\n memoContent: null,\n },\n () => enableBodyScroll()\n )\n }\n >\n {showContentLoader && (\n <div className=\"loader-wrapper container\">\n <div className=\"loader\" />\n </div>\n )}\n {showViewModal && !showContentLoader && memoContent && (\n <MemoItem\n data={memoContent}\n hideAcknowledgement={hideAcknowledgeButton}\n />\n )}\n </FormModal>\n );\n };\n\n renderList = () => {\n const { notifications } = this.state;\n if (notifications && notifications.length) {\n const itemCount = notifications.length;\n return (\n <div>\n <div className=\"notifications-item-container\">\n {notifications.map((item, index) => {\n const { ItemId, Title, Header, Content, MemoViewed } = item;\n return (\n <ListItem\n key={`notifId-${index}`}\n label={Header}\n showNotif={true}\n notification={MemoViewed && !MemoViewed.value}\n title={Title}\n description={Content}\n listItemOnClick={() => {\n this.setState({\n showViewModal: true,\n });\n this.getContent(ItemId && ItemId.value);\n this.handleView(\n ItemId && ItemId.value,\n MemoViewed && MemoViewed.value,\n Header && Header.value,\n Title && Title.value\n );\n this.setMemoStatus(ItemId && ItemId.value);\n }}\n noActionBtn={true}\n />\n );\n })}\n </div>\n <div className=\"list-count\">\n Showing {itemCount} of {itemCount}\n </div>\n </div>\n );\n } else {\n return <NoResultMessage label=\"No correspondence\" />;\n }\n };\n\n render() {\n const { showLoader, isDocumentReady } = this.state;\n return (\n <div className=\"notifications-container\">\n {isDocumentReady && this.renderViewModal()}\n <PageHeader title={{ value: \"Correspondence\" }} />\n {showLoader && (\n <div className=\"loader-wrapper container\">\n <div className=\"loader\" />\n </div>\n )}\n {!showLoader && this.renderList()}\n </div>\n );\n }\n}\n\nexport default FeatureRetailerPortalNotifications;\n","import React from \"react\";\nimport { Text, Link } from \"@sitecore-jss/sitecore-jss-react\";\nimport { get } from \"lodash\";\nimport { XMasonry, XBlock } from \"react-xmasonry\";\nimport DefaultUserLogo from \"../../../../assets/icons/png/author.png\";\nimport logoPlaceholder from \"../../../../assets/img/logoPlaceholder.png\";\nimport {\n getDashboardCorrespondences,\n getDashboardStoreInfos,\n getDashboardEvents,\n getDashboardOffers,\n getDashboardArticles\n} from \"../../../../api/DashboardAPI\";\nimport Stores from \"../Stores\";\nimport PromotionListing from \"../PromotionListing\";\nimport ArticleListing from \"../ArticleListing\";\nimport Notifications from \"../Notifications\";\nimport PageHeader from \"../../../Base/PageHeader\";\nimport { addClassLazyload } from \"../../../../helper/AddClassLazyloadHelper\";\n\n// import getStoreInfoData from \"./json/getStoreInfo.json\";\n// import getEventsData from \"./json/getEvents.json\";\n// import getOffersData from \"./json/getOffers.json\";\n// import getArticlesData from \"./json/getArticles.json\";\n// import getCorresnpondences from \"./json/getCorresnpondences.json\";\n\nclass FeatureRetailerPortalDashboard extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n correspondenceList: [],\n storeInfoList: [],\n eventsList: [],\n offersList: [],\n articlesList: [],\n isDashboardReady: false,\n columnWidth: 0,\n showStoreInfoLoader: true,\n showEventsLoader: true,\n showOffersLoader: true,\n showArticlesLoader: true,\n hideAcknowledgeButton: false\n };\n }\n\n componentDidMount() {\n if (window) {\n window.addEventListener(\"resize\", this.handleResize);\n }\n if (document) {\n let containerWrapper = document.querySelector(\".body-wrapper .container\");\n if (containerWrapper) {\n this.setState({\n columnWidth: containerWrapper.clientWidth / 2,\n isDashboardReady: true\n })\n }\n this.getCorrespondenceData();\n this.getStoreInfoData();\n this.getEventsData();\n this.getOffersData();\n this.getArticlesData();\n }\n }\n\n handleResize = () => {\n let containerWrapper = document.querySelector(\".body-wrapper .container\");\n if (containerWrapper) {\n this.setState({\n columnWidth: containerWrapper.clientWidth / 2\n })\n }\n }\n\n getCorrespondenceData = async () => {\n try {\n const response = await getDashboardCorrespondences();\n if (response.status === 200 && response.data) {\n const correspondenceList = get(response.data, \"CorrespondenceList\", []);\n const hideAcknowledgeButton = get(response.data, \"HideAcknowledgeButton.value\", false);\n this.setState({\n correspondenceList,\n hideAcknowledgeButton,\n })\n }\n }\n catch (e) {\n console.error(\"Get Dashboard Correspondence Data Error: \" + e.response.statusText);\n // let response = {\n // data: getCorresnpondences\n // }\n // const correspondenceList = get(response.data, \"CorrespondenceList\", []);\n // const hideAcknowledgeButton = get(response.data, \"HideAcknowledgeButton.value\", false);\n // this.setState({\n // correspondenceList,\n // hideAcknowledgeButton,\n // })\n }\n };\n\n getStoreInfoData = async (isUpdate) => {\n if (!isUpdate) {\n this.setState({\n showStoreInfoLoader: true\n })\n }\n\n try {\n const response = await getDashboardStoreInfos();\n if (response.status === 200 && response.data) {\n const storeInfoList = get(response.data, \"StoreInfoList\", []);\n this.setState({\n storeInfoList,\n showStoreInfoLoader: false,\n },\n () => {\n addClassLazyload(\"dashboard-content\");\n }\n )\n }\n }\n catch (e) {\n console.error(\"Get Dashboard Store Info Data Error: \" + e.response.statusText);\n // let response = {\n // data: getStoreInfoData\n // }\n // const storeInfoList = get(response.data, \"StoreInfoList\", []);\n // this.setState({\n // storeInfoList,\n // showStoreInfoLoader: false,\n // })\n }\n }\n\n getEventsData = async (isUpdate) => {\n if (!isUpdate) {\n this.setState({\n showEventsLoader: true\n })\n }\n\n try {\n const response = await getDashboardEvents();\n if (response.status === 200 && response.data) {\n const eventsList = get(response.data, \"EventsList\", []);\n this.setState({\n eventsList,\n showEventsLoader: false,\n },\n () => {\n addClassLazyload(\"dashboard-content\");\n }\n )\n }\n }\n catch (e) {\n console.error(\"Get Dashboard Events Data Error: \" + e.response.statusText);\n // let response = {\n // data: getEventsData\n // }\n // const eventsList = get(response.data, \"EventsList\", []);\n // this.setState({\n // eventsList,\n // showEventsLoader: false,\n // })\n }\n }\n\n getOffersData = async (isUpdate) => {\n if (!isUpdate) {\n this.setState({\n showOffersLoader: true\n })\n }\n\n try {\n const response = await getDashboardOffers();\n if (response.status === 200 && response.data) {\n const offersList = get(response.data, \"OffersList\", []);\n this.setState({\n offersList,\n showOffersLoader: false,\n },\n () => {\n addClassLazyload(\"dashboard-content\");\n }\n )\n }\n }\n catch (e) {\n console.error(\"Get Dashboard Offers Data Error: \" + e.response.statusText);\n // let response = {\n // data: getOffersData\n // }\n // const offersList = get(response.data, \"OffersList\", []);\n // this.setState({\n // offersList,\n // showOffersLoader: false,\n // })\n }\n }\n\n getArticlesData = async (isUpdate) => {\n if (!isUpdate) {\n this.setState({\n showArticlesLoader: true\n })\n }\n\n try {\n const response = await getDashboardArticles();\n if (response.status === 200 && response.data) {\n const articlesList = get(response.data, \"ArticlesList\", []);\n this.setState({\n articlesList,\n showArticlesLoader: false,\n },\n () => {\n addClassLazyload(\"dashboard-content\");\n }\n )\n }\n }\n catch (e) {\n console.error(\"Get Dashboard Articles Data Error: \" + e.response.statusText);\n // let response = {\n // data: getArticlesData\n // }\n // const articlesList = get(response.data, \"ArticlesList\", []);\n // this.setState({\n // articlesList,\n // showArticlesLoader: false,\n // })\n }\n }\n\n dashboardPanelLayout = (component, headerName, showLink, link, showLoader, noResultText) => {\n let panelLayout = \"\";\n\n if (!showLoader) {\n panelLayout =\n <div className=\"dashboard-content__wrapper\">\n <div className=\"dashboard-content__wrapper--fade\">\n {component}\n {showLink ?\n <div className=\"dashboard-content__link\">\n <Link\n field={{\n ...link.value,\n href: `${link.value.href}${\n link.value.querystring\n ? \"?\" + link.value.querystring\n : \"\"\n }`,\n text: link.value.text ? link.value.text : \"View all\"\n }}\n />\n </div> :\n <div className=\"dashboard-content__no-result\">\n <div className=\"dashboard-content__no-result--text\">\n {noResultText ? noResultText : \"No Result\"}\n </div>\n </div>\n }\n </div>\n </div>\n } else {\n panelLayout =\n <div className=\"dashboard-content__wrapper\">\n <PageHeader\n title={{ value: headerName }}\n />\n <div className=\"loader-wrapper\">\n <div className=\"loader\">\n </div>\n </div>\n </div>\n }\n\n return panelLayout;\n }\n\n renderCorrespondence = (list, link) => {\n const {\n hideAcknowledgeButton\n } = this.state\n let correspondenceLayout = \"\";\n let showLink = true;\n let component =\n <Notifications\n isDashboard={true}\n notificationsList={list}\n hideAcknowledgeButton={hideAcknowledgeButton}\n />\n\n\n correspondenceLayout =\n this.dashboardPanelLayout(\n component,\n \"Correspondence\",\n showLink,\n link,\n )\n\n return correspondenceLayout;\n }\n\n renderStoreInfo = (list, link, showLoader) => {\n let storeInfoLayout = \"\";\n let showLink = false;\n let component =\n <Stores\n isDashboard={true}\n storeList={list}\n updateDashboard={(isUpdate) => {\n if (isUpdate) {\n this.getStoreInfoData(isUpdate)\n }\n }}\n />\n\n if (list && list.length > 0) {\n showLink = true;\n }\n\n storeInfoLayout =\n this.dashboardPanelLayout(\n component,\n \"Store information\",\n showLink,\n link,\n showLoader\n )\n\n return storeInfoLayout;\n }\n\n renderEvents = (list, link, hideCreateButton, showLoader) => {\n let eventsLayout = \"\";\n let showLink = false;\n let component =\n <PromotionListing\n dashboardType=\"event\"\n isDashboard={true}\n promotionList={list}\n noStore={hideCreateButton && hideCreateButton.value ? hideCreateButton.value : false}\n updateDashboard={(isUpdate) => {\n if (isUpdate) {\n this.getEventsData(isUpdate)\n }\n }}\n />\n\n if (list && list.length > 0) {\n showLink = true;\n }\n\n eventsLayout =\n this.dashboardPanelLayout(\n component,\n \"Events\",\n showLink,\n link,\n showLoader,\n \"Create your first event and promote your store!\"\n )\n\n return eventsLayout;\n }\n\n renderOffers = (list, link, hideCreateButton, showLoader) => {\n let offersLayout = \"\";\n let showLink = false;\n let component =\n <PromotionListing\n dashboardType=\"offer\"\n isDashboard={true}\n promotionList={list}\n noStore={hideCreateButton && hideCreateButton.value ? hideCreateButton.value : false}\n updateDashboard={(isUpdate) => {\n if (isUpdate) {\n this.getOffersData(isUpdate)\n }\n }}\n />\n\n if (list && list.length > 0) {\n showLink = true;\n }\n\n offersLayout =\n this.dashboardPanelLayout(\n component,\n \"Offers\",\n showLink,\n link,\n showLoader,\n \"Create your first offer and promote your store!\"\n )\n\n return offersLayout;\n }\n\n renderArticles = (list, link, hideCreateButton, showLoader) => {\n let articlesLayout = \"\";\n let showLink = false;\n let component =\n <ArticleListing\n isDashboard={true}\n articleList={list}\n noStore={hideCreateButton && hideCreateButton.value ? hideCreateButton.value : false}\n updateDashboard={(isUpdate) => {\n if (isUpdate) {\n this.getArticlesData(isUpdate)\n }\n }}\n />\n\n if (list && list.length > 0) {\n showLink = true;\n }\n\n articlesLayout =\n this.dashboardPanelLayout(\n component,\n \"Articles\",\n showLink,\n link,\n showLoader,\n \"Create your first article and promote your store!\"\n )\n\n return articlesLayout;\n }\n\n renderContent = () => {\n const {\n CorrespondenceListingLink,\n StoresListingLink,\n EventsListingLink,\n OffersListingLink,\n ArticlesListingLink,\n HideCreateButton\n } = this.props.fields;\n\n const {\n correspondenceList,\n storeInfoList,\n eventsList,\n offersList,\n articlesList,\n showStoreInfoLoader,\n showEventsLoader,\n showOffersLoader,\n showArticlesLoader,\n columnWidth,\n } = this.state\n\n return (\n <div className=\"dashboard-content\">\n <XMasonry targetBlockWidth={columnWidth}>\n {correspondenceList &&\n correspondenceList.length > 0 &&\n < XBlock key=\"correspondenceList\">\n {this.renderCorrespondence(correspondenceList, CorrespondenceListingLink)}\n </XBlock>\n }\n <XBlock key=\"storeInfoList\">\n {this.renderStoreInfo(storeInfoList, StoresListingLink, showStoreInfoLoader)}\n </XBlock>\n <XBlock key=\"eventsList\">\n {this.renderEvents(eventsList, EventsListingLink, HideCreateButton, showEventsLoader)}\n </XBlock>\n <XBlock key=\"offersList\">\n {this.renderOffers(offersList, OffersListingLink, HideCreateButton, showOffersLoader)}\n </XBlock>\n <XBlock key=\"articlesList\">\n {this.renderArticles(articlesList, ArticlesListingLink, HideCreateButton, showArticlesLoader)}\n </XBlock>\n </XMasonry>\n </div>\n )\n }\n\n render() {\n const {\n UserName,\n UserPhoto,\n UserRole,\n } = this.props.fields;\n\n const {\n isDashboardReady,\n } = this.state\n\n return (\n <div className=\"dashboard\">\n <div className=\"dashboard-header\">\n <div className=\"is-desktop\">\n <div className=\"dashboard-header__image\">\n {(UserPhoto && UserPhoto.value) ?\n <img\n alt=\"dashboard-image-logo\"\n src={logoPlaceholder}\n data-src={UserPhoto.value}\n className=\"lazyload\"\n /> :\n <img src={DefaultUserLogo} alt=\"dashboard-image-default\" />\n }\n </div>\n <div className=\"dashboard-header__text\">\n <div className=\"dashboard-header__name\">\n <span>{\"Welcome, \"}</span>\n {UserName &&\n UserName.value &&\n <span>\n <Text field={UserName} />{\"!\"}\n </span>\n }\n </div>\n {UserRole &&\n UserRole.value &&\n <div className=\"dashboard-header__description\">\n <Text field={UserRole} />\n </div>\n }\n </div>\n </div>\n <div className=\"is-tablet\">\n <PageHeader title={{ value: `Welcome, ${UserName && UserName.value ? UserName.value : \"\"}` }} />\n </div>\n </div>\n {isDashboardReady &&\n this.renderContent()\n }\n </div>\n )\n }\n}\n\nexport default FeatureRetailerPortalDashboard;\n","import BaseURL from \"./BaseURL\";\n\nexport const login = (data) => {\n return BaseURL.post(\"/account/login\", { ...data });\n // return DevURL.get(\"/GetEvents\", { ...data });\n};\n\nexport const logout = () => {\n return BaseURL.post(\"/account/logout\");\n};\n","import React from \"react\";\nimport { Text, Link } from \"@sitecore-jss/sitecore-jss-react\";\nimport { logout } from \"../../../../api/LoginAPI\";\n\nconst FeatureRetailerPortalFooter = props => {\n const { FooterTitle, FooterLinks } = props.fields;\n const logoutUser = async () => {\n const response = await logout();\n if (response) {\n if (\n response.status === 200 &&\n response.data &&\n response.data.StatusCode === 200\n ) {\n window.history.pushState(null, \"Town Square\", window.location.pathname);\n window.location.pathname = \"home/login\";\n }\n }\n };\n return (\n <div className=\"footer-nav-wrapper\">\n <div onClick={() => logoutUser()} className=\"nav-button-logout\">\n <i className=\"icon icon-logout\" />\n <span>Logout</span>\n </div>\n\n <div className=\"nav-footer-container\">\n <div className=\"nav-footer-title\">\n <i className=\"icon icon-qicgre\" />\n <span>\n <Text field={FooterTitle} />\n </span>\n </div>\n <div className=\"nav-footer-links-wrapper\">\n {FooterLinks &&\n FooterLinks.length &&\n FooterLinks.map((link, index) => {\n let { LinkTarget: LinkTarget = null } = link.fields;\n return (\n <span key={`link-${index}`}>\n <u>\n <Link field={LinkTarget} />\n </u>\n {/* <i className=\"icon icon-external\" /> */}\n </span>\n );\n })}\n </div>\n </div>\n </div>\n );\n};\n\nexport default FeatureRetailerPortalFooter;\n","import React from \"react\";\n// import TagManager from \"react-gtm-module\";\nimport { Text } from \"@sitecore-jss/sitecore-jss-react\";\nimport { getStoreInfo } from \"../../../../api/StoreAPI\";\n\nclass FeatureRetailerPortalHub extends React.Component {\n constructor(props) {\n super(props);\n }\n\n getData = async () => {\n let params = {\n pageNumber: 1,\n centre: \"\",\n };\n let centreList = [];\n const response = await getStoreInfo(params);\n if (response) {\n if (\n response.data &&\n response.data.StoreInfoList &&\n response.data.StoreInfoList.length\n ) {\n response.data.StoreInfoList.map((item) => {\n const { CentreName: centre = null } = item || {};\n if (centreList.includes(centre.value) === false) {\n centreList.push(centre.value);\n }\n });\n }\n // if (centreList && centreList.length) {\n // centreList.map(centeName => {\n // TagManager.dataLayer({\n // dataLayer: {\n // event: \"loginCentreInfo\",\n // centreName: centeName ? centeName : \"\"\n // },\n // dataLayerName: \"dataLayer\"\n // });\n // });\n // }\n }\n };\n\n componentDidMount() {\n this.getData();\n }\n\n render() {\n const { Heading, Links } = this.props.fields;\n return (\n <div className=\"hub-container\">\n <div className=\"hub-heading\">\n <Text field={Heading} />\n </div>\n <div className=\"hub-controls\">\n <div className=\"row\">\n {Links &&\n Links.length !== 0 &&\n Links.map((item, index) => {\n const { querystring, href, target, text } =\n item.fields.Navigation.value || null;\n const title =\n item &&\n item.fields &&\n item.fields.Title &&\n item.fields.Title.value\n ? item.fields.Title.value\n : \"\";\n let icon = \"\";\n if (/event/.test(querystring)) {\n icon = \"events\";\n } else if (/offer/.test(querystring)) {\n icon = \"offers\";\n } else if (/storeinfo/.test(querystring)) {\n icon = \"stores\";\n } else if (/article/.test(querystring)) {\n icon = \"articles\";\n }\n\n return (\n <div className=\"col\" key={`${querystring}-${index}`}>\n <a\n className=\"hub-button\"\n href={`${href}?${querystring}`}\n target={target}\n >\n <div className=\"hub-button-details\">\n <i className={`hub-icon icon icon-${icon}`} />\n {title && <span className=\"hub-title\">{title}</span>}\n {text && <span className=\"hub-text\">{text}</span>}\n </div>\n </a>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n }\n}\n\nexport default FeatureRetailerPortalHub;\n","import React, { Component } from \"react\";\r\nimport { Link } from \"@sitecore-jss/sitecore-jss-react\";\r\nimport { getUrlParameter } from \"../../../../../helper/UrlHelper\";\r\nimport { getWorkboxItems } from \"../../../../../api/WorkflowAPI\";\r\n\r\nclass NavButtons extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n currentPage: \"\",\r\n tab: \"\",\r\n type: \"\",\r\n NavLinks: props.data.Links,\r\n newApprovals: null,\r\n // hideApprovalsCount:\r\n // props.data.HideContentApprovalLink &&\r\n // props.data.HideContenAtpprovalLink.value,\r\n };\r\n }\r\n componentDidMount() {\r\n this.setState({\r\n currentPage: window.location.pathname.toLowerCase(),\r\n type: getUrlParameter(\"type\"),\r\n });\r\n // const { hideApprovalsCount } = this.state;\r\n // if (!hideApprovalsCount) {\r\n // let params = {\r\n // pageNumber: 1,\r\n // type: \"\",\r\n // };\r\n // this.getNewApprovals(params);\r\n // }\r\n }\r\n\r\n getNewApprovals = async (params) => {\r\n const response = await getWorkboxItems(params);\r\n if (\r\n response &&\r\n response.data &&\r\n response.data.TotalResults &&\r\n response.data.TotalResults.value\r\n ) {\r\n const newApprovals = response.data.TotalResults.value;\r\n if (newApprovals != 0) {\r\n this.setState({ newApprovals });\r\n }\r\n }\r\n };\r\n\r\n render() {\r\n const { HideUserManagementLink, HideContentApprovalLink, HideAuthorisationsLink } = this.props.data;\r\n const { NavLinks, newApprovals } = this.state;\r\n return (\r\n <div className=\"nav-buttons-wrapper\">\r\n {NavLinks &&\r\n NavLinks.length &&\r\n NavLinks.map((link, index) => {\r\n const { Navigation: Navigation = null } = link.fields;\r\n if (\r\n Navigation &&\r\n Navigation.value &&\r\n Navigation.value.text &&\r\n Navigation.value.href\r\n ) {\r\n let Nav = Navigation.value.text.toLowerCase();\r\n if (\r\n (Nav === \"users\" &&\r\n HideUserManagementLink &&\r\n HideUserManagementLink.value) ||\r\n (Nav === \"authorisations\" &&\r\n HideAuthorisationsLink &&\r\n HideAuthorisationsLink.value) ||\r\n (Nav === \"approvals\" &&\r\n HideContentApprovalLink &&\r\n HideContentApprovalLink.value)\r\n )\r\n return null;\r\n let {\r\n currentPage: currentPage = null,\r\n type: type = null,\r\n } = this.state;\r\n if (type) {\r\n type = type.toLowerCase() + \"s\";\r\n }\r\n\r\n let iconName = Nav;\r\n if (Nav.indexOf(\"store\") !== -1) {\r\n iconName = 'stores';\r\n }\r\n if (Nav.indexOf(\"authorisations\") !== -1) {\r\n iconName = 'community';\r\n }\r\n\r\n return (\r\n <Link\r\n field={{\r\n ...Navigation.value,\r\n href: `${Navigation.value.href}?${\r\n Navigation.value.querystring\r\n ? Navigation.value.querystring + \"&\"\r\n : \"\"\r\n }sc_mode=normal`,\r\n }}\r\n key={`NavLink-${index}`}\r\n >\r\n <div\r\n className={`nav-button ${\r\n (currentPage.indexOf(\"promotion\") !== -1 &&\r\n type.indexOf(Nav) !== -1) ||\r\n (currentPage.indexOf(\"store\") !== -1 &&\r\n Nav.indexOf(\"store\") !== -1) ||\r\n currentPage.indexOf(Nav) !== -1\r\n ? \"current\"\r\n : \"\"\r\n }`}\r\n >\r\n <i\r\n className={`icon icon-${iconName}`}\r\n >\r\n {/* {Nav === \"approvals\" && newApprovals && (\r\n <div id={`approvals-count`} className=\"approvals-count\"/>\r\n )} */}\r\n </i>\r\n <span>{Nav}</span>\r\n </div>\r\n </Link>\r\n );\r\n } else return null;\r\n })}\r\n </div>\r\n );\r\n }\r\n}\r\nexport default NavButtons;\r\n","import React from \"react\";\r\nimport { Link } from \"@sitecore-jss/sitecore-jss-react\";\r\n\r\nconst NavFooter = (props) => {\r\n const { FooterLinks: links = null } = props.data || {};\r\n return (\r\n <div className=\"nav-links-wrapper\">\r\n {links &&\r\n links.length &&\r\n links.map((link, index) => {\r\n let { LinkTarget: linkTarget = null } = link.fields;\r\n return (\r\n <div key={`link-${index}`}>\r\n <Link field={linkTarget} />\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\r\n};\r\n\r\nexport default NavFooter;\r\n","import React, { Fragment } from \"react\";\nimport NavButtons from \"./NavButtons\";\nimport NavLinks from \"./NavLinks\";\n\nclass FeatureRetailerPortalLeftNavigation extends React.Component {\n constructor(props) {\n super(props);\n this.state = { breakpoint: null };\n }\n\n componentDidMount() {\n const { CentreList } = this.props.fields || {};\n let list = [];\n if (CentreList && CentreList.length) {\n CentreList.map((item) => {\n const { CentreName: centre = null } = item.fields || {};\n if (centre && centre.value) {\n list.push(centre.value);\n }\n });\n sessionStorage.setItem(\"RPCentreList\", list);\n }\n this.setState({ breakpoint: window.outerWidth });\n window.addEventListener(\"resize\", this.handleResize);\n }\n\n handleResize = () => {\n const { breakpoint } = this.state;\n if (\n (window.outerWidth < 992 && breakpoint < 992) ||\n (window.outerWidth >= 992 && breakpoint >= 992)\n ) {\n } else {\n this.closeNav();\n }\n };\n\n closeNav = () => {\n const leftNavWrapper = document.querySelector(\".left-nav\");\n const topNavWrapper = document.querySelector(\".top-nav .top-nav-wrapper\");\n const backButton = document.querySelector(\"#nav-mobile-back\");\n if (leftNavWrapper && topNavWrapper) {\n leftNavWrapper.classList.remove(\"show-nav-mobile\");\n topNavWrapper.classList.remove(\"show-nav-mobile\");\n }\n if (backButton) {\n backButton.click();\n }\n };\n render() {\n return (\n <Fragment>\n <div className=\"left-nav-wrapper\">\n <NavButtons data={this.props.fields} />\n <NavLinks data={this.props.fields} />\n </div>\n\n <div className=\"nav-blur-wrapper\">\n <div className=\"nav-blur\" />\n </div>\n </Fragment>\n );\n }\n}\n\nexport default FeatureRetailerPortalLeftNavigation;\n","import React, { Component } from \"react\";\r\n\r\nclass Input extends Component {\r\n render() {\r\n const {\r\n label,\r\n value,\r\n id,\r\n size,\r\n onInputChange,\r\n type,\r\n placeholder,\r\n disabled,\r\n onInputKeyDown,\r\n required,\r\n responseText,\r\n style,\r\n autoComplete,\r\n blank,\r\n autoFocus,\r\n } = this.props;\r\n return (\r\n <div className=\"retailer-input-container\" style={style}>\r\n {label && (\r\n <div className=\"label-container\">\r\n <label>{label}</label>\r\n </div>\r\n )}\r\n <div className=\"input-container\">\r\n <input\r\n className={`retailer-input form-control ${\r\n value ? \"has-value\" : \"\"\r\n } ${size ? size : \"\"} ${\r\n placeholder === \"Password\" ? \"hide-password\" : \"\"\r\n } ${blank ? blank : \"\"}`}\r\n id={id}\r\n value={value}\r\n onChange={(e) => onInputChange(e.target.value)}\r\n type={type}\r\n placeholder={placeholder}\r\n disabled={disabled}\r\n required={required}\r\n onKeyDown={(e) => (onInputKeyDown ? onInputKeyDown(e) : null)}\r\n autoComplete={autoComplete}\r\n autoFocus={autoFocus}\r\n />\r\n {responseText && (\r\n <div className={`response-text ${responseText.type}`}>\r\n {responseText.value}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default Input;\r\n","import React, { Component } from \"react\";\r\n\r\nclass ForgotPassword extends Component {\r\n render() {\r\n\r\n return (\r\n <div className=\"forgot-password-container\">\r\n <img\r\n className=\"forgot-password-bg\"\r\n src={this.props.bg}\r\n alt=\"Background\"\r\n />\r\n <div className=\"container\">{this.props.children}</div>\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default ForgotPassword;\r\n","import React from \"react\";\nimport axios from \"axios\";\nimport TagManager from \"react-gtm-module\";\nimport { RichText } from \"@sitecore-jss/sitecore-jss-react\";\nimport BackgroundImage from \"../../../../assets/img/rp-bg.png\";\nimport Input from \"../../../Base/Input\";\nimport Button from \"../../../Base/Button\";\nimport { login } from \"../../../../api/LoginAPI\";\nimport ForgotPassword from \"../../../Base/ForgotPassword\";\nimport logoPlaceholder from \"../../../../assets/img/logoPlaceholder.png\";\n\nclass FeatureRetailerPortalLogin extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n username: null,\n password: null,\n showModal: false,\n browser: \"\",\n passwordSent: false,\n forgotPassword: {\n value: \"\",\n successMessage: \"\",\n errorMessage: \"\",\n },\n };\n this.form = React.createRef();\n }\n\n componentDidMount() {\n this.checkBrowser();\n if (sessionStorage.getItem(\"RPCentreList\")) {\n sessionStorage.removeItem(\"RPCentreList\");\n }\n\n if (window) {\n window.addEventListener(\"resize\", this.handleResize);\n }\n if (document) {\n this.handleResize();\n }\n }\n\n handleResize = () => {\n let loginWrapper = \"\";\n\n if (document) {\n loginWrapper = document.querySelector(\".login-container\");\n }\n\n if (window.outerWidth >= 992) {\n loginWrapper.style.height = \"auto\";\n } else {\n loginWrapper.style.height = window.innerHeight + \"px\";\n }\n };\n\n clearSessionStorageSetPassword = () => {\n if (sessionStorage.getItem(\"promptPassword\")) {\n sessionStorage.removeItem(\"promptPassword\");\n }\n if (sessionStorage.getItem(\"setPassword\")) {\n sessionStorage.removeItem(\"setPassword\");\n }\n };\n\n checkBrowser = () => {\n if (\n navigator &&\n navigator.userAgent &&\n navigator.userAgent.toUpperCase().indexOf(\"CHROME\") != -1 &&\n navigator.vendor &&\n navigator.vendor.toUpperCase().indexOf(\"GOOGLE\") != -1\n ) {\n this.setState({ browser: \"chrome\" });\n } else this.setState({ browser: \"other\" });\n };\n\n submitForm = async () => {\n const data = { ...this.state };\n // const { username } = this.state;\n const response = await login(data);\n if (response) {\n if (\n response.status === 200 &&\n response.data &&\n response.data.StatusCode === 200\n ) {\n this.clearSessionStorageSetPassword();\n window.location.pathname = \"\";\n TagManager.dataLayer({\n dataLayer: {\n event: \"successfulLogin\",\n },\n dataLayerName: \"dataLayer\",\n });\n } else {\n alert(\"Login Failed\");\n }\n }\n };\n\n forgotPassword = (val) => {\n this.setState({\n showModal: val,\n forgotPassword: {\n value: \"\",\n successMessage: \"\",\n errorMessage: \"\",\n },\n });\n };\n\n sendForgotPassword = async () => {\n const { forgotPassword } = this.state;\n if (this.form.current.reportValidity() && forgotPassword.value) {\n const formData = new FormData();\n formData.append(\"email\", forgotPassword.value);\n\n const url = \"/api/sitecore/account/ForgotPassword\";\n\n try {\n let response = await axios({\n method: \"POST\",\n url,\n data: formData,\n });\n\n if (response) {\n this.setState({\n forgotPassword: {\n ...forgotPassword,\n successMessage: \"Please check your email\",\n errorMessage: \"\",\n },\n });\n this.setState({ passwordSent: true });\n } else {\n this.setState({\n forgotPassword: {\n ...forgotPassword,\n successMessage: \"\",\n errorMessage: \"The email is invalid or does not exist\",\n },\n });\n }\n } catch (e) {\n console.log(e);\n this.setState({\n forgotPassword: {\n ...forgotPassword,\n successMessage: \"\",\n errorMessage: \"Something went wrong. Please try again.\",\n },\n });\n }\n }\n };\n\n onEnterKeyPress = (event) => {\n if (event.which === 13 || event.keyCode === 13 || event.key === \"Enter\") {\n this.submitForm();\n }\n };\n\n renderModal = (forgotPasswordMessage) => {\n const { errorMessage, successMessage } = this.state.forgotPassword;\n const { passwordSent } = this.state;\n return (\n <ForgotPassword\n bg={BackgroundImage}\n title=\"Forgot password\"\n show={(val) => this.forgotPassword(val)}\n >\n <div className=\"forgot-password-modal\">\n <div className=\"header\">\n <div\n className=\"back-button\"\n onClick={() =>\n this.setState({ showModal: false, passwordSent: false })\n }\n >\n <span>\n <i className=\"icon icon-back\" />\n BACK\n </span>\n </div>\n </div>\n <div className=\"body\">\n <div className=\"title\">\n {passwordSent ? \"Password sent!\" : \"Forgot password\"}\n </div>\n {passwordSent ? (\n <div className=\"message\">\n <RichText field={forgotPasswordMessage} />\n </div>\n ) : (\n <form ref={this.form} onSubmit={(e) => e.preventDefault()}>\n <Input\n type=\"email\"\n placeholder=\"E-mail address\"\n autoFocus={true}\n required\n onInputChange={(value) =>\n this.setState({\n forgotPassword: { ...this.state.forgotPassword, value },\n })\n }\n responseText={{\n type: successMessage\n ? \"success\"\n : errorMessage\n ? \"error\"\n : \"\",\n value: successMessage\n ? successMessage\n : errorMessage\n ? errorMessage\n : \"\",\n }}\n />\n </form>\n )}\n <div className=\"footer-button\">\n {passwordSent ? (\n <Button\n size=\"send-password\"\n color=\"light-tertiary\"\n onClick={() =>\n this.setState({ showModal: false, passwordSent: false })\n }\n >\n Done\n </Button>\n ) : (\n <Button\n size=\"send-password\"\n color=\"light-tertiary\"\n disabled={this.state.forgotPassword.value ? false : true}\n onClick={() => this.sendForgotPassword()}\n >\n Send password\n </Button>\n )}\n </div>\n </div>\n </div>\n </ForgotPassword>\n );\n };\n\n render() {\n const {\n // TopNavigationLinks = null,\n SiteLogo = null,\n SiteLogoClassName = null,\n LoginPageBlurb = null,\n FooterBlurb = null,\n ForgotPasswordMessage = null,\n } = this.props.fields || {};\n // let navLink =\n // TopNavigationLinks &&\n // TopNavigationLinks.fields &&\n // TopNavigationLinks.fields.RetailerSiteLogo &&\n // TopNavigationLinks.fields.RetailerSiteLogo.fields &&\n // TopNavigationLinks.fields.RetailerSiteLogo.fields.Link &&\n // TopNavigationLinks.fields.RetailerSiteLogo.fields.Link.value\n // ? TopNavigationLinks.fields.RetailerSiteLogo.fields.Link.value\n // : {};\n let mainLink =\n SiteLogo &&\n SiteLogo.fields &&\n SiteLogo.fields.Link &&\n SiteLogo.fields.Link.value\n ? SiteLogo.fields.Link.value\n : {};\n const logo = (SiteLogoClassName && SiteLogoClassName.value) || \"\";\n let blurb = LoginPageBlurb && LoginPageBlurb.value ? LoginPageBlurb : \"\";\n let footerBlurb = FooterBlurb && FooterBlurb.value ? FooterBlurb : \"\";\n let forgotPasswordMessage =\n ForgotPasswordMessage && ForgotPasswordMessage.value\n ? ForgotPasswordMessage\n : \"\";\n return (\n <div className=\"login-container\">\n {this.state.showModal ? this.renderModal(forgotPasswordMessage) : null}\n <img className=\"bg-image\" src={BackgroundImage} alt=\"Background\" />\n <div className=\"container\">\n <div className=\"header-wrapper\">\n <div className=\"header-logo\">\n {/* {navLink ? (\n <a {...navLink}>\n <i className=\"icon icon-qicgre\" />\n </a>\n ) : (\n <i className=\"icon icon-qicgre\" />\n )} */}\n </div>\n </div>\n <div className=\"form-logo\">\n {mainLink ? (\n <a {...mainLink}>\n <img\n alt={\"sitecore-logo\"}\n src={logoPlaceholder}\n data-src={logo}\n className=\"lazyload form-logo-image\"\n />\n </a>\n ) : (\n <img\n alt={\"sitecore-logo\"}\n src={logoPlaceholder}\n data-src={logo}\n className=\"lazyload form-logo-image\"\n />\n )}\n </div>\n <div className=\"login-wrapper\">\n <div className=\"form-blurb\">\n <RichText field={blurb} />\n </div>\n <div className=\"form-wrapper\">\n <div className=\"form-title\">Sign in</div>\n <div className=\"form-group\">\n <Input\n type=\"text\"\n placeholder=\"Email address\"\n onInputChange={(username) => this.setState({ username })}\n />\n <Input\n type=\"text\"\n placeholder=\"Email address\"\n onInputChange={(username) => this.setState({ username })}\n style={{ display: \"none\" }}\n />\n </div>\n <div className=\"form-group\">\n {this.state.browser === \"chrome\" && (\n <Input\n type=\"text\"\n placeholder=\"Password\"\n onInputChange={(password) => this.setState({ password })}\n onInputKeyDown={(event) => this.onEnterKeyPress(event)}\n />\n )}\n {this.state.browser === \"other\" && (\n <Input\n type=\"password\"\n placeholder=\"Password\"\n onInputChange={(password) => this.setState({ password })}\n onInputKeyDown={(event) => this.onEnterKeyPress(event)}\n autoComplete=\"new-password\"\n />\n )}\n </div>\n <div className=\"form-submit\">\n <Button\n onClick={() => this.submitForm()}\n size=\"full\"\n color=\"light-green\"\n >\n Sign in\n </Button>\n </div>\n\n <div className=\"form-controls-wrapper\">\n <div\n className=\"form-forgot-password\"\n onClick={() => this.forgotPassword(true)}\n >\n Forgot password?\n </div>\n </div>\n </div>\n </div>\n {footerBlurb && (\n <div className=\"form-footer\">\n <RichText field={footerBlurb} />\n </div>\n )}\n </div>\n </div>\n );\n }\n}\n\nexport default FeatureRetailerPortalLogin;\n","import React from \"react\";\n\nclass AvatarUpload extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n file: props.value ? props.value : null,\n preview: props.value ? props.value : null,\n remove: false,\n errorMessage: null,\n };\n }\n\n handleFileUpload = () => {\n this.props.handleFileUpload(this.state.file, this.state.errorMessage);\n this.props.removeImage(this.state.remove);\n };\n\n setFile = (file) => {\n if (file && file.type.indexOf(\"image\") !== -1) {\n if (file.size / 1024 / 1024 <= 2) {\n this.setState(\n {\n file,\n preview: URL.createObjectURL(file),\n },\n this.handleFileUpload\n );\n } else {\n alert(\"The maximum file size allowed is 2 MB.\");\n }\n } else {\n alert(\"Please select an image.\");\n }\n };\n\n render() {\n const { preview } = this.state;\n const { value } = this.props;\n return (\n <div className=\"avatarupload-wrapper\">\n <div className={`avatarupload-btn ${preview || value ? \"\" : \"empty\"}`}>\n {preview || value ? (\n <div className=\"img-container\">\n <img src={preview || value} />\n <div className=\"controls-container\">\n <label>\n <div className=\"img-control\">\n <i className=\"icon icon-edit\" />\n </div>\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={(e) =>\n this.setState(\n { remove: false },\n this.setFile(e.target.files[0])\n )\n }\n />\n </label>\n <div\n className=\"img-control\"\n onClick={() =>\n this.setState(\n {\n file: null,\n preview: null,\n remove: true,\n },\n this.handleFileUpload\n )\n }\n >\n <i className=\"icon icon-trash-2\" />\n </div>\n </div>\n </div>\n ) : (\n <label>\n <span>Choose image</span>\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={(e) =>\n this.setState(\n { remove: false },\n this.setFile(e.target.files[0])\n )\n }\n />\n </label>\n )}\n </div>\n </div>\n );\n }\n}\n\nexport default AvatarUpload;\n","import React, { Fragment } from \"react\";\nimport axios from \"axios\";\nimport Button from \"../../../Base/Button\";\nimport Input from \"../../../Base/Input\";\nimport AvatarUpload from \"../../../Base/AvatarUpload\";\nimport SuccessMessage from \"../../../Base/SuccessMessage\";\n\nclass EditProfile extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n profilePicture: \"\",\n fullName: \"\",\n contactNumber: \"\",\n emailAddress: \"\",\n address: \"\",\n permissions: \"\",\n errorMessage: \"\",\n formSubmit: false,\n removeProfilePicture: false,\n showMiniModal: false,\n hideIcon: null,\n modalMessage: null,\n };\n }\n\n componentDidMount() {\n this.getData();\n }\n\n getData = () => {\n const {\n ProfilePicture,\n FullName,\n ContactNumber,\n EmailAddress,\n Address,\n Permissions,\n } = this.props.data;\n this.setState({\n profilePicture:\n (ProfilePicture && ProfilePicture.value && ProfilePicture.value.src) ||\n null,\n fullName: FullName.value,\n contactNumber: ContactNumber.value,\n emailAddress: EmailAddress.value,\n address: Address.value,\n permissions: (Permissions && Permissions.value) || \"\",\n });\n };\n\n saveData = async () => {\n const {\n profilePicture,\n fullName,\n contactNumber,\n address,\n removeProfilePicture,\n } = this.state;\n this.setState({ formSubmit: true });\n\n if (fullName && contactNumber && address) {\n const formData = new FormData();\n const antiForgeryToken = this.props.antiForgeryToken;\n formData.append(\"ProfilePicture\", profilePicture);\n formData.append(\"FullName\", fullName);\n formData.append(\"ContactNumber\", contactNumber);\n formData.append(\"Address\", address);\n formData.append(\"RemoveProfilePicture\", removeProfilePicture);\n if(antiForgeryToken) {\n formData.append(antiForgeryToken.name, antiForgeryToken.value);\n } \n\n const url = \"/api/sitecore/account/SaveUserProfile\";\n\n try {\n let response = await axios({\n method: \"POST\",\n url,\n data: formData,\n });\n\n if (response && response.data) {\n if (response.data.IsSuccess && response.data.IsSuccess.value) {\n this.setState({\n modalMessage: \"Update profile successful.\",\n showMiniModal: true,\n hideIcon: false,\n errorMessage: \"\",\n });\n this.props.refresh(true);\n } else {\n this.setState({\n modalMessage: response.data.Message.value,\n showMiniModal: true,\n hideIcon: true,\n errorMessage: response.data.Message.value,\n });\n }\n } else {\n this.setState({\n modalMessage: \"Update profile failed.\",\n showMiniModal: true,\n hideIcon: true,\n errorMessage: \"Update profile failed.\",\n });\n }\n } catch (e) {\n console.log(e);\n\n this.setState({\n modalMessage: \"Update profile failed.\",\n hideIcon: true,\n showMiniModal: true,\n });\n }\n } else {\n this.setState({\n modalMessage: \"Please fill out all fields.\",\n hideIcon: true,\n showMiniModal: true,\n errorMessage: \"Please fill out all fields.\",\n });\n }\n this.setState({ formSubmit: false });\n };\n\n renderMiniModal = () => {\n const { modalMessage, hideIcon } = this.state;\n return (\n <SuccessMessage\n label={modalMessage}\n hideIcon={hideIcon}\n handleShowSuccess={(showMiniModal) => {\n this.setState({\n showMiniModal,\n });\n }}\n />\n );\n };\n\n render() {\n const {\n profilePicture,\n fullName,\n contactNumber,\n emailAddress,\n address,\n errorMessage,\n formSubmit,\n showMiniModal,\n } = this.state;\n const { show } = this.props;\n return (\n <Fragment>\n {showMiniModal && this.renderMiniModal()}\n <div className=\"btn btn--tertiary profile-btn d-flex d-lg-none\">\n <i className=\"icon icon-close\" onClick={() => show()} />\n <div className=\"d-flex d-lg-none\">\n <Button color=\"secondary\" onClick={() => show()}>\n Cancel\n </Button>\n <Button\n color=\"primary\"\n onClick={() => this.saveData()}\n disabled={formSubmit}\n >\n Save\n </Button>\n </div>\n </div>\n <div className=\"editprofile-container\">\n <div className=\"title\">Edit profile</div>\n <div className=\"form-container clearfix\">\n <div className=\"subtitle\">Profile picture</div>\n <AvatarUpload\n value={profilePicture}\n handleFileUpload={(profilePicture) =>\n this.setState({ profilePicture })\n }\n removeImage={(removeProfilePicture) =>\n this.setState({ removeProfilePicture })\n }\n />\n <div className=\"subtitle\">Name</div>\n <Input\n id=\"EP_Name\"\n placeholder=\" \"\n type=\"text\"\n required\n value={fullName}\n onInputChange={(fullName) =>\n this.setState({ fullName, errorMessage: \"\" })\n }\n blank={errorMessage && !fullName ? \"error\" : \"\"}\n />\n <div className=\"subtitle\">Email address</div>\n <Input\n id=\"EP_Email\"\n placeholder=\" \"\n type=\"email\"\n disabled\n required\n value={emailAddress}\n onInputChange={(emailAddress) => this.setState({ emailAddress })}\n />\n <div className=\"subtitle\">Contact number</div>\n <Input\n id=\"EP_Contact\"\n placeholder=\" \"\n type=\"tel\"\n required\n value={contactNumber}\n onInputChange={(contactNumber) =>\n this.setState({ contactNumber, errorMessage: \"\" })\n }\n blank={errorMessage && !contactNumber ? \"error\" : \"\"}\n />\n <div className=\"subtitle\">Address</div>\n <Input\n id=\"EP_Address\"\n placeholder=\" \"\n type=\"text\"\n required\n value={address}\n onInputChange={(address) =>\n this.setState({ address, errorMessage: \"\" })\n }\n blank={errorMessage && !address ? \"error\" : \"\"}\n />\n <div className=\"float-right d-none d-lg-flex\">\n <Button color=\"secondary\" onClick={() => show()}>\n Cancel\n </Button>\n <Button\n color=\"primary\"\n onClick={() => this.saveData()}\n disabled={formSubmit}\n >\n Save\n </Button>\n </div>\n </div>\n </div>\n </Fragment>\n );\n }\n}\n\nexport default EditProfile;\n","import React, { Fragment } from \"react\";\nimport axios from \"axios\";\nimport Button from \"../../../Base/Button\";\nimport Input from \"../../../Base/Input\";\nimport SuccessMessage from \"../../../Base/SuccessMessage\";\n\nclass UpdatePassword extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n newPass: \"\",\n confNewPass: \"\",\n browser: \"\",\n formSubmit: false,\n showMiniModal: false,\n hideIcon: null,\n modalMessage: null,\n };\n }\n\n sendChangePassword = async () => {\n const { newPass, confNewPass } = this.state;\n this.setState({\n formSubmit: true,\n });\n\n if (newPass === confNewPass) {\n const formData = new FormData();\n const antiForgeryToken = this.props.antiForgeryToken;\n formData.append(\"password\", newPass);\n\n if(antiForgeryToken) {\n formData.append(antiForgeryToken.name, antiForgeryToken.value);\n\n }\n\n const url = \"/api/sitecore/account/updatepassword\";\n\n try {\n let response = await axios({\n method: \"POST\",\n url,\n data: formData,\n });\n\n if (response) {\n this.setState({\n modalMessage: \"Password reset successful.\",\n showMiniModal: true,\n hideIcon: false,\n });\n } else {\n this.setState({\n modalMessage: \"Password reset failed.\",\n showMiniModal: true,\n hideIcon: true,\n });\n }\n } catch (e) {\n this.setState({\n modalMessage: \"Password reset failed.\",\n showMiniModal: true,\n hideIcon: true,\n });\n console.log(e);\n }\n } else {\n this.setState({\n modalMessage: \"Password does not match.\",\n showMiniModal: true,\n hideIcon: true,\n });\n }\n this.setState({ formSubmit: false });\n };\n\n renderMiniModal = () => {\n const { modalMessage, hideIcon } = this.state;\n return (\n <SuccessMessage\n label={modalMessage}\n hideIcon={hideIcon}\n handleShowSuccess={(showMiniModal) => {\n this.setState({\n showMiniModal,\n });\n }}\n />\n );\n };\n\n render() {\n const { newPass, confNewPass, showMiniModal } = this.state;\n let { show } = this.props;\n return (\n <Fragment>\n {showMiniModal && this.renderMiniModal()}\n\n <div className=\"btn btn--tertiary profile-btn d-flex d-lg-none\">\n <i className=\"icon icon-close\" onClick={() => show()} />\n <div className=\"d-flex d-lg-none\">\n <Button color=\"secondary\" onClick={() => show()}>\n Cancel\n </Button>\n <Button\n color=\"primary\"\n disabled={newPass && confNewPass ? false : true}\n onClick={() => this.sendChangePassword()}\n >\n Save\n </Button>\n </div>\n </div>\n <div className=\"updatepassword-container\">\n <i className=\"icon icon-lock\" />\n <div className=\"form-container clearfix\">\n <div className=\"title\">\n <i className=\"icon icon-lock\" />\n Change password\n </div>\n <input type=\"password\" className=\"fakePasswordField d-none\" />\n <div className=\"subtitle\">New password</div>\n <Input\n id=\"new-pw-1\"\n placeholder=\" \"\n type=\"password\"\n required\n autoComplete=\"new-password\"\n onInputChange={(newPass) => this.setState({ newPass })}\n />\n <div className=\"subtitle\">Confirm password</div>\n <Input\n placeholder=\" \"\n type=\"password\"\n required\n autoComplete=\"new-password\"\n onInputChange={(confNewPass) => this.setState({ confNewPass })}\n />\n <div className=\"float-right d-none d-lg-flex\">\n <Button color=\"secondary\" onClick={() => show()}>\n Cancel\n </Button>\n <Button\n color=\"primary\"\n disabled={newPass && confNewPass ? false : true}\n onClick={() => this.sendChangePassword()}\n >\n Save\n </Button>\n </div>\n </div>\n </div>\n </Fragment>\n );\n }\n}\n\nexport default UpdatePassword;\n","import { Text } from \"@sitecore-jss/sitecore-jss-react\";\r\nimport React from \"react\";\r\nimport Button from \"../Button\";\r\n\r\nconst Card = (props) => {\r\n const {\r\n className,\r\n title,\r\n content = null,\r\n textContent,\r\n btnText,\r\n btnDisabled,\r\n btnOnClick,\r\n } = props;\r\n return (\r\n <div className={`card-wrapper ${className}`}>\r\n <div className=\"h2-bold\">{title}</div>\r\n <div className=\"card-content\">\r\n {textContent && textContent.value && (\r\n <div>\r\n <Text field={textContent} />\r\n </div>\r\n )}\r\n {content}\r\n <div className=\"card-button\">\r\n <Button\r\n color=\"secondary\"\r\n size=\"small-full\"\r\n disabled={btnDisabled}\r\n onClick={btnOnClick}\r\n >\r\n {btnText}\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default Card;\r\n","import React, { Component } from \"react\";\nimport { Text } from \"@sitecore-jss/sitecore-jss-react\";\nimport DefaultUserLogo from \"../../../../assets/icons/png/author.png\";\nimport logoPlaceholder from \"../../../../assets/img/logoPlaceholder.png\";\nimport EditProfile from \"../../../Modules/Profile/EditProfile\";\nimport UpdatePassword from \"../../../Modules/Profile/UpdatePassword\";\nimport Popup from \"../../../Base/Popup\";\nimport Card from \"../../../Base/Card\";\nimport {\n disableBodyScroll,\n enableBodyScroll,\n} from \"../../../../helper/ScrollHelper\";\nimport PageHeader from \"../../../Base/PageHeader\";\n\nclass FeatureRetailerPortalProfile extends Component {\n constructor(props) {\n super(props);\n this.state = {\n showEditProfileModal: false,\n showChangePasswordModal: false,\n willRefreshPage: false,\n };\n }\n\n componentDidMount() {\n if (sessionStorage.getItem(\"setPassword\") === \"true\") {\n this.setState({ showChangePasswordModal: true }, () => {\n sessionStorage.setItem(\"setPassword\", false);\n sessionStorage.setItem(\"promptPassword\", \"done\");\n });\n }\n }\n\n renderChangePasswordModal = () => {\n disableBodyScroll();\n return (\n <Popup>\n <UpdatePassword\n antiForgeryToken={this.props.fields.antiForgeryToken}\n show={(showChangePasswordModal) =>\n this.setState({ showChangePasswordModal }, () => enableBodyScroll())\n }\n />\n </Popup>\n );\n };\n\n renderEditProfileModal = () => {\n disableBodyScroll();\n const { willRefreshPage } = this.state;\n return (\n <Popup\n type=\"small\"\n title=\"Edit profile\"\n show={(showEditProfileModal) =>\n this.setState({ showEditProfileModal }, () => {\n enableBodyScroll();\n willRefreshPage && window.location.reload();\n })\n }\n >\n <EditProfile\n data={this.props.fields}\n antiForgeryToken={this.props.fields.antiForgeryToken}\n show={(showEditProfileModal) =>\n this.setState({ showEditProfileModal }, () => {\n enableBodyScroll();\n willRefreshPage && window.location.reload();\n })\n }\n refresh={(willRefreshPage) => this.setState({ willRefreshPage })}\n />\n </Popup>\n );\n };\n\n render() {\n const {\n ProfilePicture: thumbnail,\n FullName,\n ContactNumber,\n EmailAddress,\n Address,\n Permissions,\n } = this.props.fields;\n\n const renderDetails = (\n <React.Fragment>\n <div className=\"user-thumbnail\">\n {thumbnail && thumbnail.value && thumbnail.value.src ? (\n <img\n alt=\"icon\"\n src={logoPlaceholder}\n data-src={thumbnail.value.src}\n className=\"lazyload\"\n />\n ) : (\n <img src={DefaultUserLogo} alt=\"retailer\" />\n )}\n </div>\n <div className=\"user-details\">\n <div>\n <Text field={FullName} />\n </div>\n <div>\n <Text field={ContactNumber} />\n </div>\n <div className=\"user-email\">\n <Text field={EmailAddress} />\n </div>\n <div>\n <Text field={Address} />\n </div>\n </div>\n </React.Fragment>\n );\n\n return (\n <div className=\"profile-wrapper\">\n {this.state.showEditProfileModal ? this.renderEditProfileModal() : null}\n {this.state.showChangePasswordModal\n ? this.renderChangePasswordModal()\n : null}\n <PageHeader title={{ value: \"Your profile\" }} />\n <Card\n className=\"card-dt\"\n title=\"Contact details\"\n content={renderDetails}\n btnText=\"Edit\"\n btnOnClick={() => this.setState({ showEditProfileModal: true })}\n />\n <Card\n className=\"card-pw\"\n title=\"Password\"\n textContent={{ value: \"••••••••••••\" }}\n btnText=\"Change password\"\n btnOnClick={() => this.setState({ showChangePasswordModal: true })}\n />\n {Permissions && Permissions.value && (\n <Card\n className=\"card-ps\"\n title=\"Permissions\"\n textContent={Permissions}\n btnText=\"Can't edit\"\n btnDisabled\n />\n )}\n </div>\n );\n }\n}\nexport default FeatureRetailerPortalProfile;\n","import React from \"react\";\nimport axios from \"axios\";\nimport Loadable from \"react-loadable\";\nimport TagManager from \"react-gtm-module\";\nimport ImageUpload from \"../../../Base/ImageUpload\";\nimport FormFile from \"../../../Base/FormFile\";\nimport DropDown from \"../../../Base/DropDown\";\nimport FormInput from \"../../../Base/FormInput\";\nimport FormInputMultiple from \"../../../Base/FormInputMultiple\";\nimport FormDate from \"../../../Base/FormDate\";\nimport FormCheckbox from \"../../../Base/FormCheckbox\";\nimport FormListbox from \"../../../Base/FormListbox\";\nimport Button from \"../../../Base/Button\";\nimport Modal from \"../../../Base/Modal\";\nimport { get } from \"lodash\";\nimport {\n disableBodyScroll,\n enableBodyScroll,\n} from \"../../../../helper/ScrollHelper\";\nimport {\n validate,\n setPromotionData,\n buildFormData,\n formDataFields,\n} from \"../../../../helper/PromotionHelper\";\nimport { getUrlParameter } from \"../../../../helper/UrlHelper\";\nimport bitmap from \"../../../../assets/icons/png/bitmap@3x.png\";\nimport { getCentreStores } from \"../../../../api/PromotionAPI\";\n\nconst RichTextEditor = Loadable({\n loader: () => import(\"../../../Base/RichTextEditor\"),\n loading: () => null,\n});\n\nclass FeatureRetailerPortalPromotions extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n mode: \"new\",\n stores: null,\n retailers: null,\n categories: null,\n promotionType: \"\",\n showModal: false,\n modalContent: null,\n formError: {},\n storeList: null,\n centreStoreList: null,\n holidays: null,\n specialHolidayListbox: null,\n formData: { ...formDataFields },\n componentReady: false,\n selectAllStores: false,\n status: \"dirty\",\n redirectUrl: \"\",\n retailerId: \"\",\n };\n }\n componentDidMount() {\n this.setState({\n type: getUrlParameter(\"type\"),\n centre: getUrlParameter(\"centre\"),\n componentReady: true,\n });\n this.getData();\n let retailerList = this.setRetailerList(this.props.fields.RetailerList);\n if (!getUrlParameter(\"itemId\") && retailerList && retailerList.length) {\n this.getCentreStoreList(retailerList[0].value);\n }\n }\n\n getData = () => {\n const {\n RetailerList,\n Categories,\n Promotion,\n RedirectUrl,\n GlobalSpecialHoliday,\n } = this.props.fields;\n let retailerList = this.setRetailerList(RetailerList);\n let categoryList = this.setCategoryList(Categories);\n let holidayList = this.setHolidayList(GlobalSpecialHoliday);\n if (getUrlParameter(\"itemId\")) {\n // let promotionData = setPromotionData(Promotion[0].fields);\n let promotionData = setPromotionData(Promotion.fields);\n this.setState({\n mode: \"edit\",\n retailers: retailerList,\n categories: categoryList,\n formData: { ...this.state.formData, ...promotionData },\n redirectUrl: RedirectUrl.value,\n holidays: holidayList,\n });\n } else {\n this.setState({\n retailers: retailerList,\n categories: categoryList,\n redirectUrl: RedirectUrl && RedirectUrl.value ? RedirectUrl.value : \"\",\n holidays: holidayList,\n });\n }\n };\n\n setRetailerList = (list) => {\n let temp = [];\n list.forEach((el) =>\n temp.push({\n name: el.fields.RetailerName.value,\n value: el.fields.RetailerId.value,\n })\n );\n return temp;\n };\n\n setCategoryList = (list) => {\n let temp = [];\n list.forEach((el) =>\n temp.push({\n name: el.fields.CategoryName.value,\n value: el.fields.CategoryId.value,\n })\n );\n return temp;\n };\n\n setStoreList = (list) => {\n let temp = [];\n list.forEach((el) =>\n temp.push({\n name: el.fields.CategoryName.value,\n value: el.fields.CategoryId.value,\n })\n );\n return temp;\n };\n\n setHolidayList = (list) => {\n let temp = [];\n if (list && list.length) {\n list.forEach((el) =>\n temp.push({\n name: el.fields.HolidayName.value,\n value: el.fields.HolidayId.value,\n })\n );\n }\n return temp;\n };\n handleListbox = (id, field) => {\n const { formData } = this.state;\n let options;\n let selected = [];\n if (document) {\n options = document.querySelectorAll(`#${id} option:checked`);\n if (options) {\n for (let i = 0; i < options.length; i++) {\n selected.push(options[i].value);\n }\n }\n }\n this.setState({\n formData: {\n ...formData,\n [field]: selected,\n },\n });\n };\n\n handleSelect = (isSelect, field, options) => {\n const { formData } = this.state;\n this.setState({\n formData: {\n ...formData,\n [field]: isSelect ? options.map((el) => el.value) : [],\n },\n });\n };\n\n handleInputCheckbox = (value) => {\n const { formData } = this.state;\n if (formData.selectedCategories.indexOf(value) > -1) {\n this.setState({\n formData: {\n ...formData,\n selectedCategories: formData.selectedCategories.filter(\n (el) => el !== value\n ),\n },\n });\n } else {\n this.setState({\n formData: {\n ...formData,\n selectedCategories: [...formData.selectedCategories, value],\n },\n });\n }\n };\n\n handleFormUpdate = (value) => {\n this.setState({ formData: { ...this.state.formData, ...value } });\n };\n\n renderModal = () => {\n disableBodyScroll();\n const { mode, status, redirectUrl } = this.state;\n const { title, body, cta } = this.state.modalContent;\n return (\n <Modal\n type=\"small\"\n title={title}\n show={() => {\n if (status === \"submitted\" || status === \"saved\") {\n window.location.href = `${redirectUrl}`;\n } else {\n this.setState({ showModal: false, modalContent: null }, () =>\n enableBodyScroll()\n );\n }\n }}\n >\n <div className=\"modal-body\">{body}</div>\n {(mode === \"edit\" || status === \"submitted\") && cta && (\n <div className=\"cta modal-controls-container\">\n <Button\n color=\"primary\"\n onClick={() => (window.location.href = cta.url)}\n >\n {cta.label}\n </Button>\n </div>\n )}\n {mode === \"new\" && status === \"saved\" && (\n <div className=\"modal-controls-container\">\n <Button\n color=\"secondary\"\n onClick={() => (window.location.href = `${redirectUrl}`)}\n >\n CANCEL\n </Button>\n <Button\n disabled={false}\n color=\"primary\"\n onClick={() => this.submitForm()}\n >\n SUBMIT\n </Button>\n </div>\n )}\n {mode === \"new\" && status === \"dirty\" && (\n <div className=\"modal-controls-container\">\n <Button\n color=\"secondary\"\n onClick={() =>\n this.setState({ showModal: false, modalContent: null }, () =>\n enableBodyScroll()\n )\n }\n >\n CLOSE\n </Button>\n </div>\n )}\n </Modal>\n );\n };\n\n validateForm = () => {\n let formError = validate(\n this.state.formData,\n this.state.mode === \"edit\" ? [\"selectedRetailer\"] : []\n );\n let errorMessage = {\n title: \"Form Saving Failed\",\n body: \"Required fields are missing\",\n };\n if (Object.entries(formError).length !== 0) {\n this.setState({ formError, showModal: true, modalContent: errorMessage });\n } else {\n this.saveForm();\n }\n };\n\n extractItemIds = (centreList) => {\n let itemIds = [];\n centreList.map((center) => {\n center.Promotions.map((promotion) => {\n itemIds.push(promotion.ItemId.value);\n });\n });\n return itemIds;\n };\n\n buildPreviewUrls = (centreList) => {\n let preview = \"\";\n preview = centreList.map((centre) => {\n let centrePreview = [];\n centrePreview = centre.Promotions.map((promotion) => {\n return (\n <div className=\"preview-link\">\n <i className={`icon icon-external`} />\n <a href={promotion.PreviewUrl.value} target=\"_blank\">\n {promotion.Store.value}\n </a>\n </div>\n );\n });\n TagManager.dataLayer({\n dataLayer: {\n event: \"createdPromotions\",\n centreName: centre.Centre.value,\n },\n dataLayerName: \"dataLayer\",\n });\n return (\n <div className=\"col-3\">\n <div className=\"centre-name\">{centre.Centre.value}</div>\n <div className=\"centre-preview-list\">{centrePreview}</div>\n </div>\n );\n });\n return <div className=\"row\">{preview}</div>;\n };\n\n saveForm = async () => {\n const { formData, mode, type } = this.state;\n var timezoneId = new Date().getTimezoneOffset();\n const url = \"/api/sitecore/promotion/SavePromotion\";\n let data = buildFormData({\n ...formData,\n timeZoneId: timezoneId,\n });\n try {\n let response = await axios({\n method: \"POST\",\n url,\n data,\n params: {\n type,\n // centre,\n ...(mode === \"edit\" ? { itemId: `&itemId=${formData.itemId}` } : \"\"),\n },\n config: { headers: { \"Content-Type\": \"multipart/form-data\" } },\n });\n\n if (response) {\n if (response.data.IsSuccess.value && mode === \"new\") {\n let successMessage = {\n title: `${type} drafts have been created`,\n body: this.buildPreviewUrls(response.data.PromotionList),\n };\n const itemIds = this.extractItemIds(response.data.PromotionList);\n this.setState({\n showModal: true,\n modalContent: successMessage,\n formData: { ...formData, itemIds },\n status: \"saved\",\n });\n } else if (response.data.IsSuccess.value && mode === \"edit\") {\n let successMessage = {\n title: \"Form Saved\",\n body: response.data.Message.value,\n };\n const promotion = response.data.PromotionList[0].Promotions[0];\n this.setState(\n {\n showModal: true,\n modalContent: successMessage,\n formData: { ...formData, itemIds: [`${promotion.ItemId.value}`] },\n },\n () => {\n const win = window.open(promotion.PreviewUrl.value, \"_blank\");\n if (win != null) {\n win.focus();\n }\n }\n );\n } else {\n let errorMessage = {\n title: \"Form Not Saved\",\n body: response.data.Message.value,\n };\n\n this.setState({\n showModal: true,\n modalContent: errorMessage,\n });\n }\n }\n } catch (e) {\n console.log(e.response.statusText);\n }\n };\n\n submitForm = async () => {\n const { formData, type, mode } = this.state;\n const url = \"/api/sitecore/promotion/SubmitPromotion\";\n let data = buildFormData({\n itemIds: mode === \"edit\" ? [`${formData.itemId}`] : formData.itemIds,\n });\n\n try {\n let response = await axios({\n method: \"POST\",\n url,\n data,\n config: { headers: { \"Content-Type\": \"multipart/form-data\" } },\n });\n\n if (response) {\n if (response.data.IsSuccess.value) {\n let successMessage = {\n title: \"Form Submitted\",\n body: response.data.Message.value,\n cta: {\n label: `${type} list`,\n url: response.data.RedirectUrl.value,\n },\n };\n this.setState({\n showModal: true,\n modalContent: successMessage,\n status: \"submitted\",\n });\n } else {\n let errorMessage = {\n title: \"Form Not Submitted\",\n body: response.data.Message.value,\n };\n\n this.setState({\n showModal: true,\n modalContent: errorMessage,\n });\n }\n }\n } catch (e) {\n console.log(e.response.statusText);\n }\n };\n\n getCentreStoreList = async (retailerId) => {\n let response = await getCentreStores({ retailerId });\n if (response.status === 200 && response.data) {\n // const ImageGallery = get(response.data, \"ImageGallery\", []);\n this.setState({\n centreStoreList: get(response.data, \"CentreStoreList\", []),\n retailerId,\n });\n } else {\n alert(\"Getting centre stores data failed\");\n }\n };\n\n handleStoreListCheckbox = (value) => {\n const { formData, selectAllStores, centreStoreList } = this.state;\n if (value === \"0\") {\n let allStores = [];\n centreStoreList.map((centre) => {\n centre.StoreList.map((store) => {\n allStores.push(store.StoreItemId.value);\n });\n });\n\n this.setState({\n selectAllStores: !selectAllStores,\n formData: {\n ...formData,\n selectedStores: !selectAllStores ? allStores : [],\n },\n });\n } else if (formData.selectedStores.indexOf(value) > -1) {\n this.setState({\n formData: {\n ...formData,\n selectedStores: formData.selectedStores.filter((el) => el !== value),\n },\n });\n } else {\n this.setState({\n formData: {\n ...formData,\n selectedStores: [...formData.selectedStores, value],\n },\n });\n }\n };\n\n buildCentreStoreList = (param) => {\n // const cetnreStoreList = getCentreStoreList\n const { formData, centreStoreList, selectAllStores } = this.state;\n if (centreStoreList && centreStoreList.length) {\n return (\n <div className=\"form-stores\">\n <div className=\"form-label\">Multiple Stores</div>\n <div className=\"content\">\n <div className=\"row line\">\n <div className=\"col-3\">\n <FormCheckbox\n // key={`store-${store.StoreItemId.value}`}\n value=\"0\"\n label=\"Select All\"\n checked={selectAllStores}\n onCheckboxChange={(value) =>\n this.handleStoreListCheckbox(value)\n }\n />\n </div>\n </div>\n <div className=\"row\">\n {centreStoreList.map((centre, index) => {\n return (\n <div className=\"col-3\">\n <div className=\"form-label\">{centre.CentreName.value}</div>\n {centre.StoreList.map((store) => {\n return (\n <FormCheckbox\n // key={`store-${store.StoreItemId.value}`}\n value={store.StoreItemId.value}\n label={store.StoreName.value}\n // checked={false}\n checked={\n formData.selectedStores.indexOf(\n store.StoreItemId.value\n ) > -1\n }\n // onCheckboxChange={value => this.getCentreStoreList(value)}\n onCheckboxChange={(value) =>\n this.handleStoreListCheckbox(value)\n }\n />\n );\n })}\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n }\n };\n\n render() {\n const {\n mode,\n formError,\n formData,\n retailers,\n categories,\n type,\n showModal,\n componentReady,\n centreStoreList,\n redirectUrl,\n holidays,\n } = this.state;\n\n if (!retailers) {\n return null;\n }\n\n return (\n <div className=\"promotion-container\">\n {showModal && this.renderModal()}\n <div className=\"body-section-title\">\n {type\n ? mode === \"new\"\n ? `Create an ${type}`\n : `Update an ${type}`\n : \"\"}\n </div>\n {mode === \"new\" && (\n <div className=\"form-type-wrapper d-none\">\n <DropDown\n theme=\"light\"\n options={retailers}\n error={formError.selectedRetailer}\n defaultSelected={retailers[0].name}\n // defaultSelected=\"Select Retailer\"\n handleSelectionChange={(selectedRetailerName) => {\n this.getCentreStoreList(\n retailers.filter((el) => el.name === selectedRetailerName)[0]\n .value\n );\n }}\n />\n </div>\n )}\n\n {centreStoreList && this.buildCentreStoreList(centreStoreList)}\n <div className=\"form__container\">\n <FormInput\n title\n type=\"text\"\n placeholder=\"Please add a promotion name.\"\n label=\"Promotion Name\"\n value={formData.promotionName}\n required\n error={formError.promotionName}\n onInputChange={promotionName =>\n this.handleFormUpdate({ promotionName })\n }\n />\n </div>\n <div className=\"form-images-container\">\n <div className=\"hero-wrapper\">\n <div className=\"form-label\">\n Hero Image<span>*</span>\n </div>\n <ImageUpload\n type=\"hero\"\n labelOne=\"*Images must be a min of \"\n labelTwo=\"1920x1080 px \"\n labelThree=\"(16:9 ratio)\"\n placeholder={bitmap}\n error={formError.heroImage}\n value={formData.heroImage}\n handleFileUpload={(heroImage, errorMessage) =>\n this.handleFormUpdate({ heroImage })\n }\n />\n {/* <div className=\"form-subtext\">\n *Please do not use images that contain text\n </div> */}\n </div>\n <div className=\"thumbnail-wrapper\">\n <div className=\"form-label\">Thumbnail Image</div>\n <ImageUpload\n type=\"thumbnail\"\n labelOne=\"*Images must be a min of \"\n labelTwo=\"800x800 px \"\n labelThree=\"(1:1 ratio)\"\n placeholder={bitmap}\n error={formError.thumbnail}\n value={formData.thumbnail}\n handleFileUpload={(thumbnail, errorMessage) =>\n this.handleFormUpdate({ thumbnail })\n }\n />\n </div>\n </div>\n {/* <FormInput\n type=\"text\"\n placeholder=\"Please add a category tag.\"\n label=\"Category Tag\"\n value={formData.categoryTag}\n error={formError.categoryTag}\n onInputChange={categoryTag => this.handleFormUpdate({ categoryTag })}\n /> */}\n\n {categories && categories.length ? (\n <FormListbox\n label=\"Category\"\n id=\"LB_Cat\"\n required\n error={formError.selectedCategories}\n options={categories}\n field=\"selectedCategories\"\n selected={formData.selectedCategories}\n hint=\"Press [ctrl] + click to select multiple\"\n handleListbox={(id, field) => this.handleListbox(id, field)}\n handleSelect={(isSelect, field, options) =>\n this.handleSelect(isSelect, field, options)\n }\n />\n ) : (\n \"\"\n )}\n {holidays && holidays.length ? (\n <FormListbox\n label=\"Special Promotions\"\n id=\"LB_SH\"\n options={holidays}\n field=\"selectedSpecialPromotion\"\n selected={formData.selectedSpecialPromotion}\n hint=\"Press [ctrl] + click to select multiple\"\n handleListbox={(id, field) => this.handleListbox(id, field)}\n handleSelect={(isSelect, field) =>\n this.handleSelect(isSelect, field, holidays)\n }\n />\n ) : (\n \"\"\n )}\n\n <FormInputMultiple\n label=\"Subheading\"\n required\n value={formData.summary}\n maxLength={120}\n error={formError.summary}\n onInputChange={(summary) => this.handleFormUpdate({ summary })}\n />\n\n {type && type.toLowerCase().indexOf(\"offer\") !== -1 && (\n <FormInput\n type=\"text\"\n placeholder=\"E.g. 50% OFF\"\n label=\"Offer Highlight\"\n value={formData.offerHighlight}\n maxLength={7}\n onInputChange={(offerHighlight) =>\n this.handleFormUpdate({ offerHighlight })\n }\n />\n )}\n\n <div className={`form-group form__date--container\n ${(formError.startDate || formError.endDate) ? \"has-error\" : \"\"}\n `}>\n <div className=\"form__date--wrapper\">\n <FormDate\n required\n label=\"Start Date\"\n icon=\"calendar\"\n placeholderText=\"MM/DD/YYYY\"\n showTimeSelect\n timeCaption=\"Time\"\n timeFormat=\"HH:mm\"\n timeIntervals={5}\n dateFormat=\"d MMM yyyy - h:mmaa\"\n value={formData.startDate}\n error={formError.startDate}\n selected={formData.startDate && new Date(formData.startDate)}\n onChange={startDate => this.handleFormUpdate({ startDate })}\n />\n <div className=\"form__date--divider\"></div>\n <FormDate\n required\n label=\"End Date\"\n icon=\"calendar\"\n placeholderText=\"MM/DD/YYYY\"\n showTimeSelect\n timeCaption=\"Time\"\n timeFormat=\"HH:mm\"\n timeIntervals={5}\n dateFormat=\"d MMM yyyy - h:mmaa\"\n value={formData.endDate}\n error={formError.endDate}\n selected={formData.endDate && new Date(formData.endDate)}\n onChange={endDate => this.handleFormUpdate({ endDate })}\n />\n </div>\n <div className=\"form__hint\">*Maximum of 31 days(1 month)</div>\n {(formError.startDate || formError.endDate) &&\n <div className=\"form__validation-message\">\n {formError.startDate ? formError.startDate : formError.endDate ? formError.endDate : \"\"}\n </div>\n }\n </div>\n\n <FormInput\n type=\"text\"\n icon=\"calendar\"\n placeholder=\"E.g. Every Mondays\"\n label=\"Schedule\"\n value={formData.schedule}\n error={formError.schedule}\n onInputChange={(schedule) => this.handleFormUpdate({ schedule })}\n />\n\n <div style={{ display: \"flex\" }}>\n <FormInput\n type=\"text\"\n placeholder=\"HH:MM\"\n label=\"Duration\"\n icon=\"time\"\n value={formData.duration}\n onInputChange={(duration) => this.handleFormUpdate({ duration })}\n />\n\n <FormInput\n type=\"text\"\n placeholder=\"e.g. Number of seats\"\n label=\"Capacity\"\n icon=\"capacity\"\n value={formData.capacity}\n onInputChange={(capacity) => this.handleFormUpdate({ capacity })}\n />\n </div>\n\n <FormInput\n type=\"number\"\n icon=\"price\"\n placeholder=\"888.88\"\n label=\"Price\"\n currency\n value={formData.price}\n onInputChange={(price) => this.handleFormUpdate({ price })}\n />\n\n {componentReady && (\n <RichTextEditor\n required\n label={\"Description\"}\n initialValue={formData.description}\n error={formError.description}\n onInputChange={description =>\n this.handleFormUpdate({ description })\n }\n retailerId={this.state.retailerId}\n />\n )}\n\n <FormInput\n type=\"text\"\n placeholder=\"e.g. http://url-of-terms-and-conditions.com\"\n label=\"T&C Link\"\n value={formData.termsAndConditionsLink}\n onInputChange={(termsAndConditionsLink) =>\n this.handleFormUpdate({ termsAndConditionsLink })\n }\n />\n\n <FormInput\n type=\"text\"\n placeholder=\"e.g. Please see Terms and Conditions by clicking on the link below\"\n label=\"T&C Copy\"\n value={formData.termsAndConditionsCopy}\n onInputChange={(termsAndConditionsCopy) =>\n this.handleFormUpdate({ termsAndConditionsCopy })\n }\n />\n {/* {mode === \"edit\" && categories && ( */}\n\n {/* {categories && (\n <div className=\"form-linkcategories-container\">\n <div className=\"form-label\">Link Categories</div>\n <div className=\"category-list\">\n {categories.map((item, index) => {\n return (\n <FormCheckbox\n key={`checkboxId-${index}`}\n value={item.value}\n label={item.name}\n checked={\n formData.selectedCategories.indexOf(item.value) > -1\n }\n onCheckboxChange={value => this.handleInputCheckbox(value)}\n />\n );\n })}\n </div>\n </div>\n )} */}\n\n <div className=\"form-imagegallery-container\">\n <div className=\"form-label\">Image Gallery</div>\n <FormFile\n icon=\"plus\"\n label=\"Add Image\"\n // value={[{ name: \"sample.png\" }]}\n value={formData.imageGallery}\n handleAttachments={(imageGallery, errorMessage) =>\n this.handleFormUpdate({ imageGallery })\n }\n />\n </div>\n\n <div className=\"form-controls-container\">\n {mode === \"new\" && (\n <Button\n color=\"secondary\"\n onClick={() => (window.location.href = `${redirectUrl}`)}\n >\n CANCEL\n </Button>\n )}\n <Button\n size=\"medium\"\n color={mode === \"edit\" ? \"secondary\" : \"primary\"}\n onClick={() => this.validateForm()}\n >\n {mode === \"edit\" ? \"SAVE & PREVIEW\" : \"SAVE\"}\n </Button>\n {mode === \"edit\" && (\n <Button\n disabled={formData.itemId ? false : true}\n color=\"primary\"\n onClick={() => this.submitForm()}\n >\n SUBMIT\n </Button>\n )}\n </div>\n </div>\n );\n }\n}\n\nexport default FeatureRetailerPortalPromotions;\n","import React, { Component, Fragment } from \"react\";\r\n\r\n// Input [{name: value}]\r\n\r\nclass FormDropDown extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n show: false,\r\n selected: props.defaultSelected,\r\n };\r\n }\r\n\r\n handleToggle = (e) => {\r\n e.target.focus();\r\n this.setState({ show: !this.state.show });\r\n };\r\n\r\n handleBlur = () => {\r\n if (this.state.show) {\r\n setTimeout(() => {\r\n this.setState({ show: !this.state.show });\r\n }, 120);\r\n }\r\n };\r\n\r\n render() {\r\n const {\r\n theme,\r\n error,\r\n title,\r\n icon,\r\n options,\r\n placeholder,\r\n noOptionsMessage,\r\n } = this.props;\r\n const { selected, show } = this.state;\r\n return (\r\n <Fragment>\r\n <div className=\"form-dropdown-container\">\r\n {icon ? <i className={`icon icon-${icon}`} /> : \"\"}\r\n {title ? <div className=\"title\">{title}</div> : \"\"}\r\n <label\r\n className={`arrow ${theme ? theme : \"\"} ${error ? \"error\" : \"\"}`}\r\n >\r\n <div className=\"dropdown-placeholder\">\r\n <input\r\n type=\"button\"\r\n value={selected ? selected : placeholder}\r\n className=\"dropdown-btn\"\r\n onClick={(e) => this.handleToggle(e)}\r\n // onBlur={e => this.handleBlur(e)}\r\n />\r\n </div>\r\n <i className=\"icon icon-chevron-down\" />\r\n <ul className={`dropdown-list ${show ? \"\" : \"d-none\"}`}>\r\n {options && options.length ? (\r\n options.map((item, index) => {\r\n return (\r\n <li\r\n key={`optionId${index}`}\r\n onClick={() => {\r\n this.setState({ selected: item.name }, () => {\r\n this.props.handleSelectionChange(item.name);\r\n });\r\n }}\r\n >\r\n <span>{item.name}</span>\r\n </li>\r\n );\r\n })\r\n ) : (\r\n <li className=\"empty\">\r\n {noOptionsMessage ? noOptionsMessage : \"No store found\"}\r\n </li>\r\n )}\r\n </ul>\r\n </label>\r\n </div>\r\n </Fragment>\r\n );\r\n }\r\n}\r\n\r\nexport default FormDropDown;\r\n","import React from \"react\";\nimport axios from \"axios\";\nimport Loadable from \"react-loadable\";\nimport TagManager from \"react-gtm-module\";\nimport { TimePicker } from \"antd\";\nimport DropDown from \"../../../Base/DropDown\";\nimport ImageUpload from \"../../../Base/ImageUpload\";\nimport FormInput from \"../../../Base/FormInput\";\nimport FormDropDown from \"../../../Base/FormDropDown\";\nimport FormCheckbox from \"../../../Base/FormCheckbox\";\nimport FormFile from \"../../../Base/FormFile\";\nimport Button from \"../../../Base/Button\";\nimport { get } from \"lodash\";\nimport Modal from \"../../../Base/Modal\";\nimport { getStorefrontData } from \"../../../../api/StorefrontAPI\";\nimport bitmap from \"../../../../assets/icons/png/bitmap@3x.png\";\nimport { buildFormData } from \"../../../../helper/StorefrontHelper\";\nimport moment from \"moment\";\nimport \"antd/dist/antd.css\";\nimport {\n disableBodyScroll,\n enableBodyScroll,\n} from \"../../../../helper/ScrollHelper\";\n\nconst RichTextEditor = Loadable({\n loader: () => import(\"../../../Base/RichTextEditor\"),\n loading: () => null,\n});\n\nclass FeatureRetailerPortalStorefront extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n formData: {\n StoreID: \"\",\n Name: \"\",\n StorefrontDescription: \"\",\n ContactNumber: \"\",\n MenuUrl: \"\",\n OnlineBookingUrl: \"\",\n BestParking: \"\",\n AcceptsAfterPay: false,\n AcceptsGiftCards: false,\n IsKidsFriendly: false,\n IsVegetarian: false,\n RetailerName: \"\",\n RetailerDescription: \"\",\n Website: \"\",\n Instagram: \"\",\n Facebook: \"\",\n LogoImage: null,\n HeroImage: null,\n ImageGallery: [],\n ImageGalleryChecker: [],\n MondayOpeningHours: \"\",\n MondayClosingHours: \"\",\n MondaySecondaryOpeningHours: \"\",\n MondaySecondaryClosingHours: \"\",\n MondayIsClosed: \"\",\n TuesdayOpeningHours: \"\",\n TuesdayClosingHours: \"\",\n TuesdaySecondaryOpeningHours: \"\",\n TuesdaySecondaryClosingHours: \"\",\n TuesdayIsClosed: \"\",\n WednesdayOpeningHours: \"\",\n WednesdayClosingHours: \"\",\n WednesdaySecondaryOpeningHours: \"\",\n WednesdaySecondaryClosingHours: \"\",\n WednesdayIsClosed: \"\",\n ThursdayOpeningHours: \"\",\n ThursdayClosingHours: \"\",\n ThursdaySecondaryOpeningHours: \"\",\n ThursdaySecondaryClosingHours: \"\",\n ThursdayIsClosed: \"\",\n FridayOpeningHours: \"\",\n FridayClosingHours: \"\",\n FridaySecondaryOpeningHours: \"\",\n FridaySecondaryClosingHours: \"\",\n FridayIsClosed: \"\",\n SaturdayOpeningHours: \"\",\n SaturdayClosingHours: \"\",\n SaturdaySecondaryOpeningHours: \"\",\n SaturdaySecondaryClosingHours: \"\",\n SaturdayIsClosed: \"\",\n SundayOpeningHours: \"\",\n SundayClosingHours: \"\",\n SundaySecondaryOpeningHours: \"\",\n SundaySecondaryClosingHours: \"\",\n SundayIsClosed: \"\",\n StorefrontHeroImage: null,\n },\n StoreOpeningHours: \"\",\n RetailerType: \"\",\n formType: null,\n componentReady: false,\n selectedStoreName: \"Select a Store\",\n storeList: [],\n sourceList: [\n { name: \"Store\", value: \"Store\" },\n { name: \"Centre\", value: \"Centre\" },\n ],\n carparkList: null,\n iconList: null,\n selectedCarpark: \"Select an option\",\n selectedIcon: \"Select an option\",\n showModal: false,\n modalContent: null,\n };\n }\n\n componentDidMount() {\n const { Stores, CarParkList } = this.props.fields;\n let selectedStoreName = null;\n let filterResult = null;\n let selectedStoreId = null;\n if (typeof Storage !== \"undefined\") {\n selectedStoreId = sessionStorage.getItem(\"storeId\");\n }\n let storeList = this.setStoreList(Stores);\n let parkList = this.setCarparkList(CarParkList);\n if (selectedStoreId) {\n if (\n typeof Storage !== \"undefined\" &&\n sessionStorage.getItem(\"global\") === \"true\"\n ) {\n selectedStoreName = \"All\";\n selectedStoreId = \"\";\n storeList = \"\";\n } else {\n filterResult = storeList.filter((el) => el.value === selectedStoreId);\n selectedStoreName =\n filterResult && filterResult[0] && filterResult[0].name\n ? filterResult[0].name\n : null;\n }\n }\n\n this.setState(\n {\n componentReady: true,\n selectedStoreName: selectedStoreName\n ? selectedStoreName\n : this.state.selectedStoreName,\n storeList,\n carparkList: parkList,\n },\n () => {\n if (selectedStoreName) {\n this.getStoreData(selectedStoreId);\n }\n }\n );\n }\n\n onTimeChange = (time, timeString, day, info) => {\n let dateTime;\n if (timeString) {\n dateTime =\n moment().format(\"YYYYMMDDT\") +\n moment(timeString, [\"h:mm A\"])\n .format(\"HH:mm\")\n .replace(\":\", \"\") +\n \"00\";\n }\n this.handleFormUpdate({\n [day + info]: dateTime ? dateTime : null,\n });\n };\n\n resetHours = () => {\n this.setState({\n formData: {\n ...this.state.formData,\n MondayOpeningHours: null,\n MondayClosingHours: null,\n MondaySecondaryOpeningHours: null,\n MondaySecondaryClosingHours: null,\n TuesdayOpeningHours: null,\n TuesdayClosingHours: null,\n TuesdaySecondaryOpeningHours: null,\n TuesdaySecondaryClosingHours: null,\n WednesdayOpeningHours: null,\n WednesdayClosingHours: null,\n WednesdaySecondaryOpeningHours: null,\n WednesdaySecondaryClosingHours: null,\n ThursdayOpeningHours: null,\n ThursdayClosingHours: null,\n ThursdaySecondaryOpeningHours: null,\n ThursdaySecondaryClosingHours: null,\n FridayOpeningHours: null,\n FridayClosingHours: null,\n FridaySecondaryOpeningHours: null,\n FridaySecondaryClosingHours: null,\n SaturdayOpeningHours: null,\n SaturdayClosingHours: null,\n SaturdaySecondaryOpeningHours: null,\n SaturdaySecondaryClosingHours: null,\n SundayOpeningHours: null,\n SundayClosingHours: null,\n SundaySecondaryOpeningHours: null,\n SundaySecondaryClosingHours: null,\n },\n });\n };\n\n renderModal = () => {\n disableBodyScroll();\n const { title, body, cta } = this.state.modalContent;\n return (\n <Modal\n type=\"small\"\n title={title}\n show={() =>\n this.setState({ showModal: false, modalContent: null }, () =>\n enableBodyScroll()\n )\n }\n >\n <div className=\"\">{body}</div>\n {cta ? (\n <div className=\"cta\">\n <Button\n color=\"primary\"\n onClick={() => (window.location.href = cta.url)}\n >\n {cta.label}\n </Button>\n </div>\n ) : (\n \"\"\n )}\n </Modal>\n );\n };\n\n saveForm = async () => {\n const { formData } = this.state;\n var timezoneId = new Date().getTimezoneOffset();\n const url = \"/api/sitecore/store/SaveStorefrontData\";\n let data = buildFormData({ ...formData, timeZoneId: timezoneId });\n\n try {\n let response = await axios({\n method: \"POST\",\n url,\n data,\n params: {\n storeId: formData.StoreID,\n },\n config: { headers: { \"Content-Type\": \"multipart/form-data\" } },\n });\n if (response) {\n if (get(response.data, \"IsSuccess.value\", false)) {\n let successMessage = {\n title: \"Form Saved\",\n body: get(response.data, \"message.value\", \"Successful\"),\n };\n this.setState({\n showModal: true,\n modalContent: successMessage,\n });\n TagManager.dataLayer({\n dataLayer: {\n event: \"updateStoreInfo\",\n },\n dataLayerName: \"dataLayer\",\n });\n } else {\n let errorMessage = {\n title: \"Form Not Saved\",\n body: get(response.data, \"message.value\", \"Invalid response\"),\n };\n this.setState({\n showModal: true,\n modalContent: errorMessage,\n });\n }\n }\n } catch (e) {\n console.log(e.response.statusText);\n let successMessage = {\n title: \"Form Saved\",\n body: get(e.response.data, \"message.value\", \"Successful\"),\n };\n this.setState({\n showModal: true,\n modalContent: successMessage,\n });\n }\n };\n\n decodeHTML = (html) => {\n if (document) {\n var txt = document.createElement(\"textarea\");\n txt.innerHTML = html;\n return txt.value;\n }\n };\n\n getStoreData = async (storeId) => {\n let response = await getStorefrontData({ storeId });\n const $this = this;\n if (response.status === 200 && response.data) {\n const ImageGallery = get(response.data, \"ImageGallery\", []);\n this.setState({\n formData: {\n Name: get(response.data, \"Name.value\", null),\n StorefrontDescription: $this.decodeHTML(\n get(response.data, \"Description.value\", \"\")\n ),\n ContactNumber: get(response.data, \"ContactNumber.value\", \"\"),\n MenuUrl: get(response.data, \"MenuUrl.value\", \"\"),\n OnlineBookingUrl: get(response.data, \"OnlineBookingUrl.value\", \"\"),\n BestParking: get(response.data, \"BestParking.value\", \"\"),\n AcceptsAfterPay: get(response.data, \"AcceptsAfterPay.value\", false),\n AcceptsGiftCards: get(response.data, \"AcceptsGiftCards.value\", false),\n IsKidsFriendly: get(response.data, \"IsKidsFriendly.value\", false),\n IsVegetarian: get(response.data, \"IsVegetarian.value\", false),\n RetailerName: get(response.data, \"RetailerDetails.Name.value\", null),\n RetailerDescription: $this.decodeHTML(\n get(response.data, \"RetailerDetails.Description.value\", \"\")\n ),\n Website: get(response.data, \"RetailerDetails.Website.value\", null),\n Instagram: get(\n response.data,\n \"RetailerDetails.Instagram.value\",\n null\n ),\n Facebook: get(response.data, \"RetailerDetails.Facebook.value\", null),\n LogoImage: get(\n response.data,\n \"RetailerDetails.LogoImage.value.src\",\n null\n ),\n HeroImage: get(\n response.data,\n \"RetailerDetails.HeroImage.value.src\",\n null\n ),\n StorefrontHeroImage: get(\n response.data,\n \"StorefrontHeroImage.value.src\",\n null\n ),\n ImageGalleryChecker: ImageGallery\n ? ImageGallery.map((el) => el.Id.value)\n : [],\n ImageGallery: ImageGallery\n ? ImageGallery.map((el) => {\n return {\n name: el.Name.value,\n id: el.Id.value,\n src: el.Src.value,\n };\n })\n : [],\n StoreID: get(response.data, \"StoreID.value\", null),\n IsTemporarilyClosed: get(\n response.data,\n \"IsTemporarilyClosed.value\",\n null\n ),\n IsOpeningSoon: get(response.data, \"IsTemporarilyClosed.value\", null)\n ? false\n : get(response.data, \"IsOpeningSoon.value\", null),\n Source: get(response.data, \"Source.value\", null),\n MondayOpeningHours: get(\n response.data,\n \"StoreOpeningHours.MondayOpeningHours.value\",\n null\n ),\n MondayClosingHours: get(\n response.data,\n \"StoreOpeningHours.MondayClosingHours.value\",\n null\n ),\n MondaySecondaryOpeningHours: get(\n response.data,\n \"StoreOpeningHours.MondaySecondaryOpeningHours.value\",\n null\n ),\n MondaySecondaryClosingHours: get(\n response.data,\n \"StoreOpeningHours.MondaySecondaryClosingHours.value\",\n null\n ),\n MondayIsClosed: get(\n response.data,\n \"StoreOpeningHours.MondayIsClosed.value\",\n null\n ),\n TuesdayOpeningHours: get(\n response.data,\n \"StoreOpeningHours.TuesdayOpeningHours.value\",\n null\n ),\n TuesdayClosingHours: get(\n response.data,\n \"StoreOpeningHours.TuesdayClosingHours.value\",\n null\n ),\n TuesdaySecondaryOpeningHours: get(\n response.data,\n \"StoreOpeningHours.TuesdaySecondaryOpeningHours.value\",\n null\n ),\n TuesdaySecondaryClosingHours: get(\n response.data,\n \"StoreOpeningHours.TuesdaySecondaryClosingHours.value\",\n null\n ),\n TuesdayIsClosed: get(\n response.data,\n \"StoreOpeningHours.TuesdayIsClosed.value\",\n null\n ),\n WednesdayOpeningHours: get(\n response.data,\n \"StoreOpeningHours.WednesdayOpeningHours.value\",\n null\n ),\n WednesdayClosingHours: get(\n response.data,\n \"StoreOpeningHours.WednesdayClosingHours.value\",\n null\n ),\n WednesdaySecondaryOpeningHours: get(\n response.data,\n \"StoreOpeningHours.WednesdaySecondaryOpeningHours.value\",\n null\n ),\n WednesdaySecondaryClosingHours: get(\n response.data,\n \"StoreOpeningHours.WednesdaySecondaryClosingHours.value\",\n null\n ),\n WednesdayIsClosed: get(\n response.data,\n \"StoreOpeningHours.WednesdayIsClosed.value\",\n null\n ),\n ThursdayOpeningHours: get(\n response.data,\n \"StoreOpeningHours.ThursdayOpeningHours.value\",\n null\n ),\n ThursdayClosingHours: get(\n response.data,\n \"StoreOpeningHours.ThursdayClosingHours.value\",\n null\n ),\n ThursdaySecondaryOpeningHours: get(\n response.data,\n \"StoreOpeningHours.ThursdaySecondaryOpeningHours.value\",\n null\n ),\n ThursdaySecondaryClosingHours: get(\n response.data,\n \"StoreOpeningHours.ThursdaySecondaryClosingHours.value\",\n null\n ),\n ThursdayIsClosed: get(\n response.data,\n \"StoreOpeningHours.ThursdayIsClosed.value\",\n null\n ),\n FridayOpeningHours: get(\n response.data,\n \"StoreOpeningHours.FridayOpeningHours.value\",\n null\n ),\n FridayClosingHours: get(\n response.data,\n \"StoreOpeningHours.FridayClosingHours.value\",\n null\n ),\n FridaySecondaryOpeningHours: get(\n response.data,\n \"StoreOpeningHours.FridaySecondaryOpeningHours.value\",\n null\n ),\n FridaySecondaryClosingHours: get(\n response.data,\n \"StoreOpeningHours.FridaySecondaryClosingHours.value\",\n null\n ),\n FridayIsClosed: get(\n response.data,\n \"StoreOpeningHours.FridayIsClosed.value\",\n null\n ),\n SaturdayOpeningHours: get(\n response.data,\n \"StoreOpeningHours.SaturdayOpeningHours.value\",\n null\n ),\n SaturdayClosingHours: get(\n response.data,\n \"StoreOpeningHours.SaturdayClosingHours.value\",\n null\n ),\n SaturdaySecondaryOpeningHours: get(\n response.data,\n \"StoreOpeningHours.SaturdaySecondaryOpeningHours.value\",\n null\n ),\n SaturdaySecondaryClosingHours: get(\n response.data,\n \"StoreOpeningHours.SaturdaySecondaryClosingHours.value\",\n null\n ),\n SaturdayIsClosed: get(\n response.data,\n \"StoreOpeningHours.SaturdayIsClosed.value\",\n null\n ),\n SundayOpeningHours: get(\n response.data,\n \"StoreOpeningHours.SundayOpeningHours.value\",\n null\n ),\n SundayClosingHours: get(\n response.data,\n \"StoreOpeningHours.SundayClosingHours.value\",\n null\n ),\n SundaySecondaryOpeningHours: get(\n response.data,\n \"StoreOpeningHours.SundaySecondaryOpeningHours.value\",\n null\n ),\n SundaySecondaryClosingHours: get(\n response.data,\n \"StoreOpeningHours.SundaySecondaryClosingHours.value\",\n null\n ),\n SundayIsClosed: get(\n response.data,\n \"StoreOpeningHours.SundayIsClosed.value\",\n null\n ),\n },\n RetailerType: get(\n response.data,\n \"RetailerDetails.RetailerType.value\",\n \"\"\n ),\n formType:\n storeId === \"\"\n ? \"\"\n : get(response.data, \"RetailerDetails.RetailerType.value\", \"\"),\n });\n } else {\n alert(\"Getting store data failed\");\n }\n };\n\n setStoreList = (list) => {\n let temp = [];\n list.forEach((el) =>\n temp.push({\n name: el.fields.StoreName.value,\n value: el.fields.StoreItemId.value,\n })\n );\n return temp;\n };\n\n setCarparkList = (list) => {\n let temp = [];\n list.forEach((el) =>\n temp.push({\n name: el.fields.CarParkName.value,\n value: el.fields.CarParkId.value,\n })\n );\n return temp;\n };\n\n handleFormUpdate = (value) => {\n this.setState({\n formData: {\n ...this.state.formData,\n ...value,\n },\n });\n };\n\n setDropdownValue = (value, options) => {\n if (value && options && options.length) {\n return options.filter((el) => el.value === value)[0].name;\n } else return null;\n };\n\n render() {\n const {\n formData,\n formType,\n componentReady,\n selectedStoreName,\n storeList,\n sourceList,\n carparkList,\n iconList,\n showModal,\n } = this.state;\n const days = [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n ];\n return (\n <div className=\"storefront-container\">\n {showModal && this.renderModal()}\n <div className=\"body-section-title\">Update Storefront</div>\n {storeList && storeList.length && storeList.length > 1 && (\n <div className=\"form-type-wrapper\">\n <DropDown\n theme=\"light\"\n options={storeList}\n defaultSelected={selectedStoreName}\n handleSelectionChange={(selectedStoreName) => {\n const selectedStoreId = storeList.filter(\n (el) => el.name === selectedStoreName\n )[0].value;\n this.getStoreData(selectedStoreId);\n }}\n />\n </div>\n )}\n {/*---------------- global retailer info ----------------*/}\n {formType === \"\" && (\n <div className=\"global-retailer-info\">\n <div className=\"form-images-container\">\n <div className=\"thumbnail-wrapper\">\n <div className=\"form-label\">Retailer Logo</div>\n <ImageUpload\n type=\"retailer\"\n labelOne=\"*Images must be a min of \"\n labelTwo=\"800x800 px \"\n labelThree=\"(1:1 ratio)\"\n placeholder={bitmap}\n value={formData.LogoImage}\n handleFileUpload={(LogoImage, errorMessage) => {\n this.handleFormUpdate({ LogoImage });\n }}\n />\n </div>\n <div className=\"hero-wrapper\">\n <div className=\"form-label\">Header Image</div>\n <ImageUpload\n type=\"hero\"\n labelOne=\"*Images must be a min of \"\n labelTwo=\"1920x1080 px \"\n labelThree=\"(16:9 ratio)\"\n placeholder={bitmap}\n value={formData.HeroImage}\n handleFileUpload={(HeroImage, errorMessage) => {\n this.handleFormUpdate({ HeroImage });\n }}\n />\n </div>\n </div>\n <FormInput\n type=\"text\"\n placeholder=\"Type retailer Name.\"\n label=\"Retailer Name\"\n value={formData.RetailerName}\n onInputChange={(RetailerName) => {\n this.handleFormUpdate({ RetailerName });\n }}\n />\n {componentReady && (\n <RichTextEditor\n label={\"Retailer Description\"}\n initialValue={formData.RetailerDescription}\n onInputChange={(RetailerDescription) => {\n this.handleFormUpdate({ RetailerDescription });\n }}\n />\n )}\n </div>\n )}\n {(formType === \"Retail\" || formType === \"Food\") && (\n <div className=\"global-retailer-info\">\n <div className=\"form-images-container\">\n <div className=\"hero-wrapper\">\n <div className=\"form-label\">Header Image</div>\n <ImageUpload\n type=\"hero\"\n labelOne=\"*Images must be a min of \"\n labelTwo=\"1920x1080 px \"\n labelThree=\"(16:9 ratio)\"\n placeholder={bitmap}\n value={formData.StorefrontHeroImage}\n handleFileUpload={(StorefrontHeroImage) => {\n this.handleFormUpdate({ StorefrontHeroImage });\n }}\n removeImage\n />\n </div>\n </div>\n </div>\n )}\n {(formType === \"Retail\" || formType === \"Food\") && (\n <div className=\"store-info\">\n <FormInput\n type=\"text\"\n placeholder=\"Type store Name.\"\n label=\"Store Name\"\n value={formData.Name}\n onInputChange={(Name) => {\n this.handleFormUpdate({ Name });\n }}\n />\n {componentReady && (\n <RichTextEditor\n label={\"Retailer Description\"}\n checkIfBlank={true}\n initialValue={formData.StorefrontDescription}\n onInputChange={(StorefrontDescription) => {\n this.handleFormUpdate({ StorefrontDescription });\n }}\n />\n )}\n </div>\n )}\n {/*---------------- common info ----------------*/}\n {(formType === \"\" || formType === \"Retail\" || formType === \"Food\") && (\n <div className=\"common-retailer-info\">\n <FormInput\n type=\"text\"\n icon=\"website\"\n placeholder=\"Insert link (e.g. http://...)\"\n label=\"Website\"\n value={formData.Website}\n onInputChange={(Website) => {\n this.handleFormUpdate({ Website });\n }}\n />\n <FormInput\n type=\"text\"\n icon=\"instagram\"\n placeholder=\"http://instagram.com\"\n label=\"Instagram\"\n value={formData.Instagram}\n onInputChange={(Instagram) => {\n this.handleFormUpdate({ Instagram });\n }}\n />\n <FormInput\n type=\"text\"\n icon=\"facebook\"\n placeholder=\"http://facebook.com\"\n label=\"Facebook\"\n value={formData.Facebook}\n onInputChange={(Facebook) => {\n this.handleFormUpdate({ Facebook });\n }}\n />\n </div>\n )}\n {/*---------------- store info ----------------*/}\n {(formType === \"Retail\" || formType === \"Food\") && (\n <div>\n <div className=\"store-contact-section\">\n <FormInput\n type=\"text\"\n icon=\"contact-details\"\n placeholder=\"(88) 888-8888\"\n label=\"Contact Details\"\n value={formData.ContactNumber}\n onInputChange={(ContactNumber) =>\n this.handleFormUpdate({ ContactNumber })\n }\n />\n {formType === \"Food\" && (\n <FormInput\n type=\"text\"\n icon=\"view-menu\"\n placeholder=\"e.g. http://view-menu.com\"\n label=\"View Menu (URL)\"\n value={formData.MenuUrl}\n onInputChange={(MenuUrl) =>\n this.handleFormUpdate({ MenuUrl })\n }\n />\n )}\n <FormInput\n type=\"text\"\n icon=\"calendar\"\n placeholder=\"e.g. http://online-booking.com\"\n label=\"Online Booking (URL)\"\n value={formData.OnlineBookingUrl}\n onInputChange={(OnlineBookingUrl) =>\n this.handleFormUpdate({ OnlineBookingUrl })\n }\n />\n </div>\n <div className=\"best-parking\">\n <div className=\"form-label\">Best Parking</div>\n <FormDropDown\n theme=\"light\"\n placeholder=\"Select a car park\"\n noOptionsMessage=\"No car park found\"\n options={carparkList}\n defaultSelected={this.setDropdownValue(\n formData.BestParking,\n carparkList\n )}\n handleSelectionChange={(selectedBestParking) => {\n const BestParking = carparkList.filter(\n (el) => el.name === selectedBestParking\n )[0].value;\n this.handleFormUpdate({ BestParking });\n }}\n />\n </div>\n\n <div>\n <div className=\"form-label\">Other</div>\n {formType === \"Food\" && (\n <div className=\"category-list food-retailer\">\n <FormCheckbox\n value={\"\"}\n label={\"Vegetarian\"}\n icon=\"vegetarian\"\n checked={formData.IsVegetarian}\n onCheckboxChange={(value, IsVegetarian) =>\n this.handleFormUpdate({ IsVegetarian })\n }\n />\n <FormCheckbox\n value={\"\"}\n label={\"Kids-Friendly\"}\n icon=\"kids-friendly\"\n checked={formData.IsKidsFriendly}\n onCheckboxChange={(value, IsKidsFriendly) =>\n this.handleFormUpdate({ IsKidsFriendly })\n }\n />\n <FormCheckbox\n value={\"\"}\n label={\"Gift Cards\"}\n icon=\"gift-cards\"\n checked={formData.AcceptsGiftCards}\n onCheckboxChange={(value, AcceptsGiftCards) =>\n this.handleFormUpdate({ AcceptsGiftCards })\n }\n />\n </div>\n )}\n {formType === \"Retail\" && (\n <div className=\"category-list\">\n <FormCheckbox\n label={\"Afterpay\"}\n icon=\"afterpay\"\n checked={formData.AcceptsAfterPay}\n onCheckboxChange={(value, AcceptsAfterPay) =>\n this.handleFormUpdate({ AcceptsAfterPay })\n }\n />\n <FormCheckbox\n value={\"\"}\n label={\"Gift Cards\"}\n icon=\"gift-cards\"\n checked={formData.AcceptsGiftCards}\n onCheckboxChange={(value, AcceptsGiftCards) =>\n this.handleFormUpdate({ AcceptsGiftCards })\n }\n />\n </div>\n )}\n </div>\n <div className=\"form-openinghours-container\">\n <div className=\"form-label\">Opening hours</div>\n <FormCheckbox\n value={\"\"}\n label=\"Opening soon\"\n checked={formData.IsOpeningSoon}\n onCheckboxChange={(value, IsOpeningSoon) =>\n this.handleFormUpdate({ IsOpeningSoon })\n }\n disabled={formData.IsTemporarilyClosed}\n />\n <FormCheckbox\n value={\"\"}\n label=\"Temporarily closed\"\n checked={formData.IsTemporarilyClosed}\n onCheckboxChange={(value, IsTemporarilyClosed) =>\n this.handleFormUpdate({ IsTemporarilyClosed })\n }\n disabled={formData.IsOpeningSoon}\n />\n <div className=\"form-sub-label\">Source</div>\n <DropDown\n theme=\"light\"\n options={sourceList}\n defaultSelected={formData.Source}\n handleSelectionChange={(selectedSourceName) => {\n const Source = sourceList.filter(\n (el) => el.name === selectedSourceName\n )[0].value;\n this.handleFormUpdate({ Source });\n }}\n />\n {formData && formData.Source && formData.Source === \"Store\" ? (\n <div className=\"storehours-container\">\n <div className=\"form-sub-header\">\n <div className=\"form-sub-label\">Update store hours</div>\n <div\n className=\"form-sub-label-right\"\n onClick={() => this.resetHours()}\n >\n Reset hours\n </div>\n </div>\n <div className=\"hours-table\">\n <div className=\"row\">\n <div className=\"col-3\">DAY</div>\n <div className=\"col-4\">OPENING HOURS</div>\n <div className=\"col-4\">SECONDARY HOURS</div>\n <div className=\"col-1\">CLOSED</div>\n </div>\n {days.map((day, index) => {\n let newInfo = [];\n const infoList = [\n \"OpeningHours\",\n \"ClosingHours\",\n \"SecondaryOpeningHours\",\n \"SecondaryClosingHours\",\n \"IsClosed\",\n ];\n infoList.map((info) => {\n newInfo.push(formData[day + info]);\n });\n const primaryOpeningHour = newInfo[0];\n const primaryClosingHour = newInfo[1];\n const secondaryOpeningHour = newInfo[2];\n const secondaryClosingHour = newInfo[3];\n const closed = newInfo[4];\n return (\n <div className=\"row\" key={`StoreOpeningHours${index}`}>\n <div className=\"col-3\">{day}</div>\n <div className=\"col-4\">\n <TimePicker\n use12Hours\n format=\"h:mm A\"\n size=\"large\"\n allowClear={false}\n value={\n primaryOpeningHour\n ? moment(primaryOpeningHour)\n : null\n }\n onChange={(time, timeString) =>\n this.onTimeChange(\n time,\n timeString,\n day,\n infoList[0]\n )\n }\n suffixIcon={\n <i className=\"icon icon-outlined-chevron-down\" />\n }\n placeholder=\"Not set\"\n />\n <TimePicker\n use12Hours\n format=\"h:mm A\"\n size=\"large\"\n allowClear={false}\n value={\n primaryClosingHour\n ? moment(primaryClosingHour)\n : null\n }\n onChange={(time, timeString) =>\n this.onTimeChange(\n time,\n timeString,\n day,\n infoList[1]\n )\n }\n suffixIcon={\n <i className=\"icon icon-outlined-chevron-down\" />\n }\n placeholder=\"Not set\"\n />\n </div>\n <div className=\"col-4\">\n <TimePicker\n use12Hours\n format=\"h:mm A\"\n size=\"large\"\n allowClear={false}\n value={\n secondaryOpeningHour\n ? moment(secondaryOpeningHour)\n : null\n }\n onChange={(time, timeString) =>\n this.onTimeChange(\n time,\n timeString,\n day,\n infoList[2]\n )\n }\n suffixIcon={\n <i className=\"icon icon-outlined-chevron-down\" />\n }\n placeholder=\"Not set\"\n />\n <TimePicker\n use12Hours\n format=\"h:mm A\"\n size=\"large\"\n allowClear={false}\n value={\n secondaryClosingHour\n ? moment(secondaryClosingHour)\n : null\n }\n onChange={(time, timeString) =>\n this.onTimeChange(\n time,\n timeString,\n day,\n infoList[3]\n )\n }\n suffixIcon={\n <i className=\"icon icon-outlined-chevron-down\" />\n }\n placeholder=\"Not set\"\n />\n </div>\n <div className=\"col-1\">\n <FormCheckbox\n checked={closed}\n onCheckboxChange={(value, isClosed) =>\n this.handleFormUpdate({\n [day + infoList[4]]: isClosed,\n })\n }\n />\n </div>\n </div>\n );\n })}\n </div>\n <div className=\"hint\">\n <i className=\"icon icon-outlined-info\" />\n <div>\n <span>Secondary hours</span>\n <span>\n : The retailer will open and close twice in a single day\n (eg restaurants: Sunday 9am - 12pm, 4pm - 6pm)\n </span>\n </div>\n </div>\n </div>\n ) : (\n \"\"\n )}\n </div>\n <div className=\"form-imagegallery-container\">\n <div className=\"form-label\">Image gallery</div>\n <FormFile\n icon=\"plus\"\n label=\"Add Image\"\n value={formData.ImageGallery}\n handleAttachments={(ImageGallery, errorMessage) =>\n this.handleFormUpdate({ ImageGallery })\n }\n />\n </div>\n </div>\n )}\n {/*---------------- form controls ----------------*/}\n {formType !== null && (\n <div className=\"form-controls-container\">\n <Button\n color=\"secondary\"\n onClick={() => (window.location.href = `/stores`)}\n >\n CANCEL\n </Button>\n <Button\n disable={false}\n color=\"primary\"\n onClick={() => this.saveForm()}\n >\n SAVE\n </Button>\n </div>\n )}\n </div>\n );\n }\n}\nexport default FeatureRetailerPortalStorefront;\n","import React, { Component } from \"react\";\r\nimport { Text } from \"@sitecore-jss/sitecore-jss-react\";\r\nimport DefaultUserLogo from \"../../../../../assets/icons/png/author.png\";\r\nimport logoPlaceholder from \"../../../../../assets/img/logoPlaceholder.png\";\r\n\r\nclass NavInfo extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n show: false,\r\n breakpoint: null,\r\n };\r\n }\r\n componentDidMount() {\r\n this.setState({ breakpoint: window.outerWidth });\r\n this.handleResize();\r\n window.addEventListener(\"resize\", this.handleResize);\r\n }\r\n\r\n componentWillUnmount() {\r\n document.removeEventListener(\"mousedown\", this.handleClick, false);\r\n }\r\n\r\n handleResize = () => {\r\n const { breakpoint } = this.state;\r\n if (\r\n (window.outerWidth < 992 && breakpoint < 992) ||\r\n (window.outerWidth >= 992 && breakpoint >= 992)\r\n ) {\r\n } else {\r\n this.handleBlur();\r\n }\r\n\r\n if (window && window.outerWidth >= 992) {\r\n document.addEventListener(\"mousedown\", this.handleClick, false);\r\n } else {\r\n document.removeEventListener(\"mousedown\", this.handleClick, false);\r\n }\r\n };\r\n\r\n handleClick = (e) => {\r\n if (this.state.show) {\r\n if (this.node.contains(e.target)) {\r\n return;\r\n } else {\r\n this.handleBlur();\r\n }\r\n }\r\n };\r\n\r\n handleBlur = () => {\r\n setTimeout(() => {\r\n this.setState({ show: false });\r\n }, 120);\r\n };\r\n\r\n render() {\r\n const { UserName: name = null, UserPicture: thumbnail = null } =\r\n this.props.data || {};\r\n const options = [\"Your profile\", \"Logout\"];\r\n const { show } = this.state;\r\n return (\r\n <div className=\"nav-user-wrapper\" ref={(node) => (this.node = node)}>\r\n <div\r\n className=\"user-wrapper\"\r\n onClick={() => this.setState({ show: !show })}\r\n >\r\n <div className=\"user-thumbnail\">\r\n {thumbnail && thumbnail.value && thumbnail.value.src ? (\r\n <img\r\n alt=\"icon\"\r\n src={logoPlaceholder}\r\n data-src={thumbnail.value.src}\r\n className=\"lazyload\"\r\n />\r\n ) : (\r\n <img src={DefaultUserLogo} alt=\"retailer\" />\r\n )}\r\n </div>\r\n <div className=\"user-name\">\r\n Hey, <Text field={name} />\r\n </div>\r\n <div className=\"edit-profile\">\r\n <i className=\"icon icon-chevron-down-small\" />\r\n <i className=\"icon icon-chevron-outline-right\" />\r\n </div>\r\n </div>\r\n {show && (\r\n <ul className=\"dropdown-list\">\r\n <li\r\n className=\"nav-back\"\r\n id={show ? \"nav-mobile-back\" : \"\"}\r\n onClick={() => this.handleBlur()}\r\n >\r\n <i className=\"icon icon-chevron-outline-left\" />\r\n Back\r\n </li>\r\n <li className=\"nav-name\">\r\n <div>\r\n <div className=\"user-thumbnail\">\r\n {thumbnail && thumbnail.value && thumbnail.value.src ? (\r\n <img\r\n alt=\"icon\"\r\n src={logoPlaceholder}\r\n data-src={thumbnail.value.src}\r\n className=\"lazyload\"\r\n />\r\n ) : (\r\n <img src={DefaultUserLogo} alt=\"retailer\" />\r\n )}\r\n </div>\r\n <div className=\"user-name\">\r\n Hey, <Text field={name} />\r\n </div>\r\n </div>\r\n </li>\r\n {options.map((item, index) => {\r\n return (\r\n <React.Fragment key={`navUserId${index}`}>\r\n {index === options.length - 1 && (\r\n <div className=\"last-option-border\" />\r\n )}\r\n <li\r\n onClick={() => {\r\n this.setState({ show: false });\r\n this.props.optionSelected(item);\r\n }}\r\n >\r\n <i\r\n className={`icon icon-${\r\n index === 0 ? \"user\" : \"log-out\"\r\n }`}\r\n />\r\n <span>{item}</span>\r\n </li>\r\n </React.Fragment>\r\n );\r\n })}\r\n </ul>\r\n )}\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default NavInfo;\r\n","import React from \"react\";\r\n\r\nclass NavLogo extends React.Component {\r\n closeNav = () => {\r\n const leftNavWrapper = document.querySelector(\".left-nav\");\r\n const topNavWrapper = document.querySelector(\".top-nav .top-nav-wrapper\");\r\n const backButton = document.querySelector(\"#nav-mobile-back\");\r\n if (leftNavWrapper && topNavWrapper) {\r\n leftNavWrapper.classList.remove(\"show-nav-mobile\");\r\n topNavWrapper.classList.remove(\"show-nav-mobile\");\r\n }\r\n if (backButton) {\r\n backButton.click();\r\n }\r\n };\r\n\r\n render() {\r\n const { LogoLink = null } = this.props.data || {};\r\n return (\r\n <div className=\"nav-logo-wrapper\">\r\n {LogoLink && LogoLink.value ? (\r\n <a {...LogoLink.value}>\r\n <i className=\"icon icon-townsquare\" />\r\n </a>\r\n ) : (\r\n <i className=\"icon icon-townsquare\" />\r\n )}\r\n <i className=\"icon icon-close\" onClick={() => this.closeNav()} />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default NavLogo;\r\n","import React, { Component, Fragment } from \"react\";\nimport { Text } from \"@sitecore-jss/sitecore-jss-react\";\nimport TagManager from \"react-gtm-module\";\nimport axios from \"axios\";\nimport { getNavRetailerList } from \"../../../../../api/NavigationAPI\";\nimport logoPlaceholder from \"../../../../../assets/img/logoPlaceholder.png\";\n\nclass NavRetailer extends Component {\n constructor(props) {\n super(props);\n this.state = {\n selectedRetailer: null,\n retailersList: [],\n newNotif: null,\n show: false,\n removeShowAll: false,\n breakpoint: null,\n };\n }\n\n componentDidMount() {\n this.getRetailerList();\n this.setState({ breakpoint: window.outerWidth });\n this.handleResize();\n window.addEventListener(\"resize\", this.handleResize);\n }\n componentDidUpdate() {\n this.handleDropdown();\n }\n componentWillUnmount() {\n document.removeEventListener(\"mousedown\", this.handleClick, false);\n }\n\n handleResize = () => {\n const { breakpoint } = this.state;\n if (\n (window.outerWidth < 992 && breakpoint < 992) ||\n (window.outerWidth >= 992 && breakpoint >= 992)\n ) {\n } else {\n this.handleBlur();\n }\n\n if (window && window.outerWidth >= 992) {\n document.addEventListener(\"mousedown\", this.handleClick, false);\n } else {\n document.removeEventListener(\"mousedown\", this.handleClick, false);\n }\n };\n\n handleDropdown = () => {\n if (window && window.outerWidth >= 992) {\n const { retailersList, removeShowAll } = this.state;\n let sum = 0;\n if (\n retailersList &&\n retailersList.length &&\n retailersList.length > 1 &&\n document\n ) {\n const showAll = retailersList.length > 3 ? true : false;\n const initialList = document.querySelectorAll(\n \".nav-retailers-wrapper li\"\n );\n if (showAll) {\n sum =\n initialList[0].offsetHeight +\n initialList[1].offsetHeight +\n initialList[2].offsetHeight;\n }\n document.querySelector(\n \".nav-retailers-wrapper .dropdown-list .options\"\n ).style.maxHeight = showAll\n ? removeShowAll\n ? \"22rem\"\n : sum + \"px\"\n : \"fit-content\";\n }\n } else {\n const nav = document.querySelector(\n \".nav-retailers-wrapper .dropdown-list .options\"\n );\n if (nav) {\n nav.style.maxHeight = \"fit-content\";\n }\n }\n };\n\n handleClick = (e) => {\n if (this.state.show) {\n if (this.node.contains(e.target)) {\n return;\n } else {\n this.handleBlur();\n }\n }\n };\n\n handleBlur = () => {\n setTimeout(() => {\n this.setState({ show: false });\n }, 120);\n };\n\n getRetailerList = async () => {\n const { RetailerName = null } = this.props.data || {};\n let retailerList = [];\n let selectedRetailer;\n try {\n const response = await getNavRetailerList();\n if (response && response.data && response.data.Retailers) {\n response.data.Retailers.map((retailer) => {\n const {\n RetailerId: id = null,\n RetailerName: name = null,\n RetailerLogo: logo = null,\n } = retailer;\n if (RetailerName && RetailerName.value == name.value) {\n selectedRetailer = {\n value: id.value,\n label: name.value,\n logo: logo && logo.value ? logo.value : null,\n };\n }\n retailerList.push({\n value: id.value,\n label: name.value,\n logo: logo && logo.value ? logo.value : null,\n });\n });\n\n this.setGoogleTagmanager(RetailerName);\n\n this.setState({\n selectedRetailer: selectedRetailer,\n retailersList: retailerList,\n });\n }\n } catch (e) {\n console.error(\n \"getNavRetailerList Error: \" + e && e.response && e.response.statusText\n );\n }\n };\n\n setGoogleTagmanager = (retailerName) => {\n if (\n document &&\n document.referrer &&\n document.referrer.toLowerCase().indexOf(\"/home/login\") !== -1\n ) {\n const retailer = (retailerName && retailerName.value) || \"Administrator\";\n\n TagManager.dataLayer({\n dataLayer: {\n event: \"loginRetailerInfo\",\n loginRetailer: retailer,\n },\n dataLayerName: \"dataLayer\",\n });\n\n const centre = sessionStorage.getItem(\"RPCentreList\");\n if (centre) {\n if (centre.indexOf(\",\") !== -1) {\n centre.split(\",\").map((item) => {\n TagManager.dataLayer({\n dataLayer: {\n event: \"loginCentreInfo\",\n loginCentre: item,\n loginRetailer: retailer,\n },\n dataLayerName: \"dataLayer\",\n });\n });\n } else {\n TagManager.dataLayer({\n dataLayer: {\n event: \"loginCentreInfo\",\n loginCentre: centre,\n loginRetailer: retailer,\n },\n dataLayerName: \"dataLayer\",\n });\n }\n }\n }\n };\n\n handleSwitchRetailer = async (retailer) => {\n const url = \"/api/sitecore/account/SwitchRetailer\";\n const data = {\n retailerId: retailer.value,\n };\n\n const { selectedRetailer } = this.state;\n\n TagManager.dataLayer({\n dataLayer: {\n prevRetailer:\n selectedRetailer && selectedRetailer.label\n ? selectedRetailer.label\n : \"No previous retailer\",\n newRetailer: retailer.label,\n },\n dataLayerName: \"dataLayer\",\n });\n\n try {\n let response = await axios({\n method: \"POST\",\n url,\n data,\n });\n\n if (response) {\n if (response.data.IsSuccess.value) {\n TagManager.dataLayer({\n dataLayer: {\n event: \"switchedRetailer\",\n },\n dataLayerName: \"dataLayer\",\n });\n window.location.reload(true);\n return false;\n }\n }\n } catch (e) {\n if (e && e.response && e.response.statusText) {\n console.error(\"Nav Retailer Error: \" + e.response.statusText);\n } else console.log(e);\n }\n };\n\n render() {\n const { selectedRetailer, removeShowAll, retailersList, show } = this.state;\n const { RetailerName, RetailerLogo } = this.props.data;\n const isSingleRetailer =\n retailersList && retailersList.length && retailersList.length === 1\n ? true\n : false;\n const hasOptions =\n retailersList && retailersList.length && retailersList.length > 1\n ? true\n : false;\n const showAll = hasOptions && retailersList.length > 3 ? true : false;\n return (\n <div className=\"nav-retailer-wrapper\">\n {retailersList && retailersList.length ? (\n <div\n className={`nav-retailers-wrapper ${\n hasOptions ? \"has-options\" : \"\"\n }`}\n ref={(node) => (this.node = node)}\n >\n <div\n className=\"retailers-wrapper\"\n onClick={() => hasOptions && this.setState({ show: !show })}\n >\n {RetailerName && RetailerName.value ? (\n \"\"\n ) : (\n <i className=\"icon icon-list\" />\n )}\n <div className=\"retailer-name\">\n {RetailerName && RetailerName.value ? (\n <Text field={RetailerName} />\n ) : (\n \"Select retailer\"\n )}\n </div>\n {isSingleRetailer ? (\n \"\"\n ) : hasOptions ? (\n <Fragment>\n <i className=\"icon icon-chevron-down-small\" />\n <i className=\"icon icon-chevron-outline-right\" />\n </Fragment>\n ) : (\n <div className=\"nav-retailer-loader\">\n <div className=\"loader\" />\n </div>\n )}\n {RetailerName && RetailerName.value ? (\n RetailerLogo && RetailerLogo.value ? (\n <div className=\"retailer-logo\">\n <img\n alt=\"logo\"\n src={logoPlaceholder}\n data-src={RetailerLogo.value}\n className=\"lazyload\"\n />\n </div>\n ) : (\n <div className=\"retailer-logo\">\n <img alt=\"no_logo\" src={logoPlaceholder} />\n </div>\n )\n ) : (\n \"\"\n )}\n </div>\n {!isSingleRetailer && (\n <ul className={`dropdown-list ${show ? \"\" : \"d-none\"}`}>\n <div\n className=\"label-back\"\n id={show ? \"nav-mobile-back\" : \"\"}\n onClick={() => this.handleBlur()}\n >\n <i className=\"icon icon-chevron-outline-left\" />\n Back\n </div>\n <div className=\"label-primary\">\n {RetailerName && RetailerName.value\n ? \"Switch retailer\"\n : \"Select retailer\"}\n </div>\n <div\n className={`options ${\n showAll && removeShowAll ? \"more-items\" : \"default-items\"\n }`}\n >\n {retailersList.map((item, index) => {\n return (\n <li\n key={`retailerList-${index}`}\n onClick={() => {\n this.setState({ show: false });\n (!selectedRetailer ||\n (selectedRetailer &&\n selectedRetailer.value !== item.value)) &&\n this.handleSwitchRetailer(item);\n }}\n className={\n selectedRetailer &&\n selectedRetailer.value === item.value\n ? \"selected\"\n : \"\"\n }\n >\n <img\n alt=\"icon\"\n src={logoPlaceholder}\n data-src={item.logo ? item.logo : logoPlaceholder}\n className=\"lazyload\"\n />\n <span>{item.label}</span>\n {selectedRetailer &&\n selectedRetailer.value === item.value && (\n <Fragment>\n <i className=\"icon icon-check-small\" />\n <i className=\"icon icon-check-big\" />\n </Fragment>\n )}\n </li>\n );\n })}\n </div>\n {showAll && !removeShowAll && (\n <div className=\"show-all\">\n <div className=\"last-option-border\" />\n <div\n className=\"label-secondary\"\n id=\"nav-retailer-show-all\"\n onClick={() =>\n this.setState({ removeShowAll: true, isBlur: false })\n }\n >\n Show all\n </div>\n </div>\n )}\n </ul>\n )}\n </div>\n ) : (\n \"\"\n )}\n </div>\n );\n }\n}\nexport default NavRetailer;\n","import BaseURL, { DevURL } from \"./BaseURL\";\n\nconst isDev = process.env.REACT_APP_DEV || false;\n\nexport const getNavRetailerList = () => {\n const endpoint = isDev ? \"/GetRetailerList\" : \"/portalnavigation/GetRetailerList\";\n return BaseURL.get(endpoint);\n};","import React, { Component } from \"react\";\r\nimport { getNotifications } from \"../../../../../api/NotificationAPI\";\r\n\r\nclass NavNotification extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n newNotif: null,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.getNewNotification();\r\n }\r\n\r\n getNewNotification = async () => {\r\n const response = await getNotifications();\r\n if (response && response.data && response.data.Notifications) {\r\n let newNotif = response.data.Notifications.filter(\r\n (item) => !item.MemoViewed.value\r\n ).length;\r\n if (newNotif !== 0) {\r\n this.setState({ newNotif });\r\n }\r\n }\r\n };\r\n\r\n render() {\r\n const { newNotif } = this.state;\r\n return (\r\n <div className=\"nav-notifications\">\r\n <a href=\"/notifications\">\r\n <div className=\"notif-icon\">\r\n <i className=\"icon icon-notifications\" />\r\n {newNotif && <div id=\"notif-count\" className=\"notif-count\" />}\r\n </div>\r\n <span>Correspondence</span>\r\n </a>\r\n </div>\r\n );\r\n }\r\n}\r\nexport default NavNotification;\r\n","import React from \"react\";\nimport NavUser from \"./NavUser\";\nimport NavLogo from \"./NavLogo\";\nimport NavRetailer from \"./NavRetailer\";\nimport NavNotification from \"./NavNotification\";\nimport { logout } from \"../../../../api/LoginAPI\";\n\nclass FeatureNavigationTopNavigation extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n changePassword: {\n newPass: \"\",\n confNewPass: \"\",\n successMessage: \"\",\n errorMessage: \"\",\n },\n };\n }\n\n componentDidMount() {\n const { ShowChangePasswordPrompt } = this.props.fields;\n if (\n ShowChangePasswordPrompt &&\n ShowChangePasswordPrompt.value &&\n !sessionStorage.getItem(\"promptPassword\")\n ) {\n sessionStorage.setItem(\"setPassword\", true);\n if (window.location.pathname.indexOf(\"profile\") !== 1) {\n window.location.pathname = \"/profile\";\n }\n }\n }\n\n editProfilePage = () => {\n window.location.pathname = \"/profile\";\n };\n\n logoutUser = async () => {\n const response = await logout();\n if (response) {\n if (\n response.status === 200 &&\n response.data &&\n response.data.StatusCode === 200\n ) {\n window.history.pushState(null, \"Town Square\", window.location.pathname);\n window.location.pathname = \"home/login\";\n }\n }\n };\n\n render() {\n return (\n <div className=\"top-nav-wrapper\">\n <NavUser\n data={this.props.fields}\n optionSelected={(selected) => {\n if (selected === \"Your profile\") {\n this.editProfilePage();\n } else if (selected === \"Logout\") {\n this.logoutUser();\n }\n }}\n />\n <NavLogo data={this.props.fields} />\n <NavRetailer data={this.props.fields} />\n <NavNotification />\n </div>\n );\n }\n}\nexport default FeatureNavigationTopNavigation;\n","import React from \"react\";\nimport TagManager from \"react-gtm-module\";\nimport { RichText } from \"@sitecore-jss/sitecore-jss-react\";\nimport BackgroundImage from \"../../../../assets/img/rp-bg.png\";\nimport Input from \"../../../Base/Input\";\nimport Button from \"../../../Base/Button\";\nimport { RecoverPassword } from \"../../../../api/RecoverPasswordAPI\";\nimport logoPlaceholder from \"../../../../assets/img/logoPlaceholder.png\";\n\nclass FeatureRetailerPortalUpdatePassword extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n confirmPassword: null,\n password: null,\n username: null,\n token: null,\n browser: \"\",\n formSubmitted: false,\n errorStatus: false,\n errorMessage: \"\",\n validationMessage: \"\",\n showLoader: false\n };\n this.form = React.createRef();\n }\n\n componentDidMount() {\n this.checkBrowser();\n this.handleServerError();\n this.decodeUsername();\n this.decodeToken();\n\n if (window) {\n window.addEventListener(\"resize\", this.handleResize);\n }\n if (document) {\n this.handleResize();\n }\n }\n\n handleResize = () => {\n let loginWrapper = \"\";\n\n if (document) {\n loginWrapper = document.querySelector(\".login-container\");\n }\n\n if (window.outerWidth >= 992) {\n loginWrapper.style.height = \"auto\";\n } else {\n loginWrapper.style.height = window.innerHeight + \"px\";\n }\n };\n\n handleServerError = () => {\n if(this.props.fields.ValidationMessage && this.props.fields.ValidationMessage.value) {\n this.setState({\n errorMessage: this.props.fields.ValidationMessage.value,\n errorStatus: true\n })\n }\n }\n decodeUsername = () => {\n let params = new URLSearchParams(window.location.search);\n let user = params.get('user');\n if (user) {\n this.setState({ username: user });\n } else {\n this.setState({\n errorStatus: true,\n errorMessage: \"Invalid username\"\n\n })\n }\n }\n\n decodeToken = () => {\n let params = new URLSearchParams(window.location.search);\n let tokenVal = params.get('token');\n if(this.props.fields.IsValidUrlToken && !this.props.fields.IsValidUrlToken.value) {\n this.setState({\n errorStatus: true,\n errorMessage: this.props.fields.ValidationMessage.value || \"Invalid session\"\n\n })\n } else {\n if (tokenVal) {\n this.setState({ token: tokenVal });\n } else {\n this.setState({\n errorStatus: true,\n errorMessage: \"Invalid session\"\n \n })\n }\n }\n }\n\n validateLength = (password) => {\n const validCharacters = /^[a-zA-Z0-9!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]*$/;\n if (password.length >= 5 && validCharacters.test(password)) {\n return true;\n } else {\n return false;\n }\n }\n\n validatePassword = (password) => {\n this.setState({ password });\n const isValidLength = this.validateLength(password);\n const matchesConfPassword = (password === this.state.confirmPassword);\n if (!isValidLength || !matchesConfPassword) {\n if (!isValidLength) {\n this.setState({ validationMessage: \"Password is required to be at least 5 characters in length\" })\n } else if (!matchesConfPassword) {\n this.setState({ validationMessage: \"Passwords do not match\" })\n }\n return false;\n } else {\n this.setState({ validationMessage: \"\" });\n return true;\n }\n }\n\n\n checkBrowser = () => {\n if (\n navigator &&\n navigator.userAgent &&\n navigator.userAgent.toUpperCase().indexOf(\"CHROME\") != -1 &&\n navigator.vendor &&\n navigator.vendor.toUpperCase().indexOf(\"GOOGLE\") != -1\n ) {\n this.setState({ browser: \"chrome\" });\n } else this.setState({ browser: \"other\" });\n };\n\n submitForm = async () => {\n let data = {\n username: this.state.username,\n password: this.state.password,\n token: this.state.token\n };\n\n if (this.validateLength(this.state.password)) {\n if (data.password === this.state.confirmPassword) {\n const antiForgeryToken = this.props.fields.antiForgeryToken;\n\n if (antiForgeryToken) {\n data = { ...data, '__RequestVerificationToken': antiForgeryToken.value }\n }\n\n this.setState({\n showLoader: true\n })\n\n const response = await RecoverPassword(data);\n\n\n if (response) {\n this.setState({showLoader: false})\n if (\n response.status === 200 &&\n response.data &&\n response.data.StatusCode === 200\n ) {\n TagManager.dataLayer({\n dataLayer: {\n event: \"successfulPasswordReset\",\n },\n dataLayerName: \"dataLayer\",\n });\n this.setState({\n formSubmitted: true\n })\n } else {\n this.setState({\n errorMessage: \"Unable to reset password successfully\",\n errorStatus: true\n })\n }\n }\n }\n } else {\n this.setState({\n errorStatus: true,\n errorMessage: \"Chosen password is invalid\"\n })\n }\n\n\n };\n\n onEnterKeyPress = (event) => {\n if (event.which === 13 || event.keyCode === 13 || event.key === \"Enter\") {\n this.submitForm();\n }\n };\n\n render() {\n const {\n // TopNavigationLinks = null,\n SiteLogo = null,\n SiteLogoClassName = null,\n UpdatePasswordPageBlurb = null,\n FooterBlurb = null,\n } = this.props.fields || {};\n\n let mainLink =\n SiteLogo &&\n SiteLogo.fields &&\n SiteLogo.fields.Link &&\n SiteLogo.fields.Link.value\n ? SiteLogo.fields.Link.value\n : {};\n const logo = (SiteLogoClassName && SiteLogoClassName.value) || \"\";\n let blurb = UpdatePasswordPageBlurb && UpdatePasswordPageBlurb.value ? UpdatePasswordPageBlurb : \"\";\n let footerBlurb = FooterBlurb && FooterBlurb.value ? FooterBlurb : \"\";\n\n return (\n <div className=\"login-container\">\n <img className=\"bg-image\" src={BackgroundImage} alt=\"Background\" />\n <div className=\"container\">\n <div className=\"header-wrapper\">\n <div className=\"header-logo\">\n </div>\n </div>\n <div className=\"form-logo\">\n {mainLink ? (\n <a {...mainLink}>\n <img\n alt={\"sitecore-logo\"}\n src={logoPlaceholder}\n data-src={logo}\n className=\"lazyload form-logo-image\"\n />\n </a>\n ) : (\n <img\n alt={\"sitecore-logo\"}\n src={logoPlaceholder}\n data-src={logo}\n className=\"lazyload form-logo-image\"\n />\n )}\n </div>\n <div className=\"login-wrapper\">\n <div className=\"form-blurb\">\n <RichText field={blurb} />\n </div>\n <div className=\"form-wrapper\">\n {this.state.showLoader ?\n (<>\n <div className=\"loader-wrapper\">\n <div className=\"loader\">\n </div>\n </div>\n </>) :\n (this.state.errorStatus ? (\n <>\n <div className=\"form-title\">{this.state.errorMessage}</div>\n <div className=\"form-controls-wrapper\">\n <a\n className=\"form-forgot-password\"\n href=\"/login\"\n >\n Back to Login >\n </a>\n </div>\n </>)\n :\n ((!this.setState.errorStatus && !this.state.formSubmitted) &&\n <>\n <div className=\"form-title\">Create your new password</div>\n <div className=\"form-group\">\n <Input\n type=\"password\"\n placeholder=\"New Password\"\n onInputChange={(confirmPassword) => this.setState({ confirmPassword })}\n />\n <Input\n type=\"password\"\n placeholder=\"New Password\"\n onInputChange={(confirmPassword) => this.setState({ confirmPassword })}\n style={{ display: \"none\" }}\n />\n </div>\n <div className=\"form-group\">\n {this.state.browser === \"chrome\" && (\n <Input\n type=\"password\"\n placeholder=\"Confirm Password\"\n onInputChange={(password) => this.validatePassword(password)}\n onInputKeyDown={(event) => this.onEnterKeyPress(event)}\n />\n )}\n {this.state.browser === \"other\" && (\n <Input\n type=\"password\"\n placeholder=\"Confirm Password\"\n onInputChange={(password) => this.validatePassword(password)}\n onInputKeyDown={(event) => this.onEnterKeyPress(event)}\n autoComplete=\"new-password\"\n />\n )}\n </div>\n <div className=\"form-submit\">\n <Button\n onClick={() => this.submitForm()}\n disabled={(!this.state.password && !this.state.confirmPassword) || (this.state.password !== this.state.confirmPassword) || (this.state.password.length < 5)}\n size=\"full\"\n type=\"submit\"\n color=\"light-green\"\n >\n Save Password\n </Button>\n <div className=\"form__label\" style={{ marginTop: '10px' }}> {this.state.validationMessage}</div>\n </div>\n </>)\n )}\n {this.state.formSubmitted && !this.state.errorStatus &&\n <>\n <div className=\"form-title\">Password updated successfully</div>\n <div className=\"form-controls-wrapper\">\n <a\n className=\"form-forgot-password\"\n href=\"/login\"\n >\n Back to Login >\n </a>\n </div>\n </>\n }\n\n </div>\n </div>\n {footerBlurb && (\n <div className=\"form-footer\">\n <RichText field={footerBlurb} />\n </div>\n )}\n </div>\n </div>\n );\n }\n}\n\nexport default FeatureRetailerPortalUpdatePassword;\n","import BaseURL from \"./BaseURL\";\r\n\r\nexport const RecoverPassword = (data) => {\r\n return BaseURL.post(\"/account/RecoverPassword\", { ...data });\r\n };","import React, { Component, Fragment } from \"react\";\nimport Select from \"react-select\";\nimport axios from \"axios\";\nimport DOMPurify from 'dompurify';\nimport { getCreateEditUser, getRetailerList } from \"../../../../api/UsersAPI\";\nimport { validate } from \"../../../../helper/UserHelper\";\nimport FormInput from \"../../../Base/FormInput\";\nimport RadioButton from \"../../../Base/RadioButton\";\nimport FormErrorMessage from \"../../../Base/FormErrorMessage\";\n\n// import getRetailerListData from \"./getRetailerListData.json\";\n// import getCreateEditUserData from \"./getCreateEditUserData.json\";\n\nclass FeatureRetailerPortalUser extends Component {\n constructor(props) {\n super(props);\n this.state = {\n formData: {\n name: null,\n email: null,\n centres: [],\n retailers: [],\n permission: null,\n },\n showLoader: true,\n isRetailersDisabled: false,\n isCentresDisabled: false,\n retailersList: [],\n centresList: [],\n disableBtn: false,\n noOptionsMessage: \"Loading retailers. Please wait.\",\n formError: {},\n formErrorMessage: \"\",\n showErrorMessage: false,\n };\n }\n\n componentDidMount() {\n this.getRetailerList();\n this.getData();\n this.handleFormData();\n }\n\n getData = async () => {\n const { Username } = this.props;\n const response = await getCreateEditUser({ Username });\n // const response = {\n // data: getCreateEditUserData\n // }\n if (response && response.data) {\n const { FullName, Centres, EmailAddress, Retailers, Permission } =\n response.data.User || {};\n const { CentreList } = response.data;\n\n let centresList = [];\n let centres = [];\n let retailers = [];\n\n if (Centres && Centres.length) {\n Centres.map((centre) => {\n const { CentreName, CentreId } = centre;\n centres.push({ value: CentreId.value, label: CentreName.value });\n });\n }\n\n if (Retailers && Retailers.length) {\n Retailers.map((retailer) => {\n const { RetailerName, RetailerId } = retailer;\n retailers.push({\n value: RetailerId.value,\n label: RetailerName.value,\n });\n });\n }\n\n if (CentreList && CentreList.length) {\n CentreList.map((centre) => {\n const { CentreName, CentreId } = centre;\n centresList.push({ value: CentreId.value, label: CentreName.value });\n });\n }\n\n this.setState(\n {\n formData: {\n name: (FullName && FullName.value) || \"\",\n email: (EmailAddress && EmailAddress.value) || \"\",\n centres,\n retailers,\n permission:\n (Permission &&\n Permission.PermissionValue &&\n Permission.PermissionValue.value) ||\n \"\",\n },\n centresList,\n showLoader: false,\n },\n () =>\n Permission &&\n Permission.PermissionValue &&\n Permission.PermissionValue.value &&\n this.handlePermission(Permission.PermissionValue.value)\n );\n } else {\n this.setState({ showLoader: false });\n }\n };\n\n getRetailerList = async () => {\n let retailers = [];\n try {\n const response = await getRetailerList();\n if (response && response.data && response.data.Retailers) {\n response.data.Retailers.map((retailer) => {\n const { RetailerName, RetailerId } = retailer;\n retailers.push({\n value: RetailerId.value,\n label: RetailerName.value,\n });\n });\n }\n this.setState({ retailersList: retailers });\n } catch (e) {\n console.error(\"Get Retailer List Error: \" + e.response.statusText);\n // const response = {\n // data: getRetailerListData\n // };\n // if (response && response.data && response.data.Retailers) {\n // response.data.Retailers.map((retailer) => {\n // const { RetailerName, RetailerId } = retailer;\n // retailers.push({ value: RetailerId.value, label: RetailerName.value });\n // });\n // }\n // this.setState({ retailersList: retailers });\n }\n };\n\n getOptions = (options) => {\n let finalOptions = [];\n options.map((item) => {\n const {\n PermissionName: name = null,\n PermissionValue: summary = null,\n } = item.fields;\n finalOptions.push({\n Id: summary,\n Name: name,\n });\n });\n return finalOptions;\n };\n\n handleFormUpdate = (value) => {\n this.setState({\n formData: {\n ...this.state.formData,\n ...value,\n },\n });\n };\n\n validateForm = async () => {\n this.setState(\n {\n disableBtn: true,\n },\n this.handleFormData\n );\n const { isRetailersDisabled, isCentresDisabled } = this.state;\n\n let formError = validate(\n this.state.formData,\n !isRetailersDisabled,\n !isCentresDisabled\n );\n let response;\n if (Object.entries(formError).length !== 0) {\n this.setState(\n {\n formError,\n disableBtn: false,\n showErrorMessage: true,\n formErrorMessage: \"Please fill out all mandatory fields marked below\",\n },\n this.handleFormData\n );\n this.triggerBackToTop();\n response = {\n isSuccess: false,\n };\n } else {\n this.setState(\n {\n formError,\n disableBtn: false,\n showErrorMessage: false,\n },\n this.handleFormData\n );\n response = await this.saveForm().then((result) => {\n if (result.isSuccess) {\n return { isSuccess: true };\n }\n });\n }\n return response;\n };\n\n saveForm = async () => {\n const { name, email, retailers, centres, permission } = this.state.formData;\n const { Username } = this.props;\n const antiForgeryToken = this.props.fields.antiForgeryToken;\n \n const formData = new FormData();\n formData.append(\"fullName\", name);\n formData.append(\"email\", email);\n if (retailers && retailers.length) {\n retailers.map((retailer) => {\n formData.append(\"retailers\", retailer.value);\n });\n }\n if (centres && centres.length) {\n centres.map((centre) => {\n formData.append(\"centres\", centre.value);\n });\n }\n formData.append(\"permission\", permission);\n if(antiForgeryToken) {\n formData.append(antiForgeryToken.name, antiForgeryToken.value);\n }\n\n const url = `/api/sitecore/user/SaveUser?username=${Username}`;\n\n try {\n let response = await axios({\n method: \"POST\",\n url,\n data: formData,\n });\n\n if (response && response.data) {\n if (response.data.IsSuccess && response.data.IsSuccess.value) {\n this.setState({\n formErrorMessage: \"\",\n showErrorMessage: false,\n });\n return {\n isSuccess: true,\n successMessage: response.data.Message.value,\n };\n } else {\n this.setState({\n formErrorMessage: response.data.Message.value,\n showErrorMessage: true,\n });\n return {\n isSuccess: false,\n };\n }\n } else {\n this.setState({\n formErrorMessage: \"Update user failed. Please try again\",\n showErrorMessage: true,\n });\n this.triggerBackToTop();\n return {\n isSuccess: false,\n };\n }\n } catch (e) {\n this.setState({\n formErrorMessage: \"Update user failed. Please try again\",\n showErrorMessage: true,\n });\n console.log(e);\n this.triggerBackToTop();\n return {\n isSuccess: false,\n };\n }\n };\n\n triggerBackToTop = () => {\n let backToTop;\n if (document) {\n backToTop = document.querySelector(\".form__modal--back-to-top-button\");\n if (backToTop) {\n backToTop.click();\n }\n }\n };\n\n handleFormData = () => {\n this.props.handleFormData(this.state.disableBtn, this.validateForm);\n };\n\n handlePermission = (permission) => {\n if (permission.indexOf(\"L1\") > -1) {\n this.setState(\n {\n isRetailersDisabled: true,\n isCentresDisabled: true,\n },\n () =>\n this.setState({\n formData: {\n ...this.state.formData,\n retailers: null,\n centres: null,\n },\n })\n );\n } else if (permission.indexOf(\"L2\") > -1) {\n this.setState(\n { isRetailersDisabled: true, isCentresDisabled: false },\n () => this.handleFormUpdate({ retailers: null })\n );\n } else {\n this.setState({ isRetailersDisabled: false, isCentresDisabled: false });\n }\n this.handleFormUpdate({ permission });\n };\n\n responseText = (field, type) => {\n return (\n field && (\n <div\n className={`response-text error ${\n type && type.length ? \"with-items\" : \"\"\n }`}\n >\n {field}\n </div>\n )\n );\n };\n\n noOptionsMessage = () => {\n const { retailersList } = this.state;\n let message = \"Loading...\";\n if (retailersList && retailersList.length) {\n message = \"No options\";\n }\n return <div className=\"loading-text\">{message}</div>;\n };\n\n formatOptionLabelRetailer = ({ label }, { inputValue }) => {\n let highlighted = label;\n if (inputValue && inputValue.length > 1) {\n highlighted = label.replace(\n new RegExp(inputValue, \"gi\"),\n (highlighted) => `<b>${highlighted}</b>`\n );\n }\n return <span dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(highlighted) }} />;\n };\n\n formatOptionLabelCentre = ({ label }, { inputValue }) => {\n let highlighted = label;\n if (inputValue && inputValue.length > 1) {\n highlighted = label.replace(\n new RegExp(inputValue, \"gi\"),\n (highlighted) => `<b>${highlighted}</b>`\n );\n }\n return <span dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(highlighted) }} />;\n };\n\n render() {\n const { name, email, centres, retailers, permission } = this.state.formData;\n const {\n centresList,\n retailersList,\n isRetailersDisabled,\n isCentresDisabled,\n formError,\n showLoader,\n showErrorMessage,\n formErrorMessage,\n } = this.state;\n const { PermissionLevels } = this.props.fields || {};\n\n return (\n <div className=\"user-container\">\n {showLoader && (\n <div className=\"loader-wrapper container\">\n <div className=\"loader\" />\n </div>\n )}\n {showErrorMessage && <FormErrorMessage error={formErrorMessage} />}\n {!showLoader && (\n <Fragment>\n <div className=\"user-form__title\">\n {this.props.Username ? \"Edit user\" : \"New user\"}\n </div>\n <div className=\"form__container\">\n <label className=\"form__header\">User details</label>\n <FormInput\n type=\"text\"\n label=\"Name\"\n error={formError.name}\n value={name}\n required\n onInputChange={(name) => {\n this.handleFormUpdate({ name });\n }}\n />\n <FormInput\n type=\"email\"\n label=\"Email address\"\n required\n value={email}\n error={formError.email}\n onInputChange={(email) => {\n this.handleFormUpdate({ email });\n }}\n />\n <div className=\"form-group\">\n <div className=\"form__label\">Retailers</div>\n <div\n className={`react-select-container ${\n isRetailersDisabled ? \"select-disabled\" : \"\"\n }`}\n >\n <Select\n isMulti\n className={formError.retailers ? \"error\" : \"\"}\n placeholder=\"Search retailers\"\n options={retailersList}\n value={retailers}\n onChange={(retailers) =>\n this.handleFormUpdate({ retailers })\n }\n components={{ NoOptionsMessage: this.noOptionsMessage }}\n theme={(theme) => ({\n ...theme,\n colors: {\n ...theme.colors,\n primary25: \"#f5f5f6\",\n },\n })}\n isClearable={false}\n backspaceRemovesValue={false}\n formatOptionLabel={this.formatOptionLabelRetailer}\n isDisabled={isRetailersDisabled}\n />\n {this.responseText(formError.retailers, retailers)}\n </div>\n </div>\n <div className=\"form__label\">Centres</div>\n <div\n className={`react-select-container ${\n isCentresDisabled ? \"select-disabled\" : \"\"\n }`}\n >\n <Select\n isMulti\n className={formError.centres ? \"error\" : \"\"}\n placeholder=\"Select centres\"\n options={centresList}\n value={centres}\n onChange={(centres) => this.handleFormUpdate({ centres })}\n theme={(theme) => ({\n ...theme,\n colors: {\n ...theme.colors,\n primary25: \"#f5f5f6\",\n },\n })}\n isClearable={false}\n backspaceRemovesValue={false}\n formatOptionLabel={this.formatOptionLabelCentre}\n isDisabled={isCentresDisabled}\n />\n {this.responseText(formError.centres, centres)}\n </div>\n </div>\n <div className=\"form__container is-permission\">\n <div className=\"h2-bold\">{\"Permissions\"}</div>\n <div className=\"form__label\">\n {\n \"User can manage events, offers, articles & store information for:\"\n }\n </div>\n <RadioButton\n defaultSelected={permission}\n radioGroupName=\"PermissionList\"\n options={this.getOptions(PermissionLevels)}\n onChange={(Source) => {\n this.handlePermission(Source);\n }}\n />\n {this.responseText(formError.permission)}\n </div>\n </Fragment>\n )}\n </div>\n );\n }\n}\n\nexport default FeatureRetailerPortalUser;\n","const isEmpty = (value) => {\r\n return value ? false : true;\r\n};\r\n\r\nexport const validate = (state, isRetailerRequired, isCentreRequired) => {\r\n let retailerRule = \"not-required\";\r\n let centreRule = \"not-required\";\r\n if (isRetailerRequired) {\r\n retailerRule = \"required-select\";\r\n }\r\n if (isCentreRequired) {\r\n centreRule = \"required-select\";\r\n }\r\n let list = [\r\n {\r\n name: \"name\",\r\n value: state.name,\r\n rules: \"required\",\r\n },\r\n {\r\n name: \"email\",\r\n value: state.email,\r\n rules: \"required\",\r\n },\r\n {\r\n name: \"centres\",\r\n value: state.centres,\r\n rules: centreRule,\r\n },\r\n {\r\n name: \"retailers\",\r\n value: state.retailers,\r\n rules: retailerRule,\r\n },\r\n {\r\n name: \"permission\",\r\n value: state.permission,\r\n rules: \"required\",\r\n },\r\n ];\r\n\r\n let result = {};\r\n list.forEach((element) => {\r\n if (element.rules === \"required\") {\r\n let message = null;\r\n switch (element.name) {\r\n case \"name\":\r\n message = \"Please enter a name\";\r\n break;\r\n case \"email\":\r\n message = \"Please enter an email address\";\r\n break;\r\n case \"permission\":\r\n message = \"Please select a permission level\";\r\n break;\r\n default:\r\n message = null;\r\n }\r\n if (isEmpty(element.value)) {\r\n result[element.name] = message;\r\n }\r\n\r\n if (element.value && element.value.length && element.value.length < 1) {\r\n result[element.name] = message;\r\n }\r\n\r\n if (element.name === \"email\" && element.value && element.value.length) {\r\n if (!(/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)+$/.test(element.value))) {\r\n result[element.name] = \"Please enter a valid email address\";\r\n }\r\n }\r\n }\r\n if (element.rules === \"required-select\") {\r\n let message = null;\r\n switch (element.name) {\r\n case \"centres\":\r\n message = \"Please select a centre\";\r\n break;\r\n case \"retailers\":\r\n message = \"Please select a retailer\";\r\n break;\r\n default:\r\n message = null;\r\n }\r\n if (element.value && element.value.length) {\r\n } else {\r\n result[element.name] = message;\r\n }\r\n }\r\n //Other Validation Rules\r\n });\r\n return result;\r\n};\r\n","import React, { Component } from \"react\";\nimport avatar from \"../../../../assets/icons/png/author.png\";\nimport { getUsers, deleteUser } from \"../../../../api/UsersAPI\";\nimport ReactPaginate from \"react-paginate\";\nimport PageHeader from \"../../../Base/PageHeader\";\nimport CustomFilter from \"../../../Base/CustomFilter\";\nimport NoResultMessage from \"../../../Base/NoResultMessage\";\nimport ListItem from \"../../../Base/ListItem\";\nimport RadioButton from \"../../../Base/RadioButton\";\nimport Popup from \"../../../Base/Popup\";\nimport PopupAction from \"../../../Base/Popup/PopupAction\";\nimport SuccessMessage from \"../../../Base/SuccessMessage\";\nimport FormModal from \"../../../Base/FormModal\";\nimport FeatureRetailerPortalUser from \"../User\";\nimport { addClassLazyload } from \"../../../../helper/AddClassLazyloadHelper\";\nimport { scrollToTop } from \"../../../../helper/ScrollHelper\";\nimport { removeActiveState } from \"../../../../helper/RemoveActiveState\";\nimport { hideBackToTop } from \"../../../../helper/HideBackToTopHelper\";\n\n// import getUsersData from \"./getUsersData.json\";\n\nclass FeatureRetailerPortalUsers extends Component {\n constructor(props) {\n super(props);\n this.state = {\n activePageNum: 0,\n totalPageNumber: null,\n totalResults: null,\n showPagination: false,\n showLoader: true,\n showDeleteModal: false,\n showMiniModal: false,\n showFormModal: false,\n disableCancelBtn: false,\n disableDeleteBtn: false,\n users: null,\n userName: null,\n name: null,\n formModalData: null,\n filter: \"all\",\n showFilter: false,\n modalMessage: null,\n hideIcon: true,\n isDocumentReady: false,\n filteredItems: null,\n itemCount: null,\n itemTotal: null,\n paginationRange: 9,\n };\n }\n\n componentDidMount() {\n if (window) {\n window.addEventListener(\"resize\", this.handleResize);\n }\n if (document) {\n this.setState({ isDocumentReady: true }, this.handleResize());\n }\n let params = {\n pageNumber: 1,\n };\n this.getData(params);\n }\n\n handleResize = () => {\n if (window.outerWidth >= 768) {\n this.setState({\n paginationRange: 9,\n });\n } else {\n this.setState({\n paginationRange: 3,\n });\n }\n };\n\n getData = async (params) => {\n this.setState({\n showLoader: true,\n });\n\n try {\n const response = await getUsers(params);\n if (response && response.data) {\n const { Users, TotalPageNumber, TotalResults } = response.data;\n this.setState(\n {\n users: Users,\n filteredItems: Users,\n totalPageNumber: TotalPageNumber.value,\n totalResults: TotalResults.value,\n itemTotal: TotalResults.value,\n showPagination: true,\n showLoader: false,\n },\n () => {\n this.handleFilter(0);\n }\n );\n }\n } catch (e) {\n console.error(\"Get User Data Error: \" + e.response.statusText);\n // const response = {\n // data: getUsersData\n // };\n // if (response && response.data) {\n // const { Users, TotalPageNumber, TotalResults } = response.data;\n // this.setState(\n // {\n // users: Users,\n // filteredItems: Users,\n // totalPageNumber: TotalPageNumber.value,\n // totalResults: TotalResults.value,\n // itemTotal: TotalResults.value,\n // showPagination: true,\n // showLoader: false,\n // },\n // () => {\n // this.handleFilter(0);\n // }\n // );\n // }\n }\n };\n\n setFilter = (levels, userLevel) => {\n let userList = [\n {\n Id: {\n value: \"all\",\n },\n Name: {\n value: \"All\",\n },\n Description: {\n value: null,\n },\n },\n ];\n\n levels.map((el) => {\n const {\n FilterId: name = null,\n FilterDescription: summary = null,\n } = el.fields;\n if (name && name.value && summary && summary.value) {\n userList.push({\n Id: { value: name.value },\n Name: { value: name.value },\n Description: { value: summary.value },\n });\n }\n });\n\n if (userLevel && userLevel.value) {\n if (userLevel.value.indexOf(\"2\") > -1) {\n userList = userList.filter(\n (el) => el && el.Id && el.Id.value && el.Id.value.indexOf(\"1\") < 0\n );\n } else if (userLevel.value.indexOf(\"3\") > -1) {\n userList = userList.filter(\n (el) =>\n el &&\n el.Id &&\n el.Id.value &&\n el.Id.value.indexOf(\"1\") < 0 &&\n el.Id.value.indexOf(\"2\") < 0\n );\n }\n }\n return userList;\n };\n\n renderDelete = () => {\n const { userName, name, disableCancelBtn, disableDeleteBtn } = this.state;\n const message =\n \"Are you sure you want to delete the user, \" +\n name +\n \"? You can’t undo this.\";\n\n return (\n <Popup>\n <PopupAction\n label={{ value: `Delete user?` }}\n description={{ value: message }}\n icon=\"trash-2\"\n iconBgColor=\"#d83b42\"\n secondaryBtn=\"Cancel\"\n disabledSecondaryBtn={disableCancelBtn}\n secondaryBtnOnClick={() => this.setState({ showDeleteModal: false })}\n primaryBtn=\"Delete user\"\n primaryBtnOnClick={() => this.deleteUser(userName)}\n primaryBtnColor=\"red\"\n disabledPrimaryBtn={disableDeleteBtn}\n />\n </Popup>\n );\n };\n\n renderMiniModal = () => {\n const { modalMessage, hideIcon } = this.state;\n return (\n <SuccessMessage\n label={modalMessage}\n hideIcon={hideIcon}\n handleShowSuccess={(showMiniModal) => {\n this.setState({\n showMiniModal,\n });\n }}\n />\n );\n };\n\n deleteUser = async (userName) => {\n this.setState({\n disableCancelBtn: true,\n disableDeleteBtn: true,\n });\n try {\n let response = await deleteUser({ userName });\n if (response.status === 200 && response.data) {\n const { IsSuccess = null, Message = null } = response.data;\n if (IsSuccess && IsSuccess.value) {\n this.setState(\n {\n modalMessage: Message.value,\n showDeleteModal: false,\n disableCancelBtn: false,\n disableDeleteBtn: false,\n showMiniModal: true,\n hideIcon: false,\n },\n () => {\n this.resetState();\n scrollToTop();\n }\n );\n } else {\n this.setState(\n {\n modalMessage: Message.value,\n showDeleteModal: false,\n disableCancelBtn: false,\n disableDeleteBtn: false,\n showMiniModal: true,\n hideIcon: true,\n },\n () => scrollToTop()\n );\n }\n } else {\n this.setState(\n {\n modalMessage: \"Something went wrong. Please try again.\",\n showDeleteModal: false,\n disableCancelBtn: false,\n disableDeleteBtn: false,\n showMiniModal: true,\n hideIcon: true,\n },\n () => scrollToTop()\n );\n }\n } catch (e) {\n this.setState(\n {\n modalMessage: \"Something went wrong. Please try again.\",\n showDeleteModal: false,\n disableCancelBtn: false,\n disableDeleteBtn: false,\n showMiniModal: true,\n hideIcon: true,\n },\n () => scrollToTop()\n );\n }\n };\n\n handleFilter = (page) => {\n const { filter, users, totalPageNumber } = this.state;\n if (users && users.length) {\n let unfiltered = users;\n if (filter !== \"all\") {\n unfiltered = unfiltered.filter(\n (item) => item && item.Permission && item.Permission.value === filter\n );\n }\n\n const currentPage = page + 1;\n const until = currentPage * 20;\n const from = until - 20;\n const list = unfiltered.slice(from, until);\n\n const listLength = unfiltered && unfiltered.length;\n let itemCount = from + 1 + \" – \" + until;\n if (currentPage == totalPageNumber || listLength < 21) {\n itemCount = from + 1 + \" – \" + listLength;\n }\n if (from + 1 == listLength) {\n itemCount = listLength;\n }\n\n this.setState({\n filteredItems: list,\n itemCount,\n totalPageNumber: listLength ? Math.ceil(listLength / 20) : null,\n itemTotal: listLength || null,\n });\n }\n addClassLazyload(\"users-content\");\n removeActiveState();\n scrollToTop();\n };\n\n handlePaginationClick = (data) => {\n this.setState(\n {\n activePageNum: data.selected,\n },\n () => scrollToTop()\n );\n this.handleFilter(data.selected);\n addClassLazyload(\"users-content\");\n removeActiveState();\n };\n\n renderFormModal = () => {\n const { disableBtn, onClickSave } = this.state.formModalData || {};\n\n const { showFormModal, userName } = this.state || {};\n\n hideBackToTop(showFormModal);\n \n return (\n <FormModal\n showModal={showFormModal}\n label={\n <div style={{ whiteSpace: \"pre\" }}>\n Manage users » {\" \"}\n {userName ? \"Edit\" : \"New\"} user\n </div>\n }\n closeOnClick={() => this.setState({ showFormModal: false })}\n primaryBtn=\"Save\"\n primaryBtnOnClick={() => this.handleUser(onClickSave)}\n disabledPrimaryBtn={disableBtn}\n secondaryBtn=\"Cancel\"\n secondaryBtnOnClick={() => this.setState({ showFormModal: false })}\n >\n {showFormModal && (\n <FeatureRetailerPortalUser\n Username={userName}\n fields={this.props.fields}\n antiForgeryToken={this.props.fields.antiForgeryToken}\n handleFormData={(disableBtn, onClickSave) => {\n this.handleFormUpdate(disableBtn, onClickSave);\n }}\n />\n )}\n </FormModal>\n );\n };\n\n handleFormUpdate = (disableBtn, onClickSave) => {\n this.setState({\n formModalData: {\n ...this.state.formModalData,\n disableBtn,\n onClickSave,\n },\n });\n };\n\n handleUser = (onClickUpdate) => {\n onClickUpdate().then((result) => {\n if (result && result.isSuccess) {\n setTimeout(() => {\n this.setState(\n {\n showFormModal: false,\n modalMessage: result.successMessage,\n showMiniModal: true,\n hideIcon: false,\n },\n () => {\n this.resetState();\n scrollToTop();\n }\n );\n }, 2000);\n }\n });\n };\n\n renderPagination = () => {\n const { totalPageNumber, paginationRange } = this.state;\n return (\n totalPageNumber &&\n totalPageNumber > 1 && (\n <ReactPaginate\n previousLabel={\n <div>\n <i className=\"icon icon-chevron-outline-left\" />\n <span>{\"Previous\"}</span>\n </div>\n }\n nextLabel={\n <div>\n <i className=\"icon icon-chevron-outline-right\" />\n <span>{\"Next\"}</span>\n </div>\n }\n breakLabel={\"...\"}\n breakClassName={\"break-me\"}\n pageCount={totalPageNumber}\n marginPagesDisplayed={0}\n pageRangeDisplayed={paginationRange}\n onPageChange={this.handlePaginationClick}\n containerClassName={\"pagination\"}\n subContainerClassName={\"pages pagination\"}\n activeClassName={\"active\"}\n />\n )\n );\n };\n\n resetState = () => {\n this.setState(\n {\n filter: \"all\",\n showLoader: true,\n showFilter: false,\n totalResults: null,\n },\n () => {\n let params = {\n pageNumber: 1,\n };\n setTimeout(() => this.getData(params), 2000);\n }\n );\n };\n\n renderList = () => {\n const { NoUsersText } = this.props.fields;\n const {\n filteredItems,\n showPagination,\n itemTotal,\n itemCount,\n totalResults,\n totalPageNumber,\n } = this.state;\n return (\n <div className=\"users-content\">\n {filteredItems && filteredItems.length ? (\n <div className=\"list-wrapper\">\n {filteredItems.map((item, index) => {\n const {\n UserName,\n FullName,\n Centres,\n Retailers,\n Permission,\n ProfilePicture,\n } = item;\n return (\n <ListItem\n key={`itemId-${index}`}\n logoSrc={\n ProfilePicture &&\n ProfilePicture.value &&\n ProfilePicture.value.src\n ? ProfilePicture.value.src\n : avatar\n }\n label={Retailers}\n title={FullName}\n description={Centres}\n status={Permission}\n btnOne={{\n icon: \"trash-2\",\n color: \"secondary\",\n tooltip: \"Delete\",\n }}\n btnOneOnClick={() => {\n this.setState({\n showDeleteModal: true,\n userName: UserName && UserName.value,\n name: FullName && FullName.value,\n });\n }}\n listItemOnClick={(e) => {\n if (\n !/btn|icon/.test(e.target.className) ||\n /js-btn-edit|icon-edit/.test(e.target.className)\n ) {\n this.setState({\n showFormModal: true,\n userName: UserName && UserName.value,\n });\n }\n }}\n />\n );\n })}\n {itemTotal && itemCount && (\n <div\n className={`list-count ${\n !(totalPageNumber && totalPageNumber > 1)\n ? \"no-pagination\"\n : \"\"\n }`}\n >\n Showing {itemCount} of {itemTotal}\n </div>\n )}\n {showPagination && <div>{this.renderPagination()}</div>}\n <div />\n </div>\n ) : (\n <NoResultMessage\n label={\n totalResults\n ? \"No users found.\"\n : (NoUsersText && NoUsersText.value) || \"No users found.\"\n }\n />\n )}\n </div>\n );\n };\n\n render() {\n const {\n PermissionLevels: levels = null,\n UserLevel: userLevel = null,\n } = this.props.fields;\n const {\n showLoader,\n showDeleteModal,\n isDocumentReady,\n showFilter,\n showMiniModal,\n totalResults,\n } = this.state;\n return (\n <div className={`users-container ${showMiniModal ? \"has-success-message\" : \"\"}`}>\n <PageHeader\n title={{ value: \"Manage users\" }}\n primaryBtnLabel=\"New user\"\n primaryBtnClassName=\"btn-form-create\"\n primaryBtnOnClick={() =>\n this.setState({ showFormModal: true, userName: null })\n }\n secondaryBtnLabel={\n totalResults && totalResults > 1 && levels && levels.length\n ? \"Filter\"\n : null\n }\n secondaryBtnClassName=\"filter-btn\"\n secondaryBtnOnClick={() => this.setState({ showFilter: true })}\n />\n {showDeleteModal && this.renderDelete()}\n {isDocumentReady && this.renderFormModal()}\n\n {isDocumentReady && (\n <CustomFilter\n showFilter={showFilter}\n onCloseFilter={() => this.setState({ showFilter: false })}\n >\n <div className=\"custom-filter__group\">\n <div className=\"custom-filter__label\">\n Filter by user permissions\n </div>\n {totalResults && totalResults > 1 && levels && levels.length && (\n <RadioButton\n defaultSelected=\"all\"\n options={this.setFilter(levels, userLevel)}\n radioGroupName=\"user-management\"\n onChange={(id) =>\n this.setState({ filter: id }, () => this.handleFilter(0))\n }\n plain\n />\n )}\n </div>\n </CustomFilter>\n )}\n {showMiniModal && this.renderMiniModal()}\n {!showLoader && this.renderList()}\n {showLoader && (\n <div className=\"loader-wrapper container\">\n <div className=\"loader\" />\n </div>\n )}\n </div>\n );\n }\n}\n\nexport default FeatureRetailerPortalUsers;\n","import React from \"react\";\nimport { Placeholder } from \"@sitecore-jss/sitecore-jss-react\";\n\nclass FoundationLayoutMain extends React.Component {\n componentDidMount() {\n if (window) {\n window.addEventListener(\"resize\", this.handleResize);\n }\n if (document) {\n this.handleResize();\n }\n }\n\n handleResize = () => {\n let bodyWrapper = \"\"\n\n if (document) {\n bodyWrapper = document.querySelector(\".body-wrapper\");\n }\n\n if (window.outerWidth >= 992) {\n bodyWrapper.style.height = \"calc(100vh - 68px)\";\n\n } else {\n bodyWrapper.style.height = window.innerHeight + \"px\";\n }\n };\n\n render() {\n return (\n <div className=\"main-layout\">\n <div className=\"top-nav\">\n <Placeholder name=\"jss-rp-top\" rendering={this.props.rendering} />\n </div>\n <div className=\"left-nav\">\n <Placeholder name=\"jss-rp-left\" rendering={this.props.rendering} />\n </div>\n <div className=\"body-container\">\n <div className=\"body-wrapper\">\n <div className=\"container\">\n <Placeholder\n name=\"jss-rp-body\"\n rendering={this.props.rendering}\n />\n </div>\n </div>\n </div>\n </div>\n );\n }\n}\n\nexport default FoundationLayoutMain;\n","/* eslint-disable */\n// Do not edit this file, it is auto-generated at build time!\n// See scripts/generate-component-factory.js to modify the generation of this file.\nimport BaseCustomFilterFilterDropdown from '../components/Base/CustomFilter/FilterDropdown';\nimport BaseCustomFilterFilterRadioButton from '../components/Base/CustomFilter/FilterRadioButton';\nimport BasePopupPopupAction from '../components/Base/Popup/PopupAction';\nimport BasePopupPopupPreview from '../components/Base/Popup/PopupPreview';\nimport FeatureRetailerPortalApprovals from '../components/Feature/RetailerPortal/Approvals';\nimport FeatureRetailerPortalArticleListing from '../components/Feature/RetailerPortal/ArticleListing';\nimport FeatureRetailerPortalArticles from '../components/Feature/RetailerPortal/Articles';\nimport FeatureRetailerPortalAuthorisations from '../components/Feature/RetailerPortal/Authorisations';\nimport FeatureRetailerPortalDashboard from '../components/Feature/RetailerPortal/Dashboard';\nimport FeatureRetailerPortalFooter from '../components/Feature/RetailerPortal/Footer';\nimport FeatureRetailerPortalHub from '../components/Feature/RetailerPortal/Hub';\nimport FeatureRetailerPortalLeftNavigation from '../components/Feature/RetailerPortal/LeftNavigation';\nimport FeatureRetailerPortalLogin from '../components/Feature/RetailerPortal/Login';\nimport FeatureRetailerPortalNotifications from '../components/Feature/RetailerPortal/Notifications';\nimport FeatureRetailerPortalProfile from '../components/Feature/RetailerPortal/Profile';\nimport FeatureRetailerPortalPromotionListing from '../components/Feature/RetailerPortal/PromotionListing';\nimport FeatureRetailerPortalPromotions from '../components/Feature/RetailerPortal/Promotions';\nimport FeatureRetailerPortalStorefront from '../components/Feature/RetailerPortal/Storefront';\nimport FeatureRetailerPortalStores from '../components/Feature/RetailerPortal/Stores';\nimport FeatureRetailerPortalTopNavigation from '../components/Feature/RetailerPortal/TopNavigation';\nimport FeatureRetailerPortalUpdatePassword from '../components/Feature/RetailerPortal/UpdatePassword';\nimport FeatureRetailerPortalUser from '../components/Feature/RetailerPortal/User';\nimport FeatureRetailerPortalUsers from '../components/Feature/RetailerPortal/Users';\nimport FoundationLayoutMain from '../components/Foundation/Layout/Main';\nimport ModulesFormsFormArticles from '../components/Modules/Forms/FormArticles';\nimport ModulesFormsFormPromotions from '../components/Modules/Forms/FormPromotions';\nimport ModulesFormsFormStoreFront from '../components/Modules/Forms/FormStoreFront';\nimport ModulesProfileEditProfile from '../components/Modules/Profile/EditProfile';\nimport ModulesProfileUpdatePassword from '../components/Modules/Profile/UpdatePassword';\n\nconst components = new Map();\ncomponents.set('Base-CustomFilter-FilterDropdown', BaseCustomFilterFilterDropdown);\ncomponents.set('Base-CustomFilter-FilterRadioButton', BaseCustomFilterFilterRadioButton);\ncomponents.set('Base-Popup-PopupAction', BasePopupPopupAction);\ncomponents.set('Base-Popup-PopupPreview', BasePopupPopupPreview);\ncomponents.set('Feature-RetailerPortal-Approvals', FeatureRetailerPortalApprovals);\ncomponents.set('Feature-RetailerPortal-ArticleListing', FeatureRetailerPortalArticleListing);\ncomponents.set('Feature-RetailerPortal-Articles', FeatureRetailerPortalArticles);\ncomponents.set('Feature-RetailerPortal-Authorisations', FeatureRetailerPortalAuthorisations);\ncomponents.set('Feature-RetailerPortal-Dashboard', FeatureRetailerPortalDashboard);\ncomponents.set('Feature-RetailerPortal-Footer', FeatureRetailerPortalFooter);\ncomponents.set('Feature-RetailerPortal-Hub', FeatureRetailerPortalHub);\ncomponents.set('Feature-RetailerPortal-LeftNavigation', FeatureRetailerPortalLeftNavigation);\ncomponents.set('Feature-RetailerPortal-Login', FeatureRetailerPortalLogin);\ncomponents.set('Feature-RetailerPortal-Notifications', FeatureRetailerPortalNotifications);\ncomponents.set('Feature-RetailerPortal-Profile', FeatureRetailerPortalProfile);\ncomponents.set('Feature-RetailerPortal-PromotionListing', FeatureRetailerPortalPromotionListing);\ncomponents.set('Feature-RetailerPortal-Promotions', FeatureRetailerPortalPromotions);\ncomponents.set('Feature-RetailerPortal-Storefront', FeatureRetailerPortalStorefront);\ncomponents.set('Feature-RetailerPortal-Stores', FeatureRetailerPortalStores);\ncomponents.set('Feature-RetailerPortal-TopNavigation', FeatureRetailerPortalTopNavigation);\ncomponents.set('Feature-RetailerPortal-UpdatePassword', FeatureRetailerPortalUpdatePassword);\ncomponents.set('Feature-RetailerPortal-User', FeatureRetailerPortalUser);\ncomponents.set('Feature-RetailerPortal-Users', FeatureRetailerPortalUsers);\ncomponents.set('Foundation-Layout-Main', FoundationLayoutMain);\ncomponents.set('Modules-Forms-FormArticles', ModulesFormsFormArticles);\ncomponents.set('Modules-Forms-FormPromotions', ModulesFormsFormPromotions);\ncomponents.set('Modules-Forms-FormStoreFront', ModulesFormsFormStoreFront);\ncomponents.set('Modules-Profile-EditProfile', ModulesProfileEditProfile);\ncomponents.set('Modules-Profile-UpdatePassword', ModulesProfileUpdatePassword);\n\nexport default function componentFactory(componentName) {\n return components.get(componentName);\n};\n","import axios from 'axios';\n\n/**\n * Implements a data fetcher using Axios - replace with your favorite\n * SSR-capable HTTP or fetch library if you like. See HttpJsonFetcher<T> type\n * in sitecore-jss library for implementation details/notes.\n * @param {string} url The URL to request; may include query string\n * @param {any} data Optional data to POST with the request.\n */\nexport function dataFetcher(url, data) {\n return axios({\n url,\n method: data ? 'POST' : 'GET',\n data,\n // note: axios needs to use `withCredentials: true` in order for Sitecore cookies to be included in CORS requests\n // which is necessary for analytics and such\n withCredentials: true,\n });\n}\n","import React, { Component } from \"react\";\n\nclass BackToTop extends Component {\n constructor(props) {\n super(props);\n this.state = {\n showBackToTop: false,\n };\n }\n componentDidMount() {\n if (document) {\n const backToTopWrapper = document.querySelector(\".body-wrapper\")\n if (backToTopWrapper) {\n backToTopWrapper.addEventListener('scroll', this.handleOnScroll);\n }\n }\n }\n\n handleOnScroll = (e) => {\n const element = e.target;\n const bodyWrapperContainer = element.querySelector(\".container\");\n\n if (bodyWrapperContainer) {\n let elemPos = bodyWrapperContainer.getBoundingClientRect().top;\n let bodyWrapperMargin,\n bodyContainerMargin;\n let backToTopPos = 0;\n\n if (window && window.outerWidth >= 992) {\n if (elemPos < 94) {\n this.setState({\n showBackToTop: true,\n });\n const backToTopWrapper = document.querySelector(\".back-to-top__wrapper\");\n const bodyContainer = document.querySelector(\".body-container.is-filter-shown\");\n\n if (bodyContainer) {\n bodyWrapperMargin = window.getComputedStyle(element).getPropertyValue(\"padding-left\").replace(\"px\", \"\");\n bodyContainerMargin = window.getComputedStyle(bodyContainer).getPropertyValue(\"margin-left\").replace(\"px\", \"\");\n backToTopPos = (parseInt(bodyWrapperMargin) + parseInt(bodyContainerMargin)) + \"px\";\n }\n else {\n bodyWrapperMargin = window.getComputedStyle(element).getPropertyValue(\"padding-left\");\n backToTopPos = bodyWrapperMargin;\n }\n backToTopWrapper.style.right = backToTopPos;\n } else {\n this.setState({\n showBackToTop: false,\n });\n }\n } else {\n if (elemPos < 0) {\n this.setState({\n showBackToTop: true,\n });\n }\n else {\n this.setState({\n showBackToTop: false,\n });\n }\n }\n\n }\n\n // if (document && document.documentElement && document.documentElement.scrollTop > 20) {\n // this.setState({ showBackToTop: true });\n // const backToTopWrapper = document.querySelector(\".back-to-top__wrapper\")\n // const bodyWrapper = document.querySelector(\".body-wrapper\");\n // const bodyContainer = document.querySelector(\".body-container.is-filter-shown\");\n // let bodyWrapperMargin,\n // bodyContainerMargin;\n // let backToTopPos = 0;\n\n // if (bodyWrapper && bodyContainer) {\n // bodyWrapperMargin = window.getComputedStyle(bodyWrapper).getPropertyValue(\"margin-left\").replace(\"px\", \"\");\n // bodyContainerMargin = window.getComputedStyle(bodyContainer).getPropertyValue(\"margin-left\").replace(\"px\", \"\");\n // backToTopPos = (parseInt(bodyWrapperMargin) + parseInt(bodyContainerMargin)) + \"px\";\n // }\n // else if (bodyWrapper) {\n // bodyWrapperMargin = window.getComputedStyle(bodyWrapper).getPropertyValue(\"margin-left\");\n // backToTopPos = bodyWrapperMargin;\n // }\n // backToTopWrapper.style.right = backToTopPos;\n // }\n // else {\n // this.setState({ showBackToTop: false });\n // }\n }\n\n handleOnClick = () => {\n // Check if using IE browser\n const ua = window.navigator.userAgent.toLowerCase();\n if (document) {\n const bodyWrapper = document.querySelector(\".body-wrapper\");\n if ((/msie|trident/.test(ua))) {\n bodyWrapper.scroll(0, 0);\n } else {\n bodyWrapper.scroll({\n top: 0,\n left: 0,\n behavior: 'smooth'\n });\n }\n }\n // if ((/msie|trident/.test(ua))) {\n // window.scroll(0, 0);\n // } else {\n // window.scroll({\n // top: 0,\n // left: 0,\n // behavior: 'smooth'\n // });\n // }\n }\n render() {\n const {\n showBackToTop\n } = this.state;\n return (\n <div>\n {showBackToTop &&\n <div className=\"back-to-top__wrapper js-back-to-top\">\n <div className=\"container\">\n <button onClick={this.handleOnClick} className=\"back-to-top__button\">\n <span>Back to top</span>\n <i className=\"icon icon-chevron-up\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n )\n }\n}\n\nexport default BackToTop;\n","import React from \"react\";\nimport {\n Placeholder,\n VisitorIdentification\n} from \"@sitecore-jss/sitecore-jss-react\";\nimport Helmet from \"react-helmet\";\nimport TagManager from \"react-gtm-module\";\nimport \"./assets/app.css\";\nimport BackToTop from \"./components/Base/BackToTop\";\nimport objectFitImages from \"object-fit-images\";\nimport \"lazysizes\";\n\nclass Layout extends React.Component {\n constructor(props) {\n super(props);\n }\n\n componentDidMount() {\n TagManager.initialize({ gtmId: \"GTM-WN8K6F\" });\n\n if (document) {\n objectFitImages();\n }\n }\n\n render() {\n const route = this.props.route;\n return (\n <React.Fragment>\n <Helmet>\n <title>\n {route.fields &&\n route.fields.PageTitle &&\n route.fields.PageTitle.value\n ? route.fields.PageTitle.value\n : \"\"}\n </title>\n </Helmet>\n\n <VisitorIdentification />\n\n <Placeholder name=\"jss-rp-main\" rendering={route} />\n\n <BackToTop />\n </React.Fragment>\n );\n }\n}\n\nexport default Layout;\n","import React from 'react';\n\n// Renders a route-not-found message when no route is available from Sitecore\n// The JSS equivalent of a 404 Not Found page.\n\n// This is invoked from RouteHandler when Sitecore returns no valid route data.\n// The NotFound component receives the Layout Service Context data, but no route data.\n// This can be used to power parts of your site, such as navigation, from LS context additions\n// without losing the ability to render them on your 404 pages :)\n\nconst NotFound = ({ context = { site: { name: '' }, language: '' } }) => (\n <React.Fragment>\n <h1>Page not found</h1>\n <p>This page does not exist.</p>\n <p>\n Site: {context.site && context.site.name}\n <br />\n Language: {context.language}\n </p>\n </React.Fragment>\n);\n\nexport default NotFound;\n","import React from 'react';\n//import i18n from 'i18next';\nimport Helmet from 'react-helmet';\nimport { isExperienceEditorActive, dataApi } from '@sitecore-jss/sitecore-jss-react';\nimport { dataFetcher } from './dataFetcher';\nimport config from './temp/config';\nimport Layout from './Layout';\nimport NotFound from './NotFound';\n// Dynamic route handler for Sitecore items.\n// Because JSS app routes are defined in Sitecore, traditional static React routing isn't enough -\n// we need to be able to load dynamic route data from Sitecore after the client side route changes.\n// So react-router delegates all route rendering to this handler, which attempts to get the right\n// route data from Sitecore - and if none exists, renders the not found component.\n\nexport default class RouteHandler extends React.Component {\n constructor(props) {\n super(props);\n\n const ssrInitialState = props.ssrState;\n\n this.state = {\n notFound: true,\n routeData: ssrInitialState, // null when client-side rendering\n defaultLanguage: config.defaultLanguage,\n };\n\n // route data from react-router - if route was resolved, it's not a 404\n if (props.route !== null) {\n this.state.notFound = false;\n }\n // if we have an initial SSR state, and that state doesn't have a valid route data,\n // then this is a 404 route.\n if (ssrInitialState && (!ssrInitialState.sitecore || !ssrInitialState.sitecore.route)) {\n this.state.notFound = true;\n }\n // if we have an SSR state, and that state has language data, set the current language\n // (this makes the language of content follow the Sitecore context language cookie)\n // note that a route-based language (i.e. /de-DE) will override this default; this is for home.\n if (ssrInitialState && ssrInitialState.context && ssrInitialState.context.language) {\n this.state.defaultLanguage = ssrInitialState.context.language;\n }\n\n this.componentIsMounted = false;\n this.languageIsChanging = false;\n\n // tell i18next to sync its current language with the route language\n //this.updateLanguage();\n }\n\n componentDidMount() {\n // once we initialize the route handler, we've \"used up\" the SSR data,\t\n // if it existed, so we want to clear it now that it's in react state.\t\n // future route changes that might destroy/remount this component should ignore any SSR data.\t\n // EXCEPTION: Unless we are still SSR-ing. Because SSR can re-render the component twice\t\n // (once to find GraphQL queries that need to run, the second time to refresh the view with\t\n // GraphQL query results)\t\n // We test for SSR by checking for Node-specific process.env variable.\t\n if (typeof window !== \"undefined\" && !this.props.ssrRenderComplete && this.props.setSsrRenderComplete) {\n this.props.setSsrRenderComplete(true);\n }\n\n // if no existing routeData is present (from SSR), get Layout Service fetching the route data\n if (!this.state.routeData) {\n this.updateRouteData();\n }\n this.componentIsMounted = true;\n }\n componentWillUnmount() {\n this.componentIsMounted = false;\n }\n /**\n * Loads route data from Sitecore Layout Service into state.routeData\n */\n updateRouteData() {\n let sitecoreRoutePath = this.props.route.match.params.sitecoreRoute || '/';\n if (!sitecoreRoutePath.startsWith('/')) {\n sitecoreRoutePath = `/${sitecoreRoutePath}`;\n }\n const language = this.props.route.match.params.lang || this.state.defaultLanguage;\n // get the route data for the new route\n getRouteData(sitecoreRoutePath, language).then((routeData) => {\n if (routeData !== null && routeData.sitecore && routeData.sitecore.route) {\n // set the sitecore context data and push the new route\n this.props.contextFactory.setSitecoreContext({\n route: routeData.sitecore.route,\n itemId: routeData.sitecore.route.itemId,\n ...routeData.sitecore.context,\n });\n this.setState({ routeData, notFound: false });\n } else {\n this.setState({ routeData, notFound: true });\n }\n });\n }\n /**\n * Updates the current app language to match the route data.\n */\n // updateLanguage() {\n // const newLanguage = this.props.route.match.params.lang || this.state.defaultLanguage;\n // if (i18n.language !== newLanguage) {\n // this.languageIsChanging = true;\n // i18n.changeLanguage(newLanguage, () => {\n // this.languageIsChanging = false;\n // // if the component is not mounted, we don't care\n // // (next time it mounts, it will render with the right language context)\n // if (this.componentIsMounted) {\n // // after we change the i18n language, we need to force-update React,\n // // since otherwise React won't know that the dictionary has changed\n // // because it is stored in i18next state not React state\n // this.forceUpdate();\n // }\n // });\n // }\n // }\n componentDidUpdate(previousProps) {\n const existingRoute = previousProps.route.match.url;\n const newRoute = this.props.route.match.url;\n // don't change state (refetch route data) if the route has not changed\n if (existingRoute === newRoute) {\n return;\n }\n // if in experience editor - force reload instead of route data update\n // avoids confusing Sitecore's editing JS\n if (isExperienceEditorActive()) {\n window.location.assign(newRoute);\n return;\n }\n //this.updateLanguage();\n this.updateRouteData();\n }\n render() {\n const { notFound, routeData } = this.state;\n // no route data for the current route in Sitecore - show not found component.\n // Note: this is client-side only 404 handling. Server-side 404 handling is the responsibility\n // of the server being used (i.e. node-headless-ssr-proxy and Sitecore intergrated rendering know how to send 404 status codes).\n if (notFound) {\n return (\n <div>\n <Helmet>\n <title>{\"Page not found\"}</title>\n </Helmet>\n <NotFound context={routeData.sitecore && routeData.sitecore.context} />\n </div>\n );\n }\n // Don't render anything if the route data or dictionary data is not fully loaded yet.\n // This is a good place for a \"Loading\" component, if one is needed.\n if (!routeData || this.languageIsChanging) {\n return null;\n }\n // Render the app's root structural layout\n return <Layout route={routeData.sitecore.route} />;\n }\n}\n\n\n/**\n * Gets route data from Sitecore. This data is used to construct the component layout for a JSS route.\n * @param {string} route Route path to get data for (e.g. /about)\n * @param {string} language Language to get route data in (content language, e.g. 'en')\n */\nfunction getRouteData(route, language) {\n const fetchOptions = {\n layoutServiceConfig: { host: config.sitecoreApiHost },\n querystringParams: { sc_lang: language, sc_apikey: config.sitecoreApiKey },\n fetcher: dataFetcher,\n };\n return dataApi.fetchRouteData(route, fetchOptions).catch((error) => {\n if (error.response && error.response.status === 404 && error.response.data) {\n return error.response.data;\n }\n console.error('Route data fetch error', error, error.response);\n return null;\n });\n}","import React from 'react';\nimport { SitecoreContext, SitecoreContextFactory } from '@sitecore-jss/sitecore-jss-react';\nimport { Route, Switch } from 'react-router-dom';\nimport { ApolloProvider } from 'react-apollo';\nimport componentFactory from './temp/componentFactory';\nimport RouteHandler from './RouteHandler';\n\n// This is the main JSX entry point of the app invoked by the renderer (server or client rendering).\n// By default the app's normal rendering is delegated to <RouteHandler> that handles the loading of JSS route data.\n// support languages in the URL prefix\n// e.g. /da-DK/path, or /en/path, or /path\nexport const routePatterns = [\n '/:lang([a-z]{2}-[A-Z]{2})/:sitecoreRoute*',\n '/:lang([a-z]{2})/:sitecoreRoute*',\n '/:sitecoreRoute*',\n];\n// wrap the app with:\n// ApolloProvider: provides an instance of Apollo GraphQL client to the app to make Connected GraphQL queries.\n// Not needed if not using connected GraphQL.\n// SitecoreContext: provides component resolution and context services via withSitecoreContext\n// Router: provides a basic routing setup that will resolve Sitecore item routes and allow for language URL prefixes.\nclass AppRoot extends React.Component {\n state = {\n ssrRenderComplete: false,\n contextFactory: new SitecoreContextFactory()\n }\n\n setSsrRenderComplete = ssrRenderComplete => {\n this.setState({\n ssrRenderComplete\n })\n }\n\n render() {\n const { path, Router, graphQLClient, ssrState } = this.props;\n\n if (ssrState && ssrState.sitecore && ssrState.sitecore.route) {\n // set the initial sitecore context data if we got SSR initial state\n this.state.contextFactory.setSitecoreContext({\n route: ssrState.sitecore.route,\n itemId: ssrState.sitecore.route.itemId,\n ...ssrState.sitecore.context,\n });\n }\n\n const routeRenderFunction = (props) =>\n <RouteHandler\n route={props}\n ssrState={this.state.ssrRenderComplete ? null : ssrState}\n contextFactory={this.state.contextFactory}\n setSsrRenderComplete={this.setSsrRenderComplete}\n ssrRenderComplete={this.state.ssrRenderComplete}\n />;\n\n return (\n <ApolloProvider client={graphQLClient}>\n <SitecoreContext componentFactory={componentFactory} contextFactory={this.state.contextFactory}>\n <Router location={path} context={{}}>\n <Switch>\n {routePatterns.map((routePattern) => (\n <Route key={routePattern} path={routePattern} render={routeRenderFunction} />\n ))}\n </Switch>\n </Router>\n </SitecoreContext>\n </ApolloProvider>\n );\n }\n}\n\nexport default AppRoot;","import \"@babel/polyfill\";\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { BrowserRouter } from 'react-router-dom';\nimport AppRoot from './AppRoot';\nimport GraphQLClientFactory from './lib/GraphQLClientFactory';\nimport config from './temp/config';\n//import i18ninit from './i18n';\n/* eslint-disable no-underscore-dangle */\nlet renderFunction = ReactDOM.render;\n/*\n SSR Data\n If we're running in a server-side rendering scenario,\n the server will provide JSON in the #__JSS_STATE__ element\n for us to acquire the initial state to run with on the client.\n This enables us to skip a network request to load up the layout data.\n We are emitting a quiescent script with JSON so that we can take advantage\n of JSON.parse()'s speed advantage over parsing full JS, and enable\n working without needing `unsafe-inline` in Content Security Policies.\n SSR is initiated from /server/server.js.\n*/\nlet __JSS_STATE__ = null;\nlet ssrRawJson;\nif (document) {\n ssrRawJson = document.getElementById('__JSS_STATE__');\n}\nif (ssrRawJson) {\n __JSS_STATE__ = JSON.parse(ssrRawJson.innerHTML);\n}\nif (__JSS_STATE__) {\n // when React initializes from a SSR-based initial state, you need to render with `hydrate` instead of `render`\n renderFunction = ReactDOM.hydrate;\n}\n/*\n GraphQL Data\n The Apollo Client needs to be initialized to make GraphQL available to the JSS app.\n Not using GraphQL? Remove this, and the ApolloContext from `AppRoot`.\n*/\n// Apollo supports SSR of GraphQL queries, so like JSS SSR, it has an object we can pre-hydrate the client cache from\n// to avoid needing to re-run GraphQL queries after the SSR page loads\nconst initialGraphQLState =\n __JSS_STATE__ && __JSS_STATE__.APOLLO_STATE ? __JSS_STATE__.APOLLO_STATE : null;\nconst graphQLClient = GraphQLClientFactory(config.graphQLEndpoint, false, initialGraphQLState);\n/*\n App Rendering\n*/\n// initialize the dictionary, then render the app\n// note: if not making a multlingual app, the dictionary init can be removed.\n// i18ninit().then(() => {\n// });\n\n// HTML element to place the app into\nlet rootElement;\nif (document) {\n rootElement = document.getElementById('root');\n}\nrenderFunction(\n <AppRoot\n path={window.location.pathname}\n Router={BrowserRouter}\n graphQLClient={graphQLClient}\n ssrState={__JSS_STATE__}\n />,\n rootElement\n);","/* eslint-disable import/first */\n\nimport 'isomorphic-fetch';\nimport { ApolloClient } from 'apollo-client';\nimport { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory';\n\n/*\n INTROSPECTION DATA\n See https://www.apollographql.com/docs/react/recipes/fragment-matching.html\n This enables the Apollo cache to process fragments on interface types correctly.\n If this file does not exist, you may need to run the `jss graphql:update` script.\n*/\nimport introspectionQueryResultData from '../temp/GraphQLFragmentTypes.json';\n\n/*\n QUERY LINK SELECTION\n A link is transport which GraphQL queries are pushed across.\n You have many choices.\n See the apollo-link documentation for more details.\n\n NOTE: to use Sitecore Experience Editor it is essential that your\n link passes cookies along with requests (credentials: 'include').\n*/\n\n// choose between a basic HTTP link to run queries...\n// import { createHttpLink } from 'apollo-link-http';\n// const link = createHttpLink({ uri: endpoint, credentials: 'include' });\n\n// ...or a batched link (multiple queries within 10ms all go in one HTTP request)\nimport { BatchHttpLink } from 'apollo-link-batch-http';\n\n// ...and an automatic persisted query link, which reduces bandwidth by using query hashes to alias content\n// the APQ link is _chained_ behind another link that performs the actual HTTP calls, so you can choose\n// APQ + batched, or APQ + http links for example.\nimport { createPersistedQueryLink } from 'apollo-link-persisted-queries';\n\nexport default function(endpoint, ssr, initialCacheState) {\n /* HTTP link selection: default to batched + APQ */\n const link = createPersistedQueryLink().concat(\n new BatchHttpLink({ uri: endpoint, credentials: 'include' })\n );\n\n const cache = new InMemoryCache({\n fragmentMatcher: new IntrospectionFragmentMatcher({\n introspectionQueryResultData,\n }),\n });\n\n return new ApolloClient({\n ssrMode: ssr,\n ssrForceFetchDelay: 100,\n link,\n cache: cache.restore(initialCacheState),\n });\n}\n","module.exports = \"data:image/png;base64,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\""],"sourceRoot":""}